From 743449472e58651ec8111e6f70811103fb0a28bd Mon Sep 17 00:00:00 2001 From: Joe Wasson Date: Mon, 17 Sep 2018 10:48:02 -0700 Subject: [PATCH 001/505] Make `PREVENT_STUCK_MODIFIERS` the default (#3107) * Remove chording as it is not documented, not used, and needs work. * Make Leader Key an optional feature. * Switch from `PREVENT_STUCK_MODIFIERS` to `STRICT_LAYER_RELEASE` * Remove `#define PREVENT_STUCK_MODIFIERS` from keymaps. --- common_features.mk | 11 ++- docs/config_options.md | 4 +- docs/feature_leader_key.md | 8 ++ docs/understanding_qmk.md | 2 +- keyboards/1upkeyboards/1up60rgb/config.h | 3 - keyboards/1upkeyboards/sweet16/config.h | 7 +- keyboards/acr60/config.h | 3 - keyboards/alf/x2/config.h | 5 +- keyboards/alpha/config.h | 2 - keyboards/alu84/config.h | 3 - keyboards/at101_blackheart/config.h | 3 - keyboards/atreus/keymaps/jeremy/keymap.c | 2 - keyboards/atreus/keymaps/khitsule/config.h | 4 +- keyboards/atreus/keymaps/xk/config.h | 3 +- keyboards/atreus62/keymaps/mneme/config.h | 1 - keyboards/atreus62/keymaps/mneme/rules.mk | 1 + .../keymaps/andylikescandy6x18/config.h | 3 - keyboards/bigseries/1key/config.h | 3 - keyboards/bigseries/2key/config.h | 3 - keyboards/bigseries/3key/config.h | 3 - keyboards/bigseries/4key/config.h | 3 - keyboards/bigswitch/config.h | 2 - keyboards/catch22/config.h | 3 - keyboards/chimera_ergo/config.h | 2 - keyboards/chimera_ls/config.h | 2 - keyboards/chimera_ortho/config.h | 2 - keyboards/chocopad/config.h | 6 +- keyboards/clueboard/60/config.h | 3 - .../clueboard/66/keymaps/bloodlvst/config.h | 1 - keyboards/comet46/config.h | 2 - keyboards/contra/config.h | 4 - keyboards/contra/keymaps/ryanm101/config.h | 5 +- keyboards/crawlpad/config.h | 3 - keyboards/crkbd/keymaps/default/config.h | 1 - keyboards/dichotemy/config.h | 2 - keyboards/dilly/config.h | 6 +- keyboards/dz60/config.h | 3 - keyboards/dz60/keymaps/LEdiodes/config.h | 3 - keyboards/ergodone/config.h | 2 - keyboards/ergodox_ez/config.h | 2 - .../keymaps/heartrobotninja/rules.mk | 3 +- keyboards/ergodox_ez/keymaps/vim/vim.h | 1 - .../ergodox_infinity/keymaps/gordon/config.h | 2 - .../ergodox_infinity/keymaps/narze/config.h | 1 - .../keymaps/not-quite-neo/rules.mk | 3 +- keyboards/ergoinu/config.h | 2 - keyboards/ergotravel/keymaps/ckofy/config.h | 3 - keyboards/felix/config.h | 4 +- keyboards/four_banger/config.h | 5 +- keyboards/fourier/keymaps/jennetters/config.h | 5 +- keyboards/fractal/config.h | 4 - .../frosty_flake/keymaps/nikchi/rules.mk | 3 +- keyboards/gh80_3000/config.h | 6 +- keyboards/gherkin/config.h | 6 +- .../gherkin/keymaps/talljoe_gherkin/config.h | 4 +- keyboards/gonnerd/keymaps/gam3cat/config.h | 1 - keyboards/hadron/keymaps/default/config.h | 1 - keyboards/hadron/keymaps/side_numpad/config.h | 1 - keyboards/handwired/MS_sculpt_mobile/config.h | 8 +- .../atreus50/keymaps/ajp10304/config.h | 2 - keyboards/handwired/dactyl/config.h | 2 - keyboards/handwired/kbod/config.h | 4 +- .../promethium/keymaps/default/config.h | 2 - .../promethium/keymaps/priyadi/config.h | 2 - keyboards/handwired/space_oddity/config.h | 4 - keyboards/helix/pico/config.h | 1 - .../helix/rev1/keymaps/OLED_sample/config.h | 3 +- keyboards/helix/rev2/config.h | 1 - keyboards/hhkb/keymaps/blakedietz/rules.mk | 1 + keyboards/infinity60/config.h | 2 - keyboards/iris/keymaps/davidrambo/config.h | 1 - keyboards/iris/keymaps/jennetters/config.h | 5 +- keyboards/iris/keymaps/krusli/config.h | 2 - keyboards/iris/keymaps/xyverz/config.h | 2 - keyboards/jc65/v32u4/keymaps/gam3cat/config.h | 1 - keyboards/jj40/keymaps/ajp10304/config.h | 8 -- keyboards/jj40/keymaps/fun40/config.h | 1 - keyboards/jj40/keymaps/krusli/config.h | 1 - keyboards/jj40/keymaps/oscillope/config.h | 1 - keyboards/jj40/keymaps/suzuken/config.h | 1 - keyboards/jj40/keymaps/waples/config.h | 1 - keyboards/jm60/config.h | 2 - keyboards/k_type/config.h | 2 - keyboards/katana60/config.h | 3 +- keyboards/kbd75/config.h | 3 - .../keymaps/insertsnideremarks/config.h | 1 - .../lets_split/keymaps/OLED_sample/config.h | 2 - keyboards/lets_split/keymaps/adam/config.h | 1 - keyboards/lets_split/keymaps/khord/config.h | 3 - keyboards/lets_split/keymaps/piemod/config.h | 1 - keyboards/lets_split/keymaps/waples/config.h | 2 - keyboards/lets_split/keymaps/xk/config.h | 1 - keyboards/m10a/keymaps/gam3cat/config.h | 2 - keyboards/mechmini/v2/config.h | 3 - keyboards/melody96/config.h | 3 - keyboards/minidox/keymaps/alairock/config.h | 1 - keyboards/minidox/keymaps/khitsule/config.h | 4 +- keyboards/mint60/config.h | 1 - keyboards/mitosis/config.h | 2 - keyboards/niu_mini/config.h | 3 - keyboards/novelpad/config.h | 3 - keyboards/noxary/268/config.h | 5 +- keyboards/ok60/config.h | 3 - keyboards/omnikey_blackheart/config.h | 6 +- keyboards/paladin64/config.h | 2 - .../pegasushoof/keymaps/citadel/config.h | 3 - keyboards/planck/keymaps/ajp10304/config.h | 8 -- keyboards/planck/keymaps/altgr/config.h | 3 - keyboards/planck/keymaps/am/config.h | 3 - .../planck/keymaps/andylikescandy/config.h | 3 - keyboards/planck/keymaps/bone2planck/config.h | 8 -- keyboards/planck/keymaps/davidrambo/config.h | 5 +- keyboards/planck/keymaps/dshields/config.h | 1 - keyboards/planck/keymaps/espynn/keymap.c | 1 - .../planck/keymaps/experimental/config.h | 2 - .../planck/keymaps/experimental/rules.mk | 3 +- keyboards/planck/keymaps/hiea/config.h | 3 - keyboards/planck/keymaps/hieax/config.h | 3 - keyboards/planck/keymaps/ishtob/config.h | 2 - keyboards/planck/keymaps/jarred/config.h | 4 +- keyboards/planck/keymaps/jeremy-dev/keymap.c | 1 - keyboards/planck/keymaps/kmontag42/rules.mk | 1 + keyboards/planck/keymaps/lae3/config.h | 8 -- keyboards/planck/keymaps/mitch/config.h | 3 +- keyboards/planck/keymaps/mitch/readme.md | 4 - keyboards/planck/keymaps/narze/config.h | 3 +- keyboards/planck/keymaps/neo2planck/config.h | 8 -- keyboards/planck/keymaps/priyadi/config.h | 2 - keyboards/planck/keymaps/sdothum/config.h | 3 - keyboards/planck/keymaps/steno/config.h | 4 +- keyboards/planck/keymaps/tehwalris/config.h | 4 +- keyboards/planck/keymaps/vifon/config.h | 3 - keyboards/planck/keymaps/yale/config.h | 11 --- keyboards/planck/keymaps/zach/config.h | 1 - keyboards/planck/rev6/config.h | 3 - keyboards/playkbtw/ca66/config.h | 2 - keyboards/playkbtw/pk60/config.h | 5 +- keyboards/preonic/keymaps/bucktooth/config.h | 1 - keyboards/preonic/keymaps/jacwib/config.h | 1 - keyboards/preonic/keymaps/kuatsure/rules.mk | 1 + .../preonic/keymaps/that_canadian/config.h | 8 -- keyboards/preonic/keymaps/zach/config.h | 1 - keyboards/preonic/rev3/config.h | 3 - keyboards/prime_r/config.h | 4 - .../keymaps/insertsnideremarks/config.h | 1 - keyboards/s60_x/keymaps/bluebear/config.h | 3 - keyboards/s60_x/rgb/config.h | 5 +- keyboards/s65_plus/config.h | 3 - keyboards/s65_x/config.h | 4 - keyboards/sx60/config.h | 4 - keyboards/telophase/config.h | 2 - keyboards/tetris/config.h | 5 +- .../bananasplit/keymaps/talljoe/config.h | 1 - keyboards/tokyo60/config.h | 3 - keyboards/tomato/config.h | 3 - keyboards/uk78/config.h | 3 - keyboards/viterbi/keymaps/drashna/config.h | 2 +- keyboards/whitefox/config.h | 2 - keyboards/xd60/keymaps/kmontag42/rules.mk | 1 + keyboards/xd75/keymaps/davidrambo/config.h | 3 +- keyboards/xd75/keymaps/tdl-jturner/config.h | 1 - keyboards/xmmx/config.h | 6 +- keyboards/ymd96/keymaps/hgoel89/config.h | 1 - keyboards/z150_blackheart/config.h | 6 +- keyboards/zeal60/keymaps/tusing/config.h | 4 - keyboards/zlant/config.h | 3 - .../community/60_ansi/talljoe-ansi/config.h | 1 - .../60_ansi_split_bs_rshift/talljoe/config.h | 1 - .../community/60_hhkb/talljoe-hhkb/config.h | 1 - layouts/community/ergodox/adam/config.h | 1 - layouts/community/ergodox/albert/rules.mk | 3 +- layouts/community/ergodox/algernon/rules.mk | 1 + layouts/community/ergodox/alphadox/config.h | 1 - layouts/community/ergodox/deadcyclo/rules.mk | 1 + .../ergodox/erez_experimental/rules.mk | 3 +- layouts/community/ergodox/familiar/rules.mk | 1 + .../community/ergodox/mclennon_osx/README.md | 4 +- layouts/community/ergodox/techtomas/readme.md | 2 +- .../community/ortho_4x12/symbolic/config.h | 4 - .../community/tkl_ansi/talljoe-tkl/config.h | 1 - quantum/process_keycode/process_chording.c | 76 ------------------- quantum/process_keycode/process_chording.h | 32 -------- quantum/process_keycode/process_leader.c | 2 +- quantum/quantum.c | 7 +- quantum/quantum.h | 7 +- quantum/quantum_keycodes.h | 6 +- tmk_core/common/action.c | 2 +- tmk_core/common/action.h | 2 +- tmk_core/common/action_layer.c | 4 +- tmk_core/common/action_layer.h | 2 +- users/333fred/333fred_config.h | 1 - users/bocaj/config.h | 1 - users/drashna/config.h | 5 -- users/ishtob/config.h | 3 +- users/replicaJunction/config.h | 6 -- users/talljoe/config.h | 1 - users/wanleg/config.h | 2 - users/zer09/config.h | 2 +- 198 files changed, 91 insertions(+), 599 deletions(-) delete mode 100644 keyboards/jj40/keymaps/ajp10304/config.h delete mode 100644 keyboards/m10a/keymaps/gam3cat/config.h delete mode 100644 keyboards/planck/keymaps/ajp10304/config.h delete mode 100644 keyboards/planck/keymaps/bone2planck/config.h delete mode 100644 keyboards/planck/keymaps/lae3/config.h delete mode 100644 keyboards/planck/keymaps/neo2planck/config.h delete mode 100644 keyboards/planck/keymaps/yale/config.h delete mode 100644 keyboards/preonic/keymaps/that_canadian/config.h create mode 100644 keyboards/xd60/keymaps/kmontag42/rules.mk delete mode 100644 quantum/process_keycode/process_chording.c delete mode 100644 quantum/process_keycode/process_chording.h diff --git a/common_features.mk b/common_features.mk index c637582d457c..7af7789808df 100644 --- a/common_features.mk +++ b/common_features.mk @@ -221,7 +221,6 @@ ifeq ($(strip $(USB_HID_ENABLE)), yes) include $(TMK_DIR)/protocol/usb_hid.mk endif - ifeq ($(strip $(HD44780_ENABLE)), yes) SRC += drivers/avr/hd44780.c OPT_DEFS += -DHD44780_ENABLE @@ -232,11 +231,15 @@ ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes) SRC += $(QUANTUM_DIR)/dynamic_keymap.c endif +ifeq ($(strip $(LEADER_ENABLE)), yes) + SRC += $(QUANTUM_DIR)/process_keycode/process_leader.c + OPT_DEFS += -DLEADER_ENABLE +endif + QUANTUM_SRC:= \ $(QUANTUM_DIR)/quantum.c \ $(QUANTUM_DIR)/keymap_common.c \ - $(QUANTUM_DIR)/keycode_config.c \ - $(QUANTUM_DIR)/process_keycode/process_leader.c + $(QUANTUM_DIR)/keycode_config.c ifndef CUSTOM_MATRIX ifeq ($(strip $(SPLIT_KEYBOARD)), yes) @@ -251,5 +254,5 @@ ifeq ($(strip $(SPLIT_KEYBOARD)), yes) QUANTUM_SRC += $(QUANTUM_DIR)/split_common/split_flags.c \ $(QUANTUM_DIR)/split_common/split_util.c \ $(QUANTUM_DIR)/split_common/i2c.c \ - $(QUANTUM_DIR)/split_common/serial.c + $(QUANTUM_DIR)/split_common/serial.c endif diff --git a/docs/config_options.md b/docs/config_options.md index eaaa59872c75..072857727bd2 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -119,8 +119,8 @@ If you define these options you will enable the associated feature, which may in * `#define FORCE_NKRO` * NKRO by default requires to be turned on, this forces it on during keyboard startup regardless of EEPROM setting. NKRO can still be turned off but will be turned on again if the keyboard reboots. -* `#define PREVENT_STUCK_MODIFIERS` - * stores the layer a key press came from so the same layer is used when the key is released, regardless of which layers are enabled +* `#define STRICT_LAYER_RELEASE` + * force a key release to be evaluated using the current layer stack instead of remembering which layer it came from (used for advanced cases) ## Behaviors That Can Be Configured diff --git a/docs/feature_leader_key.md b/docs/feature_leader_key.md index 46633b28703d..0c3f4a13328f 100644 --- a/docs/feature_leader_key.md +++ b/docs/feature_leader_key.md @@ -39,3 +39,11 @@ void matrix_scan_user(void) { As you can see, you have a few function. You can use `SEQ_ONE_KEY` for single-key sequences (Leader followed by just one key), and `SEQ_TWO_KEYS`, `SEQ_THREE_KEYS` up to `SEQ_FIVE_KEYS` for longer sequences. Each of these accepts one or more keycodes as arguments. This is an important point: You can use keycodes from **any layer on your keyboard**. That layer would need to be active for the leader macro to fire, obviously. + +## Adding Leader Key Support in the `rules.mk` + +To add support for Leader Key you simply need to add a single line to your keymap's `rules.mk`: + +``` +LEADER_ENABLE = yes +``` diff --git a/docs/understanding_qmk.md b/docs/understanding_qmk.md index bf695d008ddd..35596cc6924a 100644 --- a/docs/understanding_qmk.md +++ b/docs/understanding_qmk.md @@ -129,6 +129,7 @@ Comparing against our keymap we can see that the pressed key is KC_NLCK. From he ##### Process Record + The `process_record()` function itself is deceptively simple, but hidden within is a gateway to overriding functionality at various levels of QMK. The chain of events is listed below, using cluecard whenever we need to look at the keyboard/keymap level functions. Depending on options set in rule.mk or elsewhere, only a subset of the functions below will be included in final firmware. * [`void process_record(keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/08c682c193f43e5d54df990680ae93fc2e06150a/tmk_core/common/action.c#L172) @@ -146,7 +147,6 @@ The `process_record()` function itself is deceptively simple, but hidden within * [`bool process_music(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_music.c#L114) * [`bool process_tap_dance(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_tap_dance.c#L136) * [`bool process_leader(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_leader.c#L38) - * [`bool process_chording(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_chording.c#L41) * [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_combo.c#L115) * [`bool process_unicode(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_unicode.c#L22) * [`bool process_ucis(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/661ca4440cc42f3b60697e98985c44b0571ccfc1/quantum/process_keycode/process_ucis.c#L91) diff --git a/keyboards/1upkeyboards/1up60rgb/config.h b/keyboards/1upkeyboards/1up60rgb/config.h index bfdf354af7da..ee49211b48fa 100644 --- a/keyboards/1upkeyboards/1up60rgb/config.h +++ b/keyboards/1upkeyboards/1up60rgb/config.h @@ -43,9 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/1upkeyboards/sweet16/config.h b/keyboards/1upkeyboards/sweet16/config.h index 77d9e276dc7b..20d99651da9c 100644 --- a/keyboards/1upkeyboards/sweet16/config.h +++ b/keyboards/1upkeyboards/sweet16/config.h @@ -9,7 +9,7 @@ #define DEVICE_VER 0x0001 #define MANUFACTURER 1up Keyboards #define PRODUCT Sweet16 -#define DESCRIPTION 4x4 grid +#define DESCRIPTION 4x4 grid /* key matrix size */ #define MATRIX_ROWS 4 @@ -43,9 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN B1 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS @@ -55,4 +52,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/acr60/config.h b/keyboards/acr60/config.h index c44ba737e8e3..3066f349de05 100644 --- a/keyboards/acr60/config.h +++ b/keyboards/acr60/config.h @@ -41,9 +41,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 20 diff --git a/keyboards/alf/x2/config.h b/keyboards/alf/x2/config.h index 31212ce3368c..f2106fa88e10 100644 --- a/keyboards/alf/x2/config.h +++ b/keyboards/alf/x2/config.h @@ -43,9 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS @@ -55,4 +52,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/alpha/config.h b/keyboards/alpha/config.h index 02952756358c..1e16f5ca3c99 100755 --- a/keyboards/alpha/config.h +++ b/keyboards/alpha/config.h @@ -43,8 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS #define RGB_DI_PIN F4 #ifdef RGB_DI_PIN diff --git a/keyboards/alu84/config.h b/keyboards/alu84/config.h index 9e013dbcc3ea..9d2dca409c7e 100755 --- a/keyboards/alu84/config.h +++ b/keyboards/alu84/config.h @@ -59,9 +59,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN #define RGBLED_NUM 16 diff --git a/keyboards/at101_blackheart/config.h b/keyboards/at101_blackheart/config.h index 6a809a02f869..237cb095e663 100644 --- a/keyboards/at101_blackheart/config.h +++ b/keyboards/at101_blackheart/config.h @@ -38,6 +38,3 @@ #define IS_COMMAND() ( \ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) - -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS \ No newline at end of file diff --git a/keyboards/atreus/keymaps/jeremy/keymap.c b/keyboards/atreus/keymaps/jeremy/keymap.c index 42bef9d80c95..890980f41f7a 100644 --- a/keyboards/atreus/keymaps/jeremy/keymap.c +++ b/keyboards/atreus/keymaps/jeremy/keymap.c @@ -4,8 +4,6 @@ #include "action_layer.h" #include "keymap_colemak.h" -#define PREVENT_STUCK_MODIFIERS - // Each layer gets a name for readability, which is then used in the keymap matrix below. #define ALPH 0 #define NUMS 1 diff --git a/keyboards/atreus/keymaps/khitsule/config.h b/keyboards/atreus/keymaps/khitsule/config.h index 19714ec7d5c9..c74909a9ff25 100644 --- a/keyboards/atreus/keymaps/khitsule/config.h +++ b/keyboards/atreus/keymaps/khitsule/config.h @@ -3,8 +3,6 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS - #define IGNORE_MOD_TAP_INTERRUPT -#endif \ No newline at end of file +#endif diff --git a/keyboards/atreus/keymaps/xk/config.h b/keyboards/atreus/keymaps/xk/config.h index 2f8110167e1c..a8b9c8805739 100644 --- a/keyboards/atreus/keymaps/xk/config.h +++ b/keyboards/atreus/keymaps/xk/config.h @@ -30,8 +30,7 @@ the Free Software Foundation, either version 2 of the License, or #define MOUSEKEY_WHEEL_MAX_SPEED 8 #define MOUSEKEY_WHEEL_TIME_TO_MAX 40 -#define PREVENT_STUCK_MODIFIERS #define IGNORE_MOD_TAP_INTERRUPT #define PERMISSIVE_HOLD -#endif \ No newline at end of file +#endif diff --git a/keyboards/atreus62/keymaps/mneme/config.h b/keyboards/atreus62/keymaps/mneme/config.h index 73eb0fa33dac..a89bf5503c85 100644 --- a/keyboards/atreus62/keymaps/mneme/config.h +++ b/keyboards/atreus62/keymaps/mneme/config.h @@ -1,6 +1,5 @@ #define ONESHOT_TIMEOUT 3000 #define TAPPING_TERM 200 -#define PREVENT_STUCK_MODIFIERS #define FORCE_NKRO #define LEADER_TIMEOUT 1000 diff --git a/keyboards/atreus62/keymaps/mneme/rules.mk b/keyboards/atreus62/keymaps/mneme/rules.mk index 046aec2733dc..160ce6edbf71 100644 --- a/keyboards/atreus62/keymaps/mneme/rules.mk +++ b/keyboards/atreus62/keymaps/mneme/rules.mk @@ -3,3 +3,4 @@ NKRO_ENABLE = true MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = no +LEADER_ENABLE = yes diff --git a/keyboards/bfo9000/keymaps/andylikescandy6x18/config.h b/keyboards/bfo9000/keymaps/andylikescandy6x18/config.h index 9d124a98e5c7..be57e385ef5c 100644 --- a/keyboards/bfo9000/keymaps/andylikescandy6x18/config.h +++ b/keyboards/bfo9000/keymaps/andylikescandy6x18/config.h @@ -37,7 +37,4 @@ along with this program. If not, see . #define PERMISSIVE_HOLD - #define PREVENT_STUCK_MODIFIERS - - #endif diff --git a/keyboards/bigseries/1key/config.h b/keyboards/bigseries/1key/config.h index 4e30276fc0fb..966f2062c4a4 100755 --- a/keyboards/bigseries/1key/config.h +++ b/keyboards/bigseries/1key/config.h @@ -47,9 +47,6 @@ along with this program. If not, see . false \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN D3 #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/bigseries/2key/config.h b/keyboards/bigseries/2key/config.h index 83c8e3141733..79b9ed3786a3 100755 --- a/keyboards/bigseries/2key/config.h +++ b/keyboards/bigseries/2key/config.h @@ -47,9 +47,6 @@ along with this program. If not, see . false \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN D3 #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/bigseries/3key/config.h b/keyboards/bigseries/3key/config.h index e10b14db42b6..9963a821977c 100755 --- a/keyboards/bigseries/3key/config.h +++ b/keyboards/bigseries/3key/config.h @@ -47,9 +47,6 @@ along with this program. If not, see . false \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN D3 #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/bigseries/4key/config.h b/keyboards/bigseries/4key/config.h index 3ebcfe0911e8..a222512d3c58 100755 --- a/keyboards/bigseries/4key/config.h +++ b/keyboards/bigseries/4key/config.h @@ -47,9 +47,6 @@ along with this program. If not, see . false \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN D3 #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/bigswitch/config.h b/keyboards/bigswitch/config.h index cc290fd79b1b..a0ef6b555434 100755 --- a/keyboards/bigswitch/config.h +++ b/keyboards/bigswitch/config.h @@ -47,8 +47,6 @@ along with this program. If not, see . false \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN D3 diff --git a/keyboards/catch22/config.h b/keyboards/catch22/config.h index cb7ca7d84c4f..f151e7048f4e 100644 --- a/keyboards/catch22/config.h +++ b/keyboards/catch22/config.h @@ -46,9 +46,6 @@ along with this program. If not, see . false \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN F6 #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/chimera_ergo/config.h b/keyboards/chimera_ergo/config.h index 86ee23718172..8ce195cc06b0 100644 --- a/keyboards/chimera_ergo/config.h +++ b/keyboards/chimera_ergo/config.h @@ -52,8 +52,6 @@ along with this program. If not, see . * These options are also useful to firmware size reduction. */ -#define PREVENT_STUCK_MODIFIERS - /* disable debug print */ //#define NO_DEBUG diff --git a/keyboards/chimera_ls/config.h b/keyboards/chimera_ls/config.h index d92878026b62..254dad30645d 100644 --- a/keyboards/chimera_ls/config.h +++ b/keyboards/chimera_ls/config.h @@ -52,8 +52,6 @@ along with this program. If not, see . * These options are also useful to firmware size reduction. */ -#define PREVENT_STUCK_MODIFIERS - /* disable debug print */ //#define NO_DEBUG diff --git a/keyboards/chimera_ortho/config.h b/keyboards/chimera_ortho/config.h index 44c6212b17bb..4bf85eb88f3b 100644 --- a/keyboards/chimera_ortho/config.h +++ b/keyboards/chimera_ortho/config.h @@ -52,8 +52,6 @@ along with this program. If not, see . * These options are also useful to firmware size reduction. */ -#define PREVENT_STUCK_MODIFIERS - /* disable debug print */ //#define NO_DEBUG diff --git a/keyboards/chocopad/config.h b/keyboards/chocopad/config.h index bf861ccda41b..2163ff8bc449 100644 --- a/keyboards/chocopad/config.h +++ b/keyboards/chocopad/config.h @@ -40,10 +40,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_HUE_STEP 8 @@ -56,4 +52,4 @@ #define ws2812_PORTREG PORTD #define ws2812_DDRREG DDRD -#endif \ No newline at end of file +#endif diff --git a/keyboards/clueboard/60/config.h b/keyboards/clueboard/60/config.h index 5c5a86296f95..a862d2cda3f6 100644 --- a/keyboards/clueboard/60/config.h +++ b/keyboards/clueboard/60/config.h @@ -49,9 +49,6 @@ /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ #define DEBOUNCE 6 -/* Prevent modifiers from being stuck on after layer changes. */ -#define PREVENT_STUCK_MODIFIERS - /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ //#define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/clueboard/66/keymaps/bloodlvst/config.h b/keyboards/clueboard/66/keymaps/bloodlvst/config.h index 320401dbda52..456936cf930d 100644 --- a/keyboards/clueboard/66/keymaps/bloodlvst/config.h +++ b/keyboards/clueboard/66/keymaps/bloodlvst/config.h @@ -3,6 +3,5 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS #define DISABLE_SPACE_CADET_ROLLOVER #endif diff --git a/keyboards/comet46/config.h b/keyboards/comet46/config.h index 90d923f90b9a..2421f5341259 100644 --- a/keyboards/comet46/config.h +++ b/keyboards/comet46/config.h @@ -52,8 +52,6 @@ along with this program. If not, see . * These options are also useful to firmware size reduction. */ -#define PREVENT_STUCK_MODIFIERS - /* disable debug print */ //#define NO_DEBUG diff --git a/keyboards/contra/config.h b/keyboards/contra/config.h index 85077ed46ad1..c6bb374da233 100755 --- a/keyboards/contra/config.h +++ b/keyboards/contra/config.h @@ -43,10 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 diff --git a/keyboards/contra/keymaps/ryanm101/config.h b/keyboards/contra/keymaps/ryanm101/config.h index 9a458b892d4b..224a4a37d098 100644 --- a/keyboards/contra/keymaps/ryanm101/config.h +++ b/keyboards/contra/keymaps/ryanm101/config.h @@ -3,7 +3,6 @@ #include "config_common.h" -#define PREVENT_STUCK_MODIFIERS #define TAPPING_TERM 200 #ifdef AUDIO_ENABLE @@ -28,7 +27,7 @@ /* enable basic MIDI features: - MIDI notes can be sent when in Music mode is on */ - + #define MIDI_BASIC /* enable advanced MIDI features: @@ -42,4 +41,4 @@ /* 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 +#endif diff --git a/keyboards/crawlpad/config.h b/keyboards/crawlpad/config.h index a07c79cd20b0..c72be83f28d2 100755 --- a/keyboards/crawlpad/config.h +++ b/keyboards/crawlpad/config.h @@ -40,9 +40,6 @@ false \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN D3 #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/crkbd/keymaps/default/config.h b/keyboards/crkbd/keymaps/default/config.h index 8d25f7cbc681..c573530f7482 100644 --- a/keyboards/crkbd/keymaps/default/config.h +++ b/keyboards/crkbd/keymaps/default/config.h @@ -36,7 +36,6 @@ along with this program. If not, see . #define USE_SERIAL_PD2 -#define PREVENT_STUCK_MODIFIERS #define TAPPING_FORCE_HOLD #define TAPPING_TERM 100 diff --git a/keyboards/dichotemy/config.h b/keyboards/dichotemy/config.h index b3bd6d942121..1d92cf74e571 100644 --- a/keyboards/dichotemy/config.h +++ b/keyboards/dichotemy/config.h @@ -52,8 +52,6 @@ along with this program. If not, see . * These options are also useful to firmware size reduction. */ -#define PREVENT_STUCK_MODIFIERS - /* disable debug print */ //#define NO_DEBUG diff --git a/keyboards/dilly/config.h b/keyboards/dilly/config.h index 97a6e533bb07..d9ca4597cf57 100644 --- a/keyboards/dilly/config.h +++ b/keyboards/dilly/config.h @@ -43,10 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_HUE_STEP 8 @@ -59,4 +55,4 @@ #define ws2812_PORTREG PORTD #define ws2812_DDRREG DDRD -#endif \ No newline at end of file +#endif diff --git a/keyboards/dz60/config.h b/keyboards/dz60/config.h index 8e1a5ae5f583..e58eae0858a4 100644 --- a/keyboards/dz60/config.h +++ b/keyboards/dz60/config.h @@ -41,9 +41,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 16 diff --git a/keyboards/dz60/keymaps/LEdiodes/config.h b/keyboards/dz60/keymaps/LEdiodes/config.h index bb78d9bb66e7..4f991b9ca2ca 100644 --- a/keyboards/dz60/keymaps/LEdiodes/config.h +++ b/keyboards/dz60/keymaps/LEdiodes/config.h @@ -41,9 +41,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 16 diff --git a/keyboards/ergodone/config.h b/keyboards/ergodone/config.h index 1feff26aa73a..2c764d782c10 100644 --- a/keyboards/ergodone/config.h +++ b/keyboards/ergodone/config.h @@ -53,8 +53,6 @@ /* Set 0 if debouncing isn't needed */ #define DEBOUNCE 5 -#define PREVENT_STUCK_MODIFIERS - #define USB_MAX_POWER_CONSUMPTION 500 /* NKRO */ diff --git a/keyboards/ergodox_ez/config.h b/keyboards/ergodox_ez/config.h index 07a9b549773a..7a350183b190 100644 --- a/keyboards/ergodox_ez/config.h +++ b/keyboards/ergodox_ez/config.h @@ -97,8 +97,6 @@ along with this program. If not, see . */ #define DEBOUNCE 15 -#define PREVENT_STUCK_MODIFIERS - #define USB_MAX_POWER_CONSUMPTION 500 // RGB backlight diff --git a/keyboards/ergodox_ez/keymaps/heartrobotninja/rules.mk b/keyboards/ergodox_ez/keymaps/heartrobotninja/rules.mk index 38112a9065ad..db5e5d15587a 100644 --- a/keyboards/ergodox_ez/keymaps/heartrobotninja/rules.mk +++ b/keyboards/ergodox_ez/keymaps/heartrobotninja/rules.mk @@ -13,6 +13,7 @@ AUTOLOG_ENABLE = no RGBLIGHT_ENABLE = yes RGBLIGHT_ANIMATION = yes EXTRAKEY_ENABLE = yes +LEADER_ENABLE = yes OPT_DEFS += -DUSER_PRINT @@ -31,4 +32,4 @@ OPT_DEFS += -DKEYMAP_VERSION=\"$(KEYMAP_VERSION)\\\#$(KEYMAP_BRANCH)\" ifndef QUANTUM_DIR include ../../../../Makefile -endif \ No newline at end of file +endif diff --git a/keyboards/ergodox_ez/keymaps/vim/vim.h b/keyboards/ergodox_ez/keymaps/vim/vim.h index e9b682fd3f26..7565c6e3e6a5 100644 --- a/keyboards/ergodox_ez/keymaps/vim/vim.h +++ b/keyboards/ergodox_ez/keymaps/vim/vim.h @@ -9,7 +9,6 @@ #define PRESS(keycode) register_code16(keycode) #define RELEASE(keycode) unregister_code16(keycode) -#define PREVENT_STUCK_MODIFIERS uint16_t VIM_QUEUE = KC_NO; diff --git a/keyboards/ergodox_infinity/keymaps/gordon/config.h b/keyboards/ergodox_infinity/keymaps/gordon/config.h index 88d495b12b23..772ce0bac9f7 100644 --- a/keyboards/ergodox_infinity/keymaps/gordon/config.h +++ b/keyboards/ergodox_infinity/keymaps/gordon/config.h @@ -15,8 +15,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#define PREVENT_STUCK_MODIFIERS - #undef IGNORE_MOD_TAP_INTERRUPT #define IGNORE_MOD_TAP_INTERRUPT diff --git a/keyboards/ergodox_infinity/keymaps/narze/config.h b/keyboards/ergodox_infinity/keymaps/narze/config.h index 8174edd35973..551327a126c6 100644 --- a/keyboards/ergodox_infinity/keymaps/narze/config.h +++ b/keyboards/ergodox_infinity/keymaps/narze/config.h @@ -13,7 +13,6 @@ #define IGNORE_MOD_TAP_INTERRUPT #define PERMISSIVE_HOLD -#define PREVENT_STUCK_MODIFIERS #undef MOUSEKEY_DELAY #define MOUSEKEY_DELAY 100 diff --git a/keyboards/ergodox_infinity/keymaps/not-quite-neo/rules.mk b/keyboards/ergodox_infinity/keymaps/not-quite-neo/rules.mk index 75624bb8c61f..74505bd69ef8 100644 --- a/keyboards/ergodox_infinity/keymaps/not-quite-neo/rules.mk +++ b/keyboards/ergodox_infinity/keymaps/not-quite-neo/rules.mk @@ -1,2 +1,3 @@ BACKLIGHT_ENABLE = yes -UNICODE_ENABLE = yes \ No newline at end of file +UNICODE_ENABLE = yes +LEADER_ENABLE = yes diff --git a/keyboards/ergoinu/config.h b/keyboards/ergoinu/config.h index 4b7c584005e9..de72635b19d2 100644 --- a/keyboards/ergoinu/config.h +++ b/keyboards/ergoinu/config.h @@ -31,8 +31,6 @@ along with this program. If not, see . #define PRODUCT ergoinu #define DESCRIPTION An (Not Portable But Small) Ergonomic split keyboard - -#define PREVENT_STUCK_MODIFIERS #define TAPPING_FORCE_HOLD #define TAPPING_TERM 100 diff --git a/keyboards/ergotravel/keymaps/ckofy/config.h b/keyboards/ergotravel/keymaps/ckofy/config.h index caae080d70e5..41ec06657e91 100644 --- a/keyboards/ergotravel/keymaps/ckofy/config.h +++ b/keyboards/ergotravel/keymaps/ckofy/config.h @@ -33,9 +33,6 @@ along with this program. If not, see . #define TAPPING_TOGGLE 2 -// required if modifiers are defined in layers besided the default one. -#define PREVENT_STUCK_MODIFIERS - #undef RGBLED_NUM #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 12 diff --git a/keyboards/felix/config.h b/keyboards/felix/config.h index f70089af4927..003fe87dc832 100644 --- a/keyboards/felix/config.h +++ b/keyboards/felix/config.h @@ -42,8 +42,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS /* there is no rgb underglow by default. */ #define RGB_DI_PIN @@ -53,4 +51,4 @@ #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 -#endif \ No newline at end of file +#endif diff --git a/keyboards/four_banger/config.h b/keyboards/four_banger/config.h index 96011cbdfa80..8dceff5db5dc 100644 --- a/keyboards/four_banger/config.h +++ b/keyboards/four_banger/config.h @@ -43,9 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E6 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS @@ -55,4 +52,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/fourier/keymaps/jennetters/config.h b/keyboards/fourier/keymaps/jennetters/config.h index 87cda7b5c95c..5f99c65ad555 100644 --- a/keyboards/fourier/keymaps/jennetters/config.h +++ b/keyboards/fourier/keymaps/jennetters/config.h @@ -22,10 +22,7 @@ along with this program. If not, see . #define TAPPING_TERM 100 -/* Try to prevent sticky keys */ -#define PREVENT_STUCK_MODIFIERS - /* Use I2C or Serial, not both */ #define USE_SERIAL -// #define USE_I2C \ No newline at end of file +// #define USE_I2C diff --git a/keyboards/fractal/config.h b/keyboards/fractal/config.h index 30b703b6e63c..1a5901f98449 100755 --- a/keyboards/fractal/config.h +++ b/keyboards/fractal/config.h @@ -43,10 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 diff --git a/keyboards/frosty_flake/keymaps/nikchi/rules.mk b/keyboards/frosty_flake/keymaps/nikchi/rules.mk index ad86e82d2053..b21eb640443a 100644 --- a/keyboards/frosty_flake/keymaps/nikchi/rules.mk +++ b/keyboards/frosty_flake/keymaps/nikchi/rules.mk @@ -1,5 +1,5 @@ # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# 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) @@ -17,6 +17,7 @@ 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 +LEADER_ENABLE = yes ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/gh80_3000/config.h b/keyboards/gh80_3000/config.h index 83d30129a15a..ca72aba5aa31 100644 --- a/keyboards/gh80_3000/config.h +++ b/keyboards/gh80_3000/config.h @@ -43,10 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 @@ -55,4 +51,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/gherkin/config.h b/keyboards/gherkin/config.h index 4607962d7c20..34f38e35c29f 100644 --- a/keyboards/gherkin/config.h +++ b/keyboards/gherkin/config.h @@ -43,10 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 @@ -55,4 +51,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/gherkin/keymaps/talljoe_gherkin/config.h b/keyboards/gherkin/keymaps/talljoe_gherkin/config.h index 3e9e692d3cac..7fa3bf328ec9 100644 --- a/keyboards/gherkin/keymaps/talljoe_gherkin/config.h +++ b/keyboards/gherkin/keymaps/talljoe_gherkin/config.h @@ -3,6 +3,4 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS - -#endif \ No newline at end of file +#endif diff --git a/keyboards/gonnerd/keymaps/gam3cat/config.h b/keyboards/gonnerd/keymaps/gam3cat/config.h index a3819d3a59a9..d86da86e40b6 100644 --- a/keyboards/gonnerd/keymaps/gam3cat/config.h +++ b/keyboards/gonnerd/keymaps/gam3cat/config.h @@ -1,7 +1,6 @@ #include "../../config.h" //GRAVE_ESC override for CTRL+SHIFT+ESC Windows task manager shortcut. #define GRAVE_ESC_CTRL_OVERRIDE -#define PREVENT_STUCK_MODIFIERS //Delay matrix scan for tap dance, reduce to activate modifier keys faster. //#define TAPPING_TERM 200 diff --git a/keyboards/hadron/keymaps/default/config.h b/keyboards/hadron/keymaps/default/config.h index 0f349ad93265..09922b61bcf2 100644 --- a/keyboards/hadron/keymaps/default/config.h +++ b/keyboards/hadron/keymaps/default/config.h @@ -5,7 +5,6 @@ #define LEADER_TIMEOUT 300 //#define BACKLIGHT_BREATHING -#define PREVENT_STUCK_MODIFIERS #define USE_I2C #define SSD1306OLED diff --git a/keyboards/hadron/keymaps/side_numpad/config.h b/keyboards/hadron/keymaps/side_numpad/config.h index 0f349ad93265..09922b61bcf2 100644 --- a/keyboards/hadron/keymaps/side_numpad/config.h +++ b/keyboards/hadron/keymaps/side_numpad/config.h @@ -5,7 +5,6 @@ #define LEADER_TIMEOUT 300 //#define BACKLIGHT_BREATHING -#define PREVENT_STUCK_MODIFIERS #define USE_I2C #define SSD1306OLED diff --git a/keyboards/handwired/MS_sculpt_mobile/config.h b/keyboards/handwired/MS_sculpt_mobile/config.h index f89514278d7b..c3bdf333e26b 100644 --- a/keyboards/handwired/MS_sculpt_mobile/config.h +++ b/keyboards/handwired/MS_sculpt_mobile/config.h @@ -28,10 +28,10 @@ along with this program. If not, see . #define DESCRIPTION 6000 /* key matrix size */ -#define MATRIX_ROWS 8 -#define MATRIX_COLS 18 +#define MATRIX_ROWS 8 +#define MATRIX_COLS 18 -#ifdef ASTAR +#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} @@ -95,6 +95,4 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION -#define PREVENT_STUCK_MODIFIERS - #endif diff --git a/keyboards/handwired/atreus50/keymaps/ajp10304/config.h b/keyboards/handwired/atreus50/keymaps/ajp10304/config.h index 6916d1a7d46f..f5e6bbabe6c8 100644 --- a/keyboards/handwired/atreus50/keymaps/ajp10304/config.h +++ b/keyboards/handwired/atreus50/keymaps/ajp10304/config.h @@ -3,8 +3,6 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS - #undef MATRIX_ROW_PINS #undef MATRIX_COL_PINS diff --git a/keyboards/handwired/dactyl/config.h b/keyboards/handwired/dactyl/config.h index a990cc72080d..08931ecd345a 100644 --- a/keyboards/handwired/dactyl/config.h +++ b/keyboards/handwired/dactyl/config.h @@ -63,8 +63,6 @@ along with this program. If not, see . /* Set 0 if debouncing isn't needed */ #define DEBOUNCE 15 -#define PREVENT_STUCK_MODIFIERS - #define USB_MAX_POWER_CONSUMPTION 500 #endif diff --git a/keyboards/handwired/kbod/config.h b/keyboards/handwired/kbod/config.h index f3d0c8bf2deb..a3f3e3908a12 100644 --- a/keyboards/handwired/kbod/config.h +++ b/keyboards/handwired/kbod/config.h @@ -48,7 +48,7 @@ along with this program. If not, see . /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #define DIODE_DIRECTION COL2ROW - + // #define BACKLIGHT_PIN B7 // #define BACKLIGHT_BREATHING // #define BACKLIGHT_LEVELS 3 @@ -159,8 +159,6 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION -#define PREVENT_STUCK_MODIFIERS - #undef TAPPING_TOGGLE #define TAPPING_TOGGLE 2 diff --git a/keyboards/handwired/promethium/keymaps/default/config.h b/keyboards/handwired/promethium/keymaps/default/config.h index fa86e2247949..2064f3676a7e 100644 --- a/keyboards/handwired/promethium/keymaps/default/config.h +++ b/keyboards/handwired/promethium/keymaps/default/config.h @@ -11,8 +11,6 @@ /* skip bootmagic and eeconfig */ #define BOOTMAGIC_KEY_SKIP KC_SPACE -#define PREVENT_STUCK_MODIFIERS - #define RGBSPS_ENABLE #define RGBSPS_DEMO_ENABLE diff --git a/keyboards/handwired/promethium/keymaps/priyadi/config.h b/keyboards/handwired/promethium/keymaps/priyadi/config.h index fa86e2247949..2064f3676a7e 100644 --- a/keyboards/handwired/promethium/keymaps/priyadi/config.h +++ b/keyboards/handwired/promethium/keymaps/priyadi/config.h @@ -11,8 +11,6 @@ /* skip bootmagic and eeconfig */ #define BOOTMAGIC_KEY_SKIP KC_SPACE -#define PREVENT_STUCK_MODIFIERS - #define RGBSPS_ENABLE #define RGBSPS_DEMO_ENABLE diff --git a/keyboards/handwired/space_oddity/config.h b/keyboards/handwired/space_oddity/config.h index 9c9361ced7bd..46d854099cb5 100644 --- a/keyboards/handwired/space_oddity/config.h +++ b/keyboards/handwired/space_oddity/config.h @@ -49,10 +49,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 diff --git a/keyboards/helix/pico/config.h b/keyboards/helix/pico/config.h index b49f0173b450..41edfcbc2044 100644 --- a/keyboards/helix/pico/config.h +++ b/keyboards/helix/pico/config.h @@ -28,7 +28,6 @@ along with this program. If not, see . #define DESCRIPTION A split keyboard for the cheap makers -#define PREVENT_STUCK_MODIFIERS #define TAPPING_FORCE_HOLD #define TAPPING_TERM 100 diff --git a/keyboards/helix/rev1/keymaps/OLED_sample/config.h b/keyboards/helix/rev1/keymaps/OLED_sample/config.h index 0e1b787a5aa4..5e8989d96f46 100644 --- a/keyboards/helix/rev1/keymaps/OLED_sample/config.h +++ b/keyboards/helix/rev1/keymaps/OLED_sample/config.h @@ -35,7 +35,8 @@ along with this program. If not, see . #define SSD1306OLED -#define PREVENT_STUCK_MODIFIERS +#define USE_SERIAL_PD2 + #define TAPPING_FORCE_HOLD #define TAPPING_TERM 100 diff --git a/keyboards/helix/rev2/config.h b/keyboards/helix/rev2/config.h index 058236122ffc..b354d312d551 100644 --- a/keyboards/helix/rev2/config.h +++ b/keyboards/helix/rev2/config.h @@ -28,7 +28,6 @@ along with this program. If not, see . #define DESCRIPTION A split keyboard for the cheap makers -#define PREVENT_STUCK_MODIFIERS #define TAPPING_FORCE_HOLD #define TAPPING_TERM 100 diff --git a/keyboards/hhkb/keymaps/blakedietz/rules.mk b/keyboards/hhkb/keymaps/blakedietz/rules.mk index 7c16b2c98d66..7d97e7a5240f 100644 --- a/keyboards/hhkb/keymaps/blakedietz/rules.mk +++ b/keyboards/hhkb/keymaps/blakedietz/rules.mk @@ -1,2 +1,3 @@ TAP_DANCE_ENABLE = no UNICODE_ENABLE = no +LEADER_ENABLE = yes diff --git a/keyboards/infinity60/config.h b/keyboards/infinity60/config.h index 8306c8f7efc8..c1e9ec5b1f2a 100644 --- a/keyboards/infinity60/config.h +++ b/keyboards/infinity60/config.h @@ -18,8 +18,6 @@ along with this program. If not, see . #ifndef CONFIG_H #define CONFIG_H -#define PREVENT_STUCK_MODIFIERS - /* USB Device descriptor parameter */ #define VENDOR_ID 0x1c11 #define PRODUCT_ID 0xb04d diff --git a/keyboards/iris/keymaps/davidrambo/config.h b/keyboards/iris/keymaps/davidrambo/config.h index 01e078e32641..2cdff4213bab 100644 --- a/keyboards/iris/keymaps/davidrambo/config.h +++ b/keyboards/iris/keymaps/davidrambo/config.h @@ -27,7 +27,6 @@ along with this program. If not, see . /* Select hand configuration */ #define PERMISSIVE_HOLD -#define PREVENT_STUCK_MODIFIERS #define MASTER_LEFT // #define MASTER_RIGHT // #define EE_HANDS diff --git a/keyboards/iris/keymaps/jennetters/config.h b/keyboards/iris/keymaps/jennetters/config.h index a3c0634f5234..42f91bd0270b 100644 --- a/keyboards/iris/keymaps/jennetters/config.h +++ b/keyboards/iris/keymaps/jennetters/config.h @@ -19,9 +19,6 @@ along with this program. If not, see . #define TAPPING_TERM 150 -/* Try to prevent sticky keys */ -#define PREVENT_STUCK_MODIFIERS - /* Use I2C or Serial, not both */ #define USE_SERIAL @@ -38,4 +35,4 @@ along with this program. If not, see . #define RGBLED_NUM 12 #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 -#define RGBLIGHT_VAL_STEP 8 \ No newline at end of file +#define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/iris/keymaps/krusli/config.h b/keyboards/iris/keymaps/krusli/config.h index a53c746ad93f..72e35c472870 100644 --- a/keyboards/iris/keymaps/krusli/config.h +++ b/keyboards/iris/keymaps/krusli/config.h @@ -20,8 +20,6 @@ along with this program. If not, see . #include "config_common.h" -// #define PREVENT_STUCK_MODIFIERS - /* Use I2C or Serial, not both */ #define USE_SERIAL diff --git a/keyboards/iris/keymaps/xyverz/config.h b/keyboards/iris/keymaps/xyverz/config.h index 0c61a8eac8aa..b820a0753d51 100644 --- a/keyboards/iris/keymaps/xyverz/config.h +++ b/keyboards/iris/keymaps/xyverz/config.h @@ -23,8 +23,6 @@ along with this program. If not, see . #define USE_SERIAL #define EE_HANDS -#define PREVENT_STUCK_MODIFIERS - #undef PRODUCT #define PRODUCT Iris Keyboard diff --git a/keyboards/jc65/v32u4/keymaps/gam3cat/config.h b/keyboards/jc65/v32u4/keymaps/gam3cat/config.h index a3819d3a59a9..d86da86e40b6 100644 --- a/keyboards/jc65/v32u4/keymaps/gam3cat/config.h +++ b/keyboards/jc65/v32u4/keymaps/gam3cat/config.h @@ -1,7 +1,6 @@ #include "../../config.h" //GRAVE_ESC override for CTRL+SHIFT+ESC Windows task manager shortcut. #define GRAVE_ESC_CTRL_OVERRIDE -#define PREVENT_STUCK_MODIFIERS //Delay matrix scan for tap dance, reduce to activate modifier keys faster. //#define TAPPING_TERM 200 diff --git a/keyboards/jj40/keymaps/ajp10304/config.h b/keyboards/jj40/keymaps/ajp10304/config.h deleted file mode 100644 index 11cafbefcb0c..000000000000 --- a/keyboards/jj40/keymaps/ajp10304/config.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define PREVENT_STUCK_MODIFIERS - -#endif diff --git a/keyboards/jj40/keymaps/fun40/config.h b/keyboards/jj40/keymaps/fun40/config.h index 89807d84ade5..f2b5d264e7a2 100644 --- a/keyboards/jj40/keymaps/fun40/config.h +++ b/keyboards/jj40/keymaps/fun40/config.h @@ -4,6 +4,5 @@ #include "../../config.h" #define FORCE_NKRO -#define PREVENT_STUCK_MODIFIERS #endif diff --git a/keyboards/jj40/keymaps/krusli/config.h b/keyboards/jj40/keymaps/krusli/config.h index 6d98a37a6782..e710dbbb60a5 100644 --- a/keyboards/jj40/keymaps/krusli/config.h +++ b/keyboards/jj40/keymaps/krusli/config.h @@ -3,7 +3,6 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS // #define TAPPING_TERM 300 #endif diff --git a/keyboards/jj40/keymaps/oscillope/config.h b/keyboards/jj40/keymaps/oscillope/config.h index d7f991fa91f4..e812903de9b5 100644 --- a/keyboards/jj40/keymaps/oscillope/config.h +++ b/keyboards/jj40/keymaps/oscillope/config.h @@ -3,7 +3,6 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS #define TAPPING_TERM 200 #endif diff --git a/keyboards/jj40/keymaps/suzuken/config.h b/keyboards/jj40/keymaps/suzuken/config.h index 52aaa8f24dce..b1d74e1e6931 100644 --- a/keyboards/jj40/keymaps/suzuken/config.h +++ b/keyboards/jj40/keymaps/suzuken/config.h @@ -3,7 +3,6 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS #define TAPPING_TERM 300 #endif diff --git a/keyboards/jj40/keymaps/waples/config.h b/keyboards/jj40/keymaps/waples/config.h index 52aaa8f24dce..b1d74e1e6931 100644 --- a/keyboards/jj40/keymaps/waples/config.h +++ b/keyboards/jj40/keymaps/waples/config.h @@ -3,7 +3,6 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS #define TAPPING_TERM 300 #endif diff --git a/keyboards/jm60/config.h b/keyboards/jm60/config.h index 847cf20780f0..cb5c90bb1937 100644 --- a/keyboards/jm60/config.h +++ b/keyboards/jm60/config.h @@ -18,8 +18,6 @@ along with this program. If not, see . #ifndef CONFIG_H #define CONFIG_H -#define PREVENT_STUCK_MODIFIERS - /* USB Device descriptor parameter */ #define VENDOR_ID 0xFEED #define PRODUCT_ID 0x6464 diff --git a/keyboards/k_type/config.h b/keyboards/k_type/config.h index d19e0ff64901..4937d9ad99a5 100644 --- a/keyboards/k_type/config.h +++ b/keyboards/k_type/config.h @@ -18,8 +18,6 @@ along with this program. If not, see . #ifndef CONFIG_H #define CONFIG_H -#define PREVENT_STUCK_MODIFIERS - /* USB Device descriptor parameter */ #define VENDOR_ID 0x1c11 #define PRODUCT_ID 0xb04d diff --git a/keyboards/katana60/config.h b/keyboards/katana60/config.h index 169cffb420ce..aaf2b5d5447c 100644 --- a/keyboards/katana60/config.h +++ b/keyboards/katana60/config.h @@ -48,7 +48,7 @@ along with this program. If not, see . /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #define DIODE_DIRECTION ROW2COL - + // #define BACKLIGHT_PIN B7 // #define BACKLIGHT_BREATHING // #define BACKLIGHT_LEVELS 3 @@ -111,7 +111,6 @@ along with this program. If not, see . ) #define TAPPING_TERM 200 -#define PREVENT_STUCK_MODIFIERS /* control how magic key switches layers */ //#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true diff --git a/keyboards/kbd75/config.h b/keyboards/kbd75/config.h index f76d9082fb43..726afcaf6e79 100644 --- a/keyboards/kbd75/config.h +++ b/keyboards/kbd75/config.h @@ -43,9 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/kinesis/keymaps/insertsnideremarks/config.h b/keyboards/kinesis/keymaps/insertsnideremarks/config.h index 3548fa3486b5..9ce094be5164 100644 --- a/keyboards/kinesis/keymaps/insertsnideremarks/config.h +++ b/keyboards/kinesis/keymaps/insertsnideremarks/config.h @@ -5,7 +5,6 @@ #include "../../config.h" // place overrides here -#define PREVENT_STUCK_MODIFIERS #define IGNORE_MOD_TAP_INTERRUPT #define TAPPING_TERM 175 #define TAPPING_TOGGLE 2 diff --git a/keyboards/lets_split/keymaps/OLED_sample/config.h b/keyboards/lets_split/keymaps/OLED_sample/config.h index e8632fe61df8..6aa909d284fb 100644 --- a/keyboards/lets_split/keymaps/OLED_sample/config.h +++ b/keyboards/lets_split/keymaps/OLED_sample/config.h @@ -38,8 +38,6 @@ along with this program. If not, see . #define SSD1306OLED //#define OLED_ROTATE180 - -#define PREVENT_STUCK_MODIFIERS #define TAPPING_FORCE_HOLD #define TAPPING_TERM 100 diff --git a/keyboards/lets_split/keymaps/adam/config.h b/keyboards/lets_split/keymaps/adam/config.h index ff29eb1bde14..59a2e5db72f1 100644 --- a/keyboards/lets_split/keymaps/adam/config.h +++ b/keyboards/lets_split/keymaps/adam/config.h @@ -43,7 +43,6 @@ along with this program. If not, see . #undef TAPPING_TERM #define TAPPING_TERM 200 //At 500 some bad logic takes hold -#define PREVENT_STUCK_MODIFIERS #define IGNORE_MOD_TAP_INTERRUPT #define PERMISSIVE_HOLD diff --git a/keyboards/lets_split/keymaps/khord/config.h b/keyboards/lets_split/keymaps/khord/config.h index 4ebdbad76919..71ec20dbc86d 100644 --- a/keyboards/lets_split/keymaps/khord/config.h +++ b/keyboards/lets_split/keymaps/khord/config.h @@ -25,9 +25,6 @@ along with this program. If not, see . #define TAPPING_TERM 150 -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - /* Use I2C or Serial, not both */ #define USE_SERIAL diff --git a/keyboards/lets_split/keymaps/piemod/config.h b/keyboards/lets_split/keymaps/piemod/config.h index 001b62e41bbc..1b3fd7544e73 100644 --- a/keyboards/lets_split/keymaps/piemod/config.h +++ b/keyboards/lets_split/keymaps/piemod/config.h @@ -43,7 +43,6 @@ along with this program. If not, see . #define RGBLIGHT_EFFECT_KNIGHT_LENGTH 1 // Typing Options -#define PREVENT_STUCK_MODIFIERS #define QMK_KEYS_PER_SCAN 4 #endif diff --git a/keyboards/lets_split/keymaps/waples/config.h b/keyboards/lets_split/keymaps/waples/config.h index 98ebeff45580..5221fd011a54 100644 --- a/keyboards/lets_split/keymaps/waples/config.h +++ b/keyboards/lets_split/keymaps/waples/config.h @@ -12,6 +12,4 @@ // #define MASTER_RIGHT #define EE_HANDS // We like to have choices I guess -#define PREVENT_STUCK_MODIFIERS // When switching layers, this will release all mods - #endif diff --git a/keyboards/lets_split/keymaps/xk/config.h b/keyboards/lets_split/keymaps/xk/config.h index c75ed12cc806..a5cd518576e4 100644 --- a/keyboards/lets_split/keymaps/xk/config.h +++ b/keyboards/lets_split/keymaps/xk/config.h @@ -37,7 +37,6 @@ the Free Software Foundation, either version 2 of the License, or #define EE_HANDS -#define PREVENT_STUCK_MODIFIERS #define IGNORE_MOD_TAP_INTERRUPT #define PERMISSIVE_HOLD diff --git a/keyboards/m10a/keymaps/gam3cat/config.h b/keyboards/m10a/keymaps/gam3cat/config.h deleted file mode 100644 index 73bc50bc2dd5..000000000000 --- a/keyboards/m10a/keymaps/gam3cat/config.h +++ /dev/null @@ -1,2 +0,0 @@ -#include "../../config.h" -#define PREVENT_STUCK_MODIFIERS diff --git a/keyboards/mechmini/v2/config.h b/keyboards/mechmini/v2/config.h index 58c751e0f89e..e0922bb7e22e 100755 --- a/keyboards/mechmini/v2/config.h +++ b/keyboards/mechmini/v2/config.h @@ -62,9 +62,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/melody96/config.h b/keyboards/melody96/config.h index 6083dcf751c0..67123a7e524c 100644 --- a/keyboards/melody96/config.h +++ b/keyboards/melody96/config.h @@ -43,9 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/minidox/keymaps/alairock/config.h b/keyboards/minidox/keymaps/alairock/config.h index 4456060319b4..3649fdd12c6f 100644 --- a/keyboards/minidox/keymaps/alairock/config.h +++ b/keyboards/minidox/keymaps/alairock/config.h @@ -36,5 +36,4 @@ along with this program. If not, see . #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 #define RGBLIGHT_VAL_STEP 17 -#define PREVENT_STUCK_MODIFIERS #endif diff --git a/keyboards/minidox/keymaps/khitsule/config.h b/keyboards/minidox/keymaps/khitsule/config.h index 7023548646fb..645e80ee8f11 100644 --- a/keyboards/minidox/keymaps/khitsule/config.h +++ b/keyboards/minidox/keymaps/khitsule/config.h @@ -1,8 +1,6 @@ #ifndef CONFIG_USER_H #define CONFIG_USER_H -#define PREVENT_STUCK_MODIFIERS - #define IGNORE_MOD_TAP_INTERRUPT -#endif \ No newline at end of file +#endif diff --git a/keyboards/mint60/config.h b/keyboards/mint60/config.h index 37b69e93a123..51c586e6368f 100644 --- a/keyboards/mint60/config.h +++ b/keyboards/mint60/config.h @@ -29,7 +29,6 @@ along with this program. If not, see . #define PRODUCT Mint60 #define DESCRIPTION A row staggered split keyboard -#define PREVENT_STUCK_MODIFIERS #define TAPPING_FORCE_HOLD #define TAPPING_TERM 100 diff --git a/keyboards/mitosis/config.h b/keyboards/mitosis/config.h index 6101ee12379f..5cfd2e4b122e 100644 --- a/keyboards/mitosis/config.h +++ b/keyboards/mitosis/config.h @@ -52,8 +52,6 @@ along with this program. If not, see . * These options are also useful to firmware size reduction. */ -#define PREVENT_STUCK_MODIFIERS - /* disable debug print */ //#define NO_DEBUG diff --git a/keyboards/niu_mini/config.h b/keyboards/niu_mini/config.h index 2f223061609e..b9d3ed4e9ddc 100644 --- a/keyboards/niu_mini/config.h +++ b/keyboards/niu_mini/config.h @@ -64,9 +64,6 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/novelpad/config.h b/keyboards/novelpad/config.h index 0d6a7134332c..3a47c0eb6512 100755 --- a/keyboards/novelpad/config.h +++ b/keyboards/novelpad/config.h @@ -53,9 +53,6 @@ along with this program. If not, see . false \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define BACKLIGHT_LEVELS 10 #define BACKLIGHT_PIN B7 diff --git a/keyboards/noxary/268/config.h b/keyboards/noxary/268/config.h index b2cb95e95cc5..7eec79a1bcd2 100644 --- a/keyboards/noxary/268/config.h +++ b/keyboards/noxary/268/config.h @@ -60,9 +60,6 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - /* ws2812b options */ #define RGB_DI_PIN B5 #ifdef RGB_DI_PIN @@ -73,4 +70,4 @@ along with this program. If not, see . #define RGBLIGHT_VAL_STEP 16 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/ok60/config.h b/keyboards/ok60/config.h index 61c2fa0ed34d..db7b74e58724 100644 --- a/keyboards/ok60/config.h +++ b/keyboards/ok60/config.h @@ -71,9 +71,6 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN F6 #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 10 diff --git a/keyboards/omnikey_blackheart/config.h b/keyboards/omnikey_blackheart/config.h index 14b4a5f172ac..94412cfa6730 100644 --- a/keyboards/omnikey_blackheart/config.h +++ b/keyboards/omnikey_blackheart/config.h @@ -45,10 +45,6 @@ /* force n-key rollover*/ #define FORCE_NKRO -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 @@ -57,4 +53,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/paladin64/config.h b/keyboards/paladin64/config.h index 27f54bf1611c..a5280f4d48b2 100755 --- a/keyboards/paladin64/config.h +++ b/keyboards/paladin64/config.h @@ -110,8 +110,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS #define RGB_DI_PIN D0 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/pegasushoof/keymaps/citadel/config.h b/keyboards/pegasushoof/keymaps/citadel/config.h index e8eafe2e172d..2d27ff392d6f 100644 --- a/keyboards/pegasushoof/keymaps/citadel/config.h +++ b/keyboards/pegasushoof/keymaps/citadel/config.h @@ -8,7 +8,4 @@ #undef PRODUCT #define PRODUCT Pegasus Hoof Citadel -/* necessary option for this keymap, because CAPS is redefined in Layer 0 */ -#define PREVENT_STUCK_MODIFIERS - #endif diff --git a/keyboards/planck/keymaps/ajp10304/config.h b/keyboards/planck/keymaps/ajp10304/config.h deleted file mode 100644 index 11cafbefcb0c..000000000000 --- a/keyboards/planck/keymaps/ajp10304/config.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define PREVENT_STUCK_MODIFIERS - -#endif diff --git a/keyboards/planck/keymaps/altgr/config.h b/keyboards/planck/keymaps/altgr/config.h index d55258c02bd8..e517a8b24b92 100644 --- a/keyboards/planck/keymaps/altgr/config.h +++ b/keyboards/planck/keymaps/altgr/config.h @@ -3,9 +3,6 @@ #include "../../config.h" -// required because lower/raise modifiers are redefined by colemak-dh -#define PREVENT_STUCK_MODIFIERS - // tap dance key press termination interval #define TAPPING_TERM 250 diff --git a/keyboards/planck/keymaps/am/config.h b/keyboards/planck/keymaps/am/config.h index b2b87045b873..1ae457e3b8b7 100644 --- a/keyboards/planck/keymaps/am/config.h +++ b/keyboards/planck/keymaps/am/config.h @@ -1,8 +1,5 @@ #pragma once -/* Prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #ifdef AUDIO_ENABLE #define STARTUP_SONG SONG(PLANCK_SOUND) diff --git a/keyboards/planck/keymaps/andylikescandy/config.h b/keyboards/planck/keymaps/andylikescandy/config.h index 0de5f3db0ccd..01169db2aa44 100644 --- a/keyboards/planck/keymaps/andylikescandy/config.h +++ b/keyboards/planck/keymaps/andylikescandy/config.h @@ -17,9 +17,6 @@ #define PERMISSIVE_HOLD -#define PREVENT_STUCK_MODIFIERS - - /* * MIDI options */ diff --git a/keyboards/planck/keymaps/bone2planck/config.h b/keyboards/planck/keymaps/bone2planck/config.h deleted file mode 100644 index 3e9e692d3cac..000000000000 --- a/keyboards/planck/keymaps/bone2planck/config.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define PREVENT_STUCK_MODIFIERS - -#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/davidrambo/config.h b/keyboards/planck/keymaps/davidrambo/config.h index c3bebf579906..2decb3dc8de7 100644 --- a/keyboards/planck/keymaps/davidrambo/config.h +++ b/keyboards/planck/keymaps/davidrambo/config.h @@ -3,7 +3,6 @@ #define CONFIG_USER_H #define TAPPING_TERM 200 #include "../../config.h" -#define PERMISSIVE_HOLD -#define PREVENT_STUCK_MODIFIERS +#define PERMISSIVE_HOLD -#endif \ No newline at end of file +#endif diff --git a/keyboards/planck/keymaps/dshields/config.h b/keyboards/planck/keymaps/dshields/config.h index 480ba453a26e..9ba854ef0452 100644 --- a/keyboards/planck/keymaps/dshields/config.h +++ b/keyboards/planck/keymaps/dshields/config.h @@ -10,7 +10,6 @@ #define _______ KC_TRNS #define XXXXXXX KC_NO -#define PREVENT_STUCK_MODIFIERS #define USB_MAX_POWER_CONSUMPTION 100 #define ONESHOT_TAP_TOGGLE 2 diff --git a/keyboards/planck/keymaps/espynn/keymap.c b/keyboards/planck/keymaps/espynn/keymap.c index 9cf508af6d70..5615a78bf75e 100644 --- a/keyboards/planck/keymaps/espynn/keymap.c +++ b/keyboards/planck/keymaps/espynn/keymap.c @@ -5,7 +5,6 @@ #ifdef BACKLIGHT_ENABLE #include "backlight.h" #endif -#define PREVENT_STUCK_MODIFIERS extern keymap_config_t keymap_config; // Symbolic names for macro IDs. diff --git a/keyboards/planck/keymaps/experimental/config.h b/keyboards/planck/keymaps/experimental/config.h index 0864b5fbc92d..86cc4760bb63 100644 --- a/keyboards/planck/keymaps/experimental/config.h +++ b/keyboards/planck/keymaps/experimental/config.h @@ -5,8 +5,6 @@ #define LEADER_TIMEOUT 300 #define BACKLIGHT_BREATHING -#define PREVENT_STUCK_MODIFIERS - /* ws2812 RGB LED */ #define RGB_DI_PIN B1 diff --git a/keyboards/planck/keymaps/experimental/rules.mk b/keyboards/planck/keymaps/experimental/rules.mk index b135dfca01ca..168d3cb9f094 100644 --- a/keyboards/planck/keymaps/experimental/rules.mk +++ b/keyboards/planck/keymaps/experimental/rules.mk @@ -18,10 +18,11 @@ 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. SWAP_HANDS_ENABLE = yes # Enable one-hand typing STENO_ENABLE = yes # Enable TX Bolt protocol for Stenography, requires VIRTSER and may not work with mouse keys +LEADER_ENABLE = yes # 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 +endif diff --git a/keyboards/planck/keymaps/hiea/config.h b/keyboards/planck/keymaps/hiea/config.h index 9bb5e0873507..655cdf5db31f 100644 --- a/keyboards/planck/keymaps/hiea/config.h +++ b/keyboards/planck/keymaps/hiea/config.h @@ -3,9 +3,6 @@ #include "../../config.h" -// required because lower/raise modifiers are redefined by colemak-dh -#define PREVENT_STUCK_MODIFIERS - // tap dance key press termination interval #define TAPPING_TERM 250 diff --git a/keyboards/planck/keymaps/hieax/config.h b/keyboards/planck/keymaps/hieax/config.h index 9bb5e0873507..655cdf5db31f 100644 --- a/keyboards/planck/keymaps/hieax/config.h +++ b/keyboards/planck/keymaps/hieax/config.h @@ -3,9 +3,6 @@ #include "../../config.h" -// required because lower/raise modifiers are redefined by colemak-dh -#define PREVENT_STUCK_MODIFIERS - // tap dance key press termination interval #define TAPPING_TERM 250 diff --git a/keyboards/planck/keymaps/ishtob/config.h b/keyboards/planck/keymaps/ishtob/config.h index e58ade0b0fc2..688607634c89 100755 --- a/keyboards/planck/keymaps/ishtob/config.h +++ b/keyboards/planck/keymaps/ishtob/config.h @@ -2,7 +2,6 @@ #ifndef USERSPACE_CONFIG_H #define USERSPACE_CONFIG_H - #ifdef AUDIO_ENABLE // #define STARTUP_SONG SONG(E1M1_DOOM) @@ -24,7 +23,6 @@ #define FORCE_NKRO #define LEADER_TIMEOUT 300 -#define PREVENT_STUCK_MODIFIERS #undef DEBOUNCE #define DEBOUNCE 0 diff --git a/keyboards/planck/keymaps/jarred/config.h b/keyboards/planck/keymaps/jarred/config.h index f98b8935e29d..9e8f404c15b1 100644 --- a/keyboards/planck/keymaps/jarred/config.h +++ b/keyboards/planck/keymaps/jarred/config.h @@ -19,8 +19,6 @@ #include "config_common.h" -#define PREVENT_STUCK_MODIFIERS - #ifdef AUDIO_ENABLE #define STARTUP_SONG SONG(PLANCK_SOUND) #endif @@ -34,6 +32,6 @@ #define MOUSEKEY_WHEEL_DELAY 0 #define MOUSEKEY_WHEEL_MAX_SPEED 4 -#define MOUSEKEY_WHEEL_TIME_TO_MAX 255 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 255 #endif diff --git a/keyboards/planck/keymaps/jeremy-dev/keymap.c b/keyboards/planck/keymaps/jeremy-dev/keymap.c index 5aea4432901e..89b7e6b84ad6 100644 --- a/keyboards/planck/keymaps/jeremy-dev/keymap.c +++ b/keyboards/planck/keymaps/jeremy-dev/keymap.c @@ -1,7 +1,6 @@ // This is the personal keymap of Jeremy Cowgar (@jcowgar). It is written for the programmer. // Configuration options -#define PREVENT_STUCK_MODIFIERS #pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example" #include "planck.h" diff --git a/keyboards/planck/keymaps/kmontag42/rules.mk b/keyboards/planck/keymaps/kmontag42/rules.mk index b9f73934aa81..0c100076beae 100644 --- a/keyboards/planck/keymaps/kmontag42/rules.mk +++ b/keyboards/planck/keymaps/kmontag42/rules.mk @@ -1,4 +1,5 @@ UNICODE_ENABLE = yes +LEADER_ENABLE = yes ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/planck/keymaps/lae3/config.h b/keyboards/planck/keymaps/lae3/config.h deleted file mode 100644 index a28634e696d8..000000000000 --- a/keyboards/planck/keymaps/lae3/config.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef LAE3_KEYMAP_H -#define LAE3_KEYMAP_H - -#include "../../config.h" - -#define PREVENT_STUCK_MODIFIERS - -#endif diff --git a/keyboards/planck/keymaps/mitch/config.h b/keyboards/planck/keymaps/mitch/config.h index 10591b3c8ca0..bb7989d90d82 100644 --- a/keyboards/planck/keymaps/mitch/config.h +++ b/keyboards/planck/keymaps/mitch/config.h @@ -1,6 +1,5 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS // for the broken board #undef MATRIX_COL_PINS -#define MATRIX_COL_PINS { F1, F0, B0, B2, F4, F5, F6, F7, D4, D6, B4, D7 } \ No newline at end of file +#define MATRIX_COL_PINS { F1, F0, B0, B2, F4, F5, F6, F7, D4, D6, B4, D7 } diff --git a/keyboards/planck/keymaps/mitch/readme.md b/keyboards/planck/keymaps/mitch/readme.md index 3869304f443f..9ed1133ef9c3 100644 --- a/keyboards/planck/keymaps/mitch/readme.md +++ b/keyboards/planck/keymaps/mitch/readme.md @@ -20,7 +20,3 @@ rest of the symbols, mostly mapped with the ten key numbers. The normal right shift key uses the `MT` macro to trigger Enter on tap and right shift when held. - -This keymap sets the `PREVENT_STUCK_MODIFIERS` flag to avoid the occasional WTF -moments when using a modifier keys and accidentally releasing them after moving -to a new layer. diff --git a/keyboards/planck/keymaps/narze/config.h b/keyboards/planck/keymaps/narze/config.h index e081a93b5344..19d784b2bef4 100644 --- a/keyboards/planck/keymaps/narze/config.h +++ b/keyboards/planck/keymaps/narze/config.h @@ -33,10 +33,9 @@ #define IGNORE_MOD_TAP_INTERRUPT #define PERMISSIVE_HOLD -#define PREVENT_STUCK_MODIFIERS #define SUPER_DUPER_SOUND S__NOTE(_B1) #define MOUSEKEY_DELAY 100 -#endif \ No newline at end of file +#endif diff --git a/keyboards/planck/keymaps/neo2planck/config.h b/keyboards/planck/keymaps/neo2planck/config.h deleted file mode 100644 index 3e9e692d3cac..000000000000 --- a/keyboards/planck/keymaps/neo2planck/config.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define PREVENT_STUCK_MODIFIERS - -#endif \ No newline at end of file diff --git a/keyboards/planck/keymaps/priyadi/config.h b/keyboards/planck/keymaps/priyadi/config.h index 448ae3b908ac..876d057bf2a3 100644 --- a/keyboards/planck/keymaps/priyadi/config.h +++ b/keyboards/planck/keymaps/priyadi/config.h @@ -11,8 +11,6 @@ /* skip bootmagic and eeconfig */ #define BOOTMAGIC_KEY_SKIP KC_SPACE -#define PREVENT_STUCK_MODIFIERS - #define UNICODE_TYPE_DELAY 0 #define LAYOUT_DVORAK diff --git a/keyboards/planck/keymaps/sdothum/config.h b/keyboards/planck/keymaps/sdothum/config.h index 4b2cdeece173..8bed79e6f7c8 100644 --- a/keyboards/planck/keymaps/sdothum/config.h +++ b/keyboards/planck/keymaps/sdothum/config.h @@ -3,9 +3,6 @@ #include "../../config.h" -// required because lower/raise modifiers are redefined by colemak-dh -#define PREVENT_STUCK_MODIFIERS - // tap dance key press termination interval #define TAPPING_TERM 250 diff --git a/keyboards/planck/keymaps/steno/config.h b/keyboards/planck/keymaps/steno/config.h index 1879ab007f8c..4f99c7eb81d9 100644 --- a/keyboards/planck/keymaps/steno/config.h +++ b/keyboards/planck/keymaps/steno/config.h @@ -15,8 +15,6 @@ #define MUSIC_MASK (keycode != KC_NO) -#define PREVENT_STUCK_MODIFIERS - /* * MIDI options */ @@ -41,4 +39,4 @@ /* 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 +#endif diff --git a/keyboards/planck/keymaps/tehwalris/config.h b/keyboards/planck/keymaps/tehwalris/config.h index 4725e1426db8..c5d55b96938f 100644 --- a/keyboards/planck/keymaps/tehwalris/config.h +++ b/keyboards/planck/keymaps/tehwalris/config.h @@ -3,8 +3,6 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS - #ifdef AUDIO_ENABLE // #define STARTUP_SONG SONG(PLANCK_SOUND) #define STARTUP_SONG SONG(NO_SOUND) @@ -27,7 +25,7 @@ /* enable basic MIDI features: - MIDI notes can be sent when in Music mode is on */ - + #define MIDI_BASIC /* enable advanced MIDI features: diff --git a/keyboards/planck/keymaps/vifon/config.h b/keyboards/planck/keymaps/vifon/config.h index 4cb4a1235a5c..be395faad3eb 100644 --- a/keyboards/planck/keymaps/vifon/config.h +++ b/keyboards/planck/keymaps/vifon/config.h @@ -26,9 +26,6 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 2 -/* prevent the modifiers from being stuck, sacrificing some memory */ -#define PREVENT_STUCK_MODIFIERS - /* A larger buffer for the dynamic macros as this keymap is not taking * up that much memory. */ diff --git a/keyboards/planck/keymaps/yale/config.h b/keyboards/planck/keymaps/yale/config.h deleted file mode 100644 index 8a916bbd092e..000000000000 --- a/keyboards/planck/keymaps/yale/config.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define PREVENT_STUCK_MODIFIERS - -#endif - - - diff --git a/keyboards/planck/keymaps/zach/config.h b/keyboards/planck/keymaps/zach/config.h index 19a3856a39da..dc79bad064e4 100644 --- a/keyboards/planck/keymaps/zach/config.h +++ b/keyboards/planck/keymaps/zach/config.h @@ -55,7 +55,6 @@ //#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 diff --git a/keyboards/planck/rev6/config.h b/keyboards/planck/rev6/config.h index 0e462180bd49..afd69f7d847b 100644 --- a/keyboards/planck/rev6/config.h +++ b/keyboards/planck/rev6/config.h @@ -50,9 +50,6 @@ /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ #define DEBOUNCE 6 -/* Prevent modifiers from being stuck on after layer changes. */ -#define PREVENT_STUCK_MODIFIERS - /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ //#define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/playkbtw/ca66/config.h b/keyboards/playkbtw/ca66/config.h index c35718042aad..53bbe95e3a66 100644 --- a/keyboards/playkbtw/ca66/config.h +++ b/keyboards/playkbtw/ca66/config.h @@ -42,8 +42,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS #define RGB_DI_PIN B1 #ifdef RGB_DI_PIN diff --git a/keyboards/playkbtw/pk60/config.h b/keyboards/playkbtw/pk60/config.h index 06101349ccd1..601e3c8a5c67 100644 --- a/keyboards/playkbtw/pk60/config.h +++ b/keyboards/playkbtw/pk60/config.h @@ -43,9 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS @@ -55,4 +52,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/preonic/keymaps/bucktooth/config.h b/keyboards/preonic/keymaps/bucktooth/config.h index b988831207ba..23e9e0ed28f7 100644 --- a/keyboards/preonic/keymaps/bucktooth/config.h +++ b/keyboards/preonic/keymaps/bucktooth/config.h @@ -4,6 +4,5 @@ #include "../../config.h" #define FORCE_NKRO 1 -#define PREVENT_STUCK_MODIFIERS #endif diff --git a/keyboards/preonic/keymaps/jacwib/config.h b/keyboards/preonic/keymaps/jacwib/config.h index b988831207ba..23e9e0ed28f7 100644 --- a/keyboards/preonic/keymaps/jacwib/config.h +++ b/keyboards/preonic/keymaps/jacwib/config.h @@ -4,6 +4,5 @@ #include "../../config.h" #define FORCE_NKRO 1 -#define PREVENT_STUCK_MODIFIERS #endif diff --git a/keyboards/preonic/keymaps/kuatsure/rules.mk b/keyboards/preonic/keymaps/kuatsure/rules.mk index 76d73acef758..9369f99a9e9b 100644 --- a/keyboards/preonic/keymaps/kuatsure/rules.mk +++ b/keyboards/preonic/keymaps/kuatsure/rules.mk @@ -1 +1,2 @@ BACKLIGHT_ENABLE = no +LEADER_ENABLE = yes diff --git a/keyboards/preonic/keymaps/that_canadian/config.h b/keyboards/preonic/keymaps/that_canadian/config.h deleted file mode 100644 index 11cafbefcb0c..000000000000 --- a/keyboards/preonic/keymaps/that_canadian/config.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define PREVENT_STUCK_MODIFIERS - -#endif diff --git a/keyboards/preonic/keymaps/zach/config.h b/keyboards/preonic/keymaps/zach/config.h index bb8913c7afaa..40a083da37b8 100644 --- a/keyboards/preonic/keymaps/zach/config.h +++ b/keyboards/preonic/keymaps/zach/config.h @@ -87,7 +87,6 @@ along with this program. If not, see . //#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 diff --git a/keyboards/preonic/rev3/config.h b/keyboards/preonic/rev3/config.h index 3f57c591abd9..98899dc6ac77 100644 --- a/keyboards/preonic/rev3/config.h +++ b/keyboards/preonic/rev3/config.h @@ -50,9 +50,6 @@ /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ #define DEBOUNCE 6 -/* Prevent modifiers from being stuck on after layer changes. */ -#define PREVENT_STUCK_MODIFIERS - /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ //#define LOCKING_SUPPORT_ENABLE /* Locking resynchronize hack */ diff --git a/keyboards/prime_r/config.h b/keyboards/prime_r/config.h index b53f1490518d..ad92199a22a1 100644 --- a/keyboards/prime_r/config.h +++ b/keyboards/prime_r/config.h @@ -60,10 +60,6 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 diff --git a/keyboards/rorschach/keymaps/insertsnideremarks/config.h b/keyboards/rorschach/keymaps/insertsnideremarks/config.h index 90fb5120dfd9..2048232c9c3a 100644 --- a/keyboards/rorschach/keymaps/insertsnideremarks/config.h +++ b/keyboards/rorschach/keymaps/insertsnideremarks/config.h @@ -11,7 +11,6 @@ // #define MASTER_RIGHT #define EE_HANDS -#define PREVENT_STUCK_MODIFIERS #define IGNORE_MOD_TAP_INTERRUPT #define TAPPING_TERM 175 #define TAPPING_TOGGLE 2 diff --git a/keyboards/s60_x/keymaps/bluebear/config.h b/keyboards/s60_x/keymaps/bluebear/config.h index 35754b523393..10bddf0d3713 100644 --- a/keyboards/s60_x/keymaps/bluebear/config.h +++ b/keyboards/s60_x/keymaps/bluebear/config.h @@ -105,7 +105,4 @@ along with this program. If not, see . // Space Cadet Rollover - if set, allows to tap opposite shift key to cancel erroneous press #define DISABLE_SPACE_CADET_ROLLOVER -// Prevent stuck modifiers -#define PREVENT_STUCK_MODIFIERS - #endif diff --git a/keyboards/s60_x/rgb/config.h b/keyboards/s60_x/rgb/config.h index ec8b0f49e1df..d9c26658dfd9 100644 --- a/keyboards/s60_x/rgb/config.h +++ b/keyboards/s60_x/rgb/config.h @@ -17,9 +17,6 @@ /* Locking resynchronize hack */ #define LOCKING_RESYNC_ENABLE -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN F6 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS @@ -29,4 +26,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/s65_plus/config.h b/keyboards/s65_plus/config.h index df60e60a8d4d..60512db46252 100644 --- a/keyboards/s65_plus/config.h +++ b/keyboards/s65_plus/config.h @@ -49,7 +49,4 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #endif diff --git a/keyboards/s65_x/config.h b/keyboards/s65_x/config.h index 8288ef783468..367efc526c68 100644 --- a/keyboards/s65_x/config.h +++ b/keyboards/s65_x/config.h @@ -49,8 +49,4 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) - -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #endif diff --git a/keyboards/sx60/config.h b/keyboards/sx60/config.h index f22fbe8be4bb..52a1cc7a18ec 100755 --- a/keyboards/sx60/config.h +++ b/keyboards/sx60/config.h @@ -46,10 +46,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 diff --git a/keyboards/telophase/config.h b/keyboards/telophase/config.h index 09655c0258e5..be0a36977371 100644 --- a/keyboards/telophase/config.h +++ b/keyboards/telophase/config.h @@ -52,8 +52,6 @@ along with this program. If not, see . * These options are also useful to firmware size reduction. */ -#define PREVENT_STUCK_MODIFIERS - /* disable debug print */ //#define NO_DEBUG diff --git a/keyboards/tetris/config.h b/keyboards/tetris/config.h index 9c7f525a715f..7e7dac7cf63e 100644 --- a/keyboards/tetris/config.h +++ b/keyboards/tetris/config.h @@ -41,9 +41,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define TAPPING_TERM 200 #define PERMISSIVE_HOLD @@ -62,4 +59,4 @@ //#define RGBLIGHT_LIMIT_VAL 128 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/thevankeyboards/bananasplit/keymaps/talljoe/config.h b/keyboards/thevankeyboards/bananasplit/keymaps/talljoe/config.h index bb2aadfa6999..fc9bd3d61652 100644 --- a/keyboards/thevankeyboards/bananasplit/keymaps/talljoe/config.h +++ b/keyboards/thevankeyboards/bananasplit/keymaps/talljoe/config.h @@ -3,7 +3,6 @@ #include QMK_KEYBOARD_CONFIG_H -#define PREVENT_STUCK_MODIFIERS #define SPACE_COUNT 3 #define TEMPLATE( \ diff --git a/keyboards/tokyo60/config.h b/keyboards/tokyo60/config.h index 6e6ab2215d6c..16927be17e07 100644 --- a/keyboards/tokyo60/config.h +++ b/keyboards/tokyo60/config.h @@ -47,9 +47,6 @@ /* Locking resynchronize hack */ #define LOCKING_RESYNC_ENABLE -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN F7 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS diff --git a/keyboards/tomato/config.h b/keyboards/tomato/config.h index f33c13108720..185cb326cce0 100644 --- a/keyboards/tomato/config.h +++ b/keyboards/tomato/config.h @@ -34,9 +34,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - /* eliminate lag on space cadet mods */ #define PERMISSIVE_HOLD diff --git a/keyboards/uk78/config.h b/keyboards/uk78/config.h index 35f5bf70b323..34d67207929a 100644 --- a/keyboards/uk78/config.h +++ b/keyboards/uk78/config.h @@ -60,9 +60,6 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - /* ws2812b options */ #define RGB_DI_PIN F6 #ifdef RGB_DI_PIN diff --git a/keyboards/viterbi/keymaps/drashna/config.h b/keyboards/viterbi/keymaps/drashna/config.h index 687f80441a17..a1e361e346de 100644 --- a/keyboards/viterbi/keymaps/drashna/config.h +++ b/keyboards/viterbi/keymaps/drashna/config.h @@ -53,7 +53,7 @@ along with this program. If not, see . #define NO_MUSIC_MODE #endif -#undef PREVENT_STUCK_MODIFIERS +#define STRICT_LAYER_RELEASE #define LAYOUT_ortho_5x7( \ L00, L01, L02, L03, L04, L05, L06, \ diff --git a/keyboards/whitefox/config.h b/keyboards/whitefox/config.h index 9f021fb516ec..a8047cf54f42 100644 --- a/keyboards/whitefox/config.h +++ b/keyboards/whitefox/config.h @@ -18,8 +18,6 @@ along with this program. If not, see . #ifndef CONFIG_H #define CONFIG_H -#define PREVENT_STUCK_MODIFIERS - /* USB Device descriptor parameter */ #define VENDOR_ID 0x1c11 #define PRODUCT_ID 0xb04d diff --git a/keyboards/xd60/keymaps/kmontag42/rules.mk b/keyboards/xd60/keymaps/kmontag42/rules.mk new file mode 100644 index 000000000000..d0d2ef6d532d --- /dev/null +++ b/keyboards/xd60/keymaps/kmontag42/rules.mk @@ -0,0 +1 @@ +LEADER_ENABLE = yes diff --git a/keyboards/xd75/keymaps/davidrambo/config.h b/keyboards/xd75/keymaps/davidrambo/config.h index e87ccde7979a..f219147034d4 100644 --- a/keyboards/xd75/keymaps/davidrambo/config.h +++ b/keyboards/xd75/keymaps/davidrambo/config.h @@ -20,7 +20,6 @@ #include "../../config.h" #define TAPPING_TERM 200 -#define PERMISSIVE_HOLD -#define PREVENT_STUCK_MODIFIERS +#define PERMISSIVE_HOLD #endif diff --git a/keyboards/xd75/keymaps/tdl-jturner/config.h b/keyboards/xd75/keymaps/tdl-jturner/config.h index 561a48d7eb88..985247bb2e3f 100644 --- a/keyboards/xd75/keymaps/tdl-jturner/config.h +++ b/keyboards/xd75/keymaps/tdl-jturner/config.h @@ -26,7 +26,6 @@ #define TAPPING_TOGGLE 2 //#define PERMISSIVE_HOLD //#define QMK_KEYS_PER_SCAN 4 -#define PREVENT_STUCK_MODIFIERS #define FORCE_NKRO #define MOUSEKEY_INTERVAL 16 diff --git a/keyboards/xmmx/config.h b/keyboards/xmmx/config.h index f3f893e28347..8cb2cf82df92 100644 --- a/keyboards/xmmx/config.h +++ b/keyboards/xmmx/config.h @@ -43,10 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 @@ -55,4 +51,4 @@ #define RGBLIGHT_VAL_STEP 8 #endif -#endif \ No newline at end of file +#endif diff --git a/keyboards/ymd96/keymaps/hgoel89/config.h b/keyboards/ymd96/keymaps/hgoel89/config.h index 52aaa8f24dce..b1d74e1e6931 100644 --- a/keyboards/ymd96/keymaps/hgoel89/config.h +++ b/keyboards/ymd96/keymaps/hgoel89/config.h @@ -3,7 +3,6 @@ #include "../../config.h" -#define PREVENT_STUCK_MODIFIERS #define TAPPING_TERM 300 #endif diff --git a/keyboards/z150_blackheart/config.h b/keyboards/z150_blackheart/config.h index d2fce9aeef55..362153652263 100644 --- a/keyboards/z150_blackheart/config.h +++ b/keyboards/z150_blackheart/config.h @@ -39,14 +39,10 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - - #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 0 #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 -#endif \ No newline at end of file +#endif diff --git a/keyboards/zeal60/keymaps/tusing/config.h b/keyboards/zeal60/keymaps/tusing/config.h index 93f260946cfb..64aaece501ef 100644 --- a/keyboards/zeal60/keymaps/tusing/config.h +++ b/keyboards/zeal60/keymaps/tusing/config.h @@ -34,7 +34,3 @@ // Scale brightnes according to BRIGHTNESS_CORRECTION_TABLE in quantum/rgblight.c. // This allows to mitigate uneven brightness from LED underglow strips. // #define LED_BRIGHTNESS_CORRECTION - -// Prevent modifiers on layer 1 from persisting after we let go -#define PREVENT_STUCK_MODIFIERS - diff --git a/keyboards/zlant/config.h b/keyboards/zlant/config.h index 456d225aa2dd..ae9dcfef67ec 100755 --- a/keyboards/zlant/config.h +++ b/keyboards/zlant/config.h @@ -43,9 +43,6 @@ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -/* prevent stuck modifiers */ -#define PREVENT_STUCK_MODIFIERS - #define RGB_DI_PIN D6 #ifdef RGB_DI_PIN #define RGBLIGHT_ANIMATIONS diff --git a/layouts/community/60_ansi/talljoe-ansi/config.h b/layouts/community/60_ansi/talljoe-ansi/config.h index 1990b0ee3b0f..4326a2fd1039 100644 --- a/layouts/community/60_ansi/talljoe-ansi/config.h +++ b/layouts/community/60_ansi/talljoe-ansi/config.h @@ -3,7 +3,6 @@ #include QMK_KEYBOARD_CONFIG_H -#define PREVENT_STUCK_MODIFIERS #define ENABLE_GAME_LAYER #define TEMPLATE( \ diff --git a/layouts/community/60_ansi_split_bs_rshift/talljoe/config.h b/layouts/community/60_ansi_split_bs_rshift/talljoe/config.h index 81ab5cf89e44..bf18fd9f7d00 100644 --- a/layouts/community/60_ansi_split_bs_rshift/talljoe/config.h +++ b/layouts/community/60_ansi_split_bs_rshift/talljoe/config.h @@ -3,7 +3,6 @@ #include QMK_KEYBOARD_CONFIG_H -#define PREVENT_STUCK_MODIFIERS #define ENABLE_GAME_LAYER #define TEMPLATE( \ diff --git a/layouts/community/60_hhkb/talljoe-hhkb/config.h b/layouts/community/60_hhkb/talljoe-hhkb/config.h index 938ea6cd631e..9e907feeb53a 100644 --- a/layouts/community/60_hhkb/talljoe-hhkb/config.h +++ b/layouts/community/60_hhkb/talljoe-hhkb/config.h @@ -3,7 +3,6 @@ #include QMK_KEYBOARD_CONFIG_H -#define PREVENT_STUCK_MODIFIERS #define ENABLE_GAME_LAYER #define TEMPLATE( \ diff --git a/layouts/community/ergodox/adam/config.h b/layouts/community/ergodox/adam/config.h index 21af8c6b8dcc..1a8fddb50685 100644 --- a/layouts/community/ergodox/adam/config.h +++ b/layouts/community/ergodox/adam/config.h @@ -2,5 +2,4 @@ #undef TAPPING_TERM #define TAPPING_TERM 300 //At 500 some bad logic takes hold -#define PREVENT_STUCK_MODIFIERS #define IGNORE_MOD_TAP_INTERRUPT diff --git a/layouts/community/ergodox/albert/rules.mk b/layouts/community/ergodox/albert/rules.mk index fcd019e838b0..47549b50f644 100644 --- a/layouts/community/ergodox/albert/rules.mk +++ b/layouts/community/ergodox/albert/rules.mk @@ -1,3 +1,2 @@ COMMAND_ENABLE = no # Commands for debug and configuration - - +LEADER_ENABLE = yes diff --git a/layouts/community/ergodox/algernon/rules.mk b/layouts/community/ergodox/algernon/rules.mk index f795a8676e28..53dec5153afe 100644 --- a/layouts/community/ergodox/algernon/rules.mk +++ b/layouts/community/ergodox/algernon/rules.mk @@ -8,6 +8,7 @@ TAP_DANCE_ENABLE = yes KEYLOGGER_ENABLE ?= yes UCIS_ENABLE = yes MOUSEKEY_ENABLE = no +LEADER_ENABLE = yes AUTOLOG_ENABLE ?= no diff --git a/layouts/community/ergodox/alphadox/config.h b/layouts/community/ergodox/alphadox/config.h index 6fc64f508230..9e076dead12a 100644 --- a/layouts/community/ergodox/alphadox/config.h +++ b/layouts/community/ergodox/alphadox/config.h @@ -4,7 +4,6 @@ #include QMK_KEYBOARD_CONFIG_H #define FORCE_NKRO -#define PREVENT_STUCK_MODIFIERS #undef TAPPING_TERM #undef IGNORE_MOD_TAP_INTERRUPT diff --git a/layouts/community/ergodox/deadcyclo/rules.mk b/layouts/community/ergodox/deadcyclo/rules.mk index 039f07c8e35a..f5093529bfbc 100644 --- a/layouts/community/ergodox/deadcyclo/rules.mk +++ b/layouts/community/ergodox/deadcyclo/rules.mk @@ -1 +1,2 @@ UNICODE_ENABLE = yes +LEADER_ENABLE = yes diff --git a/layouts/community/ergodox/erez_experimental/rules.mk b/layouts/community/ergodox/erez_experimental/rules.mk index 839dd82e1e35..f68b56f872d0 100644 --- a/layouts/community/ergodox/erez_experimental/rules.mk +++ b/layouts/community/ergodox/erez_experimental/rules.mk @@ -3,5 +3,4 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend COMMAND_ENABLE = no # Commands for debug and configuration - - +LEADER_ENABLE = yes diff --git a/layouts/community/ergodox/familiar/rules.mk b/layouts/community/ergodox/familiar/rules.mk index 31e0fcf29339..4a3c58621c72 100644 --- a/layouts/community/ergodox/familiar/rules.mk +++ b/layouts/community/ergodox/familiar/rules.mk @@ -1 +1,2 @@ TAP_DANCE_ENABLE=yes +LEADER_ENABLE = yes diff --git a/layouts/community/ergodox/mclennon_osx/README.md b/layouts/community/ergodox/mclennon_osx/README.md index 28cdb7c10892..53b3d4841440 100644 --- a/layouts/community/ergodox/mclennon_osx/README.md +++ b/layouts/community/ergodox/mclennon_osx/README.md @@ -1,5 +1,5 @@ # Ergodox EZ for OS X -This keymapping is designed to be reasonably familiar to an ordinary Mac keyboard while taking advantage of the Ergodox EZ's features. Caps lock instead enables a layer which allows a user to use HJKL as arrow keys and to control media. Shift and control have additional mappings on S and D to provide easier access while holding down caps lock. +This keymapping is designed to be reasonably familiar to an ordinary Mac keyboard while taking advantage of the Ergodox EZ's features. Caps lock instead enables a layer which allows a user to use HJKL as arrow keys and to control media. Shift and control have additional mappings on S and D to provide easier access while holding down caps lock. -If you choose to compile this yourself, be sure to compile with `#define PREVENT_STUCK_MODIFIERS` in your `config.h`. Firmware built using [qmk_firmware](https://github.com/qmk/qmk_firmware/). +Firmware built using [qmk_firmware](https://github.com/qmk/qmk_firmware/). diff --git a/layouts/community/ergodox/techtomas/readme.md b/layouts/community/ergodox/techtomas/readme.md index 36e0591a8e6b..3d1bcb9e11fc 100644 --- a/layouts/community/ergodox/techtomas/readme.md +++ b/layouts/community/ergodox/techtomas/readme.md @@ -39,7 +39,7 @@ The right arrow key and End key toggle the control layer on the left board. Ther On the left board you have mouse control with left & right click in the location of the G and B keys. On the right board you have vim-style arrow keys using hjkl -The left thumb cluster moves shift and alt within easy reach while holding the toggle (end). So far I've found this convient to navigate and skip around text when using the hjkl arrow keys. I found that it was easy to get the alt key stuck on depending on what key you released first so I added the PREVENT_STUCK_MODIFIERS to the config.h to help with that. +The left thumb cluster moves shift and alt within easy reach while holding the toggle (end). So far I've found this convient to navigate and skip around text when using the hjkl arrow keys. ## Changelog diff --git a/layouts/community/ortho_4x12/symbolic/config.h b/layouts/community/ortho_4x12/symbolic/config.h index 702c9226c621..c29b0770622a 100644 --- a/layouts/community/ortho_4x12/symbolic/config.h +++ b/layouts/community/ortho_4x12/symbolic/config.h @@ -20,10 +20,6 @@ along with this program. If not, see . #pragma once -// prevent stuck modifiers -#define PREVENT_STUCK_MODIFIERS - - // hold & tapping delay setting #define TAPPING_TERM 100 diff --git a/layouts/community/tkl_ansi/talljoe-tkl/config.h b/layouts/community/tkl_ansi/talljoe-tkl/config.h index 8b27d41365ef..02f8a94e3997 100644 --- a/layouts/community/tkl_ansi/talljoe-tkl/config.h +++ b/layouts/community/tkl_ansi/talljoe-tkl/config.h @@ -3,7 +3,6 @@ #include QMK_KEYBOARD_CONFIG_H -#define PREVENT_STUCK_MODIFIERS #define ENABLE_GAME_LAYER #define TEMPLATE_TKL(\ diff --git a/quantum/process_keycode/process_chording.c b/quantum/process_keycode/process_chording.c deleted file mode 100644 index 6c6ebe300a70..000000000000 --- a/quantum/process_keycode/process_chording.c +++ /dev/null @@ -1,76 +0,0 @@ -/* 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[]) { - uint8_t keys_size = sizeof(keys)/sizeof(keys[0]); - bool pass = true; - uint8_t in = 0; - for (uint8_t i = 0; i < chord_key_count; i++) { - bool found = false; - for (uint8_t j = 0; j < keys_size; j++) { - if (chord_keys[i] == (keys[j] & 0xFF)) { - in++; // detects key in chord - found = true; - break; - } - } - if (found) - continue; - if (chord_keys[i] != 0) { - pass = false; // makes sure rest are blank - } - } - return (pass && (in == keys_size)); -} - -bool process_chording(uint16_t keycode, keyrecord_t *record) { - if (keycode >= QK_CHORDING && keycode <= QK_CHORDING_MAX) { - if (record->event.pressed) { - if (!chording) { - chording = true; - for (uint8_t i = 0; i < CHORDING_MAX; i++) - chord_keys[i] = 0; - chord_key_count = 0; - chord_key_down = 0; - } - chord_keys[chord_key_count] = (keycode & 0xFF); - chord_key_count++; - chord_key_down++; - return false; - } else { - if (chording) { - chord_key_down--; - if (chord_key_down == 0) { - chording = false; - // Chord Dictionary - if (keys_chord((uint8_t[]){KC_ENTER, KC_SPACE})) { - register_code(KC_A); - unregister_code(KC_A); - return false; - } - for (uint8_t i = 0; i < chord_key_count; i++) { - register_code(chord_keys[i]); - unregister_code(chord_keys[i]); - return false; - } - } - } - } - } - return true; -} diff --git a/quantum/process_keycode/process_chording.h b/quantum/process_keycode/process_chording.h deleted file mode 100644 index 8c0f4862a817..000000000000 --- a/quantum/process_keycode/process_chording.h +++ /dev/null @@ -1,32 +0,0 @@ -/* 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 - -#include "quantum.h" - -// Chording stuff -#define CHORDING_MAX 4 -bool chording = false; - -uint8_t chord_keys[CHORDING_MAX] = {0}; -uint8_t chord_key_count = 0; -uint8_t chord_key_down = 0; - -bool process_chording(uint16_t keycode, keyrecord_t *record); - -#endif diff --git a/quantum/process_keycode/process_leader.c b/quantum/process_keycode/process_leader.c index c87ef115af3f..eddbf71f7001 100644 --- a/quantum/process_keycode/process_leader.c +++ b/quantum/process_keycode/process_leader.c @@ -14,7 +14,7 @@ * along with this program. If not, see . */ -#ifndef DISABLE_LEADER +#ifdef LEADER_ENABLE #include "process_leader.h" diff --git a/quantum/quantum.c b/quantum/quantum.c index 9d352a94cf25..9bf91eb86538 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -196,7 +196,7 @@ bool process_record_quantum(keyrecord_t *record) { keypos_t key = record->event.key; uint16_t keycode; - #if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) + #if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) /* TODO: Use store_or_get_action() or a similar function. */ if (!disable_action_cache) { uint8_t layer; @@ -251,12 +251,9 @@ bool process_record_quantum(keyrecord_t *record) { #ifdef TAP_DANCE_ENABLE process_tap_dance(keycode, record) && #endif - #ifndef DISABLE_LEADER + #ifdef LEADER_ENABLE process_leader(keycode, record) && #endif - #ifndef DISABLE_CHORDING - process_chording(keycode, record) && - #endif #ifdef COMBO_ENABLE process_combo(keycode, record) && #endif diff --git a/quantum/quantum.h b/quantum/quantum.h index d1f761f17afb..7cf16d81e68b 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -89,15 +89,10 @@ extern uint32_t default_layer_state; #include "process_music.h" #endif -#ifndef DISABLE_LEADER +#ifdef LEADER_ENABLE #include "process_leader.h" #endif -#define DISABLE_CHORDING -#ifndef DISABLE_CHORDING - #include "process_chording.h" -#endif - #ifdef UNICODE_ENABLE #include "process_unicode.h" #endif diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 0ecc293a8260..3b87954960e4 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -63,10 +63,6 @@ enum quantum_keycodes { QK_ONE_SHOT_LAYER_MAX = 0x54FF, QK_ONE_SHOT_MOD = 0x5500, QK_ONE_SHOT_MOD_MAX = 0x55FF, -#ifndef DISABLE_CHORDING - QK_CHORDING = 0x5600, - QK_CHORDING_MAX = 0x56FF, -#endif QK_TAP_DANCE = 0x5700, QK_TAP_DANCE_MAX = 0x57FF, QK_LAYER_TAP_TOGGLE = 0x5800, @@ -123,7 +119,7 @@ enum quantum_keycodes { GRAVE_ESC, // Leader key -#ifndef DISABLE_LEADER +#ifdef LEADER_ENABLE KC_LEAD, #endif diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index ae0864749636..76d02bc9dff8 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -120,7 +120,7 @@ void process_hand_swap(keyevent_t *event) { } #endif -#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) +#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) bool disable_action_cache = false; void process_record_nocache(keyrecord_t *record) diff --git a/tmk_core/common/action.h b/tmk_core/common/action.h index acc55c7d3881..0322c73ed1e3 100644 --- a/tmk_core/common/action.h +++ b/tmk_core/common/action.h @@ -62,7 +62,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt); bool process_record_quantum(keyrecord_t *record); /* Utilities for actions. */ -#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) +#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) extern bool disable_action_cache; #endif diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c index f3cd381ab0b3..62375dfbfebe 100644 --- a/tmk_core/common/action_layer.c +++ b/tmk_core/common/action_layer.c @@ -219,7 +219,7 @@ void layer_debug(void) } #endif -#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) +#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) uint8_t source_layers_cache[(MATRIX_ROWS * MATRIX_COLS + 7) / 8][MAX_LAYER_BITS] = {{0}}; void update_source_layers_cache(keypos_t key, uint8_t layer) @@ -263,7 +263,7 @@ uint8_t read_source_layers_cache(keypos_t key) */ action_t store_or_get_action(bool pressed, keypos_t key) { -#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) +#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) if (disable_action_cache) { return layer_switch_get_action(key); } diff --git a/tmk_core/common/action_layer.h b/tmk_core/common/action_layer.h index 72a6bd8f684c..7bf116be2d4b 100644 --- a/tmk_core/common/action_layer.h +++ b/tmk_core/common/action_layer.h @@ -88,7 +88,7 @@ uint32_t layer_state_set_kb(uint32_t state); #endif /* pressed actions cache */ -#if !defined(NO_ACTION_LAYER) && defined(PREVENT_STUCK_MODIFIERS) +#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE) /* The number of bits needed to represent the layer number: log2(32). */ #define MAX_LAYER_BITS 5 void update_source_layers_cache(keypos_t key, uint8_t layer); diff --git a/users/333fred/333fred_config.h b/users/333fred/333fred_config.h index 7c637d8d3650..b158e2d5a26a 100644 --- a/users/333fred/333fred_config.h +++ b/users/333fred/333fred_config.h @@ -1,4 +1,3 @@ #pragma once -#define PREVENT_STUCK_MODIFIERS #define PERMISSIVE_HOLD diff --git a/users/bocaj/config.h b/users/bocaj/config.h index ce5ec65d62ab..0e726598cdfe 100644 --- a/users/bocaj/config.h +++ b/users/bocaj/config.h @@ -10,7 +10,6 @@ // actually sends Ctrl-x. That's bad.) #define IGNORE_MOD_TAP_INTERRUPT #undef PERMISSIVE_HOLD -#define PREVENT_STUCK_MODIFIERS #ifdef TAPPING_TERM #undef TAPPING_TERM diff --git a/users/drashna/config.h b/users/drashna/config.h index dd6875ceb1d0..92efcc5c741f 100644 --- a/users/drashna/config.h +++ b/users/drashna/config.h @@ -43,7 +43,6 @@ // actually sends Ctrl-x. That's bad.) #define IGNORE_MOD_TAP_INTERRUPT #undef PERMISSIVE_HOLD -#define PREVENT_STUCK_MODIFIERS // #define TAPPING_FORCE_HOLD //#define RETRO_TAPPING @@ -64,8 +63,4 @@ #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION -#define DISABLE_LEADER - #define MACRO_TIMER 5 - - diff --git a/users/ishtob/config.h b/users/ishtob/config.h index 9c4a7ed8dda8..1f567f4a5b8a 100755 --- a/users/ishtob/config.h +++ b/users/ishtob/config.h @@ -15,7 +15,6 @@ //#define LEADER_TIMEOUT 300 //#define BACKLIGHT_BREATHING -#define PREVENT_STUCK_MODIFIERS //#define PERMISSIVE_HOLD // #define QMK_KEYS_PER_SCAN 4 @@ -72,5 +71,5 @@ // Most tactile encoders have detents every 4 stages #define ENCODER_RESOLUTION 4 - + #endif diff --git a/users/replicaJunction/config.h b/users/replicaJunction/config.h index f3556c87ed04..4b58b579f89b 100644 --- a/users/replicaJunction/config.h +++ b/users/replicaJunction/config.h @@ -6,12 +6,6 @@ // https://docs.qmk.fm/reference/config-options#features-that-can-be-enabled //////////////////////////////////////////////////////////////////////////////// -// Prevent modifiers from sticking when switching layers -// Uses 5 bytes of memory per 8 keys, but makes sure modifiers don't get "stuck" switching layers -#define PREVENT_STUCK_MODIFIERS - - - //////////////////////////////////////////////////////////////////////////////// // Behaviors That Can Be Configured // https://docs.qmk.fm/reference/config-options#behaviors-that-can-be-configured diff --git a/users/talljoe/config.h b/users/talljoe/config.h index 15bbde6bcd19..1cdbb5a412fe 100644 --- a/users/talljoe/config.h +++ b/users/talljoe/config.h @@ -1,7 +1,6 @@ #ifndef USERSPACE_CONFIG_H #define USERSPACE_CONFIG_H -#define PREVENT_STUCK_MODIFIERS #define IGNORE_MOD_TAP_INTERRUPT #define RESET_LAYER 15 diff --git a/users/wanleg/config.h b/users/wanleg/config.h index 22073449b243..28e7690e653f 100644 --- a/users/wanleg/config.h +++ b/users/wanleg/config.h @@ -1,8 +1,6 @@ #ifndef USERSPACE_CONFIG_H #define USERSPACE_CONFIG_H -#define PREVENT_STUCK_MODIFIERS - //TAPPING_TERM #ifdef TAP_DANCE_ENABLE #define TAPPING_TERM 200 diff --git a/users/zer09/config.h b/users/zer09/config.h index 766806462253..4cb65c258f9a 100644 --- a/users/zer09/config.h +++ b/users/zer09/config.h @@ -11,7 +11,7 @@ // actually sends Ctrl-x. That's bad.) #define IGNORE_MOD_TAP_INTERRUPT #undef PERMISSIVE_HOLD -#undef PREVENT_STUCK_MODIFIERS +#define STRICT_LAYER_RELEASE #define FORCE_NKRO From fe3bfd91c1a085716baa2b4396709ad5d77c7c75 Mon Sep 17 00:00:00 2001 From: wanleg <32079073+wanleg@users.noreply.github.com> Date: Mon, 17 Sep 2018 13:41:59 -0700 Subject: [PATCH 002/505] Keymap: Big switch config (#3904) * bigswitch keymap * bigswitch keymap * bigswitch keymap * bigswitch keymap * recommended edits made * forgot to revert this change with the others --- keyboards/bigswitch/bigswitch.c | 2 + keyboards/bigswitch/keymaps/wanleg/config.h | 45 ++++++++++++++++ keyboards/bigswitch/keymaps/wanleg/keymap.c | 27 ++++++++++ keyboards/bigswitch/keymaps/wanleg/rules.mk | 7 +++ users/wanleg/tapdances.c | 59 +++++++++++++++++++++ users/wanleg/wanleg.h | 1 + 6 files changed, 141 insertions(+) create mode 100644 keyboards/bigswitch/keymaps/wanleg/config.h create mode 100644 keyboards/bigswitch/keymaps/wanleg/keymap.c create mode 100644 keyboards/bigswitch/keymaps/wanleg/rules.mk diff --git a/keyboards/bigswitch/bigswitch.c b/keyboards/bigswitch/bigswitch.c index dfd9710e2713..b924c7017cc2 100644 --- a/keyboards/bigswitch/bigswitch.c +++ b/keyboards/bigswitch/bigswitch.c @@ -19,10 +19,12 @@ along with this program. If not, see . volatile uint8_t runonce = true; static uint16_t my_timer; +__attribute__ ((weak)) void matrix_init_user(void) { my_timer = timer_read(); } +__attribute__ ((weak)) void matrix_scan_user(void) { if (runonce && timer_elapsed(my_timer) > 1000) { runonce = false; diff --git a/keyboards/bigswitch/keymaps/wanleg/config.h b/keyboards/bigswitch/keymaps/wanleg/config.h new file mode 100644 index 000000000000..f1e169345714 --- /dev/null +++ b/keyboards/bigswitch/keymaps/wanleg/config.h @@ -0,0 +1,45 @@ +/* Copyright 2018 wanleg + * + * 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 + +// place overrides here +#undef MATRIX_ROW_PINS +#define MATRIX_ROW_PINS { B4 } +#undef MATRIX_COL_PINS +#define MATRIX_COL_PINS { B6 } +//#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#undef DIODE_DIRECTION +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B5 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 +#define BREATHING_PERIOD 5 + +/* for Tap Dance */ +#undef TAPPING_TERM +#define TAPPING_TERM 700 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +//#define DEBOUNCING_DELAY 5 +#undef DEBOUNCING_DELAY +#define DEBOUNCING_DELAY 2 + +// set flashing LED with QMK DFU +#define QMK_LED B0 diff --git a/keyboards/bigswitch/keymaps/wanleg/keymap.c b/keyboards/bigswitch/keymaps/wanleg/keymap.c new file mode 100644 index 000000000000..7f4150e58164 --- /dev/null +++ b/keyboards/bigswitch/keymaps/wanleg/keymap.c @@ -0,0 +1,27 @@ +/* Copyright 2018 wanleg + * + * 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 QMK_KEYBOARD_H +#include "wanleg.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT( /* Base */ +TD(CAD_TD) \ +), +}; + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/bigswitch/keymaps/wanleg/rules.mk b/keyboards/bigswitch/keymaps/wanleg/rules.mk new file mode 100644 index 000000000000..bc4a1873f845 --- /dev/null +++ b/keyboards/bigswitch/keymaps/wanleg/rules.mk @@ -0,0 +1,7 @@ +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default + +#If using a ProMicro and it has the QMK DFU bootloader instead of Caterina, +#run "make : dfu=qmk" when compiling to ensure it is flagged properly after being flashed +ifeq ($(strip $(dfu)), qmk) + BOOTLOADER = qmk-dfu +endif \ No newline at end of file diff --git a/users/wanleg/tapdances.c b/users/wanleg/tapdances.c index 318810b1b25b..6a98b896a5cb 100644 --- a/users/wanleg/tapdances.c +++ b/users/wanleg/tapdances.c @@ -94,6 +94,64 @@ void DEL_reset (qk_tap_dance_state_t *state, void *user_data) { } DELtap_state.state = 0; } + +//instantialize an instance of 'tap' for the 'CAD' tap dance. +static tap CADtap_state = { + .is_press_action = true, + .state = 0 +}; + +void CAD_finished (qk_tap_dance_state_t *state, void *user_data) { + CADtap_state.state = cur_dance(state); + switch (CADtap_state.state) { + case SINGLE_TAP: + //register_code(KC_SPC); + SEND_STRING(SS_LGUI("l")); + backlight_set(3); + break; + case SINGLE_HOLD: + //register_code(KC_NO); + //take a screenshot of a single window, open Paint and paste + SEND_STRING(SS_LALT(SS_TAP(X_PSCREEN)) SS_LGUI("r")); + _delay_ms(500); + SEND_STRING("mspaint" SS_TAP(X_ENTER)); + _delay_ms(700); + SEND_STRING(SS_LCTRL("v")); + break; //register this keycode when button is held + case DOUBLE_TAP: + //register_code(KC_ENT); + SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_DELETE)))); + backlight_set(0); + break; + //case DOUBLE_HOLD: register_code(KC_NO); break; //register this keycode when button is tapped and then held + case DOUBLE_HOLD: + reset_keyboard(); + break; //register this keycode when button is tapped and then held + case DOUBLE_SINGLE_TAP: register_code(KC_NO); unregister_code(KC_NO); register_code(KC_NO); + } +} + +void CAD_reset (qk_tap_dance_state_t *state, void *user_data) { + switch (CADtap_state.state) { + case SINGLE_TAP: + //unregister_code(KC_SPC); + SEND_STRING(SS_LGUI("l")); + backlight_set(3); + break; + case SINGLE_HOLD: + register_code(KC_NO); //(un)register this keycode when button is held and then released + //SEND_STRING(SS_LCTRL("v")); + break; + case DOUBLE_TAP: + //register_code(KC_ENT); + SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_DELETE)))); + backlight_set(0); + break; + case DOUBLE_HOLD: register_code(KC_NO); //(un)register this keycode when button is tapped and then held, and then released + case DOUBLE_SINGLE_TAP: unregister_code(KC_NO); + } + CADtap_state.state = 0; +} ///// QUAD FUNCTION TAP DANCE PERSONALIZATION SECTION END ///// //Tap Dance Definitions @@ -104,6 +162,7 @@ qk_tap_dance_action_t tap_dance_actions[] = { ,[TD_Q_ESC] = ACTION_TAP_DANCE_DOUBLE(KC_Q, KC_ESC) ,[ENT_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ENT_finished, ENT_reset) ,[DEL_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, DEL_finished, DEL_reset) + ,[CAD_TD] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, CAD_finished, CAD_reset) }; //In Layer declaration, add tap dance item in place of a key code diff --git a/users/wanleg/wanleg.h b/users/wanleg/wanleg.h index 5cec82e6055a..8b98ec7ddfb6 100644 --- a/users/wanleg/wanleg.h +++ b/users/wanleg/wanleg.h @@ -106,6 +106,7 @@ enum { ,TD_Q_ESC ,ENT_TAP_DANCE ,DEL_TAP_DANCE + ,CAD_TD }; #endif From ed2dd3b59c5fc7856a1b01a97ba5b22ed4f69317 Mon Sep 17 00:00:00 2001 From: Anthony Wharton Date: Mon, 17 Sep 2018 21:55:49 +0100 Subject: [PATCH 003/505] Keyboard: Add YMD96 instructions for Linux + Backlight Fixes (#3908) * Add flashing instructions for Linux * Make device/manufacturer name consistent for ymd96 * Disable command mode by default for YMD96 * Add function call to fix backlight for YMD96 * Add personal YMD96 config * Replace include with QMK macro * Move KEYMAP macro to keymap-level folder * Move custom KEYMAP macro to global LAYOUT_iso macro * Change transparent keymappings to global definition * Remove unecessary import and change to pragma once - (instead of repeated ifdef) * Remove global keymap/layout definition --- keyboards/ymd96/README.md | 14 +++-- keyboards/ymd96/config.h | 1 - .../ymd96/keymaps/AnthonyWharton/README.md | 16 +++++ .../ymd96/keymaps/AnthonyWharton/config.h | 63 +++++++++++++++++++ .../ymd96/keymaps/AnthonyWharton/keymap.c | 47 ++++++++++++++ keyboards/ymd96/matrix.c | 12 ---- keyboards/ymd96/rules.mk | 2 +- keyboards/ymd96/usbconfig.h | 8 +-- keyboards/ymd96/ymd96.h | 17 +++++ 9 files changed, 158 insertions(+), 22 deletions(-) create mode 100644 keyboards/ymd96/keymaps/AnthonyWharton/README.md create mode 100644 keyboards/ymd96/keymaps/AnthonyWharton/config.h create mode 100644 keyboards/ymd96/keymaps/AnthonyWharton/keymap.c diff --git a/keyboards/ymd96/README.md b/keyboards/ymd96/README.md index 7a950223b673..9cb37605822d 100644 --- a/keyboards/ymd96/README.md +++ b/keyboards/ymd96/README.md @@ -31,17 +31,23 @@ This firmware was modified from [ps2avrGB](https://github.com/qmk/qmk_firmware/t ## Installing and Building -Since the YMD96 uses an ATmega32a chip instead of the 32u4, you need to download [HIDBootFlash v.1.0](http://vusb.wikidot.com/project:hidbootflash) for Windows. If anyone knows of a Linux/Mac bootflasher that works, edit this readme! +Since the YMD96 uses an ATmega32a chip instead of the 32u4, you need to download [HIDBootFlash v.1.0](http://vusb.wikidot.com/project:hidbootflash) for Windows. For Linux you can use the [bootloadHID](https://www.obdev.at/products/vusb/bootloadhid.html) utility (which will require building). Arch Linux users can alternatively install this from the [AUR](https://aur.archlinux.org/packages/bootloadhid/). On Windows, I use [MINGw](http://www.mingw.org/) to compile the keymaps. On Linux, you can simply use the terminal. Once you have those two pieces of software: -Build the keyboard with +Build the keyboard by navigating to the root folder of the QMK repo and running ``` -$ make ymd96-default +$ make ymd96:default ``` If you make your own layout, change the `default` word to whatever your layout is. -And flash the compiled hex file with `HIDBootFlash`. Simply put the board in flashing mode by plugging it in while holding control, and click `find device`. Then you can specify the .hex file and flash it to the device. +To flash the compiled hex file, simply put the board in flashing mode by plugging it in while holding control. +In `HIDBootFlash` first click `find device`, then you can specify the .hex file and flash it to the device. +For `bootloadHID`, from a terminal that is in the same folder as your firmware file, run +``` +$ sudo bootloadHID ymd96_default.hex +``` +Again replacing default with your custom keymap name if required. ## Troubleshooting diff --git a/keyboards/ymd96/config.h b/keyboards/ymd96/config.h index 3122c694eb3d..1e9497fac690 100644 --- a/keyboards/ymd96/config.h +++ b/keyboards/ymd96/config.h @@ -23,7 +23,6 @@ along with this program. If not, see . #define VENDOR_ID 0x20A0 #define PRODUCT_ID 0x422D -// TODO: share these strings with usbconfig.h // Edit usbconfig.h to change these. #define MANUFACTURER ymdkey #define PRODUCT ymd96 diff --git a/keyboards/ymd96/keymaps/AnthonyWharton/README.md b/keyboards/ymd96/keymaps/AnthonyWharton/README.md new file mode 100644 index 000000000000..973e336cb61d --- /dev/null +++ b/keyboards/ymd96/keymaps/AnthonyWharton/README.md @@ -0,0 +1,16 @@ +# Personal Config by @AnthonyWharton + +The keymap and layout macro's in the main repository are for the following +keyboard: + +![@AnthonyWharton's YMD96](https://i.imgur.com/uhKmkBz.jpg) + +**Note:** This setup has locking Caps Lock and Num Lock keys, so if you wish +to use this layout and do not have such keys, you should : + + - Change the keys `KC_LCAP` and `KC_LNUM` to `KC_CAPS` and `KC_NUMLOCK` + respectively. + - Remove the `LOCKING_SUPPORT_ENABLE` and `LOCKING_RESYNC_ENABLE` lines + from `config.h`. + +For any other questions, find my latest contact information on my github page. diff --git a/keyboards/ymd96/keymaps/AnthonyWharton/config.h b/keyboards/ymd96/keymaps/AnthonyWharton/config.h new file mode 100644 index 000000000000..715e2c9a5fdc --- /dev/null +++ b/keyboards/ymd96/keymaps/AnthonyWharton/config.h @@ -0,0 +1,63 @@ +/* +Base Copyright 2017 Luiz Ribeiro +Modified 2017 Andrew Novak +Modified 2018 Anthony Wharton + +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 + +#define VENDOR_ID 0x20A0 +#define PRODUCT_ID 0x422D +// Edit usbconfig.h to change these. +#define MANUFACTURER ymdkey +#define PRODUCT ymd96 + +/* Matrix Size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 15 +#define DIODE_DIRECTION COL2ROW + +/* Required for MX Locks installed */ +#define LOCKING_SUPPORT_ENABLE +#define LOCKING_RESYNC_ENABLE + +#define PREVENT_STUCK_MODIFIERS +#define TAPPING_TOGGLE 3 +#define NO_UART 1 + +#define BACKLIGHT_LEVELS 12 + +/* RGB Underglow */ +// The RGB_DI_PING value seems to be shared between all PS2AVRGB boards. +// The same pin is used on the JJ40, at least. +#define RGBLED_NUM 18 +#define RGB_DI_PIN E2 // NOTE: for PS2AVRGB boards, underglow commands are send + // via I2C to 0xB0 + +#define RGBLIGHT_ANIMATIONS + +#define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85 // 1.0-2.7 +#define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 1-255 +#define RGBLIGHT_EFFECT_SNAKE_LENGTH 7 +#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 3 +#define RGBLIGHT_EFFECT_KNIGHT_OFFSET 0 +#define RGBLIGHT_EFFECT_KNIGHT_LED_NUM RGBLED_NUM +#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 +#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 500 + +/* key combination for command */ +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) + diff --git a/keyboards/ymd96/keymaps/AnthonyWharton/keymap.c b/keyboards/ymd96/keymaps/AnthonyWharton/keymap.c new file mode 100644 index 000000000000..2b3e2e2c7c9d --- /dev/null +++ b/keyboards/ymd96/keymaps/AnthonyWharton/keymap.c @@ -0,0 +1,47 @@ +/* +Base Copyright 2017 Luiz Ribeiro +Modified 2017 Andrew Novak +Modified 2018 Anthony Wharton + +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 LicensezZZ +along with this program. If not, see . +*/ + +#include QMK_KEYBOARD_H + +#define _DEFLT 0 +#define _RAISE 1 + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Layer 0, default layer */ + [_DEFLT] = LAYOUT_iso( + 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_HOME, KC_END, KC_INS, KC_DEL, KC_PGUP, \ + 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_LNUM, KC_PSLS, KC_PAST, KC_PGDN, \ + 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_ENT, KC_P7, KC_P8, KC_P9, KC_PMNS, \ + KC_LCAP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_P4, KC_P5, KC_P6, KC_PPLS, \ + 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, MO(_RAISE), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \ + ), + + /* Layer 1, raise layer */ + [_RAISE] = LAYOUT_iso( + _______, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, _______, KC_PAUS, KC_SLCK, _______, _______, _______, \ + _______, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW,RGB_M_SN,RGB_M_K, RGB_M_X, RGB_M_G, BL_OFF, BL_ON, BL_DEC, BL_INC, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAD, RGB_VAI, KC_MUTE, _______, KC_VOLU, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, BL_TOGG, KC_MPRV, KC_MPLY, KC_MNXT, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, KC_VOLD, _______, KC_LOCK, \ + _______, _______, KC_RALT, _______, _______, _______, KC_HOME, KC_PGDN, KC_END, _______, _______ \ + ) +}; diff --git a/keyboards/ymd96/matrix.c b/keyboards/ymd96/matrix.c index f2ecf4d33ceb..2932976dde20 100644 --- a/keyboards/ymd96/matrix.c +++ b/keyboards/ymd96/matrix.c @@ -50,20 +50,8 @@ void matrix_init(void) { matrix[row] = 0x00; matrix_debouncing[row] = 0x00; } -/*} matrix_init_quantum(); // missing from original port by Luiz -void matrix_set_row_status(uint8_t row) { - DDRB = (1 << row); - PORTB = ~(1 << row); -}*/ - - -/*uint8_t bit_reverse(uint8_t x) { - x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa); - x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc); - x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0); - return x;*/ } uint8_t matrix_scan(void) { diff --git a/keyboards/ymd96/rules.mk b/keyboards/ymd96/rules.mk index 42b3d11551f6..1cc4060b0157 100644 --- a/keyboards/ymd96/rules.mk +++ b/keyboards/ymd96/rules.mk @@ -35,7 +35,7 @@ BOOTMAGIC_ENABLE = no MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = no -COMMAND_ENABLE = yes +COMMAND_ENABLE = no BACKLIGHT_ENABLE = yes BACKLIGHT_CUSTOM_DRIVER = yes diff --git a/keyboards/ymd96/usbconfig.h b/keyboards/ymd96/usbconfig.h index 50fe4ed113bc..a90a36f08248 100644 --- a/keyboards/ymd96/usbconfig.h +++ b/keyboards/ymd96/usbconfig.h @@ -242,8 +242,8 @@ section at the end of this file). #define USB_CFG_DEVICE_VERSION 0x00, 0x02 /* Version number of the device: Minor number first, then major number. */ -#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r' -#define USB_CFG_VENDOR_NAME_LEN 13 +#define USB_CFG_VENDOR_NAME 'y','m','d','k','e','y' +#define USB_CFG_VENDOR_NAME_LEN 6 /* These two values define the vendor name returned by the USB device. The name * must be given as a list of characters under single quotes. The characters * are interpreted as Unicode (UTF-16) entities. @@ -252,8 +252,8 @@ section at the end of this file). * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for * details. */ -#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B' -#define USB_CFG_DEVICE_NAME_LEN 8 +#define USB_CFG_DEVICE_NAME 'y','m','d','9','6' +#define USB_CFG_DEVICE_NAME_LEN 5 /* Same as above for the device name. If you don't want a device name, undefine * the macros. See the file USB-IDs-for-free.txt before you assign a name if * you use a shared VID/PID. diff --git a/keyboards/ymd96/ymd96.h b/keyboards/ymd96/ymd96.h index ee0926eee83d..9c25f2219288 100644 --- a/keyboards/ymd96/ymd96.h +++ b/keyboards/ymd96/ymd96.h @@ -76,5 +76,22 @@ K411, K410, K409, K408, K404, K405, K406, K407, K403, K402, K401, K400 \ { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411 }, \ } +#define LAYOUT_iso( \ + K0500, K0502, K0503, K0504, K0505, K0600, K0610, K0710, K0700, K0511, K0512, K0513, K0514, K0113, K0214, K0013, K0706, K0709, K0708, \ + K0400, K0401, K0402, K0403, K0404, K0405, K0601, K0611, K0711, K0701, K0410, K0411, K0412, K0414, K0406, K0407, K0408, K0409, \ + K0300, K0301, K0302, K0303, K0304, K0305, K0602, K0612, K0712, K0702, K0310, K0311, K0312, K0213, K0306, K0307, K0308, K0309, \ + K0200, K0201, K0202, K0203, K0204, K0205, K0603, K0613, K0713, K0703, K0210, K0211, K0212, K0206, K0207, K0208, K0209, \ + K0100, K0003, K0101, K0102, K0103, K0104, K0105, K0604, K0614, K0714, K0704, K0110, K0111, K0608, K0106, K0107, K0108, K0009, \ + K0000, K0001, K0002, K0605, K0705, K0011, K0606, K0607, K0609, K0006, K0008 \ +) { \ + { K0000, K0001, K0002, K0003, KC_NO, KC_NO, K0006, KC_NO, K0008, K0009, KC_NO, K0011, KC_NO, K0013, KC_NO, }, \ + { K0100, K0101, K0102, K0103, K0104, K0105, K0106, K0107, K0108, KC_NO, K0110, K0111, KC_NO, K0113, KC_NO, }, \ + { K0200, K0201, K0202, K0203, K0204, K0205, K0206, K0207, K0208, K0209, K0210, K0211, K0212, K0213, K0214, }, \ + { K0300, K0301, K0302, K0303, K0304, K0305, K0306, K0307, K0308, K0309, K0310, K0311, K0312, KC_NO, KC_NO, }, \ + { K0400, K0401, K0402, K0403, K0404, K0405, K0406, K0407, K0408, K0409, K0410, K0411, K0412, KC_NO, K0414, }, \ + { K0500, KC_NO, K0502, K0503, K0504, K0505, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K0511, K0512, K0513, K0514, }, \ + { K0600, K0601, K0602, K0603, K0604, K0605, K0606, K0607, K0608, K0609, K0610, K0611, K0612, K0613, K0614, }, \ + { K0700, K0701, K0702, K0703, K0704, K0705, K0706, KC_NO, K0708, K0709, K0710, K0711, K0712, K0713, K0714 } \ +} #endif From 3f680a93eb38408d1fc6b0c78ee94b542cbc7aee Mon Sep 17 00:00:00 2001 From: Pascal Greilich Date: Mon, 17 Sep 2018 17:09:41 -0400 Subject: [PATCH 004/505] Keyboard: Tada68 readme img (#3918) * a new planck layout * layout images * layout images 2 * typo * update include following PR comment * updates following PR commments 2 * updates following PR comments * layout images * better layout names --- keyboards/tada68/keymaps/pascamel/readme.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/keyboards/tada68/keymaps/pascamel/readme.md b/keyboards/tada68/keymaps/pascamel/readme.md index 640ca27347ca..a829133fc62e 100755 --- a/keyboards/tada68/keymaps/pascamel/readme.md +++ b/keyboards/tada68/keymaps/pascamel/readme.md @@ -1,3 +1,11 @@ # pascamel's TADA68 layout -A layout based on raylas' layout with some updates on the fn layer especially around media keys. \ No newline at end of file +A layout based on raylas' layout with some updates on the fn layer especially around media keys. + +### Main layer + +![Imgur](https://i.imgur.com/UColvfc.png) + +### Fn layer + +![Imgur](https://i.imgur.com/pDQFoCQ.png) From 244e1c5a57eecd349c7d88e1af42d1b3467aeafe Mon Sep 17 00:00:00 2001 From: dsissitka Date: Sun, 16 Sep 2018 17:49:20 -0400 Subject: [PATCH 005/505] Fix LEADER_KEY docs. LEADER_KEY needs to be set in config.h, not keymap.c. Credit goes to @randywallace for figuring this one out: https://github.com/qmk/qmk_firmware/issues/2514#issuecomment-384847485 --- docs/feature_leader_key.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature_leader_key.md b/docs/feature_leader_key.md index 0c3f4a13328f..92aebd463d67 100644 --- a/docs/feature_leader_key.md +++ b/docs/feature_leader_key.md @@ -5,7 +5,7 @@ If you've ever used Vim, you know what a Leader key is. If not, you're about to That's what `KC_LEAD` does. Here's an example: 1. Pick a key on your keyboard you want to use as the Leader key. Assign it the keycode `KC_LEAD`. This key would be dedicated just for this -- it's a single action key, can't be used for anything else. -2. Include the line `#define LEADER_TIMEOUT 300` somewhere in your keymap.c file, probably near the top. The 300 there is 300ms -- that's how long you have for the sequence of keys following the leader. You can tweak this value for comfort, of course. +2. Include the line `#define LEADER_TIMEOUT 300` in your config.h. The 300 there is 300ms -- that's how long you have for the sequence of keys following the leader. You can tweak this value for comfort, of course. 3. Within your `matrix_scan_user` function, do something like this: ``` From a6d1db2c275f2e33e23135a6e410dbc8d19720a2 Mon Sep 17 00:00:00 2001 From: Joe Wasson Date: Mon, 17 Sep 2018 09:23:43 -0700 Subject: [PATCH 006/505] Create AG_TOGG code to toggle Alt/Gui swap. --- docs/feature_bootmagic.md | 1 + docs/keycodes.md | 1 + quantum/quantum.c | 11 +++++++++++ quantum/quantum_keycodes.h | 2 ++ 4 files changed, 15 insertions(+) diff --git a/docs/feature_bootmagic.md b/docs/feature_bootmagic.md index d6915d355976..586b5d837082 100644 --- a/docs/feature_bootmagic.md +++ b/docs/feature_bootmagic.md @@ -57,6 +57,7 @@ Hold down the Bootmagic key (Space by default) and the desired hotkey while plug |`MAGIC_UNNO_GUI` | |Enable the GUI keys | |`MAGIC_SWAP_ALT_GUI` |`AG_SWAP`|Swap Alt and GUI on both sides (for macOS)| |`MAGIC_UNSWAP_ALT_GUI` |`AG_NORM`|Unswap Left Alt and Left GUI | +|`MAGIC_TOGGLE_ALT_GUI` |`AG_TOGG`|Toggle Left Alt and GUI swap | |`MAGIC_SWAP_BACKSLASH_BACKSPACE` | |Swap `\` and Backspace | |`MAGIC_UNSWAP_BACKSLASH_BACKSPACE`| |Unswap `\` and Backspace | |`MAGIC_SWAP_CONTROL_CAPSLOCK` | |Swap Left Control and Caps Lock | diff --git a/docs/keycodes.md b/docs/keycodes.md index c344a7528388..6676bb53c9f5 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -271,6 +271,7 @@ This is a reference only. Each group of keys links to the page documenting their |`MAGIC_UNSWAP_BACKSLASH_BACKSPACE`| |Unswap `\` and Backspace | |`MAGIC_UNHOST_NKRO` | |Force NKRO off | |`MAGIC_UNSWAP_ALT_GUI` |`AG_NORM`|Unswap Alt and GUI on both sides | +|`MAGIC_TOGGLE_ALT_GUI` |`AG_TOGG`|Toggle Alt and GUI swap on both sides| |`MAGIC_TOGGLE_NKRO` | |Turn NKRO on or off | ## [Bluetooth](feature_bluetooth.md) diff --git a/quantum/quantum.c b/quantum/quantum.c index 9bf91eb86538..84ccbdeabadd 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -626,6 +626,17 @@ bool process_record_quantum(keyrecord_t *record) { PLAY_SONG(ag_norm_song); #endif break; + case MAGIC_TOGGLE_ALT_GUI: + keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui; + keymap_config.swap_ralt_rgui = !keymap_config.swap_ralt_rgui; + #ifdef AUDIO_ENABLE + if (keymap_config.swap_ralt_rgui) { + PLAY_SONG(ag_swap_song); + } else { + PLAY_SONG(ag_norm_song); + } + #endif + break; case MAGIC_TOGGLE_NKRO: keymap_config.nkro = !keymap_config.nkro; break; diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 3b87954960e4..050d2d275d2e 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -116,6 +116,7 @@ enum quantum_keycodes { MAGIC_UNHOST_NKRO, MAGIC_UNSWAP_ALT_GUI, MAGIC_TOGGLE_NKRO, + MAGIC_TOGGLE_ALT_GUI, GRAVE_ESC, // Leader key @@ -590,6 +591,7 @@ enum quantum_keycodes { #define AG_SWAP MAGIC_SWAP_ALT_GUI #define AG_NORM MAGIC_UNSWAP_ALT_GUI +#define AG_TOGG MAGIC_TOGGLE_ALT_GUI // GOTO layer - 16 layers max // when: From cb8d352cb3902612b118bf813d0459a2cd68473e Mon Sep 17 00:00:00 2001 From: Olivier Poitrey Date: Mon, 17 Sep 2018 15:10:00 -0700 Subject: [PATCH 007/505] Keymap: dz60/macos_arrow: fix rev3 broken media layer (#3928) Last rev broke the media layer because of a typo in layer definition. Switched to an enum to avoid similar future typos. --- keyboards/dz60/keymaps/macos_arrow/keymap.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/keyboards/dz60/keymaps/macos_arrow/keymap.c b/keyboards/dz60/keymaps/macos_arrow/keymap.c index 9a3120afd34d..7106092a47ae 100644 --- a/keyboards/dz60/keymaps/macos_arrow/keymap.c +++ b/keyboards/dz60/keymaps/macos_arrow/keymap.c @@ -1,9 +1,11 @@ #include QMK_KEYBOARD_H -#define _BL 0 // Base layer -#define _FL 1 // Function layer -#define _ML 2 // Media layer -#define _NL 2 // Numpad layer +enum dz60_layers { + _BL, // Base layer + _FL, // Function layer + _ML, // Media layer + _NL // Numpad layer +}; enum my_keycodes { BR_UP = SAFE_RANGE, From ec64be6622f73500f852149b7ab5460b6db5bac0 Mon Sep 17 00:00:00 2001 From: Merlin04 Date: Mon, 17 Sep 2018 15:18:19 -0700 Subject: [PATCH 008/505] Keyboard: Fix pin numbers for Fractal keyboard (#3743) * Added support for the Fractal keyboard * Try to fix the issue * Add support for the Fractal keyboard. * Fix errors with files * Update config.h --- keyboards/fractal/config.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/keyboards/fractal/config.h b/keyboards/fractal/config.h index 1a5901f98449..396c3b4b9499 100755 --- a/keyboards/fractal/config.h +++ b/keyboards/fractal/config.h @@ -17,7 +17,8 @@ /* key matrix pins */ #define MATRIX_ROW_PINS { B1, F7, F6, F5, F4 } -#define MATRIX_COL_PINS { B3, B2, B6, B5, B4, E6, D7, C6, D4, D0, D1, D2 } +#define MATRIX_COL_PINS { B3, B2, B6, B5, B4, E6, D7, C6, D4, D0, D1, D3 } + #define UNUSED_PINS /* COL2ROW or ROW2COL */ From 03b8ce206d566bf7f75771b55e05aea6ea6dba2d Mon Sep 17 00:00:00 2001 From: James Laird-Wah Date: Tue, 18 Sep 2018 08:49:20 +1000 Subject: [PATCH 009/505] Keyboard: add Keyboardio Model 01 (#3900) * Keyboard: add Keyboardio Model01 This port implements key scanning and everything in their default keymap. It doesn't implement mouse warping; QMK can't do that (yet). LED control is mostly not implemented. The ability to set all LEDs is included because they can get stuck on coming from the bootloader otherwise. Single LED control is also implemented for numpad indication. The scanners also support batch LED transfer which is what you'd need if you wanted to do fast effects. Gamma correction is also not implemented, but is present in the original firmware. The necessary info for further implementation is in the KeyboardioScanner module for Kaleidoscope. To install on your keyboard: make model01:avrdude When prompted, hold the "prog" key on the keyboard to put it into programming mode. This can also be achieved by holding the "prog" key while plugging in the keyboard. This works even if the firmware is corrupt or missing. Hot plugging the halves seems to work fine, but there is no explicit support for eg. making sure the matrix scan rate is reconfigured. * model01: clean up includes and include guards Uses #pragma once everywhere. * model01: split LED and matrix code This makes space if someone wants to implement better LED support later on, the keyboard is a lot more capable than the current code. * model01: separate I2C timeouts for matrix vs. LED If the scanners have no data they don't ACK reads and just time out. So we want a pretty short timeout to keep scan rates high. Meanwhile the LED transfers might take longer - I don't know though, so here we are conservative. * model01: implement better LED control - gamma correction from the manufacturer's firmware - suitable delays to allow back to back LED writes - this is fast enough to write the whole keyboard without noticeable delay, in my experience - minor bug fix: RHS Fn key was not addressable * model01: add license to wire-protocol-constants.h * model01: replace gamma LUT The original was of unclear license origin. This one is functionally identical and includes a generator should people wish to adjust it. * model01: use the already-present CIE1931 lightness curve ...rather than baking in another gamma curve. It's said that CIE1931 is the right thing to be using rather than gamma. OK. Let it be so. * model01: call matrix_init_user() from matrix_init_kb() * model01: remove inapplicable config options from rules.mk * model01: readme.md: update build environment links --- keyboards/model01/config.h | 35 ++++++++ keyboards/model01/info.json | 4 + keyboards/model01/keymaps/default/config.h | 19 +++++ keyboards/model01/keymaps/default/keymap.c | 93 ++++++++++++++++++++ keyboards/model01/keymaps/default/readme.md | 3 + keyboards/model01/keymaps/default/rules.mk | 2 + keyboards/model01/leds.c | 57 +++++++++++++ keyboards/model01/leds.h | 25 ++++++ keyboards/model01/matrix.c | 94 +++++++++++++++++++++ keyboards/model01/model01.c | 38 +++++++++ keyboards/model01/model01.h | 50 +++++++++++ keyboards/model01/readme.md | 37 ++++++++ keyboards/model01/rules.mk | 62 ++++++++++++++ keyboards/model01/wire-protocol-constants.h | 53 ++++++++++++ 14 files changed, 572 insertions(+) create mode 100644 keyboards/model01/config.h create mode 100644 keyboards/model01/info.json create mode 100644 keyboards/model01/keymaps/default/config.h create mode 100644 keyboards/model01/keymaps/default/keymap.c create mode 100644 keyboards/model01/keymaps/default/readme.md create mode 100644 keyboards/model01/keymaps/default/rules.mk create mode 100644 keyboards/model01/leds.c create mode 100644 keyboards/model01/leds.h create mode 100644 keyboards/model01/matrix.c create mode 100644 keyboards/model01/model01.c create mode 100644 keyboards/model01/model01.h create mode 100644 keyboards/model01/readme.md create mode 100644 keyboards/model01/rules.mk create mode 100644 keyboards/model01/wire-protocol-constants.h diff --git a/keyboards/model01/config.h b/keyboards/model01/config.h new file mode 100644 index 000000000000..796653f459cd --- /dev/null +++ b/keyboards/model01/config.h @@ -0,0 +1,35 @@ +/* +Copyright 2018 James Laird-Wah + +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 + +#include + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x1209 +#define PRODUCT_ID 0x2301 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Keyboardio +#define PRODUCT Model 01 +#define DESCRIPTION (QMK) + +/* key matrix size; rows are doubled for split */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 8 + +/* The scanners already debounce for us */ +#define DEBOUNCING_DELAY 0 diff --git a/keyboards/model01/info.json b/keyboards/model01/info.json new file mode 100644 index 000000000000..daf51492dbe4 --- /dev/null +++ b/keyboards/model01/info.json @@ -0,0 +1,4 @@ +{ + "keyboard_name": "model01", + "url": "https://keyboard.io" +} diff --git a/keyboards/model01/keymaps/default/config.h b/keyboards/model01/keymaps/default/config.h new file mode 100644 index 000000000000..8ab9d8b025a7 --- /dev/null +++ b/keyboards/model01/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 James Laird-Wah + * + * 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 + +/* place overrides here */ diff --git a/keyboards/model01/keymaps/default/keymap.c b/keyboards/model01/keymaps/default/keymap.c new file mode 100644 index 000000000000..cdc050cd90b7 --- /dev/null +++ b/keyboards/model01/keymaps/default/keymap.c @@ -0,0 +1,93 @@ +/* Copyright 2018 James Laird-Wah + * + * 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 QMK_KEYBOARD_H + +/* layer constants */ +enum { + DEF = 0, + NUM, + FUN, +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[DEF] = LAYOUT( + RESET , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , TG(NUM), + KC_GRV , KC_Q , KC_W , KC_E , KC_R , KC_T , _______, _______, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_EQL , + KC_PGUP, KC_A , KC_S , KC_D , KC_F , KC_G , KC_TAB , KC_ENT , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, + KC_PGDN, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_ESC , _______, KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_MINS, + KC_LCTL, KC_RCTL, + KC_BSPC, KC_SPC , + KC_LGUI, KC_RALT, + KC_LSFT, KC_RSFT, + MO(FUN), MO(FUN) + ), +[NUM] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, KC_P7 , KC_P8 , KC_P9 , KC_PMNS, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P4 , KC_P5 , KC_P6 , KC_PPLS, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P1 , KC_P2 , KC_P3 , KC_PEQL, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P0 , KC_PDOT, KC_PAST, KC_PSLS, KC_PENT, + _______, _______, + _______, _______, + _______, _______, + _______, _______, + _______, _______ + ), +[FUN] = LAYOUT( + _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , + KC_TAB , _______, KC_MS_U, _______, KC_BTN3, _______, _______, KC_MPRV, KC_MNXT, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12 , + KC_HOME, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN1, _______, _______, KC_MPLY, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, _______, + KC_END , KC_PSCR, KC_INS , _______, KC_BTN2, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_BSLS, KC_PIPE, + _______, _______, + KC_DEL , KC_ENT , + _______, _______, + _______, _______, + _______, _______ + ) +}; + +/* template for new layouts: +LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, + _______, _______, + _______, _______, + _______, _______, + _______, _______ + ) +*/ + +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case DEF: + set_all_leds_to(0,0,0); + break; + case NUM: + /* highlight the numpad keys when numlock is on */ + for (int i=44; i<=60; i++) { + set_led_to(i, 128,0,0); + } + set_led_to(63, 128, 0, 0); + break; + } + + return state; +} + +/* vim: set ts=2 sw=2 et: */ diff --git a/keyboards/model01/keymaps/default/readme.md b/keyboards/model01/keymaps/default/readme.md new file mode 100644 index 000000000000..740515a26878 --- /dev/null +++ b/keyboards/model01/keymaps/default/readme.md @@ -0,0 +1,3 @@ +# The default keymap for Keyboardio's Model01 + +This implements all of their default keymap, except for mouse warping. diff --git a/keyboards/model01/keymaps/default/rules.mk b/keyboards/model01/keymaps/default/rules.mk new file mode 100644 index 000000000000..4d1abd88ad33 --- /dev/null +++ b/keyboards/model01/keymaps/default/rules.mk @@ -0,0 +1,2 @@ +# used by default keymap +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) diff --git a/keyboards/model01/leds.c b/keyboards/model01/leds.c new file mode 100644 index 000000000000..b80a749a75d0 --- /dev/null +++ b/keyboards/model01/leds.c @@ -0,0 +1,57 @@ +/* Copyright 2018 James Laird-Wah + * + * 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 "model01.h" + +#define I2C_TIMEOUT 1000 + +#define LINCOR(i) pgm_read_byte(&CIE1931_CURVE[i]) + +int set_all_leds_to_raw(uint8_t r, uint8_t g, uint8_t b) { + uint8_t buf[] = { + TWI_CMD_LED_SET_ALL_TO, + b, g, r + }; + int ret = 0; + ret |= i2c_transmit(I2C_ADDR(LEFT), buf, sizeof(buf), I2C_TIMEOUT); + ret |= i2c_transmit(I2C_ADDR(RIGHT), buf, sizeof(buf), I2C_TIMEOUT); + _delay_us(10); + return ret; +} + +int set_all_leds_to(uint8_t r, uint8_t g, uint8_t b) { + return set_all_leds_to_raw(LINCOR(r), LINCOR(g), LINCOR(b)); +} + +int set_led_to_raw(uint8_t led, uint8_t r, uint8_t g, uint8_t b) { + uint8_t buf[] = { + TWI_CMD_LED_SET_ONE_TO, + led & 0x1f, + b, g, r + }; + int hand = (led >= 32) ? RIGHT : LEFT; + int ret = i2c_transmit(I2C_ADDR(hand), buf, sizeof(buf), I2C_TIMEOUT); + _delay_us(10); + return ret; +} + +int set_led_to(uint8_t led, uint8_t r, uint8_t g, uint8_t b) { + return set_led_to_raw(led, LINCOR(r), LINCOR(g), LINCOR(b)); +} + +/* vim: set ts=2 sw=2 et: */ diff --git a/keyboards/model01/leds.h b/keyboards/model01/leds.h new file mode 100644 index 000000000000..0aac781dd5d5 --- /dev/null +++ b/keyboards/model01/leds.h @@ -0,0 +1,25 @@ +/* Copyright 2018 James Laird-Wah + * + * 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 + +#include + +int set_all_leds_to(uint8_t r, uint8_t g, uint8_t b); +int set_led_to(uint8_t led, uint8_t r, uint8_t g, uint8_t b); + +/* Raw (gamma uncorrected) LED values */ +int set_all_leds_to_raw(uint8_t r, uint8_t g, uint8_t b); +int set_led_to_raw(uint8_t led, uint8_t r, uint8_t g, uint8_t b); diff --git a/keyboards/model01/matrix.c b/keyboards/model01/matrix.c new file mode 100644 index 000000000000..f1f9024c7c6b --- /dev/null +++ b/keyboards/model01/matrix.c @@ -0,0 +1,94 @@ +/* Copyright 2018 James Laird-Wah + * + * 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 "model01.h" + +/* If no key events have occurred, the scanners will time out on reads. + * So we don't want to be too permissive here. */ +#define I2C_TIMEOUT 10 + +static matrix_row_t rows[MATRIX_ROWS]; +#define ROWS_PER_HAND (MATRIX_ROWS / 2) + +inline +uint8_t matrix_rows(void) { + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) { + return MATRIX_COLS; +} + +static int i2c_read_hand(int hand) { + uint8_t buf[5]; + i2c_status_t ret = i2c_receive(I2C_ADDR(hand), buf, sizeof(buf), I2C_TIMEOUT); + if (ret != I2C_STATUS_SUCCESS) + return 1; + + if (buf[0] != TWI_REPLY_KEYDATA) + return 2; + + int start_row = hand ? ROWS_PER_HAND : 0; + uint8_t *out = &rows[start_row]; + memcpy(out, &buf[1], 4); + return 0; +} + +static int i2c_set_keyscan_interval(int hand, int delay) { + uint8_t buf[] = {TWI_CMD_KEYSCAN_INTERVAL, delay}; + i2c_status_t ret = i2c_transmit(I2C_ADDR(hand), buf, sizeof(buf), I2C_TIMEOUT); + return ret; +} + +void matrix_init(void) { + /* Ensure scanner power is on - else right hand will not work */ + DDRC |= _BV(7); + PORTC |= _BV(7); + + i2c_init(); + i2c_set_keyscan_interval(LEFT, 2); + i2c_set_keyscan_interval(RIGHT, 2); + memset(rows, 0, sizeof(rows)); + + matrix_init_quantum(); +} + +uint8_t matrix_scan(void) { + uint8_t ret = 0; + ret |= i2c_read_hand(LEFT); + ret |= i2c_read_hand(RIGHT); + matrix_scan_quantum(); + return ret; +} + +inline +matrix_row_t matrix_get_row(uint8_t row) { + return rows[row]; +} + +void matrix_print(void) { + print("\nr/c 0123456789ABCDEF\n"); + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + phex(row); print(": "); + pbin_reverse16(matrix_get_row(row)); + print("\n"); + } +} + +/* vim: set ts=2 sw=2 et: */ diff --git a/keyboards/model01/model01.c b/keyboards/model01/model01.c new file mode 100644 index 000000000000..29615ca866f3 --- /dev/null +++ b/keyboards/model01/model01.c @@ -0,0 +1,38 @@ +/* Copyright 2018 James Laird-Wah + * + * 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 "model01.h" + +void matrix_init_kb(void) { + /* the bootloader can leave LEDs on, so */ + set_all_leds_to(0, 0, 0); + matrix_init_user(); +} + +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + diff --git a/keyboards/model01/model01.h b/keyboards/model01/model01.h new file mode 100644 index 000000000000..a83e33cd86d2 --- /dev/null +++ b/keyboards/model01/model01.h @@ -0,0 +1,50 @@ +/* Copyright 2018 James Laird-Wah + * + * 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 + +#include + +#define LAYOUT( \ + L07, L06, L05, L04, L03, L02, R05, R04, R03, R02, R01, R00, \ + L17, L16, L15, L14, L13, L12, L01, R06, R15, R14, R13, R12, R11, R10, \ + L27, L26, L25, L24, L23, L22, L11, R16, R25, R24, R23, R22, R21, R20, \ + L37, L36, L35, L34, L33, L32, L21, R26, R35, R34, R33, R32, R31, R30, \ + L00, R07, \ + L10, R17, \ + L20, R27, \ + L30, R37, \ + L31, R36 \ + ) { \ + {L00, L01, L02, L03, L04, L05, L06, L07}, \ + {L10, L11, L12, L13, L14, L15, L16, L17}, \ + {L20, L21, L22, L23, L24, L25, L26, L27}, \ + {L30, L31, L32, L33, L34, L35, L36, L37}, \ + {R00, R01, R02, R03, R04, R05, R06, R07}, \ + {R10, R11, R12, R13, R14, R15, R16, R17}, \ + {R20, R21, R22, R23, R24, R25, R26, R27}, \ + {R30, R31, R32, R33, R34, R35, R36, R37} \ + } + +#include "wire-protocol-constants.h" +#define I2C_ADDR_LEFT (0x58 << 1) +#define I2C_ADDR_RIGHT (I2C_ADDR_LEFT + 6) +#define I2C_ADDR(hand) ((hand) ? I2C_ADDR_RIGHT : I2C_ADDR_LEFT) +#define LEFT 0 +#define RIGHT 1 + +#include "leds.h" + +/* vim: set ts=2 sw=2 et: */ diff --git a/keyboards/model01/readme.md b/keyboards/model01/readme.md new file mode 100644 index 000000000000..34bd291e2ed6 --- /dev/null +++ b/keyboards/model01/readme.md @@ -0,0 +1,37 @@ +# Keyboardio Model 01 + +A split keyboard. + +Keyboard Maintainer: QMK Community +Hardware Supported: Keyboardio Model 01 +Hardware Availability: [Keyboardio](https://shop.keyboard.io) + +Make example for this keyboard (after setting up your build environment): + + make model01:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. +Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +## Programming the Keyboard + +To program the keyboard, if you have avrdude installed: + + make model01:default:avrdude + +When prompted to reset your keyboard, press the prog key at upper left. If the +keyboard does not reset, you can hold the prog key while plugging it into your +computer. The prog key will light up red in programming mode. + +## Features + +This implements the standard keymap, including mousekeys. + +It doesn't do cursor warping - QMK does not support absolute mouse positioning. + +LED support is limited. Gamma compensation and the high speed batch update +functions supported by the hardware are not implemented. The high current power +switch is also not implemented, so if you try and turn all the LEDs on at full +brightness, something may conk out. + +Hotplugging the two halves works but is not extensively tested. diff --git a/keyboards/model01/rules.mk b/keyboards/model01/rules.mk new file mode 100644 index 000000000000..cab7065ff8ff --- /dev/null +++ b/keyboards/model01/rules.mk @@ -0,0 +1,62 @@ +SRC += i2c_master.c \ + leds.c \ + matrix.c + +# 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 + +BOOTLOADER = caterina + +# Build Options +# change yes to no to disable +# +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 = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +UNICODE_ENABLE = no # Unicode + +CUSTOM_MATRIX = yes +CIE1931_CURVE = yes diff --git a/keyboards/model01/wire-protocol-constants.h b/keyboards/model01/wire-protocol-constants.h new file mode 100644 index 000000000000..90a528582a07 --- /dev/null +++ b/keyboards/model01/wire-protocol-constants.h @@ -0,0 +1,53 @@ +/* + * This file is taken from the KeyboardioScanner module: + * https://github.com/keyboardio/KeyboardioScanner/blob/master/wire-protocol-constants.h + * + * Copyright (C) 2015-2018 Keyboard.io, Inc + * + * 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 + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#pragma once + +#define TWI_CMD_NONE 0x00 +#define TWI_CMD_VERSION 0x01 +#define TWI_CMD_KEYSCAN_INTERVAL 0x02 +#define TWI_CMD_LED_SET_ALL_TO 0x03 +#define TWI_CMD_LED_SET_ONE_TO 0x04 +#define TWI_CMD_COLS_USE_PULLUPS 0x05 +#define TWI_CMD_LED_SPI_FREQUENCY 0x06 + +#define LED_SPI_FREQUENCY_4MHZ 0x07 +#define LED_SPI_FREQUENCY_2MHZ 0x06 +#define LED_SPI_FREQUENCY_1MHZ 0x05 +#define LED_SPI_FREQUENCY_512KHZ 0x04 +#define LED_SPI_FREQUENCY_256KHZ 0x03 +#define LED_SPI_FREQUENCY_128KHZ 0x02 +#define LED_SPI_FREQUENCY_64KHZ 0x01 +#define LED_SPI_OFF 0x00 + + +// 512KHZ seems to be the sweet spot in early testing +// so make it the default +#define LED_SPI_FREQUENCY_DEFAULT LED_SPI_FREQUENCY_512KHZ + + +#define TWI_CMD_LED_BASE 0x80 + +#define TWI_REPLY_NONE 0x00 +#define TWI_REPLY_KEYDATA 0x01 From 23da333ae3527228f101ed8cf08e3cd6a5796901 Mon Sep 17 00:00:00 2001 From: nachie Date: Mon, 17 Sep 2018 16:00:40 -0700 Subject: [PATCH 010/505] Keyboard: Added support for GSKT-00 (#3911) * Added QMK support for GSKT-00, PaladinSplit, PaladinTKL and PaladinPad pcbs * Remove the paladin boards from this PR * Changed gskt00 as per review comments. Added two new default layouts, 60_ansi_tsangan and 60_iso_tsangan * Fix the layouts/default/60_iso_tsangan/layout.json file * Removed ? from rules.mk, removed unused fn_actions from keymaps. Changed the 60_iso_tsangan to work correctly * Removed PREVENT_STUCK_MODIFIERS --- keyboards/gskt00/config.h | 39 +++++++++ keyboards/gskt00/gskt00.c | 2 + keyboards/gskt00/gskt00.h | 57 +++++++++++++ keyboards/gskt00/info.json | 16 ++++ keyboards/gskt00/keymaps/default/keymap.c | 82 +++++++++++++++++++ keyboards/gskt00/keymaps/nachie/keymap.c | 82 +++++++++++++++++++ keyboards/gskt00/readme.md | 17 ++++ keyboards/gskt00/rules.mk | 55 +++++++++++++ .../default_60_ansi_tsangan/keymap.c | 11 +++ layouts/default/60_ansi_tsangan/layout.json | 5 ++ layouts/default/60_ansi_tsangan/readme.md | 3 + .../default_60_iso_tsangan/keymap.c | 11 +++ layouts/default/60_iso_tsangan/layout.json | 5 ++ layouts/default/60_iso_tsangan/readme.md | 3 + 14 files changed, 388 insertions(+) create mode 100755 keyboards/gskt00/config.h create mode 100755 keyboards/gskt00/gskt00.c create mode 100755 keyboards/gskt00/gskt00.h create mode 100644 keyboards/gskt00/info.json create mode 100755 keyboards/gskt00/keymaps/default/keymap.c create mode 100755 keyboards/gskt00/keymaps/nachie/keymap.c create mode 100644 keyboards/gskt00/readme.md create mode 100755 keyboards/gskt00/rules.mk create mode 100644 layouts/default/60_ansi_tsangan/default_60_ansi_tsangan/keymap.c create mode 100644 layouts/default/60_ansi_tsangan/layout.json create mode 100644 layouts/default/60_ansi_tsangan/readme.md create mode 100644 layouts/default/60_iso_tsangan/default_60_iso_tsangan/keymap.c create mode 100644 layouts/default/60_iso_tsangan/layout.json create mode 100644 layouts/default/60_iso_tsangan/readme.md diff --git a/keyboards/gskt00/config.h b/keyboards/gskt00/config.h new file mode 100755 index 000000000000..f36493f28894 --- /dev/null +++ b/keyboards/gskt00/config.h @@ -0,0 +1,39 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6061 +#define DEVICE_VER 0x0001 +#define MANUFACTURER inachie +#define PRODUCT GSKT00 +#define DESCRIPTION GSKT00 Gasket 60 keyboard + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 8 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { F1, D1, D2, D4, D6, F7, B0, F4 } +#define MATRIX_COL_PINS { F6, D7, F5, C7, B4, C6, B6, B5 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* 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)) \ +) + + diff --git a/keyboards/gskt00/gskt00.c b/keyboards/gskt00/gskt00.c new file mode 100755 index 000000000000..89a0040ff371 --- /dev/null +++ b/keyboards/gskt00/gskt00.c @@ -0,0 +1,2 @@ +#include "gskt00.h" + diff --git a/keyboards/gskt00/gskt00.h b/keyboards/gskt00/gskt00.h new file mode 100755 index 000000000000..90e9a1ad5acb --- /dev/null +++ b/keyboards/gskt00/gskt00.h @@ -0,0 +1,57 @@ +#ifndef GSKT00_H +#define GSKT00_H + +#include "quantum.h" + +#define LAYOUT_all( \ + K36, K37, K46, K47, K56, K57, K66, K67, K76, K77, K06, K07, K17, K26, K27, \ + K34, K35, K44, K45, K54, K55, K64, K65, K75, K05, K15, K16, K25, K24, \ + K32, K33, K43, K52, K53, K63, K73, K74, K03, K04, K13, K14, K23, \ + K31, K41, K42, K51, K61, K62, K71, K72, K01, K02, K11, K12, K21, K22, \ + K30, K40, K50, K60, K00, K10, K20 \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07 }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ + { K20, K21, K22, K23, K24, K25, K26, K27 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37 }, \ + { K40, K41, K42, K43, K44, K45, K46, K47 }, \ + { K50, K51, K52, K53, K54, K55, K56, K57 }, \ + { K60, K61, K62, K63, K64, K65, K66, K67 }, \ + { KC_NO, K71, K72, K73, K74, K75, K76, K77 } \ +} + +#define LAYOUT_60_iso_tsangan( \ + K36, K37, K46, K47, K56, K57, K66, K67, K76, K77, K06, K07, K17, K27, \ + K34, K35, K44, K45, K54, K55, K64, K65, K75, K05, K15, K16, K25, \ + K32, K33, K43, K52, K53, K63, K73, K74, K03, K04, K13, K14, K24, K23, /* enter */ \ + K31, K41, K42, K51, K61, K62, K71, K72, K01, K02, K11, K12, K21, \ + K30, K40, K50, K60, K00, K10, K20 \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07 }, \ + { KC_NO, K11, K12, K13, K14, K15, K16, K17 }, \ + { K20, K21, KC_NO, K23, K24, K25, KC_NO, K27 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37 }, \ + { K40, K41, K42, K43, K44, K45, K46, K47 }, \ + { K50, K51, K52, K53, K54, K55, K56, K57 }, \ + { K60, K61, K62, K63, K64, K65, K66, K67 }, \ + { KC_NO, K71, K72, K73, K74, K75, K76, K77 } \ +} + +#define LAYOUT_60_ansi_tsangan( \ + K36, K37, K46, K47, K56, K57, K66, K67, K76, K77, K06, K07, K17, K27, \ + K34, K35, K44, K45, K54, K55, K64, K65, K75, K05, K15, K16, K25, K24, \ + K32, K33, K43, K52, K53, K63, K73, K74, K03, K04, K13, K14, K23, \ + K31, K42, K51, K61, K62, K71, K72, K01, K02, K11, K12, K21, \ + K30, K40, K50, K60, K00, K10, K20 \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07 }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ + { K20, K21, KC_NO, K23, K24, K25, KC_NO, K27 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37 }, \ + { K40, KC_NO, K42, K43, K44, K45, K46, K47 }, \ + { K50, K51, K52, K53, K54, K55, K56, K57 }, \ + { K60, K61, K62, K63, K64, K65, K66, K67 }, \ + { KC_NO, K71, K72, K73, K74, K75, K76, K77 } \ +} + +#endif diff --git a/keyboards/gskt00/info.json b/keyboards/gskt00/info.json new file mode 100644 index 000000000000..88191240b9ff --- /dev/null +++ b/keyboards/gskt00/info.json @@ -0,0 +1,16 @@ +{ + "keyboard_name": "gskt00", + "url": "", + "maintainer": "nachie", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_60_ansi_tsangan": { + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.5}, {"label":"Win", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Win", "x":12.5, "y":4}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}] + }, + + "LAYOUT_60_iso_tsangan": { + "layout": [{"label":"\u00ac", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"\u00a3", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":2, "w":1.25}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.5}, {"label":"Win", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"AltGr", "x":11, "y":4, "w":1.5}, {"label":"Menu", "x":12.5, "y":4}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}] + } + } + } diff --git a/keyboards/gskt00/keymaps/default/keymap.c b/keyboards/gskt00/keymaps/default/keymap.c new file mode 100755 index 000000000000..792ba2f412d5 --- /dev/null +++ b/keyboards/gskt00/keymaps/default/keymap.c @@ -0,0 +1,82 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* QWERTY */ + LAYOUT_all( + 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_GRV, 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_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_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, MO(3), + KC_LGUI, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(3)), + + /* DVORAK */ + LAYOUT_all( + KC_ESC, 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_GRV, KC_BSLS, + KC_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_BSPC, + MO(3), 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_NUBS, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_LSFT, MO(3), + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL), + + /* COLEMAK */ + LAYOUT_all( + 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_GRV, KC_BSLS, + 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_BSPC, + MO(3), 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_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, MO(3), + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL), + + /* FUNCTION */ + LAYOUT_all( + 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_INS, KC_DEL, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SLCK, KC_PAUS, KC_UP, KC_PAUS, KC_DEL, + KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_EJCT, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, KC_TRNS, RGB_TOG) + +}; + +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) { + + if (usb_led & (1 << USB_LED_NUM_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_COMPOSE)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_KANA)) { + + } else { + + } + +} + diff --git a/keyboards/gskt00/keymaps/nachie/keymap.c b/keyboards/gskt00/keymaps/nachie/keymap.c new file mode 100755 index 000000000000..8606d2484103 --- /dev/null +++ b/keyboards/gskt00/keymaps/nachie/keymap.c @@ -0,0 +1,82 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* QWERTY */ + LAYOUT_all( + 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_GRV, KC_BSLS, + 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, + MO(3), 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_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, MO(3), + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_LCTL), + + /* DVORAK */ + LAYOUT_all( + KC_ESC, 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_GRV, KC_BSLS, + KC_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_BSPC, + MO(3), 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_NUBS, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_LSFT, MO(3), + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL), + + /* COLEMAK */ + LAYOUT_all( + 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_GRV, KC_BSLS, + 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_BSPC, + MO(3), 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_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, MO(3), + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL), + + /* FUNCTION */ + LAYOUT_all( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_SLCK, KC_PAUS, KC_BSPC, + KC_TRNS, KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, + KC_CAPS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, KC_TRNS, RGB_TOG) + +}; + +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) { + + if (usb_led & (1 << USB_LED_NUM_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_COMPOSE)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_KANA)) { + + } else { + + } + +} + diff --git a/keyboards/gskt00/readme.md b/keyboards/gskt00/readme.md new file mode 100644 index 000000000000..ad03ac819f21 --- /dev/null +++ b/keyboards/gskt00/readme.md @@ -0,0 +1,17 @@ +# GSKT-00 PCB + +Firmware for the GSKT-00 PCB + +Keyboard Maintainer: [/u/iNachie](https://github.com/nachie) +Hardware Supported: GSKT-00 PCB +Hardware Availability: [/u/iNachie](https://www.reddit.com/user/inachie/) + +Make example for this keyboard (after setting up your build environment): + + make gskt00:default + +Or to make and flash: + + make gskt00:default:dfu + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/gskt00/rules.mk b/keyboards/gskt00/rules.mk new file mode 100755 index 000000000000..338384e3e86c --- /dev/null +++ b/keyboards/gskt00/rules.mk @@ -0,0 +1,55 @@ +# 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 + +BOOTLOADER = atmel-dfu + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = no + +LAYOUTS = 60_ansi_tsangan 60_iso_tsangan diff --git a/layouts/default/60_ansi_tsangan/default_60_ansi_tsangan/keymap.c b/layouts/default/60_ansi_tsangan/default_60_ansi_tsangan/keymap.c new file mode 100644 index 000000000000..8f7f5f8c6f92 --- /dev/null +++ b/layouts/default/60_ansi_tsangan/default_60_ansi_tsangan/keymap.c @@ -0,0 +1,11 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_60_ansi( + 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_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 , KC_RCTL + ) +}; diff --git a/layouts/default/60_ansi_tsangan/layout.json b/layouts/default/60_ansi_tsangan/layout.json new file mode 100644 index 000000000000..f6a65beb34bb --- /dev/null +++ b/layouts/default/60_ansi_tsangan/layout.json @@ -0,0 +1,5 @@ +[{a:7},"","","","","","","","","","","","","",{w:2},""], +[{w:1.5},"","","","","","","","","","","","","",{w:1.5},""], +[{w:1.75},"","","","","","","","","","","","",{w:2.25},""], +[{w:2.25},"","","","","","","","","","","",{w:2.75},""], +[{w:1.5},"",{w:1},"",{w:1.5},"",{w:7},"",{w:1.5},"",{w:1},"",{w:1.5},""] diff --git a/layouts/default/60_ansi_tsangan/readme.md b/layouts/default/60_ansi_tsangan/readme.md new file mode 100644 index 000000000000..76b451403478 --- /dev/null +++ b/layouts/default/60_ansi_tsangan/readme.md @@ -0,0 +1,3 @@ +# 60_ansi_tsangan + + LAYOUT_60_ansi_tsangan diff --git a/layouts/default/60_iso_tsangan/default_60_iso_tsangan/keymap.c b/layouts/default/60_iso_tsangan/default_60_iso_tsangan/keymap.c new file mode 100644 index 000000000000..204a12d33d2d --- /dev/null +++ b/layouts/default/60_iso_tsangan/default_60_iso_tsangan/keymap.c @@ -0,0 +1,11 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_60_iso( + 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_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, + 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_LCTRL, KC_LALT, KC_LGUI, KC_SPACE, KC_RGUI, KC_RALT, KC_RCTL + ) +}; diff --git a/layouts/default/60_iso_tsangan/layout.json b/layouts/default/60_iso_tsangan/layout.json new file mode 100644 index 000000000000..e2318593535c --- /dev/null +++ b/layouts/default/60_iso_tsangan/layout.json @@ -0,0 +1,5 @@ +[{a:7},"","","","","","","","","","","","","",{w:2},""], +[{w:1.5},"","","","","","","","","","","","","",{x:0.25,w:1.25,h:2,w2:1.5,h2:1,x2:-0.25},""], +[{w:1.75},"","","","","","","","","","","","",""], +[{w:1.25},"","","","","","","","","","","","",{w:2.75},""], +[{w:1.5},"",{w:1},"",{w:1.5},"",{w:7},"",{w:1.5},"",{w:1},"",{w:1.5},""] diff --git a/layouts/default/60_iso_tsangan/readme.md b/layouts/default/60_iso_tsangan/readme.md new file mode 100644 index 000000000000..edb7f9242dc3 --- /dev/null +++ b/layouts/default/60_iso_tsangan/readme.md @@ -0,0 +1,3 @@ +# 60_iso_tsangan + + LAYOUT_60_iso_tsangan From 92f67719cc7faf6f2708d848ae3d1c6ee2b781cb Mon Sep 17 00:00:00 2001 From: skullydazed Date: Wed, 19 Sep 2018 11:41:40 -0700 Subject: [PATCH 011/505] Keyboard: Fix the LAYOUT_iso macro for tada68 (#3943) --- keyboards/tada68/keymaps/iso-uk/keymap.c | 8 ++++---- keyboards/tada68/tada68.h | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/keyboards/tada68/keymaps/iso-uk/keymap.c b/keyboards/tada68/keymaps/iso-uk/keymap.c index d59f610f7cfc..c843595dc347 100644 --- a/keyboards/tada68/keymaps/iso-uk/keymap.c +++ b/keyboards/tada68/keymaps/iso-uk/keymap.c @@ -21,8 +21,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_BL] = LAYOUT_iso( 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_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_NUHS, KC_DEL, \ - 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_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_DEL, \ + 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_NUHS, KC_ENT, KC_PGUP, \ 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_PGDN, \ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ), @@ -42,8 +42,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_FL] = LAYOUT_iso( _______, 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, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, \ - _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, \ + _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, \ + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, \ _______, _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, _______, KC_VOLU, KC_VOLD, KC_MUTE, _______, KC_BTN1, KC_MS_U, KC_BTN2, \ _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R ), diff --git a/keyboards/tada68/tada68.h b/keyboards/tada68/tada68.h index 608f52e44fa5..670b0e6c15ac 100755 --- a/keyboards/tada68/tada68.h +++ b/keyboards/tada68/tada68.h @@ -55,8 +55,8 @@ #define LAYOUT_iso( \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k2c, k1e, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2d, k2e, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1e, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, \ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \ k40, k41, k42, k45, k49, k4a, k4b, k4c, k4d, k4e \ ) \ @@ -102,4 +102,4 @@ void matrix_init_user(void); void matrix_scan_user(void); -#endif \ No newline at end of file +#endif From 71fe973190610bf155d864c71b8b326bc1b74eab Mon Sep 17 00:00:00 2001 From: Simon Dagfinrud Date: Wed, 19 Sep 2018 20:42:58 +0200 Subject: [PATCH 012/505] Keyboard: Add ISO-NOR keymap for TADA68 (#3944) --- keyboards/tada68/keymaps/iso-nor/config.h | 1 + keyboards/tada68/keymaps/iso-nor/keymap.c | 51 ++++++++++++++++++++++ keyboards/tada68/keymaps/iso-nor/readme.md | 17 ++++++++ keyboards/tada68/keymaps/iso-nor/rules.mk | 21 +++++++++ 4 files changed, 90 insertions(+) create mode 100644 keyboards/tada68/keymaps/iso-nor/config.h create mode 100644 keyboards/tada68/keymaps/iso-nor/keymap.c create mode 100644 keyboards/tada68/keymaps/iso-nor/readme.md create mode 100644 keyboards/tada68/keymaps/iso-nor/rules.mk diff --git a/keyboards/tada68/keymaps/iso-nor/config.h b/keyboards/tada68/keymaps/iso-nor/config.h new file mode 100644 index 000000000000..6f70f09beec2 --- /dev/null +++ b/keyboards/tada68/keymaps/iso-nor/config.h @@ -0,0 +1 @@ +#pragma once diff --git a/keyboards/tada68/keymaps/iso-nor/keymap.c b/keyboards/tada68/keymaps/iso-nor/keymap.c new file mode 100644 index 000000000000..2e6a80750f7a --- /dev/null +++ b/keyboards/tada68/keymaps/iso-nor/keymap.c @@ -0,0 +1,51 @@ +#include QMK_KEYBOARD_H + +#define _BL 0 +#define _FL 1 + +#define _______ KC_TRNS + +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| +| '|Backspa | ´| + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| Å| ¨| Ent-|Del | + * |-------------------------------------------------------| er|----| + * |CAPS | A| S| D| F| G| H| J| K| L| Ø| Æ| @ | |PgUp| + * |----------------------------------------------------------------| + * |Shif| <>| Z| X| C| V| B| N| M| ,| .| -| Shift| Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Alt |Cmd | Space |Alt| FN|Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + */ + [_BL] = LAYOUT_iso( + 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_GRV, KC_BSPC, KC_EQL, \ + 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_NUHS, KC_DEL, \ + 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_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_PGDN, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + + /* Keymap _FL1: Function Layer + * ,----------------------------------------------------------------. + * | | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| RESET|PSCR| + * |----------------------------------------------------------------| + * | | | Up| | | | | | | | |BL-|BL+|BL | INS| + * |----------------------------------------------------------------| + * | |Lef|Dow|Rig| | | | | | PP|PLA| PN| | |HOME| + * |----------------------------------------------------------------| + * | | | | | | | | | | V-| MV| V+| | | END| + * |----------------------------------------------------------------| + * | | | | | | | | | | | + * `----------------------------------------------------------------' + */ + [_FL] = LAYOUT_iso( + _______, 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_PSCR, \ + _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, BL_INC, BL_TOGG, KC_INS, \ + _______, KC_LEFT, KC_DOWN,KC_RIGHT, _______, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, KC_HOME, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, _______, KC_END, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +}; diff --git a/keyboards/tada68/keymaps/iso-nor/readme.md b/keyboards/tada68/keymaps/iso-nor/readme.md new file mode 100644 index 000000000000..5ade71ab4d91 --- /dev/null +++ b/keyboards/tada68/keymaps/iso-nor/readme.md @@ -0,0 +1,17 @@ +# TADA68 layout for ISO-NOR + +> An ISO-style layout for Norwegian keyboards. + +This layout was specifically made for Norwegian keyboards (i.e. includes `Æ`, `Ø` and `Å`), and is tested on a TADA68 purchased from [kbdfans](https://kbdfans.cn/) in September 2018. + +### Specifics + +As it's an ISO style keymap, it works with the fat double-row `Enter` key and the narrower left `Shift` and `<>` key. In addition, it switches the `'` key and the `´` key since the latter one is less common in Norwegian, and the first one normally is placed where the `Escape` key is located on a TADA68. + +## Installation + +Please see the [tada68 readme](../../readme.md) using the following command + +``` +make tada68:iso-nor:bin +``` diff --git a/keyboards/tada68/keymaps/iso-nor/rules.mk b/keyboards/tada68/keymaps/iso-nor/rules.mk new file mode 100644 index 000000000000..4deca710b8a9 --- /dev/null +++ b/keyboards/tada68/keymaps/iso-nor/rules.mk @@ -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 \ No newline at end of file From c23233f41ab9221577fc83bbae0a230452a38231 Mon Sep 17 00:00:00 2001 From: Joe Wasson Date: Wed, 19 Sep 2018 16:13:58 -0700 Subject: [PATCH 013/505] Keymap: Talljoe's keymap for oddball keyboards (#3910) * Create layout for JD45 * Tweak layout to better support JD45 and add more tap dancing. * Add Maltron and tweak layout for 40% enter compatibility. * Switch back to `BL_TOGGLE` for backlight. * More tweaks * Rename talljoe_gherkin to talljoe-gherkin * Make NAV layer tab C_S_T also. * Add missing RESET key. * Add Talljoe layout for minivan. * MTI is not for me * Tweak keymap. * Add talljoe keymap to Atreus. * Minor tweaks. * Fix talljoe keymaps to work with new Zeal60 commit. --- .../atreus/keymaps/talljoe-atreus/config.h | 42 +++++ .../atreus/keymaps/talljoe-atreus/keymap.c | 1 + .../atreus/keymaps/talljoe-atreus/rules.mk | 1 + .../config.h | 0 .../keymap.c | 0 .../rules.mk | 0 keyboards/jd45/keymaps/talljoe/config.h | 22 +++ keyboards/jd45/keymaps/talljoe/keymap.c | 1 + .../tv44/keymaps/talljoe-minivan/config.h | 53 +++++++ .../tv44/keymaps/talljoe-minivan/keymap.c | 1 + .../tv44/keymaps/talljoe-minivan/rules.mk | 3 + keyboards/zeal60/rules.mk | 3 +- .../60_ansi_split_bs_rshift/talljoe/keymap.c | 25 +-- .../60_ansi_split_bs_rshift/talljoe/rules.mk | 1 + .../talljoe/solarized.c | 23 +++ .../talljoe/solarized.h | 27 ++++ users/talljoe/config.h | 2 +- users/talljoe/talljoe.c | 53 ++++--- users/talljoe/talljoe.h | 76 +++++++-- users/talljoe/tapdance.c | 148 +++++++++++++++--- 20 files changed, 417 insertions(+), 65 deletions(-) create mode 100644 keyboards/atreus/keymaps/talljoe-atreus/config.h create mode 100644 keyboards/atreus/keymaps/talljoe-atreus/keymap.c create mode 100644 keyboards/atreus/keymaps/talljoe-atreus/rules.mk rename keyboards/gherkin/keymaps/{talljoe_gherkin => talljoe-gherkin}/config.h (100%) rename keyboards/gherkin/keymaps/{talljoe_gherkin => talljoe-gherkin}/keymap.c (100%) rename keyboards/gherkin/keymaps/{talljoe_gherkin => talljoe-gherkin}/rules.mk (100%) create mode 100644 keyboards/jd45/keymaps/talljoe/config.h create mode 100644 keyboards/jd45/keymaps/talljoe/keymap.c create mode 100644 keyboards/tv44/keymaps/talljoe-minivan/config.h create mode 100644 keyboards/tv44/keymaps/talljoe-minivan/keymap.c create mode 100644 keyboards/tv44/keymaps/talljoe-minivan/rules.mk create mode 100644 layouts/community/60_ansi_split_bs_rshift/talljoe/rules.mk create mode 100644 layouts/community/60_ansi_split_bs_rshift/talljoe/solarized.c create mode 100644 layouts/community/60_ansi_split_bs_rshift/talljoe/solarized.h diff --git a/keyboards/atreus/keymaps/talljoe-atreus/config.h b/keyboards/atreus/keymaps/talljoe-atreus/config.h new file mode 100644 index 000000000000..87b68ffc6520 --- /dev/null +++ b/keyboards/atreus/keymaps/talljoe-atreus/config.h @@ -0,0 +1,42 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include QMK_KEYBOARD_CONFIG_H + +#define PREVENT_STUCK_MODIFIERS +#define SPACE_COUNT 2 + +#define TEMPLATE( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \ + 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, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ +) LAYOUT( \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, \ + K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, \ + K10, K41, K42, K30, K44, K1D, K20, K45, K3C, K0D, K2B, K3D \ +) + +#define TEMPLATE_NUM( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \ + 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, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ +) LAYOUT( \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, \ + K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, \ + K10, K41, K42, K30, K44, K1D, K20, K45, K48, K49, K2B, K3D \ +) + + +#define TEMPLATE_RESET LAYOUT( \ + RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \ +) +#endif diff --git a/keyboards/atreus/keymaps/talljoe-atreus/keymap.c b/keyboards/atreus/keymaps/talljoe-atreus/keymap.c new file mode 100644 index 000000000000..7812add812b3 --- /dev/null +++ b/keyboards/atreus/keymaps/talljoe-atreus/keymap.c @@ -0,0 +1 @@ +// This space intentionally left blank diff --git a/keyboards/atreus/keymaps/talljoe-atreus/rules.mk b/keyboards/atreus/keymaps/talljoe-atreus/rules.mk new file mode 100644 index 000000000000..92007fe8ad71 --- /dev/null +++ b/keyboards/atreus/keymaps/talljoe-atreus/rules.mk @@ -0,0 +1 @@ +USER_NAME := talljoe diff --git a/keyboards/gherkin/keymaps/talljoe_gherkin/config.h b/keyboards/gherkin/keymaps/talljoe-gherkin/config.h similarity index 100% rename from keyboards/gherkin/keymaps/talljoe_gherkin/config.h rename to keyboards/gherkin/keymaps/talljoe-gherkin/config.h diff --git a/keyboards/gherkin/keymaps/talljoe_gherkin/keymap.c b/keyboards/gherkin/keymaps/talljoe-gherkin/keymap.c similarity index 100% rename from keyboards/gherkin/keymaps/talljoe_gherkin/keymap.c rename to keyboards/gherkin/keymaps/talljoe-gherkin/keymap.c diff --git a/keyboards/gherkin/keymaps/talljoe_gherkin/rules.mk b/keyboards/gherkin/keymaps/talljoe-gherkin/rules.mk similarity index 100% rename from keyboards/gherkin/keymaps/talljoe_gherkin/rules.mk rename to keyboards/gherkin/keymaps/talljoe-gherkin/rules.mk diff --git a/keyboards/jd45/keymaps/talljoe/config.h b/keyboards/jd45/keymaps/talljoe/config.h new file mode 100644 index 000000000000..f8b0333cfb38 --- /dev/null +++ b/keyboards/jd45/keymaps/talljoe/config.h @@ -0,0 +1,22 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include QMK_KEYBOARD_CONFIG_H + +#define PREVENT_STUCK_MODIFIERS +#define SPACE_COUNT 2 + +#define TEMPLATE( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \ + 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, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ +) { \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K0D, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2C, KC_NO }, \ + { K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, KC_NO }, \ + { K40, K00, K41, K42, K44, KC_NO, K45, KC_NO, K48, K49, K3D, K4C, KC_NO } \ +} + +#endif diff --git a/keyboards/jd45/keymaps/talljoe/keymap.c b/keyboards/jd45/keymaps/talljoe/keymap.c new file mode 100644 index 000000000000..7812add812b3 --- /dev/null +++ b/keyboards/jd45/keymaps/talljoe/keymap.c @@ -0,0 +1 @@ +// This space intentionally left blank diff --git a/keyboards/tv44/keymaps/talljoe-minivan/config.h b/keyboards/tv44/keymaps/talljoe-minivan/config.h new file mode 100644 index 000000000000..fa1f43adce19 --- /dev/null +++ b/keyboards/tv44/keymaps/talljoe-minivan/config.h @@ -0,0 +1,53 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +#include QMK_KEYBOARD_CONFIG_H + +#define SPACE_COUNT 2 + +#define TEMPLATE( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \ + 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, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ +) KEYMAP_ARROW( \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K0D, \ + K41, K49, K42, K44, K45, K3C, K0B, K00, K3D \ +) + +#define TEMPLATE_ALT( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \ + 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, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ +) KEYMAP_ARROW( \ + K00, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2C, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \ + K41, K49, K42, K44, K45, K48, K49, K4B, K4C \ +) + +#define TEMPLATE_ADJUST( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K2D, \ + 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, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ +) KEYMAP_ARROW( \ + K00, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K2D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2C, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \ + K40, K49, K42, K44, K45, K48, K0B, K0C, K4C \ +) + +#define TEMPLATE_RESET KEYMAP_ARROW( \ + RESET, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RESET, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RESET) + +#endif diff --git a/keyboards/tv44/keymaps/talljoe-minivan/keymap.c b/keyboards/tv44/keymaps/talljoe-minivan/keymap.c new file mode 100644 index 000000000000..7812add812b3 --- /dev/null +++ b/keyboards/tv44/keymaps/talljoe-minivan/keymap.c @@ -0,0 +1 @@ +// This space intentionally left blank diff --git a/keyboards/tv44/keymaps/talljoe-minivan/rules.mk b/keyboards/tv44/keymaps/talljoe-minivan/rules.mk new file mode 100644 index 000000000000..a4e40d0ba68b --- /dev/null +++ b/keyboards/tv44/keymaps/talljoe-minivan/rules.mk @@ -0,0 +1,3 @@ +USER_NAME := talljoe + +COMMAND_ENABLE = no # Commands for debug and configuration diff --git a/keyboards/zeal60/rules.mk b/keyboards/zeal60/rules.mk index c4686f9852bd..f099ea9fdd5e 100644 --- a/keyboards/zeal60/rules.mk +++ b/keyboards/zeal60/rules.mk @@ -53,7 +53,7 @@ BOOTLOADER = atmel-dfu OPT_DEFS += -DNO_SUSPEND_POWER_DOWN # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# 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) @@ -76,3 +76,4 @@ RAW_ENABLE = yes DYNAMIC_KEYMAP_ENABLE = yes CIE1931_CURVE = yes +LAYOUTS = 60_ansi 60_iso 60_hhkb 60_ansi_split_bs_rshift diff --git a/layouts/community/60_ansi_split_bs_rshift/talljoe/keymap.c b/layouts/community/60_ansi_split_bs_rshift/talljoe/keymap.c index b5dc54492761..cfad9da8a31f 100644 --- a/layouts/community/60_ansi_split_bs_rshift/talljoe/keymap.c +++ b/layouts/community/60_ansi_split_bs_rshift/talljoe/keymap.c @@ -1,7 +1,7 @@ #ifdef KEYBOARD_zeal60 #include "config.h" #include "zeal60.h" -#include "zeal_backlight.h" +#include "rgb_backlight.h" #include "action_layer.h" #include "solarized.h" #include "talljoe.h" @@ -9,7 +9,7 @@ // from zeal_backlight.c // we want to be able to set indicators for the spacebar stabs // but they are not represented by a row/index. -extern zeal_backlight_config g_config; +extern backlight_config g_config; void map_row_column_to_led( uint8_t row, uint8_t column, uint8_t *led ); void set_backlight_defaults(void) { @@ -17,7 +17,7 @@ void set_backlight_defaults(void) { uint8_t caps_lock; map_row_column_to_led(3, 12, &caps_lock); map_row_column_to_led(4, 7, &space); - zeal_backlight_config default_values = { + backlight_config default_values = { .use_split_backspace = USE_SPLIT_BACKSPACE, .use_split_left_shift = USE_SPLIT_LEFT_SHIFT, .use_split_right_shift = USE_SPLIT_RIGHT_SHIFT, @@ -34,15 +34,17 @@ void set_backlight_defaults(void) { .layer_2_indicator = { .index = space, .color = solarized.yellow }, .layer_3_indicator = { .index = 254, .color = solarized.red }, .alphas_mods = { - BACKLIGHT_ALPHAS_MODS_ROW_0, - BACKLIGHT_ALPHAS_MODS_ROW_1, - BACKLIGHT_ALPHAS_MODS_ROW_2, - BACKLIGHT_ALPHAS_MODS_ROW_3, - BACKLIGHT_ALPHAS_MODS_ROW_4 } + RGB_BACKLIGHT_ALPHAS_MODS_ROW_0, + RGB_BACKLIGHT_ALPHAS_MODS_ROW_1, + RGB_BACKLIGHT_ALPHAS_MODS_ROW_2, + RGB_BACKLIGHT_ALPHAS_MODS_ROW_3, + RGB_BACKLIGHT_ALPHAS_MODS_ROW_4 } }; - memcpy(&g_config, &default_values, sizeof(zeal_backlight_config)); + memcpy(&g_config, &default_values, sizeof(backlight_config)); backlight_config_save(); +#undef CUSTOM_RGB_LAYOUTS +#ifdef CUSTOM_RGB_LAYOUTS solarized_t* S = &solarized; HSV alphas = S->base2; HSV custom_color_map[MATRIX_ROWS][MATRIX_COLS] = CM( @@ -54,9 +56,12 @@ void set_backlight_defaults(void) { ); for (uint8_t row = 0; row < MATRIX_ROWS; ++row) { for (uint8_t col = 0; col < MATRIX_COLS; ++col) { - backlight_set_key_color(row, col, custom_color_map[row][col]); + uint8_t index; + map_row_column_to_led( row, col, &index ); + set_key_color(index, custom_color_map[row][col]); } } +#endif // CUSTOM_RGB_LAYOUTS } bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { diff --git a/layouts/community/60_ansi_split_bs_rshift/talljoe/rules.mk b/layouts/community/60_ansi_split_bs_rshift/talljoe/rules.mk new file mode 100644 index 000000000000..239f03091a9e --- /dev/null +++ b/layouts/community/60_ansi_split_bs_rshift/talljoe/rules.mk @@ -0,0 +1 @@ +SRC += $(KEYMAP_PATH)/solarized.c diff --git a/layouts/community/60_ansi_split_bs_rshift/talljoe/solarized.c b/layouts/community/60_ansi_split_bs_rshift/talljoe/solarized.c new file mode 100644 index 000000000000..3e9e726b9535 --- /dev/null +++ b/layouts/community/60_ansi_split_bs_rshift/talljoe/solarized.c @@ -0,0 +1,23 @@ +#include "solarized.h" + +#define MAKE_COLOR(_H, _S, _V) \ + { .h = (((uint32_t)_H) * 255) / 360, .s = (((uint16_t)_S) * 255) / 100, .v = (((uint16_t)_V) * 255) / 100 } + +solarized_t solarized = { + .base03 = MAKE_COLOR(193, 100, 21), + .base02 = MAKE_COLOR(192, 90, 26), + .base01 = MAKE_COLOR(194, 25, 46), + .base00 = MAKE_COLOR(195, 23, 51), + .base0 = MAKE_COLOR(186, 13, 59), + .base1 = MAKE_COLOR(180, 9, 63), + .base2 = MAKE_COLOR( 44, 11, 93), + .base3 = MAKE_COLOR( 44, 10, 99), + .yellow = MAKE_COLOR( 45, 100, 71), + .orange = MAKE_COLOR( 18, 89, 80), + .red = MAKE_COLOR( 1, 79, 86), + .magenta = MAKE_COLOR(331, 74, 83), + .violet = MAKE_COLOR(237, 45, 77), + .blue = MAKE_COLOR(205, 82, 82), + .cyan = MAKE_COLOR(175, 74, 63), + .green = MAKE_COLOR( 68, 100, 60), +}; diff --git a/layouts/community/60_ansi_split_bs_rshift/talljoe/solarized.h b/layouts/community/60_ansi_split_bs_rshift/talljoe/solarized.h new file mode 100644 index 000000000000..3b00caea7037 --- /dev/null +++ b/layouts/community/60_ansi_split_bs_rshift/talljoe/solarized.h @@ -0,0 +1,27 @@ +#ifndef SOLARIZED_H +#define SOLARIZED_H + +#include "quantum/color.h" + +typedef struct { + HSV base03; + HSV base02; + HSV base01; + HSV base00; + HSV base0; + HSV base1; + HSV base2; + HSV base3; + HSV yellow; + HSV orange; + HSV red; + HSV magenta; + HSV violet; + HSV blue; + HSV cyan; + HSV green; +} solarized_t; + +extern solarized_t solarized; + +#endif diff --git a/users/talljoe/config.h b/users/talljoe/config.h index 1cdbb5a412fe..0d06a0b12d8a 100644 --- a/users/talljoe/config.h +++ b/users/talljoe/config.h @@ -1,7 +1,7 @@ #ifndef USERSPACE_CONFIG_H #define USERSPACE_CONFIG_H -#define IGNORE_MOD_TAP_INTERRUPT +#define PERMISSIVE_HOLD #define RESET_LAYER 15 diff --git a/users/talljoe/talljoe.c b/users/talljoe/talljoe.c index e9c69b016aea..7a343e7768c5 100644 --- a/users/talljoe/talljoe.c +++ b/users/talljoe/talljoe.c @@ -5,10 +5,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = TEMPLATE_TKL( 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, MO_ADJ , - 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_BSLS, KC_INS , KC_HOME, KC_PGUP, - 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_DEL , KC_END , KC_PGDN, - US_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G , KC_H, KC_J, KC_K, KC_L, US_SCLN, US_QUOT, US_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_UP , + US_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 , US_BSLS, KC_INS , KC_HOME, KC_PGUP, + US_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_DEL , KC_END , KC_PGDN, + CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G , KC_H, KC_J, KC_K, KC_L, US_SCLN, US_QUOT, US_ENT , + SH_LBRC, KC_Z, KC_X, KC_C, KC_V, KC_B , KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SH_RBRC, KC_UP , KC_LCTL, KC_LGUI, KC_LALT, KC_SPC2, KC_SPC1, KC_SPC3, KC_RALT, KC_RGUI, KC_RCTL, KC_PTT , KC_LEFT, KC_DOWN, KC_RGHT), [_WORKMAN] = TEMPLATE( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -34,41 +34,44 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, KC_A, KC_R, KC_S, KC_T, KC_D , KC_H, KC_N, KC_E, KC_I, KC_O , _______, _______, _______, KC_Z, KC_X, KC_C, KC_V, KC_B , KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), - +#if (SPACE_COUNT > 1) + // A tweaked version of the Maltron layout + [_MALTROFF] = TEMPLATE( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_Q, KC_P, KC_Y, KC_G, KC_B , KC_J, KC_M, KC_U, KC_K, KC_L, _______, _______, _______, + _______, KC_A, KC_N, KC_I, KC_S, KC_F , KC_D, KC_T, KC_H, KC_O, KC_R , US_ENT , KC_BSPC, + _______, KC_Z, KC_X, KC_C, KC_V, US_QUOT, KC_SCLN, KC_W, KC_COMM, KC_DOT, KC_SLSH, _______, _______, + _______, _______, _______, MLT_E , _______, _______, _______, _______, _______, _______), +#endif #ifdef ENABLE_GAME_LAYER [_GAME] = TEMPLATE( 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, MO_NAV , 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_ADJ , - KC_LCTL, KC_PTT , KC_PGDN, KC_SPC , KC_SPC , KC_SPC , KC_RALT, KC_APP , KC_RCTL, KC_PTT ), + KC_LCTL, KC_PTT , KC_PGDN, KC_SPC , KC_SPC , KC_SPC , KC_RALT, KC_APP , KC_RCTL, KC_PTT ), #endif - [_NAV] = TEMPLATE( + [_NAV] = TEMPLATE_NAV( KC_GRV , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_TAB , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_VOLU, KC_INS , KC_PGUP, KC_UP , KC_PGDN, KC_BTN1, KC_BTN2, KC_BTN3, KC_DEL , - US_CAPS, KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_MUTE, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END , KC_RCTL, TG_ADJ , - KC_LSFT, KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_VOLD, KC_END , KC_PGDN, KC_WBAK, KC_WFWD, KC_WREF, KC_RSFT, KC_APP , + US_TAB , KC_EXLM, KC_AT , KC_HASH, KC_DLR , KC_PERC, KC_INS , KC_PGUP, KC_UP , KC_PGDN, KC_BTN1, KC_BTN3, KC_BTN2, KC_DEL , + CTL_ESC, KC_LCBR, KC_RCBR, KC_LPRN, KC_RPRN, KC_AMPR, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END , US_QUOT, TG_ADJ , + KC_LSFT, KC_EQL, KC_PLUS, KC_MINS, KC_UNDS, KC_ASTR, KC_CALC, US_GRV , KC_WBAK, KC_WFWD, KC_WREF, KC_RSFT, KC_APP , KC_LCTL, KC_LGUI, KC_LALT, NV_SPC2, NV_SPC1, NV_SPC3, KC_RALT, KC_RGUI, KC_RCTL, KC_PTT ), - [_NUM] = TEMPLATE( + [_NUM] = TEMPLATE_NUM( XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - KC_GRV , KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, XXXXXXX, KC_DEL , - US_CAPS, KC_LCBR, KC_RCBR, KC_LPRN, KC_RPRN, KC_LBRC, KC_RBRC, KC_4, KC_5, KC_6, KC_PPLS, KC_PENT, XXXXXXX, - KC_LSFT, KC_EQL, KC_PLUS, KC_BSLS, KC_PIPE, KC_SCLN, XXXXXXX, KC_1, KC_2, KC_3, KC_PAST, KC_PSLS, XXXXXXX, + KC_GRV , KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_VOLU, KC_CIRC, KC_7, KC_8, KC_9, KC_PMNS, XXXXXXX, XXXXXXX, KC_DEL , + CTL_ESC, KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_MUTE, KC_PENT, KC_4, KC_5, KC_6, KC_PPLS, XXXXXXX, KC_ENT , + KC_LSFT, KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_VOLD, KC_PIPE, KC_1, KC_2, KC_3, KC_PAST, KC_PSLS, TG_NUM , KC_LCTL, KC_LGUI, KC_LALT, NM_SPC2, NM_SPC1, NM_SPC3, KC_PDOT, KC_PCMM, KC_RCTL, KC_PTT ), // Adjust layer is on the split-shift key; or NAV+Enter (for non-split keyboards) - [_ADJUST] = TEMPLATE( - MO_RST , FX(1) , FX(2) , FX(3) , FX(4) , FX(5) , FX(6) , FX(7) , FX(8) , FX(9) , FX(10) , BR_DEC , BR_INC , XXXXXXX, MO_RST , - XXXXXXX, H1_INC , S1_INC , H2_INC , S2_INC , EF_INC , RGB_HUI, RGB_SAI, RGB_MOD, RGB_M_P, DFAULTS, RGB_VAD, RGB_VAI, KC_DEL , + [_ADJUST] = TEMPLATE_ADJUST( + MO_RST , FX(1) , FX(2) , FX(3) , FX(4) , FX(5) , FX(8) , FX(9) , FX(10) , FX(20) , FX(0) , BR_DEC , BR_INC , XXXXXXX, MO_RST , + MO_RST , H1_INC , S1_INC , H2_INC , S2_INC , EF_INC , RGB_HUI, RGB_SAI, RGB_MOD, RGB_M_P, DFAULTS, RGB_VAD, RGB_VAI, MO_RST , XXXXXXX, H1_DEC , S1_DEC , H2_DEC , S2_DEC , EF_DEC , RGB_HUD, RGB_SAD, RGB_RMOD,RGB_M_K, RGB_M_B, RGB_M_G, TG_ADJ , - TG_NKRO, LY_QWER, LY_WORK, LY_NRMN, LY_DVRK, LY_CLMK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MAKE, KC_CAPS, XXXXXXX, - MO_RST , AG_NORM, AG_SWAP, XXXXXXX, BL_STEP, XXXXXXX, RGB_TOG, XXXXXXX, XXXXXXX, TG_GAME), + TG_NKRO, LY_QWER, LY_WORK, LY_NRMN, LY_DVRK, LY_CLMK, XXXXXXX, LY_MALT, XXXXXXX, XXXXXXX, KC_MAKE, KC_CAPS, XXXXXXX, + MO_RST , AG_SWAP, AG_NORM, XXXXXXX, BL_TOGG, XXXXXXX, RGB_TOG, XXXXXXX, XXXXXXX, TG_GAME), // To Reset hit FN + ` + Esc - [_RESET] = TEMPLATE( - RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET , - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - RESET , XXXXXXX, XXXXXXX, XXXXXXX, KC_SLEP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX), + [_RESET] = TEMPLATE_RESET, }; void matrix_scan_user(void) { diff --git a/users/talljoe/talljoe.h b/users/talljoe/talljoe.h index 7c34cd41ff46..4436c0a0440d 100644 --- a/users/talljoe/talljoe.h +++ b/users/talljoe/talljoe.h @@ -8,7 +8,7 @@ enum userspace_custom_keycodes { DFAULTS, TOGGLE_BACKLIGHT, EFFECT, - EFFECT_END = EFFECT + 10 + EFFECT_END = EFFECT + 20 }; #ifndef RESET_LAYER @@ -21,6 +21,7 @@ enum layers { _NORMAN, _DVORAK, _COLMAK, + _MALTROFF, _GAME, _NAV, _NUM, @@ -29,7 +30,9 @@ enum layers { }; enum tap_dancers { - TD_SEMICOLON + TD_SEMICOLON, + TD_GRAVE, + TD_QUOTE, }; #define _______ KC_TRNS @@ -39,6 +42,7 @@ enum tap_dancers { #define MO_ADJ MO(_ADJUST) #define MO_RST MO(_RESET) #define TG_ADJ TG(_ADJUST) +#define TG_NUM TG(_NUM) #ifdef ENABLE_GAME_LAYER #define TG_GAME TG(_GAME) #else @@ -49,16 +53,28 @@ enum tap_dancers { #define LY_NRMN DF(_NORMAN) #define LY_DVRK DF(_DVORAK) #define LY_CLMK DF(_COLMAK) +#if SPACE_COUNT >= 2 + #define LY_MALT DF(_MALTROFF) +#else + #define LY_MALT KC_NO +#endif #define TG_NKRO MAGIC_TOGGLE_NKRO #define KC_PTT KC_F24 #define MS_MID KC_MS_BTN3 #define FX(x) (EFFECT + x) -#define US_CAPS CTL_T(KC_ESC) -#define US_QUOT RCTL_T(KC_QUOT) +#define CTL_ESC CTL_T(KC_ESC) +#define US_ENT RCTL_T(KC_ENT) #define US_MINS RCTL_T(KC_QUOT) +#define US_BSLS LCA_T(KC_BSLS) #define US_SCLN TD(TD_SEMICOLON) -#define US_ENT LT(_NUM, KC_ENT) +#define US_GRV TD(TD_GRAVE) +#define US_QUOT TD(TD_QUOTE) +#define US_TAB C_S_T(KC_TAB) +#define SH_LBRC LSFT_T(KC_LBRC) +#define SH_RBRC RSFT_T(KC_RBRC) + +#define MLT_E LT(_NUM, KC_E) #ifndef SPACE_COUNT #define SPACE_COUNT 1 @@ -75,17 +91,34 @@ enum tap_dancers { #define NM_SPC1 _______ #define NM_SPC2 _______ #define NM_SPC3 _______ +#elif (SPACE_COUNT == 2) + #define KC_SPC1 LT(_NAV,KC_SPC) + #define KC_SPC2 LT(_NUM,KC_ENT) + + #define NV_SPC1 KC_SPC + #define NV_SPC2 KC_ENT + + #define NM_SPC1 KC_0 + #define NM_SPC2 KC_SPC + + #define KC_SPC3 XXXXXXX + #define NV_SPC3 XXXXXXX + #define NM_SPC3 XXXXXXX #elif (SPACE_COUNT == 3) - #define KC_SPC1 KC_BSPC + #ifdef SWAP_HANDS_ENABLE + #define KC_SPC1 SH_T(KC_BSPC) + #else + #define KC_SPC1 KC_BSPC + #endif #define KC_SPC2 LT(_NUM,KC_ENT) #define KC_SPC3 LT(_NAV,KC_SPC) #define NV_SPC1 KC_SPC - #define NV_SPC2 C_S_T(KC_ENT) + #define NV_SPC2 KC_ENT #define NV_SPC3 KC_SPC - #define NM_SPC2 XXXXXXX #define NM_SPC1 KC_SPC + #define NM_SPC2 XXXXXXX #define NM_SPC3 KC_0 #else #error "Unsupported space count:" SPACE_COUNT @@ -110,7 +143,7 @@ enum tap_dancers { #define FN_MO2 KC_NO #endif -#ifdef TEMPLATE_TKL +#ifndef TEMPLATE #define _X_ KC_NO #define TEMPLATE( \ KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2, KJ6, \ @@ -126,7 +159,8 @@ enum tap_dancers { KN2, KJ1, KI1, KH1, KG1, KG0, KF0, KF1, KE1, KD1, KR0, KN3, _X_, \ KA4, KP2, KC6, KX1, KK6, KX2, KC0, KM3, KD0, KA1, _X_, _X_, _X_ \ ) -#else +#endif +#ifndef TEMPLATE_TKL #define TEMPLATE_TKL( \ 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, \ @@ -143,4 +177,26 @@ enum tap_dancers { ) #endif +#ifndef TEMPLATE_ALT + #define TEMPLATE_ALT TEMPLATE +#endif +#ifndef TEMPLATE_NUM + #define TEMPLATE_NUM TEMPLATE_ALT +#endif +#ifndef TEMPLATE_NAV + #define TEMPLATE_NAV TEMPLATE_ALT +#endif +#ifndef TEMPLATE_ADJUST + #define TEMPLATE_ADJUST TEMPLATE_ALT +#endif + +#ifndef TEMPLATE_RESET + #define TEMPLATE_RESET TEMPLATE_ALT( \ + RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET , \ + RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET , \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + RESET , XXXXXXX, XXXXXXX, XXXXXXX, RESET , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX) +#endif + #endif diff --git a/users/talljoe/tapdance.c b/users/talljoe/tapdance.c index 3198fc67f057..c4d6025f0f77 100644 --- a/users/talljoe/tapdance.c +++ b/users/talljoe/tapdance.c @@ -1,34 +1,146 @@ //Tap Dance #include "talljoe.h" -// Send semin-colon + enter on two taps -void tap_dance_semicolon(qk_tap_dance_state_t *state, void *user_data) { +enum { + SINGLE_TAP = 1, + SINGLE_HOLD = 2, + DOUBLE_TAP = 3, + DOUBLE_HOLD = 4, + DOUBLE_SINGLE_TAP = 5, //send two single taps + TRIPLE_TAP = 6, + TRIPLE_HOLD = 7, + SPECIAL = 8 +}; + +static struct { + int quote; + int semicolon; +} tap_state = {0}; + +int cur_dance (qk_tap_dance_state_t *state) { + if (state->count == 1) { + //If count = 1, and it has been interrupted - it doesn't matter if it is pressed or not: Send SINGLE_TAP + if (state->interrupted) { + // if (!state->pressed) return SINGLE_TAP; + //need "permissive hold" here. + // else return SINGLE_HOLD; + //If the interrupting key is released before the tap-dance key, then it is a single HOLD + //However, if the tap-dance key is released first, then it is a single TAP + //But how to get access to the state of the interrupting key???? + return SINGLE_TAP; + } + else { + if (!state->pressed) return SINGLE_TAP; + else return SINGLE_HOLD; + } + } + //If count = 2, and it has been interrupted - assume that user is trying to type the letter associated + //with single tap. + else if (state->count == 2) { + if (state->interrupted) return DOUBLE_SINGLE_TAP; + else if (state->pressed) return DOUBLE_HOLD; + else return DOUBLE_TAP; + } + else if ((state->count == 3) && ((state->interrupted) || (!state->pressed))) return TRIPLE_TAP; + else if (state->count == 3) return TRIPLE_HOLD; + else return SPECIAL; +} + +int hold_cur_dance (qk_tap_dance_state_t *state) { + if (state->count == 1) { + if (state->interrupted) { + if (!state->pressed) return SINGLE_TAP; + else return SINGLE_HOLD; + } + else { + if (!state->pressed) return SINGLE_TAP; + else return SINGLE_HOLD; + } + } + //If count = 2, and it has been interrupted - assume that user is trying to type the letter associated + //with single tap. + else if (state->count == 2) { + if (state->pressed) return DOUBLE_HOLD; + else return DOUBLE_TAP; + } + else if (state->count == 3) { + if (!state->pressed) return TRIPLE_TAP; + else return TRIPLE_HOLD; + } + else return SPECIAL; +} + +// Send semi-colon + enter on two taps +void tap_dance_semicolon_finished(qk_tap_dance_state_t *state, void *user_data) { + tap_state.semicolon = hold_cur_dance(state); + switch (tap_state.semicolon) { + case SINGLE_TAP: case DOUBLE_HOLD: register_code(KC_SCLN); break; + case SINGLE_HOLD: layer_on(_NUM); break; + } +} + +void tap_dance_semicolon_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (tap_state.semicolon) { + case SINGLE_TAP: case DOUBLE_HOLD: unregister_code(KC_SCLN); break; + case DOUBLE_TAP: { + if (get_mods()) { + SEND_STRING(";;"); // send normal when mods are pressed + } + else { + SEND_STRING(";\n"); + } + break; + } + case TRIPLE_TAP: { + SEND_STRING(";\n\n"); + } + case SPECIAL: layer_invert(_NUM); break; + case SINGLE_HOLD: layer_off(_NUM); break; + } + tap_state.semicolon = 0; +} + +// Send `. ~. ``` +void tap_dance_grave_finished(qk_tap_dance_state_t *state, void *user_data) { switch(state->count) { case 1: - register_code(KC_SCLN); - unregister_code(KC_SCLN); + SEND_STRING("`"); break; case 2: - register_code(KC_SCLN); - unregister_code(KC_SCLN); + SEND_STRING("~"); + break; + } +} - uint8_t mods = get_mods(); - if (mods) { - clear_mods(); - } +void tap_dance_grave_each(qk_tap_dance_state_t *state, void *user_data) { + if(state->count == 3) { + SEND_STRING("```"); + } else if (state->count > 3) { + SEND_STRING("`"); + } +} - register_code(KC_ENT); - unregister_code(KC_ENT); - if (mods) { - set_mods(mods); - } +void tap_dance_quote_finished(qk_tap_dance_state_t *state, void *user_data) { + tap_state.quote = hold_cur_dance(state); + switch (tap_state.quote) { + case SINGLE_TAP: case DOUBLE_HOLD: register_code(KC_QUOT); break; + case SINGLE_HOLD: layer_on(_NAV); break; + } +} - reset_tap_dance(state); - break; +void tap_dance_quote_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (tap_state.quote) { + case SINGLE_TAP: case DOUBLE_HOLD: unregister_code(KC_QUOTE); break; + case DOUBLE_TAP: SEND_STRING("\""); break; + case TRIPLE_TAP: layer_invert(_NAV); break; + case SINGLE_HOLD: layer_off(_NAV); break; } + tap_state.quote = 0; } qk_tap_dance_action_t tap_dance_actions[] = { - [TD_SEMICOLON] = ACTION_TAP_DANCE_FN(tap_dance_semicolon), + [TD_SEMICOLON] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tap_dance_semicolon_finished, tap_dance_semicolon_reset), + [TD_GRAVE] = ACTION_TAP_DANCE_FN_ADVANCED(tap_dance_grave_each, tap_dance_grave_finished, NULL), + [TD_QUOTE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tap_dance_quote_finished, tap_dance_quote_reset), }; From 14f691d2a749c6f4fd9bf39d219da1369747cd8d Mon Sep 17 00:00:00 2001 From: Mat Greten Date: Wed, 19 Sep 2018 17:15:13 -0600 Subject: [PATCH 014/505] Keymap: meagerfindings ergodox (#3920) * initial commit * updating after review --- .../ergodox/meagerfindings/README.md | 109 ++++ .../community/ergodox/meagerfindings/config.h | 26 + .../community/ergodox/meagerfindings/keymap.c | 558 ++++++++++++++++++ .../community/ergodox/meagerfindings/rules.mk | 3 + 4 files changed, 696 insertions(+) create mode 100644 layouts/community/ergodox/meagerfindings/README.md create mode 100644 layouts/community/ergodox/meagerfindings/config.h create mode 100644 layouts/community/ergodox/meagerfindings/keymap.c create mode 100644 layouts/community/ergodox/meagerfindings/rules.mk diff --git a/layouts/community/ergodox/meagerfindings/README.md b/layouts/community/ergodox/meagerfindings/README.md new file mode 100644 index 000000000000..e7e4270db93c --- /dev/null +++ b/layouts/community/ergodox/meagerfindings/README.md @@ -0,0 +1,109 @@ +![Base](https://meagerfindings.com/assets/img/ergodox/base.png) + +# Meagerfinding's ErgoDox Layout + + + +- [Overview](#overview) +- [Credit where credit is due](#credit-where-credit-is-due) +- [Features](#features) + - [Tap/Hold Macro Keys](#taphold-macro-keys) + - [TapDance Keys](#tapdance-keys) +- [Base Layer](#base-layer) + - [Things to note:](#things-to-note) +- [Old Base Layer](#old-base-layer) +- [Symbols Layer](#symbols-layer) +- [Mouse & Media Keys Layer](#mouse-media-keys-layer) +- [Markdown Layer](#markdown-layer) +- [Arrow/Movements Layer](#arrowmovements-layer) +- [Numpad Layer](#numpad-layer) + + + +## Overview + +The overall goals of this layout are to: +1. Use the Ergodox thumb clusters to eliminate pinky reach. +2. Place as many useful keys under the home rows as possible. + +I first decided to build an ErgoDox as I wanted to use my thumbs for more with the added ergonomic benefits of a split board and ortholinear layout. I knew my hands were hurting from the weird contortions of copying and pasting constantly on my Mac, but I had no idea how strained I really was until I started moving as many modifier keys to the thumb clusters. + +## Credit where credit is due + +The initial layout used created on the [ErgoDox EZ Configurator](https://ergodox-ez.com/pages/graphical-configurator). I went through 26+ iterations within the configurator prior to beginning my journey with QMK itself. Much of the dual function/layer keys are influenced by and adapted from the EZ Configurator. + +Many features in this layout are either directly inspired by or are adaptations of [Algernon's incredible ErgoDox layout](https://github.com/algernon/ergodox-layout). Specifically: TapDance and its usage, and the brilliant idea of using TapDance to pair down the four keys for parens, brackets, and curly braces into just 2 keys. + +## Features + +### Tap/Hold Macro Keys +* `Paste/Paste Special` key sends Paste on tap and Paste Special when held. +* `Screen/Video` key sends `||scrn` when tapped and `||video` when held + - [Typinator](http://www.ergonis.com/products/typinator/) expands `||scrn` into `(Screenshot: )`, and `||video` into `(Video: )`, the QMK macro then moves back to before the last paren, inserts a space and removes a space to create a hyperlink for use in Zendesk. +* When tapped, `Todoist` toggles quick add window for a new Todoist task (`CMD + Shift + A`) and switches to Todoist when held +* The RubyMine key opens RubyMine by triggering spotlight, typing out `Rubymine`, and submitting the enter key. +* `Zendesk` triggers spotlight and then calls Typinator expansion to open my Zendesk Agent dashboard in Chrome. + + +### TapDance Keys +* `Copy/Cut` key copies on tap, cut's on two taps. +* One tap on `Snagit` key = sends `Ctrl + Shift + C` which is Snagit's selector and two taps on `Snagit` key = `Cmd + Shift + Opt + 4`, OS X cropping screenshot that is copied to the clipboard only. +* Tapping the `[{(`/`)}]` keys once yields `[` or `{` when the shift key is engaged, tapping them twice yields `(`. + +## Base Layer + +![Base](https://meagerfindings.com/assets/img/ergodox/base.png) + +The base layer retains the alphas from the QWERTY layout without any modifications. + +### Things to note: + +- The shift key is a One Shot Modifier key, meaning shift is not submitted when the key is tapped, instead, it only submits when you either tap it again, or on the next key press. + - There is no CAPSLOCK key designated as it is pretty comfortable to simply hold down shift in this layout and continue typing. +- There is only one layer that you can fully switch to on this layout, the [Old Base layer](#old-base-layer). All other layers require holding a key to reach them. For the most part, the key that toggles a layer, will be on the opposite hand that will be typing with that layer. + - For example: the symbols layer is reached by holding down the enter key with your right thumb, and most of the symbols are located on the left hand board. + + +## Old Base Layer + +![Old Base](https://meagerfindings.com/assets/img/ergodox/old_base.png) + +I am moving into a new position (software engineering) at work from a Support position. My hope is to use my F keys more often and write fewer emails. This is my old base layer, still easily accessible, as I'm not used to having F key's on my top row quite yet. + +## Symbols Layer + +![Symbols](https://meagerfindings.com/assets/img/ergodox/symbols.png) + +Holding down the `enter` key with your right thumb toggles the symbol layer. + +I've placed my most used symbols under the homerow. Granted, right now I mainly right emails/support ticket responses, so this home row may need to change as I transition to software engineering. + +## Mouse & Media Keys Layer + +![Mouse & Media](https://meagerfindings.com/assets/img/ergodox/mouse_media.png) + +Holding down the `:` key on with your right pinky toggles the mouse and media layer. Your left hand controls the mouse directions just in a similar fashion to the keys used in the [movement layer](#arrowmovements-layer). + +The right hand has a media controls under the homerow for quick muting/pausing. + +* `XKCD #1319` Key that ironically partially-automates accessing the link to [XKCD #1319](https://xkcd.com/1319/). + +## Markdown Layer + +![Markdown](https://meagerfindings.com/assets/img/ergodox/markdown.png) + +This layer places most common markdown symbols under the right hand. You can reach this layer by holding down the `F` key on your left hand. + +## Arrow/Movements Layer + +![Movement](https://meagerfindings.com/assets/img/ergodox/movement_arrows.png) + +Toggled by holding down the space key with the right thumb. This isn't vim like movement, nope, it's `WASD` but over one column. So I guess it's actually `ESDF` on the left hand and `IJKL` on the right hand to better line up with the columns offset/staggered columns on the Dox. + +## Numpad Layer + +![Numpad](https://meagerfindings.com/assets/img/ergodox/numpad.png) + +My right hand is pretty comfortable with tenkey number input so this is easily accessible by holding down backspace with the left thumb. + +Also, on the left hand, there is a tap to copy and hold to cut macro under the `D` key, and a tap to paste and a hold to paste special macro on the `F` key. I guess I'm to too lazy to move my fingers when copying/pasting... diff --git a/layouts/community/ergodox/meagerfindings/config.h b/layouts/community/ergodox/meagerfindings/config.h new file mode 100644 index 000000000000..3d4f11b43a36 --- /dev/null +++ b/layouts/community/ergodox/meagerfindings/config.h @@ -0,0 +1,26 @@ +#undef VENDOR_ID +#define VENDOR_ID 0xFEED +#undef PRODUCT_ID +#define PRODUCT_ID 0x1307 +#undef DEVICE_VER +#define DEVICE_VER 0x0001 +#undef MANUFACTURER +#define MANUFACTURER meagerfindings +#undef PRODUCT +#define PRODUCT ErgoDox +#undef DESCRIPTION +#define DESCRIPTION meagerfindings firmware for Ergodox + +#define USB_MAX_POWER_CONSUMPTION 500 + +#undef MOUSEKEY_INTERVAL +#define MOUSEKEY_INTERVAL 20 +#undef MOUSEKEY_DELAY +#define MOUSEKEY_DELAY 0 +#undef MOUSEKEY_TIME_TO_MAX +#define MOUSEKEY_TIME_TO_MAX 18 +#undef MOUSEKEY_MAX_SPEED +#define MOUSEKEY_MAX_SPEED 4 + +#undef TAPPING_TERM +#define TAPPING_TERM 200 diff --git a/layouts/community/ergodox/meagerfindings/keymap.c b/layouts/community/ergodox/meagerfindings/keymap.c new file mode 100644 index 000000000000..62504f9667a3 --- /dev/null +++ b/layouts/community/ergodox/meagerfindings/keymap.c @@ -0,0 +1,558 @@ +#include QMK_KEYBOARD_H +#include "version.h" + +enum { + BASE = 0, + OLD_BASE, + SYMBL, + MEDIA, + MKDWN, + ARROWS, + NUM, +}; + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + EPRM, + VRSN, + MD_LINK, + XKCD, + DBLE_ZER0, + L_ID_0, + L_ID_1, + L_ID_2, + PAST_PS, + TODO, + RUBYMINE, + ZENDESK, + DBLE_ASTR, + TRPLE_GRAVE, + H_ONE, + H_TWO, + H_THREE, + H_FOUR, + H_FIVE, + M_LINK, + M_GREATER, + TD_COPY_CUT = 6, + TD_SNAGIT = 8, + TD_B_L_SEL = 10, + CT_LBP = 11, + CT_RBP = 12 +}; + +//Redefine Key Names for Readaibilty +#define XXXXXXX KC_NO +#define SCRN_CLIPB LCTL(LGUI(LSFT(KC_4))) +#define CHRM_L LALT(LGUI(KC_LEFT)) //Move left one tab in Chrome +#define CHRM_R LALT(LGUI(KC_RIGHT)) //Move right one tab in Chrome +#define S_CMD_S LGUI_T(KC_S) //`S` when typing `CMD` when held +#define D_CMD_OPT LGUI_T(LALT_T(KC_D)) //`D` when typing `CMD + Opt` when held + +static uint16_t key_timer; //key timer for macros + +//Tap Dance Definitions +qk_tap_dance_action_t tap_dance_actions[] = { + //Tap once for Copy, twice for Paste, three times for Cut. + [TD_COPY_CUT] = ACTION_TAP_DANCE_DOUBLE(LGUI(KC_C),LGUI(KC_X)), + //Tap once for Snagit, twice for Cmd + Shift + Opt + 4 (OS X cropping screenshot that is copied to the clipboard only.) + [TD_SNAGIT] = ACTION_TAP_DANCE_DOUBLE(LCTL(LSFT(KC_C)), LCTL(LGUI(LSFT(KC_4)))), + [CT_LBP] = ACTION_TAP_DANCE_DOUBLE (KC_LBRC, KC_LPRN), + [CT_RBP] = ACTION_TAP_DANCE_DOUBLE (KC_RBRC, KC_RPRN) +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Keymap 0: Basic layer + * ,--------------------------------------------------. ,--------------------------------------------------. + * | = | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T | "> " | | []() | Y | U | I | O | P | \ | + * |--------+------+------+------+------+------| | | SCRN |------+------+------+------+------+--------| + * | Hyper | A |S /CMD|D/OPT | F /MD| G |------| |------| H | J |K/OPT |L /CMD| ; /L2| '/Hyper| + * |--------+------+------+------+------+------| ( | | ) |------+------+------+------+------+--------| + * |Shft Tab|Z/Ctrl|X/Alt | C | V | B | [ { | | ] } | N | M | , | ./Alt|//Ctrl|CMD+SHFT| + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | ` |Zendsk|RBMINE|CMD+S | ToDo | | _ | | 00 | 00 |OLD BASE| + * `----------------------------------' `----------------------------------' + * ,-------------. ,--------------. + * | Esc | Home | |Layer?| Esc | + * ,------|------|------| |------+-------+------. + * | | | End | | Undo | | | + * |Shift |Backsp|------| |------| Return|Space/| + * | OSM | /NUM | DEL | | Ctrl | /SYML |Arrows| + * `--------------------' `---------------------' + * + *Copy/Cut key copies on tap, cut's on two taps. + * + *One tap on Snagit key = is Ctrl + Shift + C which is Snagit's selector. + *Two taps on Snagit key = Cmd + Shift + Opt + 4 (OS X cropping screenshot that is copied to the clipboard only.) + */ + + [BASE] = LAYOUT_ergodox( + //left hand + KC_EQUAL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, M_GREATER, + OSM(MOD_HYPR), KC_A, S_CMD_S, ALT_T(KC_D), LT(MKDWN,KC_F), KC_G, + LSFT(KC_TAB), CTL_T(KC_Z), ALT_T(KC_X), KC_C, KC_V, KC_B, TD(CT_LBP), + KC_GRAVE, ZENDESK, RUBYMINE, LGUI(KC_S), TODO, + KC_ESCAPE, KC_HOME, + KC_END, + OSM(MOD_LSFT), LT(NUM,KC_BSPACE), LT(MKDWN,KC_DELETE), + + //right hand + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MINUS, + MD_LINK, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH, + KC_H, KC_J, ALT_T(KC_K), LGUI_T(KC_L), LT(MEDIA,KC_SCOLON), ALL_T(KC_QUOTE), + TD(CT_RBP), KC_N, KC_M, KC_COMMA, ALT_T(KC_DOT), CTL_T(KC_SLASH), SCMD_T(_______), + LSFT(KC_MINUS), _______, DBLE_ZER0, DBLE_ZER0, TO(OLD_BASE), + L_ID_0, KC_ESCAPE, + LGUI(KC_Z), + LT(MEDIA,KC_LCTL), LT(SYMBL,KC_ENTER), LT(ARROWS,KC_SPACE)), + + /* Keymap 1: OLD Base layer + * ,--------------------------------------------------. ,--------------------------------------------------. + * | = | 1 | 2 | 3 | 4 | 5 | []() | |Snagit| 6 | 7 | 8 | 9 | 0 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T | "> " | | []() | Y | U | I | O | P | \ | + * |--------+------+------+------+------+------| | | SCRN |------+------+------+------+------+--------| + * | Hyper | A |S /CMD| D | F | G |------| |------| H | J | K |L /CMD| ; /L2| '/Hyper| + * |--------+------+------+------+------+------| ( | | ) |------+------+------+------+------+--------| + * |Shft Tab|Z/Ctrl|X/Alt | C | V | B | [ { | | ] } | N | M | , | ./Alt|//Ctrl|CMD+SHFT| + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | ` |Zendsk|RBMINE|CMD+S | ToDo | | _ | | 00 | 00 |ToBase| + * `----------------------------------' `----------------------------------' + * ,-------------. ,--------------. + * | Esc | Home | |Layer?| Esc | + * ,------|------|------| |------+-------+------. + * | | | End | | Undo | | | + * |Shift |Backsp|------| |------| Return|Space/| + * | OSM | /L5 | DEL | | Ctrl | /LT1 |Arrows| + * `--------------------' `---------------------' + * + *Copy/Cut key copies on tap, cut's on two taps. + * + *One tap on Snagit key = is Ctrl + Shift + C which is Snagit's selector. + *Two taps on Snagit key = Cmd + Shift + Opt + 4 (OS X cropping screenshot that is copied to the clipboard only.) + */ + + [OLD_BASE] = LAYOUT_ergodox( + //left hand + KC_EQUAL, KC_1, KC_2, KC_3, KC_4, KC_5, M_LINK, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, M_GREATER, + OSM(MOD_HYPR), KC_A, S_CMD_S, D_CMD_OPT, LT(MKDWN,KC_F),KC_G, + LSFT(KC_TAB), CTL_T(KC_Z), ALT_T(KC_X), KC_C, KC_V, KC_B, TD(CT_LBP), + KC_GRAVE, ZENDESK, RUBYMINE, LGUI(KC_S), TODO, + KC_ESCAPE, KC_HOME, + KC_END, + OSM(MOD_LSFT), LT(NUM,KC_BSPACE), LT(MKDWN,KC_DELETE), + + //right hand + TD(TD_SNAGIT), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, + MD_LINK, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH, + KC_H, KC_J, KC_K, LGUI_T(KC_L), LT(MEDIA,KC_SCOLON), ALL_T(KC_QUOTE), + TD(CT_RBP), KC_N, KC_M, KC_COMMA, ALT_T(KC_DOT), CTL_T(KC_SLASH), SCMD_T(_______), + LSFT(KC_MINUS), _______, DBLE_ZER0, DBLE_ZER0, TO(BASE), + L_ID_0, KC_ESCAPE, + LGUI(KC_Z), + LT(MEDIA,KC_LCTL), LT(SYMBL,KC_ENTER), LT(ARROWS,KC_SPACE)), + + /* Keymap 2: Symbol + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | 1 | 2 | 3 | 4 | 5 | []() | |Snagit| 6 | 7 | 8 | 9 | 0 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | $ | & | ` | | | Cmd | | | | | * | | | | + * |--------+------+------+------+------+------| + K | | |------+------+------+------+------+--------| + * | | # | $ | & | ! | @ |------| |------| - | [ | ] | ( | ) | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | | | ~ | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | |Layer?| | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ + // SYMBOLS + [SYMBL] = LAYOUT_ergodox( + //left hand + _______, KC_1, KC_2, KC_3, KC_4, KC_5, M_LINK, + _______, _______, KC_DLR, KC_AMPR, KC_GRAVE, KC_PIPE, LGUI(KC_K), + _______, KC_HASH, KC_DLR, KC_AMPR, KC_EXLM, KC_AT, + _______, KC_PERC, KC_CIRC, _______, _______, KC_TILD, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______, + + //right hand + TD(TD_SNAGIT), KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, + _______, _______, _______, KC_PAST, _______, _______, _______, + KC_MINUS, KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, + L_ID_1, _______, + _______, + _______, _______, _______), + + /* Keymap 3: Media and mouse keys + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | XKCD | | | | | | F15 | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | |Whl Up| MsUp |Whl Dn| | | | | | | | | | F14 | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | |Ctl L |MsLeft|MsDown|MsRght| Ctl R|------| |------| | Mute | VolDn| VolUp| TL 2 | Play | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |WHL L | |Whl R | | | | | | | Prev | Next | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | Mute | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | |LAYER?| | + * ,------|------|------| |------+------+------. + * | Left |Right | | | |Copy/ | paste| + * | Click|Click |------| |------| cut |/paste| + * | | | | | | |spcial| + * `--------------------' `--------------------' + */ + // MEDIA AND MOUSE + + [MEDIA] = LAYOUT_ergodox( + //left hand + _______, _______, _______, _______, _______, _______, _______, + _______, _______, KC_MS_WH_UP, KC_MS_UP, KC_MS_WH_DOWN, _______, _______, + _______, LCTL(KC_LEFT), KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, RCTL(KC_RIGHT), + XXXXXXX, _______, KC_MS_WH_LEFT, _______, KC_MS_WH_RIGHT, _______, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + KC_MS_BTN1, KC_MS_BTN2, _______, + + //right hand + XKCD, _______, _______, _______, _______, _______, KC_F15, + _______, _______, _______, _______, _______, _______, KC_F14, + _______, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, _______, KC_MEDIA_PLAY_PAUSE, + _______, _______, _______, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK, _______, XXXXXXX, + _______, _______, _______, _______, _______, + L_ID_2, _______, + _______, + _______, TD(TD_COPY_CUT), PAST_PS), + + /* Keymap 4: Markdown Symbols + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | |SCRNCL| | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | | | | | | ``` | ** | _ | ` | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | TL MD| |------| |------| - | [ | ] | ( | ) | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | # | ## | ### | #### | #####| | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | |Layer?| | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + * Sc cp = OS X cropping screenshot that is copied to the clipboard only. + */ + // Markdown Layer + [MKDWN] = LAYOUT_ergodox( + //left hand + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______, + + //right hand + SCRN_CLIPB, _______, _______, _______, _______, _______, _______, + _______, _______, TRPLE_GRAVE, DBLE_ASTR,LSFT(KC_MINUS), KC_GRAVE, _______, + KC_MINUS, KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, _______, + _______, H_ONE, H_TWO, H_THREE, H_FOUR, H_FIVE, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______), + + /* Keymap 5: Arrows + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | RESET | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | Opt+L| Up |Opt+R | | | | | | Opt+L| Up |Opt+R | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | |Ctrl+L| Left | Dn | Right|Ctrl+R|------| |------|Ctrl+L| Left | Dn | Right|Ctrl+R| | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + * + * + * + */ + // Movement Layer + + [ARROWS] = LAYOUT_ergodox( + //left hand + RESET, _______, _______, _______, _______, _______, _______, + _______, _______, CHRM_L, KC_UP, CHRM_R, _______, _______, + _______,LCTL(KC_LEFT), KC_LEFT, KC_DOWN, KC_RIGHT, LCTL(KC_RIGHT), + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______, + //right hand + _______, _______, _______, _______, _______, _______, _______, + _______, _______, CHRM_L, KC_UP, CHRM_R, _______, _______, + LCTL(KC_LEFT), KC_LEFT, KC_DOWN, LGUI_T(KC_RIGHT), LCTL(KC_RIGHT), _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______), + + /* Keymap 6: Numpad + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | | | | | | | = | 7 | 8 | 9 | * | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | |Cp/Cut|paste | |------| |------| + | 4 | 5 | 6 | + | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | - | 1 | 2 | 3 | / | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | 0 | . | 00 | 00 | Enter| + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | |Nupmad| | + * | | |------| |------|Enter | | + * | | | | | | | | + * `--------------------' `--------------------' + */ + // Numpad Layer + [NUM] = LAYOUT_ergodox( + //left hand + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, TD(TD_COPY_CUT), PAST_PS, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, + _______, _______, + _______, + _______, _______, _______, + + //right hand + _______, _______, _______, _______, _______, _______, _______, + _______, KC_EQUAL, KC_7, KC_8, KC_9, KC_ASTR, _______, + KC_PLUS, KC_4, KC_5, KC_6, KC_PLUS, _______, + _______, KC_MINUS, KC_1, KC_2, KC_3, KC_KP_SLASH, _______, + KC_KP_0, KC_DOT, DBLE_ZER0, DBLE_ZER0, KC_KP_ENTER, + _______, _______, + _______, + _______, KC_PENT, _______), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + switch (keycode) { + 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 MD_LINK: + if (record->event.pressed){ + key_timer = timer_read(); + } else { + if (timer_elapsed(key_timer) > 150) { + SEND_STRING ("([Video]("); + } else { + SEND_STRING ("([Screenshot]("); + } + SEND_STRING(SS_LGUI("v")); + SEND_STRING("))"); + } + break; + + case XKCD: + if (record->event.pressed) { + SEND_STRING ("https://xkcd.com/1319/"); + } + break; + + case DBLE_ZER0: + if (record->event.pressed){ + SEND_STRING ("00"); + } + break; + + case DBLE_ASTR: + if (record->event.pressed){ + SEND_STRING ("**"); + SEND_STRING ("**"); + SEND_STRING (SS_TAP(X_LEFT)); + SEND_STRING (SS_TAP(X_LEFT)); + } + break; + + case TRPLE_GRAVE: + if (record->event.pressed){ + SEND_STRING ("```"); + } + break; + + case L_ID_0: + if (record->event.pressed) { + SEND_STRING (SS_LGUI(" ")); + SEND_STRING ("Layer 0: Base"); + } + break; + + case L_ID_1: + if (record->event.pressed) { + SEND_STRING (SS_LGUI(" ")); + SEND_STRING ("Layer 1: Symbols"); + } + break; + + case L_ID_2: + if (record->event.pressed) { + SEND_STRING (SS_LGUI(" ")); + SEND_STRING ("Layer 2: Media & Mousekeys"); + } + break; + + case PAST_PS: + if (record->event.pressed) { + key_timer = timer_read(); + } else { + if (timer_elapsed(key_timer) > 150) { + SEND_STRING (SS_LGUI("V")); // Paste special + } else { + SEND_STRING (SS_LGUI("v")); // Paste + } + } + break; + + case TODO: + if (record->event.pressed) { + key_timer = timer_read(); + } else { + if (timer_elapsed(key_timer) > 150) { //switch to Todoist when held and released + SEND_STRING (SS_LGUI(" ")); + SEND_STRING ("Todoist"); + SEND_STRING (SS_TAP(X_ENTER)); + } else { + SEND_STRING (SS_LGUI(SS_LCTRL("a"))); //macro to open Todoist new task dialog + } + } + break; + + case RUBYMINE: + if (record->event.pressed){ + SEND_STRING (SS_LGUI(" ")); + SEND_STRING ("RUBYMINE"); + SEND_STRING (SS_TAP(X_ENTER)); + } + break; + + case ZENDESK: + if (record->event.pressed){ + SEND_STRING (SS_LGUI(" ")); + SEND_STRING ("||ZEN"); + SEND_STRING (SS_TAP(X_ENTER)); + } + break; + + case H_ONE: + if (record->event.pressed){ + SEND_STRING ("# "); + } + break; + + case H_TWO: + if (record->event.pressed){ + SEND_STRING ("## "); + } + break; + + case H_THREE: + if (record->event.pressed){ + SEND_STRING ("### "); + } + break; + + case H_FOUR: + if (record->event.pressed){ + SEND_STRING ("#### "); + } + break; + + case H_FIVE: + if (record->event.pressed){ + SEND_STRING ("##### "); + } + break; + case M_LINK: + if (record->event.pressed){ + SEND_STRING ("[]()"); + } + break; + case M_GREATER: + if (record->event.pressed){ + SEND_STRING ("> "); + } + break; + } + return true; +}; + +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 1: + ergodox_right_led_1_on(); + break; + case 2: + ergodox_right_led_2_on(); + break; + default: + break; + } +}; diff --git a/layouts/community/ergodox/meagerfindings/rules.mk b/layouts/community/ergodox/meagerfindings/rules.mk new file mode 100644 index 000000000000..c775e1f6d66c --- /dev/null +++ b/layouts/community/ergodox/meagerfindings/rules.mk @@ -0,0 +1,3 @@ +COMMAND_ENABLE = no +TAP_DANCE_ENABLE = yes +FORCE_NKRO = yes From 77433b1a3140411b8b8f1b0389827c38384fc5fe Mon Sep 17 00:00:00 2001 From: itsdrdick Date: Thu, 20 Sep 2018 07:16:18 +0800 Subject: [PATCH 015/505] Keyboard: Add evil80 keyboard (#3921) * Add evil80 keyboard * Delete rules.mk * Update config.h * Update keymap.c * Update keymap.c --- keyboards/evil80/config.h | 64 +++++++++++++++++++++ keyboards/evil80/evil80.c | 47 ++++++++++++++++ keyboards/evil80/evil80.h | 23 ++++++++ keyboards/evil80/info.json | 13 +++++ keyboards/evil80/keymaps/default/keymap.c | 31 +++++++++++ keyboards/evil80/rules.mk | 68 +++++++++++++++++++++++ 6 files changed, 246 insertions(+) create mode 100644 keyboards/evil80/config.h create mode 100644 keyboards/evil80/evil80.c create mode 100644 keyboards/evil80/evil80.h create mode 100644 keyboards/evil80/info.json create mode 100644 keyboards/evil80/keymaps/default/keymap.c create mode 100644 keyboards/evil80/rules.mk diff --git a/keyboards/evil80/config.h b/keyboards/evil80/config.h new file mode 100644 index 000000000000..81138a7703c1 --- /dev/null +++ b/keyboards/evil80/config.h @@ -0,0 +1,64 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Evil +#define PRODUCT Evil80 +#define DESCRIPTION QMK keyboard firmware for Evil80 + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 16 + +/* Planck PCB default pin-out */ +#define MATRIX_ROW_PINS { F1, F4, F5, F0, B3, B0 } +#define MATRIX_COL_PINS { B2, D0, D1, D2, D3, D5, D4, D6, D7, B4, B1, C6, C7, E6, F6, F7 } +#define UNUSED_PINS + +#define BACKLIGHT_PIN B5 +#define BACKLIGHT_BREATHING + +/* 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 diff --git a/keyboards/evil80/evil80.c b/keyboards/evil80/evil80.c new file mode 100644 index 000000000000..d4653d049ba2 --- /dev/null +++ b/keyboards/evil80/evil80.c @@ -0,0 +1,47 @@ +#include "evil80.h" +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + led_init_ports(); + 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_init_ports(void) { + DDRB |= (1<<6) | (1<<7); // OUT +} + +void led_set_kb(uint8_t usb_led) { + if (usb_led & (1<", "x":10.25, "y":4.5}, {"label":"?", "x":11.25, "y":4.5}, {"label":"Shift", "x":12.25, "y":4.5, "w":1.75}, {"x":14, "y":4.5}, {"label":"\u2191", "x":16.25, "y":4.5}, {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, {"label":"Win", "x":1.25, "y":5.5, "w":1.25}, {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, {"x":3.75, "y":5.5, "w":6.25}, {"label":"Alt", "x":10, "y":5.5, "w":1.25}, {"label":"Win", "x":11.25, "y":5.5, "w":1.25}, {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, {"label":"\u2190", "x":15.25, "y":5.5}, {"label":"\u2193", "x":16.25, "y":5.5}, {"label":"\u2192", "x":17.25, "y":5.5}] + } + } +} \ No newline at end of file diff --git a/keyboards/evil80/keymaps/default/keymap.c b/keyboards/evil80/keymaps/default/keymap.c new file mode 100644 index 000000000000..1706517a252c --- /dev/null +++ b/keyboards/evil80/keymaps/default/keymap.c @@ -0,0 +1,31 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: Winkey */ + LAYOUT( + 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_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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_SCLN,KC_QUOT,KC_NUHS, KC_ENT, \ + 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, MO(2), KC_UP, \ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT \ + ), + /* 1: Winkeyless */ + LAYOUT( + 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_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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_SCLN,KC_QUOT,KC_NUHS, KC_ENT, \ + 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, MO(2), KC_UP, \ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_NO,KC_RALT,KC_RGUI,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT \ + ), + /* 2: Fn */ + LAYOUT( + KC_TRNS, BL_ON, BL_OFF,BL_STEP,BL_BRTG,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,\ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, \ + KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS \ + ), +}; diff --git a/keyboards/evil80/rules.mk b/keyboards/evil80/rules.mk new file mode 100644 index 000000000000..1067b43445b1 --- /dev/null +++ b/keyboards/evil80/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=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 = 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 +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. +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 From 334e2629df4adb44b0ac0dff3363a6daebc072e7 Mon Sep 17 00:00:00 2001 From: Anthony Wharton Date: Thu, 20 Sep 2018 00:18:15 +0100 Subject: [PATCH 016/505] Remove redefinition of `_______` in documentation example (#3924) * Remove redefinition of `_______` in documentation example * Slight rewording to include purpose of defintions * Update include to newer macro --- docs/keymap.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/keymap.md b/docs/keymap.md index b28d21a21df5..382a0e911bae 100644 --- a/docs/keymap.md +++ b/docs/keymap.md @@ -89,11 +89,15 @@ There are 3 main sections of a `keymap.c` file you'll want to concern yourself w At the top of the file you'll find this: - #include "clueboard.h" + #include QMK_KEYBOARD_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 + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * You can use _______ in place for KC_TRNS (transparent) * + * Or you can use XXXXXXX for KC_NO (NOOP) * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ // Each layer gets a name for readability. // The underscores don't mean anything - you can @@ -105,7 +109,9 @@ At the top of the file you'll find this: #define _FL 1 #define _CL 2 -These are some handy definitions we can use when building our keymap and our custom function. The `GRAVE_MODS` definition will be used later in our custom function. The `_______` define makes it easier to see what keys a layer is overriding, while the `_BL`, `_FL`, and `_CL` defines make it easier to refer to each of our layers. +These are some handy definitions we can use when building our keymap and our custom function. The `GRAVE_MODS` definition will be used later in our custom function, and the following `_BL`, `_FL`, and `_CL` defines make it easier to refer to each of our layers. + +Note: You may also find some older keymap files may also have a define(s) for `_______` and/or `XXXXXXX`. These can be used in place for `KC_TRNS` and `KC_NO` respectively, making it easier to see what keys a layer is overriding. These definitions are now unecessary, as they are included by default. ### Layers and Keymaps From 2bdeccd7baab67df2d0c04c1c8167277f7217d3e Mon Sep 17 00:00:00 2001 From: holtenc Date: Wed, 19 Sep 2018 18:20:36 -0500 Subject: [PATCH 017/505] Keyboard: Add Prime_EXL prototype to 'handwired' (#3932) * initial commit * Update readme.md * Update keymap.c added comment for description of function to control LED as layer indicator * corrected formatting as requested. * format for configurator * corrected info.json to propertly reflect layout in Configurator * updated layouts to reflect physical keyboard --- keyboards/handwired/prime_exl/config.h | 56 +++++++ keyboards/handwired/prime_exl/info.json | 12 ++ .../prime_exl/keymaps/default/config.h | 19 +++ .../prime_exl/keymaps/default/keymap.c | 143 ++++++++++++++++++ .../prime_exl/keymaps/default/readme.md | 1 + keyboards/handwired/prime_exl/prime_exl.c | 43 ++++++ keyboards/handwired/prime_exl/prime_exl.h | 40 +++++ keyboards/handwired/prime_exl/readme.md | 15 ++ keyboards/handwired/prime_exl/rules.mk | 80 ++++++++++ 9 files changed, 409 insertions(+) create mode 100644 keyboards/handwired/prime_exl/config.h create mode 100644 keyboards/handwired/prime_exl/info.json create mode 100644 keyboards/handwired/prime_exl/keymaps/default/config.h create mode 100644 keyboards/handwired/prime_exl/keymaps/default/keymap.c create mode 100644 keyboards/handwired/prime_exl/keymaps/default/readme.md create mode 100644 keyboards/handwired/prime_exl/prime_exl.c create mode 100644 keyboards/handwired/prime_exl/prime_exl.h create mode 100644 keyboards/handwired/prime_exl/readme.md create mode 100644 keyboards/handwired/prime_exl/rules.mk diff --git a/keyboards/handwired/prime_exl/config.h b/keyboards/handwired/prime_exl/config.h new file mode 100644 index 000000000000..e34fbb8ccc0d --- /dev/null +++ b/keyboards/handwired/prime_exl/config.h @@ -0,0 +1,56 @@ +/* +Copyright 2018 Holten Campbell + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x4024 +#define DEVICE_VER 0x0001 +#define MANUFACTURER PrimeKB +#define PRODUCT Prime_EXL +#define DESCRIPTION Ergo + +/* key matrix size */ +#define MATRIX_ROWS 10 +#define MATRIX_COLS 9 + +/* Keyboard Matrix Assignments */ +#define MATRIX_ROW_PINS { B1, E6, D5, D6, B4, D7, D4, F1, F0, B0 } +#define MATRIX_COL_PINS { D0, B3, B2, D1, D2, D3, F7, F6, F5 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B7 +#define BACKLIGHT_LEVELS 5 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not 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 magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) diff --git a/keyboards/handwired/prime_exl/info.json b/keyboards/handwired/prime_exl/info.json new file mode 100644 index 000000000000..edab78860791 --- /dev/null +++ b/keyboards/handwired/prime_exl/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Prime_EXL", + "url": "https://www.primekb.com", + "maintainer": "holtenc", + "width": 18, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"x":0,"y":0,"w":1,"h":1}, {"x":1,"y":0,"w":1,"h":1}, {"x":2,"y":0,"w":1,"h":1}, {"x":3,"y":0,"w":1,"h":1}, {"x":4,"y":0,"w":1,"h":1}, {"x":5,"y":0,"w":1,"h":1}, {"x":6.5,"y":0,"w":1,"h":1}, {"x":7.5,"y":0,"w":1,"h":1}, {"x":8.5,"y":0,"w":1,"h":1}, {"x":9.5,"y":0,"w":1,"h":1}, {"x":10.5,"y":0,"w":1,"h":1}, {"x":11.5,"y":0,"w":1,"h":1}, {"x":13.75,"y":0,"w":1,"h":1}, {"x":14.75,"y":0,"w":1,"h":1}, {"x":15.75,"y":0,"w":1,"h":1}, {"x":16.75,"y":0,"w":1,"h":1}, {"x":17.75,"y":0,"w":1,"h":1}, {"x":18.75,"y":0,"w":2,"h":1}, {"x":0,"y":1,"w":1,"h":1}, {"x":1,"y":1,"w":1,"h":1}, {"x":2,"y":1,"w":1,"h":1}, {"x":3,"y":1,"w":1,"h":1}, {"x":4,"y":1,"w":1,"h":1}, {"x":5,"y":1,"w":1,"h":1}, {"x":6.5,"y":1,"w":1.26,"h":1}, {"x":7.75,"y":1,"w":1,"h":1}, {"x":8.75,"y":1,"w":1,"h":1}, {"x":9.75,"y":1,"w":1,"h":1}, {"x":10.75,"y":1,"w":1,"h":1}, {"x":11.75,"y":1,"w":1,"h":1}, {"x":14,"y":1,"w":1,"h":1}, {"x":15,"y":1,"w":1,"h":1}, {"x":16,"y":1,"w":1,"h":1}, {"x":17,"y":1,"w":1,"h":1}, {"x":18,"y":1,"w":1,"h":1}, {"x":19,"y":1,"w":1.75,"h":1}, {"x":0,"y":2,"w":1,"h":1}, {"x":1,"y":2,"w":1,"h":1}, {"x":2,"y":2,"w":1,"h":1}, {"x":3,"y":2,"w":1,"h":1}, {"x":4,"y":2,"w":1,"h":1}, {"x":5,"y":2,"w":1,"h":1}, {"x":6.5,"y":2,"w":1.75,"h":1}, {"x":8.25,"y":2,"w":1,"h":1}, {"x":9.25,"y":2,"w":1,"h":1}, {"x":10.25,"y":2,"w":1,"h":1}, {"x":11.25,"y":2,"w":1,"h":1}, {"x":12.25,"y":2,"w":1,"h":1}, {"x":13.5,"y":2,"w":1,"h":1}, {"x":14.5,"y":2,"w":1,"h":1}, {"x":15.5,"y":2,"w":1,"h":1}, {"x":16.5,"y":2,"w":1,"h":1}, {"x":17.5,"y":2,"w":1,"h":1}, {"x":18.5,"y":2,"w":1,"h":1}, {"x":19.5,"y":2,"w":1.25,"h":1}, {"x":0,"y":3,"w":1,"h":1}, {"x":1,"y":3,"w":1,"h":1}, {"x":2,"y":3,"w":1,"h":1}, {"x":3,"y":3,"w":1,"h":1}, {"x":4,"y":3,"w":1,"h":1}, {"x":5,"y":3,"w":1,"h":1}, {"x":6.5,"y":3,"w":1.25,"h":1}, {"x":7.75,"y":3,"w":1.25,"h":1}, {"x":9,"y":3,"w":1,"h":1}, {"x":10,"y":3,"w":1,"h":1}, {"x":11,"y":3,"w":2,"h":1}, {"x":13.5,"y":3,"w":2,"h":1}, {"x":15.5,"y":3,"w":1,"h":1}, {"x":16.5,"y":3,"w":1,"h":1}, {"x":17.5,"y":3,"w":1.5,"h":1}, {"x":19,"y":3,"w":1.5,"h":1}, {"x":0,"y":4,"w":1,"h":1}, {"x":1,"y":4,"w":1,"h":1}, {"x":2,"y":4,"w":1,"h":1}, {"x":3,"y":4,"w":1,"h":1}, {"x":4,"y":4,"w":1,"h":1}, {"x":5,"y":4,"w":1,"h":1}] + } + } +} diff --git a/keyboards/handwired/prime_exl/keymaps/default/config.h b/keyboards/handwired/prime_exl/keymaps/default/config.h new file mode 100644 index 000000000000..83bd38a81de8 --- /dev/null +++ b/keyboards/handwired/prime_exl/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 Holten Campbell + * + * 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 + +// place overrides here diff --git a/keyboards/handwired/prime_exl/keymaps/default/keymap.c b/keyboards/handwired/prime_exl/keymaps/default/keymap.c new file mode 100644 index 000000000000..0e1c60d4aafb --- /dev/null +++ b/keyboards/handwired/prime_exl/keymaps/default/keymap.c @@ -0,0 +1,143 @@ +/* Copyright 2018 Holten Campbell + * + * 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 QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_NLCK, KC_LPRN, KC_RPRN, KC_PSLS, KC_PAST, KC_BSPC, KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_F1, KC_F2, KC_P7, KC_P8, KC_P9, KC_DEL, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT, + KC_F3, KC_F4, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, MO(3), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, + KC_F5, KC_F6, KC_P1, KC_P2, KC_P3, KC_PPLS, KC_LCTL, KC_LALT, KC_LBRC, KC_RBRC, MO(1), KC_SPC, KC_MINS, KC_EQL, KC_LGUI, MO(4), + KC_F7, KC_F8, TO(2), KC_PDOT, KC_P0, KC_PENT + ), + + [1] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_DEL, + 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_LEFT, KC_DOWN, KC_RGHT, KC_SCLN, KC_BSLS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, + BL_TOGG, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [2] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_F9, KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, MO(3), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCTL, KC_LALT, KC_LBRC, KC_RBRC, MO(5), KC_SPC, KC_MINS, KC_EQL, KC_LGUI, MO(4), + KC_LCTL, KC_LALT, TO(0), KC_P, KC_H, KC_SPC + ), + + [3] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [4] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + + [5] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_DEL, + 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_LEFT, KC_DOWN, KC_RGHT, KC_SCLN, KC_BSLS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, + BL_TOGG, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + // set CapsLock LED to output and low + DDRC |= (1 << 6); + PORTC &= ~(1 << 6); + // set NumLock LED to output and low + DDRB |= (1 << 6); + PORTB &= ~(1 << 6); + // set ScrollLock LED to output and low + DDRB |= (1 << 5); + PORTB &= ~(1 << 5); +} + +void matrix_scan_user(void) { + +} + + +void led_set_user(uint8_t usb_led) { + if (usb_led & (1<. + */ +#include "prime_exl.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/handwired/prime_exl/prime_exl.h b/keyboards/handwired/prime_exl/prime_exl.h new file mode 100644 index 000000000000..727db5db8da7 --- /dev/null +++ b/keyboards/handwired/prime_exl/prime_exl.h @@ -0,0 +1,40 @@ +/* Copyright 2018 Holten Campbell + * + * 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 PRIME_EXL_H +#define PRIME_EXL_H + +#include "quantum.h" + +#define LAYOUT( \ + K040, K050, K041, K051, K042, K052, K043, K053, K044, K054, K045, K055, K046, K056, K047, K057, K048, K058, \ + K030, K060, K031, K061, K032, K062, K033, K063, K034, K064, K035, K065, K036, K066, K037, K067, K038, K068, \ + K020, K070, K021, K071, K022, K072, K023, K073, K024, K074, K025, K075, K085, K026, K076, K027, K077, K028, K078, \ + K010, K080, K011, K081, K012, K082, K013, K083, K014, K084, K015, K016, K086, K017, K087, K018, \ + K000, K090, K001, K091, K002, K092 \ +) { \ + { K000, K001, K002, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { K010, K011, K012, K013, K014, K015, K016, K017, K018 }, \ + { K020, K021, K022, K023, K024, K025, K026, K027, K028 }, \ + { K030, K031, K032, K033, K034, K035, K036, K037, K038 }, \ + { K040, K041, K042, K043, K044, K045, K046, K047, K048 }, \ + { K050, K051, K052, K053, K054, K055, K056, K057, K058 }, \ + { K060, K061, K062, K063, K064, K065, K066, K067, K068 }, \ + { K070, K071, K072, K073, K074, K075, K076, K077, K078 }, \ + { K080, K081, K082, K083, K084, K085, K086, K087, KC_NO }, \ + { K090, K091, K092, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ +} + +#endif \ No newline at end of file diff --git a/keyboards/handwired/prime_exl/readme.md b/keyboards/handwired/prime_exl/readme.md new file mode 100644 index 000000000000..f99cba004d75 --- /dev/null +++ b/keyboards/handwired/prime_exl/readme.md @@ -0,0 +1,15 @@ +# Prime_EXL + +![Prime_EXL](https://i.imgur.com/3t524g8.jpg) + +An ergonomic 45% keyboard with a macro/numpad added to the left side. + +Keyboard Maintainer: [Holtenc](https://github.com/holtenc/) +Hardware Supported: Prime_EXL PCB, ATMega32u4 +Hardware Availability: Prototype + +Make example for this keyboard (after setting up your build environment): + + make handwired/prime_exl:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/handwired/prime_exl/rules.mk b/keyboards/handwired/prime_exl/rules.mk new file mode 100644 index 000000000000..5cce4e8113d9 --- /dev/null +++ b/keyboards/handwired/prime_exl/rules.mk @@ -0,0 +1,80 @@ +# 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 + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From 14be5258a6784829b6931f348fc20d64e1a5f2a7 Mon Sep 17 00:00:00 2001 From: Rys Sommefeldt Date: Thu, 20 Sep 2018 00:23:23 +0100 Subject: [PATCH 018/505] Keymap: rys Tada68 ISO UK layout (#3934) * rys Tada68 ISO UK layout * Bring _FL more in line with my favoute WhiteFox layout * Whoops, fix - to _ * remove empty config.h * Remove legacy block --- keyboards/tada68/keymaps/rys/keymap.c | 50 ++++++++++++++++++++++++++ keyboards/tada68/keymaps/rys/readme.md | 15 ++++++++ keyboards/tada68/keymaps/rys/rules.mk | 17 +++++++++ 3 files changed, 82 insertions(+) create mode 100644 keyboards/tada68/keymaps/rys/keymap.c create mode 100644 keyboards/tada68/keymaps/rys/readme.md create mode 100644 keyboards/tada68/keymaps/rys/rules.mk diff --git a/keyboards/tada68/keymaps/rys/keymap.c b/keyboards/tada68/keymaps/rys/keymap.c new file mode 100644 index 000000000000..6f32b092d499 --- /dev/null +++ b/keyboards/tada68/keymaps/rys/keymap.c @@ -0,0 +1,50 @@ +#include QMK_KEYBOARD_H + +#define _BL 0 +#define _FL 1 + +#define _______ KC_TRNS + +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| [| ]| |Del | + * |------------------------------------------------------- -----| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '| #|Entr|PgUp| + * |----------------------------------------------------------------| + * |Shift| \ | Z| X| C| V| B| N| M| ,| .| /|Rshift|Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |Alt| FN|Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + */ + [_BL] = LAYOUT_iso( + 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_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_NUHS, KC_DEL, \ + 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_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_PGDN, \ + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + + /* Keymap _FL1: Function Layer 1 + * ,----------------------------------------------------------------. + * | | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| Delete| Ins| + * |----------------------------------------------------------------| + * | | | ↑ | | | | | | | | | | | |Home| + * |------------------------------------------------------- -----| + * | | ← | ↓ | → | | | | | | | | | | | End| + * |----------------------------------------------------------------| + * | | | | | L+|LED| L-| | V+| V-|Mut| | MsBtn|Up|MsBn| + * |----------------------------------------------------------------| + * | | | | | | | | Lt| Dn| Rt | + * `----------------------------------------------------------------' + */ + [_FL] = LAYOUT_iso( + _______, 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_BTN1, KC_UP, KC_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, \ + _______, _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, _______, KC_VOLU, KC_VOLD, KC_MUTE, _______, _______, KC_MS_U, KC_END, \ + _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R + ), +}; diff --git a/keyboards/tada68/keymaps/rys/readme.md b/keyboards/tada68/keymaps/rys/readme.md new file mode 100644 index 000000000000..a9425bf0673f --- /dev/null +++ b/keyboards/tada68/keymaps/rys/readme.md @@ -0,0 +1,15 @@ +# Custom Tada68 layout for ISO UK with Apple-y tweaks + +This layout is based on the [ISO UK](../iso-uk) layout, with the following +changes: + +Swap Win and Alt on the left side (Option and Command on macOS) + +## Installation + +Please see the [Tada68 readme](../../readme.md). Make the firmware wih the +following command: + +``` +make tada68:rys:bin +``` diff --git a/keyboards/tada68/keymaps/rys/rules.mk b/keyboards/tada68/keymaps/rys/rules.mk new file mode 100644 index 000000000000..1915481bf9d3 --- /dev/null +++ b/keyboards/tada68/keymaps/rys/rules.mk @@ -0,0 +1,17 @@ +# 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 From 5b4bcfa7f2530ad12ef801101933aba6ac46acb2 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Wed, 19 Sep 2018 16:25:58 -0700 Subject: [PATCH 019/505] Keyboard: Move Bathroom Epiphany boards into its own directory (#3936) * make bpiphany directory with simple readme file * move unloved_bastard to bpiphany directory * move frosty_flake to bpiphany directory * move pegasushoof to bpiphany directory * move tiger_lily to bpiphany directory * add a little more info to readme * move kitten_paw to bpiphany directory * update make instructions * update intro text * add missing routines to matrix.c of unloved_bastard * add missing routines --- .../{ => bpiphany}/frosty_flake/config.h | 0 .../frosty_flake/frosty_flake.c | 0 .../frosty_flake/frosty_flake.h | 0 .../frosty_flake/keymaps/QFR_JM/config.h | 0 .../frosty_flake/keymaps/QFR_JM/keymap.c | 0 .../frosty_flake/keymaps/QFR_JM/readme.md | 0 .../frosty_flake/keymaps/QFR_JM/rules.mk | 0 .../frosty_flake/keymaps/default/config.h | 0 .../frosty_flake/keymaps/default/keymap.c | 0 .../frosty_flake/keymaps/default/readme.md | 0 .../frosty_flake/keymaps/default/rules.mk | 0 .../frosty_flake/keymaps/nikchi/config.h | 0 .../frosty_flake/keymaps/nikchi/keymap.c | 0 .../frosty_flake/keymaps/nikchi/readme.md | 0 .../frosty_flake/keymaps/nikchi/rules.mk | 0 .../keymaps/nikchi/variableTapDance.md | 0 .../frosty_flake/keymaps/tkl/config.h | 0 .../frosty_flake/keymaps/tkl/keymap.c | 0 .../frosty_flake/keymaps/tkl/readme.md | 0 .../frosty_flake/keymaps/tkl/rules.mk | 0 .../{ => bpiphany}/frosty_flake/matrix.c | 18 +++++++++++++++ .../{ => bpiphany}/frosty_flake/readme.md | 11 ++++------ .../{ => bpiphany}/frosty_flake/rules.mk | 0 keyboards/{ => bpiphany}/kitten_paw/config.h | 0 keyboards/{ => bpiphany}/kitten_paw/info.json | 0 .../kitten_paw/keymaps/default/keymap.c | 0 .../kitten_paw/keymaps/ickerwx/config.h | 0 .../kitten_paw/keymaps/ickerwx/keymap.c | 0 .../kitten_paw/keymaps/ickerwx/readme.md | 0 .../{ => bpiphany}/kitten_paw/kitten_paw.c | 0 .../{ => bpiphany}/kitten_paw/kitten_paw.h | 0 keyboards/{ => bpiphany}/kitten_paw/matrix.c | 22 +++++++++++++++++-- keyboards/{ => bpiphany}/kitten_paw/readme.md | 4 ++-- keyboards/{ => bpiphany}/kitten_paw/rules.mk | 0 keyboards/bpiphany/pegasushoof/README.md | 12 ++++++++++ keyboards/{ => bpiphany}/pegasushoof/config.h | 0 .../pegasushoof/keymaps/blowrak/keymap.c | 0 .../pegasushoof/keymaps/blowrak/rules.mk | 0 .../pegasushoof/keymaps/citadel/config.h | 0 .../pegasushoof/keymaps/citadel/keymap.c | 0 .../pegasushoof/keymaps/citadel/readme.md | 0 .../pegasushoof/keymaps/citadel/rules.mk | 0 .../pegasushoof/keymaps/default/keymap.c | 0 .../pegasushoof/keymaps/default/rules.mk | 0 keyboards/{ => bpiphany}/pegasushoof/matrix.c | 18 +++++++++++++++ .../{ => bpiphany}/pegasushoof/pegasushoof.c | 0 .../{ => bpiphany}/pegasushoof/pegasushoof.h | 0 keyboards/{ => bpiphany}/pegasushoof/rules.mk | 0 keyboards/bpiphany/readme.md | 6 +++++ keyboards/{ => bpiphany}/tiger_lily/config.h | 0 keyboards/{ => bpiphany}/tiger_lily/info.json | 0 .../tiger_lily/keymaps/default/config.h | 0 .../tiger_lily/keymaps/default/keymap.c | 0 .../tiger_lily/keymaps/default/readme.md | 0 .../tiger_lily/keymaps/default/rules.mk | 0 .../tiger_lily/keymaps/default_ansi/config.h | 0 .../tiger_lily/keymaps/default_ansi/keymap.c | 0 .../tiger_lily/keymaps/default_ansi/readme.md | 0 .../tiger_lily/keymaps/default_ansi/rules.mk | 0 keyboards/{ => bpiphany}/tiger_lily/matrix.c | 20 ++++++++++++++++- keyboards/{ => bpiphany}/tiger_lily/readme.md | 4 ++-- keyboards/{ => bpiphany}/tiger_lily/rules.mk | 0 .../{ => bpiphany}/tiger_lily/tiger_lily.c | 0 .../{ => bpiphany}/tiger_lily/tiger_lily.h | 0 .../{ => bpiphany}/unloved_bastard/config.h | 0 .../{ => bpiphany}/unloved_bastard/info.json | 0 .../unloved_bastard/keymaps/default/config.h | 0 .../unloved_bastard/keymaps/default/keymap.c | 0 .../unloved_bastard/keymaps/default/readme.md | 0 .../keymaps/default_ansi/config.h | 0 .../keymaps/default_ansi/keymap.c | 0 .../keymaps/default_ansi/readme.md | 0 .../{ => bpiphany}/unloved_bastard/matrix.c | 18 +++++++++++++++ .../{ => bpiphany}/unloved_bastard/readme.md | 4 ++-- .../{ => bpiphany}/unloved_bastard/rules.mk | 0 .../unloved_bastard/unloved_bastard.c | 0 .../unloved_bastard/unloved_bastard.h | 0 keyboards/pegasushoof/README.md | 12 ---------- 78 files changed, 121 insertions(+), 28 deletions(-) rename keyboards/{ => bpiphany}/frosty_flake/config.h (100%) rename keyboards/{ => bpiphany}/frosty_flake/frosty_flake.c (100%) rename keyboards/{ => bpiphany}/frosty_flake/frosty_flake.h (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/QFR_JM/config.h (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/QFR_JM/keymap.c (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/QFR_JM/readme.md (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/QFR_JM/rules.mk (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/default/config.h (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/default/keymap.c (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/default/readme.md (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/default/rules.mk (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/nikchi/config.h (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/nikchi/keymap.c (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/nikchi/readme.md (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/nikchi/rules.mk (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/nikchi/variableTapDance.md (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/tkl/config.h (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/tkl/keymap.c (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/tkl/readme.md (100%) rename keyboards/{ => bpiphany}/frosty_flake/keymaps/tkl/rules.mk (100%) rename keyboards/{ => bpiphany}/frosty_flake/matrix.c (94%) rename keyboards/{ => bpiphany}/frosty_flake/readme.md (74%) rename keyboards/{ => bpiphany}/frosty_flake/rules.mk (100%) rename keyboards/{ => bpiphany}/kitten_paw/config.h (100%) rename keyboards/{ => bpiphany}/kitten_paw/info.json (100%) rename keyboards/{ => bpiphany}/kitten_paw/keymaps/default/keymap.c (100%) rename keyboards/{ => bpiphany}/kitten_paw/keymaps/ickerwx/config.h (100%) rename keyboards/{ => bpiphany}/kitten_paw/keymaps/ickerwx/keymap.c (100%) rename keyboards/{ => bpiphany}/kitten_paw/keymaps/ickerwx/readme.md (100%) rename keyboards/{ => bpiphany}/kitten_paw/kitten_paw.c (100%) rename keyboards/{ => bpiphany}/kitten_paw/kitten_paw.h (100%) rename keyboards/{ => bpiphany}/kitten_paw/matrix.c (94%) rename keyboards/{ => bpiphany}/kitten_paw/readme.md (65%) rename keyboards/{ => bpiphany}/kitten_paw/rules.mk (100%) create mode 100644 keyboards/bpiphany/pegasushoof/README.md rename keyboards/{ => bpiphany}/pegasushoof/config.h (100%) rename keyboards/{ => bpiphany}/pegasushoof/keymaps/blowrak/keymap.c (100%) rename keyboards/{ => bpiphany}/pegasushoof/keymaps/blowrak/rules.mk (100%) rename keyboards/{ => bpiphany}/pegasushoof/keymaps/citadel/config.h (100%) rename keyboards/{ => bpiphany}/pegasushoof/keymaps/citadel/keymap.c (100%) rename keyboards/{ => bpiphany}/pegasushoof/keymaps/citadel/readme.md (100%) rename keyboards/{ => bpiphany}/pegasushoof/keymaps/citadel/rules.mk (100%) rename keyboards/{ => bpiphany}/pegasushoof/keymaps/default/keymap.c (100%) rename keyboards/{ => bpiphany}/pegasushoof/keymaps/default/rules.mk (100%) rename keyboards/{ => bpiphany}/pegasushoof/matrix.c (94%) rename keyboards/{ => bpiphany}/pegasushoof/pegasushoof.c (100%) rename keyboards/{ => bpiphany}/pegasushoof/pegasushoof.h (100%) rename keyboards/{ => bpiphany}/pegasushoof/rules.mk (100%) create mode 100644 keyboards/bpiphany/readme.md rename keyboards/{ => bpiphany}/tiger_lily/config.h (100%) rename keyboards/{ => bpiphany}/tiger_lily/info.json (100%) rename keyboards/{ => bpiphany}/tiger_lily/keymaps/default/config.h (100%) rename keyboards/{ => bpiphany}/tiger_lily/keymaps/default/keymap.c (100%) rename keyboards/{ => bpiphany}/tiger_lily/keymaps/default/readme.md (100%) rename keyboards/{ => bpiphany}/tiger_lily/keymaps/default/rules.mk (100%) rename keyboards/{ => bpiphany}/tiger_lily/keymaps/default_ansi/config.h (100%) rename keyboards/{ => bpiphany}/tiger_lily/keymaps/default_ansi/keymap.c (100%) rename keyboards/{ => bpiphany}/tiger_lily/keymaps/default_ansi/readme.md (100%) rename keyboards/{ => bpiphany}/tiger_lily/keymaps/default_ansi/rules.mk (100%) rename keyboards/{ => bpiphany}/tiger_lily/matrix.c (94%) rename keyboards/{ => bpiphany}/tiger_lily/readme.md (72%) rename keyboards/{ => bpiphany}/tiger_lily/rules.mk (100%) rename keyboards/{ => bpiphany}/tiger_lily/tiger_lily.c (100%) rename keyboards/{ => bpiphany}/tiger_lily/tiger_lily.h (100%) rename keyboards/{ => bpiphany}/unloved_bastard/config.h (100%) rename keyboards/{ => bpiphany}/unloved_bastard/info.json (100%) rename keyboards/{ => bpiphany}/unloved_bastard/keymaps/default/config.h (100%) rename keyboards/{ => bpiphany}/unloved_bastard/keymaps/default/keymap.c (100%) rename keyboards/{ => bpiphany}/unloved_bastard/keymaps/default/readme.md (100%) rename keyboards/{ => bpiphany}/unloved_bastard/keymaps/default_ansi/config.h (100%) rename keyboards/{ => bpiphany}/unloved_bastard/keymaps/default_ansi/keymap.c (100%) rename keyboards/{ => bpiphany}/unloved_bastard/keymaps/default_ansi/readme.md (100%) rename keyboards/{ => bpiphany}/unloved_bastard/matrix.c (94%) rename keyboards/{ => bpiphany}/unloved_bastard/readme.md (56%) rename keyboards/{ => bpiphany}/unloved_bastard/rules.mk (100%) rename keyboards/{ => bpiphany}/unloved_bastard/unloved_bastard.c (100%) rename keyboards/{ => bpiphany}/unloved_bastard/unloved_bastard.h (100%) delete mode 100644 keyboards/pegasushoof/README.md diff --git a/keyboards/frosty_flake/config.h b/keyboards/bpiphany/frosty_flake/config.h similarity index 100% rename from keyboards/frosty_flake/config.h rename to keyboards/bpiphany/frosty_flake/config.h diff --git a/keyboards/frosty_flake/frosty_flake.c b/keyboards/bpiphany/frosty_flake/frosty_flake.c similarity index 100% rename from keyboards/frosty_flake/frosty_flake.c rename to keyboards/bpiphany/frosty_flake/frosty_flake.c diff --git a/keyboards/frosty_flake/frosty_flake.h b/keyboards/bpiphany/frosty_flake/frosty_flake.h similarity index 100% rename from keyboards/frosty_flake/frosty_flake.h rename to keyboards/bpiphany/frosty_flake/frosty_flake.h diff --git a/keyboards/frosty_flake/keymaps/QFR_JM/config.h b/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/config.h similarity index 100% rename from keyboards/frosty_flake/keymaps/QFR_JM/config.h rename to keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/config.h diff --git a/keyboards/frosty_flake/keymaps/QFR_JM/keymap.c b/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/keymap.c similarity index 100% rename from keyboards/frosty_flake/keymaps/QFR_JM/keymap.c rename to keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/keymap.c diff --git a/keyboards/frosty_flake/keymaps/QFR_JM/readme.md b/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/readme.md similarity index 100% rename from keyboards/frosty_flake/keymaps/QFR_JM/readme.md rename to keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/readme.md diff --git a/keyboards/frosty_flake/keymaps/QFR_JM/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/rules.mk similarity index 100% rename from keyboards/frosty_flake/keymaps/QFR_JM/rules.mk rename to keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/rules.mk diff --git a/keyboards/frosty_flake/keymaps/default/config.h b/keyboards/bpiphany/frosty_flake/keymaps/default/config.h similarity index 100% rename from keyboards/frosty_flake/keymaps/default/config.h rename to keyboards/bpiphany/frosty_flake/keymaps/default/config.h diff --git a/keyboards/frosty_flake/keymaps/default/keymap.c b/keyboards/bpiphany/frosty_flake/keymaps/default/keymap.c similarity index 100% rename from keyboards/frosty_flake/keymaps/default/keymap.c rename to keyboards/bpiphany/frosty_flake/keymaps/default/keymap.c diff --git a/keyboards/frosty_flake/keymaps/default/readme.md b/keyboards/bpiphany/frosty_flake/keymaps/default/readme.md similarity index 100% rename from keyboards/frosty_flake/keymaps/default/readme.md rename to keyboards/bpiphany/frosty_flake/keymaps/default/readme.md diff --git a/keyboards/frosty_flake/keymaps/default/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk similarity index 100% rename from keyboards/frosty_flake/keymaps/default/rules.mk rename to keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk diff --git a/keyboards/frosty_flake/keymaps/nikchi/config.h b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/config.h similarity index 100% rename from keyboards/frosty_flake/keymaps/nikchi/config.h rename to keyboards/bpiphany/frosty_flake/keymaps/nikchi/config.h diff --git a/keyboards/frosty_flake/keymaps/nikchi/keymap.c b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/keymap.c similarity index 100% rename from keyboards/frosty_flake/keymaps/nikchi/keymap.c rename to keyboards/bpiphany/frosty_flake/keymaps/nikchi/keymap.c diff --git a/keyboards/frosty_flake/keymaps/nikchi/readme.md b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/readme.md similarity index 100% rename from keyboards/frosty_flake/keymaps/nikchi/readme.md rename to keyboards/bpiphany/frosty_flake/keymaps/nikchi/readme.md diff --git a/keyboards/frosty_flake/keymaps/nikchi/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk similarity index 100% rename from keyboards/frosty_flake/keymaps/nikchi/rules.mk rename to keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk diff --git a/keyboards/frosty_flake/keymaps/nikchi/variableTapDance.md b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/variableTapDance.md similarity index 100% rename from keyboards/frosty_flake/keymaps/nikchi/variableTapDance.md rename to keyboards/bpiphany/frosty_flake/keymaps/nikchi/variableTapDance.md diff --git a/keyboards/frosty_flake/keymaps/tkl/config.h b/keyboards/bpiphany/frosty_flake/keymaps/tkl/config.h similarity index 100% rename from keyboards/frosty_flake/keymaps/tkl/config.h rename to keyboards/bpiphany/frosty_flake/keymaps/tkl/config.h diff --git a/keyboards/frosty_flake/keymaps/tkl/keymap.c b/keyboards/bpiphany/frosty_flake/keymaps/tkl/keymap.c similarity index 100% rename from keyboards/frosty_flake/keymaps/tkl/keymap.c rename to keyboards/bpiphany/frosty_flake/keymaps/tkl/keymap.c diff --git a/keyboards/frosty_flake/keymaps/tkl/readme.md b/keyboards/bpiphany/frosty_flake/keymaps/tkl/readme.md similarity index 100% rename from keyboards/frosty_flake/keymaps/tkl/readme.md rename to keyboards/bpiphany/frosty_flake/keymaps/tkl/readme.md diff --git a/keyboards/frosty_flake/keymaps/tkl/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/tkl/rules.mk similarity index 100% rename from keyboards/frosty_flake/keymaps/tkl/rules.mk rename to keyboards/bpiphany/frosty_flake/keymaps/tkl/rules.mk diff --git a/keyboards/frosty_flake/matrix.c b/keyboards/bpiphany/frosty_flake/matrix.c similarity index 94% rename from keyboards/frosty_flake/matrix.c rename to keyboards/bpiphany/frosty_flake/matrix.c index cde7f63b95ba..480e3455ba1c 100644 --- a/keyboards/frosty_flake/matrix.c +++ b/keyboards/bpiphany/frosty_flake/matrix.c @@ -32,6 +32,24 @@ static uint8_t debouncing = DEBOUNCING_DELAY; static matrix_row_t matrix[MATRIX_ROWS]; static matrix_row_t matrix_debouncing[MATRIX_ROWS]; +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + static matrix_row_t scan_col(void) { return ( (PINC&(1<<7) ? 0 : ((matrix_row_t)1<<0)) | diff --git a/keyboards/frosty_flake/readme.md b/keyboards/bpiphany/frosty_flake/readme.md similarity index 74% rename from keyboards/frosty_flake/readme.md rename to keyboards/bpiphany/frosty_flake/readme.md index 822377a71994..0d6a4779f69d 100644 --- a/keyboards/frosty_flake/readme.md +++ b/keyboards/bpiphany/frosty_flake/readme.md @@ -25,22 +25,19 @@ Make example for this keyboard (after setting up your build environment): 104 key default layout: ``` -make frosty_flake:default +make bpiphany/frosty_flake:default ``` To directly flash the frosty_flake after compiling use ``` -make frosty_flake:default:dfu +make bpiphany/frosty_flake:default:dfu ``` 87 key tkl layout: ``` -make frosty_flake:tkl:dfu +make bpiphany/frosty_flake:tkl:dfu ``` -See [build environment -setup](https://docs.qmk.fm/build_environment_setup.html) then the -[make instructions](https://docs.qmk.fm/make_instructions.html) for -more information. +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/frosty_flake/rules.mk b/keyboards/bpiphany/frosty_flake/rules.mk similarity index 100% rename from keyboards/frosty_flake/rules.mk rename to keyboards/bpiphany/frosty_flake/rules.mk diff --git a/keyboards/kitten_paw/config.h b/keyboards/bpiphany/kitten_paw/config.h similarity index 100% rename from keyboards/kitten_paw/config.h rename to keyboards/bpiphany/kitten_paw/config.h diff --git a/keyboards/kitten_paw/info.json b/keyboards/bpiphany/kitten_paw/info.json similarity index 100% rename from keyboards/kitten_paw/info.json rename to keyboards/bpiphany/kitten_paw/info.json diff --git a/keyboards/kitten_paw/keymaps/default/keymap.c b/keyboards/bpiphany/kitten_paw/keymaps/default/keymap.c similarity index 100% rename from keyboards/kitten_paw/keymaps/default/keymap.c rename to keyboards/bpiphany/kitten_paw/keymaps/default/keymap.c diff --git a/keyboards/kitten_paw/keymaps/ickerwx/config.h b/keyboards/bpiphany/kitten_paw/keymaps/ickerwx/config.h similarity index 100% rename from keyboards/kitten_paw/keymaps/ickerwx/config.h rename to keyboards/bpiphany/kitten_paw/keymaps/ickerwx/config.h diff --git a/keyboards/kitten_paw/keymaps/ickerwx/keymap.c b/keyboards/bpiphany/kitten_paw/keymaps/ickerwx/keymap.c similarity index 100% rename from keyboards/kitten_paw/keymaps/ickerwx/keymap.c rename to keyboards/bpiphany/kitten_paw/keymaps/ickerwx/keymap.c diff --git a/keyboards/kitten_paw/keymaps/ickerwx/readme.md b/keyboards/bpiphany/kitten_paw/keymaps/ickerwx/readme.md similarity index 100% rename from keyboards/kitten_paw/keymaps/ickerwx/readme.md rename to keyboards/bpiphany/kitten_paw/keymaps/ickerwx/readme.md diff --git a/keyboards/kitten_paw/kitten_paw.c b/keyboards/bpiphany/kitten_paw/kitten_paw.c similarity index 100% rename from keyboards/kitten_paw/kitten_paw.c rename to keyboards/bpiphany/kitten_paw/kitten_paw.c diff --git a/keyboards/kitten_paw/kitten_paw.h b/keyboards/bpiphany/kitten_paw/kitten_paw.h similarity index 100% rename from keyboards/kitten_paw/kitten_paw.h rename to keyboards/bpiphany/kitten_paw/kitten_paw.h diff --git a/keyboards/kitten_paw/matrix.c b/keyboards/bpiphany/kitten_paw/matrix.c similarity index 94% rename from keyboards/kitten_paw/matrix.c rename to keyboards/bpiphany/kitten_paw/matrix.c index d436ad56ca64..6fdbfffd621b 100644 --- a/keyboards/kitten_paw/matrix.c +++ b/keyboards/bpiphany/kitten_paw/matrix.c @@ -35,6 +35,24 @@ static matrix_row_t matrix_debouncing[MATRIX_ROWS]; static uint8_t read_rows(void); static void select_col(uint8_t col); +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + inline uint8_t matrix_rows(void) { return MATRIX_ROWS; } @@ -48,7 +66,7 @@ inline uint8_t matrix_cols(void) { * col: 0 1 2 3 4 5 6 7 * pin: PC7 PD5 PD3 PD1 PC2 PD6 PD4 PD2 * - * Rrr pin configuration + * Rrr pin configuration * * These rrrs uses one 74HC154 4 to 16 bit demultiplexer (low * active), together with 2 rrrs driven directly from the micro @@ -84,7 +102,7 @@ uint8_t matrix_scan(void) { } } } - + if (debouncing) { if (--debouncing) { _delay_ms(1); diff --git a/keyboards/kitten_paw/readme.md b/keyboards/bpiphany/kitten_paw/readme.md similarity index 65% rename from keyboards/kitten_paw/readme.md rename to keyboards/bpiphany/kitten_paw/readme.md index d5fa9aa8b2c5..15737a3a9b60 100644 --- a/keyboards/kitten_paw/readme.md +++ b/keyboards/bpiphany/kitten_paw/readme.md @@ -11,6 +11,6 @@ Hardware Availability: https://geekhack.org/index.php?topic=46700.0 Make example for this keyboard (after setting up your build environment): - make kitten_paw:default + make bpiphany/kitten_paw:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/kitten_paw/rules.mk b/keyboards/bpiphany/kitten_paw/rules.mk similarity index 100% rename from keyboards/kitten_paw/rules.mk rename to keyboards/bpiphany/kitten_paw/rules.mk diff --git a/keyboards/bpiphany/pegasushoof/README.md b/keyboards/bpiphany/pegasushoof/README.md new file mode 100644 index 000000000000..1b3d6319014c --- /dev/null +++ b/keyboards/bpiphany/pegasushoof/README.md @@ -0,0 +1,12 @@ +Pegasus Hoof Controller +=== + +Keyboard Maintainer: QMK Community +Hardware Supported: Pegasus Hoof +Hardware Availability: https://1upkeyboards.com/filco-pegasus-hoof-controller.html + +Make example for this keyboard (after setting up your build environment): + + make bpiphany/pegasus_hoof:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/pegasushoof/config.h b/keyboards/bpiphany/pegasushoof/config.h similarity index 100% rename from keyboards/pegasushoof/config.h rename to keyboards/bpiphany/pegasushoof/config.h diff --git a/keyboards/pegasushoof/keymaps/blowrak/keymap.c b/keyboards/bpiphany/pegasushoof/keymaps/blowrak/keymap.c similarity index 100% rename from keyboards/pegasushoof/keymaps/blowrak/keymap.c rename to keyboards/bpiphany/pegasushoof/keymaps/blowrak/keymap.c diff --git a/keyboards/pegasushoof/keymaps/blowrak/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk similarity index 100% rename from keyboards/pegasushoof/keymaps/blowrak/rules.mk rename to keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk diff --git a/keyboards/pegasushoof/keymaps/citadel/config.h b/keyboards/bpiphany/pegasushoof/keymaps/citadel/config.h similarity index 100% rename from keyboards/pegasushoof/keymaps/citadel/config.h rename to keyboards/bpiphany/pegasushoof/keymaps/citadel/config.h diff --git a/keyboards/pegasushoof/keymaps/citadel/keymap.c b/keyboards/bpiphany/pegasushoof/keymaps/citadel/keymap.c similarity index 100% rename from keyboards/pegasushoof/keymaps/citadel/keymap.c rename to keyboards/bpiphany/pegasushoof/keymaps/citadel/keymap.c diff --git a/keyboards/pegasushoof/keymaps/citadel/readme.md b/keyboards/bpiphany/pegasushoof/keymaps/citadel/readme.md similarity index 100% rename from keyboards/pegasushoof/keymaps/citadel/readme.md rename to keyboards/bpiphany/pegasushoof/keymaps/citadel/readme.md diff --git a/keyboards/pegasushoof/keymaps/citadel/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk similarity index 100% rename from keyboards/pegasushoof/keymaps/citadel/rules.mk rename to keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk diff --git a/keyboards/pegasushoof/keymaps/default/keymap.c b/keyboards/bpiphany/pegasushoof/keymaps/default/keymap.c similarity index 100% rename from keyboards/pegasushoof/keymaps/default/keymap.c rename to keyboards/bpiphany/pegasushoof/keymaps/default/keymap.c diff --git a/keyboards/pegasushoof/keymaps/default/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk similarity index 100% rename from keyboards/pegasushoof/keymaps/default/rules.mk rename to keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk diff --git a/keyboards/pegasushoof/matrix.c b/keyboards/bpiphany/pegasushoof/matrix.c similarity index 94% rename from keyboards/pegasushoof/matrix.c rename to keyboards/bpiphany/pegasushoof/matrix.c index d2a74b8d7298..127433875df0 100644 --- a/keyboards/pegasushoof/matrix.c +++ b/keyboards/bpiphany/pegasushoof/matrix.c @@ -33,6 +33,24 @@ static matrix_row_t matrix_debouncing[MATRIX_ROWS]; static matrix_row_t read_cols(void); static void select_row(uint8_t col); +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + inline uint8_t matrix_rows(void) { return MATRIX_ROWS; diff --git a/keyboards/pegasushoof/pegasushoof.c b/keyboards/bpiphany/pegasushoof/pegasushoof.c similarity index 100% rename from keyboards/pegasushoof/pegasushoof.c rename to keyboards/bpiphany/pegasushoof/pegasushoof.c diff --git a/keyboards/pegasushoof/pegasushoof.h b/keyboards/bpiphany/pegasushoof/pegasushoof.h similarity index 100% rename from keyboards/pegasushoof/pegasushoof.h rename to keyboards/bpiphany/pegasushoof/pegasushoof.h diff --git a/keyboards/pegasushoof/rules.mk b/keyboards/bpiphany/pegasushoof/rules.mk similarity index 100% rename from keyboards/pegasushoof/rules.mk rename to keyboards/bpiphany/pegasushoof/rules.mk diff --git a/keyboards/bpiphany/readme.md b/keyboards/bpiphany/readme.md new file mode 100644 index 000000000000..992b7c908d52 --- /dev/null +++ b/keyboards/bpiphany/readme.md @@ -0,0 +1,6 @@ +# Bathroom Epiphanies + +bpiphany is the owner and designer of [Bathroom Epiphanies](http://bathroomepiphanies.com/). + +He is based in Sweden and creates several controller boards as a swappable component for some off the shelf keyboards. + diff --git a/keyboards/tiger_lily/config.h b/keyboards/bpiphany/tiger_lily/config.h similarity index 100% rename from keyboards/tiger_lily/config.h rename to keyboards/bpiphany/tiger_lily/config.h diff --git a/keyboards/tiger_lily/info.json b/keyboards/bpiphany/tiger_lily/info.json similarity index 100% rename from keyboards/tiger_lily/info.json rename to keyboards/bpiphany/tiger_lily/info.json diff --git a/keyboards/tiger_lily/keymaps/default/config.h b/keyboards/bpiphany/tiger_lily/keymaps/default/config.h similarity index 100% rename from keyboards/tiger_lily/keymaps/default/config.h rename to keyboards/bpiphany/tiger_lily/keymaps/default/config.h diff --git a/keyboards/tiger_lily/keymaps/default/keymap.c b/keyboards/bpiphany/tiger_lily/keymaps/default/keymap.c similarity index 100% rename from keyboards/tiger_lily/keymaps/default/keymap.c rename to keyboards/bpiphany/tiger_lily/keymaps/default/keymap.c diff --git a/keyboards/tiger_lily/keymaps/default/readme.md b/keyboards/bpiphany/tiger_lily/keymaps/default/readme.md similarity index 100% rename from keyboards/tiger_lily/keymaps/default/readme.md rename to keyboards/bpiphany/tiger_lily/keymaps/default/readme.md diff --git a/keyboards/tiger_lily/keymaps/default/rules.mk b/keyboards/bpiphany/tiger_lily/keymaps/default/rules.mk similarity index 100% rename from keyboards/tiger_lily/keymaps/default/rules.mk rename to keyboards/bpiphany/tiger_lily/keymaps/default/rules.mk diff --git a/keyboards/tiger_lily/keymaps/default_ansi/config.h b/keyboards/bpiphany/tiger_lily/keymaps/default_ansi/config.h similarity index 100% rename from keyboards/tiger_lily/keymaps/default_ansi/config.h rename to keyboards/bpiphany/tiger_lily/keymaps/default_ansi/config.h diff --git a/keyboards/tiger_lily/keymaps/default_ansi/keymap.c b/keyboards/bpiphany/tiger_lily/keymaps/default_ansi/keymap.c similarity index 100% rename from keyboards/tiger_lily/keymaps/default_ansi/keymap.c rename to keyboards/bpiphany/tiger_lily/keymaps/default_ansi/keymap.c diff --git a/keyboards/tiger_lily/keymaps/default_ansi/readme.md b/keyboards/bpiphany/tiger_lily/keymaps/default_ansi/readme.md similarity index 100% rename from keyboards/tiger_lily/keymaps/default_ansi/readme.md rename to keyboards/bpiphany/tiger_lily/keymaps/default_ansi/readme.md diff --git a/keyboards/tiger_lily/keymaps/default_ansi/rules.mk b/keyboards/bpiphany/tiger_lily/keymaps/default_ansi/rules.mk similarity index 100% rename from keyboards/tiger_lily/keymaps/default_ansi/rules.mk rename to keyboards/bpiphany/tiger_lily/keymaps/default_ansi/rules.mk diff --git a/keyboards/tiger_lily/matrix.c b/keyboards/bpiphany/tiger_lily/matrix.c similarity index 94% rename from keyboards/tiger_lily/matrix.c rename to keyboards/bpiphany/tiger_lily/matrix.c index d3a0d7ebd19d..3b48f6b3680a 100644 --- a/keyboards/tiger_lily/matrix.c +++ b/keyboards/bpiphany/tiger_lily/matrix.c @@ -32,6 +32,24 @@ static uint8_t debouncing = DEBOUNCING_DELAY; static matrix_row_t matrix[MATRIX_ROWS]; static matrix_row_t matrix_debouncing[MATRIX_ROWS]; +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + static matrix_row_t scan_col(void) { return ( (PINC&(1<<2) ? 0 : ((matrix_row_t)1<<0)) | \ @@ -134,4 +152,4 @@ uint8_t matrix_key_count(void) { for (uint8_t row = 0; row < MATRIX_ROWS; row++) count += bitpop32(matrix[row]); return count; -} \ No newline at end of file +} diff --git a/keyboards/tiger_lily/readme.md b/keyboards/bpiphany/tiger_lily/readme.md similarity index 72% rename from keyboards/tiger_lily/readme.md rename to keyboards/bpiphany/tiger_lily/readme.md index 37073def5145..1fcb6c3d6ca1 100644 --- a/keyboards/tiger_lily/readme.md +++ b/keyboards/bpiphany/tiger_lily/readme.md @@ -11,6 +11,6 @@ Hardware Availability: https://geekhack.org/index.php?topic=46700.0 Make example for this keyboard (after setting up your build environment): - make tiger_lily:default + make bpiphany/tiger_lily:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/tiger_lily/rules.mk b/keyboards/bpiphany/tiger_lily/rules.mk similarity index 100% rename from keyboards/tiger_lily/rules.mk rename to keyboards/bpiphany/tiger_lily/rules.mk diff --git a/keyboards/tiger_lily/tiger_lily.c b/keyboards/bpiphany/tiger_lily/tiger_lily.c similarity index 100% rename from keyboards/tiger_lily/tiger_lily.c rename to keyboards/bpiphany/tiger_lily/tiger_lily.c diff --git a/keyboards/tiger_lily/tiger_lily.h b/keyboards/bpiphany/tiger_lily/tiger_lily.h similarity index 100% rename from keyboards/tiger_lily/tiger_lily.h rename to keyboards/bpiphany/tiger_lily/tiger_lily.h diff --git a/keyboards/unloved_bastard/config.h b/keyboards/bpiphany/unloved_bastard/config.h similarity index 100% rename from keyboards/unloved_bastard/config.h rename to keyboards/bpiphany/unloved_bastard/config.h diff --git a/keyboards/unloved_bastard/info.json b/keyboards/bpiphany/unloved_bastard/info.json similarity index 100% rename from keyboards/unloved_bastard/info.json rename to keyboards/bpiphany/unloved_bastard/info.json diff --git a/keyboards/unloved_bastard/keymaps/default/config.h b/keyboards/bpiphany/unloved_bastard/keymaps/default/config.h similarity index 100% rename from keyboards/unloved_bastard/keymaps/default/config.h rename to keyboards/bpiphany/unloved_bastard/keymaps/default/config.h diff --git a/keyboards/unloved_bastard/keymaps/default/keymap.c b/keyboards/bpiphany/unloved_bastard/keymaps/default/keymap.c similarity index 100% rename from keyboards/unloved_bastard/keymaps/default/keymap.c rename to keyboards/bpiphany/unloved_bastard/keymaps/default/keymap.c diff --git a/keyboards/unloved_bastard/keymaps/default/readme.md b/keyboards/bpiphany/unloved_bastard/keymaps/default/readme.md similarity index 100% rename from keyboards/unloved_bastard/keymaps/default/readme.md rename to keyboards/bpiphany/unloved_bastard/keymaps/default/readme.md diff --git a/keyboards/unloved_bastard/keymaps/default_ansi/config.h b/keyboards/bpiphany/unloved_bastard/keymaps/default_ansi/config.h similarity index 100% rename from keyboards/unloved_bastard/keymaps/default_ansi/config.h rename to keyboards/bpiphany/unloved_bastard/keymaps/default_ansi/config.h diff --git a/keyboards/unloved_bastard/keymaps/default_ansi/keymap.c b/keyboards/bpiphany/unloved_bastard/keymaps/default_ansi/keymap.c similarity index 100% rename from keyboards/unloved_bastard/keymaps/default_ansi/keymap.c rename to keyboards/bpiphany/unloved_bastard/keymaps/default_ansi/keymap.c diff --git a/keyboards/unloved_bastard/keymaps/default_ansi/readme.md b/keyboards/bpiphany/unloved_bastard/keymaps/default_ansi/readme.md similarity index 100% rename from keyboards/unloved_bastard/keymaps/default_ansi/readme.md rename to keyboards/bpiphany/unloved_bastard/keymaps/default_ansi/readme.md diff --git a/keyboards/unloved_bastard/matrix.c b/keyboards/bpiphany/unloved_bastard/matrix.c similarity index 94% rename from keyboards/unloved_bastard/matrix.c rename to keyboards/bpiphany/unloved_bastard/matrix.c index 65773879bcd7..bb6de8613af5 100644 --- a/keyboards/unloved_bastard/matrix.c +++ b/keyboards/bpiphany/unloved_bastard/matrix.c @@ -25,6 +25,24 @@ #include "util.h" #include "matrix.h" +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + #ifndef DEBOUNCING_DELAY # define DEBOUNCING_DELAY 5 #endif diff --git a/keyboards/unloved_bastard/readme.md b/keyboards/bpiphany/unloved_bastard/readme.md similarity index 56% rename from keyboards/unloved_bastard/readme.md rename to keyboards/bpiphany/unloved_bastard/readme.md index 33c74d4b04c5..9909d5af3fc6 100644 --- a/keyboards/unloved_bastard/readme.md +++ b/keyboards/bpiphany/unloved_bastard/readme.md @@ -10,6 +10,6 @@ Hardware Availability: Pretty much anywhere Make example for this keyboard (after setting up your build environment): - make unloved_bastard:default + make bpiphany/unloved_bastard:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/unloved_bastard/rules.mk b/keyboards/bpiphany/unloved_bastard/rules.mk similarity index 100% rename from keyboards/unloved_bastard/rules.mk rename to keyboards/bpiphany/unloved_bastard/rules.mk diff --git a/keyboards/unloved_bastard/unloved_bastard.c b/keyboards/bpiphany/unloved_bastard/unloved_bastard.c similarity index 100% rename from keyboards/unloved_bastard/unloved_bastard.c rename to keyboards/bpiphany/unloved_bastard/unloved_bastard.c diff --git a/keyboards/unloved_bastard/unloved_bastard.h b/keyboards/bpiphany/unloved_bastard/unloved_bastard.h similarity index 100% rename from keyboards/unloved_bastard/unloved_bastard.h rename to keyboards/bpiphany/unloved_bastard/unloved_bastard.h diff --git a/keyboards/pegasushoof/README.md b/keyboards/pegasushoof/README.md deleted file mode 100644 index debf7f737222..000000000000 --- a/keyboards/pegasushoof/README.md +++ /dev/null @@ -1,12 +0,0 @@ -Pegasus Hoof Controller -=== - -Keyboard Maintainer: QMK Community -Hardware Supported: Pegasus Hoof -Hardware Availability: https://1upkeyboards.com/filco-pegasus-hoof-controller.html - -Make example for this keyboard (after setting up your build environment): - - make pegasus_hoof:default - -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. From 6cab5140368c006030f35a9c7eaa946b0fdd78ef Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Thu, 20 Sep 2018 00:33:00 +0100 Subject: [PATCH 020/505] Keymap: Initial commit of dshields keymap for the model01 keyboard. (#3942) --- keyboards/model01/keymaps/dshields/config.h | 31 ++++++++++++ keyboards/model01/keymaps/dshields/keymap.c | 53 ++++++++++++++++++++ keyboards/model01/keymaps/dshields/readme.md | 10 ++++ keyboards/model01/keymaps/dshields/rules.mk | 2 + 4 files changed, 96 insertions(+) create mode 100644 keyboards/model01/keymaps/dshields/config.h create mode 100644 keyboards/model01/keymaps/dshields/keymap.c create mode 100644 keyboards/model01/keymaps/dshields/readme.md create mode 100644 keyboards/model01/keymaps/dshields/rules.mk diff --git a/keyboards/model01/keymaps/dshields/config.h b/keyboards/model01/keymaps/dshields/config.h new file mode 100644 index 000000000000..86a4dd531475 --- /dev/null +++ b/keyboards/model01/keymaps/dshields/config.h @@ -0,0 +1,31 @@ +#pragma once + +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +#define USB_MAX_POWER_CONSUMPTION 100 +#define ONESHOT_TAP_TOGGLE 2 +#define ONESHOT_TIMEOUT 3000 + +#define MOUSEKEY_INTERVAL 20 +#define MOUSEKEY_DELAY 0 +#define MOUSEKEY_TIME_TO_MAX 40 +#define MOUSEKEY_MAX_SPEED 7 +#define MOUSEKEY_WHEEL_DELAY 0 + +// dynamic macro keys +#define DM_PLAY DYN_MACRO_PLAY1 +#define DM_STRT DYN_REC_START1 +#define DM_STOP DYN_REC_STOP + +// one-shot layer keys +#define OSL_FUN OSL(FUN) + +// one-shot modifier keys +#define OSMLCTL OSM(MOD_LCTL) +#define OSMRCTL OSM(MOD_RCTL) +#define OSMLALT OSM(MOD_LALT) +#define OSMRALT OSM(MOD_RALT) +#define OSMLSFT OSM(MOD_LSFT) +#define OSMRSFT OSM(MOD_RSFT) + diff --git a/keyboards/model01/keymaps/dshields/keymap.c b/keyboards/model01/keymaps/dshields/keymap.c new file mode 100644 index 000000000000..3a89d062b5b7 --- /dev/null +++ b/keyboards/model01/keymaps/dshields/keymap.c @@ -0,0 +1,53 @@ +#include QMK_KEYBOARD_H + +enum { DEF, FUN }; +enum { DYNAMIC_MACRO_RANGE = SAFE_RANGE }; + +#include "dynamic_macro.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[DEF] = LAYOUT( + RESET , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , _______, + KC_GRV , KC_Q , KC_W , KC_E , KC_R , KC_T , RGB_TOG, DM_PLAY, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_EQL , + KC_PGUP, KC_A , KC_S , KC_D , KC_F , KC_G , KC_TAB , KC_ENT , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, + KC_PGDN, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_ESC , _______, KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_MINS, + OSMLCTL, KC_RCTL, + KC_BSPC, KC_SPC , + KC_LGUI, OSMRALT, + OSMLSFT, OSMRSFT, + OSL_FUN, OSL_FUN + ), +[FUN] = LAYOUT( + _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , + KC_TAB , _______, KC_MS_U, _______, KC_BTN3, _______, RGB_MOD, DM_STRT, _______, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12 , + KC_HOME, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN1, _______, _______, DM_STOP, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, _______, + KC_END , KC_PSCR, KC_INS , _______, KC_BTN2, _______, _______, _______, _______, _______, _______, _______, KC_BSLS, KC_PIPE, + _______, _______, + KC_DEL , KC_ENT , + _______, _______, + _______, _______, + _______, _______ + ) +}; + +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case DEF: + set_all_leds_to(0,0,0); + break; + case FUN: + // TODO light the fn keys + // set_led_to(?, 0, 128, 0); + // set_led_to(?, 0, 128, 0); + break; + } + return state; +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_dynamic_macro(keycode, record)) { + return false; + } + return true; +} + diff --git a/keyboards/model01/keymaps/dshields/readme.md b/keyboards/model01/keymaps/dshields/readme.md new file mode 100644 index 000000000000..ead1c1aad290 --- /dev/null +++ b/keyboards/model01/keymaps/dshields/readme.md @@ -0,0 +1,10 @@ + +About +------ + +A lightly modded version of the default keymap. + +- One-shot modifiers and layers. +- Dynamic macros +- No num lock layer + diff --git a/keyboards/model01/keymaps/dshields/rules.mk b/keyboards/model01/keymaps/dshields/rules.mk new file mode 100644 index 000000000000..4d1abd88ad33 --- /dev/null +++ b/keyboards/model01/keymaps/dshields/rules.mk @@ -0,0 +1,2 @@ +# used by default keymap +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) From 4c22e92ce81cc5fecce713c7525d7102df39f2df Mon Sep 17 00:00:00 2001 From: Simon Dagfinrud Date: Thu, 20 Sep 2018 01:34:08 +0200 Subject: [PATCH 021/505] Keymap: Fix tada68:iso-nor to match latest ISO_layout (#3946) --- keyboards/tada68/keymaps/iso-nor/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/tada68/keymaps/iso-nor/keymap.c b/keyboards/tada68/keymaps/iso-nor/keymap.c index 2e6a80750f7a..c26932b0e4e0 100644 --- a/keyboards/tada68/keymaps/iso-nor/keymap.c +++ b/keyboards/tada68/keymaps/iso-nor/keymap.c @@ -21,8 +21,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_BL] = LAYOUT_iso( 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_GRV, KC_BSPC, KC_EQL, \ - 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_NUHS, KC_DEL, \ - 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_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_DEL, \ + 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_NUHS, KC_ENT, KC_PGUP, \ 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_PGDN, \ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ), @@ -42,9 +42,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_FL] = LAYOUT_iso( _______, 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_PSCR, \ - _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, BL_INC, BL_TOGG, KC_INS, \ + _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, BL_DEC, BL_INC, BL_TOGG, _______, KC_INS, \ _______, KC_LEFT, KC_DOWN,KC_RIGHT, _______, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, KC_HOME, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, _______, KC_END, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, _______, KC_END, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), From cfdc23bbaea69039d01e57e7256b62010635c260 Mon Sep 17 00:00:00 2001 From: Danny Date: Thu, 20 Sep 2018 11:00:19 -0400 Subject: [PATCH 022/505] Keyboard: Add Quefrency 65 support in configurator (#3950) * Fix Quefrency configurator layout to support new key added * Add configurator support for Quefrency 65 --- keyboards/quefrency/info.json | 94 ++++++++++++++++++- .../quefrency/keymaps/default65/keymap.c | 8 +- 2 files changed, 94 insertions(+), 8 deletions(-) diff --git a/keyboards/quefrency/info.json b/keyboards/quefrency/info.json index f63cd1f6c3cf..160e7896bbd0 100644 --- a/keyboards/quefrency/info.json +++ b/keyboards/quefrency/info.json @@ -2,7 +2,7 @@ "keyboard_name": "Quefrency", "url": "https://keeb.io", "maintainer": "nooges", - "width": 16, + "width": 17, "height": 5, "layouts": { "LAYOUT": { @@ -72,17 +72,103 @@ {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Alt", "x":1.25, "y":4, "w":1.25}, - {"label":"GUI", "x":2.5, "y":4, "w":1.25}, + {"label":"Win", "x":2.5, "y":4, "w":1.25}, {"label":"Fn", "x":3.75, "y":4, "w":1.25}, {"label":"Space", "x":5, "y":4, "w":2.25}, - {"label":"Backspace", "x":8.25, "y":4, "w":2.75}, + {"label":"Fn", "x":8.25, "y":4, "w":1.25}, + {"label":"Space", "x":9.5, "y":4, "w":1.5}, {"label":"Alt", "x":11, "y":4}, {"label":"Ctrl", "x":12, "y":4}, {"label":"Left", "x":13, "y":4}, {"label":"Down", "x":14, "y":4}, {"label":"Right", "x":15, "y":4} ] - } + }, + "LAYOUT_65": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + + {"label":"7", "x":8, "y":0}, + {"label":"8", "x":9, "y":0}, + {"label":"9", "x":10, "y":0}, + {"label":"0", "x":11, "y":0}, + {"label":"-", "x":12, "y":0}, + {"label":"=", "x":13, "y":0}, + {"label":"Del", "x":14, "y":0}, + {"label":"Bksp", "x":15, "y":0}, + {"label":"Home", "x":16, "y":0}, + + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + + {"label":"Y", "x":7.5, "y":1}, + {"label":"U", "x":8.5, "y":1}, + {"label":"I", "x":9.5, "y":1}, + {"label":"O", "x":10.5, "y":1}, + {"label":"P", "x":11.5, "y":1}, + {"label":"[", "x":12.5, "y":1}, + {"label":"]", "x":13.5, "y":1}, + {"label":"Backslash", "x":14.5, "y":1, "w":1.5}, + {"label":"End", "x":16, "y":1}, + + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + + {"label":"H", "x":7.75, "y":2}, + {"label":"J", "x":8.75, "y":2}, + {"label":"K", "x":9.75, "y":2}, + {"label":"L", "x":10.75, "y":2}, + {"label":";", "x":11.75, "y":2}, + {"label":"'", "x":12.75, "y":2}, + {"label":"Enter", "x":13.75, "y":2, "w":2.25}, + {"label":"Page Up", "x":16, "y":2}, + + {"label":"Shift", "x":0, "y":3, "w":2.25}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + + {"label":"N", "x":8.25, "y":3}, + {"label":"M", "x":9.25, "y":3}, + {"label":",", "x":10.25, "y":3}, + {"label":".", "x":11.25, "y":3}, + {"label":"/", "x":12.25, "y":3}, + {"label":"Shift", "x":13.25, "y":3, "w":1.75}, + {"label":"Up", "x":15, "y":3}, + {"label":"Page Down", "x":16, "y":3}, + + {"label":"Ctrl", "x":0, "y":4, "w":1.25}, + {"label":"Alt", "x":1.25, "y":4, "w":1.25}, + {"label":"Win", "x":2.5, "y":4, "w":1.25}, + {"label":"Fn", "x":3.75, "y":4, "w":1.25}, + {"label":"Space", "x":5, "y":4, "w":2.25}, + + {"label":"Fn", "x":8.25, "y":4, "w":1.25}, + {"label":"Space", "x":9.5, "y":4, "w":1.5}, + {"label":"Alt", "x":11, "y":4}, + {"label":"Ctrl", "x":12, "y":4}, + {"label":"Win", "x":13, "y":4}, + {"label":"Left", "x":14, "y":4}, + {"label":"Down", "x":15, "y":4}, + {"label":"Right", "x":16, "y":4} + ] + } } } diff --git a/keyboards/quefrency/keymaps/default65/keymap.c b/keyboards/quefrency/keymaps/default65/keymap.c index b660b5d86be0..4b07949b0694 100644 --- a/keyboards/quefrency/keymaps/default65/keymap.c +++ b/keyboards/quefrency/keymaps/default65/keymap.c @@ -18,10 +18,10 @@ enum custom_keycodes { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT_65( - KC_GESC, 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_DEL, KC_BSPC, KC_PGUP, \ - 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_PGDN, \ - 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_HOME, \ - 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_END, \ + KC_GESC, 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_DEL, KC_BSPC, KC_HOME, \ + 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_END, \ + 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_LALT, KC_LGUI, MO(_FN1),KC_SPC, MO(_FN1),KC_SPC, KC_RALT, KC_RCTL, KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT ), From 99c1c5bfe933865bacdebdcbcfa55954a5a946a2 Mon Sep 17 00:00:00 2001 From: Jumail Mundekkat Date: Fri, 21 Sep 2018 08:36:11 +1000 Subject: [PATCH 023/505] Keyboard: Added Prime_L, Prime_O and Prime_M, moved Prime_R into primekb folder (#3907) * Added template copies for prime_l Added first set of files for prime_m and prime_o Temporarily storing kbfirmware dumps in tmp * Completed base for prime_m, prime_o and prime_l Moved prime_r into primekb folder * Added in QMK Configurator layout files for new PrimeKB keyboards Slight modification to layout header files Added my name to licensing * Updated primekb readmes * Removed temporary working files * Updated default keymap for Prime_O * Added link to Newbs Guide in prime_r readme --- keyboards/primekb/prime_l/config.h | 57 +++++++++++++ keyboards/primekb/prime_l/info.json | 12 +++ .../primekb/prime_l/keymaps/default/config.h | 19 +++++ .../primekb/prime_l/keymaps/default/keymap.c | 74 ++++++++++++++++ .../primekb/prime_l/keymaps/default/readme.md | 1 + keyboards/primekb/prime_l/prime_l.c | 43 ++++++++++ keyboards/primekb/prime_l/prime_l.h | 35 ++++++++ keyboards/primekb/prime_l/readme.md | 15 ++++ keyboards/primekb/prime_l/rules.mk | 80 +++++++++++++++++ keyboards/primekb/prime_m/config.h | 57 +++++++++++++ keyboards/primekb/prime_m/info.json | 12 +++ .../primekb/prime_m/keymaps/default/config.h | 19 +++++ .../primekb/prime_m/keymaps/default/keymap.c | 82 ++++++++++++++++++ .../primekb/prime_m/keymaps/default/readme.md | 1 + keyboards/primekb/prime_m/prime_m.c | 43 ++++++++++ keyboards/primekb/prime_m/prime_m.h | 35 ++++++++ keyboards/primekb/prime_m/readme.md | 15 ++++ keyboards/primekb/prime_m/rules.mk | 80 +++++++++++++++++ keyboards/primekb/prime_o/config.h | 57 +++++++++++++ keyboards/primekb/prime_o/info.json | 12 +++ .../primekb/prime_o/keymaps/default/config.h | 19 +++++ .../primekb/prime_o/keymaps/default/keymap.c | 85 +++++++++++++++++++ .../primekb/prime_o/keymaps/default/readme.md | 1 + keyboards/primekb/prime_o/prime_o.c | 43 ++++++++++ keyboards/primekb/prime_o/prime_o.h | 40 +++++++++ keyboards/primekb/prime_o/readme.md | 15 ++++ keyboards/primekb/prime_o/rules.mk | 80 +++++++++++++++++ keyboards/{ => primekb}/prime_r/config.h | 0 keyboards/{ => primekb}/prime_r/info.json | 0 .../prime_r/keymaps/default/config.h | 0 .../prime_r/keymaps/default/keymap.c | 0 .../prime_r/keymaps/default/readme.md | 0 .../prime_r/keymaps/rooski/config.h | 0 .../prime_r/keymaps/rooski/keymap.c | 0 .../prime_r/keymaps/rooski/readme.md | 0 .../prime_r/keymaps/rooski/rules.mk | 0 keyboards/{ => primekb}/prime_r/prime_r.c | 0 keyboards/{ => primekb}/prime_r/prime_r.h | 0 keyboards/{ => primekb}/prime_r/readme.md | 5 +- keyboards/{ => primekb}/prime_r/rules.mk | 0 40 files changed, 1034 insertions(+), 3 deletions(-) create mode 100644 keyboards/primekb/prime_l/config.h create mode 100644 keyboards/primekb/prime_l/info.json create mode 100644 keyboards/primekb/prime_l/keymaps/default/config.h create mode 100644 keyboards/primekb/prime_l/keymaps/default/keymap.c create mode 100644 keyboards/primekb/prime_l/keymaps/default/readme.md create mode 100644 keyboards/primekb/prime_l/prime_l.c create mode 100644 keyboards/primekb/prime_l/prime_l.h create mode 100644 keyboards/primekb/prime_l/readme.md create mode 100644 keyboards/primekb/prime_l/rules.mk create mode 100644 keyboards/primekb/prime_m/config.h create mode 100644 keyboards/primekb/prime_m/info.json create mode 100644 keyboards/primekb/prime_m/keymaps/default/config.h create mode 100644 keyboards/primekb/prime_m/keymaps/default/keymap.c create mode 100644 keyboards/primekb/prime_m/keymaps/default/readme.md create mode 100644 keyboards/primekb/prime_m/prime_m.c create mode 100644 keyboards/primekb/prime_m/prime_m.h create mode 100644 keyboards/primekb/prime_m/readme.md create mode 100644 keyboards/primekb/prime_m/rules.mk create mode 100644 keyboards/primekb/prime_o/config.h create mode 100644 keyboards/primekb/prime_o/info.json create mode 100644 keyboards/primekb/prime_o/keymaps/default/config.h create mode 100644 keyboards/primekb/prime_o/keymaps/default/keymap.c create mode 100644 keyboards/primekb/prime_o/keymaps/default/readme.md create mode 100644 keyboards/primekb/prime_o/prime_o.c create mode 100644 keyboards/primekb/prime_o/prime_o.h create mode 100644 keyboards/primekb/prime_o/readme.md create mode 100644 keyboards/primekb/prime_o/rules.mk rename keyboards/{ => primekb}/prime_r/config.h (100%) rename keyboards/{ => primekb}/prime_r/info.json (100%) rename keyboards/{ => primekb}/prime_r/keymaps/default/config.h (100%) rename keyboards/{ => primekb}/prime_r/keymaps/default/keymap.c (100%) rename keyboards/{ => primekb}/prime_r/keymaps/default/readme.md (100%) rename keyboards/{ => primekb}/prime_r/keymaps/rooski/config.h (100%) rename keyboards/{ => primekb}/prime_r/keymaps/rooski/keymap.c (100%) rename keyboards/{ => primekb}/prime_r/keymaps/rooski/readme.md (100%) rename keyboards/{ => primekb}/prime_r/keymaps/rooski/rules.mk (100%) rename keyboards/{ => primekb}/prime_r/prime_r.c (100%) rename keyboards/{ => primekb}/prime_r/prime_r.h (100%) rename keyboards/{ => primekb}/prime_r/readme.md (63%) rename keyboards/{ => primekb}/prime_r/rules.mk (100%) diff --git a/keyboards/primekb/prime_l/config.h b/keyboards/primekb/prime_l/config.h new file mode 100644 index 000000000000..46dd3604e48a --- /dev/null +++ b/keyboards/primekb/prime_l/config.h @@ -0,0 +1,57 @@ +/* +Copyright 2018 Jumail Mundekkat + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x4024 +#define DEVICE_VER 0x0001 +#define MANUFACTURER PrimeKB +#define PRODUCT Prime_L +#define DESCRIPTION Custom layout keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +/* Keyboard Matrix Assignments */ +#define MATRIX_ROW_PINS { D1, D0, B7, B3, B2 } +#define MATRIX_COL_PINS { D2, D3, D5, D4, D6, D7, B4, B5, C7, C6, F7, F6, F5, F4, F1, F0 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B6 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 4 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not 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 magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) diff --git a/keyboards/primekb/prime_l/info.json b/keyboards/primekb/prime_l/info.json new file mode 100644 index 000000000000..8a407fd3eb2e --- /dev/null +++ b/keyboards/primekb/prime_l/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Prime_L", + "url": "https://www.primekb.com", + "maintainer": "MxBlu", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":13, "y":1}, {"x":14, "y":1}, {"x":15, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2, "w":1.25}, {"x":4.25, "y":2}, {"x":5.25, "y":2}, {"x":6.25, "y":2}, {"x":7.25, "y":2}, {"x":8.25, "y":2}, {"x":9.25, "y":2}, {"x":10.25, "y":2}, {"x":11.25, "y":2}, {"x":12.25, "y":2}, {"x":13.25, "y":2}, {"x":14.25, "y":2, "w":1.75}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3, "w":1.75}, {"x":4.75, "y":3}, {"x":5.75, "y":3}, {"x":6.75, "y":3}, {"x":7.75, "y":3}, {"x":8.75, "y":3}, {"x":9.75, "y":3}, {"x":10.75, "y":3}, {"x":11.75, "y":3}, {"x":12.75, "y":3}, {"x":13.75, "y":3}, {"x":14.75, "y":3, "w":1.25}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4, "w":1.25}, {"x":4.25, "y":4, "w":1.25}, {"x":5.5, "y":4}, {"x":6.5, "y":4}, {"x":7.5, "y":4, "w":2}, {"x":9.5, "y":4, "w":2.25}, {"x":11.75, "y":4}, {"x":12.75, "y":4}, {"x":13.75, "y":4}, {"x":14.75, "y":4, "w":1.25}] + } + } +} diff --git a/keyboards/primekb/prime_l/keymaps/default/config.h b/keyboards/primekb/prime_l/keymaps/default/config.h new file mode 100644 index 000000000000..95917a65cd43 --- /dev/null +++ b/keyboards/primekb/prime_l/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 + +// place overrides here diff --git a/keyboards/primekb/prime_l/keymaps/default/keymap.c b/keyboards/primekb/prime_l/keymaps/default/keymap.c new file mode 100644 index 000000000000..8a044b955680 --- /dev/null +++ b/keyboards/primekb/prime_l/keymaps/default/keymap.c @@ -0,0 +1,74 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ESC, KC_HOME, KC_END, KC_PSCR, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_PGUP, KC_BSPC, + KC_P7, KC_P8, KC_P9, KC_NLCK, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_PGDN, KC_BSLS, + KC_P4, KC_P5, KC_P6, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT, + KC_P1, KC_P2, KC_P3, 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_ENT, KC_PDOT, KC_P0, KC_LCTL, KC_LALT, KC_LBRC, KC_RBRC, MO(1), KC_SPC, KC_MINS, KC_EQL, KC_RGUI, KC_RCTL + ), + + [1] = LAYOUT( + RESET, KC_TRNS, KC_TRNS, KC_TRNS, 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_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + BL_TOGG, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS + ) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/primekb/prime_l/keymaps/default/readme.md b/keyboards/primekb/prime_l/keymaps/default/readme.md new file mode 100644 index 000000000000..4e4db88799e0 --- /dev/null +++ b/keyboards/primekb/prime_l/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for prime_l \ No newline at end of file diff --git a/keyboards/primekb/prime_l/prime_l.c b/keyboards/primekb/prime_l/prime_l.c new file mode 100644 index 000000000000..844407a10d0a --- /dev/null +++ b/keyboards/primekb/prime_l/prime_l.c @@ -0,0 +1,43 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 "prime_l.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/primekb/prime_l/prime_l.h b/keyboards/primekb/prime_l/prime_l.h new file mode 100644 index 000000000000..b50898b28b3e --- /dev/null +++ b/keyboards/primekb/prime_l/prime_l.h @@ -0,0 +1,35 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 PRIME_L_H +#define PRIME_L_H + +#include "quantum.h" + +#define LAYOUT( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215 , \ + K300, K301, K302, K303, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ + K400, K401, K402, K403, K405, K406, K407, K408, K410, K412, K413, K414, K415 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO, K215 }, \ + { K300, K301, K302, K303, KC_NO, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ + { K400, K401, K402, K403, KC_NO, K405, K406, K407, K408, KC_NO, K410, KC_NO, K412, K413, K414, K415 } \ +} + +#endif diff --git a/keyboards/primekb/prime_l/readme.md b/keyboards/primekb/prime_l/readme.md new file mode 100644 index 000000000000..3f760a4cc547 --- /dev/null +++ b/keyboards/primekb/prime_l/readme.md @@ -0,0 +1,15 @@ +# Prime_L + +![Prime_L](https://i.imgur.com/jUWhjOD.jpg) + +A compact layout with the footprint of your typical 65% board, featuring a left mini-numpad. Pre-drilled and counter sunk holes for use with optional feet for a slight tilt. Switches are oriented so that back light LEDs are on the top of the switch. + +Keyboard Maintainer: [MxBlue](https://github.com/MxBlu) +Hardware Supported: Prime_L PCBs, ATMega32u4 +Hardware Availability: [Store Link](https://www.primekb.com/collections/keyboards/products/bundle-save) + +Make example for this keyboard (after setting up your build environment): + + make primekb/prime_l:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/primekb/prime_l/rules.mk b/keyboards/primekb/prime_l/rules.mk new file mode 100644 index 000000000000..5cce4e8113d9 --- /dev/null +++ b/keyboards/primekb/prime_l/rules.mk @@ -0,0 +1,80 @@ +# 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 + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) diff --git a/keyboards/primekb/prime_m/config.h b/keyboards/primekb/prime_m/config.h new file mode 100644 index 000000000000..82a8037c99fb --- /dev/null +++ b/keyboards/primekb/prime_m/config.h @@ -0,0 +1,57 @@ +/* +Copyright 2018 Jumail Mundekkat + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x4024 +#define DEVICE_VER 0x0001 +#define MANUFACTURER PrimeKB +#define PRODUCT Prime_M +#define DESCRIPTION 6x5 Macropad + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 6 + +/* Keyboard Matrix Assignments */ +#define MATRIX_ROW_PINS { C5, B5, B2, D5, D3 } +#define MATRIX_COL_PINS { B3, C7, C6, D2, D1, D0 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B7 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 4 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not 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 magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) diff --git a/keyboards/primekb/prime_m/info.json b/keyboards/primekb/prime_m/info.json new file mode 100644 index 000000000000..5332522022a1 --- /dev/null +++ b/keyboards/primekb/prime_m/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Prime_M", + "url": "https://www.primekb.com", + "maintainer": "MxBlu", + "width": 6, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4}, {"x":5, "y":4}] + } + } +} diff --git a/keyboards/primekb/prime_m/keymaps/default/config.h b/keyboards/primekb/prime_m/keymaps/default/config.h new file mode 100644 index 000000000000..95917a65cd43 --- /dev/null +++ b/keyboards/primekb/prime_m/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 + +// place overrides here diff --git a/keyboards/primekb/prime_m/keymaps/default/keymap.c b/keyboards/primekb/prime_m/keymaps/default/keymap.c new file mode 100644 index 000000000000..d230439d08e6 --- /dev/null +++ b/keyboards/primekb/prime_m/keymaps/default/keymap.c @@ -0,0 +1,82 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ESC, KC_LPRN, KC_RPRN, KC_PSLS, KC_PAST, LT(2, KC_BSPC), + KC_F1, KC_F2, KC_P7, KC_P8, KC_P9, KC_DEL, + KC_F3, KC_F4, KC_P4, KC_P5, KC_P6, KC_PMNS, + KC_F5, KC_F6, KC_P1, KC_P2, KC_P3, KC_PPLS, + KC_LCTL, KC_LALT, TO(1), KC_P0, KC_PDOT, KC_ENT + ), + + [1] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, LT(2, KC_F9), + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, + KC_LCTL, KC_LALT, TO(0), KC_P, KC_H, KC_SPC + ), + + [2] = LAYOUT( + BL_TOGG, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD + ) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/primekb/prime_m/keymaps/default/readme.md b/keyboards/primekb/prime_m/keymaps/default/readme.md new file mode 100644 index 000000000000..5654918abb2e --- /dev/null +++ b/keyboards/primekb/prime_m/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for prime_m \ No newline at end of file diff --git a/keyboards/primekb/prime_m/prime_m.c b/keyboards/primekb/prime_m/prime_m.c new file mode 100644 index 000000000000..a33db95d83fc --- /dev/null +++ b/keyboards/primekb/prime_m/prime_m.c @@ -0,0 +1,43 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 "prime_m.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/primekb/prime_m/prime_m.h b/keyboards/primekb/prime_m/prime_m.h new file mode 100644 index 000000000000..0449a66d9b96 --- /dev/null +++ b/keyboards/primekb/prime_m/prime_m.h @@ -0,0 +1,35 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 PRIME_M_H +#define PRIME_M_H + +#include "quantum.h" + +#define LAYOUT( \ + 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 \ +) { \ + { 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 } \ +} + +#endif diff --git a/keyboards/primekb/prime_m/readme.md b/keyboards/primekb/prime_m/readme.md new file mode 100644 index 000000000000..668b29e4aea5 --- /dev/null +++ b/keyboards/primekb/prime_m/readme.md @@ -0,0 +1,15 @@ +# Prime_M + +![Prime_M](https://i.imgur.com/Iqa6FJw.jpg) + +The Prime_M is a premium input device that is designed to be flexible so that it can cover many needs. The case is milled from a solid block of aluminum and features an integrated switch plate, which is 4.75mm thick yet designed to allow MX style switches to properly snap in. The bottom cover is machine from solid brass and is pre-drilled/countersunk for use with optional feet to give the device a slight tilt. + +Keyboard Maintainer: [MxBlue](https://github.com/MxBlu) +Hardware Supported: Prime_M PCB, ATMega32u2 +Hardware Availability: [GB Post](https://geekhack.org/index.php?topic=91821.0), [B-Stock Listing](https://www.primekb.com/products/prime_m) + +Make example for this keyboard (after setting up your build environment): + + make primekb/prime_m:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/primekb/prime_m/rules.mk b/keyboards/primekb/prime_m/rules.mk new file mode 100644 index 000000000000..8d3b835f188c --- /dev/null +++ b/keyboards/primekb/prime_m/rules.mk @@ -0,0 +1,80 @@ +# MCU name +MCU = atmega32u2 + +# 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 + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) diff --git a/keyboards/primekb/prime_o/config.h b/keyboards/primekb/prime_o/config.h new file mode 100644 index 000000000000..9f634474cf15 --- /dev/null +++ b/keyboards/primekb/prime_o/config.h @@ -0,0 +1,57 @@ +/* +Copyright 2018 Jumail Mundekkat + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x4024 +#define DEVICE_VER 0x0001 +#define MANUFACTURER PrimeKB +#define PRODUCT Prime_O +#define DESCRIPTION A Large Ortholinear + +/* key matrix size */ +#define MATRIX_ROWS 10 +#define MATRIX_COLS 8 + +/* Keyboard Matrix Assignments */ +#define MATRIX_ROW_PINS { D4, D6, B1, C5, B4, B3, C4, B2, B0, D5 } +#define MATRIX_COL_PINS { B6, B5, C7, C6, D2, D1, D0, C2 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B7 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 4 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not 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 magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) diff --git a/keyboards/primekb/prime_o/info.json b/keyboards/primekb/prime_o/info.json new file mode 100644 index 000000000000..83fc1436050a --- /dev/null +++ b/keyboards/primekb/prime_o/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Prime_O", + "url": "https://www.primekb.com", + "maintainer": "MxBlu", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":13, "y":1}, {"x":14, "y":1}, {"x":15, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":15, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":6, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4}, {"x":5, "y":4}, {"x":6, "y":4}, {"x":7, "y":4}, {"x":8, "y":4}, {"x":9, "y":4}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}] + } + } +} diff --git a/keyboards/primekb/prime_o/keymaps/default/config.h b/keyboards/primekb/prime_o/keymaps/default/config.h new file mode 100644 index 000000000000..95917a65cd43 --- /dev/null +++ b/keyboards/primekb/prime_o/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 + +// place overrides here diff --git a/keyboards/primekb/prime_o/keymaps/default/keymap.c b/keyboards/primekb/prime_o/keymaps/default/keymap.c new file mode 100644 index 000000000000..f48e9e51ae9f --- /dev/null +++ b/keyboards/primekb/prime_o/keymaps/default/keymap.c @@ -0,0 +1,85 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_ENT, KC_P0, KC_LCTL, KC_LBRC, LT(1, KC_BSPC), KC_SPC, KC_MINS, KC_RGUI, + KC_ENT, KC_P2, KC_LSFT, KC_X, KC_V, KC_N, KC_COMM, KC_SLSH, + KC_PPLS, KC_P5, KC_TAB, KC_S, KC_F, KC_H, KC_K, KC_QUOT, + KC_PPLS, KC_P8, KC_PSCR, KC_W, KC_R, KC_Y, KC_I, KC_P, + KC_ESC, KC_PSLS, KC_NLCK, KC_2, KC_4, KC_6, KC_8, KC_0, + KC_PMNS, KC_PAST, KC_1, KC_3, KC_5, KC_7, KC_9, KC_DEL, + KC_P7, KC_P9, KC_Q, KC_E, KC_T, KC_U, KC_O, KC_BSLS, + KC_P4, KC_P6, KC_A, KC_D, KC_G, KC_J, KC_L, KC_ENT, + KC_P1, KC_P3, KC_Z, KC_C, KC_B, KC_M, KC_DOT, KC_LSFT, + KC_PDOT, KC_P0, KC_LALT, KC_RBRC, LT(1, KC_BSPC), KC_SPC, KC_EQL, KC_RCTL + ), + + [1] = LAYOUT( + BL_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_VOLD, KC_MUTE, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DOWN, KC_SCLN, + KC_TRNS, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, + KC_GRV, KC_F2, KC_F4, KC_F2, KC_F4, KC_F6, KC_F8, KC_F10, + KC_F1, KC_F3, KC_F1, KC_F3, KC_F5, KC_F7, KC_F9, KC_DEL, + KC_F11, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_RGHT, KC_VOLU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, + BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_VOLU, KC_MUTE + ), + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/primekb/prime_o/keymaps/default/readme.md b/keyboards/primekb/prime_o/keymaps/default/readme.md new file mode 100644 index 000000000000..e6e7a1dc9dfa --- /dev/null +++ b/keyboards/primekb/prime_o/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for prime_o \ No newline at end of file diff --git a/keyboards/primekb/prime_o/prime_o.c b/keyboards/primekb/prime_o/prime_o.c new file mode 100644 index 000000000000..d603cc6c9e4f --- /dev/null +++ b/keyboards/primekb/prime_o/prime_o.c @@ -0,0 +1,43 @@ +/* Copyright 2018 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 "prime_o.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/primekb/prime_o/prime_o.h b/keyboards/primekb/prime_o/prime_o.h new file mode 100644 index 000000000000..1ec7277b0491 --- /dev/null +++ b/keyboards/primekb/prime_o/prime_o.h @@ -0,0 +1,40 @@ +/* Copyright 2018 Jumail Mundekkat + * + * 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 PRIME_O_H +#define PRIME_O_H + +#include "quantum.h" + +#define LAYOUT( \ + K000, K001, K002, K003, K004, K005, K006, K007, K010, K011, K012, K013, K014, K015, K016, K017, \ + K020, K021, K022, K023, K024, K025, K026, K027, K030, K031, K032, K033, K034, K035, K036, K037, \ + K040, K041, K042, K043, K044, K045, K046, K047, K050, K051, K052, K053, K054, K055, K056, K057, \ + K060, K061, K062, K063, K064, K065, K066, K067, K070, K071, K072, K073, K074, K075, K076, K077, \ + K080, K081, K082, K083, K084, K085, K086, K087, K090, K091, K092, K093, K094, K095, K096, K097 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007 }, \ + { K010, K011, K012, K013, K014, K015, K016, K017 }, \ + { K020, K021, K022, K023, K024, K025, K026, K027 }, \ + { K030, K031, K032, K033, K034, K035, K036, K037 }, \ + { K040, K041, K042, K043, K044, K045, K046, K047 }, \ + { K050, K051, K052, K053, K054, K055, K056, K057 }, \ + { K060, K061, K062, K063, K064, K065, K066, K067 }, \ + { K070, K071, K072, K073, K074, K075, K076, K077 }, \ + { K080, K081, K082, K083, K084, K085, K086, K087 }, \ + { K090, K091, K092, K093, K094, K095, K096, K097 } \ +} + +#endif diff --git a/keyboards/primekb/prime_o/readme.md b/keyboards/primekb/prime_o/readme.md new file mode 100644 index 000000000000..fe91a86b9e0c --- /dev/null +++ b/keyboards/primekb/prime_o/readme.md @@ -0,0 +1,15 @@ +# Prime_O + +![Prime_O](https://i.imgur.com/ujbBdja.jpg) + +A 16x5 ortholinear keyboard that has many layout options, including: full grid, left- or right-side full sized numpads, and Many spacebar locations. Standard in-switch backlighting. See primekb.com for full details of possible layouts. + +Keyboard Maintainer: [MxBlue](https://github.com/MxBlu) +Hardware Supported: Prime_O PCB, ATMega32u2 +Hardware Availability: GB + +Make example for this keyboard (after setting up your build environment): + + make primekb/prime_o:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/primekb/prime_o/rules.mk b/keyboards/primekb/prime_o/rules.mk new file mode 100644 index 000000000000..8d3b835f188c --- /dev/null +++ b/keyboards/primekb/prime_o/rules.mk @@ -0,0 +1,80 @@ +# MCU name +MCU = atmega32u2 + +# 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 + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) diff --git a/keyboards/prime_r/config.h b/keyboards/primekb/prime_r/config.h similarity index 100% rename from keyboards/prime_r/config.h rename to keyboards/primekb/prime_r/config.h diff --git a/keyboards/prime_r/info.json b/keyboards/primekb/prime_r/info.json similarity index 100% rename from keyboards/prime_r/info.json rename to keyboards/primekb/prime_r/info.json diff --git a/keyboards/prime_r/keymaps/default/config.h b/keyboards/primekb/prime_r/keymaps/default/config.h similarity index 100% rename from keyboards/prime_r/keymaps/default/config.h rename to keyboards/primekb/prime_r/keymaps/default/config.h diff --git a/keyboards/prime_r/keymaps/default/keymap.c b/keyboards/primekb/prime_r/keymaps/default/keymap.c similarity index 100% rename from keyboards/prime_r/keymaps/default/keymap.c rename to keyboards/primekb/prime_r/keymaps/default/keymap.c diff --git a/keyboards/prime_r/keymaps/default/readme.md b/keyboards/primekb/prime_r/keymaps/default/readme.md similarity index 100% rename from keyboards/prime_r/keymaps/default/readme.md rename to keyboards/primekb/prime_r/keymaps/default/readme.md diff --git a/keyboards/prime_r/keymaps/rooski/config.h b/keyboards/primekb/prime_r/keymaps/rooski/config.h similarity index 100% rename from keyboards/prime_r/keymaps/rooski/config.h rename to keyboards/primekb/prime_r/keymaps/rooski/config.h diff --git a/keyboards/prime_r/keymaps/rooski/keymap.c b/keyboards/primekb/prime_r/keymaps/rooski/keymap.c similarity index 100% rename from keyboards/prime_r/keymaps/rooski/keymap.c rename to keyboards/primekb/prime_r/keymaps/rooski/keymap.c diff --git a/keyboards/prime_r/keymaps/rooski/readme.md b/keyboards/primekb/prime_r/keymaps/rooski/readme.md similarity index 100% rename from keyboards/prime_r/keymaps/rooski/readme.md rename to keyboards/primekb/prime_r/keymaps/rooski/readme.md diff --git a/keyboards/prime_r/keymaps/rooski/rules.mk b/keyboards/primekb/prime_r/keymaps/rooski/rules.mk similarity index 100% rename from keyboards/prime_r/keymaps/rooski/rules.mk rename to keyboards/primekb/prime_r/keymaps/rooski/rules.mk diff --git a/keyboards/prime_r/prime_r.c b/keyboards/primekb/prime_r/prime_r.c similarity index 100% rename from keyboards/prime_r/prime_r.c rename to keyboards/primekb/prime_r/prime_r.c diff --git a/keyboards/prime_r/prime_r.h b/keyboards/primekb/prime_r/prime_r.h similarity index 100% rename from keyboards/prime_r/prime_r.h rename to keyboards/primekb/prime_r/prime_r.h diff --git a/keyboards/prime_r/readme.md b/keyboards/primekb/prime_r/readme.md similarity index 63% rename from keyboards/prime_r/readme.md rename to keyboards/primekb/prime_r/readme.md index 7a77b207387f..dfce62e1af8a 100644 --- a/keyboards/prime_r/readme.md +++ b/keyboards/primekb/prime_r/readme.md @@ -12,7 +12,6 @@ Hardware Availability: [Prime_KB](https://www.primekb.com/) Make example for this keyboard (after setting up your build environment): - make prime_r:default - -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. + make primekb/prime_r:default +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/prime_r/rules.mk b/keyboards/primekb/prime_r/rules.mk similarity index 100% rename from keyboards/prime_r/rules.mk rename to keyboards/primekb/prime_r/rules.mk From 747cf78b5da17969fe057d77512e276fa6c59fd9 Mon Sep 17 00:00:00 2001 From: Danny Date: Thu, 20 Sep 2018 18:37:18 -0400 Subject: [PATCH 024/505] Add nano keymap for modding Spooka light (#3953) --- keyboards/nano/config.h | 5 +---- keyboards/nano/keymaps/default/rules.mk | 3 --- keyboards/nano/keymaps/spooka/config.h | 25 +++++++++++++++++++++++++ keyboards/nano/keymaps/spooka/keymap.c | 12 ++++++++++++ keyboards/nano/keymaps/spooka/rules.mk | 1 + 5 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 keyboards/nano/keymaps/spooka/config.h create mode 100644 keyboards/nano/keymaps/spooka/keymap.c create mode 100644 keyboards/nano/keymaps/spooka/rules.mk diff --git a/keyboards/nano/config.h b/keyboards/nano/config.h index 5c4f920dfe1d..088fafcaa5fd 100644 --- a/keyboards/nano/config.h +++ b/keyboards/nano/config.h @@ -33,12 +33,9 @@ along with this program. If not, see . #define MATRIX_COLS 4 /* ws2812 RGB LED */ -#define RGB_DI_PIN B1 -#define RGBLIGHT_TIMER +#define RGB_DI_PIN D3 #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 6 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* COL2ROW or ROW2COL */ #define DIODE_DIRECTION COL2ROW diff --git a/keyboards/nano/keymaps/default/rules.mk b/keyboards/nano/keymaps/default/rules.mk index 457a3d01d4a4..e69de29bb2d1 100644 --- a/keyboards/nano/keymaps/default/rules.mk +++ b/keyboards/nano/keymaps/default/rules.mk @@ -1,3 +0,0 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/nano/keymaps/spooka/config.h b/keyboards/nano/keymaps/spooka/config.h new file mode 100644 index 000000000000..05900a215b43 --- /dev/null +++ b/keyboards/nano/keymaps/spooka/config.h @@ -0,0 +1,25 @@ +/* +Copyright 2018 Danny Nguyen + +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 + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 12 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/nano/keymaps/spooka/keymap.c b/keyboards/nano/keymaps/spooka/keymap.c new file mode 100644 index 000000000000..63b90da09ff9 --- /dev/null +++ b/keyboards/nano/keymaps/spooka/keymap.c @@ -0,0 +1,12 @@ +#include QMK_KEYBOARD_H + +#define _MAIN 0 + +#define _______ KC_TRNS + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_MAIN] = LAYOUT( + RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, + RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD + ) +}; diff --git a/keyboards/nano/keymaps/spooka/rules.mk b/keyboards/nano/keymaps/spooka/rules.mk new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/keyboards/nano/keymaps/spooka/rules.mk @@ -0,0 +1 @@ + From 35e76539e7257a1932ec76882892b999e21c9d4f Mon Sep 17 00:00:00 2001 From: Alexander Kagno Date: Sat, 22 Sep 2018 09:43:28 -0600 Subject: [PATCH 025/505] Keymap: Arkag Userspace and MechMini2 Layout (#3958) * deleting arkag branch, forcibly moving changes over to master * fade_color function added, not tested * added half functions some stuff * surround_type function implemented and working. * added flashing function and removed fading, flashing supports infinite flashing along with controlled number flashes * added a fade state machine and functionality * build optimizations, changed fade to bounce between bounds rather than roll over, added a HALMAK layout * changes to sleep breath function, changed how I will switch to HALMAK * support for halmak added * support for activity detection added, condensed fading and flashing state machines, removed support for HALMAK and COLEMAK because arkag is stupid * changed sleep and inactive behaviors, now the color shifting reverses on state change, yay! save_color and reset_color are made to enable layer color changing to look cooler. * reformatted some if statements in state detection * changes to force fade to pause on boot, or plug in. * Attempting to move over to userspace, pushing to repository for help * userspace stuff.... * userspace stuff.... * layout changes, working userspace, Removed left side shift and replaced it with a MT() for LSFT and SPC. Userspace seems to be working properly now! HURRAY * Layout change Removed space/shift and reset modifiers to what they were originally. Added homerow modifiers. * Removed excessive tabs in files * Moved mods on homerow around... * changes recommended by @drashna --- keyboards/mechmini/v2/keymaps/arkag/config.h | 7 + keyboards/mechmini/v2/keymaps/arkag/keymap.c | 40 ++ keyboards/mechmini/v2/keymaps/arkag/rules.mk | 16 + users/arkag/arkag.c | 573 +++++++++++++++++++ users/arkag/arkag.h | 161 ++++++ users/arkag/config.h | 5 + users/arkag/readme.md | 14 + users/arkag/rules.mk | 1 + 8 files changed, 817 insertions(+) create mode 100644 keyboards/mechmini/v2/keymaps/arkag/config.h create mode 100644 keyboards/mechmini/v2/keymaps/arkag/keymap.c create mode 100644 keyboards/mechmini/v2/keymaps/arkag/rules.mk create mode 100644 users/arkag/arkag.c create mode 100644 users/arkag/arkag.h create mode 100644 users/arkag/config.h create mode 100644 users/arkag/readme.md create mode 100644 users/arkag/rules.mk diff --git a/keyboards/mechmini/v2/keymaps/arkag/config.h b/keyboards/mechmini/v2/keymaps/arkag/config.h new file mode 100644 index 000000000000..f5f3a90fa70c --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/arkag/config.h @@ -0,0 +1,7 @@ +#pragma once + +// save me space! +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION +#define DISABLE_LEADER +#define NO_MUSIC_MODE diff --git a/keyboards/mechmini/v2/keymaps/arkag/keymap.c b/keyboards/mechmini/v2/keymaps/arkag/keymap.c new file mode 100644 index 000000000000..10502a5b618f --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/arkag/keymap.c @@ -0,0 +1,40 @@ +#include QMK_KEYBOARD_H +#include "arkag.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = LAYOUT_2u_space_ortho( + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, TAP_A, TAP_S, TAP_D, TAP_F, KC_G, KC_H, TAP_J, TAP_K, TAP_L, TAP_SCN, QUOTE, + XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_ENT, + M_PMOD, LRALT, M_SMOD, LOWER, RAISE, KC_SPC, KC_SLSH, LAZY, KC_LEFT, KC_DOWN, KC_RGHT), + + [_RAISE] = LAYOUT_2u_space_ortho( + GRAVE, KC_1, KC_2, THREE, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, + _______, OBRACK, CBRACK, TAP_EQ, HYPHEN, _______, _______, KC_4, TAP_5, KC_6, _______, KC_NLCK, + _______, _______, _______, CEDILLA, _______, KC_COMM, KC_PDOT, KC_1, KC_2, KC_3, KC_PPLS, KC_PENT, + _______, _______, _______, KEEB, _______, _______, _______, M_OS, KC_PSLS, KC_PMNS, KC_PAST), + + [_LOWER] = LAYOUT_2u_space_ortho( + _______, _______, _______, _______, _______, _______, _______, M_ULIN, M_ITAL, _______, M_P_B, M_C_A_D, + _______, _______, STRIKE, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_CAPS, KC_DEL, _______, _______, _______, M_BOLD, _______, _______, _______, _______, KC_PGUP, _______, + _______, _______, _______, _______, _______, MEDIA, KC_BSLS, M_CALC, KC_HOME, KC_PGDN, KC_END), + + [_KEEB] = LAYOUT_2u_space_ortho( + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + _______, BL_TOGG, BL_STEP, BL_INC, BL_DEC, BL_BRTG, _______, _______, _______, _______, _______, _______, + RGB_M_P, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [_MEDIA] = LAYOUT_2u_space_ortho( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_VOLU, KC_MUTE, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT), + + [_LAZY] = LAYOUT_2u_space_ortho( + _______, _______, _______, _______, _______, M_TM, _______, M_SNIPT, M_SHRUG, _______, _______, _______, + _______, _______, _______, _______, _______, M_GGT, _______, M_UF, M_LOD, M_REPO, _______, _______, + _______, _______, _______, _______, _______, _______, _______, M_TF, M_LENNY, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; diff --git a/keyboards/mechmini/v2/keymaps/arkag/rules.mk b/keyboards/mechmini/v2/keymaps/arkag/rules.mk new file mode 100644 index 000000000000..d6c210e9e867 --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/arkag/rules.mk @@ -0,0 +1,16 @@ +BOOTMAGIC_ENABLE = no +MOUSEKEY_ENABLE = no +STENO_ENABLE = no +EXTRAKEY_ENABLE = yes +CONSOLE_ENABLE = no +COMMAND_ENABLE = no +SLEEP_LED_ENABLE = no +NKRO_ENABLE = yes +BACKLIGHT_ENABLE = yes +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = yes +TAP_DANCE_ENABLE = yes +UNICODE_ENABLE = yes + +# save me space! +EXTRAFLAGS += -flto diff --git a/users/arkag/arkag.c b/users/arkag/arkag.c new file mode 100644 index 000000000000..c716b5e93ff0 --- /dev/null +++ b/users/arkag/arkag.c @@ -0,0 +1,573 @@ +#include "arkag.h" + +// Start: Written by konstantin: vomindoraan +#include +#include +#include + +void send_unicode_hex_string(const char *str) { + if (!str) { return; } // Saftey net + while (*str) { + // Find the next code point (token) in the string + for (; *str == ' '; str++); + size_t n = strcspn(str, " "); // Length of the current token + char code_point[n+1]; + strncpy(code_point, str, n); + code_point[n] = '\0'; // Make sure it's null-terminated + + // Normalize the code point: make all hex digits lowercase + for (char *p = code_point; *p; p++) { + *p = tolower(*p); + } + + // Send the code point as a Unicode input string + unicode_input_start(); + send_string(code_point); + unicode_input_finish(); + str += n; // Move to the first ' ' (or '\0') after the current token + } +} +// End: Written by konstantin: vomindoraan + +uint8_t current_os, mod_primary_mask, fade_delay; +uint16_t flash_timer_one, flash_timer_two, + fade_timer_one, fade_timer_two, + active_timer_one, active_timer_two, + elapsed = 0, + num_extra_flashes_off = 0; +Color underglow, + flash_color, + saved_color, + hsv_none = {0,0,0}, + hsv_white = {0,0,127}; +flashState flash_state = no_flash; +fadeState fade_state = add_fade; +activityState state = boot; + +void set_color (Color new, bool update) { + rgblight_sethsv_eeprom_helper(new.h, new.s, new.v, update); +} + +void save_color(Color to_save) { + saved_color = to_save; +} + +void reset_color(void) { + underglow = saved_color; +} + +Color mod_color(Color current_color, bool should_add, uint8_t change_amount) { + save_color(underglow); + int addlim = 359 - change_amount; + int sublim = change_amount; + int leftovers; + if (should_add) { + if (current_color.h <= addlim) { + current_color.h += change_amount; + } else { + leftovers = (359 + change_amount) % 359; + current_color.h = 0 + leftovers; + } + } else { + if (current_color.h >= sublim) { + current_color.h -= change_amount; + } else { + leftovers = change_amount - current_color.h; + current_color.h = 359 - leftovers; + } + } + return current_color; +} + +void reverse_fade (void) { + if (fade_state == add_fade){ + fade_state = sub_fade; + } else { + fade_state = add_fade; + } +} + +void check_state (void) { + static bool activated, deactivated, slept; + switch (state) { + case active: + if (!activated) { + fade_delay = LED_FADE_DELAY; + reverse_fade(); + activated = true; + deactivated = false; + } + active_timer_two = timer_read(); + elapsed = active_timer_two - active_timer_one; + if (elapsed < INACTIVE_DELAY) {return;} + state = inactive; + return; + + case inactive: + if (!deactivated) { + fade_delay = LED_FADE_DELAY * 2; + reverse_fade(); + deactivated = true; + slept = false; + activated = false; + } + active_timer_two = timer_read(); + elapsed = active_timer_two - active_timer_one; + if (elapsed < SLEEP_DELAY) {return;} + state = sleeping; + return; + + case sleeping: + if (!slept) { + fade_delay = LED_FADE_DELAY * 6; + reverse_fade(); + slept = true; + deactivated = false; + activated = false; + } + return; + + case boot: + return; + } +} + +void fade_rgb (void) { + static bool ran_once; + if (flash_state != no_flash) {return;} + if (state == boot) {return;} + switch (fade_state) { + case add_fade: + if (!ran_once) { + fade_timer_one = timer_read(); + ran_once = true; + } + fade_timer_two = timer_read(); + elapsed = fade_timer_two - fade_timer_one; + if (elapsed < fade_delay) {return;} + if (underglow.h == 359) { + fade_state = sub_fade; + return; + } + underglow.h = underglow.h + 1; + set_color(underglow, false); + // set_color_at(underglow, 0); + fade_timer_one = fade_timer_two; + return; + + case sub_fade: + fade_timer_two = timer_read(); + elapsed = fade_timer_two - fade_timer_one; + if (elapsed < fade_delay) {return;} + if (underglow.h == 0) { + fade_state = add_fade; + return; + } + underglow.h = underglow.h - 1; + set_color(underglow, false); + // set_color_at(underglow, 0); + fade_timer_one = fade_timer_two; + return; + } +} + +void flash_rgb (void) { + static bool ran_once; + switch(flash_state) { + case no_flash: + return; + + case flash_off: + if (!ran_once) { + set_color(hsv_none, false); + flash_timer_one = timer_read(); + ran_once = true; + flash_state = flash_on; + return; + } + flash_timer_two = timer_read(); + elapsed = flash_timer_two - flash_timer_one; + if (elapsed >= LED_FLASH_DELAY) { + set_color(hsv_none, false); + flash_timer_one = timer_read(); + flash_state = flash_on; + } + return; + + case flash_on: + flash_timer_two = timer_read(); + elapsed = flash_timer_two - flash_timer_one; + if (elapsed >= LED_FLASH_DELAY) { + set_color(flash_color, false); + flash_timer_one = timer_read(); + if (num_extra_flashes_off > 0) { + flash_state = flash_off; + num_extra_flashes_off--; + } else { + set_color(underglow, false); + flash_state = no_flash; + ran_once = false; + } + } + return; + } +} + +void set_os (uint8_t os, bool update) { + current_os = os; + if (update) { + eeprom_update_byte(EECONFIG_USERSPACE, current_os); + } + switch (os) { + case OS_MAC: + set_unicode_input_mode(UC_OSX); + underglow = (Color){ 300, 255, 255 }; + mod_primary_mask = MOD_GUI_MASK; + break; + case OS_WIN: + set_unicode_input_mode(UC_WINC); + underglow = (Color){ 180, 255, 255 }; + mod_primary_mask = MOD_CTL_MASK; + break; + case OS_NIX: + set_unicode_input_mode(UC_LNX); + underglow = (Color){ 60, 255, 255 }; + mod_primary_mask = MOD_CTL_MASK; + break; + default: + underglow = (Color){ 0, 0, 255 }; + mod_primary_mask = MOD_CTL_MASK; + } + set_color(underglow, update); + flash_color = underglow; + flash_state = flash_off; + num_extra_flashes_off = 1; +} + +void tap_key(uint8_t keycode) { + register_code(keycode); + unregister_code(keycode); +} + +// register GUI if Mac or Ctrl if other +void pri_mod(bool press) { + if (press) { + if (current_os == OS_MAC) { + register_code(KC_LGUI); + } else { + register_code(KC_LCTL); + } + } else { + if (current_os == OS_MAC) { + unregister_code(KC_LGUI); + } else { + unregister_code(KC_LCTL); + } + } +} + +// register Ctrl if Mac or GUI if other +void sec_mod(bool press) { + if (press) { + if (current_os == OS_MAC) { + register_code(KC_LCTL); + } else { + register_code(KC_LGUI); + } + } else { + if (current_os == OS_MAC) { + unregister_code(KC_LCTL); + } else { + unregister_code(KC_LGUI); + } + } +} + +void surround_type(uint8_t num_of_chars, uint16_t keycode, bool use_shift) { + if (use_shift) { + register_code(KC_LSFT); + } + for (int i = 0; i < num_of_chars; i++) { + tap_key(keycode); + } + if (use_shift) { + unregister_code(KC_LSFT); + } + for (int i = 0; i < (num_of_chars/2); i++) { + tap_key(KC_LEFT); + } +} + +void long_keystroke(size_t num_of_keys, uint16_t keys[]) { + for (int i = 0; i < num_of_keys-1; i++) { + register_code(keys[i]); + } + tap_key(keys[num_of_keys-1]); + for (int i = 0; i < num_of_keys-1; i++) { + unregister_code(keys[i]); + } +} + +void dance_grv (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + tap_key(KC_GRV); + } else if (state->count == 2) { + surround_type(2, KC_GRAVE, false); + } else { + surround_type(6, KC_GRAVE, false); + } +} + +void dance_quot (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + tap_key(KC_QUOT); + } else if (state->count == 2) { + surround_type(2, KC_QUOTE, false); + } else if (state->count == 3) { + surround_type(2, KC_QUOTE, true); + } +} + +void dance_strk (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + surround_type(4, KC_TILDE, true); + } else if (state->count == 2) { + if (current_os == OS_MAC) { + long_keystroke(3, (uint16_t[]){KC_LGUI, KC_LSFT, KC_4}); + } else if (current_os == OS_WIN) { + long_keystroke(3, (uint16_t[]){KC_LGUI, KC_LSFT, KC_S}); + } else { + return; + } + } +} + +void dance_3 (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + tap_key(KC_3); + } else if (state->count == 2) { + send_unicode_hex_string("00E8"); + } else if (state->count == 3) { + send_unicode_hex_string("00E9"); + } +} + +void dance_c (qk_tap_dance_state_t *state, void *user_data) { + if (state->count == 1) { + tap_key(KC_C); + } else if (state->count == 2) { + send_unicode_hex_string("00E7"); + } +} + +void matrix_init_user(void) { + current_os = eeprom_read_byte(EECONFIG_USERSPACE); + set_os(current_os, false); +} + +void matrix_scan_user(void) { + check_state(); + flash_rgb(); + fade_rgb(); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case M_PMOD: + if (record->event.pressed) { + pri_mod(true); + } else { + pri_mod(false); + } + return false; + + case M_SMOD: + if (record->event.pressed) { + sec_mod(true); + } else { + sec_mod(false); + } + return false; + + case M_P_B: + if (record->event.pressed) { + if (current_os == OS_WIN) { + SEND_STRING(SS_DOWN(X_LGUI) SS_TAP(X_PAUSE) SS_UP(X_LGUI)); + } else { + } + } + return false; + + case M_C_A_D: + if (record->event.pressed) { + if (current_os == OS_WIN) { + SEND_STRING(SS_DOWN(X_LCTRL) SS_DOWN(X_LALT) SS_TAP(X_DELETE) SS_UP(X_LALT) SS_UP(X_LCTRL)); + } else { + } + } + return false; + + case M_CALC: + if (record->event.pressed) { + if (current_os == OS_WIN) { + SEND_STRING(SS_TAP(X_CALCULATOR)); + } else if (current_os == OS_MAC) { + SEND_STRING(SS_DOWN(X_LGUI) SS_TAP(X_SPACE) SS_UP(X_LGUI) "calculator" SS_TAP(X_ENTER)); + } + } + return false; + + case M_OS: + if (record->event.pressed) { + set_os((current_os+1) % _OS_COUNT, true); + } + return false; + + case M_LOD: + if (record->event.pressed) { + send_unicode_hex_string("0CA0 005F 005F 0CA0"); + } + return false; + + case M_LENNY: + if (record->event.pressed) { + send_unicode_hex_string("0028 0020 0361 00B0 0020 035C 0296 0020 0361 00B0 0029"); + } + return false; + + + case M_TF: + if (record->event.pressed) { + send_unicode_hex_string("0028 256F 2035 0414 2032 0029 256F 5F61 253B 2501 253B"); + } + return false; + + case M_UF: + if (record->event.pressed) { + send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 0020 30CE 0029"); + } + return false; + + case M_SHRUG: + if (record->event.pressed) { + send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); + } + return false; + + case M_TM: + if (record->event.pressed) { + send_unicode_hex_string("2122"); + } + return false; + + case M_REPO: + if (record->event.pressed) { + SEND_STRING("https://github.com/arkag/qmk_firmware/tree/master/keyboards/mechmini/v2/keymaps/arkag"); + } + return false; + + case M_GGT: + if (record->event.pressed) { + SEND_STRING("@GrahamGoldenTech.com"); + } + return false; + + case M_SNIPT: + if (record->event.pressed) { + surround_type(6, KC_GRAVE, false); + pri_mod(true); + tap_key(KC_V); + pri_mod(false); + tap_key(KC_RGHT); + tap_key(KC_RGHT); + tap_key(KC_RGHT); + tap_key(KC_ENTER); + } + return false; + + case M_BOLD: + if (record->event.pressed) { + surround_type(4, KC_8, true); + } + return false; + + case M_ITAL: + if (record->event.pressed) { + surround_type(2, KC_8, true); + } + return false; + + case M_ULIN: + if (record->event.pressed) { + surround_type(4, KC_MINS, true); + } + return false; + + case KC_LSFT: + if (record->event.pressed) { + set_color(mod_color(underglow, true, 50), false); + SEND_STRING(SS_DOWN(X_LSHIFT)); + } else { + set_color(underglow, false); + SEND_STRING(SS_UP(X_LSHIFT)); + } + return false; + + case MEDIA: + case LAZY: + case KEEB: + case RAISE: + case LOWER: + return true; + + default: + if (record->event.pressed) { + active_timer_one = timer_read(); + state = active; + } + return true; + } +} + +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case _LAZY: + save_color(underglow); + underglow = mod_color(underglow, true, 50); + break; + case _MEDIA: + save_color(underglow); + underglow = mod_color(underglow, true, 150); + break; + case _KEEB: + save_color(underglow); + underglow = mod_color(underglow, false, 150); + break; + case _LOWER: + save_color(underglow); + underglow = mod_color(underglow, false, 100); + break; + case _RAISE: + save_color(underglow); + underglow = mod_color(underglow, true, 100); + break; + default: + reset_color(); + break; + } + set_color(underglow, false); + return state; +} + +//Tap Dance Definitions +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_3_GRV_ACT] = ACTION_TAP_DANCE_FN (dance_3), + [TD_C_CED] = ACTION_TAP_DANCE_FN (dance_c), + [TD_GRV_3GRV] = ACTION_TAP_DANCE_FN (dance_grv), + [TD_SING_DOUB] = ACTION_TAP_DANCE_FN (dance_quot), + [TD_STRK_SHOT] = ACTION_TAP_DANCE_FN (dance_strk), + [TD_HYPH_UNDR] = ACTION_TAP_DANCE_DOUBLE (KC_MINS, LSFT(KC_MINS)), + [TD_BRCK_PARN_O] = ACTION_TAP_DANCE_DOUBLE (KC_LBRC, LSFT(KC_9)), + [TD_BRCK_PARN_C] = ACTION_TAP_DANCE_DOUBLE (KC_RBRC, LSFT(KC_0)), + [TD_LALT_RALT] = ACTION_TAP_DANCE_DOUBLE (KC_LALT, KC_RALT), +}; diff --git a/users/arkag/arkag.h b/users/arkag/arkag.h new file mode 100644 index 000000000000..9c81e4487c9a --- /dev/null +++ b/users/arkag/arkag.h @@ -0,0 +1,161 @@ +#pragma once + +#include "quantum.h" +#include "process_keycode/process_tap_dance.h" + +#define EECONFIG_USERSPACE (uint8_t *)20 + +#define LRALT TD(TD_LALT_RALT) +#define QUOTE TD(TD_SING_DOUB) +#define GRAVE TD(TD_GRV_3GRV) +#define OBRACK TD(TD_BRCK_PARN_O) +#define CBRACK TD(TD_BRCK_PARN_C) +#define THREE TD(TD_3_GRV_ACT) +#define STRIKE TD(TD_STRK_SHOT) +#define HYPHEN TD(TD_HYPH_UNDR) +#define CEDILLA TD(TD_C_CED) + +#define RAISE MO(1) +#define LOWER MO(2) +#define KEEB MO(3) +#define MEDIA MO(4) +#define LAZY MO(5) + +#define MOD_CTL_MASK (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL)) +#define MOD_GUI_MASK (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) +#define MOD_SFT_MASK (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) + +#define TAP_A LALT_T(KC_A) +#define TAP_SCN RALT_T(KC_SCOLON) + +#define TAP_S LCTL_T(KC_S) +#define TAP_L RCTL_T(KC_L) + +#define TAP_D LSFT_T(KC_D) +#define TAP_K RSFT_T(KC_K) + +#define TAP_F LGUI_T(KC_F) +#define TAP_J RGUI_T(KC_J) + +#define TAP_EQ LSFT_T(KC_EQUAL) +#define TAP_5 RSFT_T(KC_5) + +#define LED_FLASH_DELAY 150 +#define LED_FADE_DELAY 10 + +#define INACTIVE_DELAY 200 +#define SLEEP_DELAY 60000 + +enum { + _QWERTY = 0, + _RAISE, + _LOWER, + _KEEB, + _MEDIA, + _LAZY, +}; + +typedef enum { + OS_MAC, // Don't assign values + OS_WIN, + OS_NIX, + _OS_COUNT, +} OS; + +typedef struct { + uint16_t h; + uint8_t s; + uint8_t v; +} Color; + +typedef enum { + no_flash = 0, + flash_off, + flash_on, +} flashState; + +typedef enum { + add_fade = 0, + sub_fade, +} fadeState; + +typedef enum { + active = 0, + inactive, + sleeping, + boot, +} activityState; + +enum custom_keycodes { + M_PMOD = SAFE_RANGE, + M_SMOD, + M_P_B, + M_C_A_D, + M_CALC, + M_OS, + M_TF, + M_TM, + M_GGT, + M_LOD, + M_LENNY, + M_BOLD, + M_ITAL, + M_ULIN, + M_SNIPT, + M_REPO, + M_SHRUG, + M_UF, +}; + +enum tapdances { + TD_3_GRV_ACT = 0, + TD_C_CED, + TD_GRV_3GRV, + TD_SLSH_HTTP, + TD_SING_DOUB, + TD_HYPH_UNDR, + TD_STRK_SHOT, + TD_SPECIAL, + TD_BRCK_PARN_O, + TD_BRCK_PARN_C, + TD_LALT_RALT, + SPC_SFT_NSFT, +}; + +void send_unicode_hex_string(const char *str); + +void set_color (Color new, bool update); +void save_color(Color to_save); +void reset_color(void); + +Color mod_color(Color current_color, bool should_add, uint8_t change_amount); + +void reverse_fade (void); + +void check_state (void); + +void fade_rgb (void); + +void flash_rgb (void); + +void set_os (uint8_t os, bool update); + +void tap_key(uint8_t keycode); + +void pri_mod(bool press); + +void sec_mod(bool press); + +void surround_type(uint8_t num_of_chars, uint16_t keycode, bool use_shift); + +void long_keystroke(size_t num_of_keys, uint16_t keys[]); + +void dance_grv (qk_tap_dance_state_t *state, void *user_data); +void dance_quot (qk_tap_dance_state_t *state, void *user_data); +void dance_strk (qk_tap_dance_state_t *state, void *user_data); +void dance_3 (qk_tap_dance_state_t *state, void *user_data); +void dance_c (qk_tap_dance_state_t *state, void *user_data); + +int cur_dance (qk_tap_dance_state_t *state); +void spc_finished (qk_tap_dance_state_t *state, void *user_data); +void spc_reset (qk_tap_dance_state_t *state, void *user_data); diff --git a/users/arkag/config.h b/users/arkag/config.h new file mode 100644 index 000000000000..e715e5534ee0 --- /dev/null +++ b/users/arkag/config.h @@ -0,0 +1,5 @@ +#pragma once + +#define TAPPING_TERM 200 + +#define IGNORE_MOD_TAP_INTERRUPT diff --git a/users/arkag/readme.md b/users/arkag/readme.md new file mode 100644 index 000000000000..76a5c4525b6f --- /dev/null +++ b/users/arkag/readme.md @@ -0,0 +1,14 @@ +Copyright 2018 arkag arkag@pm.me + +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 . diff --git a/users/arkag/rules.mk b/users/arkag/rules.mk new file mode 100644 index 000000000000..3513f0ea6c62 --- /dev/null +++ b/users/arkag/rules.mk @@ -0,0 +1 @@ + SRC += arkag.c From 57ec309d3e05732094408834b00af9cfd1ffca62 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Sun, 23 Sep 2018 13:48:48 -0700 Subject: [PATCH 026/505] Keyboard: Panc60 (#3961) * initial check in * figure out the column pins * temporary keymap * guess the row pins * fix matrix.c compilation errors * use the LAYOUT_60_hhkb macro and tweak the keymap a little bit * update readme * Put my name everywhere * Add QMK Configurator support * figured out the row pins * update readme to have reset info * Fill in some blanks that are documentation related * Update matrix.c * add kb functions * forego kbfirmware labeling * add arrows and caps lock to function layer. * add a LAYOUT_60 and LAYOUT_all macro * missed a comma * add configurator support for the two new LAYOUT macros * Jack helped me with a new custom matrix * add 60_ansi into rules.mk --- keyboards/panc60/config.h | 46 +++ keyboards/panc60/i2c.c | 106 ++++++ keyboards/panc60/i2c.h | 27 ++ keyboards/panc60/info.json | 20 ++ keyboards/panc60/keymaps/default/config.h | 19 + keyboards/panc60/keymaps/default/keymap.c | 60 ++++ keyboards/panc60/keymaps/default/readme.md | 1 + keyboards/panc60/matrix.c | 145 ++++++++ keyboards/panc60/panc60.c | 25 ++ keyboards/panc60/panc60.h | 71 ++++ keyboards/panc60/readme.md | 46 +++ keyboards/panc60/rules.mk | 52 +++ keyboards/panc60/usbconfig.h | 396 +++++++++++++++++++++ 13 files changed, 1014 insertions(+) create mode 100644 keyboards/panc60/config.h create mode 100644 keyboards/panc60/i2c.c create mode 100644 keyboards/panc60/i2c.h create mode 100644 keyboards/panc60/info.json create mode 100644 keyboards/panc60/keymaps/default/config.h create mode 100644 keyboards/panc60/keymaps/default/keymap.c create mode 100644 keyboards/panc60/keymaps/default/readme.md create mode 100644 keyboards/panc60/matrix.c create mode 100644 keyboards/panc60/panc60.c create mode 100644 keyboards/panc60/panc60.h create mode 100644 keyboards/panc60/readme.md create mode 100644 keyboards/panc60/rules.mk create mode 100644 keyboards/panc60/usbconfig.h diff --git a/keyboards/panc60/config.h b/keyboards/panc60/config.h new file mode 100644 index 000000000000..703141bebfe5 --- /dev/null +++ b/keyboards/panc60/config.h @@ -0,0 +1,46 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 + +#include "config_common.h" + +#define VENDOR_ID 0x20A0 +#define PRODUCT_ID 0x422D +#define MANUFACTURER Panc Interactive +#define PRODUCT panc60 + +#define RGBLED_NUM 12 + +#define MATRIX_ROWS 5 +#define MATRIX_COLS 15 + +#define MATRIX_ROW_PINS { B3, B4, B5, B6, B7 } +#define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6, A7, C7, C6, C5, C4, C3, C2, D7 } +#define UNUSED_PINS + +#define DIODE_DIRECTION COL2ROW +#define DEBOUNCING_DELAY 5 + +#define NO_BACKLIGHT_CLOCK +#define BACKLIGHT_LEVELS 1 +#define RGBLIGHT_ANIMATIONS + +#define NO_UART 1 + +/* key combination for command */ +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) diff --git a/keyboards/panc60/i2c.c b/keyboards/panc60/i2c.c new file mode 100644 index 000000000000..e8c4455ad1b4 --- /dev/null +++ b/keyboards/panc60/i2c.c @@ -0,0 +1,106 @@ +/* +Copyright 2016 Luiz Ribeiro + +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 . +*/ + +// Please do not modify this file + +#include +#include + +#include "i2c.h" + +void i2c_set_bitrate(uint16_t bitrate_khz) { + uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz); + if (bitrate_div >= 16) { + bitrate_div = (bitrate_div - 16) / 2; + } + TWBR = bitrate_div; +} + +void i2c_init(void) { + // set pull-up resistors on I2C bus pins + PORTC |= 0b11; + + i2c_set_bitrate(400); + + // enable TWI (two-wire interface) + TWCR |= (1 << TWEN); + + // enable TWI interrupt and slave address ACK + TWCR |= (1 << TWIE); + TWCR |= (1 << TWEA); +} + +uint8_t i2c_start(uint8_t address) { + // reset TWI control register + TWCR = 0; + + // begin transmission and wait for it to end + TWCR = (1< + +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 . +*/ + +// Please do not modify this file + +#ifndef __I2C_H__ +#define __I2C_H__ + +void i2c_init(void); +void i2c_set_bitrate(uint16_t bitrate_khz); +uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length); + +#endif diff --git a/keyboards/panc60/info.json b/keyboards/panc60/info.json new file mode 100644 index 000000000000..fe919e8b91d0 --- /dev/null +++ b/keyboards/panc60/info.json @@ -0,0 +1,20 @@ +{ + "keyboard_name": "panc60", + "url": "", + "maintainer": "qmk", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_all": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":6, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}] + }, + + "LAYOUT_60_ansi": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":2.75}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":13.75, "y":4, "w":1.25}] + }, + + "LAYOUT_60_hhkb": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"|", "x":13, "y":0}, {"label":"~", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Delete", "x":13.5, "y":1, "w":1.5}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Os", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Os", "x":12.5, "y":4}] + } + } +} diff --git a/keyboards/panc60/keymaps/default/config.h b/keyboards/panc60/keymaps/default/config.h new file mode 100644 index 000000000000..a3ed4f762a6e --- /dev/null +++ b/keyboards/panc60/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 MechMerlin + * + * 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 + +// place overrides here diff --git a/keyboards/panc60/keymaps/default/keymap.c b/keyboards/panc60/keymaps/default/keymap.c new file mode 100644 index 000000000000..2754d89ff5e4 --- /dev/null +++ b/keyboards/panc60/keymaps/default/keymap.c @@ -0,0 +1,60 @@ +/* Copyright 2018 MechMerlin + * + * 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 QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT_60_hhkb( + 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_DEL, + 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_LSFT, MO(1), + KC_RGUI, KC_LALT, KC_SPC, KC_LALT, KC_LGUI), + + [1] = LAYOUT_60_hhkb( + 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_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_RIGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DOWN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} diff --git a/keyboards/panc60/keymaps/default/readme.md b/keyboards/panc60/keymaps/default/readme.md new file mode 100644 index 000000000000..3aa3cdb4c60c --- /dev/null +++ b/keyboards/panc60/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for panc60 diff --git a/keyboards/panc60/matrix.c b/keyboards/panc60/matrix.c new file mode 100644 index 000000000000..cf0f63837b9e --- /dev/null +++ b/keyboards/panc60/matrix.c @@ -0,0 +1,145 @@ +/* +Copyright 2018 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 +#include "matrix.h" + +#ifndef DEBOUNCE +# define DEBOUNCE 5 +#endif + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { } + +__attribute__ ((weak)) +void matrix_scan_user(void) { } + +// #define MATRIX_ROW_PINS { B3, B4, B5, B6, B7 } +// #define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6, A7, C7, C6, C5, C4, C3, C2, D7 } + +static uint8_t debouncing = DEBOUNCE; + +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +void matrix_init(void) { + + // disables JTAG so we can use them as columns + MCUCSR = (1<. + */ +#include "panc60.h" + +#include +#include "action_layer.h" +#include "i2c.h" +#include "quantum.h" + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} diff --git a/keyboards/panc60/panc60.h b/keyboards/panc60/panc60.h new file mode 100644 index 000000000000..95dcb1f90be4 --- /dev/null +++ b/keyboards/panc60/panc60.h @@ -0,0 +1,71 @@ +/* Copyright 2018 MechMerlin + * + * 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 PANC60_H +#define PANC60_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT_all( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \ + 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, K2D, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \ + K40, K41, K42, K47, K49, K4A, K4B, K4C, K4D \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \ + { K40, K41, K42, KC_NO, KC_NO, KC_NO, KC_NO, K47, KC_NO, K49, K4A, K4B, K4C, K4D, KC_NO } \ +} + +#define LAYOUT_60_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0E, \ + 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, K2D, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \ + K40, K41, K42, K47, K49, K4A, K4C, K4D \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, KC_NO, K0E }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO }, \ + { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, KC_NO }, \ + { K40, K41, K42, KC_NO, KC_NO, KC_NO, KC_NO, K47, KC_NO, K49, K4A, KC_NO, K4C, K4D, KC_NO } \ +} + +#define LAYOUT_60_hhkb( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \ + 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, K2D, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3E, \ + K41, K42, K47, K4A, K4C \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO }, \ + { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, K3E }, \ + { KC_NO, K41, K42, KC_NO, KC_NO, KC_NO, KC_NO, K47, KC_NO, KC_NO, K4A, KC_NO, K4C, KC_NO, KC_NO } \ +} + +#endif diff --git a/keyboards/panc60/readme.md b/keyboards/panc60/readme.md new file mode 100644 index 000000000000..05ac3d72beec --- /dev/null +++ b/keyboards/panc60/readme.md @@ -0,0 +1,46 @@ +# panc60 + +![panc60](https://imgix.ttcdn.co/i/product/original/0/670893-eca4599c4aad489dbe62609ac2fed86e.jpeg?q=100&auto=format%2Ccompress&w=500) + +The panc60 is a 60% PCB with backlight and rgb underglow. + +Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin), [Jack Humbert](https://github.com/jackhumbert) +Hardware Supported: panc60 PCB +Hardware Availability: [PANC Interactive](https://store.panc.co/product/panc60-60-pcb) + +Make example for this keyboard (after setting up your build environment): + + make panc60:default + +Flashing + +ps2avr(GB) boards use an atmega32a microcontroller and a different bootloader. It is not flashable using the regular QMK methods. + +To put the panc60 into reset, hold left control while plugging in. + +Windows: +1. Download [HIDBootFlash](http://vusb.wikidot.com/project:hidbootflash). +2. Place your keyboard into reset. +3. Press the `Find Device` button and ensure that your keyboard is found. +4. Press the `Open .hex File` button and locate the `.hex` file you created. +5. Press the `Flash Device` button and wait for the process to complete. + +macOS: +1. Install homebrew by typing the following: + ``` + /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" + ``` +2. Install `crosspack-avr`. + ``` + brew cask install crosspack-avr + ``` +3. Install the following packages: + ``` + brew install python + brew install pyusb + brew install --HEAD`https://raw.githubusercontent.com/robertgzr/homebrew-tap/master/bootloadhid.rb + +4. Place your keyboard into reset. +5. Flash the board by typing `bootloadHID -r` followed by the path to your `.hex` file. + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/panc60/rules.mk b/keyboards/panc60/rules.mk new file mode 100644 index 000000000000..fcb14d0ae0ac --- /dev/null +++ b/keyboards/panc60/rules.mk @@ -0,0 +1,52 @@ +# Copyright 2017 Luiz Ribeiro +# +# 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 . + +# MCU name +MCU = atmega32a +PROTOCOL = VUSB + +# unsupported features for now +NO_UART = yes +NO_SUSPEND_POWER_DOWN = yes + +# processor frequency +F_CPU = 12000000 + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = bootloadHID + +# build options +BOOTMAGIC_ENABLE = yes +MOUSEKEY_ENABLE = yes +EXTRAKEY_ENABLE = yes +CONSOLE_ENABLE = yes +COMMAND_ENABLE = yes +BACKLIGHT_ENABLE = no +RGBLIGHT_ENABLE = no +RGBLIGHT_CUSTOM_DRIVER = yes + +OPT_DEFS = -DDEBUG_LEVEL=0 + +# custom matrix setup +CUSTOM_MATRIX = yes +SRC = matrix.c i2c.c + +# programming options +PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex + +LAYOUTS = 60_ansi 60_hhkb diff --git a/keyboards/panc60/usbconfig.h b/keyboards/panc60/usbconfig.h new file mode 100644 index 000000000000..d2d848fcdc8f --- /dev/null +++ b/keyboards/panc60/usbconfig.h @@ -0,0 +1,396 @@ +/* Name: usbconfig.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2005-04-01 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $ + */ + +#ifndef __usbconfig_h_included__ +#define __usbconfig_h_included__ + +#include "config.h" + +/* +General Description: +This file is an example configuration (with inline documentation) for the USB +driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is +also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may +wire the lines to any other port, as long as D+ is also wired to INT0 (or any +other hardware interrupt, as long as it is the highest level interrupt, see +section at the end of this file). +*/ + +/* ---------------------------- Hardware Config ---------------------------- */ + +#define USB_CFG_IOPORTNAME D +/* This is the port where the USB bus is connected. When you configure it to + * "B", the registers PORTB, PINB and DDRB will be used. + */ +#define USB_CFG_DMINUS_BIT 3 +/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. + * This may be any bit in the port. + */ +#define USB_CFG_DPLUS_BIT 2 +/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. + * This may be any bit in the port. Please note that D+ must also be connected + * to interrupt pin INT0! [You can also use other interrupts, see section + * "Optional MCU Description" below, or you can connect D- to the interrupt, as + * it is required if you use the USB_COUNT_SOF feature. If you use D- for the + * interrupt, the USB interrupt will also be triggered at Start-Of-Frame + * markers every millisecond.] + */ +#define USB_CFG_CLOCK_KHZ (F_CPU/1000) +/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000, + * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code + * require no crystal, they tolerate +/- 1% deviation from the nominal + * frequency. All other rates require a precision of 2000 ppm and thus a + * crystal! + * Since F_CPU should be defined to your actual clock rate anyway, you should + * not need to modify this setting. + */ +#define USB_CFG_CHECK_CRC 0 +/* Define this to 1 if you want that the driver checks integrity of incoming + * data packets (CRC checks). CRC checks cost quite a bit of code size and are + * currently only available for 18 MHz crystal clock. You must choose + * USB_CFG_CLOCK_KHZ = 18000 if you enable this option. + */ + +/* ----------------------- Optional Hardware Config ------------------------ */ + +/* #define USB_CFG_PULLUP_IOPORTNAME D */ +/* If you connect the 1.5k pullup resistor from D- to a port pin instead of + * V+, you can connect and disconnect the device from firmware by calling + * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). + * This constant defines the port on which the pullup resistor is connected. + */ +/* #define USB_CFG_PULLUP_BIT 4 */ +/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined + * above) where the 1.5k pullup resistor is connected. See description + * above for details. + */ + +/* --------------------------- Functional Range ---------------------------- */ + +#define USB_CFG_HAVE_INTRIN_ENDPOINT 1 +/* Define this to 1 if you want to compile a version with two endpoints: The + * default control endpoint 0 and an interrupt-in endpoint (any other endpoint + * number). + */ +#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1 +/* Define this to 1 if you want to compile a version with three endpoints: The + * default control endpoint 0, an interrupt-in endpoint 3 (or the number + * configured below) and a catch-all default interrupt-in endpoint as above. + * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature. + */ +#define USB_CFG_EP3_NUMBER 3 +/* If the so-called endpoint 3 is used, it can now be configured to any other + * endpoint number (except 0) with this macro. Default if undefined is 3. + */ +/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */ +/* The above macro defines the startup condition for data toggling on the + * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1. + * Since the token is toggled BEFORE sending any data, the first packet is + * sent with the oposite value of this configuration! + */ +#define USB_CFG_IMPLEMENT_HALT 0 +/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature + * for endpoint 1 (interrupt endpoint). Although you may not need this feature, + * it is required by the standard. We have made it a config option because it + * bloats the code considerably. + */ +#define USB_CFG_SUPPRESS_INTR_CODE 0 +/* Define this to 1 if you want to declare interrupt-in endpoints, but don't + * want to send any data over them. If this macro is defined to 1, functions + * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if + * you need the interrupt-in endpoints in order to comply to an interface + * (e.g. HID), but never want to send any data. This option saves a couple + * of bytes in flash memory and the transmit buffers in RAM. + */ +#define USB_CFG_INTR_POLL_INTERVAL 1 +/* If you compile a version with endpoint 1 (interrupt-in), this is the poll + * interval. The value is in milliseconds and must not be less than 10 ms for + * low speed devices. + */ +#define USB_CFG_IS_SELF_POWERED 0 +/* Define this to 1 if the device has its own power supply. Set it to 0 if the + * device is powered from the USB bus. + */ +#define USB_CFG_MAX_BUS_POWER 500 +/* Set this variable to the maximum USB bus power consumption of your device. + * The value is in milliamperes. [It will be divided by two since USB + * communicates power requirements in units of 2 mA.] + */ +#define USB_CFG_IMPLEMENT_FN_WRITE 1 +/* Set this to 1 if you want usbFunctionWrite() to be called for control-out + * transfers. Set it to 0 if you don't need it and want to save a couple of + * bytes. + */ +#define USB_CFG_IMPLEMENT_FN_READ 0 +/* Set this to 1 if you need to send control replies which are generated + * "on the fly" when usbFunctionRead() is called. If you only want to send + * data from a static buffer, set it to 0 and return the data from + * usbFunctionSetup(). This saves a couple of bytes. + */ +#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 +/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints. + * You must implement the function usbFunctionWriteOut() which receives all + * interrupt/bulk data sent to any endpoint other than 0. The endpoint number + * can be found in 'usbRxToken'. + */ +#define USB_CFG_HAVE_FLOWCONTROL 0 +/* Define this to 1 if you want flowcontrol over USB data. See the definition + * of the macros usbDisableAllRequests() and usbEnableAllRequests() in + * usbdrv.h. + */ +#define USB_CFG_DRIVER_FLASH_PAGE 0 +/* If the device has more than 64 kBytes of flash, define this to the 64 k page + * where the driver's constants (descriptors) are located. Or in other words: + * Define this to 1 for boot loaders on the ATMega128. + */ +#define USB_CFG_LONG_TRANSFERS 0 +/* Define this to 1 if you want to send/receive blocks of more than 254 bytes + * in a single control-in or control-out transfer. Note that the capability + * for long transfers increases the driver size. + */ +/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */ +/* This macro is a hook if you want to do unconventional things. If it is + * defined, it's inserted at the beginning of received message processing. + * If you eat the received message and don't want default processing to + * proceed, do a return after doing your things. One possible application + * (besides debugging) is to flash a status LED on each packet. + */ +/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */ +/* This macro is a hook if you need to know when an USB RESET occurs. It has + * one parameter which distinguishes between the start of RESET state and its + * end. + */ +/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */ +/* This macro (if defined) is executed when a USB SET_ADDRESS request was + * received. + */ +#define USB_COUNT_SOF 1 +/* define this macro to 1 if you need the global variable "usbSofCount" which + * counts SOF packets. This feature requires that the hardware interrupt is + * connected to D- instead of D+. + */ +/* #ifdef __ASSEMBLER__ + * macro myAssemblerMacro + * in YL, TCNT0 + * sts timer0Snapshot, YL + * endm + * #endif + * #define USB_SOF_HOOK myAssemblerMacro + * This macro (if defined) is executed in the assembler module when a + * Start Of Frame condition is detected. It is recommended to define it to + * the name of an assembler macro which is defined here as well so that more + * than one assembler instruction can be used. The macro may use the register + * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages + * immediately after an SOF pulse may be lost and must be retried by the host. + * What can you do with this hook? Since the SOF signal occurs exactly every + * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in + * designs running on the internal RC oscillator. + * Please note that Start Of Frame detection works only if D- is wired to the + * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES! + */ +#define USB_CFG_CHECK_DATA_TOGGLING 0 +/* define this macro to 1 if you want to filter out duplicate data packets + * sent by the host. Duplicates occur only as a consequence of communication + * errors, when the host does not receive an ACK. Please note that you need to + * implement the filtering yourself in usbFunctionWriteOut() and + * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable + * for each control- and out-endpoint to check for duplicate packets. + */ +#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 +/* define this macro to 1 if you want the function usbMeasureFrameLength() + * compiled in. This function can be used to calibrate the AVR's RC oscillator. + */ +#define USB_USE_FAST_CRC 0 +/* The assembler module has two implementations for the CRC algorithm. One is + * faster, the other is smaller. This CRC routine is only used for transmitted + * messages where timing is not critical. The faster routine needs 31 cycles + * per byte while the smaller one needs 61 to 69 cycles. The faster routine + * may be worth the 32 bytes bigger code size if you transmit lots of data and + * run the AVR close to its limit. + */ + +/* -------------------------- Device Description --------------------------- */ + +#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF) +/* USB vendor ID for the device, low byte first. If you have registered your + * own Vendor ID, define it here. Otherwise you may use one of obdev's free + * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF) +/* This is the ID of the product, low byte first. It is interpreted in the + * scope of the vendor ID. If you have registered your own VID with usb.org + * or if you have licensed a PID from somebody else, define it here. Otherwise + * you may use one of obdev's free shared VID/PID pairs. See the file + * USB-IDs-for-free.txt for details! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_VERSION 0x00, 0x02 +/* Version number of the device: Minor number first, then major number. + */ +#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r' +#define USB_CFG_VENDOR_NAME_LEN 13 +/* These two values define the vendor name returned by the USB device. The name + * must be given as a list of characters under single quotes. The characters + * are interpreted as Unicode (UTF-16) entities. + * If you don't want a vendor name string, undefine these macros. + * ALWAYS define a vendor name containing your Internet domain name if you use + * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for + * details. + */ +#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B' +#define USB_CFG_DEVICE_NAME_LEN 8 +/* Same as above for the device name. If you don't want a device name, undefine + * the macros. See the file USB-IDs-for-free.txt before you assign a name if + * you use a shared VID/PID. + */ +/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ +/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ +/* Same as above for the serial number. If you don't want a serial number, + * undefine the macros. + * It may be useful to provide the serial number through other means than at + * compile time. See the section about descriptor properties below for how + * to fine tune control over USB descriptors such as the string descriptor + * for the serial number. + */ +#define USB_CFG_DEVICE_CLASS 0 +#define USB_CFG_DEVICE_SUBCLASS 0 +/* See USB specification if you want to conform to an existing device class. + * Class 0xff is "vendor specific". + */ +#define USB_CFG_INTERFACE_CLASS 3 /* HID */ +#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */ +#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */ +/* See USB specification if you want to conform to an existing device class or + * protocol. The following classes must be set at interface level: + * HID class is 3, no subclass and protocol required (but may be useful!) + * CDC class is 2, use subclass 2 and protocol 1 for ACM + */ +#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0 +/* Define this to the length of the HID report descriptor, if you implement + * an HID device. Otherwise don't define it or define it to 0. + * If you use this define, you must add a PROGMEM character array named + * "usbHidReportDescriptor" to your code which contains the report descriptor. + * Don't forget to keep the array and this define in sync! + */ + +/* #define USB_PUBLIC static */ +/* Use the define above if you #include usbdrv.c instead of linking against it. + * This technique saves a couple of bytes in flash memory. + */ + +/* ------------------- Fine Control over USB Descriptors ------------------- */ +/* If you don't want to use the driver's default USB descriptors, you can + * provide our own. These can be provided as (1) fixed length static data in + * flash memory, (2) fixed length static data in RAM or (3) dynamically at + * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more + * information about this function. + * Descriptor handling is configured through the descriptor's properties. If + * no properties are defined or if they are 0, the default descriptor is used. + * Possible properties are: + * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched + * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is + * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if + * you want RAM pointers. + * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found + * in static memory is in RAM, not in flash memory. + * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), + * the driver must know the descriptor's length. The descriptor itself is + * found at the address of a well known identifier (see below). + * List of static descriptor names (must be declared PROGMEM if in flash): + * char usbDescriptorDevice[]; + * char usbDescriptorConfiguration[]; + * char usbDescriptorHidReport[]; + * char usbDescriptorString0[]; + * int usbDescriptorStringVendor[]; + * int usbDescriptorStringDevice[]; + * int usbDescriptorStringSerialNumber[]; + * Other descriptors can't be provided statically, they must be provided + * dynamically at runtime. + * + * Descriptor properties are or-ed or added together, e.g.: + * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) + * + * The following descriptors are defined: + * USB_CFG_DESCR_PROPS_DEVICE + * USB_CFG_DESCR_PROPS_CONFIGURATION + * USB_CFG_DESCR_PROPS_STRINGS + * USB_CFG_DESCR_PROPS_STRING_0 + * USB_CFG_DESCR_PROPS_STRING_VENDOR + * USB_CFG_DESCR_PROPS_STRING_PRODUCT + * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER + * USB_CFG_DESCR_PROPS_HID + * USB_CFG_DESCR_PROPS_HID_REPORT + * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) + * + * Note about string descriptors: String descriptors are not just strings, they + * are Unicode strings prefixed with a 2 byte header. Example: + * int serialNumberDescriptor[] = { + * USB_STRING_DESCRIPTOR_HEADER(6), + * 'S', 'e', 'r', 'i', 'a', 'l' + * }; + */ + +#define USB_CFG_DESCR_PROPS_DEVICE 0 +#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 +#define USB_CFG_DESCR_PROPS_STRINGS 0 +#define USB_CFG_DESCR_PROPS_STRING_0 0 +#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 +#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 +#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 +#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_HID 0 +#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_HID_REPORT 0 +#define USB_CFG_DESCR_PROPS_UNKNOWN 0 + +#define usbMsgPtr_t unsigned short +/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to + * a scalar type here because gcc generates slightly shorter code for scalar + * arithmetics than for pointer arithmetics. Remove this define for backward + * type compatibility or define it to an 8 bit type if you use data in RAM only + * and all RAM is below 256 bytes (tiny memory model in IAR CC). + */ + +/* ----------------------- Optional MCU Description ------------------------ */ + +/* The following configurations have working defaults in usbdrv.h. You + * usually don't need to set them explicitly. Only if you want to run + * the driver on a device which is not yet supported or with a compiler + * which is not fully supported (such as IAR C) or if you use a differnt + * interrupt than INT0, you may have to define some of these. + */ +/* #define USB_INTR_CFG MCUCR */ +/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE GIMSK */ +/* #define USB_INTR_ENABLE_BIT INT0 */ +/* #define USB_INTR_PENDING GIFR */ +/* #define USB_INTR_PENDING_BIT INTF0 */ +/* #define USB_INTR_VECTOR INT0_vect */ + +/* Set INT1 for D- falling edge to count SOF */ +/* #define USB_INTR_CFG EICRA */ +#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10)) +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE EIMSK */ +#define USB_INTR_ENABLE_BIT INT1 +/* #define USB_INTR_PENDING EIFR */ +#define USB_INTR_PENDING_BIT INTF1 +#define USB_INTR_VECTOR INT1_vect + +#endif /* __usbconfig_h_included__ */ From 58b9b22670c2c36e8502826349d8f752d8b3ab37 Mon Sep 17 00:00:00 2001 From: Luca Date: Sun, 23 Sep 2018 22:49:17 +0200 Subject: [PATCH 027/505] Circuitry sample for PS/2 Mouse (#3959) Added a sample circuitry for handling the connection of a PS/2 Mouse. Even if it's written that a circuitry is needed, there're a lot of other things and the information gets lost really fast. A really simple sample helps to remember who wants to implement the functionality about the circuitry. --- docs/feature_ps2_mouse.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/feature_ps2_mouse.md b/docs/feature_ps2_mouse.md index 909406e7d2ac..01e2cc63db6b 100644 --- a/docs/feature_ps2_mouse.md +++ b/docs/feature_ps2_mouse.md @@ -6,6 +6,24 @@ To hook up a Trackpoint, you need to obtain a Trackpoint module (i.e. harvest fr There are three available modes for hooking up PS/2 devices: USART (best), interrupts (better) or busywait (not recommended). +### The Cirtuitry between Trackpoint and Controller + +To get the things working, a 4.7K drag is needed between the two lines DATA and CLK and the line 5+. + +``` + + DATA ----------+--------- PIN + | + 4.7K + | +MODULE 5+ --------+--+--------- PWR CONTROLLER + | + 4.7K + | + CLK ------+------------ PIN +``` + + ### Busywait Version Note: This is not recommended, you may encounter jerky movement or unsent inputs. Please use interrupt or USART version if possible. From ce057ea47448d0df2a05efa419f61563649a5821 Mon Sep 17 00:00:00 2001 From: listofoptions <39714365+listofoptions@users.noreply.github.com> Date: Sun, 23 Sep 2018 21:46:53 -0400 Subject: [PATCH 028/505] Keyboard: HP 46010A converter (#3967) * funged git history, restarting * tested and working (message typed on this) * updated documentation to include wiring directions * formatting * updated matrix and default layout a bit * getting ready for merge into main repo * getting ready for merge into main repo v2 * cleaning * cleaning repo of extranious files * updated documentation --- keyboards/converter/hp_46010a/config.h | 35 +++ keyboards/converter/hp_46010a/hp_46010a.c | 3 + keyboards/converter/hp_46010a/hp_46010a.h | 62 +++++ keyboards/converter/hp_46010a/info.json | 6 + .../hp_46010a/keymaps/default/keymap.c | 45 ++++ keyboards/converter/hp_46010a/matrix.c | 244 ++++++++++++++++++ keyboards/converter/hp_46010a/readme.md | 52 ++++ keyboards/converter/hp_46010a/rules.mk | 72 ++++++ 8 files changed, 519 insertions(+) create mode 100644 keyboards/converter/hp_46010a/config.h create mode 100644 keyboards/converter/hp_46010a/hp_46010a.c create mode 100644 keyboards/converter/hp_46010a/hp_46010a.h create mode 100644 keyboards/converter/hp_46010a/info.json create mode 100644 keyboards/converter/hp_46010a/keymaps/default/keymap.c create mode 100644 keyboards/converter/hp_46010a/matrix.c create mode 100644 keyboards/converter/hp_46010a/readme.md create mode 100644 keyboards/converter/hp_46010a/rules.mk diff --git a/keyboards/converter/hp_46010a/config.h b/keyboards/converter/hp_46010a/config.h new file mode 100644 index 000000000000..f77ed4115f9a --- /dev/null +++ b/keyboards/converter/hp_46010a/config.h @@ -0,0 +1,35 @@ +/* +Copyright 2018 listofoptions + +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 + +#include "config_common.h" + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 1 +#define MANUFACTURER QMK +#define PRODUCT 46010A keyboard converter +#define DESCRIPTION 46010A keyboard converter + +#define MATRIX_ROWS 14 +#define MATRIX_COLS 8 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + + diff --git a/keyboards/converter/hp_46010a/hp_46010a.c b/keyboards/converter/hp_46010a/hp_46010a.c new file mode 100644 index 000000000000..915a220f9199 --- /dev/null +++ b/keyboards/converter/hp_46010a/hp_46010a.c @@ -0,0 +1,3 @@ +#include "hp_46010a.h" +#include +#include "quantum.h" \ No newline at end of file diff --git a/keyboards/converter/hp_46010a/hp_46010a.h b/keyboards/converter/hp_46010a/hp_46010a.h new file mode 100644 index 000000000000..db64ce24a586 --- /dev/null +++ b/keyboards/converter/hp_46010a/hp_46010a.h @@ -0,0 +1,62 @@ +/* +Copyright 2018 listofoptions + +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 + +#include "quantum.h" + +/* ,---------. ,---------------------------------------------------------. ,---------. ,-------------------. + * | res|stop| | f1| f2| f3| f4|menu|user| f5| f6| f7| f8| |clrl|clrd| | | | | | + * `---------' `---------------------------------------------------------' `---------' `-------------------' + * ,------------------------------------------------------------------------..---------. ,-------------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| +| back||insl|dell| | *| /| +| -| + * |------------------------------------------------------------------------||---------| |-------------------| + * | tab| q| w| e| r| t| y| u| i| o| p| [| ]| \||insc|delc| | 7| 8| 9|pade| + * |------------------------------------------------------------------------||---------| |-------------------| + * |caps|ctrl| a| s| d| f| g| h| j| k| l| ;| '| retr|| cur|prev| | 4| 5| 6| ,| + * |------------------------------------------------------------------------------------ |-------------------| + * |dele|lshf | z| x| c| v| b| n| m| ,| .| /|rshf |sel | up|next| | 1| 2| 3| tab| + * |-------------------------------------------------------------------------|---------| |--------------- | + * |prnt| |lalt| space |ralt| |left|down|rght| | 0| .| | + * `-----------------------------------------------------------------------------------' `-------------------' + */ + +#define LAYOUT_HP_46010A( \ + KEY_RES, KEY_STOP, KEY_F1, KEY_F2, KEY_F3, KEY_F4,KEY_MENU,KEY_USER, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_CLRL, KEY_CLRD, KEY_B1, KEY_B2, KEY_B3, KEY_B4, \ + KEY_GRAV, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINU, KEY_PLUS, KEY_BACK, KEY_INSL, KEY_DELL, KEY_MULT, KEY_DIV, KEY_ADD, KEY_SUBT, \ + KEY_TAB, KEY_Q,KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P, KEY_LBRA, KEY_RBRA, KEY_PIPE, KEY_INSC, KEY_DELC, KEY_P7, KEY_P8, KEY_P9, KEY_PADE, \ + KEY_CAPS, KEY_CTRL, KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, KEY_SEMI, KEY_QUOT, KEY_RETR, KEY_CUR, KEY_PREV, KEY_P4, KEY_P5, KEY_P6, KEY_PCOM, \ + KEY_DELE, KEY_LSHF, KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMA, KEY_DOT, KEY_SLAS,KEY_RSHF, KEY_SEL, KEY_UP, KEY_NEXT, KEY_P1, KEY_P2, KEY_P3, KEY_PTAB, \ + KEY_PRNT, KEY_LALT, KEY_SPACE , KEY_RALT, KEY_LEFT, KEY_DOWN, KEY_RGHT, KEY_P0, KEY_PDOT \ +) { \ + {KEY_USER, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_CLRL, KEY_CLRD, KEY_MENU }, \ + {KEY_9, KEY_0, KEY_MINU, KEY_PLUS, KEY_BACK, KEY_INSL, KEY_DELL, KEY_8 }, \ + {KEY_O, KEY_P, KEY_LBRA, KEY_RBRA, KEY_PIPE, KEY_INSC, KEY_DELC, KEY_I }, \ + {KEY_K, KEY_L, KEY_SEMI, KEY_QUOT, KEY_RETR, KEY_CUR, KEY_PREV, KEY_J }, \ + {KEY_COMA, KEY_DOT, KEY_SLAS, KEY_1, KEY_SEL, KEY_UP, KEY_NEXT, KEY_M }, \ + {KEY_SPACE, KEY_LALT, KEY_RALT, KC_NO, KEY_LEFT, KEY_DOWN, KEY_RGHT, KC_NO }, \ + {KEY_F3, KEY_F2, KEY_F1, KEY_GRAV, KEY_CTRL, KEY_STOP, KEY_G, KEY_F4 }, \ + {KEY_6, KEY_5, KEY_4, KEY_3, KEY_CAPS, KEY_RSHF, KEY_LSHF, KEY_7 }, \ + {KEY_Y, KEY_T, KEY_R, KEY_E, KEY_W, KEY_Q, KEY_TAB, KEY_U }, \ + {KEY_RES, KEY_F, KEY_D, KEY_S, KEY_A, KC_NO, KEY_2, KEY_H }, \ + {KEY_P7, KEY_P4, KEY_P8, KEY_P5, KEY_P9, KEY_P6, KEY_PADE, KEY_PCOM }, \ + {KEY_MULT, KEY_P1, KEY_DIV, KEY_P2, KEY_PLUS, KEY_P3, KEY_MINU, KEY_PTAB }, \ + {KEY_B1, KEY_P0, KEY_B2, KC_NO, KEY_B3, KEY_PDOT, KEY_B4, KC_NO }, \ + {KEY_B, KEY_V, KEY_C, KEY_X, KEY_Z, KEY_PRNT, KEY_DELE, KEY_N }, \ +} + +#define LAYOUT LAYOUT_HP_46010A diff --git a/keyboards/converter/hp_46010a/info.json b/keyboards/converter/hp_46010a/info.json new file mode 100644 index 000000000000..de68a122858b --- /dev/null +++ b/keyboards/converter/hp_46010a/info.json @@ -0,0 +1,6 @@ +{ + "keyboard_name": "HP_46010A", + "keyboard_folder": "converter/HP_46010A", + "url": "https://deskthority.net/wiki/HP_46010A", + "maintainer": "listofoptions", +} diff --git a/keyboards/converter/hp_46010a/keymaps/default/keymap.c b/keyboards/converter/hp_46010a/keymaps/default/keymap.c new file mode 100644 index 000000000000..cb65bd422e51 --- /dev/null +++ b/keyboards/converter/hp_46010a/keymaps/default/keymap.c @@ -0,0 +1,45 @@ +/* +Copyright 2018 listofoptions + +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 QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* ,---------. ,---------------------------------------------------------. ,---------. ,-------------------. + * | esc|xxxx| | f1| f2| f3| f4|xxxx|xxxx| f5| f6| f7| f8| |xxxx|xxxx| | f9| f10| f11| f12| + * `---------' `---------------------------------------------------------' `---------' `-------------------' + * ,------------------------------------------------------------------------..---------. ,-------------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| back||ins |home| | *| /| +| -| + * |------------------------------------------------------------------------||---------| |-------------------| + * | tab| q| w| e| r| t| y| u| i| o| p| [| ]| \||del | end| | 7| 8| 9|pade| + * |------------------------------------------------------------------------||---------| |-------------------| + * |caps|ctrl| a| s| d| f| g| h| j| k| l| ;| '| retr||xxxx|pgup| | 4| 5| 6| ,| + * |------------------------------------------------------------------------------------ |-------------------| + * |del |lsft | z| x| c| v| b| n| m| ,| .| /|rsft | app| up|pgdn| | 1| 2| 3| tab| + * |-------------------------------------------------------------------------|---------| |--------------- | + * | gui| |lalt| space |ralt| |left|down|rght| | 0| .| | + * `-----------------------------------------------------------------------------------' `-------------------' + */ + + [0] = LAYOUT( + KC_ESC, KC_NO, KC_F1, KC_F2, KC_F3, KC_F4,KC_NO, KC_NO, KC_F5, KC_F6, KC_F7, KC_F8, KC_NO, KC_NO, KC_F9, KC_F10, KC_F11, KC_F12, \ + 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_EQUAL, KC_BSPC, KC_INS, KC_HOME, KC_PAST, KC_PSLS, KC_PPLS, 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_P7, KC_P8, KC_P9, KC_PENT, \ + KC_CAPS, 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_NO, KC_PGUP, KC_P4, KC_P5, KC_P6, KC_PCMM, \ + KC_DEL, 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_APP, KC_UP, KC_PGDN, KC_P1, KC_P2, KC_P3, KC_TAB, \ + KC_LGUI, KC_LALT, KC_SPACE , KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \ + ) +} ; \ No newline at end of file diff --git a/keyboards/converter/hp_46010a/matrix.c b/keyboards/converter/hp_46010a/matrix.c new file mode 100644 index 000000000000..2ca7d0357e39 --- /dev/null +++ b/keyboards/converter/hp_46010a/matrix.c @@ -0,0 +1,244 @@ +/* +Copyright 2018 listofoptions + +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 +#if defined(__AVR__) +#include +#endif +#include + +#include "wait.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "timer.h" +#include "LUFA/Drivers/Peripheral/SPI.h" + +#include "config.h" + + +#ifndef DEBOUNCING_DELAY +# define DEBOUNCING_DELAY 5 +#endif + +#if ( DEBOUNCING_DELAY > 0 ) +static uint16_t debouncing_time ; +static bool debouncing = false ; +#endif + +static uint8_t matrix [MATRIX_ROWS] = {0}; + +#if ( DEBOUNCING_DELAY > 0 ) +static uint8_t matrix_debounce_old [MATRIX_ROWS] = {0}; +static uint8_t matrix_debounce_new [MATRIX_ROWS] = {0}; +#endif + +__attribute__ ((weak)) +void matrix_init_quantum(void) { + matrix_init_kb(); +} + +__attribute__ ((weak)) +void matrix_scan_quantum(void) { + matrix_scan_kb(); +} + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +// the keyboard's internal wiring is such that the inputs to the logic are +// a clock signal, and a reset line. +// the output is a single output pin. im bitbanging here, but the SPI controller +// would work normally +// +// the device functions, by using the clock signal to count 128 bits, the lower +// 3 bits of this 7 bit counter are tied to a 1-of-8 multiplexer, this forms +// the columns. +// the upper 4 bits form the rows, and are decoded using bcd to decimal +// decoders, so that 14 out of 16 of the outputs are wired to the rows of the +// matrix. each switch has a diode, such that the row signal feeds into the +// switch, and then into the diode, then into one of the columns into the +// matrix. the reset pin can be used to reset the entire counter. + +#define RESET _BV(PB0) +#define SCLK _BV(PB1) +#define SDATA _BV(PB3) +#define LED _BV(PD6) + +inline +static +void SCLK_increment(void) { + PORTB &= ~SCLK ; + _delay_us( 4 ) ; // make sure the line is stable + PORTB |= SCLK ; + _delay_us( 4 ) ; + + return ; +} + +inline +static +void Matrix_Reset(void) { + PORTB |= RESET ; + _delay_us( 4 ) ; // make sure the line is stable + PORTB &= ~RESET ; + + return ; +} + +inline +static +uint8_t Matrix_ReceiveByte (void) { + uint8_t received = 0 ; + uint8_t temp = 0 ; + for ( uint8_t bit = 0; bit < MATRIX_COLS; ++bit ) { + // toggle the clock + SCLK_increment(); + temp = (PINB & SDATA) << 4 ; + received |= temp >> bit ; + } + + return received ; +} + +inline +static +void Matrix_ThrowByte(void) { + // we use MATRIX_COLS - 1 here because that would put us at 7 clocks + for ( uint8_t bit = 0; bit < MATRIX_COLS - 1; ++bit ) { + // toggle the clock + SCLK_increment(); + } + + return ; +} + +void matrix_init () { + // debug_matrix = 1; + // PB0 (SS) and PB1 (SCLK) set to outputs + DDRB |= RESET | SCLK ; + // PB2, is unused, and PB3 is our serial input + DDRB &= ~SDATA ; + + // SS is reset for this board, and is active High + // SCLK is the serial clock and is active High + PORTB &= ~RESET ; + PORTB |= SCLK ; + + // led pin + DDRD |= LED ; + PORTD &= ~LED ; + + matrix_init_quantum(); + + //toggle reset, to put the keyboard logic into a known state + Matrix_Reset() ; +} + +uint8_t matrix_scan(void) { + + // the first byte of the keyboard's output data can be ignored + Matrix_ThrowByte(); + +#if ( DEBOUNCING_DELAY > 0 ) + + for ( uint8_t row = 0 ; row < MATRIX_ROWS ; ++row ) { + //transfer old debouncing values + matrix_debounce_old[row] = matrix_debounce_new[row] ; + // read new key-states in + matrix_debounce_new[row] = Matrix_ReceiveByte() ; + + if ( matrix_debounce_new[row] != matrix_debounce_old[row] ) { + debouncing = true ; + debouncing_time = timer_read() ; + } + } + +#else + // without debouncing we simply just read in the raw matrix + for ( uint8_t row = 0 ; row < MATRIX_ROWS ; ++row ) { + matrix[row] = Matrix_ReceiveByte ; + } +#endif + + +#if ( DEBOUNCING_DELAY > 0 ) + if ( debouncing && ( timer_elapsed( debouncing_time ) > DEBOUNCING_DELAY ) ) { + + for ( uint8_t row = 0 ; row < MATRIX_ROWS ; ++row ) { + matrix[row] = matrix_debounce_new[row] ; + } + + debouncing = false ; + } +#endif + Matrix_Reset() ; + + matrix_scan_quantum() ; + return 1; +} + +inline +uint8_t matrix_get_row( uint8_t row ) { + return matrix[row]; +} + +void matrix_print(void) +{ + print("\nr/c 01234567\n"); + + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + phex(row); print(": "); + print_bin_reverse8(matrix_get_row(row)); + print("\n"); + } +} + +inline +uint8_t matrix_rows(void) { + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) { + return MATRIX_COLS; +} + +// as an aside, I used the M0110 converter: +// tmk_core/common/keyboard.c, quantum/matrix.c, and the project layout of the planck +// the online ducmentation starting from : +// https://docs.qmk.fm/#/config_options +// https://docs.qmk.fm/#/understanding_qmk +// and probably a few i forgot.... \ No newline at end of file diff --git a/keyboards/converter/hp_46010a/readme.md b/keyboards/converter/hp_46010a/readme.md new file mode 100644 index 000000000000..2321faa6e16c --- /dev/null +++ b/keyboards/converter/hp_46010a/readme.md @@ -0,0 +1,52 @@ +# HP 46010A + +![46010A](https://deskthority.net/w/images/a/a5/HP_46010A_--_top.jpg) + +A converter for the eponymous keyboard. + +Keyboard Maintainer: [Listofoptions](https://github.com/listofoptions) +Hardware Supported: HP 46010A, Teensy 2.0 + +Make example for this keyboard (after setting up your build environment): + + make converter/HP_46010A:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +to get a matrix created if your board uses a different one (i used the US layout) please see the following gists: +for the matrix itself: https://gist.github.com/listofoptions/cdf70d94767e9c6c027741850a24c568 +for the program to generate the matrix: https://gist.github.com/listofoptions/d245e370678024edbe5bed8c8ab17999 + +to build the actual converter, you are going to need to either splice into the a connector or, use a multi-meter to buzz/ohm out which wires go where. +from the bottom of the pcb the pins are arraged as follows: + + + 4 5 6 + 3 2 1 + + +connect a six pin modular connector of the 6p6c variaty. +then lop off the other end of the cable, striping the wires inside. +use the ohm-meter to find the corresponding wire for each pin on the bottom of the pcb + +the pin meanings are as follows: +1 reset +2 no connection +3 vcc +4 data out +5 clock +6 ground + +wire the ground and power pins to ground and 5v power on the teensy (or other avr device of your choice) +connect +on the teensy the connection is as follows + + +teensy | HP 46010A +----|----- +gnd | gnd (6) +vcc | vcc (3) +PB0 | reset (1) +PB1 | clock (5) +PB3 | data out (4) +gnd | no connection (2) -- optional diff --git a/keyboards/converter/hp_46010a/rules.mk b/keyboards/converter/hp_46010a/rules.mk new file mode 100644 index 000000000000..ddd2d593bd21 --- /dev/null +++ b/keyboards/converter/hp_46010a/rules.mk @@ -0,0 +1,72 @@ +# 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 + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = halfkay + +# 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 = yes # 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 = no # Enable WS2812 RGB underlight. +API_SYSEX_ENABLE = no +SPLIT_KEYBOARD = no +WAIT_FOR_USB = yes + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +LAYOUTS_HAS_RGB = NO + +CUSTOM_MATRIX = yes +SRC = matrix.c \ No newline at end of file From 07d317ab8877f935768e8798c1560242e3687847 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sun, 23 Sep 2018 18:47:43 -0700 Subject: [PATCH 029/505] Keyboard: Crkbd: move I2C and Serial defines to keyboard's config.h (#3970) * Crkbd: move I2C and Serial defines to keyboard's config.h per @drashna on Discord * Crkbd: remove misleading comment re: I2C and Serial USE_I2C and USE_SERIAL are usually a "one or the other"-type deal, but this keyboard uses both. --- keyboards/crkbd/config.h | 3 +++ keyboards/crkbd/keymaps/default/config.h | 4 ---- keyboards/crkbd/keymaps/like_jis/config.h | 4 ---- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/keyboards/crkbd/config.h b/keyboards/crkbd/config.h index 64fee7545723..4357a218d4ac 100644 --- a/keyboards/crkbd/config.h +++ b/keyboards/crkbd/config.h @@ -21,6 +21,9 @@ along with this program. If not, see . #include "config_common.h" #include +#define USE_I2C +#define USE_SERIAL + #ifdef USE_Link_Time_Optimization // LTO has issues with macros (action_get_macro) and "functions" (fn_actions), // so just disable them diff --git a/keyboards/crkbd/keymaps/default/config.h b/keyboards/crkbd/keymaps/default/config.h index c573530f7482..644e8136509b 100644 --- a/keyboards/crkbd/keymaps/default/config.h +++ b/keyboards/crkbd/keymaps/default/config.h @@ -20,10 +20,6 @@ along with this program. If not, see . #pragma once -/* Use I2C or Serial */ - -#define USE_I2C -#define USE_SERIAL //#define USE_MATRIX_I2C /* Select hand configuration */ diff --git a/keyboards/crkbd/keymaps/like_jis/config.h b/keyboards/crkbd/keymaps/like_jis/config.h index 4c31cc7794aa..0e2960a937d5 100644 --- a/keyboards/crkbd/keymaps/like_jis/config.h +++ b/keyboards/crkbd/keymaps/like_jis/config.h @@ -20,10 +20,6 @@ along with this program. If not, see . #pragma once -/* Use I2C or Serial */ - -#define USE_I2C -#define USE_SERIAL //#define USE_MATRIX_I2C /* Select hand configuration */ From 9012f4c2e005253574f2af2887c2317d51c70405 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sun, 23 Sep 2018 20:50:08 -0700 Subject: [PATCH 030/505] Keyboard: Crkbd: Configurator support and readme formatting (#3971) --- keyboards/crkbd/info.json | 62 +++++++++++++++++++++++++++++++++++++++ keyboards/crkbd/readme.md | 3 +- 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 keyboards/crkbd/info.json diff --git a/keyboards/crkbd/info.json b/keyboards/crkbd/info.json new file mode 100644 index 000000000000..d74bb49430e6 --- /dev/null +++ b/keyboards/crkbd/info.json @@ -0,0 +1,62 @@ +{ + "keyboard_name": "crkbd (helidox) rev. 1", + "url": "", + "maintainer": "qmk", + "width": 15, + "height": 4.5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Esc", "x":0, "y":0.3}, + {"label":"Q", "x":1, "y":0.3}, + {"label":"W", "x":2, "y":0.1}, + {"label":"E", "x":3, "y":0}, + {"label":"R", "x":4, "y":0.1}, + {"label":"T", "x":5, "y":0.2}, + + {"label":"Y", "x":9, "y":0.2}, + {"label":"U", "x":10, "y":0.1}, + {"label":"I", "x":11, "y":0}, + {"label":"O", "x":12, "y":0.1}, + {"label":"P", "x":13, "y":0.3}, + {"label":"Back Space", "x":14, "y":0.3}, + + {"label":"Ctrl / Tab", "x":0, "y":1.3}, + {"label":"A", "x":1, "y":1.3}, + {"label":"S", "x":2, "y":1.1}, + {"label":"D", "x":3, "y":1}, + {"label":"F", "x":4, "y":1.1}, + {"label":"G", "x":5, "y":1.2}, + + {"label":"H", "x":9, "y":1.2}, + {"label":"J", "x":10, "y":1.1}, + {"label":"K", "x":11, "y":1}, + {"label":"L", "x":12, "y":1.1}, + {"label":";", "x":13, "y":1.3}, + {"label":"'", "x":14, "y":1.3}, + + {"label":"Shift", "x":0, "y":2.3}, + {"label":"Z", "x":1, "y":2.3}, + {"label":"X", "x":2, "y":2.1}, + {"label":"C", "x":3, "y":2}, + {"label":"V", "x":4, "y":2.1}, + {"label":"B", "x":5, "y":2.2}, + + {"label":"N", "x":9, "y":2.2}, + {"label":"M", "x":10, "y":2.1}, + {"label":",", "x":11, "y":2}, + {"label":".", "x":12, "y":2.1}, + {"label":"/", "x":13, "y":2.3}, + {"label":"Shift", "x":14, "y":2.3}, + + {"label":"GUI / KC_HANJ", "x":4, "y":3.7}, + {"label":"Lower", "x":5, "y":3.7}, + {"label":"Space", "x":6, "y":3.2, "h":1.5}, + + {"label":"Enter", "x":8, "y":3.2, "h":1.5}, + {"label":"Raise", "x":9, "y":3.7}, + {"label":"Alt / KC_HAEN", "x":10, "y":3.7} + ] + } + } +} diff --git a/keyboards/crkbd/readme.md b/keyboards/crkbd/readme.md index 2f9f047a47ce..591fdfe0da90 100644 --- a/keyboards/crkbd/readme.md +++ b/keyboards/crkbd/readme.md @@ -10,8 +10,9 @@ A split keyboard with 3x6 vertically staggered keys and 3 thumb keys. Keyboard Maintainer: [foostan](https://github.com/foostan/) [@foostan](https://twitter.com/foostan) Hardware Supported: Crkbd PCB, Pro Micro Hardware Availability: [PCB & Case Data](https://github.com/foostan/crkbd) + Make example for this keyboard (after setting up your build environment): make crkbd:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). From b7e25f9ec4203670f2434e82608554ba284cf1f3 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Mon, 24 Sep 2018 20:39:17 -0700 Subject: [PATCH 031/505] Keyboard: DZ60 Bug: layout_directional is shifted to the left by one (#3978) * layout_directional is shifted to the left by one * forgot to adjust the physical layout --- keyboards/dz60/dz60.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/dz60/dz60.h b/keyboards/dz60/dz60.h index b1089d3b6495..3d0b0dd527da 100644 --- a/keyboards/dz60/dz60.h +++ b/keyboards/dz60/dz60.h @@ -82,13 +82,13 @@ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K312, K313, K314, \ + K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \ K400, K401, K403, K404, K406, K408, K410, K411, K412, K413, K414 \ ) { \ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, KC_NO, K312, K313, K314 }, \ + { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \ { K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, K412, K413, K414 } \ } From e72e4b6920299176a322a2862f930b7ee5f73dff Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 8 May 2018 18:46:29 -0700 Subject: [PATCH 032/505] Store Clicky status in EEPROM --- docs/feature_audio.md | 4 +--- quantum/audio/audio.c | 8 +++---- quantum/process_keycode/process_clicky.c | 14 ++++++------ users/drashna/drashna.c | 28 +++++++++++++++++------- users/drashna/drashna.h | 3 +-- 5 files changed, 33 insertions(+), 24 deletions(-) diff --git a/docs/feature_audio.md b/docs/feature_audio.md index 039c62cdf16b..fe210c09b95c 100644 --- a/docs/feature_audio.md +++ b/docs/feature_audio.md @@ -128,13 +128,11 @@ This adds a click sound each time you hit a button, to simulate click sounds fro * `CK_UP` - Increases the frequency of the clicks * `CK_DOWN` - Decreases the frequency of the clicks + The feature is disabled by default, to save space. To enable it, add this to your `config.h`: #define AUDIO_CLICKY -Additionally, even when enabled, the feature is not enabled by default, so you would need to turn it on first. And since we don't use EEPROM to store the setting (yet), you can default this to on by adding this to your `config.h`: - - #define AUDIO_CLICKY_ON You can configure the default, min and max frequencies, the stepping and built in randomness by defining these values: diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c index c948a60d6cfc..6d6833ec11f1 100644 --- a/quantum/audio/audio.c +++ b/quantum/audio/audio.c @@ -223,7 +223,7 @@ void audio_init() TCCR1B = (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (1 << CS11) | (0 << CS10); TIMER_1_PERIOD = (uint16_t)(((float)F_CPU) / (440 * CPU_PRESCALER)); TIMER_1_DUTY_CYCLE = (uint16_t)((((float)F_CPU) / (440 * CPU_PRESCALER)) * note_timbre); - #endif + #endif audio_initialized = true; } @@ -231,7 +231,7 @@ void audio_init() if (audio_config.enable) { PLAY_SONG(startup_song); } - + } void stop_all_notes() @@ -464,7 +464,7 @@ ISR(TIMER3_AUDIO_vect) note_position++; bool end_of_note = false; if (TIMER_3_PERIOD > 0) { - if (!note_resting) + if (!note_resting) end_of_note = (note_position >= (note_length / TIMER_3_PERIOD * 0xFFFF - 1)); else end_of_note = (note_position >= (note_length)); @@ -604,7 +604,7 @@ ISR(TIMER1_AUDIO_vect) note_position++; bool end_of_note = false; if (TIMER_1_PERIOD > 0) { - if (!note_resting) + if (!note_resting) end_of_note = (note_position >= (note_length / TIMER_1_PERIOD * 0xFFFF - 1)); else end_of_note = (note_position >= (note_length)); diff --git a/quantum/process_keycode/process_clicky.c b/quantum/process_keycode/process_clicky.c index 1e950d111377..bd2f1b3b37b2 100644 --- a/quantum/process_keycode/process_clicky.c +++ b/quantum/process_keycode/process_clicky.c @@ -3,11 +3,6 @@ #ifdef AUDIO_CLICKY -#ifdef AUDIO_CLICKY_ON -bool clicky_enable = true; -#else // AUDIO_CLICKY_ON -bool clicky_enable = false; -#endif // AUDIO_CLICKY_ON #ifndef AUDIO_CLICKY_FREQ_DEFAULT #define AUDIO_CLICKY_FREQ_DEFAULT 440.0f #endif // !AUDIO_CLICKY_FREQ_DEFAULT @@ -27,6 +22,8 @@ bool clicky_enable = false; float clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; float clicky_song[][2] = {{AUDIO_CLICKY_FREQ_DEFAULT, 3}, {AUDIO_CLICKY_FREQ_DEFAULT, 1}}; // 3 and 1 --> durations +extern audio_config_t audio_config; + #ifndef NO_MUSIC_MODE extern bool music_activated; extern bool midi_activated; @@ -42,7 +39,10 @@ void clicky_play(void) { } bool process_clicky(uint16_t keycode, keyrecord_t *record) { - if (keycode == CLICKY_TOGGLE && record->event.pressed) { clicky_enable = !clicky_enable; } + if (keycode == CLICKY_TOGGLE && record->event.pressed) { + audio_config.clicky ^= 1; + eeconfig_update_audio(audio_config.raw); + } if (keycode == CLICKY_RESET && record->event.pressed) { clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; } @@ -60,7 +60,7 @@ bool process_clicky(uint16_t keycode, keyrecord_t *record) { } - if ( clicky_enable ) { + if ( audio_config.clicky ) { if (record->event.pressed) { clicky_play();; } diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 20df2f4de6c8..7bb272a26737 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -133,9 +133,6 @@ void led_set_keymap(uint8_t usb_led) {} void matrix_init_user(void) { userspace_config.raw = eeprom_read_byte(EECONFIG_USERSPACE); -#ifdef AUDIO_CLICKY - clicky_enable = userspace_config.clicky_enable; -#endif #ifdef BOOTLOADER_CATERINA DDRD &= ~(1<<5); @@ -145,7 +142,6 @@ void matrix_init_user(void) { PORTB &= ~(1<<0); #endif - #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) set_unicode_input_mode(UC_WINC); #endif //UNICODE_ENABLE @@ -338,11 +334,27 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return false; break; - case CLICKY_TOGGLE: -#ifdef AUDIO_CLICKY - userspace_config.clicky_enable = clicky_enable; - eeprom_update_byte(EECONFIG_USERSPACE, userspace_config.raw); + case KC_CCCV: // One key copy/paste + if(record->event.pressed){ + copy_paste_timer = timer_read(); + } else { + if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy + register_code(KC_LCTL); + tap(KC_C); + unregister_code(KC_LCTL); +#ifdef AUDIO_ENABLE + PLAY_SONG(tone_copy); +#endif + } else { // Tap, paste + register_code(KC_LCTL); + tap(KC_V); + unregister_code(KC_LCTL); +#ifdef AUDIO_ENABLE + PLAY_SONG(tone_paste); #endif + } + } + return false; break; #ifdef UNICODE_ENABLE case UC_FLIP: // (╯°□°)╯ ︵ ┻━┻ diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h index dd0d1c0d7eb8..de8c3ba9470a 100644 --- a/users/drashna/drashna.h +++ b/users/drashna/drashna.h @@ -49,7 +49,7 @@ enum userspace_layers { // RGB color codes are no longer located here anymore. Instead, you will want to // head to https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight_list.h -extern bool clicky_enable; +extern bool rgb_layer_change; #ifdef RGBLIGHT_ENABLE void rgblight_sethsv_default_helper(uint8_t index); @@ -64,7 +64,6 @@ bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t thi typedef union { uint8_t raw; struct { - bool clicky_enable :1; bool rgb_layer_change :1; bool is_overwatch :1; bool nuke_switch :1; From cfb1b353eef290ea4eddd7cfcb4617ca25d440d2 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 31 May 2018 12:24:10 -0700 Subject: [PATCH 033/505] Add functions so you can configure programatically --- quantum/audio/audio.h | 3 +- quantum/process_keycode/process_clicky.c | 60 +++++++++++++++++------- quantum/process_keycode/process_clicky.h | 9 ++++ 3 files changed, 53 insertions(+), 19 deletions(-) diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h index da09b2bcd28a..8136c5b258fa 100644 --- a/quantum/audio/audio.h +++ b/quantum/audio/audio.h @@ -40,7 +40,8 @@ typedef union { uint8_t raw; struct { bool enable :1; - uint8_t level :7; + bool clicky_enable :1; + uint8_t level :6; }; } audio_config_t; diff --git a/quantum/process_keycode/process_clicky.c b/quantum/process_keycode/process_clicky.c index bd2f1b3b37b2..b3c8d890e205 100644 --- a/quantum/process_keycode/process_clicky.c +++ b/quantum/process_keycode/process_clicky.c @@ -38,29 +38,53 @@ void clicky_play(void) { PLAY_SONG(clicky_song); } +void clicky_freq_up(void) { + float new_freq = clicky_freq * AUDIO_CLICKY_FREQ_FACTOR; + if (new_freq < AUDIO_CLICKY_FREQ_MAX) { + clicky_freq = new_freq; + } +} + +void clicky_freq_down(void) { + float new_freq = clicky_freq / AUDIO_CLICKY_FREQ_FACTOR; + if (new_freq > AUDIO_CLICKY_FREQ_MIN) { + clicky_freq = new_freq; + } +} + +void clicky_freq_reset(void) { + clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; +} + +void clicky_freq_toggle(void) { + audio_config.clicky_enable ^= 1; + eeconfig_update_audio(audio_config.raw); +} + +void clicky_freq_on(void) { + audio_config.clicky_enable = 1; + eeconfig_update_audio(audio_config.raw); +} + +void clicky_freq_off(void) { + audio_config.clicky_enable = 0; + eeconfig_update_audio(audio_config.raw); +} + +bool is_clicky_on(void) { + return (audio_config.clicky_enable != 0); +} + bool process_clicky(uint16_t keycode, keyrecord_t *record) { - if (keycode == CLICKY_TOGGLE && record->event.pressed) { - audio_config.clicky ^= 1; - eeconfig_update_audio(audio_config.raw); - } + if (keycode == CLICKY_TOGGLE && record->event.pressed) { clicky_freq_toggle(); } - if (keycode == CLICKY_RESET && record->event.pressed) { clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; } + if (keycode == CLICKY_RESET && record->event.pressed) { clicky_freq_reset(); } - if (keycode == CLICKY_UP && record->event.pressed) { - float new_freq = clicky_freq * AUDIO_CLICKY_FREQ_FACTOR; - if (new_freq < AUDIO_CLICKY_FREQ_MAX) { - clicky_freq = new_freq; - } - } - if (keycode == CLICKY_DOWN && record->event.pressed) { - float new_freq = clicky_freq / AUDIO_CLICKY_FREQ_FACTOR; - if (new_freq > AUDIO_CLICKY_FREQ_MIN) { - clicky_freq = new_freq; - } - } + if (keycode == CLICKY_UP && record->event.pressed) { clicky_freq_up(); } + if (keycode == CLICKY_DOWN && record->event.pressed) { clicky_freq_down(); } - if ( audio_config.clicky ) { + if ( audio_config.clicky_enable ) { if (record->event.pressed) { clicky_play();; } diff --git a/quantum/process_keycode/process_clicky.h b/quantum/process_keycode/process_clicky.h index e274af56f1f3..6ee3cc5d9f8b 100644 --- a/quantum/process_keycode/process_clicky.h +++ b/quantum/process_keycode/process_clicky.h @@ -4,4 +4,13 @@ void clicky_play(void); bool process_clicky(uint16_t keycode, keyrecord_t *record); +void clicky_freq_up(void); +void clicky_freq_down(void); +void clicky_freq_reset(void); +void clicky_freq_toggle(void); +void clicky_freq_on(void); +void clicky_freq_off(void); + +bool is_clicky_on(void); + #endif From a0309db983150fd0197eb620a6ba552d90d29f93 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 1 Jun 2018 13:29:52 -0700 Subject: [PATCH 034/505] Add On/Off keycodes --- docs/feature_audio.md | 12 +++++++----- quantum/process_keycode/process_clicky.c | 11 +++++++---- quantum/process_keycode/process_clicky.h | 7 ++++--- quantum/quantum_keycodes.h | 5 +++++ 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/docs/feature_audio.md b/docs/feature_audio.md index fe210c09b95c..82e0ed9503dc 100644 --- a/docs/feature_audio.md +++ b/docs/feature_audio.md @@ -119,14 +119,16 @@ You can completely disable Music Mode as well. This is useful, if you're pressed #define NO_MUSIC_MODE -## Faux Click +## Audio Click This adds a click sound each time you hit a button, to simulate click sounds from the keyboard. And the sounds are slightly different for each keypress, so it doesn't sound like a single long note, if you type rapidly. * `CK_TOGG` - Toggles the status (will play sound if enabled) -* `CK_RST` - Resets the frequency to the default state -* `CK_UP` - Increases the frequency of the clicks -* `CK_DOWN` - Decreases the frequency of the clicks +* `CK_ON` - Turns on Audio Click (plays sound) +* `CK_OFF` - Turns off Audio Click (doesn't play sound) +* `CK_RST` - Resets the frequency to the default state (plays sound at default frequency) +* `CK_UP` - Increases the frequency of the clicks (plays sound at new frequency) +* `CK_DOWN` - Decreases the frequency of the clicks (plays sound at new frequency) The feature is disabled by default, to save space. To enable it, add this to your `config.h`: @@ -142,7 +144,7 @@ You can configure the default, min and max frequencies, the stepping and built i | `AUDIO_CLICKY_FREQ_MIN` | 65.0f | Sets the lowest frequency (under 60f are a bit buggy). | | `AUDIO_CLICKY_FREQ_MAX` | 1500.0f | Sets the the highest frequency. Too high may result in coworkers attacking you. | | `AUDIO_CLICKY_FREQ_FACTOR` | 1.18921f| Sets the stepping of UP/DOWN key codes. | -| `AUDIO_CLICKY_FREQ_RANDOMNESS` | 0.05f | Sets a factor of randomness for the clicks, Setting this to `0f` will make each click identical. | +| `AUDIO_CLICKY_FREQ_RANDOMNESS` | 0.05f | Sets a factor of randomness for the clicks, Setting this to `0f` will make each click identical, and `1.0f` will make this sound much like the 90's computer screen scrolling/typing effect. | diff --git a/quantum/process_keycode/process_clicky.c b/quantum/process_keycode/process_clicky.c index b3c8d890e205..36578047adbb 100644 --- a/quantum/process_keycode/process_clicky.c +++ b/quantum/process_keycode/process_clicky.c @@ -56,17 +56,17 @@ void clicky_freq_reset(void) { clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; } -void clicky_freq_toggle(void) { +void clicky_toggle(void) { audio_config.clicky_enable ^= 1; eeconfig_update_audio(audio_config.raw); } -void clicky_freq_on(void) { +void clicky_on(void) { audio_config.clicky_enable = 1; eeconfig_update_audio(audio_config.raw); } -void clicky_freq_off(void) { +void clicky_off(void) { audio_config.clicky_enable = 0; eeconfig_update_audio(audio_config.raw); } @@ -76,7 +76,10 @@ bool is_clicky_on(void) { } bool process_clicky(uint16_t keycode, keyrecord_t *record) { - if (keycode == CLICKY_TOGGLE && record->event.pressed) { clicky_freq_toggle(); } + if (keycode == CLICKY_TOGGLE && record->event.pressed) { clicky_toggle(); } + + if (keycode == CLICKY_ENABLE && record->event.pressed) { clicky_on(); } + if (keycode == CLICKY_DISABLE && record->event.pressed) { clicky_off(); } if (keycode == CLICKY_RESET && record->event.pressed) { clicky_freq_reset(); } diff --git a/quantum/process_keycode/process_clicky.h b/quantum/process_keycode/process_clicky.h index 6ee3cc5d9f8b..f746edb95193 100644 --- a/quantum/process_keycode/process_clicky.h +++ b/quantum/process_keycode/process_clicky.h @@ -7,9 +7,10 @@ bool process_clicky(uint16_t keycode, keyrecord_t *record); void clicky_freq_up(void); void clicky_freq_down(void); void clicky_freq_reset(void); -void clicky_freq_toggle(void); -void clicky_freq_on(void); -void clicky_freq_off(void); + +void clicky_toggle(void); +void clicky_on(void); +void clicky_off(void); bool is_clicky_on(void); diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 050d2d275d2e..e983798f2ba6 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -139,10 +139,13 @@ enum quantum_keycodes { // Faux clicky as part of main audio feature CLICKY_TOGGLE, + CLICKY_ENABLE, + CLICKY_DISABLE, CLICKY_UP, CLICKY_DOWN, CLICKY_RESET, + #ifdef FAUXCLICKY_ENABLE // Faux clicky FC_ON, @@ -571,6 +574,8 @@ enum quantum_keycodes { #define CK_RST CLICKY_RESET #define CK_UP CLICKY_UP #define CK_DOWN CLICKY_DOWN +#define CK_ON CLICKY_ENABLE +#define CK_OFF CLICKY_DISABLE #define RGB_MOD RGB_MODE_FORWARD #define RGB_SMOD RGB_MODE_FORWARD From a54f09d4f32e026543903502e340e4496bfba94c Mon Sep 17 00:00:00 2001 From: Ethan Madden Date: Tue, 25 Sep 2018 15:06:48 -0700 Subject: [PATCH 035/505] Keymap: jetpacktuxedo planck keymap (#3896) * added my planck keymap based on a blend of my minivan keymap and the planck default keymap. * moved pipe to better match minivan keymap * updated as per @drashna also moved my keymap a bit after adding the quad encoder and underglow (which doesn't even work on arm right now lol) * a few smaller tweaks --- .../planck/keymaps/jetpacktuxedo/config.h | 32 ++ .../planck/keymaps/jetpacktuxedo/keymap.c | 278 ++++++++++++++++++ .../planck/keymaps/jetpacktuxedo/rules.mk | 1 + 3 files changed, 311 insertions(+) create mode 100644 keyboards/planck/keymaps/jetpacktuxedo/config.h create mode 100644 keyboards/planck/keymaps/jetpacktuxedo/keymap.c create mode 100644 keyboards/planck/keymaps/jetpacktuxedo/rules.mk diff --git a/keyboards/planck/keymaps/jetpacktuxedo/config.h b/keyboards/planck/keymaps/jetpacktuxedo/config.h new file mode 100644 index 000000000000..f216dc02dcd4 --- /dev/null +++ b/keyboards/planck/keymaps/jetpacktuxedo/config.h @@ -0,0 +1,32 @@ +#pragma once + +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(PLANCK_SOUND) +#endif + +/* + * 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 + +// Most tactile encoders have detents every 4 stages +#define ENCODER_RESOLUTION 4 diff --git a/keyboards/planck/keymaps/jetpacktuxedo/keymap.c b/keyboards/planck/keymaps/jetpacktuxedo/keymap.c new file mode 100644 index 000000000000..2994c0c07749 --- /dev/null +++ b/keyboards/planck/keymaps/jetpacktuxedo/keymap.c @@ -0,0 +1,278 @@ +/* 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 . + */ + +#include QMK_KEYBOARD_H +#include "muse.h" + +extern keymap_config_t keymap_config; + +enum planck_layers { + _QWERTY, + _LOWER, + _RAISE, + _PLOVER, + _ADJUST +}; + +enum planck_keycodes { + QWERTY = SAFE_RANGE, + PLOVER, + EXT_PLV +}; + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Esc | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Tab | A | S | D | F | G | H | J | K | L | ; |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | Up |Shift | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Brite | Ctrl | Alt | GUI |Lower | Space |Raise | / | Left | Down |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_planck_grid( + KC_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_RSFT, + RGB_TOG, KC_LCTL, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | | | _ | + | " | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | { | } | PgUp | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | Home | PgDn | End | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_planck_grid( + 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_PLUS, KC_DQUO, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_LCBR, KC_RCBR, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_PIPE, KC_HOME, KC_PGDN, KC_END +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | | - | = | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | [ | ] | PgUp | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | \ | Home | PgDn | End | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_planck_grid( + 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_MINS, KC_EQL, KC_QUOT, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_BSLS, KC_HOME, KC_PGDN, KC_END +), + +/* Plover layer (http://opensteno.org) + * ,-----------------------------------------------------------------------------------. + * | Exit | # | # | # | # | # | # | # | # | # | # | # | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | S | T | P | H | * | * | F | P | L | T | D | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | S | K | W | R | * | * | R | B | G | S | Z | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | A | O | | E | U | | | | + * `-----------------------------------------------------------------------------------' + */ + +[_PLOVER] = LAYOUT_planck_grid( + EXT_PLV, 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, + XXXXXXX, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty| | |Plover| | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_planck_grid( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, RESET, + _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, PLOVER, _______, + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + + +}; + +#ifdef AUDIO_ENABLE + float plover_song[][2] = SONG(PLOVER_SOUND); + float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND); +#endif + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + print("mode just switched to qwerty and this is a huge string\n"); + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case PLOVER: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(plover_song); + #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_SONG(plover_gb_song); + #endif + layer_off(_PLOVER); + } + return false; + break; + } + return true; +} + +bool muse_mode = false; +uint8_t last_muse_note = 0; +uint16_t muse_counter = 0; +uint8_t muse_offset = 70; +uint16_t muse_tempo = 20; + +void encoder_update(bool clockwise) { + if (muse_mode) { + if (IS_LAYER_ON(_RAISE)) { + if (clockwise) { + muse_offset++; + } else { + muse_offset--; + } + } else { + if (clockwise) { + muse_tempo+=1; + } else { + muse_tempo-=1; + } + } + } else { + if (IS_LAYER_ON(_RAISE)) { + if (clockwise) { + register_code(KC_RGHT); + unregister_code(KC_RGHT); + } else { + register_code(KC_LEFT); + unregister_code(KC_LEFT); + } + } else { + if (clockwise) { + register_code(KC_DOWN); + unregister_code(KC_DOWN); + } else { + register_code(KC_UP); + unregister_code(KC_UP); + } + } + } +} + +void dip_update(uint8_t index, bool active) { + switch (index) { + case 0: + if (active) { + #ifdef AUDIO_ENABLE + PLAY_SONG(plover_song); + #endif + layer_on(_ADJUST); + } else { + #ifdef AUDIO_ENABLE + PLAY_SONG(plover_gb_song); + #endif + layer_off(_ADJUST); + } + break; + case 1: + if (active) { + muse_mode = true; + } else { + muse_mode = false; + #ifdef AUDIO_ENABLE + stop_all_notes(); + #endif + } + } +} + +void matrix_scan_user(void) { + #ifdef AUDIO_ENABLE + if (muse_mode) { + if (muse_counter == 0) { + uint8_t muse_note = muse_offset + SCALE[muse_clock_pulse()]; + if (muse_note != last_muse_note) { + stop_note(compute_freq_for_midi_note(last_muse_note)); + play_note(compute_freq_for_midi_note(muse_note), 0xF); + last_muse_note = muse_note; + } + } + muse_counter = (muse_counter + 1) % muse_tempo; + } + #endif +} + +bool music_mask_user(uint16_t keycode) { + switch (keycode) { + case RAISE: + case LOWER: + return false; + default: + return true; + } +} diff --git a/keyboards/planck/keymaps/jetpacktuxedo/rules.mk b/keyboards/planck/keymaps/jetpacktuxedo/rules.mk new file mode 100644 index 000000000000..dcf16bef3994 --- /dev/null +++ b/keyboards/planck/keymaps/jetpacktuxedo/rules.mk @@ -0,0 +1 @@ +SRC += muse.c From 9dc19fdb6d0fedfb0080891a8eff49a8fc3b70c2 Mon Sep 17 00:00:00 2001 From: BenRLewis <11444078+BenRLewis@users.noreply.github.com> Date: Tue, 25 Sep 2018 23:11:11 +0100 Subject: [PATCH 036/505] Keymap: FollowingGhosts v60r layout (#3926) * First version of FollowingGhosts' custom layout * Added copyright etc. * Fixed readme and added space cadet shift * Moved from RGB to HSV, updated readme and added media keys * Updated pragma * Added play/pause and updated config * Added pragma back --- .../keymaps/followingghosts/config.h | 18 +++ .../keymaps/followingghosts/keymap.c | 109 ++++++++++++++++++ .../keymaps/followingghosts/readme.md | 61 ++++++++++ .../keymaps/followingghosts/rules.mk | 4 + 4 files changed, 192 insertions(+) create mode 100644 keyboards/v60_type_r/keymaps/followingghosts/config.h create mode 100644 keyboards/v60_type_r/keymaps/followingghosts/keymap.c create mode 100644 keyboards/v60_type_r/keymaps/followingghosts/readme.md create mode 100644 keyboards/v60_type_r/keymaps/followingghosts/rules.mk diff --git a/keyboards/v60_type_r/keymaps/followingghosts/config.h b/keyboards/v60_type_r/keymaps/followingghosts/config.h new file mode 100644 index 000000000000..a2612e2d3227 --- /dev/null +++ b/keyboards/v60_type_r/keymaps/followingghosts/config.h @@ -0,0 +1,18 @@ +/* Copyright 2018 Ben Lewis (FollowingGhosts) + * + * 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 +#define V60_POLESTAR +#define RGBLIGHT_EFFECT_BREATHING diff --git a/keyboards/v60_type_r/keymaps/followingghosts/keymap.c b/keyboards/v60_type_r/keymaps/followingghosts/keymap.c new file mode 100644 index 000000000000..cca95c509da3 --- /dev/null +++ b/keyboards/v60_type_r/keymaps/followingghosts/keymap.c @@ -0,0 +1,109 @@ +/* Copyright 2018 Ben Lewis (FollowingGhosts) + * + * 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 . + */ + +/* This is adapted from the official ANSI layout provided by the KBP V60 Type R +* as depicted in their manual and on the stock keycaps. +*/ +#include QMK_KEYBOARD_H + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Keymap 0: Default Layer (Qwerty) + * CAPS opens Layer 1 if held, acts normally if tapped + * Tab is used for Mouse Layer (2) + * ,-----------------------------------------------------------. + * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| Bs | + * |-----------------------------------------------------------| + * |L2/Tab| Q| W| E| R| T| Y| U| I| O| P| [| ]| \| + * |-----------------------------------------------------------| + * |L1/Caps| A| S| D| F| G| H| J| K| L| ;| '|Return | + * |-----------------------------------------------------------| + * |LShift( | Z| X| C| V| B| N| M| ,| .| /| RShift) | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Fn0 |Gui |App|Ctrl| + * `-----------------------------------------------------------' + */ + [0] = LAYOUT_60_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, \ + LT(2, 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(1, 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_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_RGUI, KC_APP, KC_RCTL), + + /* + Keymap 1: FN Layer + AGSW swaps Alt and OS keys for Windows/Mac + RGB enabled + Backlight keys are swapped as firmware is backwards? + * ,-----------------------------------------------------------. + * |` | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| Del | + * |-----------------------------------------------------------| + * | | |Up |RGB|HUI|SAI|VAI| |Prt|Scl|Pau|Up| | Ins | + * |-----------------------------------------------------------| + * | |Lft|Dwn|Rig|HUD|SAD|VAD| |Hme|PgU|Lef|Rig| | + * |-----------------------------------------------------------| + * | |BLD|BLT|BLI| |VolD|VolU|Mut|End|PgD|Dwn| RESET | + * |-----------------------------------------------------------| + * | | | | | |AGSW| | | + * `-----------------------------------------------------------' + */ + + [1] = LAYOUT_60_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_TRNS, KC_TRNS, KC_UP, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_INS, \ + KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, RGB_HUD, RGB_SAD, RGB_VAD, KC_TRNS, KC_HOME, KC_PGUP, KC_LEFT, KC_RIGHT, KC_TRNS, \ + KC_TRNS, BL_INC, BL_STEP, BL_DEC, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_END, KC_PGDN, KC_DOWN, RESET, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, AG_SWAP, KC_TRNS, KC_TRNS), + +/* +Mouse Layer +M1 = Mouse Button 1 +M2 = Mouse Button 2 +WASD are Up Left Right Down respectively +* ,-----------------------------------------------------------. +* | | | | | | | | | | | | | | | +* |-----------------------------------------------------------| +* | | M1|MUP|M2 | | | | | | | |MPLY| | | +* |-----------------------------------------------------------| +* | |ML |MDN|MR | | | | | | |MPRV|MNXT| | +* |-----------------------------------------------------------| +* | | | | | | | | | | | | | +* |-----------------------------------------------------------| +* | | | | | | | | | +* `-----------------------------------------------------------' +*/ + [2] = LAYOUT_60_ansi( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, 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_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, RESET, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + +}; + +void led_set_user(uint8_t usb_led) { + if (usb_led & (1< Date: Tue, 25 Sep 2018 18:16:35 -0400 Subject: [PATCH 037/505] Pin avr-gcc in shell.nix pending release of 8.3.0 (#3922) * Pin avr-gcc in shell.nix pending release of 8.3.0 There's apparently a critical bug in 8.2.0, which is now the nixpkgs default. This change overrides that default in favor of the known good version. Once 8.3.0 is the default, the override can be dropped. * Arch/Manjaro fix --- shell.nix | 7 +++++++ util/linux_install.sh | 4 +++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/shell.nix b/shell.nix index 715414f96af3..67efb46b7458 100644 --- a/shell.nix +++ b/shell.nix @@ -13,6 +13,13 @@ let "-B${avrlibc}/avr/lib/avr51" "-L${avrlibc}/avr/lib/avr51" ]; + avrgcc = pkgs.avrgcc.overrideAttrs (oldAttrs: rec { + name = "avr-gcc-8.1.0"; + src = fetchurl { + url = "mirror://gcc/releases/gcc-8.1.0/gcc-8.1.0.tar.xz"; + sha256 = "0lxil8x0jjx7zbf90cy1rli650akaa6hpk8wk8s62vk2jbwnc60x"; + }; + }); in stdenv.mkDerivation { diff --git a/util/linux_install.sh b/util/linux_install.sh index d5da59e827a0..9b8b92d08762 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -10,7 +10,9 @@ elif grep ID /etc/os-release | grep -q debian; then dfu-programmer dfu-util gcc-arm-none-eabi binutils-arm-none-eabi \ libnewlib-arm-none-eabi elif grep ID /etc/os-release | grep -q 'arch\|manjaro'; then - sudo pacman -S gcc unzip wget zip avr-gcc avr-binutils avr-libc \ + # install avr-gcc 8.1 until 8.3 is available. See #3657 for details of the bug. + sudo pacman -U https://archive.archlinux.org/packages/a/avr-gcc/avr-gcc-8.1.0-1-x86_64.pkg.tar.xz + sudo pacman -S gcc unzip wget zip avr-binutils avr-libc \ dfu-util arm-none-eabi-gcc arm-none-eabi-binutils \ arm-none-eabi-newlib git clone https://aur.archlinux.org/dfu-programmer.git /tmp/dfu-programmer From 6347a654de1ac00f6feb02e0a95b62a42aed406f Mon Sep 17 00:00:00 2001 From: takashi kono Date: Wed, 26 Sep 2018 07:18:11 +0900 Subject: [PATCH 038/505] Keymap: Ergo42: biacco-winjp (#3935) * create: biacco jis keymap for windows for Ergo42 * fix: biacco-winjp: change #ifndef to #pragma once. * fix: following: 3935#pullrequestreview-157941685 --- .../ergo42/keymaps/biacco-winjp/config.h | 33 +++++++ .../ergo42/keymaps/biacco-winjp/keymap.c | 95 +++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 keyboards/ergo42/keymaps/biacco-winjp/config.h create mode 100644 keyboards/ergo42/keymaps/biacco-winjp/keymap.c diff --git a/keyboards/ergo42/keymaps/biacco-winjp/config.h b/keyboards/ergo42/keymaps/biacco-winjp/config.h new file mode 100644 index 000000000000..360d6a562172 --- /dev/null +++ b/keyboards/ergo42/keymaps/biacco-winjp/config.h @@ -0,0 +1,33 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + diff --git a/keyboards/ergo42/keymaps/biacco-winjp/keymap.c b/keyboards/ergo42/keymaps/biacco-winjp/keymap.c new file mode 100644 index 000000000000..5dbca3bfc5a5 --- /dev/null +++ b/keyboards/ergo42/keymaps/biacco-winjp/keymap.c @@ -0,0 +1,95 @@ +// WindowsでJIS配列として認識しているときに、US配列として使うためのキーマップ +// hdbx から2行コピーさせて頂きました。 + +#include QMK_KEYBOARD_H +#include "keymap_jp.h" // qmk_firmware-master/quantum/keymap_extras/keymap_jp.h 日本語キーボード設定用 +// マクロが必要になったらコメントインすること +// #include // macro sendstring for jis keyboard マクロ文字列送信時に日本語キーボード設定での文字化け回避> + +extern keymap_config_t keymap_config; + +#define BASE 0 +#define META 1 +#define SYMB 2 +#define GAME 3 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* BASE + * ,------------------------------------------------. ,------------------------------------------------. + * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | @ | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | Alt | A | S | D | F | G | ( | | ) | H | J | K | L | ; | : | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | Sft | Z | X | C | V | B | { | | } | N | M | , | . | / |\/Sft | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Ctrl | GUI | App |PrtSc |ESC/ |Space/|Tab/ | |Back |Enter/| Del |PrtSc |=>GAME|=>SYMB| \ | + * | | | | |~SYMB |RCtrl |Shift | |Space |~META | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + [BASE] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_RBRC, KC_BSLS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, \ + KC_LALT, KC_A, KC_S, KC_D, KC_F, KC_G, S(KC_8), S(KC_9), KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, S(KC_RBRC), S(KC_BSLS), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_RO), \ + KC_LCTRL, KC_LGUI, KC_APP, KC_PSCR, LT(SYMB, KC_ESC), RCTL_T(KC_SPC), SFT_T(KC_TAB), KC_BSPC, LT(META, KC_ENT), KC_DELT, KC_PSCR, TG(GAME), TG(SYMB), KC_JYEN \ + ), + + /* META + * ,------------------------------------------------. ,------------------------------------------------. + * | 1 | 2 | 3 | 4 | 5 | 6 | [ | | ] | 7 | 8 | 9 | 0 | - | ^ | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | Alt | F1 | |Muhen | Henk | | ( | | ) | Left | Down | Up |Right | | | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | Sft | F2 | F3 | F4 | F5 | F6 | { | | } | F7 | F8 | F9 | F10 | F11 |\/Sft | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Ctrl | GUI | App |PrtSc |ESC/ |Space/|Tab/ | |Back |Enter/| Del |Reset |=>GAME|=>SYMB| \ | + * | | | | |~SYMB |RCtrl |Shift | |Space |~META | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + [META] = LAYOUT( \ + 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_F1, XXXXXXX, KC_MHEN, KC_HENK, XXXXXXX, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, XXXXXXX, \ + _______, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, SFT_T(KC_RO), \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, _______, _______, _______ \ + ), + + /* SYMB + * ,------------------------------------------------. ,------------------------------------------------. + * | ! | " | # | $ | % | & | [ | | ] | ' | ( | ) | ~ | = | ~ | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | Alt | | | | | | ( | | ) | | | | | + | * | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | Sft | | | | | | { | | } | | | < | > | ? | \ | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Ctrl | GUI | App |PrtSc |ESC/ |Space/|Tab/ | |Back |Enter/| Del |PrtSc |=>GAME|=>SYMB| \ | + * | | | | |~SYMB |RCtrl |Shift | |Space |~META | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + [SYMB] = LAYOUT( \ + S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), _______, _______, S(KC_7), S(KC_8), S(KC_9), S(KC_0), S(KC_MINS), S(KC_EQL), \ + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, S(KC_SCLN), S(KC_QUOT), \ + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, S(KC_COMM), S(KC_DOT), S(KC_SLSH), S(KC_RO), \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + + /* GAME + * ,------------------------------------------------. ,------------------------------------------------. + * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | @ | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | Alt | A | S | D | F | G | ( | | ) | H | J | K | L | ; | : | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | Sft | Z | X | C | V | B | { | | } | N | M | , | . | / |\/Sft | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Ctrl | GUI | App |PrtSc | ESC |Space |Tab | |Back |Enter | Del |PrtSc |=>GAME|=>SYMB| \ | + * | | | | | | | | |Space | | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + [GAME] = LAYOUT( \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_RBRC, KC_BSLS, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, \ + KC_LALT, KC_A, KC_S, KC_D, KC_F, KC_G, S(KC_8), S(KC_9), KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, S(KC_RBRC), S(KC_BSLS), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_RO), \ + KC_LCTRL, KC_LGUI, KC_APP, KC_PSCR, KC_ESC, KC_SPC, KC_TAB, KC_BSPC, KC_ENT, KC_DELT, KC_PSCR, _______, _______, KC_JYEN \ + ) + +}; + From 118e948e355b784b22f94378b5f85285e6dd4634 Mon Sep 17 00:00:00 2001 From: johanntang Date: Tue, 25 Sep 2018 15:23:31 -0700 Subject: [PATCH 039/505] Keyboard: added mehkee96 support -JT (#3957) * added mehkee96 support -JT * making requested changes -JT * fixes -jt * fixed info.json -JT * tidy up info.json comments from noroadsleft -JT --- keyboards/mehkee96/config.h | 18 + keyboards/mehkee96/i2c.c | 106 ++++++ keyboards/mehkee96/i2c.h | 27 ++ keyboards/mehkee96/info.json | 12 + keyboards/mehkee96/keymaps/default/keymap.c | 80 ++++ keyboards/mehkee96/keymaps/johann/keymap.c | 80 ++++ keyboards/mehkee96/matrix.c | 130 +++++++ keyboards/mehkee96/mehkee96.c | 81 ++++ keyboards/mehkee96/mehkee96.h | 24 ++ keyboards/mehkee96/program | 105 ++++++ keyboards/mehkee96/readme.md | 16 + keyboards/mehkee96/rules.mk | 35 ++ keyboards/mehkee96/usbconfig.h | 396 ++++++++++++++++++++ keyboards/melody96/keymaps/default/keymap.c | 6 - 14 files changed, 1110 insertions(+), 6 deletions(-) create mode 100644 keyboards/mehkee96/config.h create mode 100644 keyboards/mehkee96/i2c.c create mode 100644 keyboards/mehkee96/i2c.h create mode 100644 keyboards/mehkee96/info.json create mode 100644 keyboards/mehkee96/keymaps/default/keymap.c create mode 100644 keyboards/mehkee96/keymaps/johann/keymap.c create mode 100644 keyboards/mehkee96/matrix.c create mode 100644 keyboards/mehkee96/mehkee96.c create mode 100644 keyboards/mehkee96/mehkee96.h create mode 100644 keyboards/mehkee96/program create mode 100644 keyboards/mehkee96/readme.md create mode 100644 keyboards/mehkee96/rules.mk create mode 100644 keyboards/mehkee96/usbconfig.h diff --git a/keyboards/mehkee96/config.h b/keyboards/mehkee96/config.h new file mode 100644 index 000000000000..70ca273c36b2 --- /dev/null +++ b/keyboards/mehkee96/config.h @@ -0,0 +1,18 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x20A0 +#define PRODUCT_ID 0x422D +#define MANUFACTURER mehkee +#define PRODUCT 96kee + +/* matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 15 + +#define RGBLED_NUM 16 +#define RGBLIGHT_ANIMATIONS +/* key combination for command */ +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) diff --git a/keyboards/mehkee96/i2c.c b/keyboards/mehkee96/i2c.c new file mode 100644 index 000000000000..a4f95213524f --- /dev/null +++ b/keyboards/mehkee96/i2c.c @@ -0,0 +1,106 @@ +/* +Copyright 2016 Luiz Ribeiro + +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 . +*/ + +// Please do not modify this file + +#include +#include + +#include "i2c.h" + +void i2c_set_bitrate(uint16_t bitrate_khz) { + uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz); + if (bitrate_div >= 16) { + bitrate_div = (bitrate_div - 16) / 2; + } + TWBR = bitrate_div; +} + +void i2c_init(void) { + // set pull-up resistors on I2C bus pins + PORTC |= 0b11; + + i2c_set_bitrate(400); + + // enable TWI (two-wire interface) + TWCR |= (1 << TWEN); + + // enable TWI interrupt and slave address ACK + TWCR |= (1 << TWIE); + TWCR |= (1 << TWEA); +} + +uint8_t i2c_start(uint8_t address) { + // reset TWI control register + TWCR = 0; + + // begin transmission and wait for it to end + TWCR = (1< + +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 . +*/ + +// Please do not modify this file + +#ifndef __I2C_H__ +#define __I2C_H__ + +void i2c_init(void); +void i2c_set_bitrate(uint16_t bitrate_khz); +uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length); + +#endif diff --git a/keyboards/mehkee96/info.json b/keyboards/mehkee96/info.json new file mode 100644 index 000000000000..75da3e591db9 --- /dev/null +++ b/keyboards/mehkee96/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "mehkee96", + "url": "", + "maintainer": "qmk", + "width": 19, + "height": 6, + "layouts": { + "LAYOUT": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":1, "y":0}, {"label":"F2", "x":2, "y":0}, {"label":"F3", "x":3, "y":0}, {"label":"F4", "x":4, "y":0}, {"label":"F5", "x":5, "y":0}, {"label":"F6", "x":6, "y":0}, {"label":"F7", "x":7, "y":0}, {"label":"F8", "x":8, "y":0}, {"label":"F9", "x":9, "y":0}, {"label":"F10", "x":10, "y":0}, {"label":"F11", "x":11, "y":0}, {"label":"F12", "x":12, "y":0}, {"label":"Print Screen", "x":13, "y":0}, {"label":"Delete", "x":14, "y":0}, {"label":"Home", "x":15, "y":0}, {"label":"End", "x":16, "y":0}, {"label":"Page Up", "x":17, "y":0}, {"label":"Page Down", "x":18, "y":0}, {"label":"`", "x":0, "y":1}, {"label":"1", "x":1, "y":1}, {"label":"2", "x":2, "y":1}, {"label":"3", "x":3, "y":1}, {"label":"4", "x":4, "y":1}, {"label":"5", "x":5, "y":1}, {"label":"6", "x":6, "y":1}, {"label":"7", "x":7, "y":1}, {"label":"8", "x":8, "y":1}, {"label":"9", "x":9, "y":1}, {"label":"0", "x":10, "y":1}, {"label":"-", "x":11, "y":1}, {"label":"=", "x":12, "y":1}, {"label":"Backspace", "x":13, "y":1, "w":2}, {"label":"Num Lock", "x":15, "y":1}, {"label":"P/", "x":16, "y":1}, {"label":"P*", "x":17, "y":1}, {"label":"P-", "x":18, "y":1}, {"label":"Tab", "x":0, "y":2, "w":1.5}, {"label":"Q", "x":1.5, "y":2}, {"label":"W", "x":2.5, "y":2}, {"label":"E", "x":3.5, "y":2}, {"label":"R", "x":4.5, "y":2}, {"label":"T", "x":5.5, "y":2}, {"label":"Y", "x":6.5, "y":2}, {"label":"U", "x":7.5, "y":2}, {"label":"I", "x":8.5, "y":2}, {"label":"O", "x":9.5, "y":2}, {"label":"P", "x":10.5, "y":2}, {"label":"[", "x":11.5, "y":2}, {"label":"]", "x":12.5, "y":2}, {"label":"\\", "x":13.5, "y":2, "w":1.5}, {"label":"P7", "x":15, "y":2}, {"label":"P8", "x":16, "y":2}, {"label":"P9", "x":17, "y":2}, {"label":"P+", "x":18, "y":2}, {"label":"Caps Lock", "x":0, "y":3, "w":1.75}, {"label":"A", "x":1.75, "y":3}, {"label":"S", "x":2.75, "y":3}, {"label":"D", "x":3.75, "y":3}, {"label":"F", "x":4.75, "y":3}, {"label":"G", "x":5.75, "y":3}, {"label":"H", "x":6.75, "y":3}, {"label":"J", "x":7.75, "y":3}, {"label":"K", "x":8.75, "y":3}, {"label":"L", "x":9.75, "y":3}, {"label":";", "x":10.75, "y":3}, {"label":"'", "x":11.75, "y":3}, {"label":"Enter", "x":12.75, "y":3, "w":2.25}, {"label":"P4", "x":15, "y":3}, {"label":"P5", "x":16, "y":3}, {"label":"P6", "x":17, "y":3}, {"label":"P+", "x":18, "y":3}, {"label":"Shift", "x":0, "y":4, "w":2.25}, {"label":"Z", "x":2.25, "y":4}, {"label":"X", "x":3.25, "y":4}, {"label":"C", "x":4.25, "y":4}, {"label":"V", "x":5.25, "y":4}, {"label":"B", "x":6.25, "y":4}, {"label":"N", "x":7.25, "y":4}, {"label":"M", "x":8.25, "y":4}, {"label":",", "x":9.25, "y":4}, {"label":".", "x":10.25, "y":4}, {"label":"/", "x":11.25, "y":4}, {"label":"Shift", "x":12.25, "y":4, "w":1.75}, {"label":"Up", "x":14, "y":4}, {"label":"P1", "x":15, "y":4}, {"label":"P2", "x":16, "y":4}, {"label":"P3", "x":17, "y":4}, {"label":"PEnter", "x":18, "y":4}, {"label":"Ctrl", "x":0, "y":5, "w":1.25}, {"label":"Win", "x":1.25, "y":5, "w":1.25}, {"label":"Alt", "x":2.5, "y":5, "w":1.25}, {"x":3.75, "y":5, "w":6.25}, {"label":"Alt", "x":10, "y":5}, {"label":"Win", "x":11, "y":5}, {"label":"Fn", "x":12, "y":5}, {"label":"Left", "x":13, "y":5}, {"label":"Down", "x":14, "y":5}, {"label":"Right", "x":15, "y":5}, {"label":"P0", "x":16, "y":5}, {"label":"P.", "x":17, "y":5}, {"label":"PEnter", "x":18, "y":5}] + } + } +} diff --git a/keyboards/mehkee96/keymaps/default/keymap.c b/keyboards/mehkee96/keymaps/default/keymap.c new file mode 100644 index 000000000000..cd69fb2fe9eb --- /dev/null +++ b/keyboards/mehkee96/keymaps/default/keymap.c @@ -0,0 +1,80 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Layer 0, default layer +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | | | | | | +| ESC* | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | P SCN | DEL | HOME | END | P Up | P Down | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | | | | BACK | NUM | | | | +| ~` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ - | = + | \ | SPACE | LOCK | / | * | - | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | [ | ] | | | | | | +| TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | | \ | 7 | 8 | 9 | + | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|_____________|________|________|________|________| +| | | | | | | | | | | ; | ' | | | | | | +| CAPS LOCK | A | S | D | F | G | H | J | K | L | : | " | ENTER | 4 | 5 | 6 | + | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | , | . | / | | | | | | | +| SHIFT | Z | X | C | V | B | N | M | < | > | ? | SHIFT | UP | 1 | 2 | 3 | ENTER | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________|________| +| | | | | | | MO | | | | | | | +| CTRL | LGUI | L ALT | SPACE | R ALT | RGUI | _FN | LEFT | DOWN | RIGHT | 0 | . | ENTER | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| +*/ + + + + LAYOUT( + 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_DEL, KC_HOME, KC_END, KC_PGUP, KC_PGDN, + 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_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_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_PPLS, + 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_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + + + + /* Layer 1, function layer +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | VOL | VOL | | | | +| RESET | | | | | | | | | | | | | MUTE | DOWN | UP | | | | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | | | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | RGB | | RGB | HUE | HUE | SATUR. | SATUR. | VALUE | VALUE | | | | | | | | | +| | TOGGLE | | MODE |INCREASE| DCRSE |INCREASE| DCRSE |INCREASE| DCRSE | | | | | | | | | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|_____________|________|________|________|________| +| BACKLIGHT | | | | | | | | | | | | | | | | | +| TOGGLE | | | | | | | | | | | | | | | | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | |BACKLHT |BACKLHT |BACKLHT | | | | | | | | | | | | +| | | | | DCRSE |TOGGLE |INCREASE| | | | | | | | | | | | +|_________|________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________|________| +| | | | | | | | | | | | | | +| | | | | | | | | | | | | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| +BL_TOGG, BL_DEC, BL_INC changes the in-switch LEDs +*/ + + + LAYOUT( + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_TOG, _______, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, + BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______ , _______, _______, BL_DEC, BL_TOGG, BL_INC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} diff --git a/keyboards/mehkee96/keymaps/johann/keymap.c b/keyboards/mehkee96/keymaps/johann/keymap.c new file mode 100644 index 000000000000..a0212702ab53 --- /dev/null +++ b/keyboards/mehkee96/keymaps/johann/keymap.c @@ -0,0 +1,80 @@ +#include "mehkee96.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Layer 0, default layer +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | | | | | | +| ESC* | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | P SCN | HOME | DEL | INSERT | P Up | P Down | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | | | | BACK | NUM | | | Play | +| ~` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ - | = + | \ | SPACE | LOCK | / | * | Pause | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | [ | ] | | | | | | +| TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | | \ | 7 | 8 | 9 | Next | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|_____________|________|________|________|________| +| | | | | | | | | | | ; | ' | | | | | | +| CAPS LOCK | A | S | D | F | G | H | J | K | L | : | " | ENTER | 4 | 5 | 6 | - | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | , | . | / | | | | | | | +| SHIFT | Z | X | C | V | B | N | M | < | > | ? | SHIFT | UP | 1 | 2 | 3 | + | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________|________| +| | | | | | | MO | | | | | | | +| CTRL | LGUI | L ALT | SPACE | R ALT | RGUI | _FN | LEFT | DOWN | RIGHT | 0 | . | ENTER | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| +*/ + + + + LAYOUT( + 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_HOME, KC_DEL, KC_INS, KC_PGUP, KC_PGDN, + 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_NLCK, KC_PSLS, KC_PAST, KC_MPLY, + 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_P7, KC_P8, KC_P9, KC_MNXT, + 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_PMNS, + 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_P1, KC_P2, KC_P3, KC_PPLS, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT), + + + + /* Layer 1, function layer +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | VOL | VOL | | | | +| RESET | | | | | | | | | | | | | MUTE | DOWN | UP | | | | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | | | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | RGB | | RGB | HUE | HUE | SATUR. | SATUR. | VALUE | VALUE | | | | | | | | | +| | TOGGLE | | MODE |INCREASE| DCRSE |INCREASE| DCRSE |INCREASE| DCRSE | | | | | | | | | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|_____________|________|________|________|________| +| BACKLIGHT | | | | | | | | | | | | | | | | | +| TOGGLE | | | | | | | | | | | | | | | | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | |BACKLHT |BACKLHT |BACKLHT | | | | | | | | | | | | +| | | | | DCRSE |TOGGLE |INCREASE| | | | | | | | | | | | +|_________|________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________|________| +| | | | | | | | | | | | | | +| | | | | | | | | | | | | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| +BL_TOGG, BL_DEC, BL_INC changes the in-switch LEDs +*/ + + + LAYOUT( + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_TOG, _______, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, + BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______ , _______, _______, BL_DEC, BL_TOGG, BL_INC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} diff --git a/keyboards/mehkee96/matrix.c b/keyboards/mehkee96/matrix.c new file mode 100644 index 000000000000..bbb84e52e481 --- /dev/null +++ b/keyboards/mehkee96/matrix.c @@ -0,0 +1,130 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 "matrix.h" + +#ifndef DEBOUNCE +# define DEBOUNCE 5 +#endif + +static uint8_t debouncing = DEBOUNCE; + +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +void matrix_set_row_status(uint8_t row); +uint8_t bit_reverse(uint8_t x); + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +void matrix_init(void) { + // all outputs for rows high + DDRB = 0xFF; + PORTB = 0xFF; + // all inputs for columns + DDRA = 0x00; + DDRC &= ~(0x111111<<2); + DDRD &= ~(1< 7 + (~PINA) & 0xFF + ) | ( + // cols 8..13, PORTC 7 -> 0 + bit_reverse((~PINC) & 0xFF) << 8 + ) | ( + // col 14, PORTD 7 + ((~PIND) & (1 << PIND7)) << 7 + ); + + if (matrix_debouncing[row] != cols) { + matrix_debouncing[row] = cols; + debouncing = DEBOUNCE; + } + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + + matrix_scan_quantum(); + + return 1; +} + +// declarations +void matrix_set_row_status(uint8_t row) { + DDRB = (1 << row); + PORTB = ~(1 << row); +} + +uint8_t bit_reverse(uint8_t x) { + x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa); + x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc); + x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0); + return x; +} + +inline matrix_row_t matrix_get_row(uint8_t row) { + return matrix[row]; +} + +void matrix_print(void) { +} diff --git a/keyboards/mehkee96/mehkee96.c b/keyboards/mehkee96/mehkee96.c new file mode 100644 index 000000000000..604fad8032c6 --- /dev/null +++ b/keyboards/mehkee96/mehkee96.c @@ -0,0 +1,81 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 "mehkee96.h" +#include "rgblight.h" + +#include + +#include "action_layer.h" +#include "i2c.h" +#include "quantum.h" + +// for keyboard subdirectory level init functions +// @Override +void matrix_init_kb(void) { + // call user level keymaps, if any + matrix_init_user(); +} + +#ifdef RGBLIGHT_ENABLE +extern rgblight_config_t rgblight_config; + +// custom RGB driver +void rgblight_set(void) { + if (!rgblight_config.enable) { + for (uint8_t i=0; i, Sebastian Kaim +# +# 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 . + +from __future__ import print_function + +import os +import sys +import time +import usb + + +def checkForKeyboardInNormalMode(): + """Returns a device if a ps2avrGB device in normal made (that is in keyboard mode) or None if it is not found.""" + return usb.core.find(idVendor=0x20A0, idProduct=0x422D) + +def checkForKeyboardInBootloaderMode(): + """Returns True if a ps2avrGB device in bootloader (flashable) mode is found and False otherwise.""" + return (usb.core.find(idVendor=0x16c0, idProduct=0x05df) is not None) + +def flashKeyboard(firmware_file): + """Calls bootloadHID to flash the given file to the device.""" + print('Flashing firmware to device ...') + if os.system('bootloadHID -r "%s"' % firmware_file) == 0: + print('\nDone!') + else: + print('\nbootloadHID returned an error.') + +def printDeviceInfo(dev): + """Prints all infos for a given USB device""" + print('Device Information:') + print(' idVendor: %d (0x%04x)' % (dev.idVendor, dev.idVendor)) + print(' idProduct: %d (0x%04x)' % (dev.idProduct, dev.idProduct)) + print('Manufacturer: %s' % (dev.iManufacturer)) + print('Serial: %s' % (dev.iSerialNumber)) + print('Product: %s' % (dev.iProduct), end='\n\n') + +def sendDeviceToBootloaderMode(dev): + """Tries to send a given ps2avrGB keyboard to bootloader mode to allow flashing.""" + try: + dev.set_configuration() + + request_type = usb.util.build_request_type( + usb.util.CTRL_OUT, + usb.util.CTRL_TYPE_CLASS, + usb.util.CTRL_RECIPIENT_DEVICE) + + USBRQ_HID_SET_REPORT = 0x09 + HID_REPORT_OPTION = 0x0301 + + dev.ctrl_transfer(request_type, USBRQ_HID_SET_REPORT, HID_REPORT_OPTION, 0, [0, 0, 0xFF] + [0] * 5) + except usb.core.USBError: + # for some reason I keep getting USBError, but it works! + pass + + +if len(sys.argv) < 2: + print('Usage: %s ' % sys.argv[0]) + sys.exit(1) + +kb = checkForKeyboardInNormalMode() + +if kb is not None: + print('Found a keyboard in normal mode. Attempting to send it to bootloader mode ...', end='') + sendDeviceToBootloaderMode(kb) + print(' done.') + print("Hint: If your keyboard can't be set to bootloader mode automatically, plug it in while pressing the bootloader key to do so manually.") + print(" You can find more infos about this here: https://github.com/qmk/qmk_firmware/tree/master/keyboards/ps2avrGB#setting-the-board-to-bootloader-mode") + +attempts = 12 # 60 seconds +found = False +for attempt in range(1, attempts + 1): + print("Searching for keyboard in bootloader mode (%i/%i) ... " % (attempt, attempts), end='') + + if checkForKeyboardInBootloaderMode(): + print('Found', end='\n\n') + flashKeyboard(sys.argv[1]) + found = True + break + else: + print('Nothing.', end='') + + if attempt != attempts: # no need to wait on the last attempt + print(' Sleeping 5 seconds.', end='') + time.sleep(5) + + # print a newline + print() + +if not found: + print("Couldn't find a flashable keyboard. Aborting.") + sys.exit(2) + diff --git a/keyboards/mehkee96/readme.md b/keyboards/mehkee96/readme.md new file mode 100644 index 000000000000..9dfad2a79eb0 --- /dev/null +++ b/keyboards/mehkee96/readme.md @@ -0,0 +1,16 @@ +# Mehkee 96KEE + +![mehkee96](https://cdn.shopify.com/s/files/1/1799/1839/products/96KEE_-_1_-_Copy_1024x1024.jpg?v=1516262148) + +96-key Keyboard from mehkee + +Keyboard Maintainer: [johanntang](https://github.com/johanntang) +Hardware Supported: mehkee96 +Hardware Availability: [mehkee, group buy closed](https://mehkee.com/products/96kee?variant=46912017423) + +Make example for this keyboard (after setting up your build environment): + + make mehkee96:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + diff --git a/keyboards/mehkee96/rules.mk b/keyboards/mehkee96/rules.mk new file mode 100644 index 000000000000..e6e7d4a58833 --- /dev/null +++ b/keyboards/mehkee96/rules.mk @@ -0,0 +1,35 @@ +# MCU name +MCU = atmega32a +PROTOCOL = VUSB + +# unsupported features for now +NO_UART = yes +NO_SUSPEND_POWER_DOWN = yes + +# Processor frequency. +F_CPU = 12000000 + +# Bootloader +BOOTLOADER = bootloadHID + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = yes +RGBLIGHT_CUSTOM_DRIVER = yes + +OPT_DEFS = -DDEBUG_LEVEL=0 + +# custom matrix setup +CUSTOM_MATRIX = yes +SRC = matrix.c i2c.c + +# programming options +PROGRAM_CMD = ./keyboards/mehkee96/program $(TARGET).hex diff --git a/keyboards/mehkee96/usbconfig.h b/keyboards/mehkee96/usbconfig.h new file mode 100644 index 000000000000..d2d848fcdc8f --- /dev/null +++ b/keyboards/mehkee96/usbconfig.h @@ -0,0 +1,396 @@ +/* Name: usbconfig.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2005-04-01 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $ + */ + +#ifndef __usbconfig_h_included__ +#define __usbconfig_h_included__ + +#include "config.h" + +/* +General Description: +This file is an example configuration (with inline documentation) for the USB +driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is +also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may +wire the lines to any other port, as long as D+ is also wired to INT0 (or any +other hardware interrupt, as long as it is the highest level interrupt, see +section at the end of this file). +*/ + +/* ---------------------------- Hardware Config ---------------------------- */ + +#define USB_CFG_IOPORTNAME D +/* This is the port where the USB bus is connected. When you configure it to + * "B", the registers PORTB, PINB and DDRB will be used. + */ +#define USB_CFG_DMINUS_BIT 3 +/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. + * This may be any bit in the port. + */ +#define USB_CFG_DPLUS_BIT 2 +/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. + * This may be any bit in the port. Please note that D+ must also be connected + * to interrupt pin INT0! [You can also use other interrupts, see section + * "Optional MCU Description" below, or you can connect D- to the interrupt, as + * it is required if you use the USB_COUNT_SOF feature. If you use D- for the + * interrupt, the USB interrupt will also be triggered at Start-Of-Frame + * markers every millisecond.] + */ +#define USB_CFG_CLOCK_KHZ (F_CPU/1000) +/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000, + * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code + * require no crystal, they tolerate +/- 1% deviation from the nominal + * frequency. All other rates require a precision of 2000 ppm and thus a + * crystal! + * Since F_CPU should be defined to your actual clock rate anyway, you should + * not need to modify this setting. + */ +#define USB_CFG_CHECK_CRC 0 +/* Define this to 1 if you want that the driver checks integrity of incoming + * data packets (CRC checks). CRC checks cost quite a bit of code size and are + * currently only available for 18 MHz crystal clock. You must choose + * USB_CFG_CLOCK_KHZ = 18000 if you enable this option. + */ + +/* ----------------------- Optional Hardware Config ------------------------ */ + +/* #define USB_CFG_PULLUP_IOPORTNAME D */ +/* If you connect the 1.5k pullup resistor from D- to a port pin instead of + * V+, you can connect and disconnect the device from firmware by calling + * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). + * This constant defines the port on which the pullup resistor is connected. + */ +/* #define USB_CFG_PULLUP_BIT 4 */ +/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined + * above) where the 1.5k pullup resistor is connected. See description + * above for details. + */ + +/* --------------------------- Functional Range ---------------------------- */ + +#define USB_CFG_HAVE_INTRIN_ENDPOINT 1 +/* Define this to 1 if you want to compile a version with two endpoints: The + * default control endpoint 0 and an interrupt-in endpoint (any other endpoint + * number). + */ +#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1 +/* Define this to 1 if you want to compile a version with three endpoints: The + * default control endpoint 0, an interrupt-in endpoint 3 (or the number + * configured below) and a catch-all default interrupt-in endpoint as above. + * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature. + */ +#define USB_CFG_EP3_NUMBER 3 +/* If the so-called endpoint 3 is used, it can now be configured to any other + * endpoint number (except 0) with this macro. Default if undefined is 3. + */ +/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */ +/* The above macro defines the startup condition for data toggling on the + * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1. + * Since the token is toggled BEFORE sending any data, the first packet is + * sent with the oposite value of this configuration! + */ +#define USB_CFG_IMPLEMENT_HALT 0 +/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature + * for endpoint 1 (interrupt endpoint). Although you may not need this feature, + * it is required by the standard. We have made it a config option because it + * bloats the code considerably. + */ +#define USB_CFG_SUPPRESS_INTR_CODE 0 +/* Define this to 1 if you want to declare interrupt-in endpoints, but don't + * want to send any data over them. If this macro is defined to 1, functions + * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if + * you need the interrupt-in endpoints in order to comply to an interface + * (e.g. HID), but never want to send any data. This option saves a couple + * of bytes in flash memory and the transmit buffers in RAM. + */ +#define USB_CFG_INTR_POLL_INTERVAL 1 +/* If you compile a version with endpoint 1 (interrupt-in), this is the poll + * interval. The value is in milliseconds and must not be less than 10 ms for + * low speed devices. + */ +#define USB_CFG_IS_SELF_POWERED 0 +/* Define this to 1 if the device has its own power supply. Set it to 0 if the + * device is powered from the USB bus. + */ +#define USB_CFG_MAX_BUS_POWER 500 +/* Set this variable to the maximum USB bus power consumption of your device. + * The value is in milliamperes. [It will be divided by two since USB + * communicates power requirements in units of 2 mA.] + */ +#define USB_CFG_IMPLEMENT_FN_WRITE 1 +/* Set this to 1 if you want usbFunctionWrite() to be called for control-out + * transfers. Set it to 0 if you don't need it and want to save a couple of + * bytes. + */ +#define USB_CFG_IMPLEMENT_FN_READ 0 +/* Set this to 1 if you need to send control replies which are generated + * "on the fly" when usbFunctionRead() is called. If you only want to send + * data from a static buffer, set it to 0 and return the data from + * usbFunctionSetup(). This saves a couple of bytes. + */ +#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 +/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints. + * You must implement the function usbFunctionWriteOut() which receives all + * interrupt/bulk data sent to any endpoint other than 0. The endpoint number + * can be found in 'usbRxToken'. + */ +#define USB_CFG_HAVE_FLOWCONTROL 0 +/* Define this to 1 if you want flowcontrol over USB data. See the definition + * of the macros usbDisableAllRequests() and usbEnableAllRequests() in + * usbdrv.h. + */ +#define USB_CFG_DRIVER_FLASH_PAGE 0 +/* If the device has more than 64 kBytes of flash, define this to the 64 k page + * where the driver's constants (descriptors) are located. Or in other words: + * Define this to 1 for boot loaders on the ATMega128. + */ +#define USB_CFG_LONG_TRANSFERS 0 +/* Define this to 1 if you want to send/receive blocks of more than 254 bytes + * in a single control-in or control-out transfer. Note that the capability + * for long transfers increases the driver size. + */ +/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */ +/* This macro is a hook if you want to do unconventional things. If it is + * defined, it's inserted at the beginning of received message processing. + * If you eat the received message and don't want default processing to + * proceed, do a return after doing your things. One possible application + * (besides debugging) is to flash a status LED on each packet. + */ +/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */ +/* This macro is a hook if you need to know when an USB RESET occurs. It has + * one parameter which distinguishes between the start of RESET state and its + * end. + */ +/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */ +/* This macro (if defined) is executed when a USB SET_ADDRESS request was + * received. + */ +#define USB_COUNT_SOF 1 +/* define this macro to 1 if you need the global variable "usbSofCount" which + * counts SOF packets. This feature requires that the hardware interrupt is + * connected to D- instead of D+. + */ +/* #ifdef __ASSEMBLER__ + * macro myAssemblerMacro + * in YL, TCNT0 + * sts timer0Snapshot, YL + * endm + * #endif + * #define USB_SOF_HOOK myAssemblerMacro + * This macro (if defined) is executed in the assembler module when a + * Start Of Frame condition is detected. It is recommended to define it to + * the name of an assembler macro which is defined here as well so that more + * than one assembler instruction can be used. The macro may use the register + * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages + * immediately after an SOF pulse may be lost and must be retried by the host. + * What can you do with this hook? Since the SOF signal occurs exactly every + * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in + * designs running on the internal RC oscillator. + * Please note that Start Of Frame detection works only if D- is wired to the + * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES! + */ +#define USB_CFG_CHECK_DATA_TOGGLING 0 +/* define this macro to 1 if you want to filter out duplicate data packets + * sent by the host. Duplicates occur only as a consequence of communication + * errors, when the host does not receive an ACK. Please note that you need to + * implement the filtering yourself in usbFunctionWriteOut() and + * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable + * for each control- and out-endpoint to check for duplicate packets. + */ +#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 +/* define this macro to 1 if you want the function usbMeasureFrameLength() + * compiled in. This function can be used to calibrate the AVR's RC oscillator. + */ +#define USB_USE_FAST_CRC 0 +/* The assembler module has two implementations for the CRC algorithm. One is + * faster, the other is smaller. This CRC routine is only used for transmitted + * messages where timing is not critical. The faster routine needs 31 cycles + * per byte while the smaller one needs 61 to 69 cycles. The faster routine + * may be worth the 32 bytes bigger code size if you transmit lots of data and + * run the AVR close to its limit. + */ + +/* -------------------------- Device Description --------------------------- */ + +#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF) +/* USB vendor ID for the device, low byte first. If you have registered your + * own Vendor ID, define it here. Otherwise you may use one of obdev's free + * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF) +/* This is the ID of the product, low byte first. It is interpreted in the + * scope of the vendor ID. If you have registered your own VID with usb.org + * or if you have licensed a PID from somebody else, define it here. Otherwise + * you may use one of obdev's free shared VID/PID pairs. See the file + * USB-IDs-for-free.txt for details! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_VERSION 0x00, 0x02 +/* Version number of the device: Minor number first, then major number. + */ +#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r' +#define USB_CFG_VENDOR_NAME_LEN 13 +/* These two values define the vendor name returned by the USB device. The name + * must be given as a list of characters under single quotes. The characters + * are interpreted as Unicode (UTF-16) entities. + * If you don't want a vendor name string, undefine these macros. + * ALWAYS define a vendor name containing your Internet domain name if you use + * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for + * details. + */ +#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B' +#define USB_CFG_DEVICE_NAME_LEN 8 +/* Same as above for the device name. If you don't want a device name, undefine + * the macros. See the file USB-IDs-for-free.txt before you assign a name if + * you use a shared VID/PID. + */ +/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ +/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ +/* Same as above for the serial number. If you don't want a serial number, + * undefine the macros. + * It may be useful to provide the serial number through other means than at + * compile time. See the section about descriptor properties below for how + * to fine tune control over USB descriptors such as the string descriptor + * for the serial number. + */ +#define USB_CFG_DEVICE_CLASS 0 +#define USB_CFG_DEVICE_SUBCLASS 0 +/* See USB specification if you want to conform to an existing device class. + * Class 0xff is "vendor specific". + */ +#define USB_CFG_INTERFACE_CLASS 3 /* HID */ +#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */ +#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */ +/* See USB specification if you want to conform to an existing device class or + * protocol. The following classes must be set at interface level: + * HID class is 3, no subclass and protocol required (but may be useful!) + * CDC class is 2, use subclass 2 and protocol 1 for ACM + */ +#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0 +/* Define this to the length of the HID report descriptor, if you implement + * an HID device. Otherwise don't define it or define it to 0. + * If you use this define, you must add a PROGMEM character array named + * "usbHidReportDescriptor" to your code which contains the report descriptor. + * Don't forget to keep the array and this define in sync! + */ + +/* #define USB_PUBLIC static */ +/* Use the define above if you #include usbdrv.c instead of linking against it. + * This technique saves a couple of bytes in flash memory. + */ + +/* ------------------- Fine Control over USB Descriptors ------------------- */ +/* If you don't want to use the driver's default USB descriptors, you can + * provide our own. These can be provided as (1) fixed length static data in + * flash memory, (2) fixed length static data in RAM or (3) dynamically at + * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more + * information about this function. + * Descriptor handling is configured through the descriptor's properties. If + * no properties are defined or if they are 0, the default descriptor is used. + * Possible properties are: + * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched + * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is + * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if + * you want RAM pointers. + * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found + * in static memory is in RAM, not in flash memory. + * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), + * the driver must know the descriptor's length. The descriptor itself is + * found at the address of a well known identifier (see below). + * List of static descriptor names (must be declared PROGMEM if in flash): + * char usbDescriptorDevice[]; + * char usbDescriptorConfiguration[]; + * char usbDescriptorHidReport[]; + * char usbDescriptorString0[]; + * int usbDescriptorStringVendor[]; + * int usbDescriptorStringDevice[]; + * int usbDescriptorStringSerialNumber[]; + * Other descriptors can't be provided statically, they must be provided + * dynamically at runtime. + * + * Descriptor properties are or-ed or added together, e.g.: + * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) + * + * The following descriptors are defined: + * USB_CFG_DESCR_PROPS_DEVICE + * USB_CFG_DESCR_PROPS_CONFIGURATION + * USB_CFG_DESCR_PROPS_STRINGS + * USB_CFG_DESCR_PROPS_STRING_0 + * USB_CFG_DESCR_PROPS_STRING_VENDOR + * USB_CFG_DESCR_PROPS_STRING_PRODUCT + * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER + * USB_CFG_DESCR_PROPS_HID + * USB_CFG_DESCR_PROPS_HID_REPORT + * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) + * + * Note about string descriptors: String descriptors are not just strings, they + * are Unicode strings prefixed with a 2 byte header. Example: + * int serialNumberDescriptor[] = { + * USB_STRING_DESCRIPTOR_HEADER(6), + * 'S', 'e', 'r', 'i', 'a', 'l' + * }; + */ + +#define USB_CFG_DESCR_PROPS_DEVICE 0 +#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 +#define USB_CFG_DESCR_PROPS_STRINGS 0 +#define USB_CFG_DESCR_PROPS_STRING_0 0 +#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 +#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 +#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 +#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_HID 0 +#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_HID_REPORT 0 +#define USB_CFG_DESCR_PROPS_UNKNOWN 0 + +#define usbMsgPtr_t unsigned short +/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to + * a scalar type here because gcc generates slightly shorter code for scalar + * arithmetics than for pointer arithmetics. Remove this define for backward + * type compatibility or define it to an 8 bit type if you use data in RAM only + * and all RAM is below 256 bytes (tiny memory model in IAR CC). + */ + +/* ----------------------- Optional MCU Description ------------------------ */ + +/* The following configurations have working defaults in usbdrv.h. You + * usually don't need to set them explicitly. Only if you want to run + * the driver on a device which is not yet supported or with a compiler + * which is not fully supported (such as IAR C) or if you use a differnt + * interrupt than INT0, you may have to define some of these. + */ +/* #define USB_INTR_CFG MCUCR */ +/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE GIMSK */ +/* #define USB_INTR_ENABLE_BIT INT0 */ +/* #define USB_INTR_PENDING GIFR */ +/* #define USB_INTR_PENDING_BIT INTF0 */ +/* #define USB_INTR_VECTOR INT0_vect */ + +/* Set INT1 for D- falling edge to count SOF */ +/* #define USB_INTR_CFG EICRA */ +#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10)) +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE EIMSK */ +#define USB_INTR_ENABLE_BIT INT1 +/* #define USB_INTR_PENDING EIFR */ +#define USB_INTR_PENDING_BIT INTF1 +#define USB_INTR_VECTOR INT1_vect + +#endif /* __usbconfig_h_included__ */ diff --git a/keyboards/melody96/keymaps/default/keymap.c b/keyboards/melody96/keymaps/default/keymap.c index 9142a0470889..16f4561b5871 100644 --- a/keyboards/melody96/keymaps/default/keymap.c +++ b/keyboards/melody96/keymaps/default/keymap.c @@ -73,12 +73,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { 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; } From 61f95410666319ac5ef0cb3d533b820f45ae237c Mon Sep 17 00:00:00 2001 From: Alexander Kagno Date: Tue, 25 Sep 2018 16:38:04 -0600 Subject: [PATCH 040/505] Keymap: Velocikey implemented at userspace, readme is more helpful (#3974) * deleting arkag branch, forcibly moving changes over to master * fade_color function added, not tested * added half functions some stuff * surround_type function implemented and working. * added flashing function and removed fading, flashing supports infinite flashing along with controlled number flashes * added a fade state machine and functionality * build optimizations, changed fade to bounce between bounds rather than roll over, added a HALMAK layout * changes to sleep breath function, changed how I will switch to HALMAK * support for halmak added * support for activity detection added, condensed fading and flashing state machines, removed support for HALMAK and COLEMAK because arkag is stupid * changed sleep and inactive behaviors, now the color shifting reverses on state change, yay! save_color and reset_color are made to enable layer color changing to look cooler. * reformatted some if statements in state detection * changes to force fade to pause on boot, or plug in. * Attempting to move over to userspace, pushing to repository for help * userspace stuff.... * userspace stuff.... * layout changes, working userspace, Removed left side shift and replaced it with a MT() for LSFT and SPC. Userspace seems to be working properly now! HURRAY * Layout change Removed space/shift and reset modifiers to what they were originally. Added homerow modifiers. * Removed excessive tabs in files * Moved mods on homerow around... * changes recommended by @drashna * removed homerow mods, more flashy lighting! * changed delays for lighting. * velocikey code retro fit into userspace to match typing speed currently "working" but isn't as reactive as I want. * Readme and other documentation hidden throughout code * Added a pretty picture * pretty picture actually added * More readme updates * Velocikey now working inside my userspace! * Changed repo macro and fixed readme * Removed media layer, moved media control to LAZY layer * fixed more merge issues when I had to merge... --- keyboards/mechmini/v2/keymaps/arkag/keymap.c | 25 +- users/arkag/arkag.c | 238 ++++++++++--------- users/arkag/arkag.h | 27 +-- users/arkag/mechmini2.jpg | Bin 0 -> 3548191 bytes users/arkag/readme.md | 28 +++ 5 files changed, 171 insertions(+), 147 deletions(-) create mode 100644 users/arkag/mechmini2.jpg diff --git a/keyboards/mechmini/v2/keymaps/arkag/keymap.c b/keyboards/mechmini/v2/keymaps/arkag/keymap.c index 10502a5b618f..7038f220c45e 100644 --- a/keyboards/mechmini/v2/keymaps/arkag/keymap.c +++ b/keyboards/mechmini/v2/keymaps/arkag/keymap.c @@ -1,16 +1,21 @@ #include QMK_KEYBOARD_H #include "arkag.h" +/* + Userspace: + https://github.com/arkag/qmk_firmware/blob/master/users/arkag/arkag.c +*/ + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = LAYOUT_2u_space_ortho( KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - KC_TAB, TAP_A, TAP_S, TAP_D, TAP_F, KC_G, KC_H, TAP_J, TAP_K, TAP_L, TAP_SCN, QUOTE, - XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_ENT, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, QUOTE, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_ENT, M_PMOD, LRALT, M_SMOD, LOWER, RAISE, KC_SPC, KC_SLSH, LAZY, KC_LEFT, KC_DOWN, KC_RGHT), [_RAISE] = LAYOUT_2u_space_ortho( GRAVE, KC_1, KC_2, THREE, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, - _______, OBRACK, CBRACK, TAP_EQ, HYPHEN, _______, _______, KC_4, TAP_5, KC_6, _______, KC_NLCK, + _______, OBRACK, CBRACK, KC_EQL, HYPHEN, _______, _______, KC_4, KC_5, KC_6, _______, KC_NLCK, _______, _______, _______, CEDILLA, _______, KC_COMM, KC_PDOT, KC_1, KC_2, KC_3, KC_PPLS, KC_PENT, _______, _______, _______, KEEB, _______, _______, _______, M_OS, KC_PSLS, KC_PMNS, KC_PAST), @@ -18,7 +23,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, M_ULIN, M_ITAL, _______, M_P_B, M_C_A_D, _______, _______, STRIKE, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_CAPS, KC_DEL, _______, _______, _______, M_BOLD, _______, _______, _______, _______, KC_PGUP, _______, - _______, _______, _______, _______, _______, MEDIA, KC_BSLS, M_CALC, KC_HOME, KC_PGDN, KC_END), + _______, _______, _______, _______, _______, _______, KC_BSLS, M_CALC, KC_HOME, KC_PGDN, KC_END), [_KEEB] = LAYOUT_2u_space_ortho( KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, @@ -26,15 +31,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { RGB_M_P, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), - [_MEDIA] = LAYOUT_2u_space_ortho( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_VOLU, KC_MUTE, - _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT), - [_LAZY] = LAYOUT_2u_space_ortho( - _______, _______, _______, _______, _______, M_TM, _______, M_SNIPT, M_SHRUG, _______, _______, _______, + _______, _______, _______, _______, _______, M_TM, _______, M_SNIPT, M_SHRUG, _______, _______, KC_MUTE, _______, _______, _______, _______, _______, M_GGT, _______, M_UF, M_LOD, M_REPO, _______, _______, - _______, _______, _______, _______, _______, _______, _______, M_TF, M_LENNY, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + _______, _______, _______, _______, _______, _______, _______, M_TF, M_LENNY, _______, KC_VOLU, KC_MPLY, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT), }; diff --git a/users/arkag/arkag.c b/users/arkag/arkag.c index c716b5e93ff0..a35e13ed6b61 100644 --- a/users/arkag/arkag.c +++ b/users/arkag/arkag.c @@ -1,5 +1,10 @@ #include "arkag.h" +/* + Current Layout and Keeb: + https://github.com/arkag/qmk_firmware/blob/master/keyboards/mechmini/v2/keymaps/arkag/keymap.c +*/ + // Start: Written by konstantin: vomindoraan #include #include @@ -8,38 +13,68 @@ void send_unicode_hex_string(const char *str) { if (!str) { return; } // Saftey net while (*str) { - // Find the next code point (token) in the string - for (; *str == ' '; str++); - size_t n = strcspn(str, " "); // Length of the current token - char code_point[n+1]; - strncpy(code_point, str, n); - code_point[n] = '\0'; // Make sure it's null-terminated - - // Normalize the code point: make all hex digits lowercase - for (char *p = code_point; *p; p++) { - *p = tolower(*p); - } - - // Send the code point as a Unicode input string - unicode_input_start(); - send_string(code_point); - unicode_input_finish(); - str += n; // Move to the first ' ' (or '\0') after the current token + // Find the next code point (token) in the string + for (; *str == ' '; str++); + size_t n = strcspn(str, " "); // Length of the current token + char code_point[n+1]; + strncpy(code_point, str, n); + code_point[n] = '\0'; // Make sure it's null-terminated + + // Normalize the code point: make all hex digits lowercase + for (char *p = code_point; *p; p++) { + *p = tolower(*p); + } + + // Send the code point as a Unicode input string + unicode_input_start(); + send_string(code_point); + unicode_input_finish(); + str += n; // Move to the first ' ' (or '\0') after the current token } } // End: Written by konstantin: vomindoraan -uint8_t current_os, mod_primary_mask, fade_delay; -uint16_t flash_timer_one, flash_timer_two, - fade_timer_one, fade_timer_two, - active_timer_one, active_timer_two, - elapsed = 0, +// Start: Written by Chris Lewis +#ifndef MIN +#define MIN(a,b) (((a)<(b))?(a):(b)) +#endif +#ifndef MAX +#define MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +#define TYPING_SPEED_MAX_VALUE 200 +uint8_t typing_speed = 0; + +void velocikey_accelerate() { + if (typing_speed < TYPING_SPEED_MAX_VALUE) typing_speed += (TYPING_SPEED_MAX_VALUE / 50); +} + +void velocikey_decelerate() { + static uint16_t decay_timer = 0; + + if (timer_elapsed(decay_timer) > 500 || decay_timer == 0) { + if (typing_speed > 0) typing_speed -= 1; + //Decay a little faster at half of max speed + if (typing_speed > TYPING_SPEED_MAX_VALUE / 2) typing_speed -= 1; + //Decay even faster at 3/4 of max speed + if (typing_speed > TYPING_SPEED_MAX_VALUE / 4 * 3) typing_speed -= 3; + decay_timer = timer_read(); + } +} + +uint8_t velocikey_match_speed(uint8_t minValue, uint8_t maxValue) { + return MAX(minValue, maxValue - (maxValue - minValue) * ((float)typing_speed / TYPING_SPEED_MAX_VALUE)); +} +// End: Written by Chris Lewis + +uint8_t current_os, + mod_primary_mask, + fade_interval, num_extra_flashes_off = 0; Color underglow, flash_color, saved_color, - hsv_none = {0,0,0}, - hsv_white = {0,0,127}; + hsv_none = {0,0,0}; flashState flash_state = no_flash; fadeState fade_state = add_fade; activityState state = boot; @@ -79,134 +114,103 @@ Color mod_color(Color current_color, bool should_add, uint8_t change_amount) { return current_color; } -void reverse_fade (void) { - if (fade_state == add_fade){ - fade_state = sub_fade; - } else { - fade_state = add_fade; - } -} - void check_state (void) { - static bool activated, deactivated, slept; - switch (state) { - case active: - if (!activated) { - fade_delay = LED_FADE_DELAY; - reverse_fade(); - activated = true; - deactivated = false; - } - active_timer_two = timer_read(); - elapsed = active_timer_two - active_timer_one; - if (elapsed < INACTIVE_DELAY) {return;} - state = inactive; - return; - - case inactive: - if (!deactivated) { - fade_delay = LED_FADE_DELAY * 2; - reverse_fade(); - deactivated = true; - slept = false; - activated = false; - } - active_timer_two = timer_read(); - elapsed = active_timer_two - active_timer_one; - if (elapsed < SLEEP_DELAY) {return;} - state = sleeping; - return; - - case sleeping: - if (!slept) { - fade_delay = LED_FADE_DELAY * 6; - reverse_fade(); - slept = true; - deactivated = false; - activated = false; - } - return; - - case boot: - return; - } + static uint16_t active_timer; + if (!active_timer) {active_timer = timer_read();} + static bool activated, deactivated, slept; + switch (state) { + case active: + if (!activated) { + if (slept) {rgblight_mode_noeeprom(1);} + activated = true; + deactivated = false; + slept = false; + } + fade_interval = velocikey_match_speed(1, 25); + if (timer_elapsed(active_timer) < INACTIVE_DELAY) {return;} + active_timer = timer_read(); + state = inactive; + return; + + case inactive: + if (!deactivated) { + deactivated = true; + activated = false; + slept = false; + } + velocikey_decelerate(); + fade_interval = velocikey_match_speed(1, 25); + if (timer_elapsed(active_timer) < SLEEP_DELAY) {return;} + state = sleeping; + return; + + case sleeping: + if (!slept) { + rgblight_mode_noeeprom(4); + slept = true; + activated = false; + deactivated = false; + } + return; + + case boot: + return; + } } void fade_rgb (void) { - static bool ran_once; - if (flash_state != no_flash) {return;} + static uint16_t fade_timer; if (state == boot) {return;} + if (!fade_timer) {fade_timer = timer_read();} + if (timer_elapsed(fade_timer) < fade_interval) {return;} switch (fade_state) { case add_fade: - if (!ran_once) { - fade_timer_one = timer_read(); - ran_once = true; - } - fade_timer_two = timer_read(); - elapsed = fade_timer_two - fade_timer_one; - if (elapsed < fade_delay) {return;} if (underglow.h == 359) { fade_state = sub_fade; return; } underglow.h = underglow.h + 1; - set_color(underglow, false); - // set_color_at(underglow, 0); - fade_timer_one = fade_timer_two; - return; + break; case sub_fade: - fade_timer_two = timer_read(); - elapsed = fade_timer_two - fade_timer_one; - if (elapsed < fade_delay) {return;} if (underglow.h == 0) { fade_state = add_fade; return; } underglow.h = underglow.h - 1; + break; + } + fade_timer = timer_read(); + if (flash_state == no_flash) { set_color(underglow, false); - // set_color_at(underglow, 0); - fade_timer_one = fade_timer_two; - return; } } void flash_rgb (void) { - static bool ran_once; + static uint16_t flash_timer; switch(flash_state) { case no_flash: return; case flash_off: - if (!ran_once) { - set_color(hsv_none, false); - flash_timer_one = timer_read(); - ran_once = true; - flash_state = flash_on; - return; - } - flash_timer_two = timer_read(); - elapsed = flash_timer_two - flash_timer_one; - if (elapsed >= LED_FLASH_DELAY) { + if (!flash_timer) {flash_timer = timer_read();} + if (timer_elapsed(flash_timer) >= LED_FLASH_DELAY) { set_color(hsv_none, false); - flash_timer_one = timer_read(); + flash_timer = timer_read(); flash_state = flash_on; } return; case flash_on: - flash_timer_two = timer_read(); - elapsed = flash_timer_two - flash_timer_one; - if (elapsed >= LED_FLASH_DELAY) { + if (timer_elapsed(flash_timer) >= LED_FLASH_DELAY) { set_color(flash_color, false); - flash_timer_one = timer_read(); + flash_timer = timer_read(); if (num_extra_flashes_off > 0) { flash_state = flash_off; num_extra_flashes_off--; } else { set_color(underglow, false); flash_state = no_flash; - ran_once = false; } } return; @@ -239,8 +243,9 @@ void set_os (uint8_t os, bool update) { mod_primary_mask = MOD_CTL_MASK; } set_color(underglow, update); - flash_color = underglow; - flash_state = flash_off; + flash_color = underglow; + flash_state = flash_off; + state = boot; num_extra_flashes_off = 1; } @@ -462,7 +467,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case M_REPO: if (record->event.pressed) { - SEND_STRING("https://github.com/arkag/qmk_firmware/tree/master/keyboards/mechmini/v2/keymaps/arkag"); + SEND_STRING("https://github.com/qmk/qmk_firmware/tree/master/users/arkag"); } return false; @@ -505,10 +510,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case KC_LSFT: if (record->event.pressed) { - set_color(mod_color(underglow, true, 50), false); + save_color(underglow); + underglow = mod_color(underglow, true, 75); SEND_STRING(SS_DOWN(X_LSHIFT)); } else { - set_color(underglow, false); + reset_color(); SEND_STRING(SS_UP(X_LSHIFT)); } return false; @@ -522,8 +528,8 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { default: if (record->event.pressed) { - active_timer_one = timer_read(); state = active; + velocikey_accelerate(); } return true; } diff --git a/users/arkag/arkag.h b/users/arkag/arkag.h index 9c81e4487c9a..a4672a8e82ef 100644 --- a/users/arkag/arkag.h +++ b/users/arkag/arkag.h @@ -25,26 +25,13 @@ #define MOD_GUI_MASK (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) #define MOD_SFT_MASK (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)) -#define TAP_A LALT_T(KC_A) -#define TAP_SCN RALT_T(KC_SCOLON) - -#define TAP_S LCTL_T(KC_S) -#define TAP_L RCTL_T(KC_L) - -#define TAP_D LSFT_T(KC_D) -#define TAP_K RSFT_T(KC_K) - -#define TAP_F LGUI_T(KC_F) -#define TAP_J RGUI_T(KC_J) - -#define TAP_EQ LSFT_T(KC_EQUAL) -#define TAP_5 RSFT_T(KC_5) - #define LED_FLASH_DELAY 150 -#define LED_FADE_DELAY 10 -#define INACTIVE_DELAY 200 -#define SLEEP_DELAY 60000 +#define ACCEL_DELAY 500 +#define DEACCEL_DELAY 500 + +#define INACTIVE_DELAY 250 +#define SLEEP_DELAY 180000 enum { _QWERTY = 0, @@ -124,6 +111,10 @@ enum tapdances { void send_unicode_hex_string(const char *str); +void velocikey_accelerate(void); +void velocikey_decelerate(void); +uint8_t velocikey_match_speed(uint8_t minValue, uint8_t maxValue); + void set_color (Color new, bool update); void save_color(Color to_save); void reset_color(void); diff --git a/users/arkag/mechmini2.jpg b/users/arkag/mechmini2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..611a0859c0c431273e99013f3599816dff9204ae GIT binary patch literal 3548191 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

t^HVN(Kz2= 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 )x4rEw}05fBAb{|@JE~=hniZ&8* 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 TjK7rxWin)cxySlIGsE@nP8 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

KZZM2T#n*yHXwT& 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�wGcooD_D(=X33(5Zg3fhJ$ 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 z�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

&)pbU#u&2v%sOCwDZwqSnM?U) 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�wjgf>YUDOmYv_(8T_p!cRJa<3lsa;O-_ zyl0-H=~B;R@QY|>LB4i4Slf+u5 ze8isA+8)Ci!S5w04Z}tVz+$-o`Wl)wi5U&Nn%{!&hp0~)Us+V72HV)Byd}4x}y!^h0s2|RwislQ6%w)>8@UeVFDFyxW{OUQb-sA}D=B8l$2xKow`?>Dx4)1#ThV5ExK$yaXl z`9VpR;kk|p&CT0^wlkQ?`F@6@R%qW0;IoY9rboB6L%G^W)J7(an*~&S%-zR5ew2u^ zw&tE($XKZxa2Nb2~I4 z(_)c|eY{`0Xk%6fl5#SC{Z&X;W6i-iWtRtb0mo73YB!(Clw8chNdx?uUOt%gqT4b` zuty%?PD2sYcg0T@lY2BSW3>zea5~k-E?Xfz$b(4pa>}dLKo=O#dS$X*B>Tm?I)?dJ zbw7utZ1`isn#Qps$}HYe`7$D}J4Zq7U5=CRI`;QhwURgE7Zbd*!*I> zI6E26tRcHNTVD?AdXX_&1}z}UZc=mYk4ouuFNQbzuaj{+JckP+9E|$$iuWH4dUvLuw7Y9V75%UZ(d|c5 zf<67}^{$j{?8ccD&d}d=M^XoKU!~>T8;7MODAP#uD&zFr!q9vRrrD!u@moi}6%9Km z;Ag1!t$SY&K_tIuw?~dhi4P~0kf885tJXRRI*;9G;X6r3Y!_mLrhXf4KgJQw8s4Rmp75u})r zPnM$$>Uy8>siLroIM*jGP6V9?(!JVPDiq+O7@U)w=I+^#ZKN*dcz|LC3NNpvX(pWt zTdNpKyAm7|)7q}V2J+h!WqROut3yv9jlgm;038i%eKoiF zk|O{|@h|IFE$l5CL_(oLj!N`jd{v9v^no_{3$<4~cNnbOy;scI?%hBJL>K^4Qt)tRW7v^JDkQrRl&jQShwCX(yZNn+i|%IV4|L)yx-y<$14pQ2S_gv z7~GIa`@YqUTulr*yxzw|aPpEp4_xt%ouowbU9nV*J#ziITpjKww7gruD8CoDe-@h=s8U)DTNI;FF^#3ekVe87A0&3qM0Ph z#_qTW_=l~0$2O-*h4(91*<7rCRD5KTqC^}YT-M#DoM(Y&e<@67u0M;p#YthO%3mdv zE;AU}oc{p&>q_5FF1w_)JG{P1oCO}WE=uOHfs~qQc+q7W_Q-I^c7lCPTH0gVCP@J8 zMjQg(r`oh$z?Vmvg09>JLHDUr$gD3CDE|Ogjt)W`_o;JsWN`k-w$a)`Yw=I-#<~IQxoPx%)l~}~3PE5s?+69v$ z7xMbb6}tX^%9$&E_&JT#g$x@Q3@cV^NZL}358NQ(x-kB=TJq6jM_Y@5GlAJQhR-+y zupK`N^RXD&N8v6smr{&YlSv?!J82A#-#RN`ZR|}+h?&S>o6lX#_kgJt$wq1uIIRtA#s|1yEa*AJo)cjDPPVl-oxE-{s`VkCX%b zY0U_E8r&G!+|r(^alp@| zRk&-B3tP?t!t(BzvT$1+eZG}h4YlRNK`P4d#&YFf0m<$39+hleU5J-sF4t^%OqnMg z^G?YMaxLEf_uH*vfaHrQJ^`VJeCXCx<07fXFxMw6V#zu2eLSUK`KiVV4 z&B51zhv`v>jII&YN+aREY-iZi$d090M;^d%m|p(=)UTk$iq(~tLOx7xNl5ug_NLt1 zN@I=fr3)vTT244Tbr|WIu^LSiC4}g*ha|B=0U7QGVMW&6xhh+X1VPFF01AuhJ7`lW z0+)*0a;X?*cgaG1{b>R7AxP|JR1uwx6R9Ty_=!D9sX|Ed`7LhB;WOp&lTM9U*d(fC z*hobjZ}!J(7$P$=+LpMM-55qO6h(8E^fc>9jmnmC%Fn?I@|E`$G>Aw>z*bOvrXRpZ ze0QWlC{>kVJGYS_1Yx-9JwBBqu`KgjdBzwEffQ=bAa2zhW^0>~BM6so%?c`v1Kp{Y ziFyLcLWDdLR~a6Llqyc%Wz<1b{Ee{Sf$K;X<60RW_)9rvSkr8qPATZSztPnE#AE}{ z(vhZnm7C2*fI|o?FieM0zyJ7Pok zIuB#$(snK1tVBxH8QS}`&|o*>9yzPxn&X`x!1%ILu2dO5hyrSL>g8L$M{E3VoK~fZO*hZPh{TQ?xLum5iPF!^BTR+N&Xj z2b(0DST0G{M0ZpMjsknfB<#!$%(Y+y%jNk)K>svqbYE@11OfAeb^K`4>Ec^`R$5 zl(IvTc-+T<^{naj6=w6}I|3ZZ@{FnW^)*f{O7iFj2(T+T`$EW^oOB}{J!?f4OPR3x zn34$s46kwq3i|U-mi{2wdyqn?;Bcpk#*0vjUDr0}Y-f$X-Xp$!>1Uo{Yz$>`;F6EX z0<=&kotEzP1`-HlW^l?lPB#x+)k&6UZ9J$8lf3TB5^#F+o+*!X_*Y;_?mA?9RA~1S z+(#QO=)+}{a9nl-*F++blap+oTc$X3CPZWqMsi2KI@B@hw=xNB=aMjgfW$D$Gr{`R zd3@$7sQGevD!gKdtpk)uW%ZA49PAj4<5c!Fvy}p(SJrDTPcFrSsrnE7x-X2VI&uWv-3gx9$ibg=OHU=~A_4Tb{%CizU zr;(kK-IS*>!pAN3_p5M{Ez&co=6IXDyq^-I=(o8lv8&)&HCWCCys>kN0AC^$O^Zx+Xsbce85=kRfcYV8<{Gbn7 za>q1`)54+DaPs+oET16Yeu(<^U8aVHB9B?V8ms!oF8v$ zSz(&a2f0L6U~#+q-<@2xk?ntelf)D#^1QgPcXuc8{Obp~R?^4NUk7|U;JeE>Vz|9a zXwD0~gEA4^52aD~>EYi8Y4gn{o2xy=szg>D!)vkk^{*(>{vqocQ@o>9j9e)maqLH7 zj@1W>ej)3AF0(c|qi@0x9ZolT9x5eK-K8Iy&FrOn95vJrYpGl$HzArw+{)45Mm=hj zwoMfI$YIG%y%mpt#4+MIOo+#&);zhRvyrn=?055X?07`Tg?R^P` z(bsS+RE&TydHQCdv80h!Xwux|D;{@k9Fyx)$8QvI5CG&r8^6su#O=Gw-cC<*?N%@X zMfL^gguJW*;IQg&T#=N&f%}n}w1i^5RfR?%TLyEOVcFQo&H9Xw4vEcYjKb z;exZNR*;|h=Gfiz%`sk5r|kt|A##X#C)+ewWX>DTFA{ldA3OAjmNWg8YkTXOp6y%quSPPXpR%tK0-Z7OMkZl=H zQ&RLAD^BeMj>HF%24gbvg!&qci40zALnaYR5)LGbx+T}V|k zCglS-+`||?v`GvK%&Olaft|zed(!7u4n}6hrrU&QBaC8Cz4IP^wP+b+n|x3N%I#+u z`GD>88LKO9+2%5Gcp|JVx&#r&wZLq?!N?x8IixiP%27t;47P+cf%q&p55!dQ+k+>V zT~i!_3rC8Mx{P0;SBQ0w=a~%0?DNlzqUx`kHKU2qbN# zesTMx>PvSV)v*K3FjgcOz+oZba({>GOBJdz97a`@jtM;~J*fSeQIaIsCEXhaAh|dI z_8e3Ei7}J_73N~&IUdz_?1>oxc`bn3j(MTrP^~x3=7GYn;EIoGjXjx6+5n9xA0sXi zx%}!_t=ZWcJh;co2d{dR#J*{iNOGWH7ULbxDeZ1jMuItkV;CxNz$TNapeT)wz@%i9 z*mst6VouTPPgKAGV>$j1PebooG3k>uD=D^O2NFrp6OPpzTOGh7F78Sz554VJ`$J!5 z(OAS*04@?ajKs$3M;me6RN!uAQ2`qiFPz-&`u_lpO%0+kQqpA{bt4;1FWB7RT!RyT z2!4(}o`$n>WhfNox0N!5lVLw0Q3#M+6^wr8^1J>@quccmjq}5r_<{(Ek9meJRpgVWpMXQwldITyFOjI_BI+ zu^`^D@scoe>+4T4!wbZhONPct><%g%nQAE_J6mXG5d^@?6E8nDJ5wIjBXI1l*yV(0 zujf`Kk_IU{sS@wx#Bed|#SP{L3nJ$d4=EIV;fhydv0bf}May&SGOO@P;GBVj%{0})pDLz@o z-b8DFqt=z9nnD^W(2_>>^73(x1w{@SSVt=P%D8k!JP+!7{xxrGcMha3-KYp4<0N;b zc7~P8@<%#K7HQT502XgAK3~_=nwcX7Fc%p6&Hdp@uVy651_ef3IqG}y=}h}{G7~Ic zFjo2Udix4|*9%ydIOW2tgb1f3x@7J2&#e)(NT4dTb0d}tt@nL1P*12uaW9(`ZmJ00 z80S28s3p7#;y3%`2|!bq6!+sY!g3buOHatoN%7pjo7t;+2oOAdeibr^;jWluhDEy&7} zPE+!#(TN?JX_b$c7&`|-YFAcZ#1rOh1RVGDqm)-Hq~-RJv>b9%?vv~7OC8ZKUBM*H7`a?1#$S~U?e9%% zmU$8@r!2cZTs8|2LsXU~ga}?h`_5UhjAo^dVv>*nDo4pCKIt7n{)VfUu{^@hcO1|~ zGm$13=L3cGsU=rYRj4*c zGDY({D+HF|SVjR~l&*cMNbfed8%T2BC<7Z$^sH-*USR4ah_F@8@Bj=u3W7~e;6}1U z?4{cdC0yQ8@E@LiR8xZszt19B} zP?j@lSpumBDKW_Q_cSY*^CZfnE%Tgo9=NR|Lfew+wrD-+Wmxc3hC7c_`BV!#%|FX9 zF%0HBbw6Iz$Sjmk<}}5ZJrJDp(2ww^C5*5gz{%RA1r?%%Q5@1^(&YK#5(_@w zN#_HwHDpG@0Fx+PtVk}rFZ6yuqhENaorUc z3Klr$KRWgv{nZ|IWcJwtEvxx@6N)W{I-D>{zh?5Cf7j8sn?~~kq z6$8uVKbY7mqb#mDQT3})CCM@tvl74|2m>iB!H!D<{uIwH86<78d4&kxMsNV_Q?s6+MWPy}zl|bCg zyeaHzz+JKf8)X83gVg%_)8v9@CTZ>!!C~k?IJa#-*UFC_3a!A0Qip%$LTf(B5&pK`< zaXU%;C~SlC3=z{b`E!uC;BYZf^1n>-4QOUP4#U7cxisM};6pc2&N$6NF`PDeKD{Y- z3}B7Jxg975NUs_Y$q~proYlxR1_$?!*;Cly0aR3-*eYA;KwwYFoPo}2qbCtrGinWT zK)zVGV6Jw_8nMGKy<3-8dxb@~4LZfdODkt+^saGb!t5Oh`Mt$GZe3L2zEW}1rE04_ zq_`uZhT-lC!4=3;=57W;c=oBKnoEeBM}dau=nu`)KEk>0w@L$TIbn=@eQMM?zQlO^ z)+{3noM$86wT(o~+!;OHvq0?>z!vUGW1mq}<+gbN-f@$KIO3;k^p*v+SxX4{!j5u# z6H#AWh_I~K^9Ly(@Sj@I%~+JBa*X(fLmWiyQ~X{1slH%P%068C(n`Ry9r^z6u4%i5 z3Y9qngPx|jomQTP_RzQXpFMwg-1KHsfJdRlOAN3W+F7T=4v2>s^fjJKASI3n=rKTY zp@$f7GwoWeOSYsqCTKj6vIhWXCw2`WyHyM}sRV$*y8abJPlUv(3iKG_m0gjPkQ)O# zy#+UkxO+17+qoEp6nuaH!-6Wa#1xfWE_npeZ*b@VP5}F)_w}cFtjb2-2qm&JpK<9) z%}6;~7|9@R0)=jXjPp^nZyEW@sqM#FvhqaAiyS*wpg?|au6xrRBEv30AY|kE)Jn{x z*;tOPjGsZ?k+8h686U&xPmqUg&Crf;F`8k?UPl<~ST<0BcKoBc;AWQ~l6rB*D8_I{ zPTtgQJ9D&;T#Aqy*x=_F@99A0{$?bO^rd=W@!FFI05=|#0E3Z}oc(D>UcC3_mjv^W zdk*b^*KrkO&8<%_u(HQV`k5 z>D*H7z~oW@0Dlt^p0v2h+6E3O2*K_%NOPPKMaN-D1OuK09D)3(8P4sw_M@Q20pfv* ze8N1kN2-ic1IWPu9so3h*8p?Um!7!qz%&Oy2aNmkK+kOT=QJq6EEsS&2dyFGZpJV= zW`PQoyigvbDIrTIvGAS72)X})H1$iA0(u^;mJbrWlstUNv zXVeqYoES4^MZgD;yk?uU$*I*@g(kIa`oO829f; z>mk6wC+Ygr)c~n8hCtx$Q}U8}QhAKX%Ffs)lb*DMDF6)PwoNtNiOInu+Ml$Sa3m74 zgRr(o=}YHjN!$q@p0yTEcOH24pa5{&N3}IlYp7Wh85!SsVlj?XWAmi*aEw(LK2F>o z2fap1a&ku;QugKf#~e}5JMJ12!7CvlgAm_&N$*elWV3A|aD_S^_^Rvj;eq*-_0M0W z8(BjXLy^hI;M4Y#wS{C_hTO%MTmx!N)?bJa*7 ze>%jDP{#=SNnBx$XlW#PzyzL1a%vk=TA`ms{0#p9f{%XEzXNVWI%kdUF6>!?#ii;p zJ;X7OZO`(b_i>*7qwhc2+x`ph;LE6^(tbAR(rF0E9Bp+G^P^Wd`B}Iz;P*c%1FvfQ zgcmYE;|ra`C^7le(O)p~!iFy{;Qnd(eT{iojGqIDyXED5)}QbSQ<7FcrGJ9ow)eol zjP^0NgZ?7v*Y5ENQW!2(n_>PSx!sR)F_B)iWvuC%>a;f35y-2J#QXL&{IU3F$9^&J zee!DF67i;|rrp6WnQwPvdhohGate{gI3VyveOLQBf5B@10BWy-lf!4@OS^9t>ClB= zGVqvg6?zr(21E8BuqUsvA3uu7^9(#3s5Mdc_+R-K2}b&#uz$5b>|5~D}Q#nzf&YLujPt&h-?Ah!e_4zrt~h9OHwJLHalQ zD1X6q{{Uv+jo0ybXW|6U;cZ}UM}u2RO!V>nKSWH?V(v(7=vMdilHS- zc}zwL$QbB-YDrAe-c0I(A-@i?4Ae`#2J}F~kP8ftdivD#F z2^m8pFbd1`=hHPR-I5mo7wV!l<4VdzCgiLuye+QpRC zqDxE5khb7SER#w>2RxJQ?ONJri1g7TNj%KHVxK3RBR8#bFl#f*ZoXiNS%7IX7Z2=5 zr?o6vw2iQp4ywm7fse!3RJf)WXQ1dB%+Ou`0HfR_pSv$3F#iBk&m;rEJ*hPR02EnV zD$Z`as6@wfP5%Hb4oKkk9`(bGeSF}_ex_5zagcVX@AW6AwOX|C46|IT!*dp1FDb2N zh-EqZ!1M=$&1UH$xtZTsc-F}-$cfpb18a=nkMXG@*Airs?p1RNBQvUfA?$bM|}BP01$^M0`1ML4@MDOQYD9?se<0PZPyw zsZF}(UR7E!8YCkiHZ#z7t8nVMlW|!IAS$vq%5m#lmY=PrqYT@%2;-Xva4DAB4g&7) zO4{AMwaUQ){JTT_o;El^-=ALQvT&Bf>UWlx&vUup4Zml|&nF3v_^GY67_J==W(7-a zW>7#F?_4Zev5gGUoyy}0$=buO9>3#OB=IG*MmS}ak;`vF&EFlr!l&6g1=-$5uK~K; zFxU^@$Mvbdw2j4|l-KdXi0628$zMZUOKUF(d1sN1QA$RsfoY7u@$~D73lbxV zNCklX4P`2J1liUdS7Mf$QgWDVoNmWM^!BS3daSZ8W+0>e_g+5`MRNAq(n%)uw|9_^ zM63?ZKIs$<8=LWPjK?fbGymHq)aeK&rJUS7xS%H^|x4Lb%Q6%!QFr} z+cgfHknWk?TX>GytYo#4<|x479mYsw)Mv4&Z8b<{o;PcGCv256B-jgq(2qe}L^`#^ z0WO?;?G9sw06Tqi*q?g8CbM?d@jlTS&B8LM8%P|J_4TF5>^@X>w)cie#+cGZ!IYVp zXJ}K<{d-pQ+MT$wisA_fxM+lNDh!Rlb!zjd^_e7e5jjOb6ob^&`8+}`9U=Q9i-H8q zI3;oDf1O7o3mwEds*$n`U%uD-bzW^&Z{pR^P<3c_L)QjU1bnbps3j$sMbLu+=TzLi5Ve z2LNH83VHPRtCrf#me-iLNf3zw3vP@^C#XHWjdIG8dZLu1k3-V+rJ34UHm*Qsi2%#} zdjVS3nxnyRvQ2H}8Bn$xA1NKjp{@%|*Dhk3UphES;C%6bFiAXB@Ayh?X1R{Wc@Q`| zf|1YD*j6qwMX4rt)>qLnTS+pBa4?cHbv@2&Le}k~i*raqtCew#?j4A(4#Qr%Q0;m= zvV$fqoju2;YH2#mp$4CCAa+*s4o*o1m779#JMRzbP+Hx9w;Myg0}tT!JXZXg(_Wm3 z2IPE3QFFL-#c(z{%#y2>K#B*-T!2}-{V`hFMyo23YkMLisreWj0!jXLjOpE76&BWq zV{JU_t!)~WRei)V^d6__T4}1>Np$zEa*>r(#EQRo4l!J=o2#r-eU@1;^oMCg~TcsWy45=fceQD zy?>o?G3!DJQZ(E1E>7?0eQR>ZRS}4!x&Uwf0C_9#T1L_nR!2?!p=_J5#BJeu&tK|l z^}X?#cRG+lfQirydi&Qfb=c&(XLZ;Dfg3OzPoN(4tp(I6Y7r;IgXU<-%PODZ_a35$ z8wW#v-&DD}wUS$CocUmeQT)wn*<3`CM$ya+fAY}dkbC~MfopQ`NA|xoFPONJR~Q9H zpsU(!?)R>?$8;|m`BKQd0(y_H6)BNtbEPq#?F9Qg;XJSkNh0Sb9V?@@)gCz%D#nG6 z%%E|fUuxuSF0K+#ld)!08Dh1gV{l|)hgRp79V#7}YUe`NR@#&@A#JW73Z#AG>-4QF zYlnDznWom5Sx<}g1F5#TMQG$x zlA{N29C{kju_EQmpd5N1(z&}iXNlE|hGH-y2ZBGww=`X1$`j>W*%;&Q`+y>|sU0qa zZP{F$Np8yO#|LoZWo~FbExgh0qqn_{CW)Kxw^3Zr_LMgtvw?` z>Y>Kf7!1d!tyGgz5WdlEfR?_EEloK_wM*(tTDtK>TJ!;LlWGL6gV{<7`-7>%3 z$8+yZMKNB(wm6jvgOEX=DaknfF;S{dB%{mOAJ4g+`W#fOK?S63nCe*l;pt3y3xKW@ z%g#cDfY3=J9yg%@N2cnv9l*KY7uoYB z(85FjegsumhnhUwX$z~21XbXA=9VOwIEEH7x#9MVaC_s@mns@;Ep4Q@zI(R;${cw| zjE_<2R`UX`$fr@b@>r9MRW%9;W}7E@LECBXQ(NjkW}HRj#>*+&9E*%8@0|Cd#TR8* zWeD*(X_RDb90To6dt1CXfCqdG0y)9!{{ZW%(M=SxZMM9Os|~#57~3Z~_NkU=UUdt4 zj#ml@>OIf3ARMF1kxE*-^XvD0%|O=iMlcvFJCgD?d8;uSS&I3W7!4snv9=6{*Xc_o zyk0{fSsOoegTVEpKr-;|lLzaZAwB&n#Af1nOKg86qqdGSP#{^~azT?trf}^7&GQiP=?gmHWi^6>>Y3`$$2zbWy2Mw}3I<-`<+b zG(h<-7b%5ey*>TuRydHz;zkWBjD{U?{Dm<#NfaO~${sU_i_31ymUYi04*2W%SDE~E z{gM6-{B`i``d^7WD`wJMg2{LW*D`+zRv$8v^{+_%!Emh!-ybg{KP(TYwM!NFaFMJA zQ18QxVLcDyN$RX5+IL6fhwWeg00g-4-@+YQZCBx`y}i?=V=MXYH$uO}fC2OKj2<}7 zNw1Y}>@MwfYppU}F5O3@W&!OI4@(&k;|t?v6&Px0r7(;B%XS6RR?)k>!*n2R+;$z z-drFwLAC>vxN(#G>P59OzR06I0M0@CgVw!cX*B9PMlj`h6?Q<9OkT<%||Upos|ui0icD^Q&p3cR|K#@hdz@`^%F9?c22#9CaP> z?^Y$Vg)Qyp-pV9Ga863F?0&Rd-p4e)WPVurHpb9_g(tti_|#KgOB=`X6C^|CUJ6_?B?RB}{~{?sgv#0PZ^l02sVA8;uh-eKm) z<+cU}&NovFkCIhHC>)dr=3+S%M(G90904M*krjy}9{#lyGe-=jZ!bJ@Pbv*2@flcF zP5C*&Je>2#r4|+RCbeS(X>QG!%h{p3W9Uoij=aF31C`9!g))C?el+)Sgx4cg8+?Kz{Oe0 zv5eq!?eA6E;mf#^%1x2S`?hBX2d3(lN##gIwbjx(#KnV@!C$Ya^fgJy4H)0l<#I^` zAL0kSX-!?3%2pyWAu+7d@w}FE#s~OSVdk?E%f{oim!bEmrE=`wI`W`zVZxt(N{!2e z1jKMp1$r9kS{OFO$p8c)a&gGyQaD%L`@)zV0}+}=ZUYtydSRQWrkBPD#w6n;bf<6} z$YuZrAnxP_>OJYqj;AXb2u=a(j8kHS?q4axG>^1xJc=D-Nf{G4921`X=>dO3fNFjv zv$TfY(l?n^f^vF{{x$X|z{?lSmdKlG3`uSi=0zXO*T-HFGsog9Nftt^E))zLFv;!j zUt@e8HW5!|ws%H1-T+x7B*&66823K)^tmFnITuS>$seQNvaO7k9}VNYyOj*LODe{K zQVdE5%KZCdBiD@827&(ow{3pb!sbu4mMD$augrZbL-u*G(JlTI$zg29=0c~=edKvr z=Y#q2QEAZJ$>PnrAVdzK7FpLJo3RJeHPco%sU&(3c4wvDi_2*3ZLQG+X4`a5tI+xy z&hnvx31+#tGaoFL*g98B;wv3HOw+9vOZ~TRZZ|5nMsdyuYUQ;F&9K0Ywy?wF(D$Ma z=<1AK$4&6wdv?+8HArntc!`3Na2WdI-oAJL0D^@4UDP}u`#;>rr{4K@x1vb!(eW5O z9Qyth@4gso$n;qj5@w1pRLD3Z+upt({{Vuqc$RJ2PlBMj00HJnZrx-!_3Q?Jm1T@^ zSZ98yhb0z#Hw~LEq5Y*0V)G#LNq!i0$zFoCv>O(b2Uz9X871A$0uSnIJ4(}Suh84P zQW#9T9pfZ{L|WQBUU znM|UV3%nx!SpldX_%ME+tk{{%Z`x zOJ@XodsSPT$)$2`1ZH>1oa_Nfs?y!dd{v-*vPbhg;BpXgfIFQ30G=uVGYM1yy@=k7 z-5!ox6LemSSKDSSESqD-SUZK~f$V*%oy5_=*hbvaW9G*h?@FtBAs0xll0VAI>ySXE zy}B=#vT)@|FYS@jr>z!1^%BNN*=2~qEN&Na0>cb5$)-hc%_B^#n{)fML-&WT)}?qG zaEx8Alvpv!Ww{)JX(G0@SU`CWOB1;|0iK^)VP-MYGO3N~tT#!szFCG^md5118Z zQRXoi&O3X3Doblg+9M=PyBH9g{$tm-y)1AjU$eR$i2H_l=eebHG>DqQ*4lXIx{%Kt z*kxsNjANq;u@XlbG_a#7$L`A>2iN>*!P+Kd@|E@ye4~N5A4*}FN}_}+6|!J2oq+Z} zw4K<*Yj!Nrg3gWx)=)s*+)*{G@i>jG%N7`AL6C$D{uH6Dr4q}(Vg>!whF`nSC*GkS zXOULl?PLPHFeicQp5~gk3dwOT!(3g!%B`|BaGa1mJ!)&~I3ji$bkYVV5*be5K7yfD znmB}8VM^$B6U=crw~k>T^2eCtmDqa> z_ok0EfC>nXJmg~-KJ@KBPrJCck#8dj#?(d_BzxklJ%!57g{4;kf+RTp9CatXOKA;7 zwQ`)1NbxG$OR=5Lnn=kb+tQyLmgyjQGC*uJh}%lz{{XL60>*Op4njuQQH&6Cjy-A^ z<8@Y%)l?EdayTPBMJwDa(IOcfMH(EHkmD=&SoHeTGQ9&{rGC>o0UEvw zFIHdgQmhUbL3ydHtt+?h5q9kzhvE8Cw2-aQGt9BDUzP?tcl~{-(YKp!k;xYAu3I~C zzdf_*NxKas%BK^CiV*wbKXB*f^yj@?H+Z;c90;fK)sz$%C#D7|r)%ED3&ZB`S(|hc-A;&J5XmBsmj|{gFW96-8wPPa zdze4U&l%57)eM`S1Xfj#X6zH!9*yd1+d^Zu4$=8xi6~d2bIHv^wVvQC%!r7i{c7Nl zf1M=kRkSIKQ8atyomo_z1!5I_&(@@l)@Zid9pzcP$dH_X#~hDNgY>J`_Dbw79z4ez ze9)=EkotZ!*{_;r0@>9bMj=(>2W~%v`gE%1xVceU(%v()t`SQSx%zJYl^Klz*vfx* zlFnO(K9u#EB?3gYlPvgTE%K4-J?NU_cqT9r_9kuE}sIc1Oh}{0E4*$w>9NI2sEo1o?T|*$w-U`j!4%GyLyq1 za%4ZDSO+<+WvTNSwO)Keis*D66r1}B`U{&FQde0r zTXqVO&NJG+viRlk7g6|!`ypw56#mDCc$Ro4m<2ndXo(|hcI4#x;~fbV^A4l%=f{2v z&}{r+tav8l`!4V-{{U=>w-x6Ak=Gd&?w<~I4I|<&!ONX0E59yS;xgb#jo#o2`_4*r zZ5b^Una_rb`&*cw2kq}H^z)}^cWrW)s0{FsS7T$4)pNp4;$H-K#bmv-V3yOF#4+b5 zp5xM)@W&0VK{brBynks(Wl%=Y0qdUTzMApJhI}u5VQs70=rP;NEuzPBbFdQXI~K)y zv!{DTIxp*Usv0XZe^c?Mo$;^X1%;P~^ivi2xsFoc1!%~~BO|Y-IuZKi9}W21!rg(vpX|z08mdgf#I!g=fR#FyuR@N05>zjK*$6kKA!dPU;Gsh;!nh% z4#8#NB)_@SEH${AOUr1cDkY3Em%s#NNh5dH-oAT_ahQx2QCdma=#%qjW)?K(E54eZ z7ykeSCjF|kuiA(9s@ME~;5hN5>FfQOqg};@Guy<>JiwjP>TKJZmHdX~5VxL^#V2ao(pg zxM26iwnfW49AI?M{{ULEX#ymQdpRVQc3Ds&Y*C(|cK4~^SyEJF*h>EMr^>$dQYl(7 z!f*-5ZgM?EB#Q3o56(;QS9UTxXWFIeGT4#kCU_-C10GdI<>R;=&S`EW`$W~z&K3EI#F&#l4tw$}wMLC996utv7L9`tA z1MAwSg;VXzD_JtaxF2WV(~rDQ^P+2b<5^-TvkWV&hiiKa1%~ z=q$>{GaItX2-<T)?k%ERnj2M2V2e>5or(fq+Qk zow7kLEVT2h14c)u^#u7i^@K)+r1Y%rlbv z#&P}?9nz8rwcL^cyKA<8Ue#JT5w_f!B=Y*U8v&GcsjjZ#n93ZlkmL7gI%Dfe#oTI1 zqSTKaf=47*ahGAXQ0t6w%{ED3^3np|E9A<@ff()2eEL-h=TwO|1!oPwbDrD}dIaDr zE=z{yL}AzI=qd6rQZ0v)Miz+}1dv#tf8;%>7UYQ-G{QZRhAxAGqm9GbtFtL28F0>< zRY}17YJ_o0vPz;xWp%+FIL{)fLgI3<_gzd4RSCPGe^M>IUsawE+?~ zSqY8V3lEztPTch(o%So3%t;G4&k6w~4EOre#oeX5OD4%0J%ej2=W#u%)C0*e&gIlI zki2x`lk}$Dfh0Ee)@fx5k}kyqAqL*u=N%??H?#E%24s|7!TmPC=)=44!q1K-@!8dxBd?vrw; zQlt;RpXpCs;#OHv)s;h%>y7G9@bTK6tRb^3Ner_+%QHRzLU{yw9^7`OTiMAh%WDLo z9LNeWY@T~nx0WW`6|^NHIc8a0GiMki8c4)QQKSGa>~2$neuvhJm0(1g0%D(gVT%6e z?>Y3VL_~^ZxU!Ihi*!UEmpw2&>MYE%hc?m!FUki_KfDibb5VKmqBM}o$^iLQxyyIQ zr6Hz?C0od$lJSrgkN!RFi05~?sT~4HsAr0ISI98~lq7UD9FwExY%j`!81z%`>S`%& zhaeQo3~o_^N4+}*(k(<}`&0$w*&K6jlOvpC`Fm64xOgv2))zUqm5R!UzjKbcsw;bf zpS;M7e4k%`T3GJx6=Pwr@7#`vJAZrHmngZBVTemWs^qC-vPLH)_3KQN&4nYl`BXDD za@~08imVpyb!JHwe6VtHoM((;n5``9ByRy%jR7n<2iyv3A+eY| z)VD~G>%C8MMm+?6A_@47a#>( z0Dq-YNfPeJqj@8keOCZrVx;-0LMQu zZ2tf%lHy5i(|RCsTWhH6idK`@dKKfflG-TXkojUJ$jInVeAR_eu=xaU*napt{yw#9 zNAUIQ$^?-}LlPP}56zEXYU#8;g*uk416~LuiX|Zk+t1XTSEqx@aoFivoEtHzUY#|o zIJp9$4IWt|0%iAdBNBfYUQ|n%j;UC%m z07{xeadD^ZcnC2>BLEim^{=eUxECO%VTO+{q{{Vzi-@y#6Z6bhosB|Eb zc+a;L-1u+c6Wzq7RxXOa*VU#kuWv97AqMS?Wh<(z^D!K-oUkV7)P z)NDw7+ezWQjeRW)u8j!ArFM=9;wMqFo`Xn)Myhd#e1dt#YewHewivm%fPgqnqXoUQ z>6+XYOJx&WG9m^WlsfXG)830Y+E|3B6_uMINZ=n|YV_eo7QMAG_phl|4J_N1x}7&W zfUFsQ>h>a~x3@rcTc!zYh6nF`YGGv8On=fDU5-g^m2NFIL{(3-oP*T{0IfM3H7P6T zK?Som=@B?1<{gGQ)V8phes3({zUpJ4^{ogkp@u+>b;dn9pGu_Kj4+AiY=j2{H}K-2 z&6+A{B71vPMBgk#79?}ghox9EqOJ)*2MZoK{Oc}z^8+fZq>iXFp0!4Ob|`HePI>2J z9x`)LcPr>^P~nWn~*T}lHZ z9e_7n`&XQNMg606iz{iPc|h5M5FeK#+PP|1p@)NWdmSo^x$4@ti?r=4b;bUmxIze1 z)Pva9oBT!npmdEgDJ<-!g;+5$y1p}?TKVhZ5A9PfsWgH+g^o1=ayn!Bn(^Nn`2PUK z9wWVy-7k!2ISvO54?l%`9(BjLegZBu-!!`;zLpYF>GM5*;(zT%Jjb=Pyez?pbCdFq zOpf*9-Y58{;vW^=JP&szy|Xw7;j&NHiou@2rM)jKX&@tZ2U6bkcFV)fB$1>Ap^%UD zt}_~w-xc{DamCr5X(pVl9?0*fhf(RNpCalyozaR}9#5MKD}VtNYR61A>l`sfvCEZH zkCc1X&98^n-YDU@QsEn!l;B8v;C8F_`V=7fLMAK0QX3-`^3ts2?)5sA7GhfHmn@$= zpg5Q3!tsjOheQdq#TMeP!w&pe%)rOr&+ zG*U9G^j|59Nw~+fY$RhRxHY3~qIqWwepNq}U4?D!a$y9oLXL7zxT$W$Zi}`v~Ikt;FLgR5hV-H%VE!Dt~A}$XE zl6!koC7hU&Xy!~YZK``8Q&~!BAh_uz{n>SdDyx$&I+ds-)ReH6%?mC-`N=pR=e<|G zm1lOAP=08Fx<eyTkIUVbQq}+ga+agJJ zTaAoIQu)SxYAhs{ij8pD6R{(lvGn#86WkFQxEN&UtQQ~tx?#JFe1{+_eA`<%B!4>2 z%vVLbc_x+FBUZo}EW?GTw38~Nu437ovk}S1@~W*MkbdzC1{`6qc>Z)OhCwB}AwcVu zc5WMc2rbAX zu085Mv?7y|$7^IMIsE7q(W4u)VXWdUv#fGAAN_hs%gSSf@wvAEycIa=4Q4drSBg0u zfpg|ai_;$8;Zm8LuHB5G510pa2l&2}aenQ(W6z?v^=NGY{P`ae_xsN2k3zSX|d5T}5ZPSQ)Y! zFW!O1M@%2atXmUtvMJ;#xRALVg&clAT4N+WT8pWXA)Ueu4ng(LZ|h949!$p9QD>05 z6pli69A|<(sR=e3iIL%G>=-B+B3`Tr>J2*FPY=lJy^0O0$Co|NwK6oc2`#m{Kge*? z9_KwOW|3W6I$T9>_Ju~>n8+L+IRtmbO1oMmx{e|c$W#*D2JAfRf$kEFFdcmAM?y$oOb*uktL0TG>GMwx2L^D##E6>^4zBA^N7lEy8|aC zoJX9#Wx4`gzIe*uE<1x#vX{hZAlMJ@0AJ8h^WGQ)cGlaAWJw;ujC%UhxD1BgD3|27 z$!6uZau2;&w}X2uVjuv{(s&s(*pPY32hN*+c$nyW;MA!S$TrU$i^s}(epsk%Xl1j7 z1tC=qA7I`x+3)yNsu(zxK#UWD3TGJV;+gxD4>XaO_eK^$o=69;6*@ozG$tqclc;?B zrlh2b;spS)jhUlz=_Wb?aBqj zWxjQ0=RL@xdE@(L%XXLR9(Q*rtrzoT>ayH^q@2KleYvf5)<~V_$2&a({$KDm2EycCVT1R&iNS<>Pw=-?? zc;GP|Q`^5vi_V-RtS%#v;FVB#-P{jB=|?5lbE4~9vwX5hjgx@D9#5?!YI3}dyhh0J z?PLICFz!FXvqj05%Z!F~L%LnR!}!!~Kba8-#XAx;AdbG5XSY%cMG{6OSq)C#WzP}?Fbs^N@; z$n4n+Gt_!gNg+90V`^67Raj>vIl)uN4d_p;SZk?NmzG42c?$7$IqWl0EH4Bi7$apu z%wqEfa!;xBq;VaiW=Btu26s=oea338h$k~f??mqH4IVwJ#{4fJB)L?{a6g4bCA&PEUKkn~6ov@k93Ml9=!}BHRuyS{7MzmZZwHy$yA0`4ytkrjARi_ zTVW$A&m4*siC9(eLH_p?k;t;4jLHX?tDuzFPPC`kIPncOj)L8Gcm+j&WGc zXao_-43ZIU(Fq*_u#>A}v7~#rz}x4d%ia=xWv0y=?%2>4VnI=i5NV3eq4vgya^o(% z1MBs!NjGpKyI|R3!Blcw@Kn@Ml~xhOB84E8Ry`ZJK7yr@Hpp$m`JcKBGC6bU_)}ta zl2Ie5+khEZ3^%o8*j#?_lSecYuwa?mI0SoABSSr*of|Pm#9}{`tM@+i*#6M64>~Qe zhR#Xku6Pvivkm*%NC!CCgU_u?0!xVV6xkz)K!p^LLms4>g-hDU8ba&6bDSdnIL!F5kGr4Etp0#7y+A*-u0I}nWBP4WsXDS`7v?}1}Z(MTWk@!Et?O@q~K@p?N)q? zcTpi(3i1`wOaOiTXpIrL+6K|`hdC^1b27O~=^271Z!gXO5>q^mdUH~k44}&@?PvZU zLG-I3JlPf1MstN#0|fW_(!*_X&%L48!2GR@=mode(V`xb*bLzsZL1wQJF5oyjNIe^#2&i=#N(ibgW1o1rB&dvIXBqlZ zc?F+iMI$1BK#csr`uqJWOhB=ag>rZ81a!}+sR|2Xvz@|C`C@%Laap;$7s!n3ojO~n zV#2UkpMKti@r)l@nmZEGk!~=EGR2o5`)Ag#NiEEb%&4+Pc#<%O_c!MKq9}(6dz?0#qwLQBOr!9&Y-!lLPf03$_o%!{{R5TdYSbLd$AfY zbX6E|r!-jTUyr#~enpTmQVcZjEd}M>`RPM;p8cD9(i%Fo7mPq!17q~TESfC^|E#!Hw9ca3;NX~6}OnFuqyw%=9 z9F`oD^!ik{5q*q}l0@;!1MgFw)YG^!B#+C?tR#@XQNM*A-n8xp@3X5j4xpUi{b~!z z6=7mS05VPwC*5hwdeSPOkIOrLPCoa&Y@*EEmCHzpBxQG;5!Ci-U6PhkVH-DK$cv1e za1B<5{{YII!4e!4+jk)&})Fi>qCaKgc?dDXB zt-_!9_)>CHJu~T58h9a*Zeh4=fK?=w$;bZysc0VIi%5ApkoeAhBY!VHDVhQlv14@#$e_QDUd$pL8` z4>CnL;B*7^;+Q9mVo@C4Y9kg#BP>UzPo-+0jGWnRZ)2J{0wd-VxJVD(Ju&WS#%3fc z!cr#XiRw>$5#FoA^9|~(jGr(LIAiUKbPSthj^UYPB$f@p2R@yuxl$(VbgE>N%kwf2 z0>nAW`U6q5xRIopuZ{{2lLr~}{{TH{;h{X-4HocLyb6Wx1K;5Q_84gkp_vg}@UlV#JXVA%mj1a}6sEn{|9M&E^9@q_7~*0fP4m~^_8 zyh!oPxNyHLfRB{>k6IS)MnJEF7#V4bjQuILT2sifXR!Ly?(~87WEU3h zRf!yA20!6eqLDnsc9~464ZjaA3ov6OtX&Y~s2I<-YSP*fR!b0NoHr=>Plia5max`ENod;b9S>XZp`u@qWc+}g84BxXR&V_f5(Lr;z4 zFolXp&IuBgUaioB=|XKKp4vPE_mz)&Q*etShgD222645I_|}RD&CQX>5w`^*CIf6> zbz}HdHHJwe`)roVWkw=@EMTu;nx0`Jv`8K`UpM!%KR6gYJxwS})SGxQa@#;7<#Fg} zln|8462mRDYKqN`$0~Y|M|!T1#{`~F%zka(G=z~_*RZT*Uuz#R_5yox-1=1;?I!6b zFr~gEz{7T7>-4PL8Xd~-xTI;YEJ{upx{`Yn-lv%G%;#=Gk6MQj^BiuardvZ4k80^8uaNLa3D3Cnt|wNC zIGDyFD#4BkZ_>Mu6Wj}Z^G_gFJco>69{&KSt_xhAIawi&RXbaDK*R@QMmSg3{OBLsy20GJ{5i2YfvG3fy2;}ooC1G}j2*#C zbJ!Zu{{V!0S1epxHaObKnJ4h6Bk;zrD3J!AASl@=R}6i{3j>Lh(kx!qn(Ac`2L$lL z98!P_t7jPX>00mLt!P44827(rBn%3B_$K^ZEHHlX7=d;t3J<1hMU~@U*kt`;mva@u zGk3r|(rj!Kw49HWj+w2fd>7&=TyL=;fLA9N2jBc^NW2ZH2^u8Hz{IBdRJ3n@V8l%3FeJLjwA|sUvcYJ z+u;TLlB(_y4S?@;&hzX$S422}Gn{Uzvp0^zCvIbiMI`JPBd$eA3#efH78v5Y89o$U z#sq4mWd{d5{nw!?~jW0GDiE+8Af{jw|N-te69!prdZs zs#-#N4@&G);U>H<406t*+jcjcWPWt?_(7~AdAFA!MD4@G0U!_WdK!P~_G|^cdw|X-25iKi4~%rOrYwq z_4TO!!OU0uyAQA7znJ6LCQ0|fIq5)*o%KL~a7 zc#>9S4BJ54$GuPX24{cavHgDw{Kq6>Rn7?DbMH(EyYAw;#rRp`KQUmAA2EcuU7bh! z#~f8zJ{~HNWFArl$`$XDInHXS@CS)9P(-c($trWjV=Si~9pK7X%scx?#J~XZ00WvB6$QV$ z-?eVZ;7v%v6hK3%#{S2n6P00pxJrn6G8{S)h1x z;lGEH)=exM*lh#3-Uj~QliTasytDR@_}y>fy3_UF8@M6-F=*p+CyGVw&RmcP+I_GG0p%zYFgJq^%_eM zPrh@Ca<0W8$Rza!lp^jK#xu_})xae)%}sz%{9xp+a#T~5+juSM_hWNU*==S94!D62OOS+cA>We>DW>LKIsJgJ5m8a+S^fh&Q5xoZZ~J-InQc# z7&ci-kTMUo1P!3c>y8iWK*Ye@LX*=u^!7C63{dnV+JcVAUk7M7W*v{cC}vmMgN${@ zS^#sz%gY0RIOnZ2pF~Oih<(KBhdhzQ)P^t)WK|OQL zA!YUCjAt|h*;hPrXaK;^Q%wpxaZYSLFnPyQ-jFaLka7X%j+6}ue=llY4guo_KGYF| z^5>595rx8>k~;cQzMvr);GCTHqdZ`q{CiQ1FT^&O~F zgeA!9)X)O4f4j-S`=jaWOOT*G7%=SJsp|um2$*7ULk{5jQmPQjjvJihkr>6* zPZi4&+soo>_Kq>NVv^;E1JH9+R2+eg#PFj%X;_Vg8$1lD&qF{C-Q|WTbGVY>#&T*h zRFDZO2RI!lXGbG;LB?~_G>kr6KSR`>^z;G17B~oa|lYpS{M&LaH6yWia2t8@Rk(HSn3>PYy!EdE5#Aq63{skpK{xhC}mR~Q- zX1V!QV+1fGpK7oXlne%qhVF3Zsij=UDlX+4+o|o2)QAU`zdJc%esbIurvi?Qk&y95 zcM>~(H0&YK851!tJNeo=&@N^}k+fqWflhJhQMMUXmwJ%d^A);!3XBCt%E}7#lPjE3 zwSPsbiWM50^KZy9p|)_+y^=s<1n&GRr7pzy#VlbJm?3`ErSo z@>G1G$9g$L)r*OHwN^KjAkPf_J%`q%I+ivox{c52$LCZdl2D~%!Cv8z9Qu#`y(lG< zY=o&+B%xgH_V%QssA_1gsK`ns$3u{WbN=>fNVN;-j_Y&gVfPO(WDQ zZ!NkHL7tTBe-ioc4WYzPGjCXAP+9)~;8n~$-15d7&-v8+@qvKD`@X`gER7x1VpL$G z3?De)j>40Iu+i40w6Ayef+h1@1z;cU0sJ`i6>8g6Ciut%?KhUBFp%xp&uZh6`enBZ zBW#Xc%N9QNLFDJ@Qa$)81e@>&$Wic5t!FApu^q$fW!x>ox1DSOBX-dwXQxiM{OR`k z@YrqOm18`xLb+xH^tdnN zLq}h2tX)av>J!8k))V`P-S)8T#gB4*YURGaa`7A4+slbu`EY^Cf!98y^{z2BeZp%s z23Wkc2`Fp@W7Q6QyValVCuvHg-yjor>1K1+#j@RdXCMhgigBv;AHm|=bCn|ZfB0> z)f~vGMDd^u6b$^w&>!%vJ1tzv47RaegAB0(>_G*&=shbxVwl<8*!YGQn=#5{+;*6= zfY|<3t7om-q+(ev8_Z3_+Xv(?_p{K~ovx%W)+@_9lMj&PXR|+l1B~QwYe!AJHjzr; zvk8aFTig0nPJkYh4!%}3XtH-?Ivfzg`c?Zo!G9*(Sqr+h0dvG&{{Uan3mF|57EE?pAd?2y98z1K^K{#5+k=#n>qg(ibIiQdU#EOr$RXpz=s%vK7UvqRK zlIwhfYo2~_fq~DpdCiB2tVEk`TWW3n@0LL4+w19Cx_-5AQYeZ7?lK}PnH75mHI%8L zo`Y+xjjZbUE}>F2Jx_Ynwbtakk)WQ`vZ8=p01TM!53j9o16YJvJ>}GLJ^)Bk+~AYn zK9zS!*Y_{>eTbQ)Bj$`SX36Aa*F31Po|gu!e$J_Ha;M8}@w}~*DaQ&=rCqYTo^)l9 zv~n=c7lt0cO5*f=cxsOj)NNAJ$x0uKjFP00}A6nonb;SE@a3#4hMgeIN zw(sk^j`*!H;}*Nq1X@MvH=0PukM1UU;Pq}kg0r_k)bAkIq=>AR?d3x1Fef{_!;fCT zR=t;qW0iJW&LddI?+F>t{{UM(tIl-oTwFM_)6!GsoGr7iNj=Fw!Z<&UD|f>>rK~XT znm66OfQj3dIqE%yCr;>hXzwAvQEFzoLfe~ZN<({A?NnSXMIYkr5r#nFDk58p> zx?hQ>arSuHIm}sf0Y(TtjaanQS{asjODW}3XwVPjLkHlE_&?fc)-G#C-){v(+yxMdezhQHBbnU zDyZd0b6gIIc|5XtMYga(<;d-vfz(#+iFYm0cAdwTAB=E5pIVZ4I_NJEnNMPH0XZO= z)Y7iStB9F5F(>aF;MXOl>Jgi-?Aev$lHpI;=IW}$vG32X@~hEmZ($-@O(-&M%V2dC zoVC%6?X=sdWGfhxDj(OOt$XR=`!E*DT7NSPg#Q2!t#Nu*sL?Wzm{LjJdz0x~GTpV{ zUot=?3%CUT06l9LXpMW!>g^|0Uo{BEHj$o!wKV(1Nk{_(fHS+P{*}hsYtq|I8%UuL zU<{1s*0yXlh@`p_62$@MikU8C7O~yf-g)3bJeW8bZ%Wyg0L8Ey~onH%`;RA z%x)xBErOm`r@y^yN2rdcBo4L7ICM0NJ^>mO60D5ck+&=`t0NLgJwd57D@4+_ zT1hDxY`%Yp`VT=;3vmAcdwPaAF}`;L{(4h{O%pZ246iDLiH|tPaqnNCUqj8drLVTe z@XM!98o3HeHZiw9!~XZZKIT(vY!csW(vk9(T$MQO?kIU~552r3ZzI+&R4kg zK9r56!!6`@5zWYMSP}sr)}I^sK4Z#u;dYfhb5p)vBN{72Pb^O=PaLnNanhEENVoQg z!g=h``GD;5(RzQi?ewW_<%&63-N-_qF&x!+WDzOy!m@#dQP(~4YDbmbl(9|@cSbM) z$8l3)i&sZZvx((rzzNDTa>{#qRab8;6^t?lPNd|h^fbnfJE>YZVr)pGbFuH}J*s&O zep?Fun5hT(C^K9z77lrWnP6nyT(g#Q3!`_gF*HfDTA_(|Z8iTV}Bi{d>Y zXM*8y>Z$^<{`G!+e$}7wNvq3Si|-ZuBDhOKy`;5O9@U=3C60Oin&o0Oupxnw9NyNK~Cag`dy2j=T%v{{V-Yyxth`w}s`= zuHu}=%P<8UhbL(s!#w{0O2Bz7+7g!=gsCC&)Es2```7L#?H&6Od?fv#yfty8>bevW zdCJcO@hB3(FK0#rIj_ub+Oz%%-|=hU74*8jga=d5gF8oe41c`0P&f>pryaA;Y#uEu z>~>PFs%ZBMINU_0i+uAMVk+&`nIG{7$GWSN{GNQijO9ftxzib7T}$gEjMARfH+KS}_SGO;vrMy=*V#Ky-bujx#< zE@SgyP-S=8KpY0ge@bJ8j6TU(a54)qBxm{4o0Dkw8L~g@r z`{hm!JL02jh=%2Y;aVt0;t=%q9_EqSDAq{~oJqtloa|xS9;Tq0NfTnUM=IYg+;{GM zs-mvM-G`YSQbLAJuO1m#H_3y;8f4&ZD0Ai` zVTf;+9<|XJsO(`WUqOYPOG^_xff-Qku7If!;Pik~qRmhqm%0U}}#@~8GVpy?=NJk31b*VEO zCebHfyr-^x2eldwIFpS%qX!1#&}>l z{b>ywKMj`2{Bvpc`*Sjo+W;I9o8{hzB>w>Q>*ZgEKfLjc zv{73-uvTNV;DL@!eL?WsQPTTVaq1T=064U6ml!R{Nfftj@6OcG{JsS26zi5q9~i ze)a`RbsK%3r9xEAO*=~!A7^rF@{WVZ6+8j43aL$=IXfG2TyvKt&XVc z8=6{7(fM1Rb`Y?`1mJ_-zc;_&ryeSwR`|Y_+vG(P?SsrY-GjoD*dOPL{S>hKdRa?& zSwTqHg(Hjs`kMU2{{Vu9dB@`EyPe8Oa{(W`P6KD}0bF^4wH4|P&DipP55(+CVWKG9 z?mR9}r+n7QyOQ1sZdDptqf#~?{vYtHZx2NvXyTsP#EOBQTwr7A>sN0}%*N_D36eFz zMdKsa9qYhq?98ousM$(B(HMAk9DuEW{{WS8o*>sIS&Bf96smWik-qsILB(ooSBWAl zQ*QF4eT)anPteyVtF_I8%^cDh3}ksGQ}cj%@7B5MHi(;O%euQ?He1`71g|05T}c2Q zxW{Z(Ow!1>Z!9YrPQs&{_BDF$Sin?)zIS3~z~cwdR&=fBg^~$Tm00ozUNKzzvz^>T zf*B;u#k_%-5JMcOKBAN*%m`&tH^<5*(~;Q zC^nD|M?5YnSc+z6=2%^g%xgNRB0qEv7X;wPo+ETS5mNVDcV9XRuO@p zaaGB}?7c zJ1|uG=Aaic!8_T@i5v{8D)AxDZ%&i}G?GaXM?^bIjmKs|80MDN@uQc|is~1UNhqo_ z-?*iM8>fIpCA5G$6E?=-0q;)o(jy|m6+E&C$8n#hG_(RGFj?+#Fe*QI(kD!lk{A3c zMa{e`X(|>5R%aWq;ZGnMc}cB_jbu=acWq<@0(qraSTIRtUFfxW z2tHiI@{Rp*PMBOu?qu7&V;rhuIPNMzY|je8cK`xOe|AS#=cgS$wR#H}=V=lK++tEk zn0aC8?}}X38doyohWbSc_K7S``%56}>}q3W6VK*6a$s_xag28QRoHGLXZtiJHaN>; zk1YC+e$>XfJH%1MSx*@NV?FxP=4EoELb0G#3dG3S+CSN+2t&@6qs!x#B}f_cCZv|; zd6DHnB21jyE7Xg6jk7{@B8IfUpfJt_9$)(IY2qTUc-xQ`p zfEm}f*FKaRnUdIBI|4+dkRptO@Ay<(mN>%{W^XX5L~pt~9D35MGe%KmfR=X2bv*}a zLnD?#jwPBhfVeqt;P*7hU?o^a#g*hco1T82f~6Lc$us$oxpq(^-hNzr)7m0bT?pBB zDIo#ljxc>`xg;)96p_;11&#{|8D^6_DC{xoQ=2wunW2v=xbs*Jea61fn-p~2;Oo*?nO(L%1B1UNa~is9H;KYoPs^+C3xp`-ljId!Ht5c zBhs8Bh@nZQ$YFsdd12}7D$FV^Eu@8Xqa(6@;7N{Dbw5vfo@P4~t~9}Tjd^rcqEqF$ z1o?xGGwoIsT+Xa6t`wwcw%rjh0RI3SQ<@uR+xCf_e9R&uADIuotxWOTnfBVpEb=1b z3UImgG@R}U5DQrfg@)LL-JZP3$4t_tv~Uv?Ff>RAV9s*KJ!!%S=SP;>8RfWx<`Kl_ zXdTWw)jO?D+`CETIC-!g)v^~IcVtA<(T}xQA}v#+_J$Z$`oaN zTh^YF1i6lOnlO>!x0T$kzK7PM4jwjW#&FqVkoBGL|iV`zu@%wix=o5)TehnTmtwA} zB*rnxVT#7l{8>GUNcxq!ZDhcUA2Xlt0bOpJ;k&2OV)1(Etk&=^?__m2RqOdz^fnfr z7Y#)yFGbk+x9w+A@9#dt@b`|qG2$QC`&#hMvEi0ucWChG+Jvs8S_6za@%M)W0(!6G zUP)L0Bd|P3r zYRAKE6xQ}b&AUxNzX-GozXEHQchkuh+0J2zbyX)OvBu#l;$Y;_IOpSGnvk`zlE^%2t1lP4+2;NPsXvrD5Dnds69Z2YSt>{j) zuzOlvjnnsR&XeI^h4c%L6JGdJP%5nipj@QP6rtecgV1}|=12S%{{Z%g_-*kY_M)}; zE%3uovbxfI1#9+wLi*T=O~vz;X<=CxAS!K8af7=c^uqlE{{RIl__gs5!#@ls_=%&7 zog-GfD{JD)8`i-%X+A@%@nY6^Lc`OH0kLyU$7y`uvYQhnf zkhVrK#afR_o>>AjZ!jP}dV;Gd>Bsm~aoOCNl1n5JM4ZUduHYDYe}#U0-Oh^;Zi!qA zV62$lT=H3uZ=j@7`wR<$2;DNN$T4Ge6*GdJ|979aqbfHAWCtBz!0 z)MwJBnPiS39Cqa*XUda?e0L!FR&tOOBD71ne$6!4G#&kob8N~S839mY zk{`P$BOs5%sP(3KaR|P9Nl1Q$PX`^URh##b?v$#dVkT!H3*(jcGznylTpNT@kCZy{ z-%6I4Xc8jFF}jfK2b0HzPMdJhAiT+gSXO1Y2TWFmCeDYh^ zel*m(F*Ds;%nb2?+D1wIFq`X4;a=1Asb!JJaAuo@I=$B!DCD?nMu0_BWat{J^b) z5f8%i)D!Dgtclf#W|Aob3^L#nK;VpY`qE41{_cEvn3pVZj0|+C1+??JDgetM`4BHZ zjRGW87ZHX7m0-Y-K7yWsW;4p#Npxc-2?QJh4`M0N!sQ!q$SN?Qe(9+#Ee<4UZbFgN zG3n1i??~=I^5b7KYLXR4-alHA>0&l960p3g&B#!{cpv_?FrOeB#gJ!@x-w2F`{IQo zba3Gg<{0^odWvV69BCj_jwsT7(LhTfQS&Z)d*X`)(Do?VR3zbYuh<_- zTU5%tlBxMqF~|=Y?hQ6==1rbkNCF1)BO?bswG6Rt3LAVxlk)T*TvN7!C5~vMjNC5n z8}BzoG^SQ{3cxAcP6);iy)=39N5pa%LuNvY@}F<>{uDa15@1&)Ms_jJ6eO+}CAFP{ zE*HxOg7OTn)Ks?;Gs5uwq+>sOC%!)_X!2Awzu#uTE4!2?oTe~MvRp^ykUng7@0v{j z!vjkbLmY);+w-nCKD5}#khQ^LKwYSF!N(OU&HLooODeWD<=*%@UUSb`Y+z<-&kWPwnKZX}F+ggi$%Vd{OV54Dz%o2WtohG@$HfO}+j zq8qKM&9e&e;F)AaV1TjIw{{XZHr?pl4d{Kq+)NcoX4spdc^HRhC9$;|U8D2rhN@^@lNf)yt zrp%l%`G{N`)6Bm)A%r9-IANStZHA{iljZ`a9LB?_rwLc={&T+Dg4;?GPs`ZRYX>qe zOCmh-?A(ZA03qimxgT0nCRNwYF+&;+qHa!lU>dB;G?6Oh!3QrQa!TW;;Zs|$nBYjt z%Zw`j09q_G?mW+k+`MXmdaLqr+XvU$r-oUQV$uMm2r(|+LwnQ_!MyCaj696HP7lgg zIUkK$HkUEm4MT7XovP=e5!)WMIw6ow^GNM;<`&9;%bWx5Jt|a5B`dZv8Tb*!*FK`2 zmgyL8Gv_$WYMf-BUtv~b@?&+A$}$9DzYG@#9et@?0aa~SmnbAGnapJU(dvEbSajIs zl|Io67`JCCa7|m8Vrxc?=h(9Gxjyk8)iLtR5fY~eJhd&$4)nQ-NXuP3`CE)-S)G91 zdj9~26(n{GwB{mqk+W;#4c|W1ZhMp=fSE?e!N||~6-r%3NQ;=9Dai&vKJw76#qOac zwNr5O#5$n!hC7ODTFWn&7zQ%W^CJE4udt<$TapPQ%wg3*KQI8F{=GwSsF{P#5UTAT zFBu<=Riq~*PdcTozmY2KmPRP@^#pYT+Nv=~;V`sQEc?rDQ}>6rrB&25DIAvZ!T= zPBD@C)2%eCom`j=p@E6M+ueVF|xHN zHe)K#r@J{|w^vcR#R(D*xTSNCV^>>8zP#8)hH=XP+i-sl_3IuA{hswrR!!QZ(nbLr zqJc1X4^nH=JSY1z>GNGIve_%lA9s}L%8~qErF~WdfwK%nx%9t7nt0TDKUVy0s894WI@2eXI05yTkkyHy&u+oD;@P?=24r@UQIYXEO`QEK$6) z11`MhxvxXe{ubI=d20KWN@HTD1&2U?#=EcVp>3#rsVtZ({p1b7`qsQ!VYpOyM}L)1 z^sl?XaIF|e++4pSj;1m&dTMii9q^u)Zws^7l0oF-kZNYrg6dvTQyW3dD~xW!b`B5J8nbX>RaK8_l^I``^siPpSSFf@ z%-o)hnNVp91-m`PsF~M0a4i8%EIbn?KK4Z9eSSJU33b&=QzMoAg@y(-)`UT4Zi;QSm_uPO*&+E9GC z7|u;^>|+S(#HDv+XDzkO%PP1o6lAEYKV=a~<;xnbc^EwfESiCbWEy&6L!U92l%qmn?~$w3U73EGiv+r{&K3h#z^b$S@L*|A)MN}N4y`E z^N`i%{wes`rg&~C7wvIw0D-vjzSZPjJ^iUHZ5~*39Zf+*+~NAMBP4_AUS2aa%dik` zq|)^|Y0#9PbKm?=@h?czeCHRjGi@Poco^zy$$Vq`NoiVCtlw){HVnA)JN6#c^B;`= z0BL<^Usg*AUNmRKkGO#^&|`sKcdz(|R`ERTD__Xy&zDj$&!`&)UvTI_z;PaP=4(OHyrYFUzKK@SDR*X_vgzV$nK>=F?tTP zwue^_cXHhyAAefA z40g{WS_^_1PaEUFX77smw>KwqwlwUDU)h_^=ZGl-<#4#;9qRq9o5u;aNXssA?g%9N z3cDVi8I>csobF-#9Zw#fm2Nvi@h!u|1{AKqFitzuQIkfABvDHiL%rZJg+2KoRjXTY zh(drs$->o@gaWa*$+&0cKg`sYu|__4$__|jkH70wpitGf4-3VdIYJRz-lj2wAZTUC zMH`}A=kceaDMdgF1~_j}Jw-^$u*u~tP8vlDtVsEXLSY(DiQ z(8oMtH_M?PHVFXx8f=VIm?dS{2V7#Q&wU~{*_n6;7;obL0P9v$nu5C>%>`BjtU-LD zqX!={x7MS)#@EY@jGI||=hRj-ekFzzCi{=|PE}N#R5x1X%!;ya3`zNhI3HT%sfmJG z1<|JS?sZT@WA3@{Rc>eU$R(AqPD=5%v!m2ABSjKBq%>%5ee_x-Wm}P{%Z@B#$M? zkseI#L4djK?NFu7!`_GvMgo>{1_=68CV8AlS|nx!f{_3+p!fHvu`RM$Wf)XDl^RYr zHwb-AS2uA*CL&gEn4BQ%?@x9~E~JGcaRNlLNj!`;pY|yrNZKONt0>$^4n|+;?Mw+{ zndMhINHQ86NAF1>sy*Nvi@|$ywxhk0X zz32kL`%7TUY8@wXsUZ1wA5%;%BvJ;Il}JA$FGeG^SN{M^X9>XR{{V$w)4a=lKg+ri%*+V$ zG1mvLwGECasL&AKzD6Mc$Chvy_sH%lbc-*PWh|@rMsmLO9n3S7jck5qcFU4_FQBVy z3gEm@KF#BHI-f!GsBCr{6hYY`BN;hB#{)g;Cbt(`kgMCe$W@;>-Pi%>Ju2G47UOH@ zMsnXGKTv%rxso-@-h!v6JZB!1n;nX=TZyFE0x?wiNp|Uu^%~k*FnONpSRKd(!xG9t z;8U97JC7(lt+qmZnDe!mj=zOF&zVULI8P@HByAbXDb5Hz4DBvr@Gg~2cMBc&_J3=*slGQ6-2+X4HT9X-t^nM&3n zmO&JYY}2mnZV?`*Bc^?-OH$9y(1qKccvJN4RpnI!%a&9O*()JE38L0!+K@{zkZvls z0ALo+L+R3iUsCf;6~t`}a)*twvTexcxTZYf6h(*+k+2nxN#mhC>5?tvNW$(&!GHB} zjtD-rUR$&Ggk~tu%Ntx^<-7hABo{2a=w&j9ODIq|Bj!Eo2AnGcGO{`xuJe#F?NP@% zLl}&H@k^boz0ai*6?Ot3s>hNK&4c{~J0vE_t;zEhl$R|oS=WrOx27ps@W6oE<6>hZ z{*@4&<=TWD%aEZsrnIo`#8S2g59T-BKJ-{z)*92oqhz4-pOijEPxYu?M;&UdVs6JY(uLhD04CfkkT^b>?NHsQ zXqiHJWUdJ(ic5&hYF63RniZ@NZU~U`K zW7d^zt&%q}uOY|F(0ysv@kIp0%_{k0EX-Gd>PPrcQb}wkxP$_WD8!`aaP$IzvIR+{ z5=N3I%%n7GxX(Q^Ll`aNjU%_g1nwKY_q9H4E#$mL7iJN$NFaUSM>zMX?JeV277J`L z$14z9k`LokdolGQSOkhf4Wxog$a;DXI^vk|H;@N}7 zyGnxF8FE`R`)MN6);O*eBu91%81l!yDJ(4yocRtxVdd{Va(Yv^B*@YgRr@<6jf}Fg z9y#X*pN}%+P7*~WKxFBRcjKjAiZ`}kQb5GyN|^0X#~Tn9FiANZO7cB(LS2VI|EjNZj7SDM1w!>`eLQKwR>nA{TZAQgqJ-t)Dcxu zXIAn;FhaO8b_T66TETH1(#;%O*;5>K`c!bYn%IIj9#`FtVS;%5YIG#dOAzXd$Q^U( zQORlMTdW^AF6T0n_eWe+rY4ERFDO$gI63{^P6yOuy;wrB0`Z2*ADDOgR1z?F(m3RD zcNIR1^r@tlSrwf~BqjijIsiKRn&^bAGFK5ea~jAKs}0#Ccf~}f&j`_nL%88vlZsz1 z>F!2Rlgo@55cL4}rItAX4-)MlfOialJwnw=6QT!eqWhdJPib3o11{{Roj0RDBGnWBR!G(%}d%4B5$>-DC| zXe3|*Wxt4e{VPfvQ6@IHbYL?g^kMB#%?$Asl>#hekmfDW_=R1hxlke$FlHF2h#F*U~`>Wg$(Z8K)jXf?Tg~3~A!M${)Ho90m9H zr!AUpSp(;1B(Lz+lrg~+hE)wBal8?LJwd5$ZBWa;Gqo6VjB>S;s@bBaV?8YjMHphF zZY76&8fKpNorC;oxsDlRiR2P2r~w3Y`e&t0 z?mkq43nL0NsuUFd2W+q%snXcWr#M}&9!>`;X&&Tn-tl070+QGV9R)pg2(7K zZ}o8#&;J0bmZd8Z0St0y&k8{bLvl#;q(nqMX(tPlw48+$+lz#B-vm( ze|VOrZLH@E+3TLhsa!+lk`)aA0ILn#G5105_|gb`w_;;4vtS8iIodryr^6OhGRuZy zQ12N(jX7;)i54rF)!9kPmBts}*EC%WU;ttxAli%>NCXu>-UL*LrZEc**&cbk1t|TPK+(OjQombQoqn{(w_nWrVSj6@rht z7pTQS5=AuT6nWs06lAog3=dGlzd%9lijv+d&BM&Ohsue*RmNIEdgt1ci0(%;yMZ78 z0_6xeA4645;|X)+ld&>PXOrzunHo04iq5Xs1o8P({E;CnK2-~o^71LI1-S&qM@Ze} z2v}qs^U|!w@6}^GE&(T}xu(RzGyC)jxxaQ8XCGR4WJ2o4E(gpTradZK4aG^8GNM^q zGB(ga`-jxh%HVm>yvx5J5LfSig+F^NCMcFSET#4^<$&#lVRTP4kVm=&8-ov>y}c?HhSEt2ruHm=24jphQMkR0 zm=KJloD;u{4{CzECe&UA7108+M7P#(6XWkF*3X;7~BvW?WyuT`P$^i^Jj{ellEA2&A zLxGhiBp+H;AG|Wi<;Y$akT|B270CiRu`({zDS$TN$?v%O3Rs}s0$D7@?#LCf4kPZv%;g506J1nH1Et?~u zJfEkvP+OxUUT9(?V#;G9k&d~j()wF#Smr428OUOO{C@n^D7G$Z8!vDY0wR!)mk8(A z(xRI3Q+A}QNCaTCL2$>{C$RUd@pU9|E4+aG%rXZUKh#sppC#ir2bAJg7&5o?1JZ>} zp*f~#i^j`&MmCL;Ya=FcNj2}6Z1Byow;|acIVak)n7na^W@E83LLa_;1wJUu>E~Ub z0at`W_fNfOsgmj!KGTAUJH-@@9z<;T{{TMp=q>)y8_d!m+z8qmkF7;(W|tp+1#S)< zn~*&!#ig`R?u8;~T;noIcs%sSY8{X(v54^TEC^iy+Ugr1Ecb|NX6!3=(tCB5qjmUA>pM+y;fk~;o1OPPyAJ}oz3F_Gox z=40*tH7>}Jjl=w*R1A~T6$4Kk$n6}&G3AxAPhaIx%QTE!LWPyrY>W@w{11B8F}fki zBSy;QAZf1!xPRSYvN#@u3XaGQIg=ZRV~qJ>kIllKcYSFtE=<>kV2q^{5Tq!+{KFA1}#4%CY`JnnaLnUoixkZNnG`8RD4WGOM%*gc1TV<2315 zj!c8)ZlrV_@k}nCJdz+N2i`xq4A!!K6UpY3i<2bQ_1=Yhhml4MPV*XsLDdF?dU%5{{UW@C7#2z z;2`xX4m$U(TYWa+qS}kG7?o$)kbP;hTSxQ60b{oWw@g&pB_zyCoioplD|>=NM&!sz zAh^c>)m>uN-u}g)oU;Ya=%bLX;5!_32h*YHT>-SWksr+kgD37vH!4T3twE?++)EhQ zY$OIeGb#a$cRtjtgHz5tMP)R_rn+w_k~6drFbA){(z(4`!&fkcTgzCI=*79brTJM; z-6PZK+Pxo9OFgrrx=A5Sh-BlR?*m-UzjF-MrF^gSnAZds#`GS8+PWa!j(H?-H~J(t zt`&}5Mp%M*toF5KcfkO%j-x#KdsjuMC7b-VyOaoz%Ohtbo^WdxbzoS=yV!IBy1ky4 zXDgagvMMwRF|$2BVtaq}=|0X`ShC=bj5;4`wzkW+CL%Mz1dP;|c4jD)c?6a_w+7%; zI!@OPb#o}DGk{4QKD+s1xV z>H((ZxFMGN)i8re*M{c9N2<#jbQJmu| z{4~ZpzH!^2=uHJmsqZH%=x zbeo$9pqbv;rX@(;SYeKTK~sy{RMS~xf)or{79e>Z`Sh$7yaHI{lHq=4+w$ZObBcU- zcTDe?RTLemGmue-aD6?EYZ_Eyv>~}RZ=FWMQp+@IyOazm+6kvNxeU>?KV*r7Yy+?u zVUJ4Xq|~KZ{Fab;MZQ;a$v%R#4B*Fw;46IG@JSWCDbf>*HLi6y*$gWm?w^?*k8E`M zQrK(O_7R9;vr zY|Cs|s}Sr?0Ut`4^<0rEs|COvdCn`JE*vy-Aw8WG;N#ky_p)0m3wvgD#uOJAA6n{+ z=_O`n=&pxEy8Xm)`7de=N(qV{Hz_^KQbDZ?*@k5+COK&jCa^`sQk9l1-A>Y2{HM4h z`qP$2Vvg~WP#miE^(L)Uq%UG`4O;T=FyDZ)YkblB~sFz_D2FRN(Sadk;O;w|C_9sX+7%Zn*ZS54D*_KlL07rUi zYH}4(<&m;d7!&f5>MNf6LdrlAhm3+5N$M)ayr}G@U5Hi3Cydub6)73YosIFRgjt;} znU3Aa9jfda^}IGgSr$#FIRp6n;C8NNJJReV+;N;aCm)qq7wi#Catszba=d4~bbAU9 zaye13`lW=ChPbpgY|XVqhXkKfij_4uCmvL`F|b|$JrBKL{k2GRlrhSF?Tcq8JerJZ z#@!;EZYR##_~$F?D!#9Vw!-8(#-B+u#~86kU88YDA1OU*z=Oiqk%4ihEM+nycyhe@ zH?P*YM!ucNwTAss9|XSKwhwB3zN$EhZVm%uEKYMm!(qE3B?ffyTX=WMLn=o0(=i2h z{J?|B%~QQ=O)Bl~Y$HhbAt(XH@H#6Rr5>n2FUE0&Uf$-T^Q^7}kj~6Et`<$%8TA!4 z^6Vxil&Q)(F+oZaO+8WO{{R&HWvyS`ohk|Djw^`2ep*AgdZEGT?b5jDtW2yPNjGPP zC#`orGw{8##Xh4Xd*y6}$>kJx`qu)}ghH{F!yc{B`-=P@J<8>j;~h4%dwL&RgsbhT zD{hN&=(C8xZ!i575 z=zWDP&w({aZRBS{ti3*73x9N0<%h-(5Kg{mhTS%g-a{sKzB&Q=)1mmQeI>5zdkA7G z#iS4O9Qu#*n%z^&8r_+>;}=A868Jk>OMwg7%NPnbd4O~N6)XHa@h{5jZMAxdHv$_z zp0(D+@g~~Yqqx-clPrvI&VKBydwUAgw)myti^BHprG1=1nHAh{vVXCTm85W)Y?hKR zsfouy=@ZUo@J6@sW+(4-tP3Uc4zK zj1vzrv4>oFnCCxC(jN}$rIIMEWXWQpxg_xe^d;ko^p zBS`TD7ra^X3a~M5b^%X5{{V#ra86tuqn*90=$nt(NQn%VmXMhdfDQ-Cj+n)Bo+13cvRrz~l^a^QvKvN#`Fk~T%oV91~PpO3lymP)&MxhCBXpKR@z60 zCALKV+(=sml_VM5d#O0$s@-^QC47_*RN4_GW(6=03~vpEMDJl5|?%(pz9)J$irA&g2INIbpyal#xjWRwE`EIR#ss`wDZiFbKTw``P{xS7c73 z3kmYc8CBnl{$Hh6Ld_n zw1s)#D5Y@K2qIT`P?A-M$mA9Fqi)sz09lf9Hm~r0KD6g3fD3jeRc;k>M@~*D(j>4- z5?zY;%&_g`3}rHSsw;Mq~RA(lI zW!T%BfVmrbW{X%XNM=PPfh+Q0hBQNS97pAfNg00YhWoV>nPZSFkrJ!}ZWzG^lXRjY z4=h-WDgGYRa*oLs_uFNBu^>QlqDSR@X~}XB%2nCSX_*3^gRrX4E5|>VFm3w=6pR4A zwDB{#ltY3Bcag#NrOJh3%yXGUWo_qIKwTSu-u5)}cQwXDfus4i0T9MbRP$D68-r~l zISr0`gNkRI%DdFzvw@S>{3$pEjo5CMDdLE$DbV?y9Mtmn5xW+kiJ2W0QvkP^cqAH`@0LJT zIER?0D5dx#wPGd21Yz8&Hw5Q9Kl=4D-1+k)o@Q1tv;*99sBw+Qc62MQO%1)nSU4=p z8F&c!rQ6#*fa~wary7G)NFn=O#1jPJqGgi=x2W{RaxvY>AyVzJQGtIigC;sIeKXpw z+iKHX6@}&mu-LJ%8$kB-tmOp9d!5C;qjfFhHrF@tBt#FLV#2DC)Sl$~)1cPjwz1iD z1mR(k-^~&nK28B0z^*-Y2rh)Su_uV3Z4y6Jl|}Nb0W7Rb)v=?7VB@rZyuE+r~o(ac4L0l!KsS3jk5TwzF z=4O^%!M7>w2iC7!Ym>;oY`2jHIY?D-Q^l6y=pxG~4%c^=tt&lo zq>)ltS}!$!*0iJ?{d;{YhKE&>QyW>@%Ovwj<%MSp8k}c2>?=;oRe>($XyIw$jX+`_ z0I)b>p!5}#sYXTK$A71Ik~r?-@=1*?;3cimxGZ@khjZSytgok%0PvTHxXCIpymuAn z8b+~jxtC9PT!kvAM&?uMYW6$-@B!Lo0T1AjbT_p!4SabvF=~@x^h8d=kSrSMY2KNI1ZYQV%fDfg4 zoO;8hl&xmDo=#&-l2i)Yhh3UWchs2uq9%+*7>I0SBd&8;N{zMz^gRyCSA;wHw`?VB z0*xV4?0@>zy=SR;jT=6{BydJZd3|Cw6zn!Ol4A?OYz6;ulkk!k$b?x-ftjC!xh_X`0eY zZzOARhei1WO_C36`j9!rWZ)W|-jm`-xmj%|4&GAy#mDGtV@YW)T+SaLuL!4_;ca!e zt(sjfS5VCwkFReDx||I7bRd#yH_8nHH6_L_9;tEPUBA0MXd18 zcNC8rk-8|(82je6Usj4%jyU|t=E-OPY<2DKYlu$~+sy=bwr<5Su(5CTcPYTR!!OLJPHzWT5uUeMc)KSlw<6x_Uw>>}l z_2=4Nr4-QNn{W-4@{S4mR@J7gvs|sK^YVhTj*IwKGE##nJDu8UOjt_`?c6~idRG08 zqdZatGX~tf6#d_7;h@)H^0tTHBK2%_`c=zc5!x-$crIMB#s>?K4JRbf)Nir!v7Trr zX@ljq{EqAC*os>(u@+G*{{S;cSRjz$Pp&&sL2Cmm#%>*CcjI}56LqJTbE*Kct zk;c*wN{-^#%FJe+(U{E;<@Vx0ypR2w6UFFQXa|{`<~kW0e5&@~^%qCESqN`MNAjs2)P0d8LyQf?kx<(<*p0sM(k5A$jIs6< z4(zcDK#W!7+(^o(KX#iWtsvatOEYAk>rEiY6w0Mko~MFo;x&}+kr|wEy?D=T0YGj^ z3l)w>jg_5_7&jyeSOdnHF-S7UJd9Lm#!_;d20&5#L)SGkG$k12l1yP6IRo5^mhLg| z+Y6Y!&m<{>A!T#?IsR24)1*Qf%P>>JG3!uTvZHyB;@ubP&xJ_B?Tl z5SdM_q}+uOP^%G=Dj7oCLT$o;tIO^=>;C}PtIc>W99vsL4$cT(PrXyP10l?8=%eOT z8OA#PH0+orSNV6B0OuQI+;}3Vj#iG$&2cXC9$OtYk7^?OJHV+UfxYmjJg>2$>KLPv zQ+XpS5vbTm!DIduTEcCPwbT_~d19r8LX(VVr{hiW9*Nd%Mc0*`hx?2ajoBOmPaGU^U!0#9eg^zX_#>&@=syyCGj#(iGQ)5Xl$sHfyEx{59 z;I?jj$cI-eW zY2I^zRb`eU;$&4Xg09)l2c{~adx`8rGN9pQ$2r^34E3nlH{oPbpo{?-$2sduG^)9f z;lMjsj@1IYuIDatPhGtQbghnOxnS&ge4_>de1^{h+L#HQ%!%`+M&<(slPuu840mn$ zRE`_h`q4Us+TLc|@Jap?@99ii2pAuba>FMBgHKS!m!ILlIOu&UAXE+DXB|&`Qp6S} zRFZWijsbt+_n>zq3erixc*z(!AEh!#n1bpyk<=5-Dw5bjyTCoT$fj;ghGG0T0G@}| zfYjIcdLCaB+esCed@FY>ft;Rn*bS<>FJ}3Vv43V?8b_xX z0$;`DI|CZG-H>-9(3<*UZB8vm!h>3l+E!VoD3*tUPp`1Ag1!d$raeA;c<$0whj?@5 zK6~^Y)%JhFpBeuE!bfCpCxoPG1Y$5UqXVe=*QZ_%GHI=kT9nmTsdqN4Z>56nB)D%Z zoP~tHLtTcPVqHIEnDbxfK*#1D$Iw?1;s=J`S&vg8TG+1CMmTlj=5gy=z8Tj1+2fMp z;bcZ#s7S^K^{#trb;dlX>g=Bu&uwt%gJ~>e9gk}K(*FR0lId5e@s1y}NfpYON-U_j z0dv!ydY-R163WBE)d` zAK_TKls)pH_n6H;+LB2SaVs40 zo&ow+-m&KWsU1>cuAeIw$p8b_{A(KFW1dg4#cjXMOpt@0bBf`qHrb4|GNrp@kj}Gw z&>WH%uRfH6%4c&D3_Ik79E02nRQaW|3Cr@i&w$R$j{{S}*?s^|w z_2!~vMtN;4j#?ljpU*qD58~TNw!y0r7;m0*PUjINWj43InQBA_F}OVF_@8VZyhJNT={Wr zisICt+Y~s7%I+o#3XF( zVmV?vRC5oMe0I>sI;7D~%Ev6I`$!)C)U5G^0#s0;`60S~J?YX$>eASlSqyOomU8)5 z2e9sGXP8OzNeELMN~RJAKKUNLl$&=NNfD$e=lM~l947geOp)dK{b_&|g-K8d++63P z(ll=($dS7Slm%xeJPy@iA+(5jw@>8&zc`R}1JaAM2_``VQO5ZJ_MA7Er>Cd?0IH=% zlgrr=D#A^`vFGYNK9uHUdwE1at9f~eiO6jBr^jycB3#_*@~d#M;Nd|XbL&aSr4pe@ znknIQTX8AcB-z`q=R~qeE9G*o2=DTo3}@P`-&?ea_A6$Lt4bPAF#OC9P(25=Sz9Ix zCEWJRtF$aHpOBG7$I4KSBp8ws6z?sDe3=&=J&isnl1JRE2P1cUdmnnWHH0#NBtaaI zktdk)aLRbv03B&k0`qN`Y(_}`0Cc$j09Z$_r`Oh{v8arRU96_Ij2B&nlLzKrMpz!+ z;+orM9&B8Oj|`}IYNhE7?6UOivM2WR+;~z0UUgOkNsQ$qEeD^wxZiE4}L;|Wm zLJ0nqE!?XV1)N?|+e0%)Aj?Z5obCsN4|j!B?n=bkr4e)c*6?Ns#kzq-2f?rfMOSQAJGLFqzH*I{z) z!pPz=BDpFG?f(FtgB){CB_Jv;V`d7#1P25)FhssYx0aI#fow!B9Fj=t!`ho?XdnzN zZa&nw{p8D^ke=f`DLYsg`F5nF`Rc4+9$8-Al*qM7qy6JKVvJYJW#I?4E)gTbHtZfi zY~=ciFqqoTqjyDa3wrTI)qs@>q<(A+aKX1o&7AsU(-fB;UG1b0yv`vFhB5HPyYt?j z%+`Bm5FeBVPnSD~(9|O7l478YxZE97ZRF>VN>>=Ro9xu>X;kmn`x^y@cn8v(7MTE* zqk={A-MSyT7p@PzOB=ZikneJN5h(eX=cm0jivhSFF9Vc+ygsyC2n;H$_Lj)*>PtC8 zo)4h@m0=OCE_}A&t+>RFFc|dOG1Q8MeAy9&)22gWHi%%l_dIr~e$RC>M{5Fr?;+Tr zLaBaDV)Ajm&JI%b5fGJYpF3l=UBq6!Qn1y8PhdsF6)DDFkAv{w|4;@@6*^B!Vw0Fj^u=c6{S!^#+|V-X&s>*JIIU)cm`P#Q|<2ISdcAezjVJD${h~ zHx~M@(D1PO%{d}p0eD${9r*tHPVlwl?WRMlTz_XY%u7jbvM`HqAackTj1Qo$k6PC? zPYw8*X>T-^gxwA3i4Xj=2R$h9Hl1^A<4dhB=^iFB0v;v#j(Rvg)$E=T&@8-Z@Y*Xa zUr$*zEiOz)deILuMZn4RuX|Yhxhq{^u zU$d@DILF=uV1B*p6Hd@RBxtTLHEjmrERy5NOR1tcZg4ka?vg(W%?1Il1KyjilO1R)3m*I-%^U$ z#A9KN&;GOPTwm>b@jt~w!y4AP93D%6(VN#_kbDTaE7XEfLr4MZ` zN2Sg${tgxRz3>x7_%GoP*|Wj3T2JE3{cbzmRiJfuwX=>njDVFqF>fdU!vGM&oMZB8 z=Jm|dS=b>l$Ns8$v4O@Edz#Ymp1rL6K=Gcf;_X{flJ`-*o6VNxr)eHs6Y`S8;3(`k z_N=K*ywN?LoTgBOZHfNz&r|f`znAemiIQy&2hPu}nNWF%3Ck}ab_7$QF4iV_l!sR;yH5mz+uYTLhT2JkM;k^JMpVDcySops zaZ$$NFD-CFB)(|_rthz6E;1yxQ74)$fCOxhaoi%~oSy7`Y5q)LEHYZj7zwx;7!EyY zM6t$Qt)|>$&FfV6tug*NR9X;wKSB#{RTr{js*G%9q{{UK_ zD;3b`VTGpiJk{;VqN7UJGZFdel-=ubEFe2GY_;O-WotiE7KoA zRjnHK;^pn4`O7X}BjqFC&~aDFnkM!w$8;laJjU6PHsC)&QMK0SRb`yIhAW89G4E4P zZ)C7Y$s2-D5aqt>e|PEWRWWckfn-V{!%lI4ew5NoO|X*U@$QlfVyL0UcMOsE`qSg{ z%%#^VH-7Ue)BGw~VHW8V&Ud2`xv_!{I#QO7ITLsjt91j6P{u=UvWzQAB-l4ID)brs zY9BG7jLR7+Rzgno>r*_8V%s5Hu0~aH)cVvi805rk8|5D{W5FJxnnG-R*55L2lWdQN zVVn+`0+cCJ=ET8V$@8!raoZIfw|-+Rh{8uJf_)SWQx{OTyN)?6VpIwWkVo7;{-%yr zE24Zx$j>VUQ`bbm~H(ryZ+l#Y6l(xZy*IS~{9QBGUR{wj*%WAiX^hF{&~ct2Vc zN6cB8>E%_89T0~tD>C);=}Z?OD}1F!PFa75`c-|%N1ov9JOFsjEcVZEq8X;h{t+0# z6w*Z9k9(HLMPnNtyN})U=AwI)^9x7@_82>O0-pAw<|7o}dl(FQfzp*>X{1QjIMpK< zW^PIU066;7&{~lhq(Y@sxg3#>qMMnSTqtjyvdjHGm2Iqi#wwC#G*DH#G0#y_CAPxS zE27~s7;s4^(uB~g%8*7xvPl{c0`t3|=cm@CSe+ck0RtI3xZC;Fk0n8f%NRIvSwodL z$4u0gw)Rk$7x#}E<0LsG?dy#9q}b9a$pcJ`rXraGVPVT3@TtwXEYZ#|IKffS)tiXz z5QewCSxcyGpmbb+I;_*%6fJEbLn>@^X2?-q#Cq??=UJ1=@!Y&=IUB&ou=NxRw2k&d{f$k=nEZf#ZM0Uie~56C-Ud(yt9pt?f~Y}@ll?aKP%tLXY|{;{YF zD6QFHE4WG%IBw%LcH7~mLsO$52CM16^E+?o~r!Pz6$Yitc{B2@wHTCQQGGuvAvIyJURP5c!yAxXP#xl5xg>GKs}GWdOw1HXDhha+`Mu~e83|m zcv3jdJuB)>L*agjr67jN)k=jDY$@{}#C5HGBTBTgwMk&o5;Nstk(3jkU#)%iUE%Hu zokZgue9k%JWS73r4Dh$?vtws`vtOd`KfFz`;aY-pNYnYU&zF7x-* zfaboEj#EONosLOj=JYu$eFpMq%t6T*EwqkT-mKeb^NT!41A<7*gQ@8L z$96X`?T*y-HkXz=gy?=_n8M(Xdi7~xDZ(km9Mh>eyE27_feR0_7|Y4G?$m+jnzrv4tx8fVzFXgStSmewyPk=H9T@gnSjZ_0<&+EpYP9#)0usp~ zZ<)3O_nW>Cu&i9FNm*=PEK#s-b}0hkaCyNP%}|$A^C$Aq5zhl2mCw)PJwHzY?BYNZu5uy|g_F_g#I>aLp2xi-?DR zt#aDe#CuI9&lhtA=Xv zw&S3{?tLrdbB;C2a;iCwkyGPUx;2b)tvpKRQohd_lonlp4^JYj>i7xZ#Mc}(q}Fhax>i5 zP%o^dFZrqQX zu6r7m%S7_Zg@K%I&hj!C`c?Z~GEIi#F^Gfw=N(UR?O&W@Gi-J`tEpb2ZTX$_=%}kj zSf^)b9zQS5MOPb9w)8%gqi>~Nh>TFg9#9BSSD@`z?Q~eXq+uy;YNHs1rjqen?~ThYcr1BS=~rSxs06B@ zMtH~_dzx%e#k+9cjHh<@JTUYEtg^C=&byA^x<)vznA1rIFo3nPyT+-ZN2jGHma(0&mB$2*qv=Q)x#Owij+m;og5vBeAxWbx7{?=yw4q*2yY2Td zKf74YF;Gn?54g#Y2+C)YJ*qh_k%ybHlpYgna-?^uc0qGNuV8r@V_myY5`^*xO0M^@ zox&hOj#S8UbKHF@pWCHK{#gUE_1ZaVtu^6!LNHO0xmccY--_p{S};RRmanelds2$T zhHtzFIINrL);Q&jWiq4ly&IK1xula&l2s-^7%Tj~OMUU`Dxsc6yUU`yYBI$J0{VhI zee27_VmaQ05u>xYj7Fmv`PhB$tp;!vrfJa;y*lJmmAvVE$rVg!LprI)9RmGnud+sA z_C^9MJEIVCPqlEi*b$K|hB>5gs!z-pAitpmbg6@Y1PIC<0c9>ap4`-P!eduUoGO#J zgPeeWmlUgP@=USDO9cZ5s9{jVIU3?iSj#|$R*}5c2Oms&QUzNv7`Bb@vI6TnZ_av= zo`S4N9kg*OHQKRbv?>A!_oNsAkr`$mD>ia5*wO+h;zfx3$6<0>Hs>QgzMj=B%q~H- zRoFIzlmHQt*EB4J$C86+Q?Q+*=FhLSJSwxaOAALLE*QIgJ)la(`u5eF{WaaxhzX$Fdmg7TNEueQFF;E zKT+vPO(F7`rZu=?Z7m%T5_s<24rzYHG8n@~Tg)fsJ&kCr5ozj|kfCV7=YJuObMH%c z6Wc{6+3mM8pWUwP;2upL(@^C_IIY9)g;2IR^73%a-|1J4xw>M=n^Z5&v3M95=8_v| zB9UU*BNbp>_hXOl{XwacY0}%siPy}1!yx*e0TnJyv7}axDHc3=vA%h4m*(5;?@~hs z`5rj=3l{L%`<&wji4-6#9AXvAKHMDlbEh&sB z`Ho5Y{xta#D5hyGr3NMBDH$JHkNZX|c8zXYIF>QGH6R1K-`1dx;S7dUVCG|ku;3nj zI|>5jsH~(|T3hDl~@CeN52I34M;Os3vO z54Gb>?avsXFJf_W$tqkaFt~5s{JH$L55}^WmQ}a z$JgmgJ-`z*ah6tP8>AfwpgD`zesU_Pwo=Z&bsO({=e1Ib_E{nf%F$#Hh~p)&a7gy3 z4E}UY_DeZ7bc8eKcd0(q`;$6FggYcbkt6>A4-^INAbD-fjRG>sv<;FBhV~=1D<$WX z@+l@RU0pc`+MG=Bz`{54&d^TP`JX>t)Wd3~b((dNB~=-65 z7^`5R6!o~DI1(-a`B<+bAJ(4?3o~Vz6;TJ67;;zJ)9X<+wD7B$Y$o!8<}#pXudNz@ z>Ew}A0|>&fau{_Or>gmTo=t#AcdCPcPob!mB`PG?>65rCHzU~9nC+$#iF|_W;{jB0 z^#YUJ2xdEY3gTRD-cDB)T^y8Iqi;3>%nXP!0q<6t+DQ<37dUOiFwZaT>?x2%`=a5} zF&QVzaf~*3 zHD(AU<(WLi86k1^Ni`BhH1ZWPBPx&GZR4j>X8zmeLj?2 zc4&$#V;cp9Nw$rCUodXj^*_W-RCT%&W6ei}xBv}-*z!p9^sO-wLb5khkh73+jy~=w zB(;$xj#+I$S8S<}anqWcg@_^zyaoVmIbu&LD$2+Lg3h~kSgcBOlPYCCwyX)YHkpf}8U`g_!}@WIv`HyGW}`&C%yRYDBg z$!x>{phVFxlvup!88+yhsx;hAGHn9Bk%yHDQ7Z*x&4qstmP!peqEo;jl% zkJr#uT%?%vm<{mDbh0vlcE&j%`evsJVs>efu&cSqTw!WUXjW-eq(BURDJzVO(H(@5 zL`RV;Zexdjg>%}MGEB6Y1=X~R8@JDwL6N(HI~uEZWhBiEaNS6$=58^l##P{WFaZ9J(2_}uBs{{VG|rYiK(!If!I zq($Viwg*170~JJI@0HI{)B{{{sW+v?%7~4WChIUp!_3E1o^kxC3`8~ri{-Z)w*0yE z9)hh)e0PE;8 zRm_OMMnr%U`=(FfJ1;_(C7axsA%q&5f;6rf=5~OY0Cp(96 z_4lXG0SsZ>e&{Ly#w$WN^zX8?GC;tQ@*VuuIi&kG)VmDs6JV5#413g$#Tg@&OItw@ zL@IpGm#6;#uA!O_+b_?R;dxqgF~)>K0-_9(@6OZTCY9!2IBbcPSwPz49&u60FnK=CK-?Du z4s-8DqtKlhK2oE3Cp>hfOL7(7>O};o+njSy8-#MHEN!_?;1uH~qG=>RCy{XK$9Q4J zC{ba|T#9(+g+eCe1mg#h>P;w?6x{6@YyrCmx3AKwG_KKwV9GaVyb;r8SKS+`e2#v$`VGPxiDjF0xcsqZXU z4FM-31sSpys!Gzd&l^t`1VHR7f`1NwlgTPsy0Zho6(EvEAg~}~ zCPnrB?M7MFC%1*yacpixf<8s<2FK4Jd3r86^0 z99GexjNx)W^eokDo0#N)IB=-{04YLn#N(w$_Oy!tw?@fT?N5=hbEM58w|SJ8LL8$ z_19p%4ran5nj`-**{M*UxPn%kbQokq)pl(zd zX7>iNeA%tpD20WZ_zV#{) ztWl*0clyk9IPN_voO1~nFPXHCTyEpodm4P2gksO_IAj5~k&Kq-(wv~)z@(9OH;Gd& z$7wm?X&K{$k2XY6E8$5PtmcwvWHQ_rz+4$Y!jtKa#+x1N#TH+(F<|5sY!FAU_BA=xp_)P_l~V(D*KC}0&2!K!w(MFf@&G4nMRIU^6Yc9( zpp^@WWls4fEj6yG)uTI>a^4c_A-nH z1Cve{3m}NH6b?uv9$1f0N~gIMKG-f1PD+J6MmtlYLa>B{F$krKCsUrk<4=?>$y#J+ zvAy?}AR*+1^)(vr%bX9FfWD%ix6F0GD9AdV3n3$geo3i(i6NCzR#nIZqYh85De<|T_P*gRKh>UF@cgS8 zPobiSrU;>oI~)>ls1Hx6t2<(k5xRy}!1@00JK7LAFOhYq#V?kjgM`MyeREntA|}}f_M%H0d1Q^OLmYMXz^E^EJwY)Q#J~p_ z5$(YP(AItSqXYSqt?Xh#@ z%ka&Pa647IYiO_|SHR_!$vHIp*yNoAFvsU0`H&*?2l%u2Q*@UpDx>BwZeVqI)5*up zf=TIBo+2dL0M2=>Ys+se6Et|;{29S-YNaeGltoPEIUn7w3Y6^5xK8MxRP-G4Oga0$ zhm2J0Mw;+OZ$;V1DfO4nX z29Q`!yYpw;nivdiPyy;l=}rl`!i6OI3TlqzXP-&{GC3!q6r($SL;27-0r>zPzOXgza~xoE(9)6uWqTfds?)f~50!yjVET;GeCIm> z+&MTD>0>YugofNQ9eOZ6l$(m2A;CNxR@Ow^nhSudy+dRU6cK}3T0Qj3DyQ#0>B_O= zlUUoj^Mi`FVR*x8`8fHoU$C!30f_cB)4h!9N17*KvmucMwajvs12Obv80S92)}LtM zS(4i5M2x>aGD|n6eGO*X>Pa$#Zb2$P(iNAM9l5KUp)m0H5saPZ?-S`?q+#(etrX&U z6Q<(Hpt+1gv77g6AtV!m4{=Ubm8N&t7_tRW7w(VosH2R?zh#gGm~dGC0Lw6XXVlX9 zYPRh0&Ka$b-3)UlV~<+wQZcbAL|8Z3<<92GX3xv?sa|M4&g$~1X&VwMpOqAP`Ihqro}P)G~LsuQG<_g}}ktBjfziKn^{#F9#w5;hYjnm}#j zj%1cs2OKKOa*h2eyqg);=gD%=Fxb*J%6&ohrwI}%UUCLce_EwB7Az#nl78iUu(6ED z%t-qEY4J=pY??9{uIwS>uS%_Ome))eLHoBMvR{R6^en9*%uWirV3z5T>FH0}KCC%Q zM&U>eDwxY0Y|laOLrEGt$c#jaxCbYZo|R5Ji6eqbaM>lY(zwr-Gt=u&TZtM`00C4T zz?J;YX}Y51EUdpME~QN5t1EOK{?!>FLd7#~WPAdRj(z>Ax7t~zX|4WjF4Dc&4y04O z@PJ7QuGwE`R~gzzQfYfYIL81Ss0>m=$Mg1*0 zZQI@1ZegihwW5)caHDY}&@ZhPw-dED>&pJw|yZqz+X6?~(^Oq?#%0t{%qad5iFWbw&VkNBQQn{KY>j2F7xtoLHVn2R%XRYL!Nb&09L^jOc19dImcuAQj)8m-C>kxIl(nbt4`s_jjbv_}}8YWI+-{k)wd^G^De7V0QXfO{V_Sy7Vn17c-DTkDECJbjYt3T|#jo zksUHV<`=z72CsCRi{op+&lO7=8C5^aa4viPyAqy`z~^R7Z1k~miWnZ)x>njyj9Fxz6h!vz&5FO@Njb zX2Qphl~?+j=Cxmg8tsLslF-4XF)^EHasp%iuQ5YT`8b*%{GyT#loYlS`cz0b2_RRr#n+Rh8cwgRUL8QeaeUV+I7`By10YT>j z`qwdkq%0S5#KK2Nq6R`nFyGKumpnaMZp|KrI`rx*rdLTBrAZm_<@5545@}ZQ;%8?s zi5rDd#|!vVAweK%f%~JO{wjbfO(x>|2JTKe)LO>7mfG$~B2vMCR?8?j&$+1=Qwb|GM|)Vttn&xmC0V@bB|i2>@HMFt|VC(%^^fM3de@$pT?q{n&I>F0ICLk zhpjNmLj2z_=m_+rA2$q7UWba8D~%+C045a&Z^3CdssdEwlfX4AnD>Aju`Acoqh$(0 zf(Y(A)VJ7TrNBoFyb!z+JNi&&W0gFdaYF?tv4>oN^Pc3=3^sD(frG^y%m;bkV|wK} z9lU-9rH1en1sIl7!9U3Q)DlIzG8H&XZeiHcfB_1_k+J*l`-F`Rn?Po05o6lNc~1!XxX$2`@Rw3;wo9ySVt z<<3t308jqCW<;_D+-4`9LY`^tZ!O$hDLz|p2u0&Sr#P&7#&ZwHEy9vh0M`0R_cMVkxTZFBx!bxj#fMaMdB7>IAI`1R#p;c0R8dX z{{YoQetQov+wN6!mfL|ulLIH5M+kmY1EKFvcq0wvte$HX45eJ*N%p3d$9oJ7ADhhcjt|q?p^!4El;oiscwA(cRF+#U9$XGDIF^mE4P72AyfVO&%>L?2i4}wVfu%Mju zBBcH6NX{HPHZdX&KA(j~#DWueO~3$8bLs3Ujzc*~2bU283lZggPrXZ55=E$PZW=a? z0rJ><>$A}Hr}?Bt(n$XRF&W6?BigC6DJ5P~pzwqqpI=&)8L*1%2VgPxy~m{|04)8a z!{(cG!z?)p{DM8b>S*r~{JA!A4nYU*@zd*B>f%P&T&NsKan3!d!s-df+HIpN5;w{u zZ@g+6wt_X|)QgiIS8)KepTtL@t5NC_&2YCY8{}V=<59F8pEY7E+X?e!Op%|LjQdrH z=9wUl*h-PEN!yNFKBl3etqsd-sjZz6CskB$Fvtc*Pw<+v1>%Vej||2~Ck~B(Ptvg# z=gr85SoV2)Ws&~?hmOP7JPLQ(LS4cd^-NKqAs0L`7~PtNlNzzoE~^x9tVO1mbDhB- zZWNDN(6PLhOMqjy+YBljbdvKYZKRHs$3d<{WlLw3wt{fL51ZDnL3@eBM!$1$pW3T6#{q<=z-e!?>pZ04C2_0hysr*3)R?qqW011>YxF=)2)3wBa3x$Q_U^gje-GiQ^ z-1et1bV zKFyZ#O(ZVkYhxsT`pK=U9eO(}V{3M-w@e6GB^+bZ70T(jy$U@B$5BZoN$su!MAB}mvzPR@UGdM?$S9+WVWc2`b{&l^jYg$|dC9=4Z zP-5MQ2LaD<{&QGPDq1i-Bg5V*5@g&)_cBO-co1MjPeG4i+O{qA=-`?w_PR1f6A`@! z%e&Cmndw^O`hBBL+M2BH02=Ci2(}^^jSHHN$SLM)z0CmX`ZE|c!`p4 zE*~j`skdW~yn6NQ1!~)PrNy*R+TKMb9G%F&C?~E@UcKwd;_(f_k2h~Ag(?mY;p%Hz z%f_}=S8_pjBQM%j2LNr09FlzjsFghl^gUur`Q(lWuB0gJ!D_9NRBqo(+>>gsn(<`Iu9G)o%bjP)lK zgp)yZ&sMS4+U25(+90qPz?M*Yw{S&mL8uEz8abjOS2=l4aoA(Ed2Wm28(Rh6eQzsA zoLj0k1HOGLZp*}b-YIUcOZk%&M`ptA$KCt|VB)W-D?`z=&1AtY^|=JdrDT=6`eV|z zEc{Cx#t7krg1Iw32GQt#ro8t?*Pxd1t!I}aH5pPcdH!{&rt3MDPcG~T?UXZb{{WVx zlfd)?gILNsl%#j|y4}pFh~;3p;NuuQ$gRse{hT`NEy*P@kVjhc>uo|S%VdRTe|a{Q7N4+{hvaD9Dh)vmR0Rb`gk zoViyhF|_;oR|}_WFDI1Y$&aVZIW?Q)}_tLbqsL zk&fJj=RNaT%7c@-9qf4a#hDvwG3&}7=T3?@Qb)E$bvaqsI+ zOERznbt9_;1WC}A_OG|HIELCy3pCThUHql}`Zq#*k7~DbbsgLR0x~Wzsh*s4ALCh? zfiV`6Mqp#ZHirM|Pv$8uy6VMJvg1Y_6MoFB|= zHMCQF+`aSY2d!9+#@13Hw~^$NW=I`If5MXLBW}KYGMQQMtl@becKTG&K^az!q-A4( zUpV}+NCaDEF?l9s*aq#2q!4?OY0;#3S9x1uIP)`wKE|IsaXDp%DKel1X%F5V#ZE#d z(&TLo`@P?EoKPk*DC28?G)5K`Bq_!SKD8aHp+t(@Z`jA?-RtX4yq0^J3P&VlAOr*28v#eo2VY`o>t=SFHkcO2Byd2e%+GEg z%9|UH%O39jrjTC6=KY!CaQF;CZr|ZWggQi$)>U7$DiV6ONMTcpnPx7*R0bIPqaT$) zE+i68M)-gSfr34$EnS)%$k^OTW>NWIQso0h}4=cx3>D-FlE9{!aA9!ehF0c`g1`KQUYePg6k4DGbsfl~-~vG6ms)9mPR-^Rz51{`qX7 zW62)$=tjg=o={y_{KSwHdi$Dlifc+zi`u;6qA?WvFNBiW3G$m!J31Qt&vv<{By9#5ItCFO^1YS3Xal|{kq z5Pr2%?QWy_VvGVl{{S7RwV5YUMe;=9bF`ju-;VU}pslE~xrP%Ugi10%QNYik^c1l) z&=R*7CPkAQ)UQ_d^c5`Dvb0`&H%O>C%P$1~0EH07s{>1Yi~*9v*VK9ncT85)hH08+ zVYe@ijCzk@P)l<*zS1b9Ax(XTzgl|zqNn-6QkjO$7@OTiyaYSy@xE3<7?+`3kDpIui@`sM8$RH zV-p?4bH`j&i+w^v2_e|YzX4o~KllSuHam2a4JWH15vG zVs7<6JQ7z(*)7TPoE?ltN;j^1R9n?!5nJ02GdXD(9wfB_A#&PyyiW>S`tZ+Z7TMfEjqs5A>~fGGn~Jv9y8yP&iV08j?uunb9JR zimIt7Upt$*KGhIpW(Cj`-IrfqT6PSsK>2cT8IQF9AeuH}uOJ(nCnxmwqic)-8jbvt zPD&q2c$G^d#~P3h(uV|--kK5B*-8b+Id0!t1kjff#?f!`iB;e_9Bw`6INyz@8%BBM zfBN*{^G3=rNab_WG}kglLqMl#Y{=|0pK1m|#6;tK1AwNBJE@xHR$abRMuex+u0IO)@*1uf=*IdpI@b1Wp8Mh5 zW%P|g-7kWKW;-GbK_eagg?%^hU&o>=XwBZc_`} zM(Sv$jUocpGJn^4;MLh@)-0or^um$K&-;bj!h!z))~^ouZSfl3<{M%5*vJkXI`shc zQR|BJ{SUG<@0LVwL)?Fp%WKe! zcv9jCHzMUkY(8cBn)}=K+WnL*{9kV;jC?Z)w!A_f()wUoNF12(IU$E0#|O213F5gM zMAq;8Kd-|*zm?3&@tit(q5KXS! z_dn9AvLo#BA(>0%N~>k~@ARqmBJbS@SfD;)n zQI|Wv{bbdc4Z)G1ofO)-g?;EZAIGq$nJ2oAPa=38R!l_#DczrXnmOa&B0zveEK0j2 z=VK11KZPdQNhD7VvqdZ0-9XET!!Q66dEs-~lGNME$vA;L~Q3PccWC3dBh{5%Q#c zC=t3uN0wB~yCe>BKBLn$9os#s7_FgWkO%J?^-06Er7vz1b3(oxdM}?+h!@5 zHpegkv-*STIHoM{7Z&R?Jmi0?jPZ`(k6L`L!n){9BfL?9(zE5sJn}w=u%trbM~)W- z7Yu%1yiZY@g!zDo#BNJ-wK)ns>T6KE!5G=Y>5K2p7MJ^kr5VXa3NjaVI+86+b~ zgZ0ShDU&t_n8OLT48-(3@_i{58Dxkkhlv=7*e*%Osr0F#L{%tb4bBb@S2^SwS`Nb_ z6APa@22U)YG6Fb0>*-4cw4t~Cu}V&H8QOO*s6O76K9OVghqw_)?7m_7*nFxF@UPOQ zlGS!ALm4kDg(QzXG1KW%8{>XXSdU_A zX)UB7;SiGXl3hT@9V*4WtZ|jQy7JNj+fyB%(2A?r3Q}1@vnsF(g@l1absy~-SBmS& zDQjdEOEE$K!1|v`yA81s%z`9lU_9dx%MqRzpU_idi6pp1TM5>3*jT$mkMDb*%AYmI zV!973plA%k2P(J#1K;aZpEkt$y00}-Ej}U7x>lfF1<1z(78N#X&oHwm{jCvWHKO?unIzB$u% z%ed{YdiOt%*5*xC!^AV{vpjdiR1!GsQA#lgTOqlV3mqR2ciG-23;hWc`yob);&#+GzU8 zOk6mQHh!o`=zZ%8_HflSy;DfkJQ3n=4=weqiN4&(y-%Hm>iEs^~ZV|E0NIyZ6 zDlZUtHC}x_`cNcE)px2lE5>pw)4mXX(AOUfv?;CpN#W?V0W27D$L5Xkg6d9t8uKe% zPS;hqdx#?02$;zXMY)I*kf093psswm;wny5rme}ddh;C(w2du8MsE*k<5JXPkuAK{ z25A)IpL*p#;G$m;J{A7Y{{XShx8lziUc%RU{h+baElXxergbbffI;Y_=Oc>kej#|@ z#GWAV{jY@}vPrF@A0m_(1dfE)M`~`f69OgK@22~1ic5`-qhi(#-UFtrEluEPe7A%)m%%C$%I%frg9zn-yBD#2F zdC>V%vTb=oaLPIlYMMy=@W^tq;}5&9u%tGqVq~{twSh-w9Z$EQuft^1XJy#~IzWP0 zp^_x%7D1EGe|~C7)=*eT6f&Sujxs%QQpq#E)Dv$Cp=3r(?8i(RNG&7Y*Y`7GAh=`H zk8mnpqa%XH?F=T8cLXjRDL5nP-|0cNg;<+;OpKp1klcG#g_(vs@3K6>A_}FZbMnT= zkU{l6l@-kGEX>R0LS^G5WD)8y^r+MIRo>ke$bPnMxsUMqc+8)^TZe4VZ)$D=oCxALZQh48$r;r|8?p;>6?q5W=|?E8TU3b>F)ZkY zcEZR>%Hy6#OnOugc9#LAHy&Vi<&SK7dQ)dI#=dMzy>s`moxE~s^MdkhhD30&s{*Pp zNf|s*$}5%H=XA>;n*!YKC`Nkm_|$%Mh0JrKDmdDh?s@B0Ewr1vh>9)DcF!}NjLV#J z$sgyf5?Ux@Z8qeRCkJkMKG>?V3o;fPBN0g;8%E~}a0Nakk=PL%1!3|4Gq{RP!C8W; z{O4<{jFPkjh9HwgAy(dZf=T1pcA~&TDGsY}?JDh)ET7%Sttn}uXYwsfa_j~$>Inzm z-k!2EO0KLNs37bg=QOuB7Z=b+1-;5U#xa!xgYIeAL^ifCm-}7g72Xc<9#rSh`c&av z*rJ8`_+gGmp%oMAHt!FWJg9$D%D zrj&%`5@R4`49a?t(e`BY`uo&G#SkU{NMVwUPs{9Tx7$*A2nmuG<=TJFX$;Qf&ViJl zkg4sDTBQSP%XDUw~vl8A6i516nVbLmRjaFGOT2qCl9rxu6H zXzn9$KqL|A>^sxC1$I|irEt+I>>YNna3%#wu5YT&5%e%W;mMpS4<&DAY7JY!}J_ z#yavkA6iBV8e5B~!h;AgY~V5MX%%Y~L}aLlks5+FkU6O(id4EWvj!>#7qZi)ibO?> zoxW;(j7CrC=}5B1#i6&0Zd7D9JpFy>0qm}0Uza!p5_=CyHm3q8&p8a6`CJaPo8c&P za1?@at`E$5W7t$h!xdpR0O+HyAJTz0V$8P;(0LZD5s1TJXYoFjC)*<%S^|NF1F>9g zBh%8e0Y@DNdTZSX(r0!Etbq}T z`-C2~NJ%!`>w+7H9n^Z#3nvj6<(#&D=I;Lh<4=(bnU@Xuo};C}j zs!>EX$NBMv^CKq&a2dN(jH%=gko@Na1IN~_#o?`LXNFsgF(NoSV~G64eNVM(=syfK zJy%*5mj+Oq0aS^4H*E31t?A)06{e#IyRkXNE4Fi@Cn4b(Ew_N(eYvEL&Us2AZAV<} zjQ;?8-o17&*~d~kbeGnaCFN!UK*atWS4;5k_D;Rjbp>5o#b0-M4@2vo)#}mVyw0sv z2OALU!rC7`zK^Uzq%E7XIl_cf^LqXjv!r}D*R@+`k!+`sFWzKa@<(InJuB-$`zu%_ z-;~yhB!~|xMC87E3iJ;Ke$EzJPMsu7iyD*!Mpqg2&3!%(fbkV&c{gL8rYXg3W8$4R z;AX#mBDZZ4;od>Fa9l9YOxLG)SN28J;)2~K(A980dxbllPpLKakA{8|cwW)MPiR42 zK4u><^{%5+@UDfW*u$de$YPKnXP0(E1J^b6SPu{I)YmmdbDmhqH*23X{5$=VA-1}b zS4n)OY#pn|HRyUj?BSzXc|UHp5Zjr+W>35it}E8`c`fw&P1d&NPn!jktNs+TIJ=z6 z%dw*a&0J?5_4c?P5}}8JP=Uu&6&JaQq5L24rjUZ=VN#3B5y2jq{-UhudKQbP%X2hZ zJbR~b&FDUrqEcIw@>1o9E`DC^^r@3ZmEj4K7#ZIg9D(a!O^3*$=e3c|EL>D{Gw&sX zKV-DiiV&GkEO1YJ)oVB|T*)+%n2Qc}^<(Ti3h3?DP=S%yEUoDJY2710^3M)vQL=s6ssKmCa*L-?m8bz zb>)q;6M5EgZF2Z@1LhbVO+L#|NTh9vlwMR5&U@86o6DH)S=^QcWl1+BN3A4@4e3;xG8b@QLtv@*$6A0{n|PS* zAxmY6=+)mG1vsrp_M`4^CUC%`H-Ajj7V|h&f>p_8D%d>%sbVX+l0@CR?v_0&yxFzA z@?Jo9M0YqHKMLqnX~9__=96WFw~ix%c-?{OKD93UNY&C;+;hfHLs>UB&u;5aV)1f!APqh%_FyvP}oFbjx#@wyj%<67$ppF8h`Em2h z9=_F|d*WCikfP7JKmc8bmG(8}+W!FU6XDxbZ8~`(Du-}z-A|#fCHSNJTU%PrlIhdO z08@fjtG8iZHa|SeFf^S?vr65~>EY)lkD>LyAL$x%JXberj?0mg(!BG=KeTn0hq@zi z8@H57v~qFj&3u>RU)p!YTCli|!_0Eo*>KW*%=H+@HRt+=jC@I`$XZQmQd^mLA36NE z>0g&;zA9j-P1C~1nfK^=R4_7YnV&-ZRsF3Qt(L+orgkGC06#kCrxoMgBlz{=&2609 zNYO??$sNDh>0EBhi>X81GqD39o2jdI)(GQhI2}s0ep#Av#&wugZBLbUN1+TX7eYI$ ztIcN(s7}lox0rM7R&@OximO|pUGKGnEzG8T+HK zt8hX-{{WQUVHh$N$UfBTXe5eBmRCX~+98cc&QE-vz<-5XSd~dD9@RW-&tF>EQ$xFC zal|7TFP*%VZuI44gzS(qm&p0~!R$S%LjaR)uyt5s*05(1FP zwTKL)0>{>*Fx=Z)2v*#ca(t1I&Uxm%xz&`OrKC2_WR;Xo%CPd;kAej>D3s!LLRez~ zvAAcwNUUBJRb?ZR(gf;%z*A$05T|bS^zBkd6cMs>K-W%BZQ1&xQ5>z1${CS(W>ClRqpz{>XX>M{;3e4HgI_LapMYV(| zSeXw4Dw1?#{(4g9vKo!Z1X0Ya#IP^&tZUVaj<{UdWJ}yq9!O$m;v(`@&Nvn z62=yiKqe}rjv_)iKaYBpv_Eh2+xLwaUCSTJ2OTOXL=Sly6qL$W_evW9KiWRD;O`v5 zFC?6=@8rNLquaSO+8}K5q%qPAJ7#b9wEiy$aGUQ2-jCKD25k-JjmRUIw6j9P4$@*v3lueS&wV8&4*l^+vAB)dV={plGKJ%4>~r;?WY%*s z-ZLvVm_mZUU@H62{#>_yToUC6GMsP^r_|Ff?cA4Cy4sHtg<`qGdhyf`N^}A!16#vz zT0*qGkl`+z;J9;Y#fQK>|m-#S5Gqw&vqB>4dEsc?#-Gq?xyHqv=w#Q7B1* zNb!T$aoSI)^`}h~DgwhfWhz!g$19%x^&nJ=Sfs>DZSt2a&7S_$_wwZ-gj+;@r;O7g z@+FyLh?6W$lNdd^Rg#QXA%G-uS$j|fafMZHK3wh`0iGM*&{dST5u&}rq8-@dwL}s| zR(QxwtMeRWk>4J)kUTL=sVss_;2_TnpI=iz(6V`vJG_om9y)au8b*^wVQ7MvW4k?Z z?TT2?v`D7w_o8O`nA15p<+1XvIUdxWP)1SZ z?J9ThwD?e%7>LMFyUUN^T5BsU$ci>65s4YSbN+f#D#SBJi5o;5=r)eBVDb5 z@-WFm>s4=b*rkVSvD~goZDPER=CqRB+!eQ1`K97H0sEQtH5=NzKe;H=FGXR=_sKn| zy@krzP%8*``Av`r7$c9uoUw1j%y7VAFfoJltI=4uo{R?M2j(f)=~Bg}NYA~YIbuFR z*i<>BHBFhRX4f|XR#F@x#t8s>(y}Zus>yNlL^8w-75bj_p)G=;k{2YLVRoKd+L|FK z9LBBzj0qg3;G@)ve$fZBW^zXrtDTmc+49Sdxv6a+WtAoonD(5qlbltk?Vrt&4C?B! zh7POO>HZZUOK4FU0Xvj|wC>!0!iOXZ3@zY}INCVlW{t_-3FimCdsNG9nSXW~LaGY| z9RTi4O>G3h0dO*-|&yc&-f(ByGk@Wh|vLt}Kg9C5f$5Z_()aDK- zi7kX=-KxG$0Xw)KN|_;uv5d%}zvr3iMJ%^5$#P!ZlVMc|pl}a-bPFOl`8>McPi%xXymH7nN|Jgt=B````U< zO0gBIDxs1*ZEux`>-DYTNI?>iWL0IrI3(kmvl2)L+2fCQ8NeK|{{RXjw#Z%V8z;AO zQx}ZJS~!aYVa^8ZkLgxbiqgS5$g)~4^N<~T8jeJjORJ~~j0&(E`-56C1$cm12^)se zy$*ZTc8yCLXs3;&SqIDxcI0OUlS;v2n!?K|l%J4~mpzR%+U}1kyZJaHwO^jyW1X<* zO2!Ku-~-&%TZcgt1%ICzM;~_;%_yL?h*YY#lNyB#F}RMN{?uEGX;>^SSR|aX_xk%( zSCa1;jz!9_WMv;K3}KOn@+0!5&3^4Dv4UW+lb4i7)PIFy(IvN*G-;!lV{&|r?@&Ca za<7)TR@^}9F;wK9?ge737(%;@y`MkB>}okK;)TKnDp5lfW6wQ}Wa7unjWoaB;&^6= zEawI%T%Yd6H5K$7tpmxDy@#KGf-!;@{2km(CH!9mp8u z_7x5y<}VwCEb*+RA7@f?f_hYO%5N^btAn(t3Z(Qc{VD{Xcvh7d4Zk=0KF8jYMx6w2 zAP3B16amgYwG9sCndKrfe-*rGd8bffaaIjo2 zmyfzmI-l=iqLq-uRpwFyl7HI&00C5!70XP)h6rrqB?l!(tv(r1re(NtiyHjcAE(x; z8`I=H!Mutqc+l*XkmuYCedFmvTohm=LaKllKshV^HC(NV=(we(je^IKkCg{pR8vZj zI~0E`kTITfim&$BE{sx60D-x;l?DhkOHjJGx12(E8680nDEUwLRl*KTInp!?@DgHs zkc9H2oB-d_pc5k|_Gsi%2+Ao87<&6v6x3svbaCBBBCifM;|J289l@FtELU+W1;fT; z`H@HUt-YO$-A8ib-6en$JMU1v_{M&;$u$*;LatRhsbiIIrBa@0qPHc9Xw;Tgan+A( z)d!yLD~OWf;vpIT09b?gNvc%WQXNKZuB3#O-^d%3gZ_D`rMhTenUoE{zTwd0*R^FN zjN{6RFENp@2*Aic;Zr=|I^7msv5m4Lau@;0r0JklBrKOf$uL|-qCxx2Hby-$?@o?; zjlvNI;_7lh7>s)RRc3|cZ$4{4cd1C{TmiS~>rw|-3jvZfNidJQx%Bp`O2l5}mQ{E} z(S~sw5OJZfxPmRR z8C7=@O7w4YL^mefi7k`N0DlqAYLaDKl32X!c6QvS*F6ZOisZ_UBbijN%D7ywzCG(U zJIPWfhDc;-70V_VcR3jKBA*IRJPeM?FvPG21%W)We^F1AS1!pUxslR+!)QAK;E!H= z)N@K>EXEg8v=rV(+|tQyJ4l$qsb83Sk6MalStD~Ksk;~|z@NgJNJD(-AW0@=FECx% zjc^G1ds0cL+nG~PafC5!NSEaVkK)I#y)ojNJGdTF-dv0oLmUrm`&4d{xtUfqGOt#~ zQ$EAeuay(bT(&z4T*%-?!*r?BDt!e&Zm(y!DQrwpMEmC$&Ligo+LBG>9h`3|9%PY6 zLFffI+`J*e#zyoBv9Xi&_M?0`GgV-op{LpT}F zrac8#Kv=Hmlpz=nMgwE|P;Q`bL&iYC3aUWMpHb<>PcETy!d<%l`P**QAZ{PU=tVIk zF>WjyC3kP=GwoIU$5)IqD+M4(&Bi$5qcge4isO4L43fVq1Kn!XGI@*fT*Q7r!w5GO z9f_;Ud@b!?H*rR;INZFs^d5q+lI|$3R@-@ETW|<5pT?}ma#;k&AZLYPoF17JoiOJ% zUiCvOP6BiaG53$PA8UfqS|?n2fT2^#^{ktF$)Z4h&?IfdGkR30;iXv8>>%Kyy6{`L zG?W@2IyG8nDyq@%LNJ8@`47ESn(3J{a7YqmbZ8848sc<@hJme}zJ`D!huy z7*-Sfy8@4xV1E}sQS`0SNXGXF;8Pw^)S{oC0Oh~>)hbE8bXRb)7s4iaUwUdd znn>NJjdwOY&dkG%ang}Xq7;W=lQ<;uNdA>+ArlzX#OKXG5cMNCKK}H_F(ijCNC`v6sItg~Rf*hK;8T&= zytRG_&&YYoj)eVcNK8IsJ5H>nI9BIz^s83(X?1NQ+|Gzt5wLY-6+&fl(#Y%fl3`Lt z*<@Y_>BcEwjiOhI-{!!}Hgk@8^U|k{9hy0(iMbn5OAO$2H1D#ihS@MxEtV`Yed(mx zI>1IAa(@q095f?<_2_Mz0onBm;1t!)*0k> ziS5{7{zd~i9`$O;iJ<}l9@S((rbU5rv4IHS2{X9YJl*M>JLcsavk-=BK0 zwrbIbfPl`&a=vq#vlL2Yj7b?)LPM|^&lH_RwkcC=s%&8lv&f4i@d9Bh_g6lnp*W>` zW)6`|Rc9v+7+ew$LMqXN_Y#d2fsrEGVw^Z7T^Cmzjd2z=lH6GQK?2575fDYrA zX4`^z1GY_DSU`xpfJwOR+ni^P-ju0o(0=)1ecyX&JT+Q`M(VP_1CTd5k-#;arrE4% z+j1D~!oXwR7)INbSaM1CsicbP-8`9833q&@QyX~WG=^Lf@{sBLOsjxLwF2>NqbV$l zw;Q(}-hi5oS$2vo!5mL`WpK!diiFh-8Iu31MIHtZzw#~>a- z1NAk}Yu+TYmfB~#xDm@NVM6pL9Ag!Uf8!2kOP3pC8H)>o#GhKiz18IgSkcQ!!+df$ z2WbB9zAMzDg;94r+Sr@yYU(=Yme^(rR0Ti)0P(;+rm*!LLRl`!S%~t`ZpS%3m0o+3 zadRcqqjOuRZGhkd(>~^_s(C$bmBS7H05Bkcdm8VBD5HXPWg%o~CPw>0GY4Os9;Tac z2H!Gh-Q$o5<7IppoOdU=q+xPkd99Ap4hfNRaombssIwHbiNI71vCctmVyC?5s$vc#DkSXP3Xqw{IIS65cy|PL4`ct3FBs8zV zTqy?(IO$H;0JD2r`250TAvjRHG40Jqb8g`nO#Vuh;IF5z9ZgLqksGbc-2I(E#3nu% zK+qzy1BGAR$&O##=cX!zk?$dlxx;SSI2obKsXE(4o+&U(d{L|5JPF2Di@eD6hh)tV5w7Jq{(kkzB=ST| zq9FJf`c~$ftOAzN%K>0UWmFvd4EC?D$g!~I_H$=%M&_7yjqluezJBiNW4s!nZsazDxBdWRpRyjsp`b9e*kmI=FS?j03l&6RycjMCEuPRD8?FC+SRCA#JE;+_=iQ;8iBjZY#v`#XN@A zMe^g_As;W63G41nDowp(n83rnLvVfR%HCuA%(A--824bX9=_Dagn*_XNEt4DJ*ton z46=raq&X*^IQ(f*%%Cz4F-SW=7$lCT=}e8?C0(l9*Ps9#{b?0f%NSzFK>>$=1j40RvR_Cbh53M1Li*mb&h&KS|Kb;uNZpJm8;5r#}j9tp_y z^ffvLy#})R8$lm445DWT>q!@o>fQ&nUxQ$=+%BqB%f;1()C-I%3QU(vk8BExyI0Y*QbNWMiS+zs%8}_UsQ4)FwljS z)7?G5Ex-4XmFehnT;n83#_{*M6OJp_yisFiuW4;{C5V%2e)2_5PoN{)wRwJ}qcwxe zGoX0Y$X}Rl1Kd~Vd|#5w4T<*jm%A-bTLWEAJhI&s5k@du0gnwzrzZkHM?s#(mC`U( zLvlx z2l$7jBf85YGReu~j@YEg8QOmgQfC96G1Q)hr%)w^?JdEISlPZ_92^l-nbu2YiJJww z$i024p(l`e5U zC{j-HPftpE0QfApVBC^;HEFlhPBH8(Q{LLIkqqw?W=+hD$DgRH+HZ|KO{YyPx^|>u zGI6ksp z2dEW3q2q~lTR$S=(PaWM3+(~r9fNxc=3}<=h)AVX8;uR%u%F`5!2Yyd1hh(Rc_enSMPM4Rc*!F+L+*zK3t`FD!dc*s*^^s?PDVR z%kqQXqEWEZxn4l*HwVG(fzp*=lnms8In6#8WVj5-0V&H2_M~{wDF`wc{p|ET>kAA( ze(`aDKKS(>)G+|C2*q$VWb!@fu^%;=M@)6iDFuR(;{&3Ow5|g0S55nrc07MNRQZ$! z`B;;WOjANfgxbd>oy+OzN1u2A=45V;C!4%+fLEwz@$4V7kzY+3BKqyCX^AzB945ONN z0n-^kIZlHmfB;h#AsE_RKhXE318EVmpPRWnAO5vD3(5Plw<>tT<1_%*NPq-BO7cfx zP1sqBV>tXOLawEjRN;9z7@!B*B>)hvNlm=905B%^+8dM8cSG$=Uo$00AgSjc)}@p# z?Z@O&eqcIh+x#h^PB*)%C_lSD-=+gjlOk~1> zq~WvoYeiB?3dxpMTX%h-8(|zUegVfI)5@bh*$_D?`>ZxO^{Na>QiG#$#Xs#bqsFdD zSpH;hdZkfy7b$TppepFnuHAvYR>lr!Q2zkyG6Niv7pTV>_Nt3>GRAjcl5)%kIP|GS z`Gr_O6@-8Z4l;4qiq%S!LbC=Zb9D&g87Cr)vhb)-u*N#%e@c9J@r$Zd+s?{@+%DtP`wEgMwAl7Du`&Wq@Z2Az z62%0d>_=pbWqxm%H~3X@I|alNMHpPRSTWu@V0xN(lgLZ4sorGj{ESX2Te1ReywHq=xZP)HM4; zwo!A?`WnubMwT7Z2T%?jw{oYTsjc@kfVwFI?>}Ks;_Nf6@QPSnDqCCu1kumuD3LO< zj)i}(y)D;~ZK%EVtHK|7R)L!#vCtnu?OfD1w=rq$3dlsUv2-E1Jn$&9x|uEf^9T{M z65|}P&n0SkMPsaoQxfUKO%BG8vdJ`9R_%pf?vLkIZ1sSIT+WFrE=9y}wg%98AM@6^ zIJE{08_OlOlh-(3L+@6tuH$uiEz7Bqb~J&wW^&<_VL`yG%W^gjDytY z1-syJ>&0u?>#WI@n3&QaNk8(-wh8yII*V0~Nuw!u<%5Xf+}T~-&O7F{ZEt5=i<@+~ zi7u8EGHe8g0QB4I-m;xE(9^N#w!R`#hVtArGDe$BvtX6SQUz{l`rO78Yn#~RV#KRJ zrBmzp*PH43mBiOEUA((iEQW-y5{z^n^{*d@V1Nmvm&=XZZH=3dd!MCp)TEJWN$z?@ zhP80_P32uc%X0`=qGZc&9atadS~gnM!o=k!EqDB7xd+pO)4h4kzO0U-Nl09L!NXwj zTe=RvVH6Y3b1O82ZH;rv{{Xd*D6ZxNUq%$%#QQ5j5+$J()QxN46|(e*XA z%=4GIdC_ura#4COvW~;2C)T!nJAX2Wr;g)!GB7e0#>US~cEIAi^2fyy$q}AA_+D8Q zl~y}W;5b}%6}xM#$G#VeUG8u$n`hkg80<4#?MW2u(dfD!xh1l-#20OZa@M9r$c^*K z9=}TIw5@b3;z{jZXCYsb0xNfLJ6DzI+Vt{$*7K1`8)E=6o|ypF?wPI`+CE$NEXoUq;kTfln~8%8=>Qx4Ep_izz#vp`~g+XSS9Z5Xc~iI!aDS z&%d=#AB?26jIdqgj1Q0z_*W;TYu9$qBv$FTLjtj70QtMRracGw>00s6q+Z&rS1j?S z3EZau9`w_fLE7gzZ56u&H*zwcJ8Gh_1diP*-NGQ1q6xSw^xgh(R8Wx|vnU2gxP~Fl zPI=~@v68ClS~ZqXuOV(T{VVO7>~R(jo|{|GK4O8FVa9!_19`F#{rM7ufq~Ffc`un` zxk(OLBnc8n_gs6Lw<0ape7j&19ECq9qygpxi9G1ZR%`|z)}%|4vk3qNiLL=}B{IGu$ez!6cF9vHtEl3ae-q1r&cO{g7 zCCe!xaIB*kZ>1vngoOkWR|UY}8c}f??6+t!JGMb5g`~WIKqW~gP(*nI#C$LJzK7PG1WL&q zmkR5%C5UVVK8N0rT$b7a8i^WW*9>rgju+qSQF+nD2#JZ@9G(9DqO2fY(McRwF}CFA ztwVOHaWF~ql6P$btt$vwZexVwEJTD2_~A`Xzh!q>V!6)2^N@Hx)eA=>g$#Ku^04T< zcd6laOsC30)qF}}%Oj~oExIF&=`ly(x zRb?O*Ot8lX=~H5u{{ScrvhNHJbOd3$=A2?OC|@@O9F4uImSwh`E$(Ci&&B{)&9_ag2|RTCssj|4BO8|_=kE9Zm1((S zwTKzyVvz!Z3S)4|_Qf$3A5Vtb<<(FZRm&i3s``^v4Yd0Rk}okIIbqQHb6V3U%#u5h zN8emkaDo^FQLfZRI32n4r+bK{45<~uEYg7>qK z_Qif+{?~u-O&^KB0QFfsPv9*y>KZ#rMutzh`|~T_?vnIF`;iLawg}%w(L9r~9pe(~-y-?OH-gTOD-kDX%llfG%LF`SNTVX>&-xI-XAj$dwZOBh!9k$@@* zEKhnugpyTT?`I^?Qc1G}Xjl=FagWd1fml?LE*PT~2nWr^3HB8$Bw=LUr*7N>o`>F= z9u{#BiG*O~0Rt?1^Vbx+LT-#nux%TXPvXyN2W>)UWW&11?>Bp^U_(NTnL-7r*<+QH3 zlW9oX1D^i?*0Y#G?mUuMvW_#rH5;-x`J*8J00~pj`qk2@DpeHYx)VvOGwFR3#5VKV zMQt3hvrf34NQfi<0M}a z>GzjVT)aAt)?`q@)L~p7Pg7s1d$&RN9ISDOyD*<*UDNg;f6$%&JjG!xn$)};azuyJa;~ucx*0iT4Z6n z22u=ugYlymm)-NzJv=5kSw=_N8dr$)opRpV-UJ1mR9vb)+>CRR*jA2}98T#@0_1 z_&Nt`mJb*)t^{MAMmwK+_dPGf8h)GMp{g0An(AjLILf9wjP*6KrRzUzu_ITT{T@XD z5=6oO0PEKkdKB>#+$L#c(fIA+Zw~6-7}X^3{<)*Qt4225fzW}#B;$^imX83O>N7fg zv6bJr{Gf0M_pj3b0NR80MDVA?y*vAU4LJ?k0v6^dLb7K(Ha_sLgg!F<%|8=<6g1Oa zXcJFkXv{_25o9u-_D50ttK#w5ZEP&xRou>0+E+)OTOjh*C7LrX35quV0G6QiskW*? z5=C&R%IsZPdK1_m@+zcr-L|C_jFx+uoGIL)OmY#yKG^M2wd>BrU0g=jDTAm~1xtyX+QguzP>P>6dyspNYJG*l7oTX37GrKa$q)`$4!9oOPq#Hu%9axgdAG*d zjzo};nDkr@ze-8&B`F-Fe8}15c7Wce9jVw&q3{a@P3m%v^rb){li!sNzkzApZcIQcXRqBkfQ{F@Zqy0U)~i)Dk+FK zpVWNUyt z&Pm?5?dSz0t{;4sueRNW&oWQqQU3tfp@86pB@U!+z-0FJ^r>NvGP^`BH?|q~<6)?x zn$09zSc3*Q$Y##(TzgWTTG3|vQvlJTfbpru)w~hE?N&94w71s^9+_*Ir9f# zDPogQk|L8^#TiyCyYN|$b>pThJ+B^Enn+L`WmK#(w)SFWku*AX4@EL!(i_86ka1&B(+7qk!-a)j9Z5xQ2|y)>74f_sm_TFlU&QX0@;l3 zZP)@Zr>LDa%A1|Pdmp)*}LOngH&oGjB zndKA32QDFxXl5fDeTN^VCnnJOQe|Dc1e0%4JiPwzuN`w!vNVNbx3`mIhzg7koa3Ax z)d;n(j}VCP1cZXW!;}19<4NYku?UU4v7BX;$&$<1=k=&``?ij0ByiFpOvAZxyPiS+ z06nSlI|}H~-+2IASawAdoT&pOlixk*lHapW_G_07BJ!Bvlke&Es*<|4NVa7GcPLi- zjo%)m(+Q3;49tY1U+$dhOVc$Rpl{xe+mqc1YWE zgUA4n=T$zJt-2y?Us)vy~^%@3`e-`kQ36hRM9-lxjp^NaWJ!C z`?brkkCC5K-yW4-=0<2iGqh+A41*cZT>6viQ7JA%%;XdWxH-q+-lIq_7DE$8`$-HO z{{VE=s&N-HWu%bZ$YN5!$O5Qy!+HX0wvg8vhOHf~t(xswgl-*hQL~TdP-Gz%`x)EC6Y6%Le^x94UZ$X-=rleO|Ihafg zu&`y1uyeoz-`cO+MS^9T7X{@-k|rBL=k)ql^j;GQgu!L%3HGu+IZmx=*ME8R7wvib z8F+)?H-)s{jb0y%&d~3!qqDwyD8ol=&;G2i>H`p0IL2|v$jlmcuX*C{hcUzAn@OJD z*l)8{ha~M7!S7w>o$*iN&%__uhW`MlYuaEi7)&grdir}men;Du(|V=(rmIXIKT~%G6s0* zSmqS*5Vd%_+3OR&hqIF9IZb-&TTKcmbzLmj-4}GZw3F{B>~rcy593(dxW)&muST1lTr_GZ+D~|!N;2kgM@yv-hnC+BHD4e2lf*XmI!=M7O?9a1R}KQC zX&H9OKET)D&&AIlpNroTHU9vJ)A=fzhNm;wg(Md&vWbzE1jl43rx3-2< z5}&$T=3f5*jYh;w^3Gt(Dupc{3cr_nuPlX-%BbOj=PulzYHLoWExSpfD=!lbnv#VrzD` zyGhzjgq*^TKJTqlc;vP~R}upuP)E7z_*RJ`H5NyaVN-_(asAT$;ytM)y4xDVa^W(> zEMQ=h?}}LC4Jw;!EK4if{CezhEcrbDn^K-%1q?@|^ZFz<>~l6~{2VND5{K32I16t(m@lvgY5Bn zsvD9zGY+De{h=fW%}8COh-U-l`8{d}xsz#~VFW)h>_01dpJ7VQz}!oFBVn_1DcoCQ zzINuD3#@)*N}##u-qlpd!a&ACyo1j}^rm^THe^yl_XKi1#XB)`BKeje01|FeGC&w0 z(>~CUt1DZww(Zf#TlA_gGaeQDXFk5v)|E~Hm~9-APfuf1q9-EbT`1qSP0Yguj|U#q z`&~g&MUk!1_8gC|y=ODL(*tuTRXAQo21l+tQzc1VNoFgP_muimJ;k`lqUfVg)QG>~1g+=Y=D zW0e~!3M%uo{c5{iktXNMHgNkm+x`^fA845%RX;lZL)YG#)^oCM`y{*11S%7go&_YX zH*!^)Igz$FVU99?N>>7B!pJekLhwlRt6Elpsoq@2rA1~L+~!U(<%8Ul=zCXxpnl7K zIoIs|-)VUoDCZ1^59|+W-j)`%Z-OLBaa*&^pd@*>DQs9E!3X$hBZfIbg8j3c;DcV7 zrT))8EVc10S~k6>OTJP(v`#R&>Q8fC<758-1pKzuGzj$w1h#)?`RIrgsn zK1Y~hQ*eVbm1ra6+kG;5r8e=~H=8I5v12(NwP5KwrJSX1w6}st-w0#`t9oL-s_-}L zZ#}lQtE(YwNTpPaHa`xv?GO7X_;TLC;MAQY1}-F#0Wp*OIqqxP!SH@J6ARBqWjst` z?2mx7Z-$ztuBwnlFPS6mX`n(vx2FRFx;-!8CyQm3qqfqfa5*f^jGtQj%fcVCK8N9w z6YS6%ax%L>%kf)we+@J(HgfkCurX!X<(T+iabHV<;3YV&eOW(R(&xm!68)0AS*#>i zcba-cmn5o|JCx(sj1R4K+F$HtsZLc=`sOu5iT5h=>^SLPU#^$oT{<|dVNfFjlzxoe z@G1yeJ1g(CLc4e6HZU7&>F`_$f|H6+IqG6sUlHQ|7yXoUO*2nRgs@P|La~-Ge9_LKZ{k^`+i!?<9c|}xl?0sp`_;bUWTr$TUlyW&c zn741B?MbH%O<1MUhE|ZX5c~t}R_`rgTZ~H(+CrSM`@`#A zG2E=V*buZ!FB|O1o6ih z6?;RaJ&_nl&eRpE}5ayuF~dI0esRrX0-JUW+t}zLWPiE9_G1Mzjo8m3qj zX(c#O(9>gPftpV}NN-Wny(nPl$8~c)X%;PY8G{zQKzi;g-luD?v|7axQ?*!?0Qao< zp4v6p6v9ppQt@oG&fqwk*T={`Pv- z70#v^-BwM{fL<{F0C(D=xzvTUYjR^D0%r}=J?dOgYHLe+BP+O{nTP{CQVm(IJi91v z6qw2LV(-(}wPM@qit&l&xyV)}vO9ZLW&Z$);;?4Dd$^8yY@BWbrDZR1UQE&}nb{+$ zlIXNdAh-&ScC#?aQ&1g5soKmMTy1vG%13JR&3ogohwLqUsqTcVTPz?05f6WQ^FI^* z)LLejBi^j+&WwDN4f3C^JJ*kk&$7%P@g}tH&bVOe$|t<*{wUKlpe^+a!hrt(tK&Oc z-_p4aU*p!7qKk&P)euV%;YaZg@voJ9UHe*U7qUIv*D^6|`EdYFJ?qN+Tk)gDzAm^) z!TT$67DaG=Ubs0G`L1>1hF64x_A=*v5KQxV*cPd3OER$3CY6{P9qx*>}8P{DTCQ z;2-HJq%-bD~o0Vy|eRn$JMMq>;g3!pMM&*kh zQBO}}Q`^}X@TE=x$g39iF~Z^F%I+EK-`1@~WhrG4GUeX^eRJNt?rXDn(`-`Gh#s? z+w<*y3H&RjG&`5*Wk+W5xSm%mu^*Kbed2o>za6}3CzU@38;}#!p4F(jYq|SDjEoJz zKlqjNednO2MTf59qJ@#MeI!^;ZNR_1>uLTJ6E4m8_Th$vl`c} z1Y377VhC_Z>F8@R>fx?%s0+sV3`-C}AJVUgr=0^bua>g6%m*w!zLi2$NkMhoJqbJ( z&ua5AIH}2QQi?@M98VtM!4HN~dE@$13LWIH1avLVN2OT1m5t(=rcIt$GQQj}IQzcz z$KG8QD2m2LOSTR&I@g^lvSkD@qXiyT0Fy3r_l7@8akXH^;ep9+7#snQPfCSRvRIZ) zpoBld$I#WEHRDAWU@U=0%y<|*F<8n{V^$+raW2^eBA1)3#?rKqRQA9cW%0O%k`<`lD!4Hv9r&baNU^0Yc z6*%>#hL(GGwPjQ!W=WT+9e|{bAZL&4gt7%bb7wfGsz75cBrM~~`4t}+Z1wk{I{?KJ zA@dSdQWq);o*Uo%DqCxr)QhR0M9Ih89Fg2pq_mFGGLyT=&YP2-PJ4b8UE-er{jx9K zE&^=HkLyoxEcvS(EE$j;#g_va2iBu|hVw+uRlA|vh3V-~+Yhzf#}tZLyw8}%F}x2? zN^i>~!WiXNS7Nz6GvDbiaKImH$o#};Q;)?1W`nnE22a*J2ariL$)NW5HlC!5;M_s}m~48Zv;KmOPP;v>{w*Z#LN=l5ypEgbq2+sXmlM zjLI3NB=S*@Zr_zpX%s(tU8;gTp&OD?jc`MqQCaNB8K_ zf*S%=#z2%g@IHDmf3*A9chv* zY5<;K%D+C)-*eyIn75N#d8>6HK4J#81a$TMF;8*@SlZcLpaciXnOI~2+aC34JdBn* zn3M`KdLN}%x0NJP=>)tl1hCi+eLZTyS=G!XcD%8TjLY28V?(wyl5b|l11`ajZq--KmkIP`AI$M8CD{=vvg!v3Gz1R zUNMew)S8wUj^go3H@tXeQILIU_##4tWDI`r{m?u9G>l#pC4$69E3|g?6gzCa#)#Iq6^r=;U z3*{6NM_lLdsV%K~D_o?@zY{8O(fWM{wI?J}O_f$cV@Gxac_UysJbKiNWo;~i?(W&y zP?HjgFcq&FCisXogfaq@B7AI`2Vyk+qy!s7)A$2Bb0i4^7}LNEaY9I43tD>q$q zG*ryQD9B}wU_c~>WC#-XMo57&dlPi{gjXvD2D9(#D5U)&khzfO-mgURyfJB$qT@y)j6k(NDjlVPcA9`TEMdu7hM%sIO zR1(PfWq^VmcDQbLRd3$QbgD}#MI+TUr~d39~dRO319YRs@VlxB{403HvTltjCj~?g zAOtq$DtI+4dV)oD6~($`lkWm@KN`qKVCGI(umwmxK9wEC<-{@=Qrwnd!OsS?cRzm7zW=2pNNRL(j02*`3@VK5N1=Iqr zNZ@@bIEBZ{GL6c}`&?~iW6*omON-Ec>t`RrrkyJS%;C#q3>@%1YO8K$19}AA_WIr9V$qe{h=Bi9Jk}?TByWVWr1>x#iU{uGxuaUz&@0Hrb90D3}gcZk3v1Y>Z;talWc0k zp;<@;LC;UEPv;kAjy&`Lvw?zXw5_0BotBH?JA2Ox$##$ak)Pa^=hNidp7n1s(HamY2DG`WeD z?ok|0dIdWla5XgYHKl=GWlR0cLUXG87_R|C9*aZSPl5WW887bq`4C2 z<{dgFD;67j@=ix1-irX}W-ln3Sp26igp9Y|?YqzqtxRqU?wM_nMm}BYK36`~2auvT zj8pGtU9w3cpPP*1=qbuydfeON5g-eZlpf%E(O?#7Syfm9al>R}k&cF+5fGy&FOoRi zbIJZ1hFJc~ExTRZlu4$-J~9cxB@gs9V%}+sC^95u5?3RI^v}HjKIwvpoZB#0I3%ze zNF4n?#;MAYsbGlf82N@(8}P5fqmbNetI9Op{G24ayVcDn0v9&`EHG78gv7%H(4Qzu`$VFqp->JJq9N0F3ZK z_U~5Vj?3&u87?H2NlqjMun$3j=s4|FU@AkWT+U6!m8nS-A1!1($5UInZ-pSW(boF$ zRpvPn#;wpE{{ULbvYs??GouGr*b+&2BR;imPZPrpw2~{Tg^-dMXKp%zJw3%sO@-_~ zSJM|xz&8oz?E#}KbBuacTbLadNZoO`u2r~U=ttI>b*xS!T}cADA21HNAP-+^reu!h z1-OU>cXIMD`=xyV?cT01b|uLYx_K=utdc4oN#MJJ8%>^zz3EG>M98y z5i5CeJ8wV{3vhjDjuoZ*GREd|pv4euZzs6+trEEni#+94K^#SQa5DUc{{Rna3rbc< zn5z(g?dV#W=0h2kl{S+Y0g1}1XP?HBMu`+fH_nInfx%@xSs)EOGB|*SG zgRrG!7h;)B?C&6A>bL|R*!88A)RuGActs8J=M@@Ci43z`UPBuQ&z8G!xP$9XGMlIs zB(@4!@)R%(PjmF9B5P?xfZSV?`=$Eh+LlY>8vV5glse$9cH`Uis@_SsX(xTii-u6F zK|Y{?O}J*dDKn(0Bk-{hFu3EKaZf>N7J8w$m@F3L2V$ zz;-5`A)SmCIp8OV^y-F*#M2g@p<8bBn$WnXXQOtne8iDR9Zs+MP9IXv_qPfC;)k#Dp48;FgLm3K&nkSJg??Kdb4|8ZSf{pIbLOAE0S9O& zs1^&<+ zZ7|&s-cUjY5T5v}QD|~oCM9HIaKxhUKR)$Jaj^L$%*!~ZgbAYxO73KZ*XGZrYQkI0 zKXoKoaG7-;{{Ygp7fX>?lNjF01_|r$?N2&xz!_Acs`7+>eD@Vfq93znYFXRuGR|0S z1T2N|v>)eIgkjtu3xEgWdz!kIaflnqazS6-Cs4z^HrfP@+1@>>daim3J)qSxIIZ(5 z28n=R0^smPOBJbmg|v_}heQLuhh_=dhgyl#a^V{C0jyTztFgIj^0**=a_M_S` z`zlA~~3R@%eZd zkzH^{J*aaUinzwHCYy^Bi5NfcVY1dxBa2dVd|VZBsEl&;k>U`W7ok56i( zAf6ePZ#1Mz17*40PiHL?JR}w`@~>bi*#c$NyPkPkS=hOd<$hd$kyURs1&A0!FlHrG zA?SPV_V=h|WF|=qv6>|Xl*x^?C)rq}oQK_;Ly_H%Msm#@54q$ULN`O~f5x9OmCGzkBo#OS4k|e%iHls^Y63M8{EFc6M{0Hf>%705 zFh<;GX&lr>r}~TIPPWLTeD5JKvrJW>Gw$jJwj#W_e^ zp1)Jj(?&Xx-<(p7z+-6Vnxw#%3@qD;#z%g4Q`nuw-#<489jXBPa66uq;`tjlWOg2g zwv5t3vm9h|f&gQT3~`#jpUbL8S)!zt=ZR5rNv1(_Y{umzA+Vr)>T$UL0EG&Q z`_;e?67FT}eJbczM?PAy+Ps(OSNv%bDBdDe9jA~_YV=`3?8Ve7w)l`oJ1_4SD%i&1 z)G0pHZIR_F!&2GWr^+P-)l{ z)r#OWZn8#j6|k;2Bo5S(%M+}y+Z~}#A;(tlk3m`&klRCYVYhP28V8Z(>Hh!$6;fH& zW?M%^jSn{yfHK4TqtoeA?Aj}u;h8Pv1}ROunDFxf#?#v#w2{T+D2gUs%nt1GN53?s z0R7xVGj>)vAa=>ABN3|+Bqg`57-t;%k3sECKv!jH$nw@dEw?jsj`Wg#?Vdw`sAae9DZz%fX#&`f?L|7k^)hf#!26`N2%^lpr~}@*=j=r#&jqAmyS zz)(X9j6B<1vwXpDtgDT`hpkQIeA_^5kP2?51(n&^;^Hrv1~I$ZvE^o$5sJi%<`Ud} z<^KRZY4%GyNs#HV{ooe?y@~BbwY+U0V8FVWu6?! z-br9aAJ@N1hJ|eej7AH6m0JuuwnyVm3o0-ZqL)U>rrrVfrFB?YA!tgH00j;Md(y!i zkq3%Nl?txqax=Y2=}2~Br_Ue~#L_C^q;1_kl+vzUn3)+~Kn`0BzTA3Kr6BB%D4StC zoZ~!lGfb5XvH7h2T1I|M=acAZ-614&J{#6&f!e}H1}8gaJ#vS)*0X*gcqZD~Hq>;M zV-O!HC%^YetlK&7BLyM1G8T}9ken=h^(MOS3F}rG#f{E|d2t)OFz6F6eDG`A~oMM~13^KW5GHbi>hl4dpZXW*tQqfa)+4Hj8 z<8q(k2fizflS-Z)h*N(50QF^CfVqa*@%52+kbFn^0GI`P(y*zS9gKmfsRTaKl(Ksf2twHe7QG0y{z zlwgJm27Pck&;iDIA1{1$r1=3pTxE0A6Oo@{i;Ztg;(Wwe838c zPB2b$kItsyPCz3ol{xQQMH2QL`}tsnv(t`o>qyz!0*v$bzX~Bz3Apn3QS&HnNTG8e z9$J==F(96Y+a8sru8FYHs{4^7k82N~BamrAO2oKOSSSdfccEVaw(FM$7JRfD$Bbn zaxsdt2B9+L-97%aqYqV!CLA1e@0^(uN$u0UA{0hFGel)zWzD%@v}bN&>d<&MQ90rL;=pb2GWX7l7cH-B1; zl~~U0*x~)l1ER#Py?ou55d7IIZ;H;C4V%i4eFc&$6R{S0_9aD%LF`?9ECI!8n}c@wNzPyIM1o3;3TS~fXARGBAvivE8wyzEBs`1A6io+(Wyk*!yUyt zgUF1MP8er{O3`tUImak^iY@@Noyyy?JLGYib*0XJd;$XB*kQ2i&I%XNbT@cmPcX^522*~(Tur+$iuPEnSt^j=qjRa+)5_l z=zCLgIbSe)wkuz(PQl8J2fKz@yv0)@Fdrm*WaFR0n<;b~(N$hElBcPvDJcZt;kyue zQsk^;1m3ya`5cNpz4sR>dRQWg*iT_GA^vBD@=w3#nqvZp!JvF#Y$b+rYO>tR7s`x4 zKXf1A2Cc&+Q#X;mGBJ?her?`{nw>cbriL}dQ9kFmBYJHteFv|tN(fJxmkOghx@3FP z?6nDO9$9Uovt+xsHtzQj2^s)MC6ph!{16XOlZ+e@U3~S9;_u7CDFbWw9gotJO5jdp zjqr;m<0sw0c_FFaolxil=1*a9Dq-8 z?@}Z;82LjGOHl@w0O zBa>&$g!RvJ?O3y`qa;L3yPZo2*yYAJ9=&^2sBZ+9GPy|=*e=#);Q;H$txqcxH!U?d z94M2eQ_7;cAkmh-AKxbZg zP=38JT6$&V>gffmENvS3k+sBOfzNzaa)rcox^}w*Jfb_;*dYw%{_?RsD&O|%8HLEX z42sy9<6cmK!T$j3S0K8_+LXz4bsU@iPnAM$AoTaGYb{$@nrR+wAuQl3o?P-OkjJM# zmle+{PoUFhW2fuuJOo90-e4P@$RGth1}jfYxVRs^wh}rPK5Gu2t#OfFJad_E(nKyc zg1uS2Pq3{Rd_yjlrfo^fS}_4)RU_sf#hT`n7ecRdzp}Z8!Io&}jjreUNe!OdaqC?c zo2yLM66z9MDmaB9WKoZl9tl0pf6u1_rD_%$l>Tg1zC@8k3~emHl1~`=e=5>9&LuYT z#zLxrC}{}!kD(p?E1F5{$8*vw^(Kj#RR`K*kDNCJPjm0<=~_^Diz^!?!lX$1l0rEx zjAFd+NY$qD7iowHPyBo{=WnwQQ(HDy@jQNHe>Ji`Ooh5h>5ucpVBnhr(XBO0xj>5D zN=l2k6*wwSY}Zqy>+{QT7MWkkVPxUHNrG;#tgCl01?UT zf2DMBeWFWf=dndeLX!xTle`b$W83Rk$`1AoI-TyBtQ+=NttT-^8*j|rTe}ZHee1EZ z@h6@mSe`d@8x*faBd`AeT-TH6`uuU;Libi~%H#sjkT3^O-rkj~XEc_ReWORZVH~BJ zC6T^k+~d$!ElfI)*5|U?_>oX~c94Lq0$e^r5uZ;=zo+Y1ky;s57!o(gNdOLwURUAo z6)XWEl2?d0JLf#_$@`f8M!E|fRUdp~ejWJSa$DH?3=i{~;HgG%c4ms*4^Yx|`=`5( z(mRw4&4Dyv{KwN3yKSu9+r)g+6tU+Fz~gIr5nfc9=(djD=G22e{B2j}Ja?_6*R`ve zBeI4lND5u|HVHn4v-hENR8)^gW<*c3!xW0Hc`9;EB3xMuhbqikGBX1Y=C=IUFOz)AO zg&w}38V@C;ZSIV6*~a{ihNNY?fJq+ISlM|}xncOzpUr5*uOc*i_O8|Bf$vIV zWoC{>-6F6j0~j8Zt~7|WyH}dxM73?U?-u1FzIOYnMn6AlSGZcl2012RmdnO}i}-zNcv!;W77gXHuNgmg z+|*FYszi4O=MDSPt&TmZ_ZJbE$|NQ7K2}0A{{ZW!WF|!|(mN6ZJ4P_bykrmMMXJga zOFW^0e8zxt^vynIxQ-P8;yZr&vi!t)8j%_cU6My8^Cv;nXWQDPpdWPy+1;acJBY!H zcMI#9MR>x3(kK96DeB*iLS%K20T$=a?+ENZl-VV{Blil2BM2Ed1J^&&m97^oJdYmZ z5`q8(qa2g?)Pmt+VD7`O$e84w^-s?bN(dO^EuMD!(uk1RiD&1Rv*DEtVOSh^`c$EF6wO zW7?CtL(!HY+!0mC*r0(K9OLWWq;E7L#!=WQ%f`Jxs_`){%hhIyvBAOnMdxD^B_AOcBM-Pi6awmA2xl_F9dBntS+M>)v$ zq%j#@R@fZz*XdC-MbP9NZa!NnTEuGAfx!(SUk|^!$ThD0l+%EFpdYg45jEu+xYUlTjx3{;w zQnMtQVFdC?b>x(HU9QQ>k5WAiaK9A31$YnQzKJ%Gsd#!Dp(I2sb3_beo(Vr*_1Q%G zFoI^-WaWF2=~p4Uk|@kCn1DIh*gPLfZ)*Yh6Z>O-!7ep#hdPD-0EvDQ8<7kR=bbC8 zXb;{IH&OIC9k>UNjPC3%bi2vybxT%;?gwO+2KμEZ;!=%2?nnr@|KC7s2h&VX+@ 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�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

tINAM?E!}3IT-L}Nbovw!St#)4;x1L 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

^`%+L(-lHxPn;)7 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 GbBe;>_EF6n&T} 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Ο?UwRV@Xhrro)BzbT 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

cnL1p51P%~TlJ>71x;SX6OF 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

&z4 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

6_^+k^0Ac?C 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

q#UF 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�@e zmPmZNNTmmE9VBdw)IVobM^srGjixMQoc{nS1Xq%1AemyjTyIPygy0IF%Roc35X5c9 z?kV%y#~Z!7#8k4VK48udsG|N`80L=AW>z49lHE=-PjPHV_Jk5nk*hO6fbH*-REuiU z$i7{ULu9*&OTknI^`=3h9I-;=%ZJhxe4mlpQ)%yw9OJQ?0s>Kw* zD>1;35<~Rk+LqS9#;Gnqc4E>rykrmMRhvMeXP>P#bb!611~pRW~zOfYk79f457i@01v|EmUu

b%;3P!(j`xc$%XAAf4FG}pJbh9#6tuaIPB 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

bF`i}KtIb)7jmg?d$EQ6V*AA*Hmz;S>op}bZg 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%0AYdPx)Yok{smml|&l(a#rseOR^^VCdlXLd{7VM$j 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%0APdm3Q42$*-J#cC`Dp%oC=nS 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%0AmB1_01c=J_+!4y>j{< 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

( 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

tvX)G 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�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%0ALtgk^>RAY7$O@-!bLv+k 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

XA)@AkIT%AD9t^+D8~Q!M2|pLnKZJ3~`?0 z@u-(ef+M{rJ8|=?bSKx^u*Fb@DiK`ri;R;_Evwt3w&~wzp#8MDwERVtE(;kfpk;>` zCmm~A!omfz5=oUVK2$w(>r`TpBx2Ycj@;8(sdOEhGSwfWOYO zmRl;;yRpvwn|dCVboy7CWfQK}JfA`DTgsZexi#Z| z5o6Y^K{{TY8!NUXGJgQ~uS3=TCEHoSCH!-N6eH#`a(0N(??A63tgtIa{c_(Xf zeXAnhQPS>jLwSB;qh|`;{VQ%AcExNBxwk7MZFHi!ZQ`ptI|iOR(AaOC4^iz4~%ik85 zo@k7K$K{L_?0=@Tmk;I)lsU%H-mYEhQfV?Q8r{|urdfwlwU_$UQdI7l zqRA<#Y;@PYG1APd=7v>_d5rF)hCbDW;=dMH>M^0VzzoA<=b^4~d~<80PA%`Pjm@mG z;h(%}e~5bHxU6k=#4_LNazUZn`N$LZC5F`9{VV42{7op(cXw>`Xl1nFG918PYLhHna!cAWE*4+7)JZJ z{Js#`}VpBw=uLI@`q&!D9L0ED7Q)!fb(e=X<@d9lt_nwz<+!8LA$$$UGjYLYaP zYb^_@4Y@cULrHh`39Q>s)UKhFqhaJu2|o2f_4%yqn(Hh>L;4 z`Fj2}rs&rCb&9-XovW1t zA2G*qUpYK2S>k_)?9SeAb5vqNWRaW9Sz>k@c;_GDYi7$&)1!mTy}3|SeZkeK@@Y1@ zm9V%(F|-Z1^ViUQeX51%5X!NxAB9*x>gbYs7I^(rPXXjhY(IS};{{XBf zlDYJ#ubr*n-wc`g&&qq(U)Ez92{o{-cYBv@t)bO!-WH4%C=N?wZ>?oKQCm*fpXF8| zNjU&|Q!h1!T|CPRe()T&?i=VUBkhx4BP`0{uyDEQp7rG8GYU54wxe1zdJBk^ij%fX zal57}hNXQHLQ6921cyBdKHh?Gi(RkJ4w%zIR}x{UBm=0J9V_lX~^EV^QefQ*OW9jHCKRQ9$+OtD27mBIrc zLBJoC;eGGtxsuVi6bhx+SzfAgWjLFy3yFb zXCj`DXL+eGY2rU1%ewn@t6GnTwA;o}Z*CNp3|MvP$*pZCPL;P!Ya*yWDPHU|SFNo~ zQZn3IfOsLtrAv~M)U`=1&Td^XVo;_s<8MUttytdP9W`Wt~36j(8tqFD8`=E`CDl12 zXxSu)DT~U^J!*qP6_n=G+>b1;&A9T1)9Fyf;zxpU1+?U;ZW#w7)~U$XnwFqVlv2wy zjkTFq3)vd5!Qn-{N%dLE+vRfaE(0G=r87}F9GZg93%en3WGdVP*i{?* zI4$mttjKN-!RI3%lpjj1DqFq6#PX^!AL_$$KMzXbo+Z5y?#VB;2xE7G%H`8C9A}j$ z(yK!0ZFRHFUooHW$J0O3oQl!Luq=DnIl&!I=SX67l?tXD9{dBJTIF+X-HEHK78^~H z{@~0}Zex!OrbG7+am`9Cl zlT=0J?aap3)Vimc`?hYQo=$x#+&&f5F5?##le(_r2y>8IzC9~BNiL#Iy@(rCg-Chi zU5}By4*>d9t%(s@I9Z1~%P%?XN3|gE{*U3I=4$t7U&}a&k1S8GY}SlEEYY$7cEz0DRwUM23s9cXNT0ffMcKLmFU~!sD-wXJJFi)|ZChytEl03F_=lU|Rc zcuvyV$?q1*IpdCBytvMLRZUaG+7^#`kEmY2>`;kBr{!N^=~=4ITNmt7SCcCEUdK^= zIj!$ye=X1NeD*j54&UKhRvM>=bhs8f+=phyG4hX2dsYvNJ|yUCq^_5t-TkKF5VSA^ z`^-i{mIJ>`*EY7^Kk+r12|PS3;J*1DNna}w9dHL+{uP^YZtT%YG14mMpxWs=1yPcc}2<&W`u^ZC*rfI44;5*=?_@yFYl!b>_^ zO!#FWA1sXaBc*jZ_lNC%9O-tq7nZQg1^h_yq$`$HZkhM@tesf*xvUi0)mY8&?whV% zO3>=IZ*dYnEoN_(8OJ;x-;HbPCMhf&Ev(SHADY#ikc|4ihT43!z+bI%$=%(ZP;M!tWNID-@ou*ezwuv*-1x;RscxZPXA<44sZ9u~e2YF)p3G=DbFa68nx?Xtn8 zm?XA08C)PkwC+90$4Zjc_8ZGderY`S17XL?Kl=39bqRF%)$M^-cE;(KaK~~hDN0Xv zXp&nHKZB803;Qz@GkmO#kli|BlG5sHB>OParDl=JPZBnEs2RyUx>fkKZxK&;rt%n_ z7v_!9FaS8~P+g<~C7S;5TZ@u>#si_O+?(8OE`x2Pn)!ZY^41<=hjApY$xvqo$5REZy?jCzmzD>9RWpZ9e_5T1pXwQwurc13nEG(fKT=N@u3=dCZ^{#Wp9~P3-sLA zsVjG8 z%NcUtTG6riac!xVhf>qsWJUtvBsjqz!hI`6I#5<-Je8`uqXE2Ni+dTiNiIstv6&)L zRxyvfdsd#M;yrUziIKFWQ4tI#L<-NwI6a58bQb;+(KNfSvgvO2&mv)xMGQYYRq6Ce zw4k=KNfhk3cVtd5M;H|nuTP>ig$k>7b2|0@tK!`;G#z3$vk^uGypXxxMg~rOYD*6S z&*3`~wtA?$l~fg)1uj*67_b>*{cF31$}M78ppw=LeW{;0lqhr4iq4Nj@m7~}befgE z*m0fkuMD}YRwZq*qr*Gh>SO5M7rpUBEYoU=o_p<mIH9P zEgUiv^N+`|tNL`)#R{eLZD|{G8?s|Q$JV9$O}v_i_J*;pM8R>0A#Az<$Kl0eI<+M& zHaCqbaax9_sLOF0!KUbNz_!P6jG)S#cdGvY+t>HksP@*OWk^6}G3|^WsPA0fyYV`0 zHLjrW=A8F3NQG7zQ!K!qK5msImA13vy$Z(KSsK#l&9dqUn<|aiJNSu(_>6IRpx;!gln*FwoZ(^}R&CIecS~2JV>c^nz)}gu-^u5ZD zwwA3}vuGrJW$tWNXd;sjYL0nN$Gvqn7bfpYxYHwrWSRc+5z3C_*DZ5vZ*By$tkIa{ z!z{93t~kdPtv86I8c4R63n3+AbWjVZ?AYXi>s)iQcSlrOO3Y14+}db&mts*cwnAl? zJ~8M8aQAw@jWv4)lf$}usxQj7Qk*Z>BfWK}T(i5=(@nZ$@`zw$BL)3N2WmAfcEZ<2 zRr@lm0O2E#p&iXsUnvqweNJP;zYhFI;u6>1EV*M~7i7}91>Cvmk@vBl^&?QS%w;@b?P%!9MD+kN9amI1Mu7gj~Y%T4TEuv?2 zL%$E41NHAwyPX;bwwq3dGOEHkok3{)kd4_L$4m??MuS8l1VhuYLnc^ zjxfQ#PEJW9*0nWTtp?U8bm%mdmhwz)mNWr*9+=}5$oOl-zAL$o?#9DMMEiQ?DJ~x> zgz^B#IIfc7H_#!9&s5iv_IKJu%O2gYj+pE?tr}}XB`C>UsjvJm@s!q5>blOAZq{B& zSd4!tnQ{95HA70$v>iLcBT8Fuv$RnbwngQ4WN>RkRM++25naBIsrZU$tY84VU>p*A zE;BigVclet?Q zu_viC+ucJ^@$++Ntw3-BVqSR`t_|^wv6U& zG*#Ah-w^70gx)IAygLS^f2dx(m!-<0G>l1*?E?XcB=9<#gT;Oe)9&rJU)yqtJ1ZeQRsO@@Y{=BqrIF(sFaV0LV@cPJ*A~ZwTs|1^vWP&-S>2tlo0u z?@}}J{{V;QO-UwCDk%6D{t#(yPKugYgUL)Z?D#BCf788BHMPfwu4lTACyYxOP5I96 zLIsvk@f?pRm_K1RGEO}XCZh#It3MA1{>}pwf zf5qMv)UEtQZ>!j>_b>*xxeg^TF$Xzb%mEz#03s`Az*Zj$JY(V=THoT;z21)#LFc93 zlDlJhfWQC%#0ET&tBju6HO)S^;Yef?%63Ntg=N^}H_O+K^+F#R>UVxFdAucIaeEb{ zDNYxdt$(C8o*s6K5y(!?xZFoVc>YxF6XB1D{As8g zD@&_alH>uhjUsc912+uZ4`Z+{c{T(BX4IQ(-~JOSYazMgTby2&h3 z{G_Mc$@{n+=}A)Mx)gn{HJN)yzOnIHIxVh&C)?6((cDESK{50z-?u;HY-o>j;B9?1 zTdR26<=G@NeA`&{M)dqEq0#&&;fq@(MzR*ymd?apD|OGcW$LY^X?mPH%w|dW-6LgK z`{#jJbEfn+aB*6fbV&6FvAeppnC!gFawgyPv4fBgV}g3uH>lg{8a1TQ{jpNPrvg~5 z-wtK!6_2NUcluS`Ht)r^bAzNtsSljXvHFAQj^ePd^zCZ%#p6i5(58=25N?>2+Y_iH zt_kXToOb+Zg1fO3m9;0Z*X$b5*jd_boH=I_INGb+k9xP^%}i?XTwhtVcFS(WEOJN- z%tu!P(0kTpwZ6%o<~v=JvTZ9bs66pmcA6fdlQyStq&wwAu$&+n=tXJE7L2{5lQd?t zy751X?LV~j8<@1YC);^*W|?9DJf?U*FaUwhG6oMK--)zH{5z$MHrHC3=gDG3!Xh^z zKQ4QNis)zfpW@v|Nw%?lI?5xYz!xZ>$iNIKC$<3X{VIPHiM6c`)5ZJYc&;NJYe1ZE zIr{q6Zc@2cOy#~G-KCF-wBHqY)4}bl=+WE}Erf5dFd&V@^*AIPcgLu%x5U~{f?odT zUhurLTSs>4TETKmYmPZRa6Nk0FKw%oku7ag%#q~4P;kHfYS;UH{P!~HcdW5XBx7zP z8?opQLyS~O>vH2A4rf%fhD*k}duAoRRdCoKj`dqvmRsv4hT`2+pumYv-!qJDBy`WO zYU-Q8I^>p3dp4Op$`iHVvO@0}!TZE?&JX2Ov`srf(r;tA)TS#DZOI&`b13)ETCZsv z2eXrBV%{R~NBkqOO=IElWNhtH87)W$aUf;K9CMn$)7CHTR=JB;dru|9+e*KCf48^R zjZP@q^L)}PiP(8;4g-vJ#WrbQ%o4+GzF-E>7j{7QtQoq|Sl+s}*7aQ?T~_Whb0Czn z6u`>*;ip5V>Xyc)TE)Jh^+GWzD?{yX-80y4lueD#Y(KNViplwob zGIJX%*oGh{zI|!dc2h}srs7CcB&KLEKyALHp4GXk$>4bW7bl4t`Miwj!t+g zdk);yIb2Ct$I~P5<<^wiWy4J@(dA)a{SWYi-2VVt$kZ%jip6a84MsQ;DGNrvW*_Q( zt1m?H9=mz2MR%lVj~lxXvCh9P2d*n;!~XyU+r;{<--tda{kq&t1d#1JA>j2)bsc#1 z{3@-}_w>0LUYi0|{15p#K1S z=~ZRbd^7&B-SF$FrdwkH# zaeXSsZLzrro(5ZJ=NQI$>rC;_?CtTxK=9oDC)GSVZ!U*vHv60VYpCQ*vjqbR#em$( zIu5z%&2ip2_3ZZtj{Uw~a_^KooHPy>XvoRlGOxr{X4qJ?F!J5ctyem)31^%>~ZVcHl7}V4m1H0QMEFDicqd=RI1xCAoXS9~Z5>H*>9cVjl$C-6p4C zvFa1B0NU)|wc`MA#J@S}0O`$g5qQGiOu4q!A5FNpvA4J%YPMhXo>qB%zr;c9{dlg& z#_!?HJ4EPlq1cTze1rN)D$Ri6xAvcqD_&FB@UT*D9*rb6+sp_;~5p z&1-LNw{HXP2N)6)>z;#(_WdK{j*n;X-VGb!ufzM@15lFDWAR(qU(F?r>!`<{<+Jr9 zvD>!@bA#OTVlQN=jw(*>MUMe^FG{)b_3n|N>k`~SVQ}`EkJ<)W;v`~>r8}ID!yFo| z@gX$}En85~{4wFBo(p-zF)5F6EsvNg^#ly{^fkfwYh3Xsg(Uv~gxgFqM{V#@YbL3)BY8XoAEc{ABnXX{6g?&#u|3I@R2m^tBI|)6M)WG6v@ar z!sDK4N~9#6u4yYCMey%Vm&INuxYzZaOr2Z9*Y=8UqiEJ+wC+zb(n z*V&#F@t49qGgI*fyQqH5nsxM=yf&vulTOo8XzgSX>?pC4M0^AzYUGmHJ*(p%7U-Iu zu-c!BwI2^lDm1D6rFRr0MH4w}Bd{1<+glmxMSAzZ{{Y$#S@?af>5_PDXV!GxJ`|Q+ z0!c(c+~l))q#u|z56zH5<0J15d_)~@dM1#H`$uEre}~%Mi}5c-_EDy~2YagpyB}*dfk0U}q#(j{Hl~d~xu<#(Kqv#Jzgv9~3+y+8euVN=aUH3O0@T z`IH3&X9xAKp}s$OE5V*S_$U7W3nu7zgGKnLmz%s-p=*$=HrDOtzQJy+rN}V(Y#CgF zU5MyF`Ab{YwY@J}xz@ESqHnEY-8IeeGGGn@?QG+L{b|sPs~hwyp2yVx00F;he}|qw z)bu;w+CRh7*=t@A(wg%_)|Mx?I=CC7aJxvym%un;A353vRC(u&d^czNMf`S1wM|0w zXw&(($*9_ZOQWoXB^$n8W!aE<3K$F?o=vQH^T!&`gY9(vLekpfLYiilDNHI16P4J= z7!Aq_lhcEf>0fSs%wHY82Cu}A4rm`5yb1pR2)~5&JteJm-A}`|(8`EXDIVTULw=H(QyWeg1qz|n#tt#a#{#;IJN6&(ckL3|=foe1e-d<;xQ;jpvC=t@ zJAU%Yag`V+8+&6sbI_{7F^uH5Uo$s(Cu7Av5PVV9J|5eRXIMTY)9i0y7UNik&Q-I& zjy7_j$jT#?kgS_|ByDUF&3y~-llIp5iSW0?1H?Di!^O5YdS}_KWY;a-ZyF-ZVv%Jz zGMLzqpyU-SHx3Bd@ki|0_H75jAF_|d4~g0c(DfLuE;Nl+&h5X^SeJAX%lCJ*o1XQ{4AwG^6m z-$FT~cAC)Rbl(|%#@`q8ooiC@{r3_@`1~I_u!w z+rbGNSdaq{y)l!VjybDZUxL4AEn~sjZ^V5+!?Wm`9pW21N0U$yOQ|G-ZW0wcoHGtL z1>=#Bb6YBMjit?FRN-ZzABFW_9_SwsyfyIyMzPeaZM2KjYpqj8Nnu4sR)`mwFtLUt zsb*oEk)BAeq5lBjq23z!HQ>!#N!4vNA+73K+M_kS@`0#mHyd{y<{}lrD%m_C85v_# zb=Cc<{{Uw1*}^Z2{ss7PrRg3WyD{k=EU?yONhf*aNpTF;$LEJJt2#)eBMDPGg8)4H z!*{<2zC3(5(S93gb{fZrJVSf0t)0%bsfgvZxf8jKFjh_#GY}(ca5w~-&)K@ay_ViY z&Z6eDdLDuB_eAig#?RUtN%+a({{Vs-PKlvIqWL#I5b!!iEp5bqT2lhuF<`BWfC6v!u!m=7V!^XSUR*0hT+vS7Y)lo1NGx#^6f>fX5TzXTg7n8u#q>`c3wo z_74r{+SDh-*V1^6Wq~f{a=PlWt8<6n>71OEVo zli+=ZpKarh2>$?Y!D!Z6bSiD5znG)K?%RlsWG}Z8kgmw#Nim#m_yhK+_@UvEd;2&1 zYVbmRhf&vU+Un9^u)dV*I&X+MVyHJJO5l!I4tPGf{{RH;_>Ft;OXCNMwQmOa0uLJ6 z_@eRjD;+A{^KHy=MJ2@WT!ooQK(QPbVhV{Eb@^+5#((fniystfm)F|2#UW|&3s=9E zOD_ssTc?sDmD!@(atTtvaCdcJM?4Zs6HQccs|!ZUV|Y`PWn_i@qrNd~-xGEJ01SL8 z@SlqOW8jAL6f*{sex`pS6GN_uvMzNmMdP78oqS*tYG;!OFG)Cb~Nh+XuitBe%Tp7sS65>be!F zo-6+V1ln276|J>-WtHTD-YFQMGD|FHZwk%H#xNuOr~Uz7*0m zn;-2fPY}9KJ;W;{doe6II|0I#B%P!XMgoqj#@;*qkUwS(Yg733@bgg7d~bbh z7U=JD;r&w5`F3a*at7a&j!X}kkg09Vp>cvibKyP#_^aW+A9#~h@n6QD5b5{&XNmOU z68`$}(XAs%Tm2EE+yu#nz>o}rnPJG=+x#4l!QKV`0EC}O_+{Xfm%}>ra6{p*6c+z~%Qn2p;v|b?iji-DM@tg>{#F{7kO@HAT z)>6qOhBa5k;5$+>iczwDQ;e?D@~^Aw-WUCx{0pdQ8b5?QTYcioy-Lo?CmN$)^ z(c>HAm=7(!a7a5;dY8c85d1y(GpP9g0O0nweXQ%YI%kL_zqD;K+?KQQ!MX zKu1;~OQd)?$gX;oUq`FD`GnyaY1sN7;>W`KZw34h7dl3nW#b(t(s-rT?`33~<4@Vc zh!bz_l~kxWJAf=m!8PGNDEOEE00@VO7vhb-g4@EDml~a=t>x{53)rphA|zW~qbesw zAW0cg-zGME(YcCa$tLPo@m0aNBE1(lp3 z`2yF=()fM}{swr0_f7bkl4}}O^zry-!f57M^=rn+^U^UOFzqrCorIq$z+t!n!%kA1 zVyCA60Py3bPIT$FEl+FkzsG+Tc*nZh zbym(WqkEpAOpy4$#l8^zp}r#C$MM_Y(n)op*&wmi{5f$H*7ierB_(e#d8+tUQ<7Df z{GjI?ufhKS+ArcZso|Rsh~F2yA8<8q1lyf1FBEt-#wNJZ$&91gYF1M)Sl6Z;DFA{n zubg$BB=Aap&^{VnYQw@7dM}Eu?qe}r$$N37!>&NBiJ1&UB$6XxTLrKj{nNKGc~hO6 z(SBd3B?YTqo=5UaB-Z0GM{tIC&^Tb+Wc1_uQnODLvoc%9y$d-JsK(>`v(}v2bKZ}# z7!LGZ%2j#COwvbhZv;ikIDeQlOnE0idmS-fyfl1f<1OHt`LMQoHZJRjX)vKlzy}@k z%_I=a*6yBC+$)v^3gaC09@I#PV~{&>w=4qkeT5N0ceyuN$pnc10KG@+v$6K2VUe<| zb04!vva0~HY&j@LZhCg5SY(DKy0?rm4Y`i)ap+H_IEi9~=F;q(NRC+~ZbJ^|2e-XR zEwp#0OM588o0QwRe(Sez2VvHRhhd&rS(4k$jS?~>o-%Umxb5_$Sl-@2EclK$ljcG9 zU3uhs6G{X(7VEJ~%glaaj5Y@t&$l#^8)*rO2}C8p3bzfM;Bt8SQ&t^_?xTtV^Vn*C zzHx`Ql#*3PL+MSpxRO)m%89dJ4ACeEPC4SEyak{aGR6pVv;-%ddKz?5c~dpHgzZSf zyl&a*IRoCEv>2u$vB+m_uYs}l@_jK&I?l|AaTtn4KRU#?1bhDgI);0h79b&jwn1mh zWT>VWX-gy!i4=fYk+=e#fOP&~GRh$eLH*bt!S9Mk4;=eZlrcctr5Oj)!*o(-%T@cp590bz1VzkEzBf`3h6M089;4c;D4sb4aG~;i#wA^{ zMth35wlZ9UB3qe)ug(Y<1J~Y%wTb3l142L6GaMHf>^llUWjw$X{*qhP)ct*qa&KHbe9s`s@qItnLsX^amG7UAhm=NNU=D! zxB=9VRmMOx_=}x5`S9SQGc>9&2=^5PQ%uguYhdmdhD89MbMMVs%t{PmVdnn;%S(Q{ zl=t?lT8M_}8U#jmDxZ9|I)XUno=`iXjI3zD+5kl0s{oMM&oW7H!)!=^BQd~!dQ=G< zk_NZ9j|_g}E8q{Wy-g%fZ0Qt4Ow*II`>}(`!1bhaZ*v+v4g_pUyDueJdehKkbHgmJ z_N5+KMGG<$l2@@Gr67pF&*q(upcg`U!Rb+?5Xl+3GA`^Da#-U7+NOzZ*-G0vWWX|( zY@GJT_)|zkfTVFw5rH01JGsjOdQ|fHlKqjcHUb!|ii785#}!#tY1!Bnlg*D|RZe*9 z4Ox!bF#|Lx?ec{_WAdl4`c{z`&Hhw|NQ#MY0}^wA*nLGTR}eoKBlbN*~Wq6R0a#4sS)FWez^{tY! z9g4RIA#X0`7AMTwp$-@yPo-V8hY>OIS=v9ktM|8lH58KrDy8(ON`bI#!NKfm#f!PQ zjU|1EB-*kbPu8@8)TpgVwE&T#=Fq_!ft7R6o~P?o+6nx&d7uc&-@8D0Z$MAITer7% z23b+VIc@7W%BUUcSB}|Wf>)J{sWw@U3hGCvxAd)&xu*M>&i2m`j(bL#8bXsr6q{L3 z)}weyA7^2oDN7`M9leR}D%_uEA>@k<8p(!Yz=kb;xeziec&fK410lEG232Tz`9e(zA-LVSVkCR{kltW3~HDKUJ?Ny>nIed;R>M#lQyVHg3y%N_aNy#^^;YsO$PO3}*LcSh;# zeXFe`(M9Vh($-Nr#pbBxus?{`N8v@0rzs$81{rhE`&TD#coOqzNAkupibgZ*n(8!b zxa^%8TcupbgAY>P;=OFCsN$mEMtM1n`A>KFQF8wPX*RRQE1DWSuIDKGPYcwf8}0ZWS~hUthQ`AutzX?BM75^%Bv#ej%g;oS%1*d z*`jFw0M#zGsZOI$>3K$Guj8s~p<|M4=7G%E0h_jWc^R;&}iwWPRW;2s96Qf!@20&Qt@#W~H#X9Klebx{u2_B*y0i4_bl;xePps77}ywGUssgsV9(0 zyh`E87<`_C(xIQ_Wm6kB&4o%$TpJM>Iv*N1M-?oOh_mE2 z5y>*K>Ftj6%b3J2gh*e_8IWUuF~w&%f|DCzI>%x~%#pNbal$Vk*9Y-H+1*F>c$CIu z9F=cRTJ3J5xOfZ^N;1csE-*c7nfQaH{hLMt&@6=f%vf``y?I%LCn`^r+MJ@dJiJ8l ziQabFTm{^ufQk?EHNWuU{KMiHF3}3aq+!@{$BO4?ySJWKjwuVMd>@;&ZTM#BG%)X7 zimWzn10>g}z<8HOKc`mz01Hp?JY42H*e4$6(smvqiS3o-l(--Tje3!f(y3nS=`oto zcB-(%irrND=e2X12BjNms?5x+6cu6A(rQ;SN*XfXHa_tkMSp!!#=@=+H5Tn3jXEt= zYpIpuo7fGsk*(`Uf%X8zB9U{vgWkU@;w(eNPNMR$^mJ&rVYJ^ydyF@eEM_%wJlP0hi|Nxf zz3|sm7M?4L3z%|`obBUp(08tR+Uv{vTmcAh1G29QPh1bJU(qL%OxG8492d2S`h3Jip=%lHcX^A{HyvR-GogKg1?cMi}fSU6HxFvnBZ z@u=j5o#klcQ5vW2R1BTtuQe*|WW>M@bLIn#dQ!>&TstVi%y{l=i$r$X@bW3n{y0CnP1FD*yc%ycIHbwxhPS)q}rU}+X#B7=55LfQ|{b}0adl6X1VRW}D zUpYI7&H?uJt2Vaw-fPWqBTMCju_HVw^)#m5TXe&W5}?A&Ij4yh-)U&U1Rszb5`V&l z5jhQqOk)#Fu@?!JZN8rL=klagjnD$0Go1SL6(ix*giW+<8Ad!GZYno*C72R$Fu*TL zv`G}(gl-Fb#2f?P+N0SUKEs2M11j|&;ZrKhB*_XN-WI~XI0B)OWYgqZHihGn$ynke z=4^Fip5ErEE0QDZjZKocD(nDGz$KONYY+Zh%ybt!e@|D$nwx z?#RKY<1a91njA)hr+4)<)yZg%SV%4*LfHf4^)$k`XZZ@dU_U;UG=Uuqj~n3zPdGlG zjYi6q(ev{SVXNl+mbfzA$q-1dQHx1DmssQ{}lr}^}%y@|49zF#E_XDGR12g{DY`_f%XVMB7(#hE}X zk&p-;qN?2ZvrE%$e9NhlO`R1F&G>rPC$Ica(rqD`3bz)euj8+#i@C2i8HLq<8Wn@<$rwoRQ@E<;Jk&d4jXvL zE8O<4oPHF1UW|R4Op-?-K-%iVYL8E?d&hmYR%Ps^aIQ#Vxl!7?FB0hX_fWj*R0SC$JfEd;I+CTN!Y7a* zkl`8qE25QeX$^M{RGrTW{jT(@Yu^T4&2tQRk|T`datB)ctMRpj_MRh_3#rLvxM>yR z8$ii875eAi0o|fNtQIo6k2xOSjeb*nZ`0(q@odQ(g)1?60}OQIBig(0Z6xox z&r%JXoQ!|GHxrD1T8c$>a}iVmPBw+m~9 ze@geT@^?ubQ;oGWbZdvVlh05DVOnzmDN}!`7dT?_?48(m#-5HJ`~0~ zde)|kAZ1ikWsD8kX6aRRizR_W#kq>yX@Fw6RBkeTsgPp<-GhfXD7-SVJ8@37pcAS?}z!ZWd#v=I(91_PMejc=3q!X%c-j5sMg30%|^r}kiItv(u zyAG~|<*i@|?X|<(RKQ})%IqVHMLcc7G z31Q10>084OZILcTWQiCn8B4BC@~0T~G<}_z89)rk+noncy#-iUaOE}~$CeA}>r%&V zCR1>X3YFya$o~Ke-WV#A*%IessD?)X!8)KX^8%emtt2+LGEX6$q?Di^Gq!$Sfb-U^ zt*4mA?qwux5ypyeGwW6%)0Q;-;+Bzs-_HPhS7i*QtywR3LpfKBdX(j}D6O*Pa94~D zR;)#BD#pWRLJX)UCpBqdB4lJx$__Sd<-Z?FLYQ!TwhG6PqosPV$|=WWV(|^3j|!JS z=yn{C%hY=sjqRJuOzjLDk`HlK;euCC@qloCeAMY^#5N-XjI$Bb>0MFDT}?SmC5ut& zWv-cUw+%DO%9}>mvB3KJnzIaY$a#eAU%YXgdR3tUtOd5YKr^|s(vT#wf~vqfcLM;9 z+*d?0CCsA)?qu<;E4D!#VbpFQ4aadks${pf5`4HD@s{7(odAhEl06l+p4d7|zlMIp>;4ZSSPoi5@^~ zxyNHxMvrkEPdP(|1Dsc}gyCF9CKptmh7~c&F5Ja-S4RR)ynLYG4|)lF9jbcdWYxVh z!rJD&GF#Z#ODk^4DyN@8(z@L@;75(_j5A$n(!w1c7&!STe)|L7r?}N3cV~`W%*QgXOnX*!!G+^+l5LZ&Gn(&#dR&U;g!KGxGUKAroG8A?ME5MLVDE)w7ZD}O&Mb&0DtM9)||E%4Ip_@&d>)V z3M=C3aZV0}M@~;u+=f|NaZ-xVnmtZ?8>p^UV-$%XC{erSzMS}H@vB6*@T^w)j-o}v zMS}9SFmdX7*UdlJ_E#Gr)FC@_#G8-Gaomc~((z=H8&YN1LByYQ`;Tht$vj(*Lpi}m zniB8ac&-(eVNNbi%^v-%{?Jx1CjBmQ;n(DlkGt>hT!z2#%Uah-ic97@6t-8tYV&Dt zF0W)J;Q;w@g*+~M3P>fnw}IlAq>^peBnk#rmSN+TZ(4Vu9#mZ}3BbC1wKX-hFA>~p zmk%pyjWJQU#UbE*J!>_u7T6hFvjT7!e+@*EZI3ZTRA&GjesvtsG=-G5_2X(N{LOxM zn{oDQnM<9?^FK4)!ekgMB2kQ0k!W7Xp`u9C##bd<)~mI=*TsDO+mx09KC4P#k)&TO zwrv9{dy26XYP$+KMrJ$MkGd=4>f`a4hk3~MVM3KP?x2Mv5bt?1M?eQ(tw`{rOxF{t zyDE*ScV99KPI%lOs(8VSknLqZ#ZcA8HKX105#NKJ^&~cKWFggZ zahUoMPlhOp>~`Ch_09!KVBCzX7D9MCdx}X2t|4VCc9n8419VDRBZ@^>?VRH|BdKQZ z^c6c>lq1b!fN_SPO*ByCd1w@n%v2r1sRvS^X(OAGPI~ds{{TvtqAL9N;#~JxsCBKT1W;@4|^9|T-$2?aou``iMHZ3&kvo{U7xxqnz zKg88Lz4Erv82}vbJq0zU$SeaG(a9%0{iwH+XLUlDBoKFh54~Y2ISg|&l1{4;8x(Vu z?^2*Ig87i4$Whv(4uj-rkxKHwpS&tZo93L0!`#X)f>C1ne^;HwZg z9+d5^1a4agl5z)1nA;t>G42HI-H+0N8Z-XzeAwW7Qso`eE2wiB0kE&sFzN480K|u5 z^uWM4sTeB;$OVYw9jaKZr(&$Q+)jBMA8Mr#xeQjrdoqW1WBbw%<;P44kSJ){HH#QH z$@TT8#u9ks9$SNq0F91)4L(TA5RxGn{xtNFp&v2^3QpjiN1&)= znHDsJW#nlH`3E3lsrIK9P|Ywrg$uVGYU2>Si)D=G%XMHjg6GpUR3I6ONq%FUxIIQ` z9fL?-R(;B&8(RbNq-g@MP^FG=6b{vDn4FM0tHcsy0YefO7|+(4z`D6e%Y3~TgZ}{P zpPdX=+ks~DM3Nokofu=puD;F7Iv;=iOC^b$? z=(3LU{l+`t~2X4evCgMRN&Wr(5(xdy# zrHR3AIN;M<p981Lu0LenWTqQ<<3NP~?$-38PROuoNy(k<;ryQmwGAJN2g(=gUw?C#UnE z1J2>~G{8j*7|8>J#!q@(q#P5xo=F|4amWOWXN>ls2OEkF*cl)W)Bq}gGNXcdr2rq9 z4n+(1l|znr9CV=a;Ik+>10Zqrrj^IA1{m5TKuI_zoHsEWWJc~W>qL83=8*wHaM<;y zGDNOO0dfY=Pg=DRtFd-@Y8pZSW5GQ$=xOof5bYM=cyaCODXN75MPk4VuwLW6DCA^D zQ_LSL9{&JJq=#YfpkFdCIE~|!Jd^$ck~qAq<#Kb!910K2Ho3v+yQXQy)lj)?VB>M< zDWowFNQ52y{Wvr#9H#PIhsg`T$E7$Dha?ZXftp}{HFm3vA8z#Q0O6PxQVzO0LNvnb&b69XQCQLRWqya8wSxGHKDH zh(ra8g(R^es>}z)<|BEM5P85Gc*Q7$avk>)P5{po!z55Tv6pG;p{eY4D>EIS_aDxw zCITE0y~AXZti8JKR_vx$r*1f?p7QI=n2P6P^t;}+YUPM!KO=gBoZ=! zs~9n$Eu3-*?N3LFCfy=%23zLnY69{Bj_e2}M{inBI6|Pva!X(p=tr$mb_B~&7?oL0 zK;?mcK{@G3BF+(Jcn%*sKs|?gi0*z5&CU-!MJuw#T1f+8R}2a5S}nFJ;_qHp%*X>I z3Tr2rg#jdO$Rd&EDJsJ_*_GT5260IpDZDP>o`3q)S?)LI$P0o#az`iHj!8>MqGZtKxRy5B@dn&D1ac}V zE)^8MdXJQP8g;du_NzL@1-y>@<6@KjE4J`g?9K6G#^GN~@XV3LkW7~cU<20#XCH-q zHci0%Rm30eSZPUjv$x)P*sRk7gkQa=m(1Y>)PQeA@kkHT4I> z{{Ywwg^y72&b*F(R(p5`Lwc@ppU`x#Z18XF)m9`e&f}SM3=O z(bF@;(~V5m5UGE5KJ>rK@jg2p$Jh!oaG;!;>(Ka8A zrdSI0Z--y7F14s!$1jdGK@dge)-G~=+aKrFzO>V{Z4%K{?QNpK`=B5c`-#I66#&OV zJ6G*oKjAk8k=@j8h4IgJpDl4){ zFS#EtSL-;Z&sI&pGR=ma1As0q@w>10sFo{jG@Yz+Tjo>JnfAt!0|jlvp%o6Zo7h#C z>+ETo z)}w7D+49HApa1}=ZM5MGC7H=RIX!AiI}1rB5u`cX!|71x6+UL}RXZfFp^C;h!|ox2FKTtJn{*YLHVzJR$K4fWqjJJWiI)TAVtUZtYmKnXFgbiy zKGJPkdeDChovHEXdd{TU<< zsy18@H)n1tDHVXqFu>>sP-@@UCfc_KJSXrI)EbB^ak%sF3H~1DrAc1sPNe15#1dJ{ zFfy3I$KC>upI&rw9$lWCBW3Ffqfr0%RrmbPq=At%ix zH!10kqN~k%>vUci_JtV0=soJBw=+pLB4Tj3ZadXEZe87Cl6|Cg-`=_@(QWEn9IAXK zpZ2_Ny9!_fmSTFKf=rStC3G2ygD^ zu6^pHGa_3`h;~Mxv$HoD^c9O7@@fs|OE8W+kdWh&M|$!lno5N(NITr<_Azt3j)zRu ztfigcxZATEi9f}j`KciBC9S={Rw1^Y06nV;Ej~t(T13Y0mC5J_rCk2Vw6TNCNQv_> z2RX;Mr%yG-D68}os72n$*Mr4VqLXHuUHHfxnw!tnuho9hAZBcr4g4apUI>293^#~A zZylgwHs<&-xW zJ;hcli0GuKDD!!f3>%B*gR?yj8?S})_+_TK^B+`J`J;==!>#kb}wO9@)(%p)k<()bTHa zF6Dya*~E~_kA_cd_N%@j_=l?a%gegfZWc*_#GLY{*1cMfB>IzsO;qpD@}nHb>nc~g zKNBiX3u@-rLp9#mO7pOA!@WnP_&(=ED?NlObkecJVRG2?HFjM>K@f^obG5SAILP#- z+RJ?$k2S^8+Jnq08z-KCk>0#j3?!;ww{y}-qz3YBG`x}6Du(Kt21m7LTx%M%k{HFl z#cUY&sL1scx}L2p1%O~(cpw~_&68C7b-=Z_M_0z=2iCld#~n>RSTlN1X=;rFs81C8 zV^Rw)H@9zWQbP9|{KF|`JoLsYHM5ZtF?A^=zzdGGZr((KKPv+O;|O_jym-;E}?kV z#yf{%<(Zjt(xPi)69}im_g4q46Ixu6yD4Jm3#XnhOg_BG~XUvXa}&clH&HuPc{tcGfD!M3NLB z@-fK!)QYm~F|_EaP71tv-R+uu5TgF^tymv0oxA?$q5l9rwIPi8QObEODcZYnoOi6; z*2a;h(;4=7+=oZlV)KHlc5UNLBz1(Yu1jGi%F4xO)f zYRkc~>DM=D9oWjY#W|3AA8OMN3RR^gIr7^9!q*t8%uS0VKOOFK2kY9ony}=YZ?(-lr+6KJZ}_Rwx8m0!1W@o+gf=7-8R-@AH8q^zv^6jB-l}XyqpXMr#tFGxfJf$Q8Nfc*;_i^o6&ZjE8jg(@Lg4MMf zlN1aP>?LE)2sL$Lv$eF}dvLKa8(qo47_5P=wy$urHMl}!+^-sK%~RC$OT9wnFK;dg zK-gR{!CZAC*0|@0NnH)kO%0oke?+v5N@gQ$m<1oLLOfGF+@)=!ZO(9^#sZI8&W}s6 zf;JJxp;(WRn}$E*TEAquk|w&h(hR`iWx(N2sH~-nscS{pk9oVZPs6?k@u!Kj$@Q%x zQ@4`d5@VXuW&zK-`_^l&rEBI`+{CKGF|xAq2c!)}XSuzOex; z?}m4hq>fy6$?PinPb|sygEKM(*g;<1Dy8rCZ=5cT%8?q6m#HSXT}IfI*yd?nm>Du8 zcYQ>EVPnsEVTHiFE^PYw|}i>-$|_A++1B;Tqu%e=oA2h zumhk2r8zZu?X?KxpG9t)L3IEeXP>1=Z(C7jhI?>NS7jIj+Ou=1_cZakYV7hy# zVv(j%g3S5C`&OiSBr(hO+n+8dk+UQB82?RZ%y!BiIOiQ#-zW^=4FF=;<_y(M3}1C$tuMo5+Z$^3c_<&w&wArHuccrBk*P3 zw{&9F@4V6o``<3s{`cWqvG{+(dL6tcP_zv^a*(Dc7~PM*)2=IT#d-z!k{dYe(+q$a zVi?aHlTx;cq}yrYJ0wf%$l}19oT`#ATL-^hYZ+E+b7)ZPj!CZMww3Low4ZTp(oHbx zPaqFLj8k46b5vtp!<_o+sYrc74a_1MT8 zI9J-B9;b?jUMUszdEavbNbppW!{ofiYjXRxI}@;;{?*r~h9-wbc#_H}gm8>3NB{${ zIHu|LEnzb)tbwD(W69?q)~{S#+)Uf$bA~`T>0Grj6Kv|ILMatAodW80Sen%50|iGM z_Z26Ib<58QY1aw=00_J;pkWL0+3$heny0C2ms)a|-Zn^LOfiW1_pW~9;vK8cEK=Le zbWjf_CLo;pigA>hx-zTDA9twzEj)AL*j{)QtfUzR5cvRS(09dE(|!$H+G>k&;yrZA zt_j;Dgn2;rJo0_(pwnjY8${REdR%2DP81v!K8N0;i@_cv*KP!Qo}$pi&->t=Ks}8w zZqt1T_G(FJ+cfmF_5H{crIvy#B;{9vHU+9`vk@jnF?VFa1O;NG zh{C3tThN9J8<(?+Ul3{#hnp&P3~pR^9jjIpx0V&QiXF3#&GQX|fq~ki{>XqAX)Q}i zkp@|_g>3b}rd}qea*I3&LVyPJ9N>4XoUYD@q>(JV?0gGU5xK2#_8vD1M~ z)pcD)+SyIDydps1aTo!m9{&JJc9-VbFQ0pP8zCE&O7iEuQSldzd_UpV7Z(vm*B1&_ z-C2fn{uM2&jmj}sW|USkUg^`s*DV8idzmwa8R`J(R&+SDJ5LKHo2^D(>7B6I!A$fZ zA6nsuiFHkXNNZ~#zHyM^;!(=`sUCwOv=_toLr#wCTf8@ttK`Y%l`;GA{(985wrrnk z*&P+0t)baVC9%6#cNfCmjH}{!?+!)9ERqa)Ybn0grsS<&uMiWiyr>~ znUj-_`Tqb44~QaZT-aPJ&>;jXrgQ2?rC{7^`W~k$Z!<+doHmkvNi*2{Qq3jv-y5r# zV~Pm55uo{HZpujL4MUT;Jo4ymUR~Pj){{dmm z8iZvhJILq>?V5{9HdDnh)pYx*XN?P`$Z#S|o|{KfDumjUHnX(zU5VYn4;mge_Q<8o z!czWX3!D9F85(%nHa%g57XdvhQsYw8p57bxnnq;WC-l!ueJhu}@uj|vGA+HIo*d*j zIb)_ zSnwx+buC+7irV{HNX^{)-|Z!yG>m%ZsXwK3@aUF`vB7o}xF5PHz#|<9?_C9%k4dpU zRkTC}&y>hF9QOvH)lt$TjvcpoyP3MTf_yRIFA+m;9IdFUxOXxf2R(L<*c~cw6~09IM? z$US+i`Q&fO1hhtmg{^8jEx3b8msbCd*Do(G zy!$I=ara^)1MsY_>Pp4gL0r3dZJ{FDS(Ky}{0WmfZ6qkmjjvrnWoTsm#nh1mkc{9iN8l>%pWtg7Qbmo8%iRXuaX6Wn6ZoD0 z^yyu+G0zUBB+x#_BS^o|rnrG*cw_?wmp%DE{cKaMB9}nZn>Py5O2>ZGA5%o}R$Q=F zM8^!Tc{{U}i%p8g>F!e4dF_rQjC1c>7TyxQ)HK6+1+ljm4o+h@%MWo@B!+vNDK#1I zA~wpUQIbEI2Y;=X+<+H!_ReVFP6^?fpSAK z{KSvpC%sL7s%sKm4Q|jtw~!1536KEv9^SP+p>JhtB186%wlls}ELRK({v3MMJO2O- z>*m?7=eBED)D`k&7;;ZzSY0`4Yi?DcQLf{?)1Ey>BJv(qVBvGm>s6gB=6USql*uAS zH!40ELFh#qX6Wv|&m?h$+IK92=UjSJaqAa0R@eIekEKI)nt4yONYW`eCxsPzBQ1KG z9v;wiyVQa^0B#mMi551@jC+s5tN4Rl@O_%KkiH?Uq#_84_s1aOvL)4~)vwc5(C>e< z<&IA^8WLA&!Oj5cdeyCR&ri6GA5Db3mx@VJ2J-z`fX4$g($pN1j)>RrHoTr0@s5}A z3Usu){>_~yw$ttykv873pI$w4jySHD#(xt$MXBod9yrlr^5E4;H~KWlj!{&SjTtx! z25?7k2hzA-4eJ_GT|;N8cyUVEpq0m)w{wHT5;_l2-;rG|hpy?~E7ZobuITpON0a5e z7S3Z=3;b#cfuO+jv;` zspir&=t#6#5kuPN8B*Y7utC8mp{IDt-$sVwIlL_fVOYp`<-w7EAM={4YoJeQX>a09 z2V9P8S=1}RJVj(la&z+ZBhdPOLr6;6qdD2=atrXj_rv#bKBKM0dt-O|$Yw|0Q1v|I z{ztuOTfUE?*j^>Bj8@`B2HE60ytW-!FHT2l)Y0J4>@_Q!Jx=sN$7SwTBK=(X_WlKu^8%2T&Cr@lqp6V9M^`$wxe*KA-dM%b7KjX3tMyx z=E!&);~W!`2R}|tN8$)|m?o0-E#!efW>;*2H zuXs~bidY*|lCX?f<%cQrPQ%MO`oqN$+l7f+lpuZ99{sAU-XOHI(xv+*lNx6!zBL52oq+h~7b zy6=bW!Z2i(Nud7#TrrMzoQkkKG2!bwxbHQ+MIw;D5HTlk?~hI>l}GT%ae`W*{v)^4 z_5Cg0=HXN;nInKl!+K=*Z+fHQchoeL*=mw`(y<}I<|ZBg01wu+d_#F>WCZqdB3l#- z6|#~@Aax}A)&cREx|lATr^_T$f2+Aw0|(dCsXv`4sY*6m4qU2NJDoR8(yugcw(A#j zJgFw>?jB4RUt#N5jpF?e!WxTQXhnRxf=q4`AfJDH_o_EK*NCsQforPTc~-m_LNr`{oTd6*kd@xa66jd{3ob@casNFq~q?QIdusyCKftl8QN7=w_@La zJmQ%*hdfbvtDO)^_LC#8p9|$!5zns+#dZs%_)|>M?F_JaZxfa?TTA=Kd~m+QjQiEU z8hmr`jNS~j(hr9$Cf6)v!PG<}&JprQnIX$C0FW0r_5-A_x^lRtq*eTj+CD@ zqHK7F#4-3^RQ|-DNVj7=yCl3U0U102?@0R1=B;$PcZc-(B>NfjCYQ_Qxad39mxO#N zWu*AB$Hv!og5j;M#HKA$KQcUyqiOcY9+lGg$HY2C_lmA{y$;ShNUm3Fh>$FMPf!5p zD~-us$n00PrQe0VH}OY+uNv<`yq3=TXiCVTLkZ(?%x#_zZ=o5j`Ss6&{wDB6#-HOa z4UIR%F)=Z^42e$SId7&8I&`l)(QWnr02XQx>0SzoH=fx{&`ozCRO2~P!=GV{@_JTI zso^b0U%Fi@Qt`ltTGXyuA!hL$InT(ej&e`Sj^`e=gsDbO_pz&!N$6PAZeh}`XIw_{ zrcx2+Ze&n+$vsXhEqs1#R%E`0D4GBzwz`RcB!6_)rmOI;#TK3)Xf?%q8Equ;?rhpK z=PZN*H+n8H{{Vdo;52^>YjbOoL$2EGk0oGp#^KzN_;s$zQK2=t%Tjezm5#nYjCYn7 zQ{3t{+miMrL`{KMfA#BIMAWsP5X5zBNz&FLyEY>NS0CQ=`qv+=Xi{s_q*oTXj$k9P z<8PM3j1yPjcGtLKcO-)L4d2b!Uoa(pl8+wm~^$Xh=^(53@ zU>vIzQm638Z|7PE`zulK;%PUtBvaZQ*AW)xMCpwG06MK@b>dAURVgb66GjP*InQx{ z+LOf7*y4 zG5kF_=C*7+RjS|U%cbeMw0BU#!D51U+#y~DMtX1ui8r3+f&^ zxcGvxY8J8p+G}B!RD9s6Bw***^!!GZ$H5z2E5VZZ!u6wABe_@_b(C=ZKqIL7oz`k0<#k;^CNH%1b8DK-xdMh3D#j8shb@h&KA9HwVCN zxl|m0oAPmvI(H(dYFcf#k6>R8>Dokd>XJ-hMNYD&avz?A5Adu101Es^u6zOU`{*7n z@M!xL#6CoZMILpt<0&HNhW8%ho;d7<2*ql0&b*}bAMql`LHiA+q2Ui0TwU1T*vC74 ztxC;jF$Z)mmWcf(h@x5Me);!g_M>el*pD*t-6;cBpde;?t*o(!{wYr)rX|H>8E8vffJO%K} zR`D*I@l)XbgW}5_OH4~^E332*b){V@$`WWd3^Efa4y26iL(b4Eht@1&Tbbk0G`Q`& z$=_nd!a@%!K;w^Z%Dq4KmGEc6Ehoh=>pudlbwQ=c5=kJul*#0~5;)wPqtyZ-0ewC+qu`YZicXIZq=gf^^$})4E*&Q=p(eVS}-@?xw{>Qo( z#9xQM33Qzz_f5Kz(^;ELyfR8Im6|goihtF4m@WVSZIL~(;$9Thj*oY9VQ!I#yqr!7 z2@JsS$EV5%tvXYUNZsg5(df>y%fSBt68<1-_IBPB@T$!f*UX-19!ekto!pI}`*FwR z-+VdnXNtTZe{H4Z$++WF~YEA@p<^09p-x=d0*V{M- zv3%2&x()1Wd_4W3^)G_|02D7gZ{dq;eOBK7-b-8UKIToZ+=f>XvkjyTj#Y;lBXHw( zMxVl8h8{QlslFxMf5Iba3jA~G0j_QvuNQnj)~>agFK4t{Tfej2$qZ$@ zv;>EJxxoE)g;Ff;*qv58(%nd@Xfp;eUtEdEyu?3@Cg;*DoP55>8{3oU{GlS8?EU#}(v1 z3sTZQi#mV9pBBE8rM=z!cGt7&fupxKE%#w?0rIzzv=heW9XPCEJJD`0VL3U*$?9(S zi}qms0MbA$zoB)HjJk*HnedNK(!6P^MSC>SMHSRGtcwWT^F;EC zpBOHDA>-XEQ%ijo>c>@=?J%^8MpelL(bTdPByLhirF`Z4Q+yBcF1hl_UTT8net7 z!>;=k2Bo3qKOS{i^v?|I-wZ8&5MQ^6d?+Q`t?3Xkv+~_W*)G*j$Q*N?LBZpIN2~lG z@sI2;@E=G&v?s&;d&Ku%Db;itt?n)L+vY!EouVrxr;xuWLdWEBkbYd1?Tvr&-@)ED zpH}f*{{Vt@Z6imT$+UY*>8@gx^~MUqB)W|K#5r8e+(nPhHlb0?qI%Ar^v_< zG`7rJosuhWRRC@;yC-q1=TaWq>hE>ctpz22cITS>VEv-?FNi)Qy3;gI5?aJx`4rC$bic1n>kl?JTB3Vyp`);I(Re0 zo&)`!JZhg9t?vH-;V|(wmEudQO>^PayI{#}41Ror&4Jem=C0JiW^kpq#0& z;V*&jFU37iO}@1FrFnNWnnm`dcFhK%Zz~md$CzW>u{4SDu16WIi(dhckN*G}bi0i^ z;f4O0FN`${X!VQ8BbDqXc^y#9vqz68F(nFyR|k=|?+!0#PAX2T(9$i1iJc&-#4Je(*e0C`#CjCjwF?WXZ}gf%4az3+*e z!`==uHj`w@G?q3vX8D=&L?MD-L;2Q3~Z2tg>Ukg4Md_IT7AG0m3wZ@Nf?FYmi zWZ1`W+VjjvcxAVhPmuzbcMKI|V9YlirH)Xk2-LI{&|N4bv^nn*_!HnSfd2qz&jb8+ z{hF>N@E?z^VS@hvRIrlzHe0loCQ&`2Jd7}Kav}2_w(X_nIeEW;;V{5Ax&#UsiY<;itmCgWnRoA*uW;_*Jj`Lh!-U zFHywyi+8AMxQQ8LTYamzMYDg-p|p%`};(AL&rZH zd^PcR;&s=GH9a%ILN@TFt)7}?xYce{viXI!qDtU0g8AIr@CFMJ5BwC5_J#O;@iS1h z)e=7vcxPAhnKa)F>RLROv09|$`In5vR0nOXA=+|W<0PHc++KG` z;Xf8!-nWIM(F*?nXU9B~tJ}@FN07iYsjvb^J4Q*{%6`_r4E4W`-?cWGq}<#~s3Fil zv@RvO)KVv4#eA)yxGfsSss}k6z3V!3RHx5=g#1-pn>*i%Uj#p7580#Oq`$Ld-y1F2 zJXfQOoBse7d8;c?-RvK(qA850& zm6`n6t=zWQz!Eac2*JrulniB2y*iH1Mobz}QN7uV@uT41!w-s@V)&opzrbG+_!@Dg z#U=jDBKF$W(^FM&Atq>oM89_hF`VJJuTJ=H@UF*3_($U3g4$Qa>z@?pT6LM#Ei|nd z3ExwhgFpHcMC6nVb0le=LEs#g^i410AI1-lk$BtoHj}|~TifaEE;TepUmwz_PI z63dH5c+ACCMZrf?^YEjW8$SmA2Ke*gzlgLQ8^*I+>srTwFE8TLto~~!)@<&h+6e#` zfr7{|2qkiGPBKZ(N}9Xc=BdSKjvL{Jg}xK~IM5-!(EJ81V7$=`)7^Og07MgRxGtq4 zNxyfO0Ftg4l>-N#yQkrg+CD!A{>rd;KUA}Z=SS6b`LxYe^3rYEiaJXqyJQ3f!ieKi zNy!~JYV~g)x5J-^F~{Kl032LiczWAF*LV1X!pBmEN$gC6bXRtlOn^%m6EB#O4als- zj402}x|hT61K4~x@n)ak8T7qf)5K{uuc>J|v~Ov4>{TO?A~KbOdKDN@03otT1lJ`u z8q3UX4cnpYH{Z99!aot&X9T0Cc2o<0qUB z#J7`tE%Eff3qCLZ0Bz`+){~)lqr`Xj2GKQmURx%&xRA-UUkkmJwy4eyM<4^owfr*u zojg&Y_&ZFW!P+NWjk#0jU$&2iejIpf z_FB}u6XESX-gY;UJ=OG5!7av*a?G#x2|Tv>cpygKbd_FDB$TCxbv>U~{W6s`2siQ`OYzGA-u};8 zkHwunKN|cn_+6{t>y};~)$NU_xzrQRw-ZL&;#Qktn8U>X0CcA(l{?#Sf_wq-XT^^g z=>Gr=wciwJvFm;w@JdE?&38sgq|_eRt_1R=OPJOufZD-}WgO=?3++0u?FsO!;Lf2p zg?uaETWjg=ucw|3OT^j}MKeJxjOD!M2`qySKvqz|a9M{n%TAObUJ$9WzT4~flUg#I zT8h2xzfbF-{F2}4Pi1K&m&nN!(BpDSM}D9EYNt2ap_(bBO|gUus_F9*J^PBANs2jS zFlnnIMHn)=Ud!eMJr7>z{{XL4Z<%z}YGv)C#UZzXIiyjKG#AS_`uYx)7Kx}_MRJDvCXhtRVVJfSM(nx&06i;0 z{^Bc(*(aI_A@f)y({IYD`gR;r0ucM+k%(sbeqcDl^w?@CBX2RLMJS4aRI41XzG)_s zC3Uc#<~_$dRd^1*-TG6}Af9tF7En=CWxnVgay!vs+*??k5;cjK2(nZG)SkPl3DyEl z+-v5z`B!8A0IMMKYHyMl=eTb@-vFrdIP2+5xVl@(RmemM9#;#rx2eFVWHT}1ns#_C zWOn(oyG8*d^!KY9ZyA~^n3gwOaHAOY#ZPYxu#%T3BVymWBw=!UQ)AMgj`;Zu%vnH? zBa@PUi`t#gSc&aka_7jv5Uhvyoe1_c%a~@lW(;3sSZqdi1KE#`_xA8T^tumFR!<3G-& zYq*hBO{-;P;zHh?IP|Md!W686Un_iWn@0Q$7>~cbN#$*0J49Mt;Z?f~cBQkPD}|Eb zqeujZMC{9wz#gL=DUB=3ZlX3Uk&@ZQI{HnPb)&S!Bzcn?vA@b6cc2ET zFtx~AJ6N7r*_fA*CUB?PoVLPC zhQ+CkFcl?d`8Rj^RmBe4j4?+PD7Ns-<|#>1jf@gI(y)w4DT?7FR8Us{f*ZIazcnI6 z(=tqC5y@^(8?(Jg#t850p4Bw7xU@2xSewXPpj8U*?eAK}D~%!*c#(|o#kt);khTcG z{vTsf!)#%>6Gj=%11d2rPakx93P)>eSxlDMjvp;c25s939H~9cN~p2UH%wD#4H^C% zk=WLeu~sIwj?xIqNgFyk_#yoNpSDf(>EK!`7;j5LLY(mBR@{VK3V z)Fo7pvPl_u{K(oh0IIxy zF+RVA4FdvQ9ob}av6OtM{lWC4NhLFVoT+C20A+i6AEj7^*I@Fr=-M<>xcQHg+3TNd z*6~e&TkU&tw%Uww@&n1YI}g2Cx46{jD-JhYO2uDl?FZcd06K!_PP>}iC8SD{JGSl1 zo#LD#Fk42G%q77;C8I_m02^0_#k&Ql5BWdSxMWUkxAr_dX`z9IZV;3VelISe3f0z)XHI;hC8?+K;YH+ z9QGY68Sdq{xwR_M#GYJd9CrNbREvL=6oFPjFEVHNPfUugSSyxAz+e#-o1NXw8}lqd zWE;`4SdPBl^z19PO@vurb-*~l058hIpCqj}8=)hys_k#R32RVk3mtp6-M7K9H8Bf-iI_?PUH<5kQkQvSe=Y`WA9Fhu^~XjDrL5t}JU`SCG@QJT6V^s9eNX_hGXTzyzM+ zujtUpE}*8uR&X5y{ovdVmE~~c z`7zY4?76ov$EN7Y-H%i7)!RLQji%f;;~BwTD&C=XZPb?xLY@e2YXieKu(X@wak0iW zw+6STlp9kMsyK7^n12m_b7Z)$tYxrDTO;zUMJ`N6#tx;j>f%L`DON`ypxw6=cxpjq z;z+*Gu7NRz2MxNc>oTE|IVG4r1{HwD&^ix#%z|kSryRa!)($w$eC~A!Q|C`sdK9lZ zHu62&M@TLphDfGh8L$;toF97FvX_0!G$0^XA1mkO!Q|IHq2IzRZ0>DCZBHtN*uWZ zf-Azhx$Kb;yYdr_z50q#9MG8F;?dYR=VEsC`clgbLQ=pLE(a4fKpxbBM~34j^fZZW$R9Bs%9YLKi^-m;k@!$}>&`EsT>6z$$y7|OJ4peSeaxQ|5|Vu;pyqxV#cfjw0U)AzK_1#b>U!V-&b&W{D*s z)zju4-v0nv;`MKf5JfA;6v1$vTljI@SD$O&8twG*!SxVXvQ_tT$JBaO62!$ck*sjD zmqXU|?;YFN$u+5-JQ08h&INJ4BKWOjEQ~gwpn*E}sy3b0M9x+DE*Nn9rn7rG#UFGKrkAR~*XV$Y|@g2p)4>Wt0W+Vmo^{n|N zX$r;}@Wh;Fk^cbJr!hN@=t}~*^HlWwD}q%gC#yP?PLo9ORGJ;go+)ILaO#JQ_sx2r zgZ?7@o+ze{>uAOdC^5VIE5j|Wj8?C9XG0uoou`7wIO4Q)t!CoRMwJ>sSw4Y z(zLZf%CB^NqwweAxQfYk-IS4r#R}PAeQW6Ng`XKhm~5tyG)WjHRXI8I_ci&w;LnMz zq`J)|=wZ7mr04RldH8AZl0}scrJUW+_=6IuGr`Z;#KoZOW_i#Er@KHSV4t@s+Np z0<2Q+h{d~WH%7)yc~isAoUV;jqS59502_4olfpL^w^@t`nIgdL+~d7|ResU-k8SY^ z?TA+%VOa6guU~5YfB3_u$*5=}QGpz>$c=ym1s!;=%a7Y1!t-gKHNDgl(HSP((k=k< zkRGGd*Jd79k(B+|9szZC0tQ$lPCoLUpGvDZnMz$J?(*0iaB9f2iaT#MB;Kz4GcVry z)oG%Tsgal!543U9>0a##Ei7@(S&q@JBU{rZ&{+=|_v>DT@c!h-cq3^+=dL>%^Jryp zIEpy1(44clz-;k>U4Mk`WJrOd3n2>ojjik!5w5rI(WF!zy3j5Z+p)_*CvT)>u`9hokKdoWMm@fBnr#VF( z2iCtA@j8$1)Z0DGt=|r!bkg7d0H8FJGZgYR?eD<#?_PW28Do^F6Ed^DUKivr71!L~ zx>$LGm1OzkkYFA=57NB%TGVc}8C`t6ks-p!dY^G$&)MYH)#AFJO_tJr(Y}QXhTS6_ zj8}2oM^zoM^rtGi%&#C^1sGw_@y{N#^{3C0iZGr8#jTACNl(hGD=ypo&+7f@F=sIL<-i z=tXLx$hZ_qiZqLbXCz0Tn;7<~0d{6!!FLQ0!>FjXT^nDuLu}G*&KPhrQ~7YoZMI33 ziy`B<^%bOG*bx--8;?o*_~W-U3 zgdtBXqp#As>Cm|@Rz+y-iaz9#oG;CXIT)pDX$yR=ypNS|Mn4*~V%&x`AS)c4_dc9c zqqULA+A>gOi63-&S6ncSkmgm65F|xr*rcB}SLYmd9=YPI#)Xu|vLHC>M@o_#P-G-4 z0zd#~x3yf3*<*wlQ*cp`WFIm5*R6xgDpglV=c!sTc4ali(xfGoQL?N+r$cVCNU@a& z%19DP(EC-WEru~9qyTv(dY?*gwvfoMx|SHpVz@trdUUd?oXIu0l(7-BDm9vJVJtx8 zVM`vSm2IVbL*^cOl^Cs0?Bh1scj3X@rI+-p7W!~>No62zW4MLL74&!>7_V8i%dzLy z%&Ea%<~rH5sA4O$9vjq(we~wnPuYM9rG9=o)}!fuUqvjZ?wnB;lLgHFU|cj~fOr7c z(&0E)5gBs0rr+dnRm~~2boMh6#Y=-DE`0#N!0l4Ck~)p3qbC?X)vmfKV|4Lu812Sr zhfYY}w~KBi^OtX`%f*|;84hLCP0wj5zXslZc^q*ly& zVx#$vrGVm#jXj=BLc2&KA%{xzp~6Zlna2J`Z!(;nu4l!j!3wi40F1Y$Xj^F>BfR{W z$j7B^$D_79z1z18s2;U7mxZn)3?yDX4?rv5!|GY)k0EBjVup+fAHyo7)yH^BPlTVlMGXB!1+~nl4 zWIsMn`$To9rL&qDe8Ag>Wyf0d9Y5jBy0dJ%fT+&{9Ok_Pz~8e{YmgakB?aC80Fi}E`wL0(-tV$JBHr3rf|xDYm>>0fc>}#_LExQM^r2fvNaP$j z7{z;TxA2Ed@LsN^qe4pMK~4|Wx3oP!K-BFGwxF>rs0me7=nZ`~8-lX>cy&6G=3Yqh zYVjUgh*{ute8x33)qeC}2}2~??{yAEbIp1=xgOK+B)+~zwzhWGzl1k7w_2r01@{3QQ|L& z8tvuo>-(o-?}C`hsPr6G2BR>&x$`6-0zY<#kSp=tI`KyXR|h;U30>b)^o*N^rABN`_Gz$>x{aB6KIJ_M?@It>r5MAE9hA6OuitL{o)TNQiC3 z65R;wDsyT)sKvT~2RY7j>V3^=X%`l8u@gdMA$Vhqdx~6xxsMcVk+G5utVKQSA)?V5bH0kE03HXrt549^y zVghD~vJO#4@-#&&?l8$P+*=`3V~R=OxMVv%RbE38!KY>bFzW2GjfCW{aqUvU6teRi zBoIDedE%fEG^IpiXf)vqOQ#2t7UOTkbSD5tx)%h>-L2`qIde z%*(nU@~Pu#;~w;|#Vh=<{O^G)SH@sM8$ zqK9*3b>@myf*dSJxF;Vo=eB(X6Y8SwEVa`7gox8TpIp`gT{Xq(#8@P1KX}A)J%_C# zOCem!26r8tS3lQg?pGo-8u@M96qKPqbZ4zpZ9*_SsU`VClE5CBs_$~Ea2%uZ0QJYc zHOy}o1SMHm`I*5F>0I)!DHM_$EXuQqqlJ~n45hyCq3(q6vs#uQ95#6?{!Kr5M-ryo zft6Mr{S7bx!{$sf9Ffo*{VOZ6q&=Efb(4%B<`v^3)X@yCW!ToIZtt0gK}>AM42vG; z9f9pn-nQSoX3j{+6-wn;)6xx`amvpI?=yju-l^V&c^OqUXYVTd(dMt14ZD>J+-^O6 zX$!ov9FR8-r@yhP)sm7<Nf&AFzns(5G+~TT?kq4Duj9{3TwtkS4;cqN>FE(n zkO5X7IL>!_RVanVk-3ez4ma{}IuCkzVIeN)az5bCP(3Mr&V)zA?kQW%IW*taC1eA{}+yXOF7@1w-Boe9^{xtLpoV1&JVE3k!Vh5hB%MrbJ6-q6Q z3FNs^CJ6<;@Er{Y%HHs_pS%NbUD(IHNt`H;kgR_0dVAAI5+cChZDK)UK5x&`sX?&V z2_d$sVHcL#I)C-)#1O_gaM>9`zsS-ovMPw!uY9l_N3}Fd1Zo;dHYV&jC-kjVCMP6F z01U=LGqeU=_N8*F<8T3=?(>0)h2~KUd5XJ8Bx9V4XP6Y>RIu6^4_>{+TBerdxulCF z+E)v2g;ige`ihNZLfZ_PAKqS-QcJ+ce8oXHR0oP=mqIlWNi1X+_$?82Si(aF=7$p7nS6k^JkoX<_^|3+fEfsh&jL(+kE&sID2~ zZd!q%b*lM+VVX0Djz^crKBU!2^)VaytV*2lok095nU%tZMj>)}BQ(OygLZdsIt&m$w6iJK%6atCT^2AG|!KiOYjTEbOlEyrR>E+Y$> z8!87lsK}XEwDJYxn=SoW;-Vz9?a+afgw1Cx$ve1RH( z2?4no_5PJ1{q_=3jD6jQtu}RkIKFVa1wuIYG^{HPBw(=I!#DtX_oHbU3P9t5=zZzM zfEz@Bocy5r`cmx~*v-K_;B}yO5l{pMMcM%A{o_bgPFRDSaY~?WFO!~|OLV6dFT;(* z46p+j6vD)Aj0rL(-1MNX20Xq=$R38C>PXKV_6CzGTt&Eg5srd^2vh>cJF>lKE0Dz$ z{J(jPF4DtlGJ-iEcN7pDlB1TuDzxkX;XZ6<453Fn=j%-%50@ZgxisevssuO$oQ>YJ z)XqXkpl;91-3=BP63vaHc26L8qmWCfz{lfC$fa?HTpkGMMJE6bPC?Fb#XDF+Wm!Y> zjPg5*T%JY&AoED98HAgH<*>``>rLLMr{yiqcpWLACRdFxc9Q3UGsQ}vNAnp24Do@} z+Ms}KkVpXlbuG<3r6e?Hm^jHjfc2|e6qzcsU@S|t7C(BGiiPsPIQ|e1L+U*$1a(yo z=v@ncdj!*jgNV0do&h|Mtx)beF`-gimOKoaayZFFe1;e?k^ElXl^U_g%i!mXie1Ef ztBirb#Wi7$Qmp0hz^}^6e}~?ji#tT%Mq6p&)MEoQ#c#SvQ-kT+pA+qWm4Y06!~4V9 zs=x%HJ3!p6!N*#6A#%f>bM)$^{KAYk+Boz10}K4Qwx?C6Ud}QtU>2JaY#1En}51a3Z9h*ot@G% z0077*f={J5{^?Ni6y&;|wO7zNiSBRhC5d6aSsF}yldc9o3aSuBX?_&9ia?+%2*yr5Yp=BM z=9nJ>1&oeBj9}ulrJH$Km79!$rlJ~vw?Al%C}r!B)K}k9y()grlvGzlm6G`*#hhJP zbJde?%t?Ga@xsws;W9ECJcCt!#)y2WcQXO=NJarZ)iiqNo*b4tw(-wOuLh*gC)sBs z0B#OzSgO`{Gjy=-%v7G|$Y|mNIN_LaOlcJ-4DJJ9V>Fk#)ueK)ae8;Lu!>q`=OtR4`h zPg7G_=^%r?LA~?0)KO|w^|6m7o#aClNTfyx|mDI>AF zvSS42b~Mf6sXcyiqxp-aV@}0dvaLg<|B%T!hamQ+X zuZE_Q*{)22CK)3fk}Aq+^Tj8dCU$PX;;&jw95FmYEX3r4Q99C!_Y7q={x_mAtSx-U zKWKU$u?@ui>~x|<(u(xs)#uq-Tn8tv0NN zu@sxUjO&d&7Ti<<2LM!SZXx+x_3w(ks@_5)6NUMR;Cj|nmvRh9Ny#|ID|&8oiC&O*1{k-B~rmi{7|+EX>Onc3HP$Q20Ht}n2+dWi!B zrW1|FwRFP^C_B3y6!6t1Pk(XGDKRNUimYS`c&@)FTOzZ`_*DXE8?WM~_d3Eyw zO8nlvsRXhus?P(3JC7~f)}2g77MyK;k7Esz)SRu{-@Df(5~8Sl}{6#hFUU)!?<7oMDk9x=P zR-veiIW3wp*-_ho4^x`>?8iT;H7bedeGU^VrB2bc*{OfyYbz^o@X3(a%CmEm{Hrfq z*YyZ(&BmK)mLsHxv93StuJWSXPR1cs^fFG^z16+6WS%QbSzy|hA+usRs2V$7trIlf?`#h<{9~_ zgc|*d>Bc+DMpjev6+Dq&F<&;7D$X;Nx}C7X!H z!U9#1mGgoROjpC=v9Ie5-%f|48W)M7A)4aI$rNTtH*Qx4<6>Q3Z0DWEf(e(S{hZ=t*`FqlV(WXagmzm zA-$3*7(@>$2+81kW~PTwk)(K1-K5H46%SKb;c@VT=5O8;=4(T1QrB#u4H8@i3de54 z*EOGUs6#woySynFe6UlFed@iAiKj}Nq>E#>@Dso_Gh0Ck{r=OmWZ-d%>Yg_dHRa@F z;-0Lzruc@-N`a)gwvfjoVn)Xe?@4ju9VYHyIJ|I{01TbGhpDLUHG6GNIU~5W+F3%z zsnZ<+;s(UD(yJ#qPf%$jYiV|n z-Nx6FNTO~J-230*RW&!amN45!RgV7vC}6E+&8(_Mj*>F&Y!91;_NqpE+mj>9e~qh$ z0B~2+-kp5Tk1C8+$X(H*y2Li=x(Uk=#G#S76(!!c3&gV-PBHU8yryFscB~ zLgQ{lLb_@p9$bWgG6R1~v1FlKNhmyZQ{JLDiONY#uVUJ|9S4V_GZ{t()*H(Q%C!|+`CEhW2P&5lc#$@e8mbcc@SU3 z#@$T8WF(a^jE1EN8^st~HW8*khj$=ju6xzVRx4%6BuW^M-i+k`0EJYNcqQ5z_lu&Ru#ZgI$9++v*4pqWnX&A?^#^~ErP7b_{) zry)u0S<0+NpwPEl(iMi+Ex7#8kGe5RueCyXq?5)EImIzo&H3bgxjg5;pcN#rO+2At zO^0XSVZp5Zs(nk<>?=(ig&e3>L6Y6DJ!-MJogJe~X(VS-RH)#4`wFr&DXv*nT*CmO>#=4mgW6fH+ITtp~q&pwYJ6+vt)zo zRxLE8L*&bc+PPI8zO`}W(;%>E8eoDk(|08OY8zh@TD9)WWdv*+vYmbN=~??oz1gaa zAZckf4$^{h7=wn#L0TG|T0yi1-tZ)-`&)Z_vMxD3)z07R7xCM#_H-xAR${83#HOlS zOM7yU{it$7WdR(D&+F9T9#o2Zn%a)96^*~ytYB+{jG2_={XYt#b?3WfhQ`>&0|O)a zpK42IhQi~|1LPlaKK#)+i+`Ak*mldJfHr&AB=Itm(?Hd`vgMwuJ=~8C^i1J^DULSQ zb6Dx(X)Z3Ugv0~4ob4H_5yKMU(nHTs&CWgQRLa95l+=Vs0q4GlS{v#O+}OE}(^kBn%R79+e66q2v+b@fZ5cK} znFAGV<0@CC4QN^DkbhpX(H(8lP~GhEq496A8>rKA;%turnJ+ouXRr&L@>hAE(h9Qe=9Dpv7lux|PlIs?_Ng0P-b`f@HbNrw9jj+b z@U@gTjF)P~iU8_|0DWtDbm^nEZ8|ty7Gh)AaKImbN_L>LTE`Ru2f#a8Wl`7Ox#d#k z@u3)%G>tP!OTQ^%53?r>JAYcgZt`A{Xu3RWypbD|j(zB`(<8o>ATtppV|M-cKTbN- z*H7om3^71tC5R0e>GiCoH*`b7zQgecT`qj?sHKEZMA@SWQq~^XrxDPp#8RCd1q<9c$YX{nDzFl=kTmLbgd=SNL|KQ4#t6gnsj0aWhAjEgq#vT z!meLgM|WtSWx8$qK6VEqjH*Vnu`#UIRSh*3-@v}jMgp9#IG?+ zdv;|f^0@mxY8|n=K(fDXw1Y#Cq-B%AG3ON4JX(joFFnKD8~bgRXdme$C=dMXljNWRVaM z%BQvmdW&0GGWpZeC|zg7mT=s*l>z%hf?H%ml77CGt>K8SuOdsiu2CC1z?+VH4|=Dk zS$K0w3k{{Lh1i@sH$nLItWOYlYvLz~uAVOn-XdFDAD@hM><_O7t*E!|vnM%4YK{Ai zat$_VjpBw#zHqTggS?(bKPt)9{wZ8W(P^4in(+yV3nPvYo|!*d#?ibVeI$#iYTkL4 z2~V5m1Dx_Pj{gAXwRBez*u;FeQ+$!2X28x@(D6!6F?tcrQhr7?#+~B*LfD;8R*KaX z!?Qz@SbKVXD%6@*lwYhY* zx(x~6k0c+Rhp(`xZ@7{`F6}JAk;X&Zm;q$xum<&po(dd z`q+}FaC6Q-tyXO%qSEEmBZX#{XA!Bu{AzR=ZcBy`FnM;nsS&d-20g1L?$XZm#T2TM zHpU1f7%%nudeR+0n?;86=XnVe4$1Dn%AmZKX$lFT`#^=mD=FqKIHh4b7vZ(AS#7PY zT=B$!u6)ysV?BVSztq)L?6n&sYcO)H6ShN+%snzO_|WjZQ{1muH{|vl4DLopIlZZlc(y} zi6*CaJloPN1q*GfW?c>#Z|MvRO2(O6oyz6CW{Ih#Rxh z@aa>(q#-ImWj{Jj;)^5?MiJ&#ByHEqu9dMmUimXNh<&bbMpQq9AJJGk!?KpaV$_q ziwi3(@v-@V_Ms5ni}xNNPYr7@YnpD!W_A)O-_Z5Qr}(epR=eXnnC8{5z*v}k$bbNG z*N&&_T*I%G|zG>UYM&gO6U7N-aiBf9%p~a->XfvWR|FAaR@yp0w2@ z)y&;ZP3;3teP&%oSueNEZxEO4(f#&Pa5Mbz{{YvjcXH@9%9bea1hX+I5I776Q;z)8 zG)rIfDK7MQrHqN1HelHfp#FHSe^R&cHnDU@kD^Z?w~+q**buC8IR5TNYNHFiSu>lA zbVqNjYWgRJ{5YEZ#*mR(xG`^I^6tmq8R`B%rwI?lI~(m{J3kJzmkn$Rq=4sqy>{of z(zEm}B3(+x?@I9&oqscl8xhNJN<))^LZ7Ez+}EX9YC0O|S{{>S;Y(O!(d^dU<%Ts6 zAOjv_db#dN633;8;)RE0e&pk+ z_V%q~PVVf*)oEF3ZE5k#DTh+m{7D*Gh1}1Rv5)t$?}1!zjXon^>e9`mS?lIf-yw%? zS7;}Zj+qs$pmaxu}(mZ>Ub-a=}z-;r1*@r~_&bwB&0QtLBaJ(xH zQJuXsL7T~gBPba!hgDD1)wP5(!yNmSri2ja zcrl#*hp6Mzl31y?q8xCkZq8pzchclrWU@|&HzW*}K7-buHk+

k;^IY?j_jhZ}C# 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⪼Zl?db?OwVCA``G6N779~r1 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%0D+!PeQ02Il~mjhp~eTT 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 -?3ae#FiIQ|k&U4A8TF@#BYR@0 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

dRUoy5GfZH^MutYy!&if`@vB zWFx5Op{{B#iXJENUbPkGlcppqZo)l}7!k-%sr5B9-w(AP6zdmqJcc-JR2|BkmpwszE;F0ppEu%0T2A&$#%H;q5caw6R_4 z%u%Iv1>(E!Vt*EEepGY346LCY9Gs3u2=7?$9!i?rUQd+mFxLX6%#ztyfqot~xUTQLes4Wtg_in28ZnN??)0>=Z(INnEN?Mts) zcr3YxM7P7C^Ch|xb0$VO7~xl^zvWc)+gqJL$1ax|%OCu-lN=}>-nD5$O6du?bu7gu zp?iNGBv|2IPV~<{)oR|`e64dTvh3j_&H*{=Rif4HG+92^9okJI0^vgBgWDhBS-v9i z<+{Z8qEaN55?NFX#(I;sh|`>e1w@2Fn9!zJ79y;r&`6I#CQ6e&l+7U zK>q-%7Yn$m=bRDVvahv$R{0eoh7?5NM-UC(nFp;^w$X3on5C4`$txaE9v9!~T`;2v zYRp|(Na*yfcEHLOMviF5%e4HUxIGP7w$&R{)l&B6)JBj*%#4Z-=NSNxUrI|I4%%oP z*!gz|n?PkCJ7cizS8kz8WVZ6{(bimvRXAlh<%gii=~>F9JLqW`$*n>QU2g8%?7D`k zuKY8Yp)0YQu=gId&fWc{?)_m%N-D8X^0s%d;|IAWx_bqQ$bxC*e=WB#jj(y?(yVxU zLcCk1xRXwaVvbT#=3JgnQR(%mRa9=-T$f^KkewpYFKt@dLpj0;lOaDI#-*~3kf8r`TWd0wmOW^Gu`ra?JNo4Xuz^u;Ah6q2xr8;JrX)Aq-7jUbe zEKA(?{{ZV&e91OwlPqcab;b1CCy!$82$?;-O<&YBI3UwylHN6qRSA|&-+$;k4|K4szEWno^>l^N{KHimtr7mMt7}(A5iJIQl8@AgX z*$yI+2In8tS5q_-d9vyzP2yD>Sw{<4`dypPX(aa&DzfKdvf+pw*V?BZDDt$$f=G#F zBuJ!S8XM-7%T|gVdo9Gk+FKBTj!+cN4}NPR*IT`@x=WXj%KJHHjOXPCrgQ3Q33XZK zkqx|WD@gwUbr0SD0QFXt#)lMoGstJ&@*k8j`F8g>{e_YAr9IA{;rNB+;VaN$F`oYZ^}Q+bJrRuH=eslfKj2>v zMIbtrlam^SjRcrc?rTmh7r?q?+pf&gseGhS@ECU$m34TRvVEQ9$qYVF#}0qHk=WAd zx?K0Rv&gq^3vMeEMTsrzk58>O7dYE zAH(xbl3iU}q@|+r!YX8h>-Zmf-xK&(K!`}XYy#@uF|fO1p1{{DH;Z)*TTr%L0@33; z#Ae(cPaKx@^{mZqTkS^SCASE!vh0~#IdVUxE?G(H^cs?m%TrfX@oU8I9h89@;kRy1 zhtwZTS2G@=9sS>tF1QZ&EF)JXN6`NOI_R{o3{NcZ#c?buti^;yc`M(aN_FHO9MhHK z7V*IpneuK_WTEac-n5LV!$gdw8OdFgPM0ge`?h%zhGi+AyY=<0A0ie8eL~K27{ao~ zHj;z59@UR^;w00fipD#Jn(L7mj~ivrPo)-@+V7TOy3^)X*i2`3cKYYg3L29@xl=lY zIwh5Zz0Jg8In;<_92m#R5sm1Cj9dj9}uXddELk8Fd? zJ5SJb6(zrih|g0Ypt`KNh5-YuTAmeD=@g4*6G9d`nZqiApM4E6jfC1zSQ zp!*_R?bUD0amtxy8Ot8xxi1!9wce~EgUj-EsnEboye&4u~SX4EdFktVBiduibwfmZ&BK$Z3gE50BE?n z-p(^5AI6R7ap^-M#y--QV&D}8AVODZ{^|Fm7wZ&;PbqD5(m?pm)rB^UcFC%?I_9Hdt!?&EG(KMCkPvn;J@eO( z%B0kFStinzCcJ@d(32#7U(QFU$2Es6`L4_6jf%bPK8K3?qknZvoicMYBf6%Ydy0GS8){D#rkJ)63wXp(fszv#Cq2zvwAOU{3uvsPG8l);G>3;#j^eT`&aJD9 zYuR-LjLunAr5_`a`~>#=D`xHC@cpD#Z>KvM+wVz&U%$zp^NJt6WWhF>pL=fCx~wl@ zrXR5;UPZSc1x)8H-I$Y~>r(1AaNSF6+D*AB6Bc-78F~5*x#*#J_vWZyc#6Z$k_1n) zNX>C5J zHW?}b&@I+uhm}95 z^fd%Y9-B9jGT^HG>Q5g-Q+quML5Yfm{6bXW35Ks2-L46TNv+S z3jYAShG3+$dH40l6}tM3t+W!P5TS-d#D-IrQ|X$`(|k)WhFqHql@{(dZJBo$$><5_ zD&r|ViE)bDxO9yx!&Wh)fL-5WDe3F{>dZP-uCpAH&wC6rTj7PUBoYr9!0TM<_|3I@ ziDHt}ZjYE+LN=WC9`yY)#1ZIv%r6v8Ey-+1vS6wM{4JWkNj*sCiE`zy$}P2xx1AC> zX)Z#2<>|L~Pr|e=qPM%Sg)O`{)%GT&WAd`b4 zk8YKTcjFm_+kr!d?w>rVqpYw_-#bYNIl<3*=C5yc9~5hr+EQsU1(I@- z0H9|bfb^~6thF+Gn_4qz7k2M6-tv!=9Ic6PPu|CK?OK;V*>Z<)v(0vLQgYuYjC9Yb z>-kphzu}(_*e$ryG*?^Kw^fxLgAsr$2IoiBETn6jSX}KGx=on~r_(*js8fq&S)^rJ zTR}DWn%o%RCl@O@+^oIGJ&E+~S}oz%x-AMbFPPg}Zb($@IIXV_X!7UUl1I+<^vA7Cs;k)zLD-=UrRrM7vRuZI5s5T@|Yh^;mD(czinXIPr*0Ptk1 zFWt{41o8ORx5S?vFO0P~tu);p*G;pHcg!tU5h*`-qU4nX_9WLkl-*8SY24K)rE@dH zzB@i8QEHY5%^k++A!Gm`^}zM2vfWJTw;F7V6~jnI2|ppnMIN=*{4wwkgZx{j-AyNt zt!(vMMkMK1mZeS1AwlyJQgGPL(zwVYpS-mOm!kMSJz`6JLgdLLt`fjOCej=qzx4in zC{-e~K-8PL#p;?8*m;xPTuZiP8F3 zQ=_y;_*sjBp>x%+euJo!#a

@Qm!9FSPlQu=dmSkT=~wLMo=Q;td~NU+k7*72?|; z*w<)6JGUK(=~XGpak3?7&cEVZpA9@2J12s?Mlb9x8*kgCP~LFt>N0Wk&3WFYV=WZ- zY(PoNK`dmh!a5&w%^HTIr>>di-&rh|@Dt@v6sO87&@Y$M-y@&X5O_b~m&A{ZX5&ln zRlGMV2_M=Q62CD-{1yqEwlUkF{4!I5g*{l@k^Tu92@UE!W(BE7)oUqArDLdsr zMljvLz~K4{<@`mV*kAac{t!)TUANOMODJope(WsY!cVC+>t7EwzZQPW@?88mkHs2R zx2Nk82e`Glf#v%on+lmCB!e5b$_OBgpdbvAcwdV?7T0ZcHq|^u;Wx7ys1oV$M{yIp zfN~$?W3(SbgTWZ$h{`H&u$yvP9*dy-HTZ%1H)}TU@h8JNCyDgSt1@g>`Y|=7^h6D= zj>8Ec1a$}4<0icK;tz|h{7I_ZTIjkx)vlPWwmWN!qajc@3LCyXd*Zr%Gvf8(_;Y3O z=U>vLyMs?sVYj=Nm~;FKo`Ce@)9G2BBwr89qDg(CY0}!o1RPjy4ojSLKdJ6&6-g<3 z!;LGev&;3=jy8wvnwWxiY)$7VJ3u`-uWI-?;CTE|@W)i}mx#P2q=}$mJX)i{iO+v*C873KSE42dE(aL~CJW#h3uN3C3|@|Oxao;%}x1`Q+4o#wfQ7*vHJ@h}VD zHDlr5!u?<3ezgXbrs^+e4f6o43CqjJW6&P|0O8iGc&6IM)5Q9JiZyEl)UA^J4BAc2 z!z$iD8~2cwUQn{+2JMi0SF-$HllEx6@JjfH_H($`JT>;%kltD9H<>nsVzbu+s%tV|JQ}3$cOi&JZ#=T+&O^_B{`Ky^vc7>~rs&$v zt>SHB-R*CnHu&-cyIf-y@{Xyv5w*_*k5NjcMNXeIhh=k_@E^l_ole^CQ1D)(J8EBL zEpetigLoar2k?(?O!lmK^-mo9J@FKJR;hCyoivuO=B3Essp<&mf2V5F_?K;E;J=73 zsr)(AbsJlVXHgkR3dbBv4;jEdENiT?l$J~1iKzi3|!zLT%TX&};kL2oGw zGhm&we5YZ~aK|IxwPEdAw3^V>CeJRF?e+Vyf8yj3ymJ#9SuWV-j1C*~_5T3t)&Bs7 zKN_!m2{h8$FOfB!*}Bs&$|(@`;~@lQ?H^!w{?v{+B3 zTb0CTpDsi!-!S6@H_e`d73TI<5gXyB-?R}H1MLyF3IO`__Z7R8D#p)ZV)~;;;>X4R z02F*@)FsuD(itXV(nG0)`5fn#BOG(k{{TwF_;2A~9osyfAs!vR)vTI99qy@V6Eea{ znKd?FLrxcC8MTd8kMry3;LNdOilxKGp?C;m$zq#bl)@)8&G(YCO*Dt>XUx4|sDx zNt41}JGRxMoa~xtl%%k*P+B=N+!Mj+$n-VZe$AdI_-W&hj@}yZ@5FC|P2xQyTX{N$ zn`e5^-oDX4e*lBXj^x*$YySWrJ|}DU&*BLuxxBlKlDF}(JOP5N-N?p0 zv0iWE&l~ub^`7EQGG-TUqAPfhEZs|I+}92p2&ux&+;f6YO%H&HYiB8IFd{*R^M+1( z{vS$obHd9K*4yOq4D zOp+qtE=~x?13l{9lgDr7r0AO@iz+7MZtsCrW=E4T8AjHOvM@Md{xlBdd$_T(JBxqa z?8^3KJ<0Z}S1CJ0;zoE(vFwgm&kP4o!mXyn=HVJlrdf&m>*@5U%yE}-A1)9!&D|Ha z2cmG63@%{#qYjrAo3qtZ{C@r~w>sLw~bUIB3#anIdJ45Hl6zf!vSq z6%_G4&|#3s(Sq>YDfuvcsSJ+p)6%vJn}Ra;6Xy z+v|$Dl1>(TTT8&LEMaA0GQq13MCx3znbJVIUseq!*))7Vs! z?~H)fa(?zrv&u*d9~})gYg=tb#!G<@oQWpG8l2?x+@g)kL}TRN6mbS=2+2|RN#ud} z)Kgi>Y#!j1-MIP6PFUl;KJX=$WSZy8FgOwbc~Oor@9j+%)=IA~oHr>2o=-Hkefgkh zigbBV-aA=#lpbM>50v&k)dc2C*Bf8#^8MCkT;sPjW@vLZ(;;bH2I$a{y?YO8tX4Z; z-P~Trg`e)q+$lW=xu#MpF)?o2DjR^fMA`Soef@pu<^cq*izp07?;&Bx2b|T3NXkob zcLzhtkC{N=aYetE6ktth<}!xf!STFy`ct|XG?!9ZHKewTBV)QS{aJ?@_7z^{*`5a8 z&4|Y3QN|CUHDWt)XKNX?j%J!AX(cmBzjAiLKAx1uXmjK=suD%{f$yHCnqX6gBlejt z5;oegjm%VXJq=m5F~mRxw+76V4Q?KN#PPgVuom-92_xk`;-3*((XLugm?sqOSlFKGJv_o%2W{?L zd4F{0p{9q1NtNV4=Xe+l0aoXyx3x&(6C2HJ!(kY32VK2S=TyJ8=F?_TsWrN?vHK&e zL*~z|3sJ4fic2DwF@;8uhnKF#9)wc76GbF&O)PBEXZLH>anC=_s-@bzUSr9#crNeJ zPr8o$)L+^=j430r0#hfS8Ud4z27M}%3$j?{YlxVr1}u>wE5QE%XnIs}#WXJ%lFgbk zBW(&WSmUmJDVG;UXo?qToyiAq!jsu}^`vXVJnmjVim@n-Pa|;ZrycmKQb-Y_B9a%( zkP)znB4d&Vq4cB6hG|m5eZEmUnWJ3x_N>_5<5I&iE(ww@>V3^cCET)rip>*a_i}Yy zo}q`OS30oyhc=^jiX}qQ7~P9RzcVU>!5*g-R_be(K?Ije1dQdE10OHFSJpn=62oN` z+Iez5C7vYUliQwiQka_CXWHzgm=IPyqz$9}tkgNS#j6_}Pb2-J35)sUs3=Yo1D40F zBvVOntf_Mn1j?voJBAM={{TGEE}tyYB#ChQ2>YsWQ>B2GLmGt#VC0V7>88ezB(ojn zA1%}{cT*mD9Su$bl?vz#(Ya(O+%P>qDlD`)uI`-M%)!KXjYk1kdWyAapbaU7)Rzw? z4(EuEynB(J)wEMBBAln@N0L=%+;%u0bo^q#Q{`a0g`qeGfjh(ZyMEm26OE(Oc7N~dNyDu1Ok7SOBWJuxS?-1g4v8twl8X~6D1YnZ*$ z+6crD@0H7(VDvxIyPHW{QLv4sw|py-KQ8EDX250~WQ>8&(BZ4W9&N8?e`A=g^1uSq#JTD@VPB23cyhzCE zX)vb%uG}8xl&(~_On1i=C2$_C##HmkB9$e^(yzkuK@`;_@;L*O#V+6oUE`C_9V)gO zV!Q0XAo4m6v?_#Oko6fP)M1!6-Wfd&AZ`h6xZqK7+?k|lT*$+W^aB+5+Xs384t`t@ zyYEmcvldezI3L5_l(AA25^>E`WE{ldgAlB%l5vB;$E_eB9sv1%?$O`WR6YXj_H#tg(5ZwdF-dD^fWY)px9KeKPb;bQF*EfF&~jY$j4t=nQSj4 zA}ESEl#CVR4Ep+4T?{@W5baJaiOMKJARq=!!_XWODnjRe!26q^Rpzzy--jM0)Ltfr z&6p5Wn8EAo(!CeJ{{XU=inYzJJ*FbY>xtQbAbMl1edbT$&lBeJN}U#$cd^e?8A_VH z&myHrl6>dYti!-qF4uYZvN8rk`^p#kTAb9jo}_zMt?{?33Y(85ZYQF--(O zIEhBwoY$=AKMXuEpjz$Hw6%;#zq=`ew0hU>JS*S_KfjpI?mUccbL^pdd!HouBlcYQ zf#L}xx4tF|c~c1Fat~hP^{-v<2keuf!*>;)v-{VLa~#u0fKEB&SGZZ|wsyij(FIa6 zF~BCTtjrZH#9=`DuZ|YKb>aU24R~XR;JGNNOS{zhJZ58$#Y)b6tH|a2J@9+Lz8^4Y zx_*fqXg>DT0a*7vD|*L9wbF?eF=T%lkKq-2%_)bTWMVk!*Xc<;qZ{BxeMwu~4k)F8V^{LZOc$_uF#B=vC*WQ*t-8Y#UU=F*6aY;1t z%7q$6a7GljY8<5AggCFXiJ*Aw&gR>J$r=p&>GQb&^*nT{_HhWM^VNpr zZT|I=_ElZjP1zAa%!)aG)g0jB!SeN zRo^lhi7hSzaJlPDk|^8#Xaj2V&jfmkh|1a*>{{wYX%y_`u1E`>LGAUca=@WPu(I-d znt&vxFD^1MpS*jDu$B?J{_=AmKZbw$)iQeAu1JrxM0q!=CjWO ztu+NPn=D4rsxH{UC%T$+c82NJU4$|>9P>}M zvI^VOV;uk;D^AMEqyS`NvD?jXRH&hu|$kzNyj+NTes6?+I~#uoMN>!`&dzo zV2lCDHFR6q!k%kC&5VT|>z1Y|-p52Ru1f8hw%S~a$V10!wf&v|+{6LzQ^}|x#>pd4 zMh;f0UtS`|=M}(S8=kd-m07b{EIlaN;XR}<5K!YBni6#*W-vd!ipIV1cA02~MJ{l7 z-OuS*(|FKcvo)+nH6uA@=j&aR@OA1dv~s$)yMi^fd#NnloJe*7o!F=&)-2?SZcK{% zhYk&MSAIC2TXd1~%M^z>BMdrzRn6)?K7q9iP8vAyPT+7W*rAoysT*5VbH;^PO7_t2 z^&NV|g-C6-kRv(%y(Bro{Bx|+M|_HpqD$b*&GXNL$1~QUS8o=54?E#8mDjK z7z#0ajieL51de;x9d+VXwNKwkjmInLy2=h``3v*0MZxs@Pt_ucTrrTb-*#e8_`+#Z1_S|kE>A)_ijM1BxmW(u zd!x!=gct;4q4cf?Rn{*qu4jiw9&Q(UGPXkc)EZBTCQG5G>Qge8OqCCjyVAVZo^wmt z%KlxBxZ!1PXhm6l=WG7}2{p7A5MJ227)jhijt{L;kH)sK>I{~#D>}E7 zics&500J7OvPQCwOFOmmkP^}^M>R%aZzQbWXDyyU&VH5U)tus-rPOhZB>mN)YW7mF>#WXhV zvI0-aJBp7{x0u52*2k5}lW4&{m91J%Uid{tD->q2yp4&9^uvg|E= zxd&m$1-TV&>Ma=AiC~{(jM*qT{Og{NT!uHFb(vP(`=*fOk?&2PUow*fcI<;A8~b~T z=Y}?lUS@7i=E`e!_VbA&5tSok%bf95Z!auoyAD`Jhk&R$R%y19-1*`)8^>P9@u+5O zo!I$+!NYd0O1R0%YKZ4-l6`sRxpLc=YV1wR*B$D#7oJqh=SE&bk`p~W#SzY_a1v(5 za1$f%8g=EJwUnk=Wmy}`!n$-;HRV;SQTxe~*yX%s+OIQ~IUB=r2fZT5W3)pv@JTFH zi8!p(mRO+{*DOnhE%J_A>rtfaBqlc~TwrgmS!1lMD;f=P_L5DzWG_xQKT3sKcz4OQ zm~{Yl`qU4pMIEeAp;PG1ZM$z0%r*S80@I^~D zqHb-4p|#$dcw#UQ)7qwUl}pK!X5OVj(Lk#ylo-j&2PBb-o(BlVR#cD^@)ADnREE}U zl5!5shtTBJs~ab@xE8vMfG6=V9E!>u*BXnyg4*fkA|(vKu33wG!mOKBkY$RU=bgM} zr$S(wN3*&H0)s8Ll081Oi5<<$BoW)07Dm7bFwy(gpAN@Drmd*du(2~L`CE6l+-BoA z?rM1S+e0LVSimT9syNC201BQxIK=}Sg=~;_DeeCN*QpMY9^cMumMRAbc>E1%2(_(? z<%-!AcI>z|rqr$!5Hp<9p3FjLGEKlxV~@G@sp7g=ZX>x6?vWb_#&Ed)bu6YCTL}*0 z#1a&OYA2+$E-ON*w`kl6a6ka6s^e~bYFh~;J76)131gftITYZIq|M}?Fz|P`Ks_ou zm5MkqB*zVs0*nx7QB zaC_i>l{6@P(<-|Vs52gLN%!`p^_KS^B17(=P>dR4tQ26cTzVRsML7(z1|WUa7{?y8 zJQpzk0Hw633}bOuT!{hnrCr7`A&@Tq03!faQ>|s7aw#~#RIQOY8bla<&AGD}nlO>7_W|up+x-u(S z(hG%|T!8Elka~S;ytBNMzHgh%+;UWO{5w-;w+(8tK{|z8p13)x_Q)d!D|?OYA^FH0 z`u#+e4q&#A2X5pgXvLRU6~J>q&Y2)4;ZNCRdhZ~pr@ny_o_2pq)1#K z`H#w=^*+B!<(+w2%sG-4Xw2qEd!x0w#OsVz%Ry}|m}{GX8Y$v71aAKTXjXO9Uuv}? zW+UbVzqLsny!K&dxxYsFvE_y3QygZoQWeSO*inQsmqI>P9Y~=hXf1(wotJS@CVt`f zrzna`aWpcn;!2|b0D7xk%>-=EJ<`OAyJc296HwS)2BHh9ush(5_mm%a@y$hLca}0K z*$By7V!h8&ed+o&-HdljEb*~Xkh|X?iYL<`w~=n+-pu5-Rk|%^?{hocn$F>EEuC!< zQ?7=_8ES4Zn*UZlIrR^74xKGst?XU>+MVSwZBEg zs!lVx4?+Gl4T-c_wz7gdDRm3)-7IGWxaGYuRj%&V85B$c#1|#kf_?JZx(UImw{6R)CeGj!I<4+{Q&LwEw&QxPL{HvgC9N9)JV_kp~^90CY>7Mm1mWy*W z>RVYLmO+LAMi`%OK~SX>jTI?93ff(o*vw*ktfEE?n`6iX{{UK^!YSJLUA${Kivdai zLwCNn5wERg>$BU~EE2;g z3L6ZkfZSBJ?R%Q?#WIDZq9{kVPb`MVJml4gtQt2Sb2MZU*xW{HXm8A^x;Rx4y0`;_ z?MrecyxA4pM3~fIfq>$%l(p2Pw9rVcTw2LAmnpbsU{FUn^rjd!8>KK<${s~hN~-b? zY6h(m$K>1Dq_-U{{U#fsXe;1vEzAh z#_V%Z+iBK_pJX=hs9fV>0oUnT-ek6C&P!t|?)}mz`^V7Kzh!{~-CRhpF3rpse8bxn z9?_&fXBPD`;L%rTW`ubS^0@=^tJbLYWrEJq#)tP(F#DshKDeaUb*l|22b8{Pc!P$B z*Y2HK}c*plgZj z?GktsAie~x>*!5c*8E3lscGUizEudAd^S0(o7)TPoh@x*a*r@1$synq=sl|j-@+y~ z@~$p^(C7jZ#DGqF`&8XM$dsg>hK9SWX}Ybcmd92tJPWWae|Qg5k4nY4@V2kw8+Dod zMK;A?78VCCJN|XlTWB`+@sn>Hcqg5Uj%w5}MQ?W%l-O2oOh>E#0D!4eNqeL^a+b0= zOMegBX{=gk*_lQIvvsXoTX`BGXeNvU%4K={>ss?qw~}uyBP6QwjCla}_o|lA$zd@> z`G(xH5uQB-L#Zil#~N{o9n4qoL?cyiEtG-BLscNLnt73KXI3n6<&^1;^{8Q*;kKC> zOZPo#BDF9+Z<#QiSvUrlHIYsztTgQ~-8A-Sfb1KOLICVdU9*mJ2)IkdWmm*|M<{&> zs&|*V4XcZoqKFQE6RCW;$dHIq*Y=2an_9JEW1y+=bP+h)3Gx{df{vQ}uE4dKrq z`U=axQya@~e{Upr5%A2-^5A+@T6ONVZFL5h4dd-xO1DRy$NP=`G?(`tBfn{{?rl`g z2PmjE?e0gtCM(?xTZ@^lUTJ2)P#MCW3gh|oqV6eY)0Y1LPmW+&iSp4&=sxlE6+-4& z#ll?u(%1$fxX1X`wYB8dwsPBxfLcNGMyrBHx1}by#IdZrc(q>KOO$`BQK1 z9w|{|R#@3VSzLb>ImJcf>-wCD1%PiNBl8x>3J+?%XW$`ia~z%^zn*v%e8d6pK|Z6> zhSJ0bHvl4Ik9y6&j^#v=UfCG< z8+S4J{*@#iGmpi0XHV0eBao;VDgXl>)h?yrUl^i!GQw{FUGdKtz`^ZH;rO%k_-@BdbkV)%WRw(w9dDB1=P)h9p0gqAXQE1*7y0eshvU3=a0AZQFbUue2 z>tf?k(&4j?2~k>d?1g>%8qTEq6$tfZOL$_9$V55nPo-Yd9GTiHn3TpqDI)Sg^sMbG zRF-+3(l|`4A8Wn_G5&j1sVrn^V@rAVvp(DpU+Gvq^*SPr8wf3~q$2HFKbV1&kItaK zhA%(t>V?(Lz{$rR{?yZ^-84-iOzNn#e z)uGfht7Ln`RB3v$#n2v<)q#}lZQA9SPjUw(nn1V;K9x=zxTDnLg{~XR^DuV*02ubG z;71H2KjK{e!S!#RR zi&CwqhS+9MgKJ}uI}Vk}Y92Z9Mzt`S-pPV8?InlZKG>-2<Lj+$hKY&)Q;6E z7uAi_TO&hM_>eR!hk2lJBnk?FAOX3>P}II9$*o(>ai>|%@R+9J|_5d)9@wMQYCiw7 zk|&sWEDsDn#;_*wo#Z!ax^y!!d@86xwADrvW^$_t?#_?wvBwjLqKJIkgDA=8`PQfQ z3_5MBcQ*H;S0i=8smK}bJu8!kSJu{Ix}BcJ7~8cmk?4KvUG6TJm>t<7D5cKdzE5oS zr6|cVqcqV4{IFUHn_!hO&M~<;>&<7}N2J{_nW5d2hGQl&M`McEjH5gKp%el}3H~AL z^r%cWww5gvI$}z)NLknXbK0pkk(82biY*=@H^YSvI=63OQp2X&#ReW+NW`l~oSb^r zmDZ~T#j3*uN#?L0b$;j`pUSf)w~`5@d1Ug7?I=~YpTzbQuP3psYI|sN_ z*us2e=O2<^yBU^RMQLuIj*iptY z#Z$EK)z#*jbs1+wi_9Ty*#7Xa@9$T1ZwX!MSCQC32r_-?6Lvmd>sQMN>e-hx<)KFR zSGtlCmXL!PbFjJSKdn-d+fiilfR&X=U<33u*lHdQpG{E}>4(lzM#Nxoo|Q{ixY9J6 zQ07S8x^Gd)IQ=T&QZGb_lpgJz(s*|G5G947nECYd6NH1hnlKY6`P zW+tbpUa6MXO?jdXjpzB|tZ5z*lT?CBiM2O}YhpO$2j=IftsCmdic4d4^&Kf4g~Xxu zN038c=lu4p+gq4*DbiSCLkN(GJhP9^p_9W}Zjo@QCE=E6$@8NPorlz)TGSpT(c`jT z?7akkqp4YTV0o;6i1EP9M5NZnt6j^wZjLS#P98il!zpi>e+r+*6Y2US&^MhNh9C-o z&z5o5Z>@8d7k(g=D@ANj2{@KP%AEUtRPAp@xVXMqFE2vKSNDLPbN+d(_m{kBdo2q$ zH}4=@#D$5Ge|Zpm;A6NPW~f|AHK_y0+6XFKasc!-E}LonkpX*I*tEYRd7O;;jMVYo z>C&f_ZUJ)mmvQ9!)aagrNy~Bok2cw^6e&djGA=kB54}ZobsICo4Wfr$ts3$5tw`+# zp#EK=$i>$Kj07XKEWQ=jmg*yU8YUAgfqj0JH$!oDDAD@dd9q0#WMP|V&!MZfdY+SKZhXs9>{x=1dN4hHl`ZND zCN+dQ?yab#@>nr2vJ?*~rR)mk7;btba4 z4RIs}I4#Eh#Cq2-o+!MGD_k&^H_8IQWqq^lP~GYm7XhtA%p6DZ@z*~}xY28KH(hi+ z77rF%-RaRstzHXQQGyr8%yHEF3gvunr0CO5B=FXvCRt=9N`grPu74WASta{9x03b9 zUzM%obG^rJtyW!D`WegE+%w~cLOI8w_NJ*gyOAo&O3b&X=-P#}lfB*Y#P}JGRXHH{ z0-bYf5=_>KC@w}$3FUqLYAY|d%^M}y5rr9j?YOpohdpU5>~A9{%uw>~`B*nmo(HvC z-%=I23{|;Fl~E8WZ{6dmKGewJ*6uv`buBrekbdx9Z6kUQ;Um-1rn}T)h~w;pNeRnL z7XdzkqnlUMV^>StmT24t1;;I)N;R-)b5lp~g_QBWqkSispl(D)$OF{WcUl&o0-Kuz5r>?<%0OI={-pKdp0mFNb_ZuWe_Va;gfXA&v^34l(+g z>~zgG4K4`nR&kQMT?*u;I-2LG`CjKuC3UfS3n}1YEYPbFh}FkR%++mfZD(el>BI2i zK5(bM9`&!H-p6frv0Os(Avq4GgUv~)L2lZpyG~=qS~9sl{Ps16HKcTM=wU*Qc_tu+ zQM?U}<>#LN07}!*ZR614lF!Kq(gMtzGDqXuoi4K@OuBBEzFRYVilAk_rmH=Mr(_TI zyui6R!i;h2Lz7^lkh-VD+eqa`5+W|a6UP*J0O>#$ zzt*(0!=&1WoBKK^c?RD#z&v{jn)d$T9vN&QXpkMESimDa&O1`FNFCnn<>mNotN9A@ zMAs6@CocT$Y;s9I*18=xTD*qId^LHaqT9utzF8c%a(y|g63(+k6iUf}K>3ajsbSut zHW1s!ZY7YS3~rPjKN?b~n0{n33OONx9sfi`($_sI|*l8nexyX+TLJ zXCM%u9(Q}1$h`3-k!Cg)#Oq%6v(D$9(o{{UOov{amx%-uy7W1!cyD>ZvjHx0Qkl?Se^)*iJ=2ik$x@A^!4>{U> z>v+;h8A_`(FML#PqMgOyeTYXKbnW%5`CDijy|b&9K!N0bbN$>OuN6>2vW@R>6&#U* zyfb@xR)vp;JiE9q<88(^+>vrwUmd~V4|>|ritJ-~Nsg8V@{ymA!w#%}N~tBxc5>`D zXpEp>G0DYk+uQkYywJdKa%2Q#W}ByY8cXY;t50hbt0Lk@&&o0FQOzEsp9ueN9`Q{H@G(7Z9O{NOnqq0^sMTVzU=U&DBUaMtp8P>8#eaX$_N>NVgVP)>FYfPCJ_Eui?9z&KtR`3YSui89+83 z{M4FXgM2&vl_k!ps>dAacSjlJh&`z04pxjC){Pzgeq`=k5W^{m&`<#|o5y|X9- zcbOr|x6_=}JJR}+wf)wdVzw{jsLnEb@H!s#pLgagLd+B}qi%vlJu&EhoPKq1r5CB3 zsx)fC*B5uGD^A!X1u`+m{{X6-*H^klgr`hpx0+Wf@*vLI;`Lo_>fU32V$bHXYzdx5 zJAvs?TI>3>mcg#119;l;!|MqhPO0LF(Uj_!Knw&JIP*Um$kcpC8A%|v zRy=Y`Wr_4PlWxs+P%^XmZb>Bc&1v{|PqLO^w+yYif0&biqu#Yt;}vr^R&#m`ipN>j zt|EWH+k(c;5<0Mqpo*$C>>+JK)LFfiK`ij4A;#jRwptX48^IU|L+l+LJ zmsr&9n%_qY9GS|Ha#Rkd+KazHNh73(z@8Yf@+Q?aC5||Lc2#ei@u#+>sE2Z$if(6tCh15~+j3c;@Egs%70jwt| z#y4)}&`rA}WyyW2y}{G$W)kdNBS<-u*9Wym-VWC_IYyeYxfe1Ike`+#-~RyDUXP^s zcSO=)`&0o5hXx}*%yZm-_3EwcEvRY?AVUJ83_1)h??P*t;;jADbSyf56DfFq;g5y1 zD?hhuS7`Sqh@y;;TkBd@@FtL}7Lfo@WckY|`N8Z@YDgwF=pJU-C>Sy@&hhO+#i+>x zn@ee&rdn2I;XSe1xusT8db4=bj8=%Ps#@u6k8yi483cf~@8R_4)|%E=6W+!xZ44_g z3fGV?BLg@%{BV8ibHf%Eci`S?QL{o$9SY#9cLUa);$IQzdP)d1c2$v>Ap@xT)N{7^ zQCz7jvOOJP1Q*ZMTp^2vANJzei+2mMNp0`?x>{{Twqr9n4&GYXZhqDNb0@ixL{ zFhy*{7CU8#g1d9;>+MwhL96)M<}%UbF6_dPDJ>jeedF6c=Bj9#HMQ2B>0ze{A-9-I z!(ayV&2)3={vfuO%8K1%j!1x$BPC8VjQUlzP7=`*A89qKFf?5^QMS~ZQPy!H%^HT; z%LN?g>s@}CuW9xS%?xg;7aNHAN3R~V{TD{nbo&?~@fMR1iGyUuc1g7KAouN3T-x|= zPm5^3XTWDj&s09=9M&}|dq!@3mOkHB2-yz6z7;{VR}@ z#+D-j&QOuZAp$aY5JAD_h~eE$(K4+V9Y2bERjul`pJLj^Frc`PIZ_8){{TwL((i9B zPy9?4;%ptBTi_PQdd9KTRaq_NO-J#c-Z?p1}OY`Ignf!q(J zZS12;Hb!x%=cw%pT}Iyaf9#DA%B}Mp-~c<|`qbL2GfSngYmc)^h+0u61b$Vkr|Lc) z(;)M#k%X5S@{!!*AaX~bIQA9C>b@Y4#)jfGylAnQ%Pup)?foia7dLxoRHUMbbZLAs z3@@(U-C|rHJcc=3A4A4JooLUfi?t7J9C3+2Xu_P2#EzM)%Wtu18q!O7rhlUOXp+L% zCSXPg{{TGtVyf#Jrkgr>cGl8EZsdeRFDvyTw)R(%m$bBOL#w3sa>!=2ksI!UqlG{1 z3dp$7E?}2+?a$gWfVmkP2lr3EO0h4AJf~}GTjw&k4LNWd3yy$(6-QCle$~25rIh*W zv7}A`BcV0d7__W&PD(_7y3@+YA(7W{!xrP$ZfXd%NUq>(SWy_VlO%xijP%c8PmwatlDVg$OT8- zU+)ikxnpW#5XCg`kkTCQ`L>Sqvfi>zA+@`LSydDkRKouNx&?K5ABS(#%DG!BNF=%^ zCDb>T0O6PG=~+~$qONHQO|vUZ)9!T}^>v0Btz7JAU5GnC>z_|*wtOJcd2`w@a*`1+ zJREjaKj(_+d_&+H9Xn2sQoivlF}laOqJ?mGdhz)2SbCR?wA*WOrs!5vO324DJ^+m4 zlapND)>7E%RO21ZO(#dwt%P?P?w=uhcFnUK0U7VQsq0qO3wtHilSi3GKJHF^MN~iA zT8*>XMS3HObm553eMmIfw5z*g65K&Al+r9_ZTKAY89h0uP2W~lg_(S(v@diL+}fS8 znAhi!@q&HnkEKs@bM`N{Ne|i=hf+fz>O*6#O*D;Qqeqq>F6KP{0HpN{Ph;zfwWm#O zad8f!zcVZCe|&XZb~&NS$Z9tm9*ZIszS!3{2!R#_Cu;%FoYvizjilQu-CQ@ChnZnk zAOc5!N}ApuI#|l7%eEv{>bVs(`W!_0j_y#O-Y+9K>}!@)TRLM)K=A&cd^zSxX(3F< zw0VPZDoF6tGN7JUB^&z&3JDuuQJ9$@veTb>9JU0Fv zo9+H1vt~`ZB!xH!K9!d=Z*xvZV9=!0FD)}Pkr5*7@{0Vx4&tm^d>ipDr)-+s`bf8r z1(>k}vY$*-?R;IKT9b8QV9(@$BMJubj>p=p$>S-mB9e2fm|2q$S`*06rDZ8pPef}N z(`!UuOvY@?Y2jzB&A$I_-(*7cN*MYvaq9IGsm z{Mq(3&+C2`y)#L4(Z89WxDE&&qMTPVT-%CEm0l>fdE%)IQ0cajs8c@BQ;avRd((A$ zZA40J93x!1e5sBJ{5w+VT6M0df)O&RL)G!~DDR(Kb4znRkrcyCi%|0!K4Wll7>?NV z99EpF`WfF%O2@)&sog~^_vEqx=DH>Wt}%h>ihbsjq%GVQnq91m6l9qscl)CplSvJ} zq8II!eqtbVwcO|Q6^%Br2B~`1`lxm`@&j{jkF(7g`=pMejzwH!IWi?E#Tt5Ph8vMR zuA{W0e(vHCkVn7x)AbvxsqY|Z9yv0kxX0>8y=3a1FVO8~aiU!QAcd?VL7^@q%I-P~3=y~RicY&24ZuTEa%6|}ETSnLM zTtOV}jAtHlFbdFujCykdR`U8%GKb<#G)Ac7mZb+3b5q9lZ@wg78`+l|8X;%79fnh!7 zsHn0wce0Q5z;sXm$*c`;#WzAs;`IdbV^e*n3rt15T3idG$-X=)@}+K0>Jnj=215o~3r;Z3-z$ zQw4%Z`7NHAK9#el z2=2_)Ny+=D*R|BX*1mP-QBVS<`sDNj6tCwj%mVpq9wb(Akp93`xSrEbf)eo;5675D z$pCc0{VJYrUP)()?l7SS?aPt}rDJVP`WcOLHMFx$EE^h9e4GF|&m;=zBJl@@r_esh zC8Vi+<>love5gHzV%aRJA7j zri749s_KhlYQ+_RZNzW~*R@09s|#xwBYihhUGRb@5rRNmbtk=IYI=sheQP0$K6u9C z7XgqSm>$(zOz_^htVwYN&GW{dUjdr|vVP~+irO%?t(m!BVk_Nt=gf-E%}9!7+HNA` zE;-3PMQHeUNwV<)7X!o+Eb7F$4pV;9g1*DvlK%j~7ycWSq}5qLWjG%~YUYN9 zHf1*ZB2oLqa6WAI1XGiZv=mdgYO+lY!H(Hq%NSDLW>33&inzKB?zE5um?ADjho_sz ze@u0v_fC%G0JOAZQlGj|azl6Kt!eE9a3fqh8KP~hA|AYF6^oXd8YDg~39pf7x3qW` z1Gmj18rv@8>K92^(By1D7=!DYaj2s72~y`v znB+A700e49^4a HS(Akqz&?tdgs!)^KzP8 z%M|zV?2u;@IWB#MeJPeV&!}A(^s82Ah{U^j$nUgPyo$z3ZJJ&y)gf&}iRWpR$2Smy zs(9&+*s4u!6webzWKa+{2k!yewx-Zymg3qAh5g;6es0o!X9RTj#X8?z&}`9OO*q{v zpPi6^V#jI}l3ER`nbwe`bA7T!3i2n)%t*lg=^ZogRQy886C2$yI&9`dZbks-BfUwk z>Xy=%yVR%h;2lXgWK+{P^z^P*#2zYPrpXgsD@BfF1B2*Cers4lQ)U$>7@ZcMt~1*R zZ*7z-q5arDya%%r=}go$Ybc{@xPvo7ydt+at`|;iX=56Lp|+KeCRWZ=bm?7QgQGS4 zjV0W^b-Xc#lgnNik8fO7(x(XOV;Yi@u}LqZ)oxo)f>|P2BP6VnV3K_@COY<20 z82fuxPO85uG*sGL%+j*(sn?!(THnmn3<}2K)NMnK4&L7N0MT{0EoFP__Yfp|QKJ|U zFzfHlVdxt5#)Q)9_qxQBm6?Q|S=+p4jOVwtCHIXkbr|NB-XIRvJU?Ml#R{DLy_%Vw~RHv2Q~0(JLGF^_$-9| z&ctV&p0&(fdGcH}z1-3=WNe8TsU(h1{{XI?Zw-~qetoUD1zQDj8xB3|c+!gMX6iO} z{vy;oIcuWBePcRL5RV^bM*D{Ylj?nIn7r{$p{m_mq8X-%8y4~u`;109_Qg$M;p1<7 zz9F3iU`4f|Z{qbkdVV#bsOmZ%m>x|Q28@&&rD7XlBkqxo4LHIueb}3FMkm-(WGiyf z0t+j=tM^aW`qjM`La}RkP265d$I8;mNq*S_)6mjtKWNr*cLWiOk&Tw)lyQt_1G%d4 z$8#m3SVeQb=LgT0LAM|5s2vn^`c|)1y@*?#7N4m>;b(&C%GF}Kv~w&Mh`VHr;{$6B zhul?tZ{ii#jc&}MN$(_a=3HFdjle%68@+ngZ~P;EC!S}yxV&F25HxVAoM#-LdbQyl zB--5zn`St79%ZmzpdN5KVz6r{SW9)2?DF8-OfZu%>~YWv^gkTl|1t!E!-9l~k!dVbra3YD0Lk7~r%GySDcEbKfGi^xqBH_?~Bu(r6`?IJ0wR ztO42n$^M)Z6Vy_*baU1-ntzY zk&3BvtnrF`JSX7WM{IE0Z zPf~sBrtzB3GO}p zt4c{mHfD3XdJro>ml7?E$gM6u)Ao#s9Y%10zP&1aGU_-r_;ow9S(N}(N5btt-E4n4 z)zm&7$8n}ZX=kmg!RG=VL5EO#=cxKuqxf^+{qKbIcJUC?EN?A{^5dNb{5An9LGS*1 zQk{Bmh(?s;&PGoWYWl^W*zBTMVJKeVINX4He@cVGM_jg)#c_29lqW9{Xh12RpEX}w z8809VwQH`+>h0RI36eLK>+YRJ=;&r_qgzq@^C zT3lW1lgL-Oh$ab6$33g97B{i!?k?>%2aQ=|kN~c@>MMekMg6R%?cPO@fU=`ulz(*l z3fb_^t@f)My$<_GywqFE31;@P639nvcRtn4QY_UqV<%VFg`Me&3weyc!o{$xdoF6c zU)mEJZA$vsIC=81?BXXKe+t;rw9Cy)Q(YSB+(9czotFu<hL52c zCmU?T7~|a-1p2mm)v3nXAv>mHTl`6vQna|zEPOtw9rrcL#GwP8KQ1bN1Nd@HOIuAV zRJ?~z`%1H=&A>ie=QtzS(c#@6O7R>_>_xUsByr|4LHodZ3f7NR(R4jRElSQ0HApB+ zx6FigBez`Vy(fmXZx?(-@qNF;?}oaaw0e^^@dVC@(=KtdEsTtude-m6+g}pcctq)* zJn*f(h5fwE3wc(C8;CL5RXxGaJY*5aN=Y{FV7l1iJ}rD@w!PQvbo3W9TEiGwWd8tJ zAQj4t)4;|m;sV_?T_=tImvR^Yh4bF{6v0TV)83% ztN2;>%no;h{3o_YuWZ&Hv*Tfnmy#I1ZOJPV!WTVoJ0E`atKoRQ9NcJ6CbN4a7cN>& zqF<0G>yQR=eXE&*EiUB+-Hn~Zc5*3eV=|vJIsPDhtC?G=X){+wOY6(1S63}<6!WkA zOeRdnDxMVX>_4q{dhdh0KcL@@2Is_5&uMb1Wx9-kwTR>a>7JeHmxKN&_?tw~u6!kJ zr$qW~#0n<2x`Z+V{{THycjJOP;B>`cjW1EwHE$|CRUuTAJ48t_sOUf4;}w*jG>ueQ z)_fVi_(S23jkcQ4#SaSVdWL}&%yGT-oSC?_nSN;QL|?|Lz$soy1h7+qUX%Mz{8#X< zvEmOqz|mVxrq3e_IBlX>f;LXj%DgEflZ@n^xvvqD8_RuBtgUAcdVh->fL~KxCxU(t zMXOlNtm{4@`wo~1H#aSlwY!o1-*f3%N(vtHV^R0ik3W(1tw!=lH0u@u>g1$Q%z0T! zpva5GS-@f%z|A88!b*dn59Aw&nK2n-rP1i@tX1<8+cnu z(DhTLY1*&bEgeZ|jF?#u_muU;dY^=THDCDW;q9lu@Az1)9Fn6owY9{pPKPeQh0C2UO(`S z#pZ_|s`m0-OZ)q1Vi}XLLVIJc)C#Mt>V7QvSK@7&M!9=wc(NC{yn`mu=Kqj3kC$ zgkvCv^gXdxv|kwbLsZry*ZfbTTi?L{0J{Fpx|pF4*|NPc+qHRWYr2lVb0L!brMp)m zbd&F%I4AJO=~7wgS2F{3V{j7lZ|+t{{V%2U9H<{e-15;<-0}={*9{PCP{jj{Li|>JZ>BidhuMgm+CE-2$I#S!DUQW9Ie?oZxn(vhW@M0EfImCBKRE^R;2nbC+vE=~g+6S!nxjDe6x&6>Z2 z?jY17pHoYC;(1+BNGeOI>Zj8Hn)ZK&{{R(!9r%{YUkUi`?()`Xtb*EV5X1~pgT`=9 zK_0$_xsQzYGHKcz8Y9DHEvm7(wY*XYWFrDpZoKp>#tw5_kgDM9%DUL){4BQK2iC1T zaiGa%deg+v$pzUZZNTbrk%ss5&(^YEUDkBl`G4UG)E3;$aDLV0{L#&v{FwLtm6hTD z00VfJS=FuP)a|Y$SyVl%rhKUYCjeuH#y?JL(lvhqUtH;5*|*k~F<(b2$g)`sMiaAi z7(K}C&2K5wzN~Ax&3L=xhO4SuTG{xf27zrXS_@zS8Z5=cDw<=S@b3d66xJ)*dg zg}XxemCu(L<9DwHHSrM_8YTyk;lqvX`V;irvMo6yFec|Z2tg-Ht`+pP8j+DPRyavTTO7Jn7(p$ zh(YJ;PmaKgVxG-Ao>a}R)FwLD#;*`B!^}ks3Cy#%|R-8YF2A6+#=@M;9xXNc;`HytvX2VF74&H zT`uW1vqubQ{ILhVJA2Z=6qup4f_9Q++_uvY%n19$_1dG?IQ;0i>>}M5V47&*R%RPr zwhXcCIiOkyenq!v_yy6MI48X}?S9X?{cYZ3AlT8D!Xo!ZuHoPRnvIPn+`) z26OZj?_rAy$RzV-ft6BE-bQ*ix6sr%ibgiDG*G)pSuNP)0qL5ZmuzPBLrDr9u4Bn8 z2c~J4FXRPDq(w>oSjOL&@seq$a27dax(ggI?1`AiaL))Np2PeqDXr&lV7*|o&UV5I zY#_OKDAF!mr{k~wT{9^NQUWdSPz#zndm9%F^sX? zJILV@;xzK4ix^;|fOzXwg`^e=lERLH0sGJncZ2Ks)rPv7^JSE9v`HZf(;OC)j+q>f z@u(-3SBbo&F_s%vCmis3W9?4u0w`ThR`DU;8Jzr=4nPsFdVD&CypfoE-HaHdBaFH3 zPq!5f+^r#&D2MKrGb+ur1$OlH0;;vm*OIc%oUq2#P&ul(MxeX5fx}G{q((OsjermA zeT`bQ(e*D9SxayoyZl|?-8M28hu`I2eFZY(d+Wnz^7JM`Czk)9{eN)30%=d6BM(zR2j(~nV z*Tn5?ZM7D$p4G?NX9Qd`e6W(B?e-P)ejxA@;HuQptIntQqmL%eR&56PZDGvNBM7xE zKuIh}KFJ>ayM{WSUMd+SRgv1%s*fy&EIv|k%YXIiLjq5>87-Bzu>?0zdSn`iTBH$0 zZ1OQdF#VDd5q4%~#}fOFUDQ^5>#O06`53mFa(c_eqMMI=HR z2P91ds}J5Fun+X&t%>4j4r6GW8?x*UM?f>%6&4qn zxWXC0AdK}M)vSA$6iI8SO{ce?Zx|$vusRN;_1&N6R$BBE3oD>I$R=N0e=OAm7k5^r z=Z7+6hlT|U_==w5(kDi?Hj=4mfmW5eG4IFHw~H@Q!!5fyOsKL&DJDXvA5aBGErwEH z#xSjgCz7Mmqqd3&oJ|GLlt#JV&KLdB+|{_>?lZh(cP^Mb_N^6$jQcxl@a0PuhBhwS zhYB<6+|}8v^zBAM<}#?*3mQm3_sRWgEk@eh-p2B7jU90uSs)YK`_;%UE@jziedWar z2Pqep0b!0#N7A*8kyd4SIGIu6GDR2wBOjQ7+db)u4Yt6^mkvln{6AVti6GP^cMT$2 z#+ed^-~;GKT79*P#|PQg=)2>562Ch^?tN=i?lp1iDhJ!R5ZJ*{)RE3TDtO{);`8H$ z$w>&2OMSpSMKQG7sbQJJqcR{lKu5Mf^r>K9vIi#M6?lT~+xL&HXosjtW+Me|0T1_= z&;#D7M`LD_8+nu|e3*i_Q`etLl-^2Qm_?qSJA_+H?RkNN67|nXK z=oZY%*N}lL9x~jIO2qM>fdGwVve;RhbdQW=Uok3jgR@395QfIy_|82j$m^b+eW+o#kZ^O) zJ*YV72h{r15(Ex#ay@9y5A_rQl5jh7ng(&4b?u4(2m!LJPvO>#9Pkeva46@fA4*fu z6W`OV140hn&#f=e;Npyv&pmq59y@iWhjDYaD~{Zpev|>XAOJbkaOOXAoG#d zow|?AabQLqWMt&@rCBzQExYs2dTuuzq~nhC5=p^1KiVsaoir1oNmqt zBaf{)q}_(VR>w}&LqdX~31Gle!b0MlUSZJixMx;E5Kp7o4HFAA!4L&`g zkT74B0UXwSw5ig6m2vlXb5bz2WgB1;I~*ZnmajrI(}}@4vU`)y;u}kl1W}N?bC$;j zq4Q-b(aJ$AzkAZ6lFCQU)eD339CW84*!UwL3}e=`i%_~bryg?3MylB@hT1qRNc^hA zG3`yK13c#){c5Cg##I9bVY>=fu7AR%Tepfb(g4b!mg0wbY-P!5>Wi{m07bl#h9q#x zI@6hC2X7f8jErKl#LC-9l&a?{2UAvI)D~FxO1Z}dGBKLX!L5pEN!^6gK)GQsJ4a0C z6$BcjEh$)#jDT5)``GlTO2;@NBb+%5bKBCUwX^cv2~+?GWgW$7%LN@wT4}p07G|3F zP=rILt1p-`NgRrYO10H3e|IE>n3K!r3~N(NFsp}ruHINMScCKez zl{lrLoT)|G-%<8<>e~|Gfho!DRy>wp-MLfl7o{cCs3G$aS8@Bi@@e*QG~6BBjQuNy zO|^D6B?KS=h*ifOPCC`ANE$~7s#NEIY9)_5o69US!u!>`0KtJp@6>iRl;vpXXF9sv zw`*vzaOH!8&g#>&g;7aW7+^9FQ&5I!0*S~3_dV+MrI9WfoPav_uP&_g)XC4^xnKT4%)_TGNvyha)1=Y^@R^}9F=N9RVv_=p{A zhNrZtB$3fZP~~h}d&`Z@hAyL%f%j;(6dA^KBql zE);Xi9&_zk`iG2KB_dnM)%u){NcvZOJfEHDiKeQ`Uh`*lsd&*$Y~`D3XCQSZvD@N2 z_P2l~&{iC%kYs1j*Ac1svlik=bs`Bp3f3N}` zu%`8AYvNCcX(Eg0*gG*L)dm4S;aN%J)xMX`Sd{}N3}Dxr_>aWft{O;7ki&+Jx_%YT z$>O`a7BWa>A=f!mUhO=i3rd<&c4u`uEvvy@p0liYi%I4qGp5wQ+Weowu=OotOu2+D zyzI=U=3>>vN#gJA8%2@dYcC7yT>Snx)pQ%dbz^X>r!6dU4DBC{ZmHpLu}#bTj+jua z)%j0ApTuc1FWMtJ!(dLsfWDZl{{RtdR#95y-6M77xW~P4*S{4a)U3qXg};>}NOv;h z1$}Fu)O<%R`H}^lWLF;|`U=Ann&D_$*|Vz+g{q*{nb%F?iwN!B)=fq-@tmxi@t%5D zKX>AhaXWc1WQ_dm+~=_s&OMc)&exN(hKyu0lZG_gIi!;ADE4nGzy?<1pIq0@V)K^e z?`nEjd<}Y$+Qt1tSk-LQTwOB_{{VHLBplRI{kr@h7g=-sAn}@qSk+qE87wXtBv9KI zaLFG^mdjMpp4cVB`D_;@v(w(Zx#m%v+P;UPvi7O2=3VTUT7CZjk#y!j`6LoBqOvuQ z3qySI-r3xMOJW%huWGTbc!J6+hPZ|wGb3pQ_+jhpDxRsXLFLE&mx#guROgSvzJC*s zqs;y7zVp$ghHBAD#>&r2`0F2F9YRM+I*dT%5XnR6o+2%E4CMwZU%1X8?il5Uf8ew8V;TQ@TZ zf~am+zG<`0Bxxm>9oqnlXvRIwc$KP2L32Gyrktc&S;E`|itS4b62rJ7y+tL&Ao)_v z5B7p?8= zZdORH=Rv$2I6SY`nQf}TjxDCR3{-IEo-00S+FZEulnx^bF}U~06%d)FxBx<0Uo2pO z@_|`>dTD5^M?7wHRvN4p(*33z^^!Kv%17O(HQjOJiPmQ#Ar9yf4+XQ*x%qCU;UZTq!4@q_^|DwOeQu+$cMNZ2goN5JUiP{G_3VlAccI%CDiWC5fdb-qt4Uu@&{a%Fc-U5RfBg?@>$U+_#b;7-9F2}HL($tz0ugP{!v2dF;?~&Bhr}?Oy|y!A#CS` zz^KHngv&1{o<8+FH0zfELW9FMO6KQGIY!N;eW9}q$c#>Qlagu}tS5xzC@g;RsO?u; z-9nQjOj*F>9Cz#Vq9!jXmT17i11r}R9FUxcXJakd4%jLsJbBSi++|duFw)G}pYiTbq>$A}$km%EXUMcB?bQ zAuk%+hH$?zz&kW&t`&NV7&2jU| z5;Bp2+Z6*^n3yfPk2RO4Rr=QzSh&sD-YAi8Cslaa!$!(CN3?Dp^%Rm!cqb$-4%5(7 zmg{i@=gx&AXOErzPtus{4${UpLce(K>V1BdpSGQq*wPyuQOAaf4&r%Y!{+v>2t1oEDQd(-z@+^S(PM;n#uyltmn+$7@eQ*IY`4f7BOPkOx$n`?B5G_#n(oc*1C z@y`P%AB}O#62U8rWi_~PB>_Qxtl7w^e8^|GFKHT(r1?Oe6!$+`Ni7`$K^rPH%JematI9>FrMWT~yq7K&q$lO=-mAxG+ud1L55Q5LD#F0!7Fk^}jksP4 z{{W3bWQ{@E;C%S`n-v__+(nyj-Gz;qGW2y*gSXzJxI-n%%MuI*IJN~%i2ZpGVaJb>*0$#I9<*BxrWzgQc{+zRd7R2&0X z@?QMn2qlf#Mn*V3>S{~Nu(pZ z$GF8dI2fS_%A-FZe&(AzvriOZBMZMFl$@WfM=O(Y1fEgCDcs6GC>GtWCBg2_i?Y^z^B9bp)-r_S3Ce_2Yst8Ig7&Z@>N&UaMQbmaFBuuiVZ> zM{nXAYil1qK)dJpBVMey^{oACTRKuKLfM*GxjWl91b3-*8VOD@Mfr2>ZdkYX;{}ywt2k{Ef0lQ+8MzgunuJ=W@KPj;5I{yF&^sM>s)PBlRmZe#A1Y4-uX)UHGHpo~U+*0M1}a? z;dleB2R#tD6)yq+BIxE7+(Vx33 zbCc~^^K$M}S19Qg7x04=cVSV+>7pNbTdoQ8sqSMMphI&ASr$wX$K^i$)qCvrx3ede zeFQfQ{{Xx>!hky;dXhEWD+xTk>cA=@aDV-EGOZGoDHLG0WGty06+a+V1CLsD+_wWx zk55Zk9KhuHz=5+pjcLViV9c<2`zK$Uugml`QJOX)Aix(nlhER^bvcUUu*kHFIAZ%& zr8=fp?l)hlteejoSXis1^Sp@>$Y{?G^sOCo#r#QbBaPZA0NSb!0RxQjRjfQEqS)HQ zE~gS~iOF_DkyfP}U6{+7_C`d%5p}s&5NT>vfjdz~VP3_Lb5*q6A5if`mkoP+akaT7 zDNYogoYzk~_;X8*n#8~ZWHE9N1DqPEscRQ)YNJZiRZPo>yo4AY=7lBE5Yzii$)8Ep zyeAsQ&m@Z>%Wplqb*4!@yb-k0UKA&=z+K+>t5Qeejdt+d>WG0OKs=znoN-zA0_W z-MF?#hs=?;AZ#mtbJI14e>K&-l3U3LbBy_soB(@M?R6bbRba;5pil<%1QNsW?^h?& zjti{H5u?LK22a+Zjl1kriMC3x-W;aT(wNRWa4Ou$9IeYTrs07j9!@(7tZvs%CF6l) z0XG#VoKxRav7RvN4#i)X?;wo&`%-O!X>L^)SN8L7nqYF+BGs3EU%%ky_sawe$dAY z8ga=##a3pHXs_TG(~%6ULbLIX{{ZCCc{ZOFyt1OOc#!hXwSO9Hgp$~)9nJ6BS}8We4zt{`u_lpRPt}G<7Bjme(gg$D%7^tb6%v7$sA!>K5X{& z%_i(pD&0$ZEvL9s895{z5;IipHECs$B(x!et|X8sA$aNSQrseGjsE~4A|rJ;${o1w zKl=2#C5XOO8fcAnDPSDrF!lGKok$>wZ{O_Jr!1tOEu7%DaD6LGq-^WAY)Y&52*@YX zBBs-{i-8Nx07B6zE`)O9Jq1G*yx0g}ZNz0!PI=8{=B{X>(jN|uadi}vTil^|!DAWD z5Bnyhvb43H>M!lakzlqvkrqOyKT+4|QGaIY5IGXgk+QZ*md6Lyw50JyjRmk07{-dl#!W08V4%;a#V{3{{`)b&f5rq!;TMv(x^Ks3K*FC|C>_U4>at+^7KPeg3q z_>)i37^EzWdm%V1J$>sBQ1NcLsD~?N^D~@5gSUUT&{n3C;KsRF2B#QjW0jlxr_gh zjL(@dza-%L=CxN(mdX(Yv?wDCS>81po7*+bQ`xtB-07z3C1s&UQSkn$E!mdwOd z^JUIf;6Bv@=~+6maj~+dmZR)Q3%KOOPkMaMHI1{fhI9;h2PM6~3dr$iiO!R695#A}-Jd6L4=fti4Bm=Wn*-1B(<09=19;6$~N zF%eORC+kI@gCSQE>$gnP1#OCQLi%Q{LMwJ)>q=Th8c*Y^nCz}Dw0lKj<7zaVf$9(V z)>ZF~{B5mA5=|^=9l0Yir#R_~y=nFUWyMOq{jd z_&b~T+eQRlfK;>ir^B&ZA2QixRa2R=GOyT<^gd^@4|Y4Ub@J@2)Z4{|bGl)U57XY3 z**yJE>~KP%q(H&XeEZir{x4|{mh*<3^n7uS+e}`8%{uucia0-jH*?oDs?q-dV?UNR3@9P9*wbXyqPw+~wjyl@EL42;X)c60KITj4 zFh?0nm>tVGWst~t&uY7)X_{I}vP~+MXlv6}h3xSBvpe4DxEk)iVCKxD%q zD{#AiQR!83EUs%`_=`=`?i#|<&CX*|vM~n(@#<=jxt*>B@wgH!qX0Ktj&X{P@?9$1 zWy}mi?7)rr!SyuQuA1b794dT~kf43zj=xG=s>O3$+WyY-Z4%=0)O2Nguwh`aERK^z7igWBq z7mICdwFD*!WMpP38aNw|Z1v;4M0IUXRA!See!;9m?+vNsp38_)z+WsRDV{ zksiFZ@-glzu9-X*mun(KBrJNjJt|qhw6z@EeUalwBq=xwPo_IkvKo`Nf?2iOJk5JE zN9K*COsA>u^{2_ESS)KT#LQHkr3)NppKqpJSvt=wD>{$7vUjU?-WCi@R<_a+BNi%h zaL1GMp~@(w8Ow5mYLi%vmJ#M)a6$~=Qrb4Zdz-YDXkH_jaymD0k6(J!v(xMz+2evH zisloOlfm{ir5r0PLUO2^M%CH(MmryRnN;OPMw@KRw$WbB(8YaiDkPu9DIk{Xf@?xO zA#LE@2vseD+lF@z*!HVeS60@jw$})fyD#pZRwYoLymvfxq|^14)NGp9$pxc)<%Ssc z!k-sZt|aE4!Gm(#7K)or381# z6Y7UcXNE1q%}+7~Bd;Bgy=3d&Hknc>BWwl#09k{AUmXolz18pa7>1!DqDqbyQdb89 zjs;}RqpjV;$#--_XOwJx-~PR68f$i8I?d>d_Zq&Xe(XXPQkh5F%AZfIMQr7TQ>!x%Ks~x(@&}3FqBSxO3&? z5DNGD)QjP5BGM+47;_gAKPpe4^fi~arnWWuwMKGtXmeXQnBECN=S@zx7eU?aRm)&Ag*^wawRATy$74LHsog6m zKXFqG22URKjMsYEonzB<`Alv|G8OylLa5{?PnSX{G>uZ?F>fjPWn!wEIAQK;7;G)p z;#(WHLppKg58bESN1G+)!U4@m6q;ipYB7z1F z9sRM=v@LZVHf=#Ju5M#Uph2|AoH~v%$5UMMuO+dxXhQm#UJ>v01=M< zx&Htf*1giS`*M@CGKL4BY-PKjrAw~-N7Ho+nBdYaOo({dZHzA+8`8NC5qO7Louxq> zkwpAE$a<039^Z#r#tN-jURoQ6$3-g4%toLaYfglY%|?so?PSu9X9e8{;a< z3wf_0I~&-Vvb%bU|sO-X!x}!DBSh#~x?cG61XgHc?3u$kvV^ zm2y^J;y#rWzY;~IuaRpCM2v7_3O5is0(;gEh`uXYLxi14EuWSm2bSLS{hOVvCsGmJ zn_B(epBVBRPux`T97G1kp{mO{jhbmE1=j$^-+D3FAMvk0K0UcNk>BZ=ZzafdlxHKp zbJzLNcj6syTt;x~V$0(H0JPq;lUXdWHxfcX0a$c(J-zD1%uwojPx>vo zpFPNr9YYSk{<@AGGsC)No83zzPW+XD8?UjZeZC0Q(7^2;z{(T&AGjakL-H1{a$P6E z_cO--0NN*cVu zlv(Mc%TjXu@aOtfdr2j@{{Tjje{^30P%(o=GVFztXDBb|AVRYqMtHW<)qrf5N&5G>GAhNhPxYcm(I${2&SGCaX%%5ZvGOEhbB|0>Z)2xVVLhbK zE2iSVnP2_?o7Ab7ZK!QnQKhlK=q5Db8 z(8jpab?stTv$26)VLQ>JIU&6>QpaMtM9F)pLXOJVcuxkjV(~V;q5k-Nm2I5ub!f+# zgWP*pF|TX>eZh8rI%yo?j|1}bt>GC5uDN^R4~i&9vcU4VFxG9@MF%g^j0ae8!E4*x>Q%J?lkAn$?)P z@{+PIH;HZy!dvN9=2M*Vau}cRsy3H5i#n^TM2R~)pyz&i53YLDB5Ar<(r&QQBj-V9){gvz~|6 zvUrshp{m2VJF_QB@D!72?6>~_E5vt+0+l2l*zZnRE^b+RLLOZ=aoLypQ`*tw!2duj*`KM#P1OsK=lKybE>$BJ&uoOLMuZm@4$Lo z7ioP4rEjnjCP|fvQP(4|tve4Bcwa|N`YxE$xZ$Q)`wrC27S4TEU$km585LKOKJGgT z)`v&aV6`^4s7zZ+D2wIq(D79&t7&Qxr_~j7?NRl)rIJl1O9+_!kxE8S<aY`nBkLg+3m6wYzB55^~%x(MarvL(ePz7wT z+|S-Ic!ZUrj`HKgl1&hcPr4EjxU^w_F#tbW^PN*xzSZvq+>pqkDGMxH$b4tNudPQe znItztE8Dq8%mk9F{p9o>;;vm>POy}4u|W|307qw0x%(b_``1k>H0ifv3DuPM7W-V( zW3x9irojIIEI1s4jhh$hf;%^(mF2U+*s% z@5O4}_>WeW2e#5CSkg$!zbFx z`rf%DR(>DSwmZfMj$kv$?ewi1e*?a&ZrX;ws?96^0Lxoo=WBZprBbA!zJ&W%KZKuL z@s^8ZKFg*|v$IA7Pv&j~$lw~qE39ibaos(cf)M)_<$5XpAbsnmvG8|=G>BSTyNH|0 zQRP4f&aG6Y)%1vN;nVHm-tm(t3Vu+>jz_IhYoMg0^^+SFo}H@OL~pGb1VrLMa2-z= zAa%_;4L3!#WRguS=8YuS(K7+F(X;((t@nte)NUo6?FF%q0EpM+3^?F+^{VsDe);|K z7AuE9zkE??F*!vWE31eaYilh5M#bKxf|3XIHCF!s#CK2RMqH*?<$&qOLs^n+y}5f? zBxqU)mPs7B0YNw!#ZX;a%4Z386u==3BLT4D*ilECw5EvW5jAWE=JzD;lF__Jl-Kt2deQqP`1`=N_K*J6V0T(#%c~ zq?7k}87uhK)=3d|%{$)_#cy}#Owr4+M%bX{Pi$thZ|&~y?F5XgZuu_O@+TmE9Zg)* zw7X3*b=2-7SBT6P%p;yY@IT{Qb7_{c4>|-sNtEG9&p7Ft&Q&1?p`>9cBa_oKD+}h5 z&hBX*NmO}r+kCAV&rWK^{)Ks`+Z&1Or!XKY*^eYIbC2_y--k`R(ls=_v9mI4P-cwa zkPm;tt!kF*eKJn>1+C>DI&{Duw4Nhf2B<3-7Ty}aNrm(RL$Mdi2^SoXy;IwGM(0qK zZ9yvm!CbE{{l=~VSCKTx>1k_3W1_X^R-%)BaR?w{#VXVfmYM@Osannssm zmh(*aFTiy&lY@?jJ?ojhxL7V^-Dt_YfDw~|M?h-+pP(5SE+x2O*XJam{A*S(2hADt zHA5tEvxV~|7*2WseQH$U4cT0>p2iKm#i-Oi-EQpjtYds%!W4T|>&dP)9X3b0wK7II zZL8ECFh_dmPlNQ$HU^d(GRhQ)WZjL&`=r#GEzC9uBW*maq@Od*P|LU4q0~=el_s|{ zw4VV>b$ZgxJd(g89$0MTG34{;E1-W3X?kUfS=rk(a-lCNcFuF@Q)(U~XBOIQa262~ z@yiej0V5xsWnW!NUMZ!REMyZQ{xW`@g=XbBy-k#16`^ZPxzp{~-3J9g!Ppv2OGfJdsiiGp<2sy-)xfM6%U&bSqR)oi62J=tvpuTd_+$fFErE_s4)3jAOB?_r4_X)OV^|$w!V5lAt-u9^`iV(}kn5xJvJK zRMUwwM=0F5KQ})s`&HM}?QCx2{mC)`kb?)4-|1Pl+Qyl1@*>qCZcNMCD5JK}{7Gk{#)~z;XoHg^U~;7Mk?-wP_04}%@e;|Y zTr76*pguukhF~}g#c;MhAz9fZbz)CztvzopB6;BPGbgu!t6rduOF}!h^BJD(O2N4d;k;eLe^+8tD}T zLvRiEiSA8vcgy38Y2=U}-blfbl00vZv0taXSF#c66AAT3D=e8Yp?-q4Qu^-vEv=Q} zkrIWOq+Yyq2dE!P*+MYb&CXR8=QAaqt1h6oS4FeVrNEtos#|f2>j1`%-lkg&J*2<_)KU zE;Xx#)Th1k)Tt38DFh7Wwo}4!X;z3$%rPrxTLaS{gM~3cq zcNNz7YeLerTSyPu7T{oqRpaoir&g6X*=k%VRGYgw(ct+YlkFG!gtrm67yytqp5E1S zL->CjPc+u@vxZ-mHsc_6_de#gC-ZOjI6)aX2?-e>dhynsCy6cei*&TV)GbxEkQ5E4 zb#uzJIy1;gV@{nJ1PNf&z@C3EWONeE0PK z0P9xt14_|WNR7(K5rGBMkUQ?I?R&;rC4{E!AI(wsaNl?z!myoswX}-R-V~|QS8U$2 zdD`6DX|h?ws-$^O9!`BvxvcF{`p(KVo;W<6>^$&?3MB4FrhPhBEdD*yRx>JYm9j&9 zoc`8&L&?j!FQs`J)>@+V`y19%_SVQWO9;Z3DpP1Ak-=s3 zBqt!rC=rlox|l_PJMa8o=5BzLZx zNATr^toHHTv(F?)YC=yh{?2{4{VS!mwzJYCW`a0#Fe@VM1*J~CeZ6{$qET$jdptHJy88uDu z+@U`xkbt~*9jdvx()3nqiSsK;hYKg%9)hr^*RC#Q5rq*nPqtNKxUzK59qHCq^NEDg zUEu>BWnI8~dsV77)sX7l*&24Ui;F2PqKpw3Djs-h_M3DPJXUU>Ow7~=w^ zxVW`Q(3{mWOY+SGNbQCK^4c(EogAXx7 z8+i+2IS9#9pPP>SRr_s0ZbIoz7)4hS$2UM57{hzitEV!i*`SmNqTK|9{qvk0p5m!X zqw2bPNULcfW>X}6KU3*SQcR?pHm{N|5b4rKeIuESe=4{nupDvdDxHwWYXJ0m4eSjHY*tgPWK?;$?M$ax-A1-u+r@1 zh1Fo0$wr-qP^jof8Rzt@VH(dhtdfw@N=^bER1aR&n|~Igev=DZfU&RK2)mEDAK_BH z?F}zuTf};fpKeM;EUhD`53Cw9J!B;;0%}He~jCMq}{Q zGQ6l&RI0JCSleJh!h#TupZgQQsb zlA;p3SOFR7^A6^@$R+V!sjsveU8CU&l1FTu?LNOs*V23`e;ki4sJNa-++vIzanv7S zT@j@UaXFny)L}lKs@}~V{IfX|e6sHcX&`fj>?)?4;cY=RZI?5&(7KT!E5Ofe9+lI; zmzMB^yj0s9gxf|2S-!rwt5ICehcU+=nj9AMKngN{Owi`ivJYmStj~QO-q&K!6G&nJ z#z$l8`BsLUv!r1Jn~S;mA{gD=15@gHRh+jGqe|asXWtQ5J0l=;Y*V6&&fPrAyV%13 zStE}lc^$#@tlXP4QM1rdtIMEHvI}XKf@Q-J7e4-@(ytvaQ65zG7gEk9VlJ)bV&PDX zgPzo}-q_q|GJj|~#%0JcvklvQLG4lLGHN!rGFoX;xsF?L`?l)9dLK$o<1~CU+E#<& zOMBlC_+R@*&d6`N(;4>tsuD0%W1;jtK?A2zq2j+1_-{|~R5!m4^hL9<3TB4Eq4O3U z+>pfNoE|^JwOdQOE0Gje0LLmeWRaUCSD;=y)_$pZ9+|2^Bnn(R5X!w&4oB9rN==or zJB=H{UIg*&q13flj-7Oo?sbi^_LuAjp!WX&3gxw(E*%Q~YdDO118qg}_U-iqe_E}g zYhT+}@LK9)%2?(N8?>N0`tU1LR2EvD{FdidTZy3|_7F+ra2V23oMe+9Dr)HGm86}X z7P%ui2(6Iv`wu}?@9niycp=iQ{F%xE>2fo>1DuZk09w6yr`%dGTbUL~oSpKh3S(}- z4#0H9UC{hd_E++n+8d`3?0M!;e6j3JZOx&VE!~+{!x~1rd3`pg8H(E4C0(jh??3Sj z`}VHOz}hE=b*Z0A)!NqFt1J2U69hoazy!~!Byn7&?xgoJ$L2YSTa+r>LlNi&Np-Gh zN{S=5V>HdMv6Bj`j$0nQRx?hbv2o>z*!ZWxmg%p-rLL<4A)_peW%*+m`=pL52I>tb zKxu5_)Bw1RH+hl1RzTjL;nY_;*H;?Nk(wPr;AmZz7@3I^0mkh0{3^AEop>+dj&@{? zxt>sSxqSzrqMaUIqm@p^y}Xw$jUq>La?HeA?TEWRI*blZ26?Ay7W%XZ`hD(=cLlLg zh~$W_-1j6>x?bp$+jxgT)Nd@OwQ)7Q)Nk`!l{pM^$5Gr6d+=*h#s2^kJZ0mMPN}R~ z%`Mse=h@@Hb_1#O{#8jnW!N=ndBl8dY-jgRkqf(wvN|UTd1-? zfLbOz!Rg0;@T(R+7SuHh@3maaR^@)+E0x>nUWMRK5Xay(j_*v8E72U@W5sbE?WY{z z^#?ucS0xqh?q;DUxy;Y-k|(r2Akp<3mHRv)!b%R+VU5b`$0wX0TvqSHZ9hm>w3AS_ ziq7&0*@fAVg*oY!?moZLv;0xm|r-~(rEyTq6+zx*~TIh5Oy;8tWqhHSPlWuS!VinxYr(ygmSEzK1m%geSVeLX)WRF8#5J-wDUMpt{FLuJISk+Nm8o@M& zU&S5$q6k~oX zZDEdZF@x>+3{`gzgxA?8x#bPvh!WZKm%deaq4On@ISE2ZBVM!CG$&zk zYQjj4L0$cc&r_e}SzaixPYHOPF0ZXpdpm|EYekTwGiQ>g-=EXcx_=tpd@R#6rPe$F zrCq}n&AOTGuWpOAw8e=gGI`oT93GfB_O|6UZshXDI`%faOYw(7ztkE}6Zldgt0Vc% zs3NK)y_*U<@-j#Dt{38e#8_^xqKe{QGARHn89g}rr?9M@GvgkqeWJgHBhX{Ii6?RA zOB(Kola0#VK_jo>>Bl$X4JPL5+HFS0RGM36^BM+_lH;jE{oXtF>svyXEBDOhH6`vF zOXC|mNxaQ27i+*b%^vLetJr%A>wG7!+uqnW+OOb|FZYYfM{*~LRO6A3fcNRhuGY`? zX#Jk%_+h8~Rrq=0{Z9Gk(apuymwgYHJ*CJWGB!^t4tW5BjtLysnd(|jlNGJLwV{~S z@?5Rb=LJWlE7PfbE6)*$@nZeRG}(?d^lQ;n zy_{V~w5_;z<|XZddJeTMHL*&~+?054#eO25C>KDvfK3r=b9oluJOR`XO!W1vJv&1Z z%u+!pp5Ea3w*FxXNaF|Fy?dX4ek|PRe+i}VUyZa~J6MGbYoO|^Pur|}6j?LMbOavR z&U2CGGwGL>`qkCV;-%pXSj7$&O^2L&Fsp%xSb$3O!9KO>FW}#YeiHDaMRH#B z&9xLjd9;0?lbmu-@*eyWsD~P7laC2o$r*|V3gSE#a&j2*aqV4KhrS$Y7Vv*)>bH_C z5+B^$gv>+_;r#garpKjd=&d!K%$Ct9W`=2;lFgon>sP!r6gsjW4c+*z9Vz#Rg|9;` zyw1({cMR<$2uH%v^8<^UBfs@f&JddYp+VIbaJWZt8{i+X}_u$A!r=@XzF4cTM(FnAam~W6q zEuUC}5jZfkfX=S77@F$U$o#nf2*C!uyAHm1*b zz8Uc@t6}1ghgR*UTp{!H=aiPy*;J^JI45_g1bX$wa{mAeyd$OfkH*%%5b-CDX7Hx9 zs81EPk$tEu8(E(xFwQ|6GtR~&VSya(#dZGx89oj8>)}?R{gdJ=`%B_yP<0I|VI(&Z zvW8g^`}36`_fyn!Ny^T{NaK7~v1*<@k4VxkZR{5EM2go{l|e<%-A5y)dIER^;MVVr zJ{s$P4fO=mbsPOVQk=vLx`vH&=Gw}PGOmr^Is6VsAY}7#>#5Ng~A|fh~DG|5vc$INy$FLu%@TP$z{~i z<4L=fE}d0mx0MDYBkyE(2D(iX#(n|1vYqu$2SsP9?Z?|~4nAUd80&+Ie)JZq$Q8@$+FgtiCG^(&XF^|aJjf5J>?=Mw?Wcpzzb^y|NZdcx2JQ6v(wre6N%cOY z@TZ6L?;PFFp?n-MX~RmFYuIYc5$>42*JwZ41odDECpaCkelh$S@sEOT?kApkbnAm0 za!;pTZruSRh8*J!?Z$KOTtDpTrF=@!JZGi&y{&J`h+QmfwMb;Q7f}*HmKjL>_QJS3 zN!m!s;}!0o5dJOSyk|)LptN~@@eN2xlq+(QQnSRO;Fk&*^`@CmOPU%Q*LPg0dn zdeJ^qyS(uv@!VWp+Zm#VciNdo*N!lMi`aVlR<)mx?tC&<;NIT|)-Yo7Nh-&#cdzPO*+)PQEquw z5`T0ucqg~gy#-pGN^MDP+*Y%^S@4zKl^J6YllM%)RHGcD_c`rV?(d+45mXCb+K2{Fc_bW&SLC;a|?_33y+gV(jJAxs3 z5Ew&p7#{W1Xwuvyesq@EcKJ|;7##3UX(rP$s|6)f7|>$}u?R;{(g z%nW1_F6CSjtMZ{0&FQxg$r42?<)v~SWnwUK&;i=EBDnp?8wm5%sJBsstN$$WMa>=E8P9uHcP z?V~cy1<+uN2q-yH=hNPxwc8|dt-KP4W?&NF{=h$!^Oefzm~M0zu9X&~~V$ zR%ZE}f}b#8IA5(xcW)!dhMmNzgXMs7anSn;Pb@OYA>8aE$tn)tt|_3gS)-H7X<>m} zf=JkSZ*fkI*`x3UDww{xxKvl2uocjL#wRlYhy_a64w7G;zsp zVhX7n0z@uw;rsJQq{`AuBU=M+bh1ADBxgH-$6WeUccp&TpfjYg4adv*cVu_=6)nxw zGRn6DA2eHEr#SS-daEcZe|<0!?9RiYmBZJ;UYNgYS7 zYP`}~#vO&5$gBcDBbN#Y_4fCx0tv1ycEIs8WnayVE(l*t)oIF$7M*R1!pVe<#xv@3 z-#)blio)C5&1rBXp4^`B$oymQ{bb-9q5$DPsNyl7vr*OI}B>K!!0~E-uxRMq#jlZ2FZ>c@prVCXJ(FNS2 zsPsRNG_u7sidpv~6U;5jkUE|!R+80%q?hreuP@6fY$@Y_D7}V+OZhE`n%YF%fQe#} zIAD6MLm6=9=?gfO!jPx#5uV+JL3ENyd;6)wNTWLe?e9&}%sS=icp+3H5Zr*o1jj@5 z_WWv=sAbn;A~IY>EOD}sbM5q~;Ewe9gx!ZV{gYk@(tqC|&cuG*s(EhZ zki@r$u&(ULyFX0!s+KyPt-`!kSpC*ZOjKc9o{W8I)}iHAEQAA)ON`{_oDS5%F>fP? z%d+a-zI6<+`Iu6@iS-plQPx=Ij`<6jb`}Ycp7^Wx5zQPeIz(klbqz2)u^l$mVx{fT z4V=-#=QO+cC!XAO1HCe?%=v9@EjQbg3Z;o-&=oyTui;&9!H2|4i8Az(abS zQi9@5OHjCyc;CpABhdx`$FZ#mJVmQEo^35BD*`Fnp@vgG!g#KBSg$XTUK>)LVwEr2 zL+_5gE9&^WjAg|X;m)1ouBR4Xm#hnXyD~M|wRe_Pl#sGG$Lm%a+>jDeFV z>M8+d=my!zLUS6r@&|FA{{ULKd2uqz8K7XQ;Hh9Zt& zWvdd1m0#@l7VWw>+`MhdpXW^wL`y%OvF~r5L!1ITV0NiP%C@Z|!61nfa!Do*ap-#0 zi)&kJ*4+%ucfpDIxxK>Pc9=W1MMS?h?w+yJn`JuUN`_-n3 zMQ2r(aLYVyz5k}_%^SkIc83E5k6N4T)0H7@osgj0DO~RQA6n5d>OfxJJwPS#kzB?$lxzkb zhNBZ1i=-*@CnZNer7ZEu3&|6PidGnL_l_xu&j*zxGR7HY#DPc5RDUICn2T- z8;4>)!nTB!%ZgVlz^yrSi~^|t0J}a|-lwNpaf(>nsU$2wIpdwx9QRP6%G?y(pd6fF z`igy%%XU1=l~v>n1CE}xykw2zVbjE{vPnCSxCws4+v`(AvRou~sKL=eU}cXurE$&^gZj*yh-4TYxvCNRT43{oMYP@b*@8L@SWYDX<&)n2k{`t zA6og0PFG%y+E+&$=*lKR9N>yFK*%5r(UJ)cc~jn#c26IV99Ndrw=x%ie(AxW_edtQylL3yIzyrMl)c#a)!(ih$6n5nODWowl2Z8;*97^%N-GfCv8oUY7?M9RcWQ8o1#ks~alF0-m7tG$N{yqX&1T zA`q+@aqLfOdf;)m74-tGA%+wTkU%|;T5%Z9IOB|(BMi)AkAsXHo^el%1|KA4iuWAi zwS*-npbR59ESTe*P%?9XdT^up)6yb8bYf#CJ9z$eHJ**D>J9#hV=RY&LPSmv<;8a4 zvg~Fme6*n3@zJ=9MC&MWp(@3?+)A9ogYf>C@dEuv$p%oG4T$ zpL*zYZvps+Qh4JUEYl;XBg;ZIpUS?V@c#hp<>75EMi&<9QBGn)04M8;?6kiE=pG&m z6{W4b4I1DG`Oa(g%#Xl&il;U*qD!*sbITtKX}R-oHrKq}hX2V*SLGL`@-3)k?k*)kswatxB6 zEGa2I?Bkvyq}}dw8dt+F4cfGDTj@~-R@%E)3`eQ=ts9>YHJpMsjFFB2Z2lE?;apAo z;=$Msyk@1cmeC<#^6e3S3FMx6#eJ3^FT&AWwBVw=k%dZdCYJ|SPl*=+QQIs+o9)TYpArxNiMI6fbc$khyQSK|g zFi>Y4rslLGo@pE_i%`TV{n`KvR7$K@ZsHlU!2TL@mMmDlBqx~w>GTxfN+FDGZOix6 zW1mr1%x2J*_DycTYLaDT{v*#Ots_3r@Z`t|%O2lBRCmT?SrZ|*ZSwQf`qju_l*VM7 zFj4nham`)dLK0m>GRG{Bjl}I6#%Yct3etJ~2i^yv^rsb=vGU>@lyX4fszr||yr=^w z1av*~MVy|Yw#bbP^By8~%KV3>Y2|JfR7Js7;ej7?)th-2X2u``(a8I>Y?sUlG|0+v zf};e`mZ05{5Y95)I}mDHYjGf1O19)<)bUGk40g=T3h|BdO!;Q!B$DE~Do9R>q&G!L?H2;a!Vl6VB1^ zTs7Rcj>c6TNQ8DWJfUz^yQw|Cm7!yxLgZW!>Puvd^rza*rrcinum*4ByS$>&Fu1CR$etF{i2VrW!yFcG;cS+*LrtPsdz zxl=1HBt|@tJu20`<&lXlOoJ*(+n$x@RE*v3h;=13Xy|NN&mv`u-~pBdRmQ!R<}lwj z6Q&JvSAHlvio5MzgB=gnqHh-~D@Kx$+W_%cybW2q*l?vO-t6q-)a|BI9Mc$+rdaUD z>rPE=ZEj7!+0f(a@$Z{5q&K5$HqzP1 zBC@V^i^XgUri^DGo_7lMsAMTcb7*e}K}+06plTjI@}(^DrT{qyzu{PO`0WhMB#c!8 z<25s7Bq$Brci~>8EVmC$d&fj6SJ_1CrSZ)7 z5#ksLQV87VpsLdN&g$nne9@}%3bQEB;A@y3B0h0vwF(H@sz@Y$RiCZu?{fmkWL1+m z`9?4*=k+QvyGZJ#mEx;P(soBpt6t2rG7HV|s^lm=4{=!cccezaoCz3Y9)s&xx4NuW zc5l9IvH_U$A;~_5v7_;JpQv0X+oW|WyG&wC5KVJD-h?d`x$8$NvTa(%zOSuI2}xsD zNeh7OjHz0v*YVtyD9*Rvxdf>KY)D)>)xQ*E|uD2dJ+j z6PQ(u+@$n93RqfEicv>NcW^8r6GE*NGH_Y`VjI?>mJ3u*KK?~!lcbI?7}q0t;t8kn zlTBjr5t$6EbNEzN+T^zvi>K-{2|3C(e&?llH8Z%%rzP|~7+|dn*t@HQyD}LqmumtF zW2mlj+V|=r6m2oQC$SyXlPXCNioke6lXwZx!TY zs$NP_mZxqSos&&yUK)j@_Sw42qb3Te=WnQ~Wxvtw?4h0*+BS!sta@XnO=4<#?YG)I z$RQBNfU3FV40o*QHG7t4If>Rq+ZyLQde@yidW5Xq&D9uM`w#Iw?C?rn7Y@@OmyeVa z&P`_9TxyO?dW)*=Pn|;GH`1Fc-|AvWi*9r|jv~K%=~@YArK~&Vy)7g#?|7ZLU!{36 zoa;Mm*^~X~Ts(bJ@=DM>vcyH&H;cgvcV5~vP;1NZpk$I^z zg^+FBa;w1=KCK;CoD17-m$~bgVsiMCCjm_+JE*s2e#CH)q(rPEuFr` zsOk+h+DR)!GMz$<5IsGsI!#v7&MG7$aK_O1!R~5Nt3b@MvS4ir*g41@>#lgZQ}-e* zZK$$skx59&>7Bu?k=-br2N8k%HDYU%Z)Vqy7FbxF>mOace;UvGV`c9n zkbd$$TVRN^7l5^Ry;TO3eC6Fo6czD0Y)(r_1)@fDX*v45;oooVaV(&%$71MQTs?6 zOR4_=W#0!_Rg^Y7!hTcqsBd*!CjIPI>avLoNX4>0F4d6N(@!efWk1#JRDOd#-nA4~ z5X~fSB+kyKY@Fa?v7Tc&XtpDnTy~|etg;81PcwHbA}%)i{uNx^O6u;)N`ZxNczpVb zmiJDI67b9hNaU&ezLlPHE2?>cfH^JG@WpvmWjRYxq0rjmaXMV&u=}{}R^qX>d6r0# z@;>u#r&-$-pU;REVllk*QR!9@;bd6XA;HN;9O9)@(^2&uWIXpU$+&+Gc6Ilr+}KMC zymt&hl;MjGG3`hUf+obI0g}&-SJ+h74$~l(PC!g5lg_IkVqM<Zt8nl;wWG&^5fd|d<{vcG(rC$xnbt+EI zy-;xD(uY+}o`@26(H3mwE&IL7HiE~GT3N0VFPUT+2j*kZg+*^-VIESsUCGGZmaQE( zPfM9awC=fO!xmmK=zl8JViSsrT9%<9EaZ-0u@I_rks;?Fg;|S|k`1KB+lSVpv$1Pc z^8>38G^LeVV zmHWq#<^JwKIHg5u$rT_AYYOe&-Q00|v)QoNyA z;@%aRI0yK>#VVCr*lu@2pqI&o%aEvBa)auBtrE|IKXzNtW2e1VXr3^)5`x4WsLuq_ zP3Cz7MCD#GUD<~W4@ImcR#qdKmM4%l88QN>%X{Lg-CRlzBUTt(uc4>2#g%qkIpF;H z0AiNl%LmIlDaZPuw*&F6X;fsg#)g(xk|Yx%d7uV;t@pngZn0&kB>P3E@;B#mbyMj} zp=uVIb>O~Lib)%VR$rGjcUspjHDrzwh>@o*rE!<`_NwQMsriZSVng2Q*98peW93d4)BeP-q3C**S23+tN7Q%iGb!szEMZ*`l6MX;K9mNsBRFD>a; ztzf^JKQ~gH9FhIrf~`dhO3}1QjGU_Eay!(E1Ih&PDL~D^VUbwQt)7OlrQC?x+6fk0 zc4m>r7ahe&bophrlE_3b5Wd)k8AUW@K4ddk;MHxa=M{IUfuI+Kon z3c^)d-J3>~ST*Zs-B~NZ zBfuqa6!#eSs&;aHry|{p4ob(4N$-la1oH(k$tK({Fu2WT=FJpQVof_l)M7{xkRlDt zt}qpkU}~7LlFo0lOBf@l+CJ!~&v4emK1iG9&z0@otjQFH;Utr8%Y_VqM{i930G^ec z>NfQ>N+M~qSzPAXETc0+^1OK&ApZb+@TgY8L>_mUxQ9D=#wa(sZjn35bly|U0<^Ed z0CfJfldO32OrB=ZG{;w%uM!TMzr3cQCnun#I7Mn+`wQI6M3ST}A1k@|eEQUSh0TSO z1x@rUxH#kZyZ#l=1n~y3b{g_SZc5|i=t%B9wY8@BGCPuncw`*>?pucU0dSGDL=ZqU&9aD< zu`lldA9#9Ii^(i6FG|H`*6TS01#IB|07{DET(yN()qrOt1D>L&OQ>oR+&q?cZzD!> z(SgbOe}yextWs$dHAwYaS!7QoZY|glsT%y?`sR~M@U_OVGKbY+h_^eXJR@VL*R?+4 z>SlD7;f=6Ux@VL4N2eWXx7tK8HM}FujY)P;*gT)SKf;=mOG5`{^(@=NbDTaVoG@k$!}?f;X*hCK&yIVHnD#kVl|BxEVfsH zkEdF0p{3fR6D+aAf*Iv4g~{wa{iwPnzNN9M+}t0r!6F%-k@91Dk56G-_12*GQagy4 zCA*R3w^n|KKGg=LsNRP1eC5n-`<3aBTA?NV_M>oG?$pN$#fA}{{{FtXt44BnW{eMP z?k;a&koirMvw_cJ>r1Tof#QHgX>QTVAMWhR?e!GP5ca4MXK5p0xPm%;Gv2LUNV6wze32E;neEc0v8AD!^J^NTi8VW*%B(hFa0vAFtq3ix?Cmjn+ryozuEd;uJJu|o zDAuesVQn3hIDNaKWC!K;KD7IrZxQNpHluN4DnMmW2po|^({U!Pp?c?0p3W)FrP^=X z%YpI*>oW0H>*TB9u)=(WrY}+htjl(6B4snX; zG|vfGcy`Suxz%DYN_rwb+%S&qO5Je?aN$K2HbmL#~9lBiGL*-jB+K&9R zx$XeyJw5YDxywhOmn?SF-fd4z)Adg&ui^~R1Mq>D>$RJ`x7i^m;j8C?^XMlt#u34mX@)bZKn9c z#%S}{TYZicP#Da2JcRYeJ5{|q;cV6trOvB4R{rtM2jS~oJ(bOti84uTYVxFUjD&w$ zTj@@%YVN4sY@m>cKZmgukJcUS9g9>J?^7ngX*y)4*6vKgvW>*^xK_;n0NI!EHMWqz zNX!@@18HAVRPF6#XckGLD8(?Kj2Fd8XL|;XBSAB70e4CdP(78y!9=B#l5+Cz2b!O)JZ(Nh@elk}(>HM4)+}EK@4{v9>xl z`NcWsyqkBO8Y`k?lu#4X^Q&{(C7s6i2+GI~3E@wF#;A*pHVE3vb2OI1 zMOALjbCP{&`km}H^1SBa*+Eboy5ND>4_d|4d|792ZMxo1H0~k7Cn&?cQs!hzQCpYw z8y14>LkqFss|D@uJt`Y3xFaZt8K#ZCK>Y3={{Z7${ojps8~f32k^P<#7F3awFRo9e zH_g1%EZyRrki-MTRQ=+ArD&tv!OdSoUh&LvT)A?qI_){Y+Ck1&(y^t!nh4RYXJrR) zD=tYScL%jiqgmd`E6=L42Vsbjjt3oB4@$9pb*4`TmmSC5TyMY&p5WChCQh2)~hW9U)*8$cz^TvK-{x#6p#i1l#f7`=0cJ0pqj>4y8)1-n~A_sDE ziJtzor?hKCPqR;RIeas1V{Eq%vEDQWK&KoL{KZRZ`bC}eM)p=%xXiYs0( zMlmzIMKbZJ!%6=D))i(APTW~X6opVo+d}Ob&vIyYXi3H_=!UtbSUWC_DoD8h09!E1 z;;Y{Hp;cXi#H7YS8OHwr!nwPvDBfXpYd8$Rf)-5i^sN0-;_;#k(;!(}Ym&ck4y077 zYT+ujM?NeoQeCW|G=676>x##F%PVW9wy~WGF(u<>+~1vKThBb|@VrcBnCy*r zlFljj8Uz-%fgvHLjROO_03P6u^`c2=V&>(kvw5jqX?AOMX%Y1-Ps~Z_k7~=l@dl@T z9HcObf`I5(1pR*+(zm^Pi1%Mc3ZIn96m0}{6;oT%RtO&A)r7uj8C4%JKJ=B4O7q=Sxq4PViI&uU|a>C_-{NkVxi-1Mw{J`0QK%v*$ejuuDG(T{4~`wW)0 zs(jQhgOGdY+J?mqOK&fS?cpw$@)iV`)GzV-`ii5k>RN}1K(#iCB8+W~fa?A5DoC#M zoleQEt}Z--2+L004{QJ`mXE6Hx?ZNXnrw*ht-yF##12^Z$@QeJIa%mqT-(d1Gsk-? zrp^#_q-k{KjT%{j1Dt0DxAlD^SJ&^vt7=TH_-B5Y$8UPAZSeBpm+e}k2vxY+!<_n6 zs*tv<$;JHPa@Kpy+m+2;V7kR#qJd z=)X!qJ-qToD@(j7F33OwaQ>8?UdR<5?4{xD8hb`q;84XteD%-g+uFK)EFrfo6(t%7 z&zM{Ho8Kx&u&D0z-Rvcsl1B$P=M_mo8M#ZKhgdf)`3~G3!Z{x}M&&(^y;#$KvaF&yh1R1RL?j?boVI&|>r(1z zp=zDprF(ro*&U#{EDOcCSe)Sc{{T!?-8Rk(I6vZGgaW0aft#uzDx+D5l2 zvM9W~{Mq0W=~G+2qO!{@svVG)O-S7$!y_i$Nh z63H=BD`g}AbFkzoO2>UJ?e#HwiZI9+<0Eqn=kTlA ze6T?2af;H?VAo#Vltx}QIL6)= zo}kvsYOnI!Tw28JTPxm zLvwdKrxv;l$Z>JV*nFQeeUiGSkR>lrZ?q5C^)+K@%<#3_FE}6q88Rs>M_EFp0g6OAX zlJYs|Gsbh&n$Wwl)$W8>5J_U48>bHkcMuc%F}C@&B1;XrWcdECDF zsT9j;ms$=6U)9s7I!H;5PJ{v z+M>yB%T2wE-DkzOSNF>`ota=43S;1Br9hfCuc<=U6Q(xuV_c9wD%h5NBS@Vgip_kn z5ppCW8TATn3RE#c21E?KyS(Z9% zPjs=!zETFsW*>NcYj0lh71W_5RuQWMyh-y&WU6^2v(gq>7N$cDSwM>UIq|>fpTX`gm3?RTevA3Fr z9c~m^t?pax4pg*rMsPEppI>^(H=bmHOiue({bIfc(2n&T>j^Aa4N4T8lb@F!Qg+X| zquJkaI<_zA`sj~cQ?Wz>F@%)lWalQ6$2agaixfA}Ab5z{{E{)$5!$(%rM+mr%>|P( z9%Y#I$G5doH_=4z6~vx%MxZ*YbB{$Pwv8*hqn=fCv0NMe3qdmp8AC}?5r zH9MKLjUvk3uY8!ALchBz_yKX>)YmVp_@od`go;^)7&C4ama^R!^5+dCYSoHGO$w@E*rP5eQF*eHup=8 z7ERtv;;j5Vsx;VZH<39lB48-=_x}L(R_(5Zq}bfS9sKtaT}vJWasL3Sh;_+5&1j8d zM_Yu27%Btuhiow&+v!nj8qSEiv)yR7YjJNBAcP+=X77$U=CGAn$lf%eA2Q9Rk>Sq= z&NU~zRy(&WD&0rF_)^{cUa-=grm(b09$&nUpy5YB{{YvncJsm>Ht|K@n{8~~Tdw6B z4pjHxRFV8J(zMW*8oscpGyed`#tz`C({I+3jVG*~$IVe`6=O={;_c?H(TzL9&fueY z>KCUyGg!w+@pin)3x|m&azxSn#8PrjGuIWjVd7s3_*UvTGdlatB@*9=}}sRq6Vb&3$J6PKr`l6UyDeQU`x(#1=wHeCaQqFkfo8Vo;y% zpGwKpt1pR~s6sm;{2Gfks`lD^A{$M>g-F5P$KTqWKZfs_yuY@q+b|*7RPG+xsXw!B ztxzSLZ8)2+m&Q&qewB98`Ng6`7y?(5g>HxGSvL9_BxKllI!UK9&vJgt7tF+yoDMdV z>q~vBXj*32?QT5j`bQ9K9lrH;?)L4VnmeZmk-5lGg5JMTSvGohjJlj~+mw=9htHUe zkcY26l+%A`PTdP_t9ciJnkFdGf}?f@??yh=&UlB!pkGUI1-pIGx!VK-(-qlj-W9(( ze5&(8o7-w_;~a3+%U*a;Sze{iuAX!Y^2M`+E!_Lov?ot?XHiX~7ToJP-oI-d#ef#` zU>64n*cm4szLn5iY13J%-s&o=5Ez65!!9@@{Nz=b9>)6F?X`_OuuL_lmnO}p)REel z{3G6~rB>aM5r;12xuCMR)BeL0R_p?9m=XKNA74ROC&O_= z7ue>IOBikCT$0L7Y3g^@P+3hR8cgXBfICRi4a_?QBa>8YwTo>+7({wi%FVcexf)F#2jGsb#_N#aH65CowcW(%2)jYtlj029p{<@Af)UM-O zctXhmcJp1M;Rn~b%^J?5sM+aj1(%fe@vAGdC(Ryl(E4#&CnoGgqLzeL-W0dKnjK+g zF+lNd`^1Rfp;M0Z*U3j(6z|QyyX0&(-o7T$*8@Yma)u{38p1kn3W!b{3ve`BEbMr{6WPqibFv8cdeA zw&*P4kerCXedOaRdh`BzR#mo~)@SUtv&HkKL~<@k&s-kHn#HZu#U!R62g$jQCp{@O z&7daHc`fy8D|s5u@St`-yJaQRlbytxr7UwavVUX8vh3p~L!7Yh?0eNYwLuJ_OUX35 zvRzx{Aok{>zt^s!xiXt=?8u@qz{j!ms*NcU=8f6Y?7Dc=HA}cz<#MyzNB8*tEcVS* zyVUH=h8t&&FEa`epDYKc_pCc@H&mW)F%kU2+;g0R&q~|3&>_?HSZ=j#J-6UAQV*wG ze_E+VFx`ncOJqdQ>x`s-W;`)YHnYjq$UJl2rPDOFAL(CZjImNSI*p{~srIeCD@c2z z=RKW)s;U?3q1NjofWtlch z7C9-O(y6Ox(>>HLcKM1CBTO8K)RTa{IX>V0YSNEEh2)k8vqtkRz)_w{XQ=e3G`|H$ zVLip<(?{j9uay*s0!AH9Ke|0?RN#i=BD?BZr;wU09%qo|dea7b!bTi}Hof80Q|;y2S8ZL~fGgLj+J`V;{cU56ZLl z?ffWimv&-Vcq2==W2j$ADxB_)1(1N}KGm^d;q4aU;nd3^c$jX(^Up;-!kb~LCaVCl zvQm?%#ttxj$F*0NQ&=yWNMd1dBf~y%z>Vq=lWA5@le!}tlHTnRt(GXj3_mMbzy&~7_W5r-^!Lf*9DXA{SSJM*Fy$1 zNbZY(O72sDPkPNp9m;LouX%V2v;}6Ff!!KL$8PS*$F@Ze9rfC^yuNL`&O!3mqWur8 zYKV0ETW5wzL1a7x=*Rpjo9Z&yhPjSklOQCY4E?(h}`d`WwvXb}r@KKr0Pcv<>-=g?4+kzCx0<8H6#dqqoVVrk?XWb;!e z2het?ZFNl_O1yiRbTpOGRc{(nFvvQNopW5Sr|~w+P?kunBWPsD%%OpB2N|w<_r&_V z`(T>NNTOuj<;+GTC$A&vT{P%Pqn4&BDd={-C)adYE~V6MBaR~>#4u!hpYIScisSD* zTO9V!4Z|udo3|>c{ox+|l}6To5Z^eAM7InWu2n$7`X67dX6sX2E0`_f3p9tUTA^V8I-A;ehIf+rj^(pOQ+Qw9#NcaGb=9cTk{u#7edxTMT<=INB@T>}Wn)-v)-`#1|~GAQM6l8TA9T zYiRlvu8F54*1)4dC?SC3Z>PO&tWw+E`GN=K2a_b22k@^prXjg|hjls$E6C@E!>upF z2^^8f6wDX*UoJ|wa&z985bGAw+FoeIq>Z-uv98s1^!GKbbv~UO5^I{>;RQ=0mrMR6&AY-4GBdcV8T8KuiO>Q|lboM$sD~RoEZhSwe z>nR%SLRNL?r`5f&&1JWZH17#VJW<|TGZw@|0DQnZsWr!@h4CZA0K=+Vg!3dOSi&5# zb_AE9YZZtdianHT*aM#Yjq4+Gk+cxKPU z8im~FOVWr_)OlclGr?a<(6rL71+Yhj+DTo=AONx)=Wnp7?X?X{O}3iPO}X;tF_O-! z(0_*&&nm87rtzktR@QG0jWM~nnm}#%D7_q>xg7;jx%jna)*xA1y~NSC%#rnD>CZ~7 zsp$8b{BbSZjw3A1FOcO+9AmG&OX05vMWw*;OLC$J(3ECT=8U#*Pfj};wHiE^mf+=8 z%F!_3*Zg1N_mcX`&F!HQy2yZ+kyspTVU9^0jDEGP;g1Af>WtS~t;~w{uKrb&&=qHL zaguu|8THQ<-FQOdLeQj9E}a$3*xwvTLX`giX!_RHy{qY3+6i>srfC#6n3(xaIL0eE z;$F~JE;x9#c{75O;hu?S3c+uuM-|61TP%)5ZpZIr4_{u@w{?9A+3amDGzz;4M1w2< z{{SYE`&YS|6}P!%GVd%=P;Nc2J*uK5$((PukxSt`w&TlV{8{v<=A8E*EMoKtZ>G6X z1+BVdsr~R@x;;L%drwQ`(<9U`Ai_38Gh;jP*8{#QI{yA02pu*Xlq%(!SpDWFs9##Z zzwuV7pTfN^!e;Bt>l_pMw7|G^ZEp1 zoNYe1&mNV}YFf|PPxgtqS4EJcg1yJJbE)IacgEU`azkXxr$$P|(JsS0qwgG!!=9s) z?M{D(z9sP_XHwDc=148U`%oxIIXn+Scs{4SYYIv)-ez;HDXT#dTx$9)zNRk5s3rs! zcmtfQoq+u5`lpI@PcSW*2=0m+HcV~DUD&1YKZCU$HKn=xJS!s?Rk1LD|RL`27Xn9trlfb^*>(%RDYcDTHWP+%gt#?M?< z759s*Bej;^7$Ihj$Vma+lb+mhS=v+B(elG`+*+KF%({N1bc$s;iCg%{?d`=n+g3V6 zuW2wB33I!1o_wNx0j_9xnj6nHJwhzpM#4cO9f1aTAdZ+FtEtmG52@>#Dr?_of3jUi zzSmJ#`5PbI{Eu3>Q{>f=8M$n7&{%4c-L|2kownje7mzqRoq54t-Fti2L8tf*JDY#) zbV%b!S0{SpyLVnXRBZ9-;57SJ%*fmiPxgnXsP!KaO9i^x#si3k=>n2B9>*S(o0PPO z)uXuE>nOB)@9gL9em$Lw$Ln5 z;Y38D4e`iIs1$GC(<^5WlwGu&iKXwb@j;X zYgQXME#QJjxA`PeP?N&@8nA9`UQ)1ikAfWJ0gPbOA_i2P81Gss zU*R)xk5cuQg(R|pZX>kpz);ot=sA8 zc!jdE%mBfSPyDk!{?%VqXtg3zCNYWR+8}OE9Zf4YFL-(=`>3ANS)W^#?euLi5#wL< zTebsgu6SQp$T(X{KDu8bm=}y!#5brR(}nhf-ZC>Qya}t8PACy}|F& zqrLIwr3B0^FGMM^cS4B1bE@=KZn(}59dIhtUGzkAD{9M&qUz$rM<>a$OgzIOIsP2_ zl>6{ywQ(A@A%hlM}3?k&D1MR^=eYyOJ%paRdkfW!N^t!-ONvC{7&{>51k z6T@J#0D27i)@F&QX}VlSZ9{C)zBWi3EI{v*QQzzGUR)$ecFz;GVvat9e|z+-WS=&L zXpOH9Xg50YO>=z9ZeY&X9d@*bIQ+ZSoi|AE-M+8q>&|}9ZJ8(7_+gIz!l_4RuWB~) z-m6U^j@^8i3Sh7u@;{wJ43`nRCG4itbO0DxGR{AXKDCy&+`fkIjjcR9u7^j`;Bh=? z@S9VX$6S^jM{`um_=`uenn!^IEQiav2se}c(OlE~L(}{v>wj@)B$*lV+yl9f zBpla0b>gWti!#GM zpD8Q3nTrWdOCMp=r(eRhZ8afu?d3=oH8>d^AHOxHr+AX)%G|=zAc`br*&q$H=kEpl zDJqkW!%$4bwbZU-Xl1xau2DE+675~1_)ovRThJ_x*&@aKu2|Aoa}*GysvXuo;~fnGoH1gmmZ#_7#n52D?1$+eOlg$x}mr~nHW1!JBO)~pW7dBT59D$u>wR4vkJ?h4pb)`?N+gM-O z&n2|(R#R?vv|JyXr#LkK01SL2J{?8WuGU!Y*>{$~`SLT29^Um*ODSQ$gglI|6r}mk z@X?<`P^V69sIjhVYD?k|59!g~wwq+jwPpVRkGYQkc2YfQlj}BK6qS=tu@lNlvqb!X zk3fA*SiQN503pAdXx+WM-{D_UYauS62hX~)Kx8M$oR9zj@tpR>X%y_POY$suQ(A8k z_@-T2{zxXbh=S0_Kxuk|keoag($zz6{CHRfI- z@vfmY)F$5YHYp)y$KU6;KBBmm*5zeV*K#aw#_MgZX8@!RQMWu<7>0_Ge0i!9C@Jg`VUQ|twF_FAACqt9<= z3@qm>6kqbh%CUmeKKiXFV@}6bK9^a5Xwh#4?PYmj?}z$;amL%(?h-RhWcK(&l?zT5in{y8P zM@ThqwKTq83K_{Nr26BfYFKD?OtIVO`g`5#7Z0^9V&tHh#6^c`Bt z;?v?DhLRakOm`sxkx1hz!@e>Pu755EP}Z)R{(G+sXqt%9!{Q6MEtsGjm*AMx%^(yiRqUc2IZJB!Hl%@)>0iZ%t;enN51eQPf2In|)l z<(cl?q1f<+=m6uM#=2jI-VleyU|30QwXR8tr*afW&+!_aAg;-@&y4&V;pjB>pTb`f zVAR)O6D&*n+h@jb7pTZ1ACD)u4W()RCbqfzPNe`?t|H7AF9s8CNH{s_dU^_mTkFeR zMQ&kX7A?k8A2SpDIUVZM^Xe8J8lO+UvnJkP#z`7XtTDGygWT1@>B=cC=X?7+c$eZY z!9R|=XOBD?rd!_XHumitws!!uH#TlQc;z7T$W|S}KtbTw&_5V0b#L1zT^Ifh8b*bv z*~ZefmDSe49&`Js*92to-ye97O8F?oD2&^m7Q>vvM z!DwK3x*Zcq(yZ)dA~L(F#z-VD+#|Jf9}NB({4V&Nr0N>iioPT@pNZ`yD{Z3Q zTNkvsKyU$YcsS1-R9M%2iu- zPSzJw!z0ja1>~{YgF8I?T2SLF-vo8<$E{DLXgZXdycf0>QyB!nG{}Lxpg7&PATb?r z?OyZni$ndK{9oa_9RpnO?e>x4*13C2{Zd<}c&-(WQe;BKPyv7dQH&ASB+~f7@ZVAR zQDrWdXQ@Lyt(4nZ;@L8TjF(6LF1S8~5y|PItlo?rk>nmPx4zRsj(NV(42m9Ek#HP! zEJv~JSlZpbp**?Y6~rbG(MbZ}WR9Nosi}Cj;>pq}^lv&BlXJOXe6{b9?^;^eu<RubQk57r99$k!wa2OwXP6k0g=e=&8gJ}9M_GteAf{A#a;b*{Degb?+(Dc6%=&(-r zHgIZoY;Ls8$WY4^z~s3@vuWs~f-=DK9~-_aOXG_TJ5TWCw6kc&7ibpdP4YlbJ4rm_ z72z6Iw|Q%*Lu{7OJLMLvf^dn@CHmOO32ZXxHW1S0Hu42LxvXeAVEF{?oQ+p7F(m37Mc0V{CkG zYR3#X#&0{APpJVeX z;>v4RYr8A5(#Tn$Nr@_r><{y-R<(vdHb`t4!BS=paLG1#Z1w~7uE$oewenUpi|rt; zUPP1rJ+L~TTEx`tlgg9rlS3bzyiEBK&+VSv3jK=7pPj~MGj?tc*OwCpJ453GK7y*u zAP~HA$m@*!j(8`gLG4qmjmO)=z#Hs|BYAO2%OU7U9mn*h$qS@%Kvmz%B)jd#eSoQP zXxjHH+srNJHxk8{eX-$=Mh8rKcCMep*HA}vF62z%a${qZKBFGB%EP)!T=UF^*+?JdIMS>i*I`e?vc^rJ91S2008XS_VleyI`U~_ z5=D0yX&8r`#!g7+x$H6NTuy~7l1OD&GuzIgc1FY%bw4mU>`(HpmqecR-dkg6@C*YH zIDC`aiq1&noDye44b|Ghk&y@}O9VyX^WQYE+gl@+Ty6|m-gYcUu+K`3_Wg~nqh()| z{{W-o=7^5D^v!6cyv96)1ULj17~>rcWqk~Wi0#Y^1;x>L)w02)C5P3jY3_}Lh;Cw8 zipUDKIt+33s?*MrNaixD9DpHAbtCx-1drvFia@d_QsX>ROa;_#UP;>eVA*8~n+5`r z*wtBXF1(kLADNh7g%|_h^Q$j1ExV&iAq^pjer>?8RVb;09{9OC70Wzjv_;u~@dO z=<|+cMe0{P3Tsd!K@@kMqXM0NqpO}7AwhU|&2aU{D#s8k>lFgh9xU#wJf!pa-g4`%{Vx~yJXZdlCYAjl0 zSdwWrLnqt=YM!jv$3B9K%YeX6(HzRfB~ESnp$5%IzG z_NUuRaeXt0?8e1k-*g#0Fb{8~L30?miS4eSb;{w?oE67IpIT`RF_97{oh7vLOyg{_ zNOxpsIUbx;E%uv+Q+0F!MJXADaq^Ct^*;4Iyb)ZW^2wCMq$~zP7_sB=6poINlz7fS zU@`_j8V7P2SrXbQXS!g>7{vy|zDy2Sp2Ho@LnPO6OtM1pf?*7eDsI>@!5*fpLYke# z5Z&qw6`X8PiPQnm`%ogNZVOF5Ne;uVdJZ}YuYVk% zg`N$cE*(c0Ty@P`wVLib1ABKC)H66<0+OKi^{Tflphs}FuPR(QMOe;GG08dYKx#o} z6mUkc>HA|~<96lT9y88=+Bx; zCAWpV*H7OSJP@aLFm+C_NLHjDrSf8F;q;Guz* z(sa+0`<3$YM`CkNwu1UA=a$XYUNi_ML99>gybfIRV#mZd6|R^fc5PdK8XuL~bUMIoz?@rA$lr4?)j!Pq5PCu`emQ zGBX3_d1_Qgj`gW`1m@ClV5p5Gn}MjtW9IsX7>Jkv_W zq*b^GVks@q3Kuy>&OseVyd zlt&O--9q9;Xxy@)%C1ivfa!{)T1B|xxI?~0X=F)vZ3+NC?Blqi{v!c<_y7|V%twIO z>_DmF#j*>TV=|()K#EShbTwY`6*NTmEYY@ za|lvr~ANms}bGVrJ!XA9@0YY z=;u7voXeo>4{_&59CJLexk6q-GNpQ84%HaBg5i=#CO~69ENTuPw?3wl;!_l?ziC~Q zpbm_gDu29(^dtFF#OiHMN!9`w=COXu{#7MmtFKZ+fWC<64u6=bh3h zr&Wg}Gi=-(A4-x3kt7kwHn7ezcq7)KhB0aqI9m*|{MPagc6%C}+9{Lde=#r_dhSp0 ztyGyvnOkv2RonsRJ?eXVnWmILApi^pYz_~-Rf!fr00e?C?i-*!l{KZ5mlH>CZg!|~ zy}|4Cu86kHV{!L#xxka>fJhmc4iq1ARAic1<(5Qp!KL|Ap=^5lR+3skr^~egVqxX6 zCoA9j(D6J{0`TqG{{SsEj=1TH)i#-SV`91qBHO~CvcB-BKsh6+J%u{enBp{#dWX&j zRzKlPcXbOJz*Z^q8?j7a_2BxSN|y6av9r|D8%x*>wAR$jZn{75l*sD$SkFoo6asUc~-he|pSwg&lsi7NKyENbZG1 zU1NTrinV4vEOUC7!%YtQd9Io{5!if*9|}E5_pX0i_+@o!$~5_W$6>@ns5RWhduMPK zIixPE*ba~PN%f}5516~bbt>n|V!SaQ(g4&zE5EtwWtcofUE^l@qY1*FW6STnC#>nw z2fBk{-?f1}gIVGU#DyIX%G~=J_FJ3SwJR^NUulA6jWS748bV zvB}Dj*nMlyt;0@IPK(pb=Wsl-TUnLa3XSSAz*K6T&vDrFuT%d3g;%D^r3}rzl$g$N z+5WYQto%8SHCU_@dk!X*#sza!;jC&`iW;QbI92O{M--)SHn``p9jmW@g_B6?wihcR zn72tLMgi^xJ|BixGs5y)E0BZtfG9cj#d9o!FmBwV_7gbs3yg!*4sa;iRE)+!>}#$b z0hLb1aujkhIX>0Xcmv>-zPmU&#p(r)L6CUs*w>|&@P=iW;-f|p)srf25xYFdX}4kl zD2a$;@_?tGda+~S-D3R&(b!4lZa9!3#&OcVwD4!_`{7$y)pZMa?jl3DtV5nZrFS+z z2Ywt{TFLfZ4m2+PdX@J8*Y4Rr(f1LIry8|t*>zUxcsPval^VQ_9}+|G>%>>gvcsiL zfb`uN86TB(9vc0he0_Z-y1tS`GfEh;gTEe~JJ;D3J_qpKovJG7h{Wz)-dG<_F<0%p zGZnI|i3*nLxL$p$?y~Oya*Q=aQmos3j%S^7?5ub(pQf0|NWQZM|c0LiX((T$iT{J{PVXy%FJ*ruB`2Nrz$ym}c zw8jtdcQtkHmU7EB;#(hd^Ht`QA~1=88?Zs-fnQ7YIxvlrv6VbjoU~<6A)teD+ewK| z)@c*3xb&*bi5#9%tV*gz3!Y7AUQDcanTr)4E>9zll|`N=Dwsw`KQnbJSTwI>cB$Q5 zk~_aG{K;8KQV2jhQzg8*mPe8hG7eQ(50a!yIZ_mzhsn6%i2K9Rk+38UD)4cTpbkB0 z*;sCJZ*j3$Njq-)P-X+=-<-McQQlY-bv|Mvw?aljkMXN9I;mb&NNvlXT7r4fd0yLc zhakIy*n4}{Z17mGj zx3&{7MhE3zm5+1jUX&!IsprX9g%(K$BVJ?4C5Q8+@{aQ)Kmb4wlb)WHZhLG=@*@F& z8EFN+(i_OY&#h9m#dg(^6{V%HlsvDu)7q^!me0bH2i*g;MKA6VWicExV6o{?&8fAJ z19E~--6N@{uGpJ|bY=3BNr)pNBs?f}=zVicX#9f3m~M~n5zy6Czq%kzayP0S%tG=9 zr41w9v$Rc;7q6i0njE?UvnNZqq(J6RlXhH;aw>VGQ8P|~e|mvXFzhP4b_z16gq#A~ zPY2fmrEe`{5Xu;@1RlfNHMCKMMRxTp!fmc?{HGk8uJhKFE!XaP9C6y6ZjK8?R~}vq zgV|3?nn|Nq2yv6%vT|wJ9MY0eBS^7_BjhIpnw}_xVX|<;?(@>2zS|3xRV{&*E7R*y zHT1ILF@-qfk=CZpYUuOjiRDbzvk)&2D`y{nJt;-RF-Adh0AfRWpGwRxa?vEQsKGqv z)7FyabwUi%Z9l>@-m~^DPgY@0b*CGsm)}vq`A<3dkD#Tqx^FXdXjuvQiuSCgyl5Ov z69RfTHC9b@TaqAfAF8UJGwWCE6|8UUtJIFCU3qrebE1pYW(RS{e`=WO@>~NOOMv5! ze(&R4Yxtfd!JiX5aq@AGT8i^tQdHYY%rHg)>GiC>rF(OIn8Y@ z<&rhW@~YqPle`g#OuQVHC#m+YH89l+ zW1@x?sdBj8o`G}XF$yy-^$p1+=CW_RXBk#2e5wJ-Dr<<3#g}19O*UMDO77s+UBBOw%GiB-T*N#5smJPsmKYSufu-yf^Dl4Kwe)OD|N7Qw$Oh-5%bxk8w2D(g(Z_OkiOoZ1avzE9NnLMP8iTTh#Sw;V9IPG-7%h{7A7j z^D1fqS~I;t=Wy>?`j3lsYySY>>F6Yk48GG`t%sJw5hDHE9o@xf*|oi#P2}YZk;|Ne z>t1zC>aBQdBU)HFLV6tzi>uk|woY%YpY0gHXKqu}R5!C}>mgk(d`%hv+xh%zjg0FB z%E$J!U``95z{#rGmZfX`ptDCKI>bI#0~?RMMO?wUDc@6~o*&-Sy{T(Do$r%)prgV^ zn(>}^=~kxIAn^q29M;I+C?9w3p82fA){{|$vudXvz1yXrXwGD7lJB<`rAiuEGYY>jxctq`M)~5uj|@y+~O*3MnRQS!(xI)^8=Ps+Avk1_4p)nwwDZ z%ir52rloVSQ~g^9IY0es<+S~7`h3FDByr~(i02iRspyw8YTi$rN|CupZ0$9}Q#`8( zDAL)Q*_{OU`Yq+;*}gI~AQHRCM^}dLM=~!blI)%JecDw`2oWm zW7f3HaoEgsm3FOd2!vxzaw5m}n=rtT1uOGxJt_ygjdBv^MnjUGx%4#@c2OsoB7x9t z%aC#py;6>85bRbY4iT}zHRsjFSAXnEYl;<=XYCWzu4}6sdbRWtq;P%7 zR1oMgH|Myju&e3neE3e~UN;T}WSiU^o0bed>FfB4hWA@}0gakQ48FY$U2M@`neHxI z8*Son@T{9~V7 zkAF(z{@=w}+C;d)?u~t4TC}}`dwB{KGQ|f{f30F%PUhVNOcpRm+6G2yzSxSejh6$s z;~#}6c8m~XIbcRl^RE`ZCZ-|tGWo5dB9Wwu;!xY=^H>G>akJa$LR>*EWBd>U-`1hN zT}IwjXJj#z4oi0S`qcJNsF7#$g0LIF$0yqrz^>hpl2;X_Xu`jdl_UV?A2IY4^?~G3 zZdry{kQagv)~1@)DJ5BCjL1(!Q_;Ptw$Vunc`Qjgi23@V&r?lD-qgEkp(9(fMnE8{ z{{XB$)mjNd-pLU~IZ!i>R<>wRneF%7T`WLnPxE7|#`@YoevH zxq@ii$j5s>Z(&lct;8@10Rs(%V3o?}H!GLynVkiT-dh!jGe|O7RPw&m_S0nvwhKeL zHT#Hq@mGbkUSzU@L+luMn;HKA>(+w74#Y7)$QJ;qIXk~e3uQh{K1DcEw7t)fn(UO=8+@I({F4Fr1>Lc zSr?H6Y&^I=@Y;7Anq{&i(V))8idHPAs~(s&Vq})ua~r-0ZLUD*eMhxbXGt8rzs#Gl zzx&73S2XK3z_((`Cl0O?ErO?@H6`_oR?@a2AzPJnUIF*?suobo9E_J>lI@T)&MN6i zphL1ok~wl15uE=3g-5h}qqz&qEvyDr+CkvEj)J9Vqmf0tcOa`M-p8ml1?$1(My)cD z(YGJctAB5*T{2nQl`*JYz=j6I=rY{%^F8i`y5RK zwnY4Z$1;#c53M$Pr)BYuh8wLp=0qa$ybbvcTrBzPS8=gCJQbdNz z5`6f`Ck8#I8+!FM&g#nglY5W;)>{Wz?^%4M>=b9}DN|T!!%Pf;OJJ5gzLc`fXk?P& zbp?E^V2;&J%2@0|NY_Qv%+As?$EQw}o2w+k`Wg|5JkKC00Q}5I?0eE`0$Xy(VPhZx zp_4dPKA7w(rmL%4-AO1-L5bWK3BkwsRf~1CR(NkOgNH>CGcm%R^g6Ar333R$Q>IA} zcZ`#H86`3z!*PZ29qmq<=amLnWs-05gNN!Q>i>^JF_mnTC~*8R_pyD$fkc(|~t@ z!j1~O>D)}hUp7+8`i>@?d$r`zn2E(it4 z`LpfmMbkaRK1_;P4;XXOq_wn-E>>sQ41)p3Kq_HsE+hWSx|v2~EG9g0+ZBYWE1Je7 zF%*%>=cS-xFrk9tn;Z~@42_fKAL76aeMMQ7-h4+ZG9)dK>%e2^eX2pD$075|eCvnm zaUkuAo^;V%wq$-(F0D?&!dDs8&wpH0)4Y3u&x2-XqHM$B7*u1rK5mdb8pE31geg zjh#psbG)1_O9TpSoRG1;;u1MMGuEkI_=+zNM&Id4y~im2p4B=9`BA){9!u$k%vo7M z#4;xf$EX!cQ2R!k47zR7rsg|@`*|bNHO|=lR@1C*+3xiR9#_oDp!D{|O{w_GKM=HV zX=@;gOgc$2eB6$I3Ylm>YfY`k-}t606o%e7Jjqu%J90?$H4EzZQo$^C%2YdLP_HT6 zk?+>4UE12*+}qqwGvG)7D!gYLDaB~PC8BD!u-(8!MnGM|W9IbssBI%IX*N*3@CS%> z*xusfQ+KxErik?m=s&`(S$GcLM^L*2qpAbdeXDlQ#Ytq7=_zPSkXbLz@- zY%zb3xyaA-srIsKR8(ofYRfTN#bSn8c1BSKJjLtnnj+M2>nhxh#GHDs;Y_%JCzs5T z*8_qa<#YZuN5mIG+(qRejpATr-~40K=~-yqjog%WF5c=%cOUvpgK**IbID%S7MJ#E zT&|;Xvc?F+W7F$dH+rs$Rd&wuG|ib*NC;8e1XLPkuLCr(`M^e!U~lSM(0fy}NXy!* zoBEZc3owezznAqT&U(WF?G}4i&$Q`+5qVKN>EFXz<$Dx1NJ(AP#fy{c9TL zON)s?nl@~ond5GrgnCqHk9~4sV9}}p^SS%p-n8sz&ePDJRo7>}ce)XR85Mk|7-c>9 ztgTi(MiC+TUEKi)om5rLS4dc;S?_0QNdUwUmCqm2nIyAq`z6ANmNohJug{LzG$T1S z%5iDevM{_i>KPCeMakQqzwj!r4ZZZx%Oh$IA-0qT+6ZEE(y!av4=pAaDp$=RmOSNs zb4*<-XyTIQ$`-gR}np z?txrkQ1t`X-lN(lD_Fi%mZea#StE$<5=G!(C*CA<=cP{iTHHtW!DvxO0odVz?^Oql zG@T;ZwJ?!MBOfj$atKm8ky-biIltAe{=r}bUTDOp%i#go<;+r2~N-LSm+A}ik)-CjCFZ4TJWe9le@C!q$QgTngGv?iIRnp;LB z<92YvuU>+>t8EIxW`@d3P}2E>b8rSR#syxUA!3tQX(1I#;zedO_1%MzPFFg+cRnBiL6Zr`>9=a@JQXIA@F=IM1-FT65~c z=@k@(P(ue^l{}iZ7!@Ytd`>P89_(k3Bw}}=O5(K+ha@La!(HUQ&($e)g`!yD!BqB&PsOtYU}B? zo^ruC^3|9f#PPfORa2^BO}27?#c*L>a6i3A+2+(7TiM-p4rUyYi=>SeRG;L02Kskk?E3Z zist$oc=2l<<&S{9=(1#UK81_>%bib9OBIzBUnI&$O!JO9R5J!=XeKJ?KnPQT@BaYn zskEydHu}|K7v5UA++20*&1CA@jCMMQ*;;I~oGHf~Q&F-Mr23jDmbRBm<`+XN0;Hb5 z{c1~lh^AMD?bu2gveEFPCxefrXWMF)cKhDq(VeEkZ)d>-bjP=~43^Mc9YtP3`!K>b z>G*ok(LCk%)xWYWh_jE&jfoO~OEDg`hpBk3?)LE_hT2f^oaLX8F~FwkGmD2v()HsR z{p*ST@RKf8KMGmF@MRD3IkQ^d?>G4W`&62iZ3l~y*B zYDROGC$aYab!zhB4dw{sh)EwTv91WkWX~M4Nf8EET~Ew6bo9+i_p(NY8D2BT?<4~T zovs&1(}Ld4>q&i1OQl%}DJqsZP(PJbxRwyIOk!s$fUIQw@;{KOBUf0FQ4Rx*rC5F8 zS@$~i+B}(nDr`MRJG0o;D7MLUB8|fg&=DwT65PeOhku(r$Q4TKScbwEmeu8yXO>gR z8P6H*SYz$ltc`LD2J&)MbJM>SGU>9}EE3;H3KDh(Zff~$xs#~+8xm_)*LG7$Z5c;( z9!Zh99{hXOY_nWlNYTR)+l;h*Q=!2OlGyY2h5E_9ogs9d({NjrASsgIRPml z+PED1=9=3=Wj>6zX(jfHDAe$b5r7_OC0KVDqWqf1?q`LAS5 z9qpqmZU{iUY;Rt^>Q^b@D#S zt8kbxmhbDDSBNE0fNJ`+`y`fjd;G@QtbhTUeU6u^-b~Rv<|gwF=j4oz$I`X*NUgNl zO3Q7MdB*GxeJS@zslBmCL~(?29fW^-HJqwh=xZ1|U9vk54``8#d2h9pQqF(TU5RNA zen$XPZZ$14MP@dN9g~m?XK%GtxzTlrV8UC-#5c>c-_X{!m*LBs%O-+bRduyt_K6-p zmudbQPEp;m(t9LU(|#d6ye3OKZ#@u(QI12^_;t(Q6iepG3AR-mq~19P+uYWthBU1f z!gAMkDyOBqAO-VzS7aUVNzz~jAPDaV`LM$v?vedcge==b*sLq{xL zQOJz84=xPkt&rKg9FH zrAoo$@(w{=pyan-;7BA=%_B_tUB61IF6WIl#sG;vVBq0Sd((|Mbz*Xj^ffgL3uqm# zM5aN3h?VdO_o{`i5gFr@GRWHtGUsUa6;U-w=M3;D5n~JHFWx=PGHGszSubr|7n5vF z5cynHsI(^|TSB?A)He&sW`;$`fy-f69=}@4)n`kq!xV1omdtG27CkD>m6BY_Jlw?} z@tIF5JKzqcv-OGXBbAa_Utm8g1A-5=5%`4Nkz#90Yna{@oC#t~vlhaTeFv>eX{WU7 z3dwa6y1xv=khtmftZhCWYVzL}FvsLZ#K=hHNB6zz{kDyF#l)AdA_2Q}VDi4zPSM?y z7k-59uo;>~x>-xU%%(?9_@~OgQ4KN>smrlA7^g*~$sOgj!dnj}<;u4_^y~Q5n@e@J zxyAf0xZ`A}IT`C&xuvmIML4Y@ZN}c<1XT?iO5cAyarCP;))vvTNMdg>3G+T|j-Hib z=Klc0)+;TprEF$61sP-mW@-!X7HL`gByO^^E;k_l9D0709MhJFt3_^X+4xd@RygIi z)FD`a5w}G z)itMpd`mQ|X{p0JNXQw~lG~W_PJ2`|*Tl^t*F;{_JVm8I*AaPc>$3yP;FF#Yy=qy_ zcd1$VZ4;uRZYashHaIkvo(fAyn(}y>IY=T*hpbjbS;3bj!)LMZLIX0UB78!Q_*kVN_k_hT**|fCMt(|TV$i+BC=L6S1^+5QJN1dWJt|FE{-KIuC&#!u# zC?(ZU-b;11K;Bu0xZ|nzq4Pc1d#hqgS!}+@lSwi`7EZ+@1m>(k8M=gAI;x_v5lGwv z^{m@n2TruR^X?qnBJkijBX@EKtyzOqcDFXuD+CO7d8@%5i;kw1nBy+w_OU=y$d-TJ ztCv*+80MqBf(4b@7ij#&96MwNAKmn(Urz)ADNWpQNXHSDeh1d5T+e!5S!MF1w_&z3 z5g>-{+3!v&Oj49lt72@dWb-fO-Vwu*jyC#pR^rv|?BkKFAxO)<=aISEy@#-_Z$6Vj`#tIKsA%QA&UEToRU)nMC`3SO%z3!SK=q4%w0 z7^Gt<$(E(oxNN*%)iNbC64J+AwOl17RA-MDcXJ5*<{)~zBumjF&x1X1pE zJrrlJ9ZeRIHvB<88OT0iUBG@7q-_I>{%#L<2<#WRiL+eb{tQPdi6gInz z$+yd4oN>slD6HJHjL<8_R2G>!AMmOV72(uc7}o^Hx+izW57W|`nz)=@jLT~okQpbu zAvR?aMppIuGT=Wmgj6vMv-kw`T*T z{3p^Kk+p3^bB~)R1b=j&T1)Q+SZR;8%JJPxoT`lD*qZDt;D*liCY6-Ozj=s`So>A& zLjM3pv$URlJ_zIU0Q*B+V5!edsdoBjk^BR4%+nBhJtnl}-ZUG1Yqvil=w0-W#EBZFG^jVhPTcmkVRn4>@WcUpcly;h;=h^Xd&roTPnG?B zz^Cc@B-c{Gc4vG>4oU7$YNZ}kxL;EA_j*nK zyoh203mEm!bMI3u8WoBJxLvX%5?#9!=~%aO-a{#l7m1^}JjfS?=lSv4st{7xnN2Ot z3#&P7BQxIK9r!=H+)9C--h|a8)Hb@y<*EfgDc#Wj07}i&?k_~F_a(Q-jmnv%xth)! zZ#C|NPV4f-orhc+-BYqMb$b_O)-A4_G}ep)jnR;Exrb~HPyYa3i6D<`iqJUo4kk$l zDt$9t{m+b196)W#IDN|?#!&jHs9#pqwHsZN-OC(I<;h{m_u{lvWX#=EYfW)%w~^c2 z&RpOqm0yxS`qf!4m7r@;avgleVB_y8_N>_^jt41oIA-H?%6fy`RM#yR_HnsOw2mmx z$iYtH-NS!6)7e_??phgBM&F1FFi_{5H+`Bq5c!@`F<{ec|^ zt#TUexi=wL?U;;@B=8MsX&P>|atM|QQE|R#(f(k*quQ@Y;Tvfqj$2FB*a2qFcYYO` zlxe+9T{%r0<(`pyJB6O$tFXfSxfu5Mt*s}+P)gukManPBC;MKQ?tLpzEv2QDT9)MH z%0n0fa*^EopIXwn)9q5tuchHuFwG!syGb6Eoa?u-tT5?rN2ho;2tz&WEKxvWk^cY( z*WS0RwXGjTc%e->BS|CyqAD@ix#Axh+eIl@VU1;GCLD9QN3J{9GjHLm?Rx4*x}InqL6^u^I|y%T z)`HW+b7mXuT_OuF?)Nqh-s_&mo2~fAN78M{)8+GB5TI2*J_k(E8?7R>2_)U*%H!e1 zt(zJ3tKbVl7Xb6OvG%E+e+6l=gwu%KkT)kJkUEYlFILp<{6%BuJWh@v1ZBA6u_Cdp zwcCaX8oG&>B1B}*ne06UZ3=Rd_nDNZ82l*cM~!?>deSzK?`sTew1)sQ=Zq3PsoGwN z73=ML$tPlWBd%3L_Y6PJ_)+lUYMRZuPd%&06jLzCTpW(0-nvT-Iuj9+SCmTJtcd>r zAOP?&+Ow+RPer+O)TgU4t$aOg4a?7Pj_+{AL_+{ZJ`? zy{g*%x)T%@$lhM%Igy*W`gHv1G}6?16OR)3aB31*Ufz9^XWfyT@3H8(syAAWp{ai2 z#vv$Nh;VQQPdxh6C&C(YT}O2^&n&RHD)KgS*FRe6bS+21&u2A+@D;i!#by`*eepxG zS_Ze&=a<5|+_tM0p*)esgtt?;k4*a2y(>V`tmldgXV^<*$j{Du{yz0R&cBOvvAw$7 z>ZFM}0y|YWWm6a0mfLy)eqed`B9-LOSrY0?<;rD-?4kqKS0oCdHIxy?g3^CJIP!8> z{o~ZGYg0wM@WsBP8sA@+oD#y^xjPOzH?JR+N3Y#lvqv7B&@vKa^W->CIp6`;o}Y~h z>Fg%cMg!PO1OEVM##tR38)wcPdyqTTy&C#hB%VO<$`>2=C_8?To$eA(y}?{RVH=G4UVH?bog)CpmZ+ryAZ(of;-h~`w8t2mm+URU%M_&;oRfW zvUDjd^zBIAL8vo`7W$g$wx&Cq?Sul$)Et`3zts>)FofZSf+u*Yg(v2X1?szhSL^Vmz8<&YKi+V{{Uz1dx4wO-O^q zn&r~QvB`pi%mOcyZhxI)I+DA4BUn>bw&eC+5k!;y7Wo=TqY^q7JP!E!S3?b+gpj4x z<)y{Mfq9W++NeD-STav=LxP};lkZ&awx;Ttiryd5>?H<2 zFhmNF70UtZ*0pra9vQ)j?m~dXq?0%K;;m{HI$oW7=0$jLPS!Zc>C+XH;!Rr01QBVr zuOpFxx=aFb$@Ua;PNT95LJHzvU+9`yFL|lPcPHHkkF92pi#kr8pJ%j}bc>z4A`OB4 zYb5wPO4kc&8jbwu&V(CGk^%K6y)B=Hr_pU*3G}_;vG!}Bh9~RjJ?mvonpT#q!PJ|2 z66#(!y?Eqndq?xkTckp8Lj65`tC-bwe-U_&@>CL z${e$>1Ft>(tFhAb?N3**dxLDyhDBi%>I+2PzM1x`^WJFM0<;Tmo@<;$z2Wh zSkN@P$#>ZcpEfO^vy6l5is!UH7u{=dyjM26UTi6D0LVP9J7%?fq>@IGWmO0Gw(_l6 z$`Ve}4t3Diz10ovoHEBUZQ4`_#sD6Kdeue0x3#ouUp5d)B~?eyp5#%s#@f^42JwDoa$XP=|8X#Cm2P58~zwtHg?5Nj-d5YMP z7Ca#X)C%iVWbAXgscLOo>vq~!qcEQCG>+Xjv~w;2&T>Efb!zM52A!r`s%du$?>gmV zM9-FMiPWyG@7_sflg*A$psbC6fOgM+rCGL52s9@3@8g1V5nr;Akl5~{-}J4%s-EV5 zSd!U^sQgsbB%Q8cM~`tnUBttk$NE)GZ^X-gXZDMTo;f3n_nCjb!}y1w&0t+>2J&3P zYFagu1m~lAQDxz+XH}7BSY{EI+R_d{1F;^J*BUhAXJe98s?S0jtyU<{nG7Z5n;0PS z-qmi-=Jx#!tHQ-q^RjWz{{X7BExa1`!2Pn=G5gUtILP%Mg=$Bmt)0KyZ()qvI{b|1 z1zY{2js-c^ryYd~H6-rL$TTfWTZUv^@a<5dbV361G1IMTX?_;cd^sxK>MSk|x!xU^ zfF#FWdChG>;olTR9A9XM{YsxQUoURYPCrjt$d^mJz0_fA=~Sh>h5U`D=NQK)^{z=) zb9TAc8Y&38cjApU=2ft}w`e2`rqqI}j1OJJ4xQ^eS@5;slI1QgcUqPW958}QAMY+Y zRrb=|)mG9t&Gf(G&m=cw)1203kfMdIjD^~))3+;P4Mh;j8Jx3xO+!D$3b40dK&T~C)3W0nAN-oxDb z(50@dT$lJ!PsBeFqwy3?XQV@NlN1VLfqq!naoeRDUXQQ%rs_Yp-1!R$0mt|Ib6qB% z;f)VRu{V?7MHV9m$wTv>YN@Gs??%yL)tk{FQT zreXmnKXi)dKj9+rWR@pMnr4d44-sw7@Oq5(70*&Ky_vN+M%oQ!@~7Qz=6r)AEx^z9 ztl8#!gf3)P@`=dC-hB;fT-(E{LFSoSC5<+;Z;`v}inVJll@6Txb;YD@AYJ}*5%Ld1 z?OCS!7UR^$(_$A)6{OmyAy^DA(ACQ%M`E{68X;1-3&_V@kL6hNc#=6GF<8SIfg=Pg zc#wMPI|L((4wwR*4d7uxdaC$w}3_ zj&O6+=~)qYh3;i|bm$xH6X2Hz3I}tJ)t@jI>pi5>kbI%#NipHhc^K>mtz~OgraP#o z&@N>N6XutGRR|oZ_32tuqO4;&t}N{>?B4R`E6YpkeXKDeIVHixI`V7FDUd}nHNZb0 zQMp`t8se?|Uj?jbtfk~pI2#*z;m7w+<5(B|Kk-hhe%fB01d>R^{P02d3Fz7Wm85X; zY?p{h9)Mwn=JCAnVsLj!G@~q|*meS$;N2TS@mItfZw&aWSCZDoRByCuR;#_?$RajA z*~U+%exr@jyfNavYS|$171aA=BufFx%13a=xHaGSU&G0yOxlHn2?UCYC4xdpod@*x z?Nv6R8zLZ`NnMvObX!jkUfuX}L7UIAvbiJeZ4S|Jr|!t3u{>mY)S5q^{i>g6)jXJ7 zg-AfgF-op3)@STnhSO4eA4UB9)R~X&CKPw)o90Kp&DkB zdpmz|Y;ub>K3?CDvi#Z4V@EEfb3}d3<-NRqYa_7_<;xLoodERyRVsWy)AXBfCKNIf z-#V2BRmV_;y=(pHQAZG7w2OH~{m|sH;jgA<9XO z@lD2|u0Znrkyj&fZ5U+ZuN~`!x3twF)T3#xa*|9)RUD}Pyw`HFNoJ)@!ea+%BRrne z$BRvl2%*#>P{5Y+!NP!l4Cb|ikM z7aB}5Y7;;YngESlX8?aJ)}_SuHujG=fn$}3%!~j4dK2kcxv1!hP;z&XOF+@=*b9wg zd1aFfQ{^Rl55li&T8@uovDn8L0!P@gKRZr4)()vP`bussWD+1CNT6dM?R!;Jj9ktw zc1YlmMoxCOuh7uo+q-2c*;yM8tx97S_mY{jDK98c2pHq=_NXRV48BYbS8|3Dmfg3| z(zH_AN-VFU^4Y*D&43vCdsNU`v5BYHh!yZQag*2)=}PGjR#SKjTty~V3&Ry$1~~iJ z?N=aXTU3dDSy7m*?77Q*I}h{pZp$aVHnA(ra5sc(WcME2)23U9ZK9f3yqqx}Tk_ba zdx<28O|9IPMJ?gqCP*q1k?ut@?@WQGj7zKq%Z6o!Lyn(t`{tOsuAy%vk=tCUNmLAk z`GNY@ME4fSFPUottM9~&&$uV41N+9BVA(rfL#65seQ>NIjW(2w4a|MbP2$fMM}MP< z?UFQ&W7=aU=59LYs1=drUr%iygKHh<$ye!*_Nma@$#%kY)1-i}$ur1<2mPPMtthv1 zHrU(yJN;(f%JNM`&)Oo}CAeax20Gw%_N`qD!l?4D$<)UaD>SURW$lk{Y1(T?rd+Mj z$vuC1G8B(bN|kjv>}Hx+?iNLqWxiZ0jO6i6&UR`bly{KbXZr_2f#$bZ%&|W9>@rVL z?^$}9-D-EwW2Y#JVHlU?9Hx7ZTDfx#mZ>zKYR>0~Dx>uF#w$V{Hrgm7xSRxLTn7iB z6{4Ri)RwuPhb?39>C*A;=ACZlOf$*6;xXs}?^;u6ksw%N3pLZkRNM%@@IHgv*19ha z*lD&}BYU4p+s0ifLblu`l-N__u6dZeZteEZ0Hql)z!wAc5b|;^g zuhizGUm0kcb;sDqFCsSlnFq`M&>w|MjO6Zzc&!Wex)qeNyIpDH?8SDpZ2W)^P&?<2 zDiqT+O&%t?W{sq{d;oYT2S9x~)<(In_>aVJ&2^(fvkkk7#qzhO%UK#yY8UsBX*ahL zM{zU!t1D+D^j~_Y)0bCbWjkzjddI~W^o=apT25{R8Dkx>0l*`pdwW+odE$Q&__a-k zn9xE-=W+)1Tyh3E$)wTz7pTV9I@YeLCJtgY-d+z3a1MHoD@w}E;bf2OgcA8yU@}j9 zeJawWN;g`vAGDt1d@-YGD`g>))+zQOXs+(pGAZeS$EOvc7l*DaJga?5%3nNYNJ^iV z2c`h;kL6B=2(1qP0JFT|j_=(bpPgu0yfa&@v&kY7#BVZk-ow+1=ABtKYYJ&1g!)Qc zNRh9Z=BMw3amlwlV-5a$R0h~sPA*kdq;hi@-~(H?6I#b;(2J;}f#ln2l8|PY;BGk` z6l4x@lhT=>YFb5v#A>>7w4Pxoo53YJgPxTNa%i^%iW)D6Q(HT4wJ6dO!3rk@pXxuY zYwMmCv+%vgpC-2y%e6|X#6diL&U(^ny8i%%ZS7>ahQt?G%SIMZHWSfX9Zh6g+}~(9(5c39E0ENFAnCS9kl8)Nai8@F2g#Gc$?20={{Zlu_>Rj^HkMY#1(Mu??l7te zvUU@aO!OZUd_%g@ZI;VWzlM30N&_E42i?K?V*F7U~0sAY!(-b1>zS_GE7`=^#j)xr7AS(XtyF# zn<9@&*L+MN7EzMS`(}=1JEt801F){6Q}B!E8cb05io)S9UNRO5P=4h*5snDQ`Qwgy z%f*Aky1MH+ausOTZcA=a_4KR$D)HX4UJ0g~rFTXFytzo~r>MxlBRJp?0m-f} z;jh4Nia!{iSBt{WY2;~8thcK@!lS~DSOz0G$I4E9kD;qy5`GVA{s^|V(`|fVr|OZU zd+*JZ+ko^32dKqmKVedQk8#FzBCcfL`1@DXZ2Xg}O0Nym>`CGO09d4-mGO+=9uHog z^@rjY)pe-L+6h`b{_%%9$3j#d{1408pwu->EhgLv^#LE4-@6hYo2T8Xw*DZ4QM!&V zvdZ3ES&n3UWS%$!(z@dgRiVu}-$qGg;l{Uw#W$K^X3OS7@{Zuv-Hwl`+5Z5hX?81n z1WG)^B4wfUZhO}$b7$il$fnTlbn^snADEI(nOO@S3X%7R9E$Zn0eC-A*E}OGvYLpu zmes=E+sJV8o-u{~?|M~a;~S2Yd8AjemMcp~ywr5jdjsG{BT2ENa6#aY%N^=XC&IIM zwrh)rMYWub@uX*HC=FiHGnodOm@md^)`Fh25pDrF5F= zl5Fj!h=iROj1_P&G0sLo)UC_0-wJL=32$Sft)ggNR8y>KaFM7F?g{FCwashy zny!z0(&@}4i18W);k~``SFB$1RA^QfUq+V&W`65JlV<{O2JjUO}j&eUvm5+1b z2z106Tiu(9EYvf?Ni1{NpHtU0RO-PyiNaeIyfxvEi@rRwy3}-yK6J6QMUL+JD2J5^ zVgQZCbCcNP9Cfam4~16#6tZ1cQol*SB=5=H8}!=1^v`Tn?*(|TSI{)cVerM+v=g>3 zEm#+hKyiS5Pan#yiS_$up4VB0W=oYHx_J5n&f)J_O0`EVHZ_ejk?39u_&ec$8T>AT z#9s~kRjJ>bc4XExJyvvY?Ax{j9$(4|A@9jn8&4VM#XLdq^TgJ^B!@-5jsF0&8s)$- zao@j8nwMPhu91B@c*jcAx6NlT z7W2s$&mKDcf30N-l_K;-I%)3C9lR6btrpT&)^xk8D~OO5j(Er=PeYE?t?=i^9w^c^ zD}5XLVcSphfxEY8fmUBmdK1$=o$BX}zAv|m5X-3DJg28cn z9JkK!hmaV`ouHoEy}Q*nIn(!sl21eEABkQ8_z$FbR?ozr4ZKgN-CXNxB)GAW09$9| zuq(6>1Ai9)f;h>|dFGXBo)?j?FRx{m+2tj^#UbIn{Q#EB0 zr8`vAr18eIo)GwR;fslHr-yuvX5g>g%MiSBKs*kZCb_9loi%AYqf6>ZtN4z~Rk@1t zeL=;{XZJuzO6}>#y<}dbGg(V)h)m762gvykVrbQLeN)0QM-|14sQy`v=bk^B0qKMM zUWTcCzWU18J<~%r;g|xAtjGAb1L!NJHc4{qOTG0SWvfqNslp_RF&eN}l30UoIO@Kh z)dz|6$MK%7x<$RniZ+S2$G?M~=M}YQp=us9v7TQE*h1G<(Ss(P=PJo0U&SJpAQHXC zbB>i$!=DKLDtuJ&UDw0UhI&=J+P%Gumsb{TbdkvL$Bn^Rhy{Vi%bc9&pd?aFv^UC* zhr|9bZx47X@50)u>DLLR!RFeCHpe81z-Cj_?I$O`54CYuzB9bnZVk4br_baFkIq*p z=}M*X%uZaBd&USAEjjYQ&!g}v$sjLAr-0?@>DOJNPF$b9rg2O#%sa(!!})OGI!_&r?f`eP*V$Rx0y*_5P>{l*88^707u zAdZHx_O4#+O;l8MXFsc1Tia>h*_OV1QO_TmRK7rC$;cl4s|D}wZKr4-RaKBK<8TuU zJrsQ^pNqU@sp`75#rB_euLBLq0w>Nt+0S!XmsWbNo{{QvUXLneQibC?ko9F@>OFh= zR0JD>fnG z21BUdSUsxACQKI#fWtp{Vv?qly9YMOE%d>t2Gs6gl1q2ms|z*@u;*#^$LCJeEUpBX z23EL)N<&(1Kf8^+BmBBoX{7k;N^cA{hKhbo*hr3a_qsbNd2mG{t7Qfh5dw zz~3(J=hRh?3iw~fek|2)F1#%kE$rVnXN};4fWD*Nprl9 z;`zFJ`u3`PyAyk(g@tWxN89whc@j&P`#FtR?`P|Ry}2N-?t38%u zSt7W%P~L9g#{iwU@0?er{?9)Me`dcM_>)t&_|xN!Z^Cz0cCS5_qoYQ$$28%W5tT5> z^03@`DB~NlMPz(i@NbB;?kH+PJIhG=kigxKMYS{+)E@HjNaqY}oOQ*`nrX<0Ts^cVaidSPah><7(-)p*zf$POPa^y*Ofv|K@x2N-^a6%t2qu{Cr zVdbL$NIB|FLmdAAW4trLG9sZ<&JRqt zsj5OEiC`XVHl{XG#JuF^YaY0%AeG?SLPR7)A+SI3>Oti^N#t!|AN>^cbe;;8_N5oaJFUok*=M>!sZRd?neDo2bmu>n+I4D=?R=2IT%pk`(#amPgd zw3A#YDBB;cmNH(i1(8l`A8ixp7h8=PLoFy`IAPuSo)B;;2%>|fUn4ir6 z1(M%r7~_@)*VdZQh~|+azlc0>DVJTbUwUkB9n9j=+TtHMPUVfd^VD%qws>Tj zQ4}4|wT?OCmKdW^q6sCADBT&|Oe20|{vdb@p5~;vMHbP?ac0Cw-zQI%vDDDaHhG~o z#L^KK{#jentF5#xD4niOB3u<`J6L~>QUXty5Te!EIetZvTo0T3r@npZ@FY>lv0F$W z*h%|5hb#|rO#np&xLKrzD3(&CAw}qi6>VcsU*M=}_EBAy!d!8B_q|gNE&ZYSqQNxPLAnVryXH;Q`wJ z08aHxc~RX$<--wz6F64)`ct-sks7eZgj|WEb_!0`I0`?;oE4%CGRqv1DuVmhadjP3 z`&3YggmXa}q@mrKFjs?<$mg{$+GCP-Ygwa=q+u=RCi%b z6i0N4Y*OMYmX)1>oz!5f5u5?-RuaO}EiPE%m^YUGVn>p9vFr4xp7ZSCCs#(3l2k82 z*!^k6flE$&sxn1+p4EC;1U zb39h|vdcBR#i3Gm#~>LUzO?Bfw^s(;$$29Z6P%&Q>Frjx3x=yJDf3KBu1GB)O~(Xr zRNm6^;6z&JqO^n~^NA1Fu&V*1S)!9N<;gBz_;JvC(^X?Ithdsus}{<}+je`3(FNVc z$2-}%GF|0aytIlnId>fAC$%d_Jm`k$I=T6gaH~(VfupyI7^X!r$j%{en6W+cQrzvf zjqPWX82N^N?oV&6P|=*i_sMt#j^S=u)qxpcc+FcdOf1s=;^js#+p~rT7{RB{46!tl zM-KU9O|g^z0HFKR%(jXnw?{FF7i`Tkf>FDScJ``6GUkRgCLyVLb5FuYBN9md@bnd{ zq+B(>?rr4%07xr``LMDdTz0C^BsW9Iy0lffcH0!J**9vPmt#h+MkdOCcl6 ziFRyJ(4TsbWUB5Xw0Pnxhw~e$^{o_*Ig4u~QWd$I5yy|d2^&cE6>i?`BTyq!#6DTq z_?I0qSrX3IPL~S%Ha5_h;PHZK)5&;c7ZAkmsGwpoh5Dab-ZOU^sb+1x!c2u?7$cl0 z&*zGUSCC}D#IPA>E5Q6K9sEYZ?ilSNF-aQYWePFC``?{M7Op3_WJ2S@SIS*TVD31y((|jqs#; z5$jC1h7CV+UBbn1LxV5gUwUexo2w>iwc0@{#1-b?0RDAGnPW_}wgbCdP08+)&`pWoa<%!h?l$2}`9J7u$!JhF|s z>ZIV~uN8H13}|h3nV6P9M<17Z^e9$Q+!c*TEtX|Rw~3^Aq}at9{aGFTsw?dxKqmx^ z@UC_djsE~jW|^o;=#nj?MKL5wgp7SgD89YBk&V6CI8LsklU}T9Qj~6K%@ZMEg;xS5 zMJ{)+Y-8BfxXh~xgg#hD<#W^?gj4OstV4a%dA~M1u-Fft$KI-3Y5{c_?Vz)DDuIEJ z{IQ(~>DJ zq(DlH$e(qXj-J%ISBcUMK^t)1MgpfmIIpJ2aTt6SVF|t2op`xZX&*y)Tt#^lR`E!7 zfJiIUdolE`*H3Le3vxuOC}wsUWkr4G9HAj7~WBuT1du_14h7K$FWH zI~=L}EBfDuG4QX4j8@0y`K1{`v%cp;HPwPk6I-c~H+4M&r&nuc(qdh{|yqAQy17aLu_gNC0wAaZrmw6t30)6NNky zYH06Yf1McFyP&|}dWw9LOFEU14={bl$MmL~6SLHc#xWE|2DoGH`O2L7)1K4#xgPOQCjUbZ-%sNSGv^TbrHoXJ1E?C z^;)k5420D>ZRj}F z72`WR@p6s4_RdwY(-fBhWN6+*#F30{9jZmOh0AAkWxS~!O8F6HF8Z#4WZ%;k*`AC+rR5s`;+YN{));0C788CV;-k;A}pa| zE^(2^*1BOiH)eBA5lZQrv(IrFku*+saz}CxdUc{0RK&rGFC*s7O4d?agx_>0cO1St z3VasKyS75jv~!O2+fEOu!&0Xz8!BAS9?v1dbyL`yr*Wqj1WGy%Nfo&a7VcFM%8?0+M!;RVsQ0Jr%UX9R$!3_V3&$K4_@!MJW9~UWD*pfv*0b)l`IhM> zNiaL)RutOYVox?d;XgW))}VXX+xPR_kdE0%iNRA|EnMDJ7saXR!!L2&8+N`ZyoTtK zP=Wj;XE~&|@g&y^DqXGLa_#l~^_APo7)cf~@^i^OfUEYpte4g%XlGc~Aa}7I=|79W*09ZvF36In$G zFFO~>5s~~S-isd-==0wtw6`fFn8r!QzBl6u5@(;CIw}x9gq`8Vf z$|T7I^V9j)iwyq&+Q}}5Q^PlVBhhc?yt0X8yottSZL%@yJ?f12D9A0AaNc7Q3bFZr z8qJSgZC6Y|s3e?8wFHgV+Lg69qPBZ65LFAcSO5wit$GhLr(-99l$q#%v#g#4wbySn zpB?Bz>Knu$7Jrm`{c5+wT_3{QKD}{q;qCC-Tgc4}Hxln=T=gfvU&^^1H^&+#l@E|3 z63VJReuYo3y=Qob$Ci@F^IQ)*?FqELe&F`5y8K6mmJ8XZX(im`r;~deSG1P5=*jhM zR@UywT*-qT^ORx8HIJ=Fq|0je8cePWe6w$CxBmcJ6@jbjch_ABpr-lxbSX(_5<>Ss`I??iB5rf#H3K^{JP|R@YFCHDkg= z=jL9kRWHoeaH87;W+d(r<0^ZTSGI|0DyS=YWTX)KMqULcR7A?l~x)=k~?cM}G=av78> zg*YL7t1jaE%wgw++O5d{0B5#+O>tr~mlewvPa%2riQeyR)Z+t`V0kq)wxx3g$L^w# zo!Rp<>WCuFX2!oppzs^14n?wvCrNg{<_O{ktBWcd5^dmcMjfw zQ=&)^5}7~_Mo&5RuL`C*r04GJYZyi=Q&s1>5&6ptY&>~`p!!n=qi))Ki*Wgs56QQY z`1{pgGIuDY-)L{00pNSnVU3FUv8fniv=R5Y^sD;R<+CQ*>^xc`x7+-z06t|I=Atq^ znQNBBgmMCoeT7=N(=K5_d~aD;oTLmp_o}AmJ6nPs8N)6K#sSY`Ty-3i)U~24`I6is z+WCawZx|e@KJ_WQOX&rytfwjp7C76E-qnjOh?jCI`2Pnk%@< zhF%7KZ(=JuQn`*P)z<8i-!8+#pHfA7e_3=W+V@?KcO=<%_ga!Sc+xbCxcP)V0QIa3 zyXAS1NQ^#x*asOOg-tc_apX>{*>9Ro$%UjXO1rcY{%Y)tV@9ID)_8~~@iR4A=( zRybx6AGq=!bKKX4>Q#%?ishTxrL<;gBp{ExfOMzW?bYze3O@y7C-2s9oNO>Fzph`B zX)W4gGsyuf5d+ICdEM$MDy_=QT-us(dCr+=~6z4ePLrI%E!SN1i#<*6?V!+djnw0w+b3WC*~fwu9`Hd)Ps!B+*;Jh zJ|B{IiVK04`@^o&Qd-+AauVS~Xz?g0M{se-G|6qEYt%^Cd9DE6)E}>>)~rVj#0E)XeZUWqNX`ao z)Nv)nvrTP0YatvQa%(9#HDg5y|V?IB}c z=hmMzi50SC4*U|qDmmNAedPiy3JXY1b5p}CODe3auL%IF4hxgp=~+soQ?XVm&2tPc z8D(5>PaVI;uLPDDUoNBpx!evr#LL3?0hf+N~1#`StE`)OC3%rHAg+3=TbM`WBOS zcE?e;byaom>FO!BFnLVEWL719QJw{K)*(NiHs>5s5BDh@%LqxWK6e<-9BM%BDp*D19rQc&8_8Xd94SXwY4#nPvI+ zvpR-3Z+fiu(rgkl1>8tc^!2L}>Lw{fmXTn}FdG^Aim7#X=G!WW$qdA0P6GSa9HyHU zyP8(E!Ql+|D5!cd9et_^4)Y{ofmsu2Mm_yO?NzM|pnaZcL#BR70l-t~W?1`lli07{uui->eGTEUQs?)MGFiPTpJ$tNcTqmvEGYvBVHDX?NZB*LW^xen zeX6C!qsc#zs^Vo_q-1^Hty{T)BDhw!+!@%o+IxG{bH{Uc7@F)#RztAK3i7^(iiv7V zWk{{8;4ir_S-0!Ad{A4=7V z+1koAV5MWqhhfR%u4;HZHynE|WtmXq>{HNF?$SN08!2dl6%3;vH?Au$ZF5dbBR*R@ zi;IYeLYn|nuwx_C)N|^|XL~5Rbyi#qV|krZ7-6U&T-Uw)!QpcCb?*C3KvjhjFrc+ z!2bX}YVEF;mgFmprvCt!bA93LYky3&jM*5aMM)Au(W`;b_Z1STqp_qZIc{@jNtI(o zxh^-8xs+obgkaU1Z3QJERAOB1SI$mx-_o{QPgscrl?R1W{9pZQuJ+7<0v)>_Am<;Q zXYE@xR8lC%0@@ac%*2KH$sec{qiGokmo{;k4)2)t81)q{qikf7JLhFWR0eflK~A)3 zB9Ise0e}j)>V0cDPUy7@GM&sb%CZQpw{98OPJcSLITuA_XqG&HBnr6B2X9Ixf!18Z zfhd38fpwvhsRDg&M1GgcMU9}`jb89*K2Ex*)Ntu(V z{*`hV(G@o)PW*iQ;QCalZy+r3nErOdD=#DISxRiR6eXsgaAT6*&JDyae&{>BhrJTn zFZ%DYvdWR?V;;WMdr7yo(n{Ux*J=brygIOHYRvZ*r#Xo#Jnr5hEX%o}kxRrRfGcXyF$7 zb{(T2ZbR!$s&H4m%+%{u(JLI?{{V=*U8_9LY?2`16q6KRt*D6xce>B=63~^i)V2is`i)TLbLfI);L)I01(DD`qpxqe+nEaJNwS& zO|Qd?4KCVeO*n=Q1fF5se>$~$95%Xfy|~*RAIsXK1b{m6(wV928imfJ(Air~RLTf; zZVr2jNc{I{Ebe2=GXX0(`=jYuyS-Vhqa6{Kb>hf0SineK42yvH4UzseMr79Y6#IRQ zpg>!6k+&{SpcS`q;mZuGs2O31_xja6Ce}CmM6)E80^VYzOg?8Sag_tMY95;q)9O>w zpp!tpS=Q=ymB7iGO~nVH{#CI0vdOkY0aO#_1?+o%CbM-r6qbKH2?Ve67S00?P%5kt zUc-DNxH(dRoWB(}?iXugp-Z=N7DQ!b!6?mDZ{hnz$De|vDx1$ z_&DONMJ-I_Cc!mJyPHLhEvM#S#RfMozpY!2?#|^>IWFAJjtcXIQ_~IWR8z!yL>hr< zZBuUEs^D%u)mrCK)TOrjb&i}&2XRyjk`Hr9#9Zkb?Kmqe`i0106X(lTBd-7hR_zC! z43kd&SqqJ>m=~rwdXCmr+rU}|d1Fxrgr+s@hwW__e2+|hXLyR1HgIO24 z#PC_alQHvE&LU%#1Jb1=!{Z6tmy@T8htl9-t$F2XY$ zn~iZ-x{_XC&b!=#8bo|39+;{zL3<>au?KHLN_4CCF}9{J5hV0SM{(jEN^8Xyw`#GB zVC_75=B?g%V^;As)K<2)X|;$U*@*z-jw=q!!y4t$2|b%^e#GFPueEj>ABHcZk{gXZ zr7|jjs=()`e^4rFPBhigbfY@A=0!+;9G?%(nGr7T$1Jk~5tQ{@cKVJ-TF}#cGo`lX zf;U_)6(wx3$MBQi>s=E?tgsU5Mipoj0CCG7Kx&=eh;%rbc9oGC04#v?K9$DnRhv5% zDsV$=d^2->3q@&#F^;X>BP48-Mex6lLWPmx9H zE_W@A-ABZ)b8{l;*0VAy0;(Km-!($dPP{XljY{CmyZ0m+IgEXK*6`5u%V`nge<#d9 zB`3GgdQ)JH;6_(Nn3ph1!Qbp^xtBvHPEFmF?L0lCqDUjPRcGXuISfx~(v-yk zA#QG^;C#i9k`8JMO;RbXC6(t&p*t6Zuo+d$Kvw(HE`aUpeGqB$2ZG z>N@0lRBbiP3Fbh^7j_sjWc@SP)_wM+eP?{p#KG5Y0RtO;zNV7)=2fs;du`@PvUfNe zQ1>8unraM}Q6lYx7P_9IUO8WK51$7a6&9rN=~s@VnC+bbBp#=@_o#Fo2Ilq!dzl^w zlH+7=yM`Uf_No^xHN5XEx}=Sb5r8Nt(B~r+mdxLB|^BcTU50U*3U~^T3cg;L@ z_Y8>gHV~-eBzL3!6N_7DQW-6ah?u_Yf;04{-T1N{QrrizVUk${Y6jm!nzaVH8M={u zO*yoMOJr;5%lS`}<(y=XO3j&~S$vSBf_TXpU#&@NJleDZ&rsAF-FN=&p&vKX-mKer zH%>OPBsXr8oa(2H=Z3!TUC&1CPp9Y7CxhjqICIgWGYnS%fM~8;)OJ|2Tn$Pwt;Bw1=sI*#{I+r z?^53QdJAC{&7<#7=O}|2tMz=O44sO-YHBfS@D!mDtid7 zt{`CwlPHgL++lzE)H$>-W|><<@Z?siZ*G}<&%CK9&&{7t=~q(C-XF9=6;T|SWl?~8 zagTbROM)AR^5%&7h(CF`j@8d`>T1oVn=+@_(pcG;vm^xIa(ayMSWa#3YZxS~jQhCf zy^Sm*hk)Ej%gF7V)H;`g{6%V6zRt@Tz)5#xIP|WUOR<99Lf3N`gAck_oYeZKiEJ%x z(%wjw_I%kVnw2Rn5qy!g*@@@3f8Pp2{%SpSRrBJ@{ zRJ+;9b`z(_4@}e-kEy<%Zlh5n^S&isK=t;d)Z5fA2%}QtSJ7;iXzj+;L=LaJsqUt- zrSVEzEU?BMjH-8plK`%Bf;;_dBKk(3Hn$s;x?r*BDy#z5NmeO?5`T7_YAOdQ+~T)9q3yr;w{|C6mnKfzqnm&#B)}9mEP@V*daus`Vq&6g`C3PR(~4dNgF? z1Ha=&fvGvvZR1lfmU%ha$Ds74$>Kdl7j~a&@qwIfP)9zQ=}tOyE416&$QYfWo=l&n zD%P221ee*=OJQTd5ex*+@ngL&b!t-PdK6$9#PURLq}#pzP~ePuWct;~w3}xyHlZ+* zMPHUAJZ|liRzI`jOK{NKd8j2T`_87M-!PGq=H58deq$hf#e3)4q0ajjp<#5r63RFt zhVoLX+4Bs9s2;|&H63G1()8f4Iy8fhM^Wur(_UK3Z0{Z8O2lkvm>hxAigW(}W7|lJ zJ(EiiO@=VoG4aH4-)q`Rq{X(xZpQ{veLYt#tR1 zoVMnWrbs8ZuoW$j!mVy=s4j2kE?LTn5l%k}-_v{_W1>MSExXAfW98+zVox;_oiw|$ z;Tn(09EPEH;tfHAYFd-3JewxkxWGT>rCEo-whMA+yTr1A{FQ=gH39gV#OHXlY&!lTf@yX%Zz& zZ1Vx+^v4u)+i~)AMg+PeTInav)Mu6_KX~rm2XmiluWjMU2g#vGfl-;y+8cM6Ph(vk zx22m{B+_l?ELdqlJiZIrH}*3Dx`w(JQ10DWd)-%2 zxtHvSOkvkrUVv^8Bp8a8G)q*Fsu- zOytt#DkQ%SI5|e>LGCMh$6B+F5eU=xOaUaT^5AidQ!RCSHL(88o0klJ%nmp1C!eUN z+3C$RW+`MLQ18!N`ifF_+^D9uC%d@Qn&L#ZbODfTCB9Lf-qj7Zv0)X%M>JcBTt?9x z=juPLICyH@N&b?u9sGq4jlP-n6q0FHkz0$)i^R1MmSHgmE&k{Nrs%6Ov1sIyNUflB z1nu%-w_6qhK;@)~ zN8S{iowOWcuX9&X(;rU~L2!41yzLkYJxxX~EpkFEBAfDs4g_+nU))y*)}T|VBHRVX~xdt znayi=}T$naXQRaW83;YYniYafTS z@+Z7znGQ<;*$wolZ#-QbcFk#HZ*Fa5UA}LXhERIuw}mLKhBB!4Y_=@!wFyR{aepX{ zV*#8KjPxfJEEab0+G0EBiI5Wvj>L@j82-Jh32$#)`7wl4U-fFFf@-Xi-MpV=naGU% z+27EfqODQ8+{x8Q*S@)HX$wPm2$C?YRAjf;=~RrcT(OEte5GTxR)2p4JC7R3}6RMsIAKf9nZB>xVW8} zY^|XnN0QT$2zEY$upi@1i$%WF2I(zj9$?xww-_DkR?|+~VJx#i@v5DXyLBuNN>Y-i z<_a>Y(9fF8BCM-=q>=-vUV3)VN{uvGo!Q!RxctH_=Of;_9Uo1O@_59N#UtdaMi}rt z54~tyXm=1vyjvtus)B(=cb@$A0<+i9kmCsVN z+R*5Q7%j(7r5hDDcFY}CJ%};$as4YY)*0_6kU)-}Qi5b7DgmuMW5r$=x3D(0x4Yz+ zlCmQP0ncn#F+Qo{D~2&?Rt+NHq79he+}3bYlGLe6F?L3!#2RYcf5gSpXbM7?!jt|c zrPaJopr(~K*uV`C!z7K9pQUEl=(iU#+qa0Kdw87Ubbg1|80lL&e}y~)ZD!Is-~xhV^}3;4YnDLONv0kGcm>dg<+a4X7e-)#XV6UQjL$4_<4i z(d;9J-)ia1tG5XuZ1G(05$x~FskgCn-$RqoJRx^!Y2;kqZ{U+{Ai&Sp{A&5|M~7`- zd9LMnu@>(&B*&D)ra1MkwrlGPPc9iWfjrT!V)=l^d!JgNsz+n0kKb4bqGtJkei--q z3g>u=vX%BVRH>zF6fJKwJBvdVt-uri02`6e_Tr_tvw~}Nxt+*x9Q!?BWx>!|+F{>Up=xb>$^$XC_T|VD03bE`zDfjlQp=&bS%xf=2Z$8a>p4ffPFykR3MEsd8fJ5 zt{_)qgdkuz?fBGJ+RQiX!Uw?!0Vk5)!nEaVi<){%rmd)^hZVv{y>~3R;vwp3JW-@+ z+7;r%{i*hsKYiEk6OJ+HD?Z(Bp_D}|YL4VO1sGzqm)f?UrnHT3GNsM!x&>(BD&hBsEr!Rw zDwp=1x}=lH6$&vTb|(scm2bptZE<*Iw+NB2`V3*vfp#e7->S9+k>oY5?BFHO0|qW0YkF1Y?6&q_8hO-&7X&E?~3`D*#x?prd*WQ*SkC zn%v1NENUE`q+~{YGwDlhDoC<@nE{eC1Tk=TFSn&f9fQv#vNVD;c(7TA$UX7iw6ZaG zF(;Nsx>@bxZqh zABQ#FLI#y0lVc6aSB!PfHPv`iz!sXKk$D80)&(ADbA=v+_cfJjkc4j8y&6-S*v*qm zmh?$?Z)WBfKO~BAwCAn|Ox4Rj2eis&n&k@-`^Z?G$UXflr@6I>^+cNJgdlGPF}K>T+db4!{gI?~jkqY)UOTIsq%v6DC2y>Ft`E zDxmztcguD^;athKYEOI_Y_`~5Ll|6SG7?GjG~1mj_To6CZd*H#mBt&fs#EJ)W`>eI z?7uU&$PXcpf2C5^JbPgdo)XH|;38*izxwEobSk09+~J*y;NOV-fc!H z^ye#Y6ktcR=v^m zU}PCi5>>}1-|JJ@T}!LU95&!Z8Ia|G01!Ik+ltOyt!P|ZMg2EV)UOq_eOaL_u6DUx z2FJIxJH$GjmGo|s!xH&%??uFIm)Q@W@ zQn3bHkCnjmsf2DROp8s_2Au03+Wf)0JG{IedJ$G8@dfXa;&w%en+_lEekZkI-Rp@i zE*ja{PX%}d@z?OEZ#9_WoZa5QrCC%oTd*((TIy7}j(1m->U5o7#21jw1h*k{6P}$_2Q~)TD_gc_f)%?Emged zljMvZqt>q{gD-C7g=4asLc{mUqm|=^`c}($W?d%B$omq!uAelqsK`H$O4&-B44f*| zISXrTPU>d+S!8GwnC$_}HhQ0PT?%Nh&tfBv)BPzp4jZSoD*m6LJKRNKrbXv6fYJ~- zL5`&R8rr<@ZNG*{FRFg^)EAk~6y#^+9gR&)L{mu@3_G>i&gi}kzB4`D=nv(AwRY_p z`u8=}Y1#tmnYOqgB_uPb$x@w^k6Nu|uGqB1(3&XsR?4Xkrv(~%x|KE(E@t#qp?_uAh?+hyRRsn`d&_x!4J zsKIcNO=dR<U;s1p2Y`tNtUj()77w zvPXhjnB&dMM7vH%=m)iOO1gyY6{)&~_c^IFtuE0L+9;Kj4Xlbu^D;S8?@hVz{r;O6 zgusamY8n{R_yOvD&0m}Bc7?V^Aua)No!gt#4!@O0t7v+^n(^M-%M{3)Zeo)lFB#kH zNal#tliWE`lV^XXM|mZ!y~@a=mUKB-&r&^)PAbrY{t{amq0*;oWsX7n=+h@T`G?p1 zY6EJ{q8&N}P?`C0>)$=ibh>P?CXAM_M41e55N!naC+k%yTVRZCj(Wqxwt8ly^T{6A z-9tO7eC$W3_*V29--azCmf%JsEPzLY^B-KAbg)KT6h zfGaBk54rl$er?K7<=8LRQkKNWq{Oz+&lwFXsA4nU9=_(A;g0}mwhUmnib&5;@e`6s z&m{hTTF^HZ+FZ=AMzgUVQk?vxdW`g}`|lBI@P&rjhHXs9iU!Ey96I~@n$PhEh@J@@wA=Ys;K$`{jAfUw2kBN|({&dSHO8Q>ird3P z$DEFFj+JA?I^VemvOnQ6)DkHY?@L9BSpNWb7+|L-q0gmfc#p>R z)=t(FPPZ2kfwnjs=8?$ZbLcALhn2{cc=DFZ*y+*ih60kv<+iI64&&%Qhd<7np=(!< zG}n)(h?p}hXc%B1KYQQ$Ru#SGqj<74ob0zq-eE}xa(?bQ06nVBmxHxi=SUg};7M4^ zbi=lJB}RLmaniSNf?Aj6-Sh$VSx3>-Mr{;0TZvKL-YT8bRc>vUHo6gvvD2_rI zTyROxZ)!QU8dgRf#*?OMcUH1qGcrK_V-QYQ?IUhS)~`s~R+gc)d%v@JihP7+$v7PV zALlijb$xjOdwYZkV#`2bzyu!T{{T9nKCv4A0HI32w%;+Xk0=MG4@%W0%$(wlYpruu zMf*HbZZarQ2|#c?8?ikq9ZLF5UiqfFh}+1qstDsaQN}l5R(6?w7kU z58ci(K*u>f>b(he-IZ-@bo+}xvfD{L%Vev>ta3mZCmn$GHCeQ!j(FsIg0V#T2^hxX z(~>EtT=6yBt#f5{ZyN|pLcT~`ul6=AUUEo1(py)G_}6q^Xy1nB(Se zZb9RRCN+8{GlG=qtkA5Xf6PeOt!2y zNf!SAolbv*`co&C3#~z>(`{}WDgsBGoO%)7r9~}@=D45PI*q%FXPG85AOh_Z5y_r* z<2+)axYM*v7Rp%K>RWr+9ArC^&+G?bTfQ2%vA?*M%Tkh9cu{O)A0~T(DxqsgubO>c z(|mTkwE5(yClx&RZ4{%_%NHwluFNDMBiiO>$-wMIShl#9Na47+jgZ90g*@%;pL(%# zac_Bl_JN|bL8Bg3x{w@WyL#0bE^VGrAtbRmF{tP1PjPHG>JiHjR)SF@?%Je|MJ@CR zJ(^+(90R$}naSg);ZoZyUU!>yI>p8UFAPVqq4jGE3;4~9PE#8~Om}?!^Zpc=#nSY< zSx1;IFz*@iA}n&_``?9g)9RLN-u!I0+$uijtH9qE``OBC#JAtMA2Ks_pg zct-DD)PC1wOn#Y{v-UcRblegzSlg38_UEC(6XMms!~l5)tO?? zM1=@~-YEhqfw<@9Tys{_{R&mNXxHW9AbB5Nd(|s_TJuhkbgPX_T!{%V$+K^kG51g5 z#Z{kPf+)krByPKRVC?nIXyua~;*BY+>`7ah9z&157F;L>t$)HzX`$&2VPP@}%CR!K z2EzU|$zAJr9#MN@T}DRUr`%ROl3Z$#Pxh!Mw@hwlx^2aVcwW6dD@f74tcg|VjeDJ5 z^H41`467p(wNxFTAL1j{u%z(pk8N`vp&Q7^cRb;?fC=lLLtQ?fG!aMTUe2;l839B~ zj1JkZr%ljwtwP4;((YJeX(Id2_aD(tI)9C6?G-Hu_HKHdW|0=5WpiT7y(Tlt?i%sMdi zuE$yNUc0Yb#TSU}W4NB;QJbi{E;^8Xg=1EF=xGXVElz9uZ(F&!dF*XV!dq;U%$&$E z%OLjY&s=d&i*3UzTWWh_Uzujx(Yx{M+O?$7^c8fxT~K)euu&u-zJu%QS$fUf8gxq> zJ5@l;PV1H)&FX#XJ*P9WFP7Vy7dOyZtWq|cF8N24W84AhoyX8r531T}6EVBEM2aO6 zM}JptO5tmTReey{tAeE;{4+R@JYE?kw#CNgIj7Va>00Y=qUiaGM)Mv#w2ZHjwDiZPy<=(%;@w`>ZGS=V^~LRvoUvWpqVG#~ z11cXMaDTLLII54~UlD2-v1vN3#Fo)Zhx<%@4tl6P@##;M$?C^@EfJ}Isa{@aa_YJh zt*lVU-gd{#mpI@7{m?U?bM&Zw9#1qnj2flofoLP0Ug%EvNn_6_eKW}8rA;4%tu)Qh z-0RU@yPdIl8Bj6UgY@caL&I11T6?|f+FQs1Y%w~5r`I0z^ii@Eq~)pG&YlLfj{08< zXwbo7ssL8h{_$EbOFBinluONK=~Bm@!4 zk?YW&GmKHQ@lCF&t4F25Br2f*m85KKbLa=9UjE67JH~xNNMekpBPenuUi@|(R7Ewp zQt~W#<5%!M+U8#ZXwqBhcTzJzipMdIqa>1e9{sC|*KaRRme!WrkT&T;kC_fW`1JZ! z&klx8MJ-HZ*x2qGA;rQ**x`Kb3ZoYnqHc80GrGFLY}Z@%Mydy}1*#Mn>F2$pGLVTzb`?2K+alO0t6f9WLyTGs~W5 z8Bz2-0j}Fw($1@(Cx~==_z?o^SQUQg$8q02wMR(t9rl$R8hp^+No5FP@hrGW81*H4 z^dFF??WUt(R4MawTT-60Y5jzT($7?iXc+vi(d3~cl{HqxwerIQ%{nwPlA9$ezJQWC z)t?ghWDAnEmnAn5EQ^B2a}47>zLfiYE>*I7VBsNzhYaKAGM=P*k7|b~xawMjl(aT9 z%l${im(l5WnwYYTP9Xbb#9VI2w>UikJ?o;mj`zcn&2N9KEZF&N#knKp>9`)X&FJzq zx_@ZulPS3u0Z6u74J>-4UjylX687q!xLyR!EY6C5iVZ7=A!_4lmW z(@hIanYxXfmKuX;VRpU2B_juJ(b(p(d_{ezXxf@w-P~ZIQ5lubTz%4OUqja|WVm}h zYfz2xapkym!&^UPJ^ug-%=n2twxy}dqTiw|#4#+8h}Ve_{{R~Lp2xrETEg3dS{&u) z#F8%d+g`|8R@h_%d7*rc>e%o^cd!w;f)%{PPkbl zNEsOp*yUW|zrCL1^sbx3y49lU(M_#s2^2FZhD+sOrV=xS+CNXn(zKl880btRHuW=f ztr?@no+5UVSKP76y;SpE_kuK^2Y92ydYn4Nz0_KjsSjyxsy1w12|dX@v7VJjUemPw zLVqvA+JeotHQLNMQ~lHY^IboOPlM%QtX$jNoodz`D2h$6jxY=H&;I~h^2Sqg(A6s= zhq|?C5_o5^lG#pGBa^P*?__@}z2SSm>`y0J({%=lYe|Hb_ZE_rk~bX>%0b7saBz65 zo+Z7oZB!)YRY^k`889;5pmtGM+Le?#wa~KDZ!PWj+o+D}LPAJ;gN~W?r)2a3@5B!t z_?O~E^{t$c8{65WDRFc6H-I?YJ#*aGAL0)R`1%;G;_*GO)4Z7sBFb2qCrJPY=FegX zAdaAdIK@8G#qaRv#M55N=`HP{#2~g+@y;>d9<`9%yBVk$`66eXASd&5HP9=1VKXnMNDVX?H6r8QcfyOQgz+s~Z?ZQv$$! z?%nh0{VIPKX{mVxwwEfCh{4$Kwm?rz*3hRI)l4Sag^xLhRGDBBTOqlTWWg{I@`KR- z04lp}ZF_xnG`AOmSk(Zxf;J$d_uc+AXHn5@w7m_dv0bvv#|;N1SH6Cg=|2s8ckour z;p1o?A@CfN_@X1~3T~)l#a0x>q?AS?3AxuU5G8 zHCwL~i+Nmsqef#md=6Befw9p0Q`RzD_@9y71QptuMPNz zPl@~|E~gZ?a{Zfhu|v_=VD5dV=3(7I027MtKWME3;WmY4*PaIPHJ$E@0<(+A)RQXX zEwFXn+w19E?-t!i!N+mMS)V#br-i$Fi%m&oDIoJ=T0TZ2=B*qSx|Hu`%o$=>s?yv+IZu; z&DzRiU!8<|yT2Sbrl>9@W-N`JITH6GS z#u3=ANpaK>{2+F&7sNU%%8|<@qp*RDk}1GII%Iw|>X+6rFl)D)&5V5TqGv6i=Uh*T zG}#E4PZ3iRdA#r>$@`!R{S~Ds-2AH#IYM?vmfzak*_YKc{Wy6uu?AFLLk@bLm5F&2 zcCblw@*tdfM8V;e&Owj?9&oN`SLS2kBA)1;6Y7UDIH2L%r--1qdZgGG7n zl@V?sjdI>tP)Q%}dYb2ARe1-QH!P!cih2sx({%{pm0c{IQW8jfgT24KkLg&=s|2-2 zeWns2%vVA%$`6?@%t6OEt$Rt}k(%8WU`P+X7RKLlKDEr-YOgdfK?3j3RByGO@ob zYd=q&=DAmj6Cj#DEdV*g0oNYB^=9fBOa#CfUTq{7ZWs=MY3Xt7abhjogn+9@Q!dZdD;j(o$HIpJ)M8 z_anV9xgxZ)qg#n%9%eCx?Ns+HmzbECnoKM?ZZb2;6=(esq%tkSF-Bi7qu_zhAXHMM zOzb|)%mH66QosZ6MZk?&q;@i9ErbS?pOw3D=}eShlw>8JA#ixdxTzGyDQ%J|k%0y+ z*~kZ|9jd*`LwRoTlpr!4*q0qW#SZrlgC(5qEfI6&sNAk{ta@UrLg_q(l13g|5anCH zr4r6=2kvf?KpQEHj-9jKm=@Gb;J=iUuHdBdt=+RpGOUJ8HN~nV$!Z!SAr2%1f$veh z^{cYM_I_P=84!RJdwbOE1fofzoFRb&xGG2|r~d$6oFtJ_DMTmBS3CazbT}u!Z7n2?(LrQZ43YuHeX3#S+!c+aS@Pv$ffois zdkU4HjYwujhX-kbSvgbcPp_>zvaCTmLuo2rG^x1YK_n!WJY=hXN&=6xK+HEZY)Y!W zHxfGHrkCYA?I(@EIgG0E8^2nsc@(puLaJCc<@s@g-0@VH3q7o{?n_xy&M@LfBPvJt zPrvf0(;5W3uRg71z0gE3H#u8QAwm)U_=rs24AyJ&zh|#1Ji*`CFY#G7VOdjH?j;W`VuO& z%$C>p3wp{Am%-e`arkwkQ(K2I>J~Ra8E~`2azlVSQn9KoOo?W!myH~$5f2=YCem2{ z00}+uN-gEOSgj$EK#VlPSl2FC^#qSfp`A*5$d-GQf(WAA&;-s{`})Z^Y5C$T4sxb9ZeqoJG3bBH}Zi19RWjrfslUJj?{~p&n(NYx}_`f5YCb%K(6j z>1B_~*f%0|$A6_V813XS$pGQW83!ce``*<_jUv6obF_B~Es8}vVGo$0w|fsmL1ccJt-&DZDI-ywoE-;aq}E>HA#hu{L5FgDI83) zNOwyi94dNy6G;(`WLYAC@>qwL0IIKHj^?Nt+}asl21Ak+U9dfg#ZIma$WijJfJ>^K zu1M$br*KO`4N@yvtz_S1jaEa@kfps|Pu;#@D(pIWbXD2Sl#FvPwvJwBB(TV0vsG3_j*^&cw(?f!95 zUfFMl%V_hnnHU}uBfq^nj_j>0tpYrfBNT*!BTh+Qsqa=GLH@Gd21S(o(e4|7_4c7A zyL6o;a^g6E5yKc6Ao2C9ETR<=T*hN02A6gL10AtVI|4+J+(L{R+DM|072e)BS&nTMplHTezPbfCj<80jJm%cr{ zsq=5ZmMHwGB*0gY;Upk)k4m(~eMNh>SY*3~-I6G$+@Vh5=lj1(w{fXOdk|ZTaRTFU zRwHme=e1Xo+(OUg#6tuIC=ldJo}?PD2N4N_6h(F=XB&*Z-$7S&JCQ#P51NOLbKjo5stv)TjU`3|F>l?R3?7u16R@2U7!`pd z%ni$Q>;C}Os~IGh2?UcZni!>Es|$mfda$L|zwQqiXZh)};v~7Y!OaDl(~cB$5R|6lcjRmsF79&UsN*1WJE-EQiYgd6GBx zM|##Q5nROzv64kFM)^|j_pwfeS`;!t2`Bh*)$!lhQh9KBhi%a%`bekc#(N5j?N;{- zD>})!8))0c;yrx^D`hT$V$^da#S-gkMo7#c?QHsk?^4NaDm04(N)VtJm}a0lq-%Q_ z)j~vCJX>y$CxO?GZuIoK3d;8hw7Lb3QgR#6kAG^>Nex&qkHmeRCFpRzJY`A~!gn6EYUWGrOgwU20kj5y z@PE*9-MDj;xZ-;^n2t3+8O(0rLG#O$EZFU`qjcBrF!y?XdH7m0^1_Z*VtZ0~$It5~hXOxG$SL(|>$uVNx$K=@@oi^v1vCy4%zAJ zS$Mg5364HVz}|Y*i%ToDQ8P+ZgPpkK)hJ1!#;ju^{IQ*-T{jc=fFGx|D2f>!OrWZ( z0suYf5WJ>Beo4JJgnzw<3Mzk>dm8IL1D-{gm1|eZ4!_3~4;9q^wM%?w<6EYG-yr zj-@{HW3SS*Ok(adisxn{Qg^E0x77EkBZXDKE)^AiUO7Kn=#CkyT;rZD_pwoQvcQgd zaxv6<)r(CnAtmIv+q)Z3ukx!hJ**!oYz4vK^(WS#mr~rUSgN!xSv>kFph&5jqfE9G~_?X{PoL&aDA)q)tqNaPdK)AOwPHF%?i-AVaek_&N)*O!%h z+9QqBokr5s*qZ4YH3&#hFnvj?GhFBQd%`mkK65)tp@PN*{g1H3x=De&{wqZ#^F&tkZ$TEWQlDP>gS?=*UJz9L6JZdtYg^7GoL-1v!=w#Lzg z&Q4E1QCvQq;u&tID<~nt1GhYTnvYS|0++R!u;=Dqo2d4$I<9@~X}1B{B|PP|RV9!A@@_>WI|V_&)w#^o52N)ujG z^XXqn9Z{mz$lup|NgDqEq#KVd3CSe#DxR6*Np7I?7JoH&5RT)MS>8-qs`+xO3K%efc@KXFb5Dk$~nNg$z3 zy$cSwqT5w_X#A<r)n!cGD z$1UC92_y1~c|OLX@fF6CJbqQFTp2g19Y?6HUN&epAb_#o@&VL()N|jhlyY6kC^81Z zaof`s=he;XPLonb(4`p8=7W_+{nGhsyQ+>CJ@Hz$nueKW7`F4{xgh34w;gMby`NFl zA`c?vLBR5xX#>`*!8ne=qGH?63?HcXt_m3E3Xhdo)>|thsk!mJ%(1SYZD^Z!5Ua3t z^%a$Q;w$(qe5hn!F(fQQE^uotbxS)rTupYd?2Hqhqw)2sde*dsgtl;y*udl*dz!3f za^ph$-a!g({zdt9xo#$FdF51D7ndU+JvIW9VQwd9Fu%?7a6Ky}buHyfA^BV8Rv0Ff z$9r_;t)%kK?!zU=p|1`(g-L3i?rz}*&brYwdwW&8H-2Uqw1`JvN{rvd9nokd0e}pJ zJ6AHza*yOl&ZUqsT>h0Mrl49(8TdiUsOGztYMV)`5Tj#oT*)lNZ(Zl_5&T~GsU=w< zk9>#{EFAI1f2B~h)L{%J-Ve)-MmBqi(0jq zZJzDGhwmcsxPMw(foC~ct>kwze6FNpXakOWRzt^ZC0mjh$t#jV^-w$1<5eXYT4K@2 zg^?XTVFokYz3n#0BoLkrZG#%6)q!0c!viaezgtup?M@A#~5Hx z4Tsa#p|G8&byFLYwDZ&hS-I1k+Cb`Am*8OpKV<-z`EMx(Gww}Qg4zq4r%OwuNTX%O zNynH^JoW>ML3Yb;z2qdTFl7sak6M`~g3%bXVVQ8oH6M5%ZuNJCz2bSb(U*WW=gF4l zIYJ&C2O0GhLs^n};!ic>ER23tTo64?S$Q_9-rGqWix~mp92oQ5dYX#fD=WE7GRPre z_ne=+4OLD`uyKRbIhwOF;%jxcXzgpMVJS(edku}-3 zQmca+t9{|`>sZR}%EDF=xa6TdeXGXAQl1`Gnly~lMT=-d+&l?+7#wm5$OqP?jjZFF z&ycVvc83kcXGt(wnZ>z`Yz23Ee_B4;RxU2oHV(nJx2A9B~2d!pZ-b5wJqYsp4o)4{Y<1tM_ z_aW5Kvvqi~gAqkvn74w6R%s+m#RIowr8ShrKiBYF>Jz~B`jx3`P{Dw|Q{orGjDaRy7iya8E2p ztvPLEwvyptg`IqrW!l*-&rnbDr?uU>qoukO3ZMpapP2OodQ{63$s03h(ktERk9iz# z5h*B>cGVoWx6-CdyDNNKPT#)g8{30WPjMiTq-7-t%P`=Nr83&l&c=a+lQZWM@&eZ# zTxH#&YZ`5CTgJ$eLnz>ukRMM zn$qqGkwkABBkl-!+m6+x0yJyqc|&0w5^{aWris$fFy~{ZFDmCF(>2XD-%xJoi|zW0 z+87e&V?3Pk{63XJNaRU8sFmd;?Es9E_4cWzl%$zJPy1)?Srw&*wgIs%VBeJpCQ~F4naS{eJd|k*KAsJiB#iu(;R1m+OIa7C6s|$VA11q zvku3%xvF=%Wt!flzoRb&9hXu`noW%)NwaG53H@ne zws|ANsbbCdz~s{-X&KCd5(qyq?TWPys>v7GTH#tf`2;82KDCRhV716&g4o?Oh{P_? zh#RwaqUIZT*sLxRLNSKq6Y57{PjazJ&mjz$2XNyx8@id6BW~tGIBvUv{(_=)V_~R= z*=??4&BTovRXYqvA2&?;esr3d`3u4dKLnA}Bd5}bxFOn0xe*X2%ay@%({B|*OPKCe zt)Q8e!{oD^@my1=o4DPPb~c6tYlx)>aLYzd8SZh~qyE;nw^p{b0^`nZ4$=Fsu790Y zTjZ7g(2lIj^5Z;l#tkti46Sg1SNs0}{;JK?V!CCS?vcYn+s@E_VfR4(rlW#(irz+& zO|RvUxgU3)Dk&``xQxd<%0W5AV*u5iH%WrhDI-ghDs1JQj&gk|DK_;BA&^|($uO|< zKzP@5k+91J?ae;v456gnP^?>zT#Qwz5rjT$u_Hm}aUKIBRtjBFNz4?aU2^jg9zppv{YHdGL)NL#Pf&%j7 zlvweD?M$=NH2a&yy4F@?g}(XoFn4-!&{k8#S?D!Qv1c*QG)!gK2i+*&c%M<}PMb-% zhS87N;gJ(2QiG_X<_n1D^KGmGB#pEJa(4ZFYe!DiZ7iS&wyt83?YM?g3vC^1k-(&v}=iwGfCa~1vp+aC2gT8*sIu-c4CQNdH{YD;}nPqt@USj=l6`9FEPV9)DT z)_Z&6OPJAs3&6%lt|{K*ibZi1t<{*8DOjL>4)ejHTS*zfg^mgPy>NYM+%~Hl;Klp1 z&i=-C6E##fshg@;R zPkpOJXJ~Duj4Wz?XLHFupGwTQ@iI#i+FHQF$;&L91$_JWp*cxvE7OLCifJsdM>{3~ zEwxGG>IZ6?-qL4{-ZueueC2`Z?de&Twzt~cX7+tRiCMt%p(Jesra!{8^mwPYGsiu_ zk86JNIY&6}Q8#312X$b1TwNIqOwlOXkj63fIjp&jNUY!j?Q4N5{F5&^KJ}L~y@SZ@AS=7~ zZUzX)Z)(rF*H=S{yonv-bBOmGjQR?|)NeKW=lfN~z(~&qATiISD68L6Wi+%$PdAD5 zcW1rNnJVD|Gj$7UFC}IKz=h~-(!k1G=Gz+L)kve?# zt04+_Ik=RO`XbkjgE8uDY`T*rUw$n zS``2Q!{!IM&1?pW0LcZhD(4#mWP|mntf0HNB^KP0YJ=rik7bgP?l zb^Fzj#?Q`QKY*)x&XuQ_8tY8BR+aE%6E;|5u>SxGhaxu#?o!nzNlM8d1zJPO{S9W^ zUcn{VjM`4<_}=7#2hyOpD|*TH*Ib7Aqj&Atty9SyBjq;Df>s;0C_Ms)xtnt1NQT}?> zgt)tfL>6(AyBRVJ;Qs)HYs+MEI?hbdzt%My$2PG}fC4hn#sC8px>QSNcJ~G4U}MN- zVn%+ITT9YzZ!aUaypsW&BroxPHPYL7WW^Y0WCV@?U*%IdMjMw-GoGa_E`4)YzWYN6 zo+JPjSn=iqRwMAtb2BZ;3j}UUz~JZWQ@mmb+E7|24gR@3N4H^Drq?Es5_x2ZNS|~p ze|<-Pdgq;4eUqXzOYP50WnQYaQE{ zha)WB-qeq8sY?gi?ew(}hUEzXgLgkl*oR1lNl`R3Fv$55`LbmXpwDcYrTvw64y2Om zR+20OtSs0n-TGF3(%Kiu+SsKZgmpb!OC`PHNV_n|Mtr|t#<5SsO-ftUifg7Iz7PS7 zpL+Do4@SGx?iO1{iUkXjy*GOkPt-18iGEa3Aq7tU#;P@3M=U%fuFf+~_+w>bYA!Eh z`Qc*h9AFXYk6P7(!&*#C&pc;ji^3=w2hjUg#5a;WJ6QvALk2wO(y83c)0arj4$?NS zUwY1UB`1588dT%5DiqS;%xjPOWDjxgQcJAFmmW(vfS?4)yXD*IkyIm&c3{EP-bdK6 zM|McFnB8sv09Ipunf0!IeKzLyNhf$Djbb@| z{{T>Z>tf?dj_C?CfdE6d%K1)z3T3~8?{!6t3%S>N6%5a`6Wo#Bw2Zk{hI5Oa=2B@2 zcU?uMM$F?1tA@bsocFGdFAU1|$#nLpks^jIw`oQLudP|J&>KiaxUl`fw+l28-9#0K&g6aIdsCycy0wpjZnDphMQ-6vqxz6B&glw5y;0l6JQ21`Yt+g}c@__Jp>Dg#U;PkR$LnuP5NHxNI< zlTD3GlH*X2G?Ly#$D;ul!!aJIh-084J zE?AKxAzv$T8T$6(v2V3ud2Rilcvx@9k*(KhUqDSn`rLQw|K@0!kr&h76I zUfp6W7H0~29>fl{ae`Z!&aL(xEzH($EUb6NRBk{C*uBrWtB`nuM~>6VxMxxr;$?6^ z82L!5620xrklMFoW9@RCwv@$CoR%IF5c>rU*Wa;|TOLU?% z-5cj}lbz?@tVd_4&88UcRzESMEX4FGPfw)|;H0`5ci(SoC6i2?0h7FK>7VOdz2=c} zW|H3Nh6&tVTZR7s>(^DLo5zwuqi_HM8=?FuvT3$A5&2R`F_P}lo?q$h{uGqdM<{cn z2Ft^P$lDNJKIkKp>S|Qco(WX4?krB-g98K7wQTHe#ERZfAgMVcqW=JmD7S_Sa5sMK zpCALCeL?Igxwa)qA}v17$iD08-Wb5lZ?mV@)|XCARfySd=8fbu$S?<|(>0=zd6F3I zr;bpF8OC@;$2Br&uWulV38Ve!46;N|mxIYX)>3vgj8{P|?5*s>+RZBo8|RiXPEL6o z`%;)>w`iqn*!R4c3A68ig2ggBZ6vp(5OqH1ZG5R1$4;z);!G` zsNBf7wvgMKc8*Auq%0vUGEc7+k$0yw3h!$nQr!7l&KT#Md)HcqTg7ylV=c&yf`CCM zzpZonjl?nC2&0X_UJJH9Rvk$66>yVo$q^)oY*O;pRk&+OL{A`68G5(BpstI;{vXq> zZ}#fZN#$G&MylI)5&bI-d{ZsD049mhwk0He;p!_tQ}K4AozO~ht-2g^Q|<3f#!?|l zF*_Y*&%@eSL|KY%Vyw<{$JV)f+x4AHP=X=^`C?A00pNjC^fE6iyo~!3NvK&{!*Y^F+oC_hI@Mc=nb&+1BXROMuP=-~%*AD7b=lXI+HM8nQ-r=CFds`omnNnd5NNWg>{=qqbSxxdt1 zn)6MMY!Uo`MgckRQDqHEyPk$cq)l}=GS2Ft@JnR3_|^F=VAEoGYj7R?saG>VxGDXq659JH zy?w0dHn>RRb}jP<-H?5;ipjXuh1{DhS8H|W`PWCJd_TL?Ac^FW%Q5-jBj$`_wmO>X zH1CGiT11I+J;X}N11wCrIUe1pb*a-`#;H`9=lV{ItzO8tFx)O=a1~WaZ~nb?I#+q37@A%ZzO#ebMP%I8P2~FmGiKA!FpofDfC!WWR}Id&#Vzf=|2-FfgOmv6X4m zdKyNIA-QKx@CKix+HQ$VoXKhu)>q#*3y-s%G<_ar2d1B}Z&}R#AONR)T45 zW+=)?XB>rL+Z6PP!-?m%A21$iMcNqFElK=L(OGP5-uSym)708Fk-9LUwDkuI9i9#}Gf0X~NnQNGNQq5w-d>Q5|xz*eT8acO1q$WfWc%BXq{=BJfK6rIU5 zYpqX6xmFf4yKXNsvChROf<5Z$S!){A(U#gUv8mqShy)K_JJo9o`Lz|A`ob0wLfd9z z&O3Fi#qndLuWN51jmr^})kbleg&E1+4YZA2bHZANjImx{5#`R=MFZ}SQ(2O=#-9VV z%;B~^0VjeFOjUhX#X|1LLH(xAs`yYzImc6)nnSej06C0{ucU*&9>ET@9o;%B~<~j zyq;6k)k)IJO_VT|E^u=yu;Ht9NTwqMDyy=%<;u~ zS($JnDs#_u_o@?XSE4euajbC2azk}d=nYSx{{U;vi^CpD6Xi(Bl~L*qS0X}FawWRa zd`DqymimReLYsH_ho3MW;Qe^P?^0UX*d!%V4S%;F$kRvAE@#yg+oQ%9#=>laBCt(=V(6p0lusxkaS(vz}Uf=%oe zH&@fd)}`64+9KaGk(NG`%@azsxMez&vg}4Ym%+&C_*YZm{{RTi+IzmMeQ)FfR~vS= z?)b++imj?g;q4qfpudNHHpH8`B=yB*?PA+V*V(kL%w^InVANB}h)El;XW0Db(yd(F zK7~6@p&ea9NfR$1b`?_g)+ujP#2PsSBjpTE)%7)Dn#F>{o#d_qJM{HD)7(iSXdLRh z_Fk+GR3ThvkHWPy?Jq{YgY3GNr3Ol57AG8k54Cf5Q|d8W<4%oQM0|u$331rwi_ITU zwPd(p%Ot7{tnG!*QV68b(>L!ldpH9!D2y@6Ha=GNHJ2@>r3BGxS{!9OjDi&KgP|wX zRWxl+P;^_(T6qR`Dxlkh>=gH|gHKnqwh&LL#KdR)5Jk#+lisEKqA_(1ZvNKWd=2N2 zm;kN-IP|L8H`{d>9$WoEPEW|3{LkHL#oU%2V2kZLne($f3G}LR-8|+fJk>7|3`zh1 z{{RD2mYM^7&8alIJ6J?e+{Z1#F(OnMBp=}?zA7!(65S$OG4s*KnT6`OJk}%X(czNX z86zmA#v!>Zk^W;;nf)b2MHjF3}3kG(ZcMDxWO*P5N~nid&tio{>{vO0|I z?StIbb@sn-8Kl#o`O&tB0=YO6Kux6X#{Ned=R40q{Pblp}>DFnveHW7aDVq_eT zPI{AC#tCX?Dvjuj`odzoMk0umKGT(2}iUTF3} zQz!>kaog$bRjzL(kyWNu4i^CtamS&>MX2g7#Js};I1AhwruT)*O(Kw6jf1ft%D0SP zQwh(pq7va1CQ}$EArO7#Utjb6Dm!GhmPvfuxY8cc$h_yhXGwptN+~SNIC6LtmR6S< zy}^lQK2vd?fF9`)ao)Fvk8Npof;&Q~AREFSQ~}WYn%aWe>gEtatDpyXSo-IKnvrZ`fn=Pn zZDPZ!M2s9~cNbJE&cM!rl6>XJSY3v?%_H8R*TNa|FXV?V}NUoq)hVYI!Uyk~O!rw=84frHt+m?T_nOO1d>v>|$xqURY|aaIgVv@a>jl z81m0tpRcW0eO?6E-ehJXccg)`Mmmgkt4pTGC!015M6d4=-v!VfoPRpCrFcuj^T-xL z3O80}B#iTl&Q)Q%EkZ^fwX3DNwf>gn0Z>Fu$tTo(eJYlNrFgRLL%PLSZr<_8INDDj zj`i7UIt8wUdkoi5#PB)!Bs~`$Df)klw40`QEbQ7gLQ!LEZYTTR!|O@n8i%;99?J6f znT-d5ZHv9d)xOBsle`_fPk*4TjW*-MT2ub&aM)0YfMtVv)H>acw|i{R%Q{5^^0+6T z{=Gq`_)6j#65)`%#du^V0CqU6{i>XO=3gb9qKNhVVjWUu{>!tGkVU~G`1^{>(Eb|h z8s*2GsN9&!sdo#J*SFza&)8*xNUe-WP(%wlFGfD5rAPC_%W|_7~mXrAa$(yYR+1RG-I*Q>iXW4wxZth?PHQG zmzp!fj=*{vr9Y3nJEmH+uw4S^GbRq=sz;@B`gewPEkH2Unmm}?Rj4nH1)US7YcYFJ$ zU%81m`A@GO)}^!2ZpNC{kmJf#3j0%mo}|-nY;NR*8Z>>X+eGOf_3v4^LA?f)mg3EE z7MjpC?bgW{;x%*gILA?+O3}EuR52{Ku{Kw9I5`SP=zZ#ihlM7(mu==w|iI|%*DvhZ1xO&DxLm?t%+1z z>K;>ryK9VK{{V$Ys(7KToY`r%h|;b$%AFh3F!iiEpBUa;UhUOxg1^cGvfwYF9<|X< zocBn|b4arXhitB3LQ0vjOw~|U$Mc)wJGB*v}@m+DI`keBrx*IFvdn*fh0!S|>Es?TLS3LpG zLG4)g_xgp@&$)NwnSzWJ9`zobr;B%pMF?qKa2Rmd^*`fRVYap?7TtHUzwZ&cpRcWG zlw+}*oTQ2eL%6lISxoD(GU*v7<_Gkr*h@Xl{6E?efN&GbV}v8NJt{p$_vLv}31v9Q zKPvlU)~IRnOQ=o|Zo-|+!MYP#C3um0Goqhc({$(iE&Q>}hb5){6(8L>u4-Qu-Y8bF zNn}!6V@P*xUcjFGcdgqmhs~?%E2rGBmN?O8m3QqWNybld21Y>Uo2+8d&!kJ)wYFiHkCBYXuo$r?lJq>hkPM4jPa>+1Gy7ncMyNQ?b^DFUkB*^ zAFxfa8E(v&SzD61_4-!5*1h4)1*8_Yamr>H4UoHd&ONJ}*1jrP$rE2_svbm;2+2@$ zAnbj;>lZrpUDD9eLWL!+=7p8Mn*;9hMCu7I7#Po}#X%>CbUg_OwhUv5Lu1UqQhI~x zYZB!6m&Fn>j>+`(S&PpmHa8=kxT|_+!szu0P4=qtHt+dmAtTKnhhJRNaHkb|k{>kQ zkVD_%cZT)5zq5a4mkI+s`N_v{SJU3NV%Bf84SA)Fg~ zbyeXSehCUcg!=s|-laXhp2V3@M2F@W`@An|6XWglB8WtsaN1Ja2h_JYwHF zPz1q|zrz%0x?Y^N^ITs<##P+1G>yxqcmkT*)7)RhaRurjMg81zjoU^s)49bUdiK9O#<=Ix6@_u2N+%br zhG^vZ9b2;x;vY)UHgT=4+<;FE*utNs0KY&$zgvWDp$WdF4R*rkT)J79d2vRW2)(_@ z9Z&M8;<2}i80?o*EfR*#S0_Ed_a3!wY4k)TE_F8&BMuTxst<5|Y75EWt5hWeQCxz#~9$mb$Bw>DBo^kK*SM(bgtxKk+tMUK@rG8*NJAEiVz=kW4IcLi!WyNj{T#sOguCvNE$T2XvRvdeLHiTxPx<1qj<#0n zY3%M5B9(x3agZ>38mM9Jv?5hf-0pRVlUcjA)jrxxR?GXCCUUVT9>b~W$@Jo}t}ld4 zx0drn963IP5B)iM(N=!)GDWSX?rXl(_ye)PdM~ zRmPOutcaCZrE*F2Sgqxn8+pE2K+U;g&4O~ok4lUF5;+ohrH&wxqXnBi*PcF=%U)|2 zy437UM%XqmR{)jzin(p!>8}BRUrG#7?|Akd%%`Evb$bZGd&e)fl%KjS{{V<=4fK~x zbCZIKxk5ev0M9iItWw-a(p*Zr-EkT}LZ_xHPfYNAsGLn}1e07wo0>hu2OXCOuQjU% zo@5H9&Et~<$+{7N>^(iHO076)5REC%a}P|@ZFE#?*ezt(Sge4YjCCWP)u&~k$*ZTE z3?dMYU0m|2y)(sa-Dp}(wX|~T7p#$!msUKCb^4mj)BIniY5KH{Z~MqmgImPBsUx^P zoN_A{R&&_ZLNVOwV(``FuA0*<=<0z;x{XKxoN@2;s?#l{Q4;?E z4h?L~noG7WC1jIws>u@J7aejdH;7B&MXC;3vy{@j5Vjg~J6Wr;A>8b8SJ&xM;yXP( zp_D5zA0Wn9em#X*)i1Rxt0|LCwST_GXxAAk4gntC)nCK&PpWUSw7!XuMhj1{62$f% zf}b>=tbDOf$e%)1j&;5X655#pA#O(Q7vxZ-&?NUMD#Jaf> zYI=}_5JD_YS95#gpvHOnbj51udL@kai(xF7zzQdE^JCGEU!kmORb3gZVEUC}(zVsJ zblo&ol12kd3l%#?2q2E9fx)To9c^I|TRS(G2nZzkop}4qPhZBhB+})ym9+bfRZ=kE zfVt>aL^6g0TO z$6Dn70Jr>6;gg(%_q-KjNAK~d#pGB6^CH~T7 zN8C(_8fT860rc%wAh?n2h0M{-0i5Cx>5nyiG1zhXQnVJq?I!nR_gbUG@UEqG334~$ z1C9K2#b)35qJKW#*Gq@@ji24%F#{Z&_N?3A4aF?1b**Jt;BwK)1G0H}JPrL6!RKclgR6n^{3xyb{->@@3nim z34y*;LBP*^e~nmQAz<@C!=NSCrUz=ly}!R=MvrV5O{{7f*{-&|mvV zn}SYog}IeuL6sllx#K>Z*Pvb5rOPw4im1@6W;Ef69S&)_Plh76 ziLURAc7uKd;ykl}c^>2X)}GlUOQPg)Lq_op%I?*a!@U9sA{k`QBP1RUJu2Rr;5!77 zk!@vpN!(;(^PwHb_*YdGf`w#6*y_h=2PYZhKJ{TN%rUF{p_e5N?2*TFS-eEL7aTI` zW7_D7%_J)jW|gV zZ?#E(rdyesDF{{|BT5Hc59wU;sO7o5X{ec6jgnpwEJMnXxpXyRAh3wwMN&y4C3)%n zD@y7}g4;(lJ7e92l;biSbO-uXOK9E*x02>FF~c&9ZqGRM6&%+^+QC1Ye>{S8W`a1> zOrxedW8d1kA>x}$pASdjr?R$+;4XaFW6SIubKG_O>zXF#RK7NvVn-Zggv&R}xcm3! zwQR1f^vich)Jr^>it!uKcCW~^H1x|XSI@WW`Ub8i+(gN`%Rz3QVIYQ-t` zGi`iHCESwc6B$L%lv|b==xY9-sd-kC7rG~N?wMbLMtToV!nuueRclFp$t~>+r+j{c=k?VJV16RL_y~H`mgm zn(_4lwsA_aEI4S{&&t{AFe;*~h@Py8u5}VhX+;79j4H0vg+~48%h4Gp(Q%M&wr;I8b+IH?BgTSwGt&{XC;1AjN}vUD`v%--(+`8 z(X?O}+J13R&7vj5pqXW6#?vCX!!Q2;TB46jirQg!eW^Nx1ypZ4n;i-D6gerNQE_Kg z;plAbnUZ~CG!kW%qRvNunyATr6PaDFA|f%AWzWscWY4aqk!;C!qTxdBSBbW7KAhG? zp0RhROa!*fiWrhNVVCf%l_uL}j(rZZQP!<)namKdx`|gZf-pupaap8Y7{%?&Mw=gM zl>i1ll;VwYsVc^#s|~{(I^&_oS}tv2^B#MbMpr-?J1@VrDqBv)=Q zBV_jL?NaD|4{d(tHf=zM=B%i1IYuO zxc(nXnr+Q$IV)<5m!2)Nxs0upN*U03&bS*-x4mbZ`6IKD?cy>;80xc=3RB#-R{b2*Uj zlW%4|oolbsQs_n|x+>9!>9;v!*YK*9D8s0gM-qF z7mXRdWl{6z9X+$!rMO!QO+)Oqmk%tiKh(c*{o(rYS`g@m$zd##IFlHacxA^UZ_bZ zxDnkrMQHHI%hdKK{3?BSPPMSIS*~3~vZfJNvsrfS#?I=bLpIyb`AqLhE1BG~~=7ZX)jChsbl#=dNoGA5IptWLs7dv#9IW&-QP9bQMV8+4&(vaaO91E-<^=TQ^cd}0x`u~) zqg@|188=D>+_rEr+OApMw$lWwx)e{pFDkvbJxM&(A4+VQ^9KUxr`4u z?N>QfJ%d$Lw~>gsxwu)Jw$Cj-Rb=i*_!?ag23euH@Vs}Bx)N@z zu3vJi3=D(Z9=PN6IK&gYd;ZyQsGRmq(??F{OMXu{6#Oe08FC)(; z7DsYbPjimlDZN=qyB2kwO>ZWQq~6$NjC0ZF%3@C$7N=1@_fb(oy@>< zw2$RkiDYeV1UjP(OK=P^GVR*O*X#KcPL}8GAZ(GQXxA|+HV>i2U4UOA%X4I}I?91= zmRPxqr%cv-&2=z*()HS53AObeWL-lfQs} zr9tA~4C=PiDZJC=wYymg%WpU;Q$6w9(z<^QYQ6)t@WrzDmrR*;sOBVjQ#X+$T?Xas zef@akR&HwJGG|tp(hYI-5VX4 zE!Uq~mRT)cCpJ$bUB<}LD?iNw_F#LFRIgW07Shcu{{X()12pZO?tLk`Oq%AmcNUu) zMJuiWkymSH9sNZX1E{p{M}u_Rbk;mQcqEEtEaqT$q{r`^5zAzred{Xr!s}6Mdpqmc zl@>x${c9`%W>Yr4LsV_D#VZ6b>Z!aU`%%M><=-5;ov@>TIXfA({x)zwt~-dTjwrRWRHG2n%)&56>Dm9&Yaua;^pv} zhIPEMX(EgT*(KXfyYQ#PX@BA9?TRXdy@ul4 zJaR{$nl>DD>JMT8>_v3ex-OsM{Yj^MT0O+UBa%!Q;oNy*GB_Vm^%cujtW((OrA_kd zxy#%%+KGy7Cfvn5Y7xW=K0%I29SeKbwVm$0r$&}K-0;s7?o4JJg9>AUc{yzV0G=zO z@gKwQ3wS2pZwl)qOQ>7O-bSaV-xs#HR>96x;I2J+Q<3%K8|Eq36z>#xj@~7YQ`7Y4h$8L?t~P=PR{nUd zo5FYg6raPt+1kg3MV_R$4yOEEt9jA?01r>cuTGwZyv+FGYY!QJYiO@;eQRfXyxPxi zx+y{)RlReH(v&4p=tQKFv1r-q-Z6k)8;EV8Uz{{YXps64Jx^-tz6tz8)P4(Vm$LYe zz&6+8P_$?tOume4kRF8O5x2k8S8wp-css>99N!h6OwiIBX7exnHEI=1%H;m=4u_IS zjR|7}LLs#e@gJcz5~s~1)3u7`?2NV1Z*FV__JOQic}$zyDVHa4 z@1I(ZeOE}d(Vr<4p&5j?P;ogwrf{hI)AFk11do8gIk(@pQ&7GzHD*F zAC&@znb@%)e+cxY(5S(^%6f^CbrIc0g;SLgAO!K;*B|0rR&|i14nYJUCy+hsvU#AA zRJM_U-}3Ayr}$SbuDmSF^URPJAWF{PC>g-drhO~#qbFnXT4}i+bK(strM&w|Ke+P7 z;H!)<<0iQ85b3el!wO79xtx_inc8vpfj_9PMc3~mf=S{Jz#(@L_rdMWaDE{-6F~Au zFku9Z<;>g#^;7D7DLs#3k2SS9JN(?l$+6DK8NA+|eKGv2I`Lejac@vO!pVgD$DzsV zS~qsjXyy{`iqDl24vp0P1yQ(VWoe|@5q=d13d9_K0<*c(61vD^Ks>-nJxJ^LR*k*r zm7(BaSb-{^x;IkcJ=ib^r>p)wR5u3 zBe=UT+S-G4Be^!x+niy$hbO2NyKH8)omOzhRd4l$c7Xnv?Oa8Mu-1X2X^d?r%McuA zKgzmI7HgAmY~@$Jcz^-pd4PXDT2FrIRdL%Lh``CSd@(%lRTW@ z=lFiL9kdRT%b8dqUQ$9%dF*PN5q!-w5q+-W0Hs?wG4)V-k?D$$P>EXW?KXr+0|vsJ zDdUi%(wPmcmnCk6(`}p-@|!!3Jx4>1)Qn5AmQA8AoZuf{#L$??p-8;(ED<<3=nhVM z(wk`_wnn*y0c1G0jDiqn_>Zso%`hyFhqRZ=BxE_{egoE=1+1d54uZfBB4kR*#1(YufaakvjtO0g2Gu)&s!E#@=)K$>iZStV3R z!UkdxI^@apBegOmXr^;;Nr***Av~${r*N@jPfK}cSuP$}Q0L4H`3wh6J5zk<-ZE}b zqLw)h*d%9i#!PM8v&^7_p4q5wu5K?B&o0p95TjrLaokaH>2js{{nJhM ztUBbB?T_hIpArLa3#)EWz%a>DeLX7N(8K1Dau~{D7!jNeo~PIPRdTH(l>#XoC@Pli zg2U8)6kN4ptg3GsNQy|HphX5hmw&EBLiRI9c+E78w_@#$M@H^VUp7s0sEZZC?YI$$ z#GEMZNbV?uN|N8smsiU|s!B>SzGpbv2V8s7xoMS_*6J8TrJm+sce18cM{N7lk;>~b zLo&qivS968ZEr$p$r=e3Td5?6a_nU-kQ8*ssibRnR5B#dob)?*#&|RgM_YU5M^hri zWW=#Ebpz>4h|3FZhXGZ|UV0Y5nj%9yQSLE97I3+aWc(p|8lJuo{Of?1F^l^fzbkQLj2=c&as%1IEXooyl3 z8toC{I8-@osO|@DKb1(fu-d}1#AMkaK2}ay*!B7fuJ(6YejiYGmwRM+3yhw-e=4^k zJ*o*Ui%9am5;iz7ag(@qHCGsUYJf1`3okAuCnR>q_){-rmi2;MP868HWec~DUMcWc zG)(^h+BeTMET!g+M<@?)YAE5{=$A^-Llsj~VJ9%dpVoNgYt^r?zV6n|>8xm0N6B&h_M6b?Wg>Xd_0 zD`o}!$<%`p$`oz`cFiM`3PzGX;F6hHhZ|Va)wjCDw&n$O+*^#W&!DR6WOiG00Io@3 z=bZg}Ri+moZFGj~eZ{zsY`8eb&Znm}CB#r&+p3N05=_8}8#q3o`c+sT&MYIH5XbXk zPDwe(%Tp}BDBMQSeq|%AT990lOaA~c$9T6Pp^xN>MND+ynuy{>jOuDdtPD-DUIBC0 zBvP{p0?7*pXLeGt43qeD08>&sx#03vH4eb;QZfg>)~PVKd5>yCT&Rr$<##vV9)gl< zv?%ZZGbtNghb#Dsi5dbUxsEn2Br537l~Oz7wrP@XE*^P-X3Fp|2enr)uE|zynl z3Ea}|2XOR0)aIT;cNDYaDi9eD85qDEbQIMgV0h(Bs;&f{l#<~kTZ!8tu#SqkA${tu z!4q4q#79CR%z8w31ldiK1NWo6n_N=)IMlM+1 z#zaW6DkgU~s2--E0p9H+j06n3lg(fCVD>d?rM4Z5SC{_)Xv|Y0qO|x0R~a3RJqWpz z?DNP3YzE~{8Sps4{c5eYo-80RU*Dz7t0o4~ZF!9q^*+#m6&OI#qB zE2&nD9OFFawrinFL8W57%x;R)OFKD!Toa$5si3oR&-RFnY_a45-AY@Z~hzG&tgf$3KrN>RC3D2_AsXv9iJ3%|{Q?^mouMo&4U!UYA0 z=zf(EVADytk$44}hZyv!BblUNvP`V1KX9rr82TF4F3i$4E+YM<*sKM!g3sN4wI#K@ zCPduLBAIs;EJj8DGHSs^1#S%dhLZo(P*-5 zrgd;Y82iRS)aUNzsWDjQHv5B?Ke_q12m7Scu4A~DPMS?FK#ZAnSqUZ1c_Z4ABW6-4 zWRJ^{-}h=yGPXHC&aUWVaT_tai646au8iMz*mnG?#1RQw>|x>rkKQv5NB;m`tKHw* zX!8%WM8Zt|>@mp4uQgLpmhK34*hUgyJk88^XEoDGuPJeoMxzURa?o5x&dbK{H@9Lv zY0)r_CX~8`P)Px~$E{;YG`h=_6aAZFhni>g?|>@OM{x`bD#(86J6wI`J?qoMR30)8lL#XO)$ne;{+Q0GY^WRRy^7?eDz9GTb5}(zh;_7 zVF_Q}Aiyig{Ay@qN3ioq1<5PP?N3sd7=JGgFbb*aE2Y8`S`izfoOW~09yf>wTmYwy zQgK#8n-PBVhnh?fWb}F&^y)r3#G}gg(oytbV z7=z^=2L-w2twRzdWn3=&VR-BQ6!|6JAdX9Ygmp~vK_0ao#oed|42R?8D&KeBlJe^K&jJV4X2m-v!PHh-`jp^W` z+11=?u}KkWB`0j3Aj#)GqNu&oT)WL;UBEl0`F`#=#c@}@EiPnMy)0SDGN%Dgpfyro z7?{yiNg&Am;_u+sgNfp5H6JT_Bff@NQkuQDI@^yF2&7od%A;? zHw+)jyh_;W&}mJZM-Ha0i;H=Fo?^Pb(l;!T98`;$=L}{oBX$S;;;BzH(yGNAIob$h z9e)a2UGt{rD;%rHLUHvRS31nD`Fa+xt!r~i28afYr7Xl8FHSw`RCs)m94bq5wLJ}1 zS;p3kDF{b9y8F_-!l78wQl(e7Tzb|0VwtjoiYGHPYzi?_qbd&rH1?ML#`zo)%1%^s zpK7UQ3*y=fm6g1+CKa=Qd-GAxc>-NWACOcO!^jSBeR0~K*5Mf1_8W_OlH2MxaY`VV z9&@?B+4rlm-1+K)1O=0s1~@gA(!nK}wvmfTyD2IjSb9_KTH;)ZvZUnTaBx5URh=wK z=W%Y})|W3LBxR)eh6X?#0jOkx39QoYBCg9JSB&)@^-St=+(OA{j;`4OWcKe-rPSU) z2j+G-UA;5!QCAm5$;ARqYEK-{+eB?+U7|yR3FLRp4>E2gW!-^>!RRWZi5hSUZVWIE zIa5xAr1*)33mv&m=C~(P=8sRj`U0OkG z*i*E!o~%EmQAs7Xf<}@}%viU}(!8qAnnkqB8g8UkRkYO<0J#YJcr|9;_3f5VvK@@; zgnprGI_e_`7YfIK7?N@rA4;YYJu+*g^$d~&Pl-QiihlzCHqOcf10IJVakEmYkSq7?C93r8#`s% zcYtySrC{e;S5_A)Lqou?=e&}9=W2Za04VpxT#8uQH-dR2RX-^(@I_R(V6x&-8b&}9 zA5ra5Tga%4jV4r+w8q^Bu1|V&>dF$kWVEbl0uIP#W?*x_j&@?Al4P)m#D@W!_ij!? z=cPe%E+V#JdmwSo%fD&!m57NB)xVhAN8M(?K`)+*O-RAun#Fiuv9Y03GGJ`ijxC)AT!Oo+8Z36Xh-WXQg7@ zS;tqQai=+%HV|r(GH;72+^j6Ue!kUm<4e1?jqdIx3QjQ)_4chORN6*tqL50CzcV*c zpF>wQ6Kw0|BCJL<2W*^%_Z7S-({!6}QvH>VaxFLa;yA$`V|E{O`_!@9ZIs0zC;;G* z)caPJoQ*TI*Ckb1@PM2KJ*w^Qha*C^(ZE%R%9iW6_Z1PM;+2>qcs>!vO0+~k)6Z%eXC++v4+q|ECEzL zUQ*qCs{>NF)0R;xO}k?fn_mFuvGuN6_=wV1xYSouQMBih5hBJ_cI6IuYR;0)1aA4l zvwYt-O06EdF6Ok7<4?- zZs&0Js*576%v;KZcKzPg>PM-o*M-f&yoJ$M%fNsy@p{!5?IPZ@hzLDdT<4zTdRHA< z(Y}S*nmS5a&fZn~5g2X^ZH#l?qnlK?x4M$X)>z%te(ls_9`sm6Y?1!*P;yH!C$@S~ zb!+FtB$3;d-||Cp++h0s2fYgt`7DRf&%e|)m>^RK5|IA@zB{pz=~V5F_NDU3gflV9 zXQ!oT$gx3iwo^`lln*jq%-zTpUKN(w_wBIUXPy+V1bTt%Ts3M*y;%)vHUhCs9_W!I zLu&3A$g4}Lz>z$J5Mw{P-N|$5QRkE&Q1AuELE1bVCwFv#;V~x4?^{Cb-xMMlE zask?)50@0avn`2jvvNtyXz3^p2m^3l{?uCQ7aLnmNIpe5xR+qyA4;uZdG^7$&Wwnd zk1Of#+|qrRGb=Q12JDlZ2B~$f4I+-eES7V;u-#@k3W2y2f&Mi&pZ3da#~S%%a2y^9 z_o=SF%XKfAeP-KHcA!=m-Ro4I!p;cRTYI)s5GA4n;F`j9C2wGGwNm+&-B6XoL@}*zgJUsFh0=pxKtUF~teGp4o}cHZMp201B4vB96%r;eU3NSpa~Jq;t#cAwx_6S%OhHkERsg?{3GdG(Rg+rvb=WdA(I4|6P8o!&s)&^$GyLu@WyWs*SnaK!!@qT<_O%dB2rMJ>LKWKn{0)BM0S zT!Qz+u0^cY2_qE-Nn$w1(0f%I{d-B$4O)q8C|Td4xx1A^H} z2g)*QPf3OyCgmDX85MqDgOTfzS=6YO%+j12dZCu`IdCH|tY_}HUTWmBG~d09s}c8! z9dT9lJxbA9IjwDhj#k7i(+Ad=x1t@cBXXI`DaYb#4rX*{v@{}xWQg0qM(Gbz&z5Se zrsB-v@f}?l;HMkMVk*Mw4i+`Hwv3@5%P8cPs6WzmE1!}@-uYE>Gqif*rO0Z-C6-v_ zNSYT{aq<)QM}NYfXK5wUY!WK&Borg1Lv?2*k}R`aZV|Q}hDK__LuDi;@*9`wnGg3! z?MnCD9gN$|%Qu+}j06mKvoFe^ds8CQ=4Fm(tpvcxbHKpQe`>Wnk%Q)3Tkcml3XC!b z`$N4h#C2hCKrA+^=K~(%rtF?n*y|y>GiEHxJOsNI#s+HI66wbbFe2h2wbepgce z0I01Onj>SjHVRcwnqQ$>LG3PBNX__bYo<^gv%MP!@u}@+pHGeatHM!^(hu7wn2g7sK}-r8!BO$n3t461V9-Upw4wQEos z4U>hrm93@SzcRNhNA#?340yXzv4Es}5}Hlxe73v#8r_Q)y${v{o$%Df<~kqVTg^<@id4J%h73yUEGk`CfH zKKyj2H-`qB36d*_B#|7jC32*82B*{@GTSjrlu#E3XzB;^s~#G>d-&qhZdDnKnUn?S zJ60~Nnz}Vq(N%5iUh*`85e&?^Wyi~d)Z?(L+Efo2CNbx#WVX%#rfN{>{{Y(#nttMT z<9oj(dIRb0PnN~+qlgIF07eXG=PpNnIts>8l#7Z;f?L}wdzQ1>+X8~O8OsdkDo1>J z({6OTwv1fc6)Na_qF0tRZ${FV^H5PK8I`bDpSq*d-nyft>7QduXkBs+S0mGh_Y9_D*be`yxTTopn0Zl>ry4@NY$CzCY`nnb+eqJotZjY+ZmN$)MB zSf3$$w)wub1?}gPx?oj;AQ9*IkEIA1Eb}>tO0bnrGYygQ;~mXD6};3W^B^P$PE3RN z20G%h?lo!VxKxr@^5{3N++}@$sMbAF)>OQb>ugP(p#}*)pGu^yxi`MUb$=0R*769n z_bC%OQgQdaTi8_rHodLMA((>^U8a7jrnMd@Wr;2?5nE!GSi!*{{{T9nuXvwI(jbP) zFDY}J#hh&U#C6LXbfb%7Q0i z+_3ic6`a01w}N0Tt#DyZcN~Tu{{a1Zq?_3p%A^+N1>0II7n*?s^s2XBBfrybjk(IEK_X5;Khm-#^IG7$Jegsb%xCWp>rxxNf-y4g z{`!ve`D|wDHa)H`&Se`NS<4gIeMhmV*X?JSC5|{1!74}0N3p0L{wv9v%E|^-Rlrc$ z+)rASBh;i3!8Nk&P~6-H$C+JqL@q8pjw^26>Ek;Xr|YRvkUlI6;3U_Ra8t9+-} z3WHA4mh63|bSjU-tejOloij?dF*-Kol1-&SIX>giROs1Sq(1Ixt-{RffH3rdt7M&IDN}amg8`n`l>zPO8?_KF)TT!(Mb8{qvBz4*k z6%Gw<%8dE88>)D}PSNkTMQ+nZtU=gwkFT{@(x=jVO9+Pz9@z~G)(d8 z7crvk3`(3c8oF1*dR@5tCECjqs3YL(`Sx(_ly>VhoZ?$YcG}=~OSgVX4ZpLllv)Of)+q!B)pZ>+7F- z!GbNZ$tB7O;v6Cd!5?2*t95sXJjhkvR6B;l_eZ^L8cBJXI?bInpW-VS%Z*Z3ify?= z_W^$OM^v{L46o)$GB*Inq4lcPH^)}D33X|R(BP4b;PpR+I_g=7j@{;IN@N*SW99Ai z#T=yg~0^l4T#-fscvDrnV-LO|Pxmi^}X359|`*ao3+-bJ) zT3fC4v5X9|gU0WFrDD%8d3?E}Mj!LkuN?NIn9AC9oz47`CAkS8=p+P=y-q4?yICw{ z+Sh=x;4*S@-{DZnJo;4Eh;Dj3O4c&tz{+5aY~wksW|yp2ZlA+T3g4c#If7Ji7-`mXXFrn z&q|rgl)7NE zq6C4Tuf0bV#g>+hbhgaKHe)0+9PT;iuWG^8ZP@5kV-<52`%L>=J=#6unb`P*%=hCDl`ksaw(0D=JHk9y{vNJmq6Q=GRv%GbeOHq-)KydG3xjve|A z-^#ijAK_UlKG}2uMafg0$MOAZyw|lY8pJGcZ86J*3WtI3T>bu{C07>hAOPXLPt($u zx183R57@#Fxh0Q>?R3oB*j>Qkda{p|N2k3(s3dDU&pp^J5F7!)`g&C*^`?Nqc`NjUh5A$i_bK?tYaVvQF)lr$lMk>v32{kR+i(lFGq(%~sU)#ayg` z;(7Wzw+=l=rBA*~Xd{yD*}_P{7EvF|x3&*@*VG@wjA5Q@R&OZ=*xMU(j!i|&NwjlO zX?`Qzh>sM@DLztdg^=p`hqheTZE^Ir+jsK-Yo^a2htw=4>uK2)K+ zsH|v=ZNjNZWC3>^a(zdoR=M#T!m>g3S#8;~L*dcWjwelT}9k9qqXMv9n_zg(p%{)U{4A^DM{xho=K`{8o{U82|$%K|70GtWMwH9fC|btjylP`g)iG=~a(Mr!O@29arT z1k>CxGA`iw`9?aArA5*!m9sUpZBpWCBfqmD9Rmqh037zkTd?r_lDM~Mgi)CCCy@NA zeGV&r@5LS)(=_>4PqAx>z{pIFPhfp3nr{(m8tjj2Z5V@L466SCbmy;6N+TyBwHTcq zpLOA{55_I^0~G4#Cuzqc>)Nl$<81=rB%4jOV58*y)(PA=!Q-WIH(%J%vwvt@#zM-mIwAa8^fGeX5Iy(jYhg0pEJRwU zNjyUtm2J`|EKWx5R19|XHAekq)~(vw!u74BQb=Y!NB2!72YZ#wjTv<4VY&M}53o9} zWmnEP>+Oouzwr-;?Cp|E`-KiNu9@qOGCeCd!a4@8Z3o(KttFRheC5dJ-|1H`^j{6> z>E>N91%bi?lD+%Za^-TfDJN@~I{yHOpq}Mng4c8p%tj;Ey*c$;yR9TZA#p6SedxaO zsP%5u1>Me;*3zn@7~wu-LNkKE@PGYPmwl@ng-dy#%8k&ejR+f8)Yi%g=#kGVoTjms z*(dY<*OcG3B^lffIVZJK)OA?aDJ+Jb+Z_C}0s{l@S#VvD37X@26~s6nHhs-R$s?9B z78w5V$u+ELrMZ-9#_>X2$g%m14)? zmGHbvT}F3?6(FU|y$L-?^aJ0mQk)~Z6NKdb)MH%90_+JkS=flV$S0;LVAFL+yAVTY zUk5M#$GP^eNwr@Jcw!&1*l4LOz-%Lg-cmYb+*QQn&a7nVtyH8>KV z=sl}1t);RwSVs3}B?pEs<$^hN4p?Q>_UgD*`yqeZku`x8Ut8R_TjNteBQ5V^7>`a4nkvJf_ z@D$fOoSM|=QA=X&jj2l~zP7mB9!xT0p!BMDCi3p(VUj;9ClT#jR*kjnZX~yj7ji;2 z$m0s<*i*FYZIPwj?BoI4@vO^~l(3fC-Igg1VZ!~=dsDR1`Z4=;)T(7}8bu!5^)8GrVpl z1-#R>7mVlHr70!`W}~KSOz-xKhlVL|8_ZmcdwNy97RO7{oIjD7Bmr7RZW|plTB7l8 z)LSfINWV9iA8-wBWz(#4jCO)kF%WJa&v=Us~Y}@g_4PG@s`!a@7$nlBoQq6el-!Osd8z$m*i;{+VSW zKovu{+vPtYv+LTb-h4)u%3&OqGpuTHGOCWgpjR)a>-t8RvR@cpa;z0%<1XE>PZ+2Y z{$CJG`MDAN&)xm@dd7-Y}c}C2GlNmrFP`|5BJyyAS?BLOv=D)Zr{8$XcW6+NIr%bcky0yt9Y3-$yw5CBPK*_YZ_03Wj*5!z}K`ceNi;fSbYFMvKvdJ~v?D&i3irqoo@9m0? z>I-3JmzFTMmpTy=lb75&lUv0j7TY79MV!Yrofr=pJEIMg=od80`;$CrX?96Kc`7#S z$86P$D_k<0t9%kabul~^`c&3F5x%&*4<*!CTseWk$;qbNW4I*V#&)ADt7!KT`JQP{ zkg4O2pM^)JrlWG6ZM(6JnM*uFJ5G7}3hgaCH4NfN(bRck_nr3x*j3Fl!4O9witPkZ zlx8uh+7u3Qe*u$G?W1D-l&*4GU5lg_1|Y>IkeLvsbA#1t^|y!ZtmRd=vT*Xg;Bl1) z-n5qQN6|LCn#2-CbCDE7s`tn}!K}OAh|)mbMwZ4YSA`x>U_H%dkU;^EsU zyK|9&>UjE6N2=KPPW|ogZ$a|pITAij+~k~hto@v&>S@fD=U=Dkme6VMJa7>zIWb7% zK4{Jc+OvIgIaP{z)gc3LcTAFfGAob1_?LC8%(fbOHM(ppjUeJ*O@ws%QbVlx{{Y4M zbXrWdP})dX@03TijAxC&9P)bRm$R4JWh#++MI9CY0L5E<4@r{F(bU9@Swv{QV!wQ! zO6DKM{vz=_l7C{r`^Y5AAj+@QcCC*Md>Ocwad&s7T-?M|gA=|(dbiTL?K{GjULV`` zeK4)Kh$%T31W@Wwru0{3#+_Q5=#B$T_)X%U6d$zemo4VV2_iCfDDC+A*JY!88nDv# zHmy8SN`NzAdB?6RskZSIm7ENpX9F?eaJa#)cUmCp9({4P$ z>5<;E<+RkVUE*n?ZMZQ2hi*L>{{UKBdzjip^PzP@K2pt{*r~2{Nv=^X;CRv|Z{7q0 zk?-kCk)iV@O&zU-vjmPHjz`FHG8hiW)7qt7Yr~*!mgYNo0^(L@;A4z|ShB&aPd}Am z8i?3@s(PUAN3BDp_)7l(P`i?OBR)zGy(D?wGszUaoL=l)%{>vLsra7K-XjVjmvelk zK0qCfWj?j6PbfrU&gU^QrvUp3=pyj-oxGr1qj}HPG51A8`p%PS3qdlWWt;a(ss6^qB z7VKU-Q6y?Yk_gI?>U)}q_{v!9WVd1?4=H7B-!KD>t^DhqyYW;bN1INP#wRNNYDh=U z#Qy*YKGn|M>&2vd!lff84gt)X|6;*r!46;Zexb*)=31>Romh}(sA83D#K-=9HU zF@-uyQTWM`) zSeR~ELC*C)huXVnyfc5LTO_Wfcb_f=ZXA)<9@N=BEO!ipRFS zxbZ%_HSBZDmhxa*tg@Wvx%RF~ldV=)lCnCX8dTMy?#*TK4~4WTqXy#RbZ^j%`CN0m z@v5FC_?e+=T6l{<)9%@&n{2HZ`BxoVKAEel@ZQMV37+dIBA+p2a$Wh)1auXz2ZOvk zu71Q!P%A#i&BjEEe)oOe^^EyB zUbkk@=W3{;Z)@&m4-0CZYqj;m!8B|N?8sF; zl=_;mz8t==w^)s%`BT5oaR}Sx=dLl{wG!=0A#BP>A;vnlekw$}2?SC-%7`M!-cJWU zw4F({VW=eTYw9{ik8W)A>qiRf5|)}rC0Ta$`sdcO;$=7E_*QNA zi6d!aYinXj%1IBF2J!vnJ-gMlLo{DwTStvq_aini#Qi85W|WV-UkNujK{fx;JD)hjs;?A)^{^% zFx=khS20H`{Dl|gRvFIW*dO!OmpYcMSZX%envh4JS=|2hi3SnNFd^8FN@Vx87M8>{ z%WaJVMsa|-J?XZZPMu?Ub#WAPBE$v+ta)tnw>`Sn&b1s@=(2>3;V^_K=rF?^gHYs? zE-`j9tyT4%SsLpRD*?7;=s5Hp>b9)b!_BhO!7_zDeavg}w>aDFL^jb{&es<@kx3a& z;sF5=9=NHzJl8kqY_0Ue}4={{}; zU!_j)$$u)#1G2{(XUtDg#ayxQ_MM;uZ7eN)aH@IE3lHv+e=63~^tfcOSzY{xRUu$* zTOaKn^_;3MhS8?&se-oCt>Js9iMAklN{jQ8+?vrkbkQ!$LxhxPYqsy0^*r>e(AqV$ zLi|Q>at8I~kD#h?Gx;xLti)~Z-c#g8;|j~zfGd?-M)u1B7z2m$)j^g_)?KXg z64Rt^0g#~p=L|osH5S#x+BIg>Bb{+?ZRDzs5>8HgpK7Gqjir>LTcX=o9$fs0f8Fj) zSh=`@SdrNtJSZ~C=Yl?!QAB3xu3gj>kLAeRRC*CYNS4Q~)OHca5oBa8OJkA==LVl8 zr1IOC;!q1V-3tDY^q)AaO)+eHpzbqR7ynir?sHArVNO7EVn#k5l3pR{C=42}E zpO>D%de=W=rrbd^azSw;O6#=|K|Fe#R`I17M^h&^dn2d6@QP0fxwyHvd1J|u*CCI# zJ5*jBxYh0StDP%BWri~3I+2h_Je-Q?E-mczO#

J(Yx8}1yg&`WcJ?_A9KrOt;D zeHf&2O?X=7GMk3e&f%Ya)Tz{+NVT|{wx*2U9=y5{&#M(NK-pvHar&C6uA56Z657td zw9MO;@(GWQbL~}=#J5*jxt21@Ut%JRaypul^8PqctZkxsP0_{9IVia6p5IE+DW|BL zOw6{_yy#ZkOFU*N3rleAkU{JRu6t3dX*!L)?04&If^HnDC(7~Tu03m4Opi*_kl8L- zSwl38K`oQ_N58#NyLkS>vfR9}BhFCC9!o^Nhx}_rB$+K;78daNCR@oy-z*@ECN_`p zrzFfQWkj`9a=*HA0R!BMh_r_3t)bZVst1zHzcP|J+IacS(#8$w#ka>y^5vlHd zPqi(957Petv|%Rx8B8q8wl+|5*yldg(cWrW#3!e zd(^^CYU6f@n#Q7GNnm)!BmpHE9ItA_i&y&)H+Lvb*aSG}{`HDKw>6m~&YH0XVTosc9mwf{)7rZ!(f4l7Y1Mbo?=8GrCXuJ?x3vij z?hGb;9mMm+X5DH&H@Uj|PuSr?&4idqxj;3Org%)lbehh)cJkdw#wNGiLd1in2T#Mb zbyl{vNoV#eX?E=&Dyrmz-2G~07(-xAb6T9!cy{J#-q%pRk>{ExtJV zA6kjenmd&kG*|H)vgsOxwwipF^B9yANU&9j?zrpdMO~9llV7;DZA$U2)gcOeuaQ9` zl5y6qX=2w+wh_LS8*e)nQZmV&{@AHC%l$IjO;lJUl`V$h90!q}tUY~k?Zsy1?PO@8 zw`1V&&)B2H5luKK0^Rj42X1{T*PM}rog5Vh_aPf4ao06NP4PnB8>G=EYlK9?O1ur- z#ybI4UO3I^)O6+YciSRfMVzMbpP5HcTe$Ym6`Q-<);zY**|!=|m2R#eFBp%^bc|%< z)AOu7SPR>ok)lW?gyJLokO7YU?j*9ws^mM8}+8s(gx z$Bs=>*6($TE6EW|Vf>GoV;qG%fJdmQEw$;g)@vk6lCId2NP%tN-^~W%+BOhe!LsBp zHz%VnP@}muIxSfBdKEOF+N<0Bx9t}3$l*==Z<3$w5$HV+6>?1?dpTT9dbcSiGU^Cd z1NeYF1!!nG4xy~X4VIeE0nCPQM#Gc$Nc{Qssv5qlXKUwJSX`L{{EaRK5rO4>g$na_ zK-VhNyB+SDsHR7ACusM9kUA6XSo*!xQWtwy$`VTm-wIE1eX2P%Yk93i?+Xik`*$n+ z+;t%L{{TLfN_&-_&TE@nX;$43{_bW0oPBFp(rM~vDvP19r%f&GsI-PvbsxRjMnU@e z)kcXTy>Bi}uHX|JAG+PZ6(58pxz%hI;6Tx|pK*=?kPqEB=~_4X8tYddX41~f!=V|o%(xh=}Hqs>KJCx7OobdW*y3o;2yPSM%C>a=-C8VPm)$iNE=-<)DNiqDYTlpB{zF9W$=Z! zl`_GmTwMsH4uUBT-RH6PtCpS;vbDSs#3N^90TDq4E;4dGJ?p&qM<0M=)7sm{dfnZt z%N(C#mewNi$uID;wlKZA{W++7M|Y#aF}4%N=XeHqz#RJhJ*%7BK6ez2<4QKU&E06W z*722^Q3~w}^Gr&GBo2Otqnb@MiO}2uG(lcAG4jZJgN{cPvo@z;s!X|QJm5)WxB#q* zI2?LbTiFQj$J(8W3>J}B3IXgrD@7;Ne2A-e6_j&}+gl$l8RpwEj&>Y=nW-exZRP@7 zh}~4l$&K)=pma60qv-mEp>=b2plDOdV^tG7E@LC0>%hl)zjfhh?Og@Np3|glx?>vP zL~-}A>7LZRrn`+(GIR?Y2E2K-du*A27U^!mb|C6=+@7bm>sog*X_7MANX6$QMIO_I zR2>N&=+v}rBG*ZmQMH&EV*TvVBNE7Z40>nKRc#{f)gDW$mOx^Q&6F!;f%^MYIW~$> zNWF34T}Ix-PLMEPyh<(m_%;pKBl!} zzMAId3)y!Twi&g!jDSNA;rjd4J4;C|EgDM#sJw~5Uz{BD_Nd$KdSr3iK?6AqS>-Lt z=blGztwXiOqoDr)82Fz50L2=o+V56*ZZHMq#Gf%Z7#Z~=isr7)sjA&P#_`}-R0xM% z?b8JMR_>Q^tZH&Swu>xEs@tX;H##XikUeVE_K$0$LdJQM2bM=1?mfM#RFWG^=k2U) z;=fzFn{PNWg`F3JxBAxBjipPeK`n*Cz}|D6lD7vL;YXqEOcqFOyyXndFHon2^aI|i zA(u>-?GjrnWfX8dsel5I!M;g4=A*Q8R$Vh z=v?h=9`5H*o-K)9%ElYDiWPs~GmOXdH0?XZ{u$G*roYy7%X`SBkcmMY1RcG-k6QED zz98!pPAs(R5gokG<;tcJpZBtAjqE-n)d!Vig%L8ZB!9=A{PwM*LG?3rmF*o)%U$ul zk>P=G`Zer#aa^Hj;BX1HkFW=!J&j`7-|N0KkY4Fp3p0#EY$9NzdEl|n0DGFP;lB#W zY?52+Go)m$ZX%Rq%008tS6`xB+nFI6STV*15*tyR0o?kZ|%-A@?aEhtSmejnwD;65CNrVpuvlj#076 znbaJiTnT#y^ly5KUlZ!^1k<%fSvE<&X^db62h-I1R!n+r#o|4}D@Lr}GVaeH;8IxL zBN;8Oh-ZRA#LLH;2W1|WX(U5x`j_=Be(PO=;y5(3kh>5;7*gZZ`kwV?;eE6=`t*O> zc2V3|wl-X-*kFElWSUzucDr>cBQQfCQEuv^$JYSo5Ra)>`MwJ(`1z5LHR^@0@4c@EVtmf3u{5&g)EqWRIlS z1I*6^A6#}dG}4uJTsS@>^Rn^}uOvbnaBGLl+cpkxI0^&em5irMhji@qL3thM&J z@aERw;F!{RGV!+~CmqL8TRN_l{o9%Hx%E88TMcJgw_iBRr(3IHE0re<{{T_auITz^ zouN9%V=1M_`YLtZ0m0^Yi5<6+S?#9XV)B8KP85xs6dfez|+X5 z62z;JQ~D2oYSuMnI9p^(i;FwEpAYIoMIJEI9@^H^XU<|!1;{6#lyu4bGhDZawYxoE z#rFDMtE*b+@lPp=JxcyeM-%h3I}f_OvT#0?&%xpw#xa}0G7EVcHI1brHeTZZ)~~~> zPXg+`GP8?Xwsy0bztfgEK6v9NmLC3-Oo`ghQnZTM$ac5D!v6rWPh(uH8UwbNb=5Xz zIkSdwk1g}igV3JX^{g)t_^wS_#$7MSL{bE1NZa^_2N>_g7IWAxqP0f<0EjO9KWzk; z7SPNRJDr|n9JcSTr8`2k@ZX4Mjw@YLVuU8<8=<%Nfc@S-g!Qg-Ow)Xb!fCgY6m=!y zl1<^WjGw}^bPY0jHDrafCSiJu7|mtp`?*`!C@JgQ#j6wd^fD=9gn+*9?jZ=0Z_U6c!oJ10&YFp8D?V zQB*b;tK}q{CyXy}Fn>Djz6bn6_?zIL7a9H@8_0EEv9w4udj+|bqHb6eWMD@ek~sAh z#fXJf2H^GVbwY7^G z8hFm< z)!tiyaUAZA3q}d!0I2n?IAfD@wA%u1{mZcBKDAQxTU}1F-yNZF6%^rQJq|#x(=5`l z`7|t<#_OR#jnJbWxIFQWGhTh-TNvk+$!AAUNKEjc^&}4d_39oW)1`(f;Y$WH6(LAq zL~GO^b6iJ>^!e_s)=4edys^tbFvR+KobNIFfq+#Ka}2V zbHgW=>4pq2Tc6=RmC$P1RneAPCYBhZjBl1C2P7WZtZY1Uqub4cAI_ovU`IklXJfKD znUf=2Y?@S3tDTIz799uHqeOLZu|UUg#^V0~#r-O8CE{@`F#y}i+aqw_K~WIF%BtbX z%OM>-#U`{gG;Hn;^Ch*ojCosHDTrnyb!9z`Zs`|S+A)mA>b=6S$&4OJKBl>NLI{=K z&vbrfT}yNS0P3ynJ+3dOjU-lVFvMVi<{W&WpGr+!mUVh`GeTDQG@ew41eM0_Gr{() zc$z=7d6Piu%Ahyz3H*Kk02=45?qr^5t!|b{8a3gSuoce*K>oF-V=Kvgwqno;;9cd5 z{H0F;Sa+#uqn1kM-k)`PSM7^sA^>)jW(=|n@O{0-Pj4LZN(6A3S)X&rqlNVts?kL~ zsFpUK8JZ*wA&lV^o^VHMvWW2#=&FoVF<|%v9&#w=Cd6V(NdsFftQ{mQ&AjeXeLX4W zL`3suwPPXzVpr=-k8;N?oHGnaxD2bw$vokcj24D7l>LG6%N4nwzJhHQSZ5Y5|=tWB| z_eM*};{DM1)F&vu;;TjpF@Uj^CP{-rNMaOx%m-SAJA{S-GRc)$*odU%pW8J$!)fLl znZYsy#B+IsF3+cNOpaNkontX06M+E{{Dk}ZQW*In`#e)A1sS5>Abt#fpFvU03fxB! zjp6d8A0cJoi5!vj>}l^DWIS^=Rg)7W!#kHf2dMU{)@^xpsZFVBcM+gWd28k29dm#b z4hPe<9)m<4RFbf z&-waOpu4n5ZV^#rac{P0Tb;u^9(q!_X&_0JCt1<~8umoKq zm1fz5%MqRr&{cK5Ed$u<5N~N&jB}L%OZNH-X_Tymo*`_;&S@?KZ3Z%}z!>%R{*_rS zVsu52vn#pS`N1vdYDc+9L1vCg2^&Yx_gbqx+r06@&;>0C-4)D>V7v_Na{>XlBq9FsJ^q6g8oaFS1g1EaEzKJ^&RF~Qs3ej{KVxWQiP!gr zIU6ms{{R+!DYkQ@vaG)^mJR^w7{p(H))Jl6c$ntjo3nQy$_BT$cy7F`QM#R}&I>)U-(ie|w2P**N6X zup5=NW|Hkpfy%6&S@}H%JJc_49Lmc*++_{|I^-xGwQ4kS%41hjMk8nEBcVU1TG25G zcSmUQ%`prz8KW5Iumk#0aMt#Z=7fF!0Cr&$5*v*4sT$-&V`Fd~Vn4Yf1Pt{)=iZ}$ z`ADW~(TQ#tt1@Agdf<-rNwI{Xwk(#;pt#!RMgAVSM{LqENg}8lj3cgUce66yE}>QGuo*! zk}Sz?;UjE5{oE-zzW} zT=xRBi)?9@Wo4OTUo)7P;!cHqz0EwjviXtA<+(pyhaGWM5H=k{?SJ`Xy>_2pb5C2$ z6?xMW?ZYVGW7ieBm5Ym4FT9iLYPL(V5A zzBXSm2I0=#$J(@`S;l@vXpIZoTMLL0CW*zsZO`*y1wNRk+g`SrFk(US_>2RM!m101 zVz&=5k}on+rJQFi>FhfSk-@e_oWM%R2;4?O*SkV$EmVWEL^pj6#MPSSQ7zEe?x2?b zqP28=N>r7ld%|PJ6n}f^Tr`5=%K2hPP;eU`FVpE(?e%%#cD0f~@`Ma_9-#VH*kznU zDmCvdJo}z~Y6?-Y?fx0@1OnP3nu5m&UL$EfZ=tS+4-~FYvB*};fq#U1*MZyX(#bRu z$14OwjDw8v-nZ;LeRTz!$0IXFPENzi0sSlW?6Zw%`y`&9Gw15%*Lt4WW#bWdZzM7? z7(6gIBzt1Cpz#Nm!GIZ6%4M)~UKgkM((dLnc?H9;Kv{5ck7HX_KM@seqq^J~_7UYX zbw2g=m@YJhNZq{;I<8q2vFoeiXp8bO#z`kRrk#CSKqMr#GDdjCd9It|XfDxr-C<5} z0OT5$_r>vBS(bUSOMJ39#t)@>i-_Xk%%!1^)Enq`ui{A=mT7Jd0VAIN)f}E6bwe4G zV-fNkU>~h{qj>Nc1TvDxB!ip)O-Fa*JE>tdl3f+rcS*PJW3UFe<-~YruQ9wZcD9G1 z>K-bFIE-w?oq1p0;B@I(7rzj0H05}sxdEJUmCg@p^PdoSs^(-#t^Qy#r4{~ftz(^D zSxi?~S8@P|cc2{S>0djK;`l~V<$E5DECie^k>6`y5U#HzPbS+hfFwEV?^N!*RdsNy zEy>#<7(yTA`ikN0wOJZdaF-6H)4OLF^rxM5ji^G7#4#ZUQh&YeUL3foPV#M?OD^T# zQ>RZ5UBUa^LgR4_k_%uDps8-WV)DW*82anTnGp-I@7+A9{-G#5W1L8~{M% zRs`2_qb6lsGafPCo&JU`#PZ7f`Nmrr9`*9l&uTX-$nEwG+d^Gx`%t;FEeesr%ND@) zBD1uKH7V_gxdbpwGnV}gOEX6!nbJbUfH!X752aVQxwv3rSUN7?MlgN&uOhx=x%t~> z(V?Y@H5lX5?PE)oR17l{$Ig9oPz$KzA{Zl5yls&8s`CkFZPFGYmkSZ+pHWOjXqi#v z3Kf1`%h9`!YVj)L>dLP)b~lYEsM(hO*tVISrl-W>DKBKvNAt(s(RN|EOkmz=1)$jpJyBDXx&9;GI7Wm4|%Qw!4}`6wzUrlesqW(z+Ht6_+sW z6p**l%N$QCOO{cem|)_nuBigbEgfVflPJTFo9j}&!n}YwZ$|sT@CUConRz6VF6#zp z^4u2WfnIfdWT7j?mASta(32o#!YCz2P<`qvyRjfBClR}@8wZ?v);^nd?29HG?K}{1 zxPMx=bri+}1)pc9L5tj$|>D^6g`j^sJ$YuPE6G*eo?@<_Be)q)O$H3w+<5 zZt2ilOkOs25qW!qbs+bwyIUc9DwmugQME=eSo_ko#nr2eVi+rYxd(w=SZqZ~O7qlB zUt-nomY0GVV}CA0%1NAH)msagh19l_7u(ej_YbW^vd1EpmD%s3$pl+dKT?Ml}#3#3UrtK}gq z93Dyj?OKB3TW61KXdJdza0j(en%&`;!*voo1nv^|&$rT?Z|&fee(cDsj;NJYY>B!P&cZPdN6h`DST$&aJh?yT?6!s~Xv=OWi~}t&P{avN3sT;eg92 z9=-EfclwkOTZru}na=VF2dVV-6+}-WJE@U^IQjODMK&dlR*j6@sr~C`?+>MMRmaMz zve1Vq6HBaLe6YHRz!`Kc&(gD|nn`U|Db+^TW&=F0)}^?%F-!K92O)7AJ7+Z5^vT*q zGCHiS%PIS$cCS8jsZr|gM7f)=!6R++V_=3pV;Iik(B`9>M~*dE(Ok2i;plxwrD)sO z;Ca4cGb{8?fvQ_=GHB#BvOqzQmM0to*YK!ucT2d{Imo1trPy0$Xs|h8gXTWQu0y4~ zuI!*QkT$Sh7uywb-o?=gNXJ8r4&T8Q|(fVIMzc4mARDv0IMH#)w`Q3%WJ7L>#{d8jiCMJQ^>_wj@n6M5n8?> zi8oGWUzji$$RnKlQOg*bs&QK*JlGR2oeWM(e7gb8-*fFzwTTxCa?0hiw1M03>?>$n z#?UR~hiqNtCxSga%{{cq7TnyrsUw)gUB|sA2r}%}#!jE62qh939hsbstbSY?(J^Xr z!S;F5DYh{XBvJPDrz~;_TutSv$3Qt+vbM5VvcS@o^CKtCQNhnWPeD-RqoOH6^($%c z+co0BeWz}T8*_qt)!E(JRoNhDz}ywThu9i|+5pP2MSyw@$Cm#98hY8pp`ci>=aVMx zgFPyiCB{6XRFh;Z7>_kjvnEc{)Ke_l8CfTZ@`~h*j6q}E8oH5YMKlS1W0(X58*N0Kf|^S6Kpr8;|gZRSQ(w4#!s z4lqcj`7Zly%y0X`c6nzc{xsuEYBp9m@x=2IuHY*!?u$b#t`3oWv@&vhCud1gPQDj6zJdXFZTrQOgBck(?kWhUlH~1B z6r$wiMo@o^VD1aJI;aAp!;5X(g9Xxe=sf1rlV9 zzjS&ZdRzTM#t2gC88=VPQ1hfp^bQIY`cD?&?2QeEwF6S62fdHKhsHtxld zB40ICnaiMza(zW*XL4-HT6(JyDs5f;6_*Fzw6C-+DP&uLbLO;>?RfG+tvPL`xwnoh zi11Od7*rVq_sFYrX%Ts`!8~kajksd?10${}Hj*4**_PUUy{d$_W_R+*5*6sQ?It^G zS=78a$;&uA5&ku^_HQ#}GDtG4Mh6AK?NzkxDmzQlF-8ba3;okjdxx*A9 z7a543yc@kF76ePYTCimVb;WO5*ui}hN|N^A9^SPAskc@#!?@&yZ&mfI`R}2(va=a$ z1b-=#-I-z;+71c)YVD?#G_kpgFk>U`ZRa`YYL&&*2@>8f+)gu};`FKFQ!Gm*#HC+x z!iFoj_WUXvW~m~(-J47KqiK~9KoTQ*`&E^Dv}J@U>~YA(PH4QbveW}x%@US)_RF~T z^{I3VTWeqRb1O-;2w8KSbJmlbZK#xGeFsTnbnz{{zVKM!J1$Ssk~DOJNSa1cqilq! zIQOj>=15U?Zo%SA9G|XgIbezIV}G=iR$x7k*VeiHp|357tsYoyq_%ygIaBvi<2?Op zt(mZzS)shSC?hz?Bo#G0I;2reBFS#-+ll}>XV#;AIveYUyO!D2%zIO5#{U4qr$=%A!;V%8KZ!xNLgoy-9SS4Xp;^7jw+K z04f~j^trDhTG(_~G0k$4&1oq>*mMMCM{-47f*W|Qj@5FG04R;g$0L){xubb^4c){x z_RR&sj1lHORhP3b^%bBa)-PHlxeFK|dBYgsk5S%}LsDB$y9<1kL9Ju_b+yPbfPZMeOpflVFfcvFa z?vGRJSUSDVw{Rtj!s=EeVj`)XiaLSoRJ7T(F{TSUqBgT3iD#{iKn3dtTu=>F~x^EDOBer5VxLloPvBQcC@ zUwnF>T3tuRx;30|i&bWHa@kYVdRH@X<1I+uNNwZ?es+gm$G720CdriH6H4OktV0`! z2;9X$JRJHOjl5B36F-<5MODO$>+M;RSZW%jy4(*l%vUBxLP$~ctvgE#CWbbiL{diC zBt16vE<#5O{N>xs1Y^r5rhRJKX!cS^CB60w zD((v!?aB4_6s1)msxrCE>9+GjJcjNDavKuF<0Ovttd`nzFiNv+-HgSsboQ+V)7dW) z;cp=F&Ighc=g9Y~k?HoAttl*_h5+5iJ^ug-##Pa*X;{U$Sf*IzYiQ5QwHh@82OR!2 zb{jAd#F7xjf7O-iQl){|(fK<%B8Yt>AWYX>uM3Og&<6_aEZb7dnoca4v2%^l6?< zM!5rmdS{>lsA{qXz7ERKKbQ^~xFgbq7Tv+gBXaQA$7}ZGxePqAS|UDW_pCW?W0n?Z z$_@Vj#>XFstrXRzn?}6TFRV}(U?QF_xb!uQW01i1SBzy`e1TJL4t;+LaYVTi$oH0) z(Lp4Uv~sTu7v}ZP)BI}gnJ{Tu2T=JOB)@c=)fLs>?1pIfMum2Txk0=U{6GGxsWhuO zS2r7_L!5#}(@xBlI~vm52i}oF=MG6skMoMDd32GNk|4-`kLJ!!J5^Dv2xKumvjXD< z$sH;yp?x)zy`v4vzq(l$srROpm^l;N>zd4vyhm)2$$&Dvk9w;-@UwrVHUbQn-NtjIUDVd%IiP^SacSWdMBOk~Y;zJOyya?Q`8D5Dq-TNo;>pS~mLf zK^cw+iZNrnzafWgRXd$&rQGP-*Y2S|f5xglq{Xo8UN8n%9H0KRXqC=)Q7w(+zP_I3 zBX1^FVTrzSLIK=XW&XFQS!M-?=ZujE4V}Z(6Vj^0x6wxJ8Ab}(D}(c9r4h>|=<|n| zQ2}WR;1YV{*ifR7InGF{7N;b({{Ur^I|PS(kDP*g6X{m;?IPCx_{BT2vtdI5Koy}A zL2yFL<(75|xj}{=y*dh8py?+34=ywt9apISbv*rnL%B}(NrKKsE*XhnvaWale_ET& zwmxXJja0N>GZo2SryNt#!fUIDt)AhP%Ligtg-`LO-&r-gw1QRg!59nFk6K*UdX2@S z47Q_XsBMA=WZS!rpl7Jhdbb^|(qcIYSuzP;pacDDM#&_<$DapAAb)rP-kWwD6B9?7 z8NgsQ zxOtA|f0$!91GlwlHJz=qB+a-qe=!_(?^fnEaNDVd zK$AHA*(<`ITz9OcJDMoi&bqk^2)Vuz1oFs^Lc<%qDuuLi>^oFiw}~|UIK>+5Ms5?1NyQq8mb70EX628A$ zpIGoOg!H$PODWx;jel?^eZ>JEHc9F;>(lbCPWQzPG|JZSIA~kc!I zo;IG~`ijGgS+;o6+HgxEVM`N`J&h!b4a7cj5&>M3kGg)9e3#swe#OhpX72jv$1CSx z$&ph4lj-SIL`czrCFbdv5^zXgq4%iS@2&2lQc^HjVcB@krCzp>%EHAowuRW`q?Z|N z^&`+?uE{M7?%t#}w~zk-EO=eJLy^r?xVM%@#H=>~kQCL}))`RjaL5>hC~$WJ%`3t@ zvaE3KI)T8V`i|E{B-3?Go@JfTJ)9ND1N>?iwZ4dKX36XFj1ql5m7^RhV>rKCf~ueE z5swZJN=a|hSjoRJ%O^l18-7rF)m&DvkX>BI0k;t<@&to!05x*n+SUcb&dMFOrZ8-Tjtm-;YmBT{K|Xv zs`j$mJnM5NK=XIR4|C~{O3Ra5zqx;~#c0z?pqS!?KT}e{rs|rEie!RV%BT9}91m}5 zizT^APoZyF@dN4;v6068xiS9$c}Exnu&l(rzP&7WsgrQ%% z$b_~%D{{xfP$r)sn!|faaE+gpPyYa3vvr{ji&Sb)eGW3uO4W6#7T(6i%PGupyJL5$ ztqX4mTv=*SHO8LOa9UMi{;cDu2d#Ds z4hxn6kmI9PQp8W9HjW-ER%2Pg;hA)}k!;p4Cp-5>0LkTYnjuA!M|S zB$13r8;pJ(sA}6F=1k4B(luzO5!}xsfVna6BrylyrE1%Ko>)!Eo!J9&vHk4y&#q*^$vNi?1m82~JXw&T+7i=BFsQOh) zZ9&@gn@%26M1Er^$UV5lQPgA?5XjLHZtR<5kerro=N$)nEpFk8a*1;2p-0FUEaSg4 z)E`kfE{2WHv#;uQ>88AL-7IgoFhBz5ryi7$T*Yk2y2R{}w7GnP@`2X5%|pbOHrHNV zh0LKhZkH#99+|7NYgSsa$8&M0AoF9`hoBf8{VKhiw#I(eH#B^0ap9zYFHDsrx$?KH z@Sm3*hq?Bw7rVRGEaS9k(gz19SaROnR!+TfYopy6Ev8lqzbc&I@yP)8s&VR3$jTtR zMwf5Ofb{pSm{GJ&dDcz6O&w=fNC@*tC7*BmTn@EERn~PKPT$T*F|h3?7yx>aRSnFo zBct0hJ~F2n+&!yREH$l9Nr|PmQNBWjRy-F2raN8A)DRBbl?)WwvllzV<3URvdkPwQ|v5mBcYzi5fO1daeXV z9OvGz4O2~)?I*jnbd-(l8E^p|h^b@L7DiS+N{zX26k)P@RuY_^tmuU}#4Pj;PFUl+ z`$Vl0zFI`eES`Y+E|Mth_&LkZYM3b-4-p!!waCrOs^-R@g)11c2Yuh-g#D{3UQ zBL2kiwD$AN*8*vP$i#<_twCy!Z2|i>pCS_HWRfuXhxmKd-9{}l!`6UDZMsPu{pb6q zzt*b%0BK8n9_i#+c18?vZNVUQ$J5e;+XrOEsUg!*)im-}+>_;&19|uL`c$?NO>%s} zYRa-me8<{8LGcuX>9dX_3A&%MU^+H0U(w+)MVAP`tEKf>;5^<5;&|A-cU1UEOfR?E!x1Bfk|+ z8>zD@%c(4l_kke%&FSnZI&MnW4`~?ej<+NXR>sjs{ItxRx~uBqetq()`@X)43Rp@z!0c_^N(8B8pgK$PJw$bhFmsHkuc;bzL z2mv9>_ahwzE_oriCUZ9464fGhH!;fJDDxdx?(x7LrnYp?2>&Tgl6VE_r*-AO`@Sr37a}?sJ6O> z;^-KlN5VuCmN@C{TGu-LwZv~`H1!1^<`09oe}z_N6+(fzSdMd=k_`__ zm;^2cH7%E41wpchTAN8O-;HnIoe`{vEEXmNY~9S*>x0^%lv`TctnC{#We7kQ>Uk3k)*EGcXIr z2Cd;8Xf{iXeuo&BqG zW5_M?FLUTUDRpgk!=4kg`!<~t%&5ex3za-YaWxBA?cOOPkqIC_1&6I%aPdy$y3W=mp6*DSXDq74Re<@4Jw|Ec zP>wi%;%OI}5MiyAh;!&O+N)YxtWNrc*6^$d4$s6*{xuq2MH9mnyh;;0LaE91F2w%; zI_a^8HoA~oM=Q6TdoeJH4)8jG*pEut(rmOBwM!`Bl-yy(6sjTv|rrDD?T-XpsY?YH-NpbMtqpX|x(#rK(z5SWFa518&K}{Hw=9 z>S`#juPs?L`Js&!hD@mt-r3}HRvD~km15Kt<8^WtLnZ+FkLyr~VwI9~hDkRasN~=R zJJq6k=vdWezPyo9qluIfKh~5CDcjg;D8|)c*h~(T?8I)5!}kD<{e2j-|25=d}{3 zk{l_v$n3P}phe#(+M{vE&NI#`?u-4MXDi%l7g5`+GG$&~xIG0;eQk7>sST~VvyKtb zf!&_x*jF=g;2#j`x3Y_3>>W1XQr_%R3QXY)?w8AM`ZRIBBz|kC|W=B#bIcF1vJ^DdG!+^&O@Y*T18>sC$($q zUlR126)|ZR<)npwc^n-;=sDvg;MX~*d|>enxl4I3po%vG$W}az zb;+#jS?z6%wrJ8yhE3jNha)}lo`RHN6{t>Z(Xoe6)gWt&{c{rn!xO z!_9MXEQasQnnffXxZn789`(^QQ%fP3-bStv7+I4lSGd6T{HiH$trVR;X7i>;45$+a z2flqctz!9Jgi6v{ncf!CUes-zsFp~!kVoB7>sBu`;RJ26IQOG&L5^G6wJiKWr{BvQ zdWEEF#kM*^Kx|Q{UTGUK1-Xo83LWxT3LK>;aExM=j8yQxrKoSaxS65{078d=54|$x z*4s*F`$RHf6fBC3fLGu7*6sGQZkEwqTTU6GAg~+*$4plxs%sHkNM(}rxQ)w402tm+ zP)$-&Y?(Bb&8uBsOSQ|y>nuP3BxdD(v-(zD{{X~v^M#yoxMbk0WPF1?D-!QgXO2nj z)g!ktk>tN5K6&Zhxry#%(XV{jBnrUfIUO6{HMKk{o7Cr?CC6i|o5Z*GsU^U?WRUJr z7;ab5hB{R%%jqPVIpV(CFpLI}ra<+`?rWM~5Nc0wFRr4ANld$h0a<$x2d|}Aitc-V zF6U9Yh~iDm4;fC_uBhSE4ry0%MEZuMHRL&(K_=pM>^;5ek&92aN0#O(i!%6W6s@LI@?bsP4? z9&=0OlM;|m*FL{mDdFAurpldlZdfB${{Y7qEpZjnT!r$~uaeOW5$J!<<5|;c8iuEG z9#)Vex6dqZgU=Yy$6;)jSIUuF zu|7iixsZXwHa$PU`czu4h_5cyEVPA+(iM!9Sr>6^aBzE9FRSSqmaT9a3%7}h0HR6r zFS?ITD>*6F__Q@nH2xh<%UAfJqUeYFKFT$?bCQy71cEwe{416J0EExRzADvYw@K38 zIb{C;R*_(F>_44lN8m?>;zxNTX-5Uf{LN|U{zjK97kXSy(nP?cxz6YA0Q90XDAQVM z!PTiZu7_dap9dwRYj>|s_X0;C$mD=~;EzvAxXq|@?pPhxppu0TOy`g5Tpq?Zx^_oOs`j?0SEcwrR@4{mHy5QK z-d$ID0mr|uZYeMHol3)Pys||LmnJtHf}Z2I)}hkw?x(d|2fGo*qb|Y7U(^bqu>t zr=>>^j4ZUd{>>Co&2ShKZz;%O+z-RjwJi0Ud97r(wu&;&FvWl*XPjiy_pf^oLzRAac8 zQE6_q8-Z@ofXf`w?eBrN93Q1sy3}R0x(rrE+%qd7;CfSx64+9cYRtc};iP}bNyC67CCkDQL3de=>)cy`+Q z%HZoS6j9qo8rZSLJ!`hm^=r*DPma>zl-@!QZ<3vFTz4$$hh<~5cRnAOHY zx45kve--PR_M`UuIiYsgqYV)K=g@jqa&nXMG>lRq({%Q_)CAX)#}IWQHhhnork_%d z306f$A%@9D2LN~c>pkMSU2PWX_B2^OW)d7MZO(Iwt$TR{l1P>}VsBZ$gLixb)1?Y6 zvYgUI>%D$i6%;W88%97l^vAs=?W)Ki{?V8N84nw=zzjw?tZRK}TVE+fO|9~{nL$+d z`qhZMYoY4aOL8q*>P_Y{%HT!^_qpxH)9|cTiftzQbTUXmUQ}e@p7{0mt5%v`vY;|6 z%CbmWd&rjxiI2O3-kp1@TG_ZZv#T)}i5+s`vFlsGa_Ed@E0%6`i_1u25!kH36cz=C zU&r}WR##US=_;+eMZJjFSCB#P=}@%Dh-aM^J&ThYoUJUtUqcO}$62epxBOT3d80=)UN$zzdP2&ZEagIK2 zoYlC-43yg#{w2R#GoyW$TaPt2#?CTl$5GF5=~CNV4Mru@NjZ>y@e1@KkHA%2Trzo5 zPNXYlEu)-&do?3o$|5$>$~=+EtV#i6p5~^>Eehsk`)KW5?oIUGL_h+lcqIE{zqJ$U zHn%agwS+7miqdN$9V212I}Et8(WqqjDJj2vFg^^oTN<(!)!=IVB@c;Vb?S$ zwj9<(lk2eQ%vSM|D}vv;LZP>g#16#!)EaKO`nhXJE|D%>8zxo%08~13_5M_>ixO;T zQ}>dVGe0a;4hJ=8#~sT@y4 zE|O~*$VNqJ$R})v9PReab}ykuZ9dIsWGCP9$UqxHza zew(Jt0$N8T@?mC>sQCcxpXpr2ui~hqxF!I=w1i0Le&XY=xTfp&9>Ar7FkE| zDLkwX~2lG7N7;Eu3}coFbFFg(*IRd|~39a6=UKTDm-M5D#q7Wn*9O z1J^B{N3h3w#6;gin20sl$npEcrr;QWVw|=&K1}kApY;y6|*;n9Y*%G zW-5SibA=pa)7I__2|T+S*q{+dxR%8y;VhBfW+gv%00)ojQ+l&{6>4!> zmMr6VK(q6UNyt)H=3h+v`_`_LYm(uwikPD>8grIx^d__P%RNfw@+o9j5>JmVM*v3= z$0VBGP^)(uCCqM;1tL^jE1YsM+t}7KlUtVvrgS#hP*hDM=TM`_Su=s zq>^q2jOVAyI5mtUqVFwDWSdq;J}YhfOo65niTIWT7~_=a~k2T z(3Rim&#$#?uA8I9IJJeG$dL&mecyPW_Hoj!+Sx;D@x9Dol1|s%j31?GDyiudL}}}( zonxh~nljr$(XI~eg_NIPTDN6liq`7D&v2yfXwKd{1N6zODuPy1ZyOWIU{>rXHDF801ow)&6I7iV%78{RyTICGseWEbH6+N1yIyAQ>toW@YqKP zF>Q%tVbw+m$nWV|x4svgUZd(G%aE>OE`C#i*m~4g9v#zdAYEGONF;@F8esnb>dERc z>+eeG4%(DplKKN3)|RQ{A{K4qabesX)!hu;Pj4t&GWP7>azm2j^}+rX{&l;l+G&0t z($@CM2;*7fUz$Q2X~zU-*V4JG?-`4WfT9TPosg{Tgaj*`7RRCE=xJI~*e;{Eo+E`c z_|Bw^1ZcnU?;_$wKhzG@R$m`!(OX*S7Pg}1@-{wffDA*C!vWmaIpRHXNpB--VI|BU z9rF2vU}N?6u15Jad!)>FD;`M<*eb%h>0y+W3yezMt&zK+&*^_pt`Slk)fLR5V>0{_8~hdANAufPbiROo6kFf!uVZwzEXH62ziJlOb^2H@#_#Jugp|8$Dj-qLXI-0JN9+RFU@x`gg2n zQu`aiowpqGTwCd*NztP>Eb-!Ne=BfhKiwUv`ZbQPYjm^9?j2Y6VsKXr@BTF3418U% z@OO#rF0`FJZf|3dc}$7&ji>mS^aHQ0b-KTdto|t6&vSCN;$J6y+glBsjtdV?dWzq$4F>04q9}T=N_czcc=Y~lZ zG7$B2-c%9PkPdJT0j!I=EhboEw9{mXcB29uXO7^G_32*^J}3C+K(MyDw$*_eZK)RX z#DWQP+vi*opnSMJSA*X;&Q&8HbflBr9Ok$1pI`7Dq&D{s5%=u4SsNh_aLe1;vFxz3~&`M!n;$Qa=#taWpqlO^M|V`?-cOk~^Ps&2yK&F^|fT zE%ha38C!&l84d0#>Benp7m7!3e`Da0rX-STkLP)NWK3YheRKTl2U77KnWsZ6CUhwj z8->Xk4fOY}XZw2nlv*S2XF@iG$bUd{Rctivcf=QJ_mAY49#|+gm2R0B>5j&=jV6`b zBiibE2ZX#=;*A?hyO%?9;$;b_K=6;3ARI71cjX}G-#zK;<43xNYx^6IHzQ=B4nYg; z>0KrN0L5EQ_f36DFu1pYYpt}|cPbd}U2iq6Snj^Z`g zkPrhlIRyR{mnGiD*GUpjDYj#98)PnkpPMB2)G`gQb{eP+8Imop5V}&dxLD+veeCvnKH?3B#4q7 z+l~egr8wEV5j@gqcXmQn%x+I{&OVh^3oSy{St5>Bdt$+tdVSw))brehw~}DfNJ8OL zc6PA-m5Z@T*C)KVmp2PJRm@85@?&uKq>3ARiw3-wPc6tkQv;D89gS6v>e^{S#Iibh zK)KJ%81)}PQsYd71=FQ2TPTrlB$n^TY}B+g$s*OfH7qOrnP)6oiA+7h%kqKgjC$28 zxiy*Y{?&BxMJ#7>qYQ$7`r@3rYgw6f61zlX88SM5lUTkh@ses+BFfIs%{wqAgkUB+ zpHFI~1t}9La;;9HIrPD5FEqAz(o$AKG@0_;ee4d#v2HJ|ygzm|nQgH7AsDuDM?5M1 zb(3YM>$=R*Jo0%As!K*QxySJ2jz0>Wd=IK?Q_UWtjzYu$l_mL0A5ZR%D&tK@Rzs;N zY>G?b$^1pDO$FLX1+oqAGOjXDUs#XeY~<3jq)oFw)Z`g0V7$L6Zw#WG~={-0W#Ms%`)tYfx`11V-K zpyf|ceSN(upNeIY9Yv&gx5srDSzNX}prej!KJ!z1Rr?&%Y>AU~tC9Kh-nEZ3k{e1p z9S*Ihcyq*3t+k{wqxnEIi6_pd9Y$(i7 zE*@=e;z_O}h^)%e6)Zgn71!zhAJ_DI54Gu$TKQ7hhk-C3?GbQJ4`4Dg+!M|#jPT?n z#KT-$i6bgQ-$ua7j5_uE-r1|Lc0Mg6>?$Cs!xa&}O8$)-CT|Yv^GM3$Rj- z{R?y%`qpeWmsd+9cX91#RICi+?zVdI`Bsry3ABmRS9p=-CvjHt#BbI&?~(MySvsz{ zX3~vES(@lds#)2I00jY6bIaqSD zdeYelH3-@}h^2)}llGD_5caCqS3^gQ-I;DnC+`s#amV+DYiOjlGID0MobRA2-QP+h z7hftw!;*u)w{B~ogT|UAw#(F8c;`4zF~;HTk&o7~^!;PQ@aR%$_x8;1b^|@c@4|H3 zw>`MVI#yA|waI`yZp+L&2h75YU5!e}==Bd5S=?MEqZ~=+2lARYqXi`%xb5m{gnlY( z6D8M&&gW2L`#>25k74wwbhwjPvW~_^SWw8pWkmUxJ@PA8NANOFWY%{u0IH?q2`0c> zJx96!02)qFhJ{*8=4^Z=;;$8671Lsh?&3JwMzXh3WkmxdmHs2_GHa%~_*t%aPUh2J zwJz&*3deLMUoF*#pgjmV1y4VgD%Zl#97pi;#;vbKqki(xhP0R!-y^B{a7gTWitIdP z@v6(m8a?gCtrFZ^$#Nx@v)jWssX^xJu^+T%W8 zwo}ROc;Ht@C&TFcEcW_U%&7}0-76~Y+n&d{Kgzm~gm%~e01hTyYr!{mfnv4*U8oM5 z9DLZ%f8=XR##-i$;w>9)uLDCQPG9Y?!?E8u;fHbQ^{l5=x!OAy8fnJwbBdD9G}|kd z(_kWHOqo;$3c2*{{xwc*Qp(EZ46y9EQVU9lAG^nYa%%C{^s7xdqSAFlXyui@&?b*_ zqWV{yc(2D7Z>tct+tG-QAfN+*-1~dh)TvHpRVu=oJu3IcnkCknmU=FaBA1glG6mrK zdvnc6;cpmtr@@+n_=m$9!|D2^x;sI26JaI<5Mw^rKbWsJ_$}gndqnY|)-P@a)KDup zjz~_%k%KM@=a4hNJ-|IiYt-AuuLp%jg|2vV-6p-1mx#opXeV(fM?=RTR*s9OF6Iim zmd7pe1LD2Ujat&*##$;!(K(XhD^cZn%zaO9r}C~^<4=nI;NAFh!}^Vsk*SVZ6Xr=f zga~*T_3Q6jTJ?sP;(cgbwmh|91-b&GZ*9l?^sQ|tQIEkJtgIzBGQ10wDkI#&DHF!CuT&Ph0aXl zzD9V(bIHj_>ZfFp=UU~Zw&7=Vtizp!ep2N2C(^l#%RJo4XACNk#-k12C$0$WE4|e; z_kewt<%!w*!XJXFdOm$?mDi$*J8?WQF4voCqRW2vELp2 zkKt2eraF~U787JaC_Eg4^02G6GL{6#6slRUuE*s#?^LcDSe<5)7EdEP<1f^7{A$I! zm6|dGO0nVNlXfr&(QExIyi-@i= zOMpJ_;%k!7t?zE`pcWQWlO%;&OpTy_cvnTF6p~XIxJ<^t$R`;Cup`>0MiYwI+gs~t zCMzwD#gpcdnD7Uo^%ZK`N#(wd;iF54gJxt|3b9-qZS8<@$M{x#ly=P^Tg!z!<=7k{ z`g>NKDlOrBLh#B?5kLee>`%RAbY#_;Iu)ISV%|-%U?LU(`;IANjjf|-W676sEYA7k zKXiIkD~awBds}$4`Ca9?^2i7MR|n_%8oXXRa~yF+x>YP4vNn%#MuDLt?O5fFJoKs> zCA*0dKQ=fE+cafa$>6u4^b|q`w#g=cGYNpeV`%=k^`h4CE?!8k5yD29op3N$vB!FJ zbKE!I7G54##CU8=W^qW)NLiYDosA=CrL6qt`$$K3VSp@a8_oFm;L#WQyJW!`@AMg~HqqRLoBKxbHZa6X(XbBy zpQT0**zSJPz?Dy%Y=b%V7^1@qnIneQX8RwV4A#C>YzQg`b|C%YeQLYhMA5g}7tnF9%8lkcYX%JMp6v80uTB)@45x;stL zU@YQX6SuI>r7?_GC8dbS?&*liIP%$hDfb?=DxKJp-b7-chKYuD{c2--Yj3AVYj0tl ztn#wQkD0wka5GG6T@3ZzhmPV+%M@Xqx;Asd{e7t(WsWv@(UiJy@~|qtxE+l;Td1yG zF07Em>^@N-%a-qjs_eHi%u+a^R^Po)uK@S_`jJaQ%NEv_t!pI6uFQT&k+j{&ou=B>w+Lu~U8GDpIyt`zs+R98^LYc$I>gYIb8bdLW3E=lzDsbfPw zeDbBVa5V7(95RlCii-&?yqA|3=_HFM$cj(NgNz!DCyqiVS0+fLZelnJ2hx?T-Y{+v z6h!Dspd9C^YDEZ5xyUNu?koUqSoY7gD2*bGt{P>G#&xb&bCxWg=&-dBH=Hx`9*r#*qT{d;#Z<>3 z+A<^uq5lBuRFX$_8W>}=Sz1H1IsuI1sUDSUPlgC&7WX44@@_(>=VvF39?Ci5t!id7 zadObh5`>KbiB|+Ragpg-CuCOUQoAgRAIXVZ%5qR`Z1z5tA&zT%pEh;!$Q@svONyooxqyiY*%V42nXC+VpfsxNodYxRc z+>ET>^3e6zarbF~qe&W1FmFT#Fzhyy{V9&oBr)AZWbp@`mRT9b(7Kp;cMu`(5oG$G4i+PQMI^xvvF^3#mj#43-?#l z4#J^nhm_1Ak%lsgt^rzo#4;OpA>_AjFF0oBZyjo`0>bR8BvB?5^SVSBZhCuDqbUj9 z8yu001Cvn|jpJ*m8b*y{!BX4<>-f~M-y24Z&2q888yk#Z?qlCQfW=y4*hv(`0$ik# zmcUY54Ntf8B`&d*UoVrlou}0OYBMD7B#nD<8D>AYxdZPKdSka0BK)ixDA#dZHV4eZ z)9}q`or*;3Eak(vSsG4dW56JE7^dCAC)sdic*38RcMvyv8c5`UArr|i)*mb?%5vVv z>Drj3(qAT1zBiNim>qlYPfFQLHAJ$Qt!@N2NX9{fxf`BGN|HC(D>Sh#@`@uWakPWp zs>ThVF@!sqgx4O#}h_&;j0GAm_34tBmXj)NA;p1|u?qDB5IGjGseJihB?| zsAhAqGIH4p{?(o>CzT6DC<=+n6z}RO;uz!vCl0H|!+=k{Y^pJn{^&QJlAw)~g${QX z^s5VL9Jf$S95X!6g-BfBjysdus>2Pm?9zE9e5A@3Zcl7uy;xhxGaQ$fVkn|ND#_IL z>svy7%19))X)uwl;$}Vt|jRzdd2Oi3lwCN)V9?+09T!1t!M;|oLpjR`wcjP1{VtweQO7e%?f zjK>1DTMPl?y+|+Pxwkj)#$Cf^D9$+^ja>??ZDQ`MGjm3TW`T~?$z?br(2A2up7);Hzl#W*%oK{4dyij?K1;KS=_YW+DcRyOm;-O8FnrE*+vur+*dgti!NnGTWfbL%gJW_Dx{KM z%lpahO70{b>+*x?TP)7e_epYz(6+M}1jQl7)07R@-mA$hihRIImf>^Svm%!CTm@T% zAV{$H|(!k5Z}7l8-4OmQ|nrmnvB90fsjUA z5W5?2!0%Z4RB%sX*HR&hCSVFP=O^FNtwyi|EOAH?)pCbBv6}j9voftp3eqN2qa~^~ zt+nXZZ}cQ!BTcek5D&Pg+3L#!3yZP6ckaOIKf<$FrnFmmk#?}52?_W_2^0G?u*u(0P=yc2C080Ipoj1Nw$3Z~xcb@MH0OYU)6UYAmuDSUQ z?WE#AF?_rXq345DOtGli^MnB89)mT}{Q1hYaUz-I5Xp=Q2i-q~Pd28g zf;k&FE1IDoVUyA$Ue1RT~7Ws^LP1!q24;<`BqPgDyZ45%@zs=PbI*& zib<`d*o1uhhDYI56&+G+hQ_}&Wrb3-kdHLE%y*wsAl_08W z?^xb^%&g0lQ}Tue`w9d%&%mTB+Yd!{&Xy(oVMl8 zPxPpoaVvl$GHw{kdeTQRVH^#Fe6e?w;a8q3Dr>o%6Cfegiv>;tj>LKj^DE+G2X^%| z(HqG!+&1G0B!M3U3=j6IDS>4$z_&v+gHzA5raEZFeNUAt86* z>>b5ASh_QcxL)L~Wpgx4*3u{paM>Bz?kYQ*Tgx>?k7SDf04oVswmCIo9YWd`NcV|8 zZ<;9E3Ay8v)h)j95`+$N2qJ6H#d3}&;bih{L}TI|!iipuat_OY@oe7iG! z=K9oV)9hrri^<$im4@ez^)ylmk(NLU018Gp=e~W7(7-{y2PPX(f16tM=MHhVMi?} zI~WWN*unJ`oH0DR2QGz!1?&>N<&0bQeC*>njQUd8>Jo;ER+FnvA1HD@y)pymE22*Zcnu(#H%u- zj*LKKy%o7p*wj~dQQgR`qu4Q$J7M;iR!pmr!H{=R>M1Q{o+*pL5i&CT;{fhoYV_e% z$~vNTWEQs~;^IirK=Rw>jGkC}ikW5`9####)646e4Ej}FK*4G=1F4v|%Bp^0>}i(Q zDh}3|qbDU>zI)d?t?Z}DJ6zL{PjKE+TrxM4wLmykUs`J|o|^(a%uP2?@-GTSR+8>3 zNaGW?og9;4*+vNVH47xNJM5gYA>3g-3ZC_H#6SrPx-hf1l>*?EX%EfMVtuMxX{Ok* zM*|lmf=SOoRMO;JNTHrJh@GXJ;QDZBCAk*iV%{6e;aChD{cDxhRK4`|8lCiIsWoK) zMnKuw=snJPtQ4f)qqWIV)#F=9Bn8fXb~wQFG}VIMfAndA*^k{2 z*ukWh8BiIaw=AKywsrGRbm?Y7SLRvCz)F72^4z$> z?#6DOwl`jEliRyV3Xl+VA6j%!LjtTQpS*bv*$Lr0;QLjygvjw~3$`LRB)DIeQQD;Y zIe|oz#LSD#tepa%=4(o8r&7I|OtTW&$!#sWTiawd^)V(g+2^3|P(kMXt1ML;fA0ZY zjAIz~shT+~!o9>B2;o?-LGM}f>sI#h$!`_THl5OO)cONgI!A9+m@TnftF@2yy!Qham707 z9*ht_*BDT=X z0NMV}6=@*cgZ&-4^aKN%OJtBbs{&m{bGEG6HGz;l(Q~+RRFFmwQ9_zx2zC}9OYDcRt(pgtap+_G{+J#CT+X{=m*xGE+w~o z43u&UCNud}i=BTOpI9l!ZDAnNX)?kTfvM1 z(lVZRdi@1T*XR;RCWyb9nMaogZ#@9|RVeMJy@}^kW%7YBgU0V;UVpTj*@?GvV&77< z@*|G+&_=k=pPVTj>NxJLWr6Jcf(sJKJ03vKQB-Yg?=DjwatPIaRNI^r*0yxr78JNg z)TG>;C_*-z`u!_aTBF=awnYWmpApA8xsVWmuLmBqmpWl|fq&Z;+|#!=V7-KpwxSsZv%czU3D1u#-Bx*5@gVd0_B; z>PW71$n?n~j%F^TyN2N7)7G~773K2w$4}S?^|U zLuq|sph_)uHCbY514GU>F!!rBzB!6=QVW#cK|52BJ+WLfZD?q@IXV#@4ScZ>9TXjO(0ZX&eJjXWwQdj&_ZJ!x7VWdWobALuAWfHne>sjWzC8sib9kg63WBH7A&libv@=}KZIdsakj0_xZV`j1MN zQAFKRx-l*EX#CS>a;(zH$_{xSUc$A9hHXTUt<|wa02V^$qxgQJu06e~6`JM4CPKT#>yDh$ z<52R_-&1&yTU z-}i1=Lh!tgdVRY2Wo_nJRMm}*cI4$1g77iHscyqckhGjIbU3s#z?flVdpBgZGCYf%U6a!rMxP%#k{sxDsy2 z88t37n4%WoN ztr*-qu6K`Lb5Yv(i&dHrv&{m_5~<4s3PyToxu}wRh2o2*J9~H*=2^mnoS__4HaeD% zeR{T2x0a!SG82Hl^_8n>+Nus~ns^OVpjGQSQg-s*s zHUvwkMCk31HV!_uFH+W}$ZhRmUpC!N)sVZR{-&$X9klZ_qD`B*2RR>yrB|8RRZz&m z2j0td2em~d^a(azR9M%5qp|g=2GTBA8Eu>F%{t1ZPSs)Zkb2~QT9x#uZX%3DZ^W!n zHZq`r(E58}i zKL;b{jYm(yh%8fBj9bZZv5IlptLgqAhg)B?#R%NTVVTA{cExB(1hH(H9I2h|qx78zPl5ol#3_N(p)YT&{eM?Jpg4s-NPE?jxIc56R zVALKrYnz*-Q~;QyWjqn>Q+R_?wenWp)*{8YFCSn>HO*?ME{u>{OwAI;HYRz`eEU=A zWm0V|32*#)U?jw77&j8^IKlPDYO`Z=sLLwJIutU1V|9FmPRHtND$`4X)JE4L7T@=t zLDhXRNBkxh)^|&B1VG5FS7tJVbORKVIr-mG?WLvduB!TtyppL|cOml*)jexYe-`LA zizUQq6t08k8-7sz#yfp$mew`xS5T2`1+zw*i>|?pEWN9RPGIqyo z(8*OS^f$Gi7{}zHvXky1kTDtB#CEQ7xo`*pa zX}VMqK{4FLM)=jr{Wlu3XKkh3yW0z(t+R2CPvR%j(-lic@Z@^5g6dRvJBVDr$ae9A zT2OdsY4VGS3kPsWW;wtI`BpNNQ?<^hMonxw9VEmb?5VeM@#Z$|!lr`K=}=svh@}cu zRS!}9D$bs^*4UbPk(yOIaDMMSX{mTFU4qB8w*0byHj(RCxwCZ?ktMLxhMH_z-I7Gf zYlrCBp{_&>B1@I>r2$Ui^BjBBpJRPeKbGl!KuC-am58d=`a($?FjiG#mL%klrDM$- z>dHxwOAL!Mi&N$%Hx=qs{c1KBa=^EDP`sXKG{TJI+YnG1`WP z-L4kS^+G&gcH)m|8(2A63}Q=gtGtp_ZftRnN}4rojG;G1jv1WvC(?;6?Am`MOiHE< zgCrFnUi3+$-CWo#gCSXt)3}e*y=2;DtqE3pIg0t91zA2~t<6uq!e<5qF@+m&8}A=_ z&QwJC=56wv0UC@F2dzmHAa|BOl0rG$GtbhK)M&A*X~`xoEuZYfrXO%55$HYY8SEgt zRcLb*u#Lrc5*%Y06=%+Uh+a&*Y*-w9?2f{qp3-U7Cxjdm_eXzYQm!)0d*QTL-V)({ zW+Z3J^gmjT-T`oByYk!1MBOjV_kI1TXPHtQ7@cM4U7L)13d)~U^40Ct%D&vXf%lg^ zewBfz<`G&IN@9&z)wA3cQoXW^ajgQJW zDk`<=%{<1@;&B;G%^>@u*0fahS2A@pHg!J}>C-}y&pdN0p&L&mWO5I^WZigzDXsk6 zI+bsdNqEAJ-~D=$*GJMWCX8wlyRJu(_IBHndz0uY{CXCc2a{oY9LN-g+_~IIOHNL9#_y@tJq8KZQH&uWS?*5*2(&_F>8oP*3uv zrObBsCOex}bti;l%8yf7+WQrL<L-qMXAOd+J_>s0)}go8g~OPZM~s2;hweSAA+;o( z+AZOvCkcVc6-w6b<~BcRkQMVt-bW+aw@^k7q^@+*>ypJOU$rj4050PspYGEl*R5_L zF<&R-IomG)XB}OsZH6&UjdV{64oTf6%hQP_)>L}$%Ii$wVsBW3< zc1jgnYO{ZhQ=ZcH@mbKx6RF_mhV5M@o8d=m0`l7xjxUwY{!hQHSr!(M$LEI<##13Z zSH2A|XqLkEZSHcG8e^{LUfjDd!UXEZq>D{r>k6_(Abb-261pk0yGi6}H1=pCP#C<2 z<_EYKs<)4(*j**G(yWKc+>Wi#pISYm=r3fJJAW zufZLuX&}1`y|xdRk6-Yt_tbQ6GtIJsAc}!RWwKnJq}4apq)8-HkVm`aSed(zPimH= z%Dho#{6}+e@W#S7jE#zehU|Wn*r1*=-et2Zfy7wLF{*Iry5-cN;FuhtXJMR*+Oo88 z@yBm73zE2bWf=>O-rrgz?1Cx2g*%%&vZ}VPf^b-{{{Y8Hrd@b;?%@M0!2*sMiQ&CI zwY#R+CHDB^MqC{EjrT`AYgY12Cc{n^vovzC8=3a?Bhs?=jXe#0nrl;$(=;oMGG$rZ z?d!=PsQ0ZYG}zuo1%WYPq?J#~Gw5p7s@p7bUP*qldASL=e5ySS7XJWbWF=i(e+X9L zx#ZGvY;lZYO`~{pUJ{ynVsnM878Wu^da~jfJjaZj44$XySx`?TFfoe$ zJVw}320Xm>HJ@?fgXgp@Igx=IR30Q9&#y~^ikcPdXA?e*raCB~Na#tWIE zNlKh=87+@bO30VaXt+j0ojQl%95I!qG<~+(`=j!-O?f z%y4ePBJM$?_HC7j2#FhaTK)97l9`o4!} zAj7-KurUR?k8gU4-%i%Gn^6_fRuA(AKYJd8R;{Olkjb`qB0}h)W{`3*{V3*yJ|)r(*#!1d01()!Iftpn=yB=tEhBSoK8fTOf%7nt$)r6bcF z>ty^s`#svturXx~GL}Cm#dJk%N<$nvUzE_uUMbYB(VwR^9GbiZWpQfWbg#5F@05|; zeQTOnijsO8#}5drG5RKtVP~hlu$Ic+SII61IPL!c>Z`Z9gkm8z{-5O_UJ581eKU%q z9lo!7GRLTc3|n&zqKs`Ma>S0OrD@)2kefwcw0XP6$#%EP`BpAX?#O0{_xEvK8AJjYEp?HnkCsBcvf%XC$2pz$Az?rZ|xewB8xWDxCh3;>r8z>G_u&~ zwlZ8qIP-`fC$~LoHPPPHZX;&4XNvkAS7VRmc}xA9CfJ@YgsNNir@!TKoV`dgXzzuSC$({6vK5R#Ig(tLmabp z$F)~wmT3}JZR!RX6VvPJYOQd+jds**;*vXSR#sR-55LML!6BC`qdWmEmlK4I(CUI#L>BuWQ}&sBNpABHuJ!wlSR=M z=ovwdMfv`A%ID}SUsds@jc0iB%>-o(V{|DX$RFMwrn&q70EjjkyQ^DRg>8(6LZE^N z1M#X})=un)?4YcTU$SX%&lyXgpnyq6`@26_LFSbu=2uTXT*cw z9BLy{MiqVg8tAld65px_-%V*EBQlT!ZT#xpIYdfnlHJN?ZJKmZ&dBAwn7;TVdRBVg z>Thse?!id-^0D(N^gXz!H48O2(cW3yv`$Z$_Em*wyoDKy?=*Kx@g!;@iIfAJa&zDOD=xwt{YE1l z%(2E?Va7QCcOLa(?&D0iK`o1hR9s<)-N$qFspPX4I%r}0AS@&f&a09Uzbdx(+QcWw zn8PG%7FnW96X>njrD&|xmebLzd9+h0Jlg(k* z7m!R_c`^;4Fm6f@Ph(lrOJ{Evn_|xC9E`=8zIe}}`cWX;#T<*9~%uk&zfAoO;l?RCNg#fXY1CUGznTjR%DSGM4L$9j8p7qwvJP9Fk+1IK;y1C6wA$5WQ1Ha>2HrmdErCO$)99~FCGaKieklZ zc-}dhNg}sjJA$g9bMI7bbQ$F&Tr#O~wG<4HeQRGq@Bxx^lIk-gWq<{jZvOzMwI=9A zYQ~jWY-3F>zkCewIwPOs+rbC6D(;uzJyP!tdpDS)mPK3$$v=3S-q$W5x3o)5Cd_dm zNu*#i86LHins&E+Jk63~c*1Q#j&s`-Ms9Gv!*uN;<(=M@q@azYNuJ(PHUXXwd{RG) z-t$rr!(z+1R5Yr%+P|xEzJ^@yBYWPSNiSB$hVCOZ`iUEjlg>2`PQC^X`^XIVSTJfH!6jWSxED6dE4#H zbJu#dqV{rI#Q_SdwFWTbKJ`*>25Ps`ME4g`0Ot{^vH1^jO+RNAwRR49EtSrzUGa8@ zX*r8YxJC_)%o{#m9WZMnS@@4D>88v!9G~6n91-Yhs{B1$NPO%2oQYRtQggu_cYi}& z2Za0!q%^TfE||{or_NpSyM1w4zpKGtaj$Pt_BdGVHGN^)=4IL#krHI#y#cP0)8VeI zJSeeW6MJ(Q9!fXJG5k5M)_(>qtlw!0h87CSoNg!E&|-;Y{>Pdr6e{7k47n@rDNh#K zv{2!NN&Ck+rF=ZQvSqrwnkCyF8r_L54|ATCt!Zr&T_%%laVu>ZSrZ@!_cb$Xx^x7K z$jpF}+@G89tWA5x+OCIdsVf`X&TxTqoLPnz8*xhY3`+j0Qn>y zPd#zkvvq$EL8fF2g%PBiW!=&~JLY2iCWS3EuK%GR7^Uj`jRO71|@Rs}g??s)t?YkNlUJ=UWt2pBkU9ORq<=~~xX6dFX&e3u)M;ZqcnN5J}e)w>I+ z;wfbf#8{I9bU@(=?e2Txoa;G!B83$f?-AU1T1^17{{U=_C15cWYn`LkogS9gaHxX) z6{R1$lW`!w_kF6irmb#=?KdyIoW@uK^L;%9W7@8wmvSOHvP8SU!N90o(%jLw#prL` z*y&cRg8F57Q~~BOz*g^(+|^rM9!tWKY4I%RNhM?s47pX^)++E8qTNU7^Qog2vQ&cjU!AR2Sy^M?MO7S z$`Fr#X2) zX=iaP2-w{DBr6X5bgLSS<>XC1Q1FR|Mp2gk01DL8biHRyxBk$Y4=q699eHoV^{kw% zT8-IC`@m+-KbGm`S-;i0o^#)dtom%wUcqGAlH19+tUhQyT#b&{=uZPDis>$H+(($^UcQEcX(R9IkXK5VJLz&?jHJne2m#a{o;H2RoP*f z`ElNb7YbXq-X6lPH-&Y3kKNiv$+-N*SMKrp`&IaS4)cAPA&OxvkA#{-yP)UstX$R2 zV@cS?j^5H?8r(B^USZy-{CA>atVz3*5${A*23A=@(~R2aR`)- zPxpm1S+$a}i)-Zn0H{BCk8%g4V=9-}*;7k%F3(G|w~{nvK2dBkDLno)(MPGlXo@VN z+NyzBm;zW2TE=lXZ}ewXUD$OaC4U~(mw)01wV7?=kIh~DGIYm$)N;A9?x2nPjZH5# zF>i4wjpj}MYaEPvf$Qy8?azm_i+L}u!bI&BLG-LkXzsj2s+o2B*38Zf zYaGm|j6DTwOQT19ctMpETkZ257lj0L$E{ko(Cu`zOWUBWwEpaoh0m`w)fv*K4L3QQ zYED}0Rh!|hs$8w*jI&810LC|vm44$tO6jz(2hC?y_ zjtM_s*0`?}d`|nxrP{sB;dZByjB+^7wL8QXvg@+>GI^%lpWdP|3G~me6<0#jd?}&a zHmR%I$mq98o-ov`4ea7*C2^Rcl#+yXRlvgVi^uVMRqcP`G4XSzo8gNYnOQ)1_U&aLbA#TZweZfXaEWluDnQ>X z&noaeYSf$Di!O!zJ5x4NB3~-24rD*WgVPn0tz2I<^DACNicT5vgX*9fs?)82o+OmB zM9IhkZJJ1)W`Zcz6)^sahsP85|Uf<@gE8TT` zDrIbZ;EqY-*0pq;o`}cWDDGI9E`_z##jWW^gfWbgN}hWDKc!_$s~`xzVZsc8m>`qX zk9yA4Ztku)H_HOJB2Agv2c|tuM`?KrTK%hTLW3Mhyk&^T&yPyzg%uU4&pNJ5mQ7mT z_{}VDBuve;#Lb)$$Kh3O<&ER{$STW;0XgEU81HXy#jcv6q<(SgYkN=d>{8i7HlXPo zauOtFQX3<$6{~T9lID?>=1+Gs2yM%{D8eH4#cA63H&C9|E4Ga7d5QU#BsM zhvAk#VPCXM8s(@PCHj`P^z<@hqb8l6Xpbzd@O0!2U%;-|OxR;8wsq3DR;VM&U}z>y#fPqO=a zS7+lp{TlMd0R^OzFkW58?0SRx))U;z7Mesh;9PFo5s?NF2l0I?hwF8!FL|9$4^9u= zH6K`?O0e_A<_pD{6<44G+r4ofD)BY1h%ezc6X(iO3kJr1hMBM1_^SFTEqp(5=PRzr zU{(3IlgJ0&vAj9(%f#BCmOWO|Ye!exi4J~j^Pfz5*H#{#7%q7|Oe)H(z0|Zb^=ru7 zeXiyyP>Ha`WWgv07!|9cNvTK@?@o#t6#To{a&zcwalRjE_E4l6=AtEdIFHF*zN4SV znv+S>FRY|j(_oI;6_fW(D(@Kn_A7Z}VauVMXwLeMxbWqa){&il_*=&R0J{>iV5mL4 z`RVvqCk#?s>J6r8D$dZ(QWgul3;pAt=U$BP>RQ#hSzOx1CB8_K zYa(1mAdd_%Wc2ONt#Zc}p&xzfbUZVY(BiE;8*_BZg9U$@2w1zm;7$QiAuL$&-|yx~x>u zFQ(QeSRpcPl3YhF+zw9wis=W3Y%Jv_@fnDeZyT^f0s2)K-Yo}Ij%zqs4K}>qm zYTDPCb0gfjSC|G;r;lxYNI~Nx8GT z`&XQx?_7mb=tW^``o-+48^o-vkN&PV+rB?s4z$bdQ&iKf#24t~T*Mtha5na2#CA8Gkd(-ky!(Zv8+ zp)Aty(*cdW{{RZYQZlj>O>Bl$nmkC=8Lhw2WV1!xDQOcFjR2mvJD54A0Ioy#dD{ z`%+SAXeO2QA7N`1ouk2i$jD{GO$jQg^ar6nm1-dx+-6WBjT0#}oPs?tI-0F=*O1w* zw5y9@oHMUGk6vm!nc#-h7gv$XWmk6#$6svHNwzzrjcY6W2<9+qFb^(R{%eDP7t-!ILvk6cwM zb|uX++N6`*Lf5L0!7Fk?{m*he>G#^*wvTD$>Gq`087&Op?E~EVd({VmWtufx+$y*; zA1vo-=tWx>RuacMYL@Ej9A#C&0Z8s}MluK<~ixy_4lot9acA53jXS{@jYo%==`>=_cjeoPJ}{vhI9McdT5UGUj!FAKnQ{aLRo@ z3WrnB)JWQ;wcxr#7!a=FIURFV7GG zaS)OjGGyt;pd+07(Q5^;F}>Ji^P6FfTNocfPKszO+smAJjH*On@H3tdHKbt}>}KTN z=GK$p*A{Ta401}*lJZ3T!e_Q+(y6N$A3!ZBJst}oBP|Q zF9;ZS_x}K7cLUP2A@LQywFHw#aT$@9pDljz^!EBza;G^re2swlQBeqa;W{0SS1)LG>8p>sED3n+Ww5u$o3LV-ExLR?lJdslBCShPJs-X63%m zXaX<;Y>&u3qz_7$Oi*T)E3q0{#qzY6!#O6Pp8o**JyANM63!7pa-QC`lN_EP@eRk? zEVtR&F#=YeF_uy3imqF&MCGZ`UR~*{4BA{W863yEVjS)CtZh$3)NXXb+F~ll7%XG* z`2_Visq`%~QPA&0+)X6dmoFr03rL-_=mm9JO_6l_UAmT8O9`it{Hf0X`&KimsO_n7 zgOWMV4CxmWPY?Fbm`%F=^hSR8BY;W%U29?uF3}uJu}!yeFp$UOJ;@)+uR{f_!C!eq zX5AT2y}We?9YsxLr@QTxTsG+?D%r>izT&W*X;hWXV+4%bjXEMExSe-xT)X$hXxP9S z4SE$c+kH9I$O01lp#!dY>T5>FL0cgQ`0TkTZO}FmQWzs(PM*cGhow zB+|zX(iF=aZO5;tv8;KUHRQ36CGE`1BxcimK3-xd0NQ;??^UCHdhR&mxCY#wBNHAQ zKg2ocYpAf(bQ=`5mutwdr|-fy1d-DfrxuZ-O=m8i_rGbDP-I05f`IxQbQF749)eWw z)bq=)3f*dx{fkt)ovq?Kkzva7j&ghcJuz3?!?sTdzF@{HFdQ^%j1Vvh^{$5Q-qzi1 z@9iaRvdGbHQMdxWzM01d)}sE%eM|iUHgA}cGr-B}ewBXSb{DdV4UCpDT9*4jXjOOa zcEHc4*V?yq7&Pn4h;0_ph0Vdq4JXJ(IxoFe(fkc4wp*z#7s-PviEyMNxjk|_P;}<7 zhD(#ENRJ8M7*zR*@3+#hl;b@SqE0B<)+b9D4V}HTv7|AL?JpaLufH{$E~};91w^%x zT_nxZz~K3V9T(91R$bnua?AF+yMZ(SZHS@EusuN@)gFO;VKs!($Guh=40B9J-X!)P z)~!)|w_NXioYazb znXK(nQUJo-7bkE%2dS&tc(k=dl6fbQqZpffr_28UzI#Igk@1$foQq_NHR zn9weGhT)IOM#+M{agR?*hliVYDOQY8+uiGMpEa&^5hQlA zGkH>+Nf^oFj_K9_G4Re*@Y!mM#3XR-QJD zKzZH|-Y=fjt>H~*WTQHV9Y2Gw@2zAFdS+!)k0&St9zZ9ujMlD`;ixU9j^=$fTZm8v zm6MM&+(Z4H3Aah3!H#2`ag+5uDzihS+FnS4QTB9<2_y%rdVX}W%cx(N;k0KF zLPUyW``9D3MQP!vM9n;xI0cKcF(d+NZq#*Uw6CHj-l!TodqT0Y?Zb`}@$5}D$4fee zu$x-+jS+-3t)!a*lJY{>1Rj8qNgd3VS4(*e z1&(&KEZHP_0q*r8NT zlgGK6kGql3imiR(ElxQe8@)gVjv>AfyHqbu-*}%&+}CU`Y!X-wnx$rdT#l1&!YV6dpp@t&alD(;`5M-ALl>DJNP zYyqAp<PUdYqPOGD(b z+MIGoJq2{Dq-pwL)cA26Khb#~tSNfU_rlm7Z1HAFNSfh$+g)8mzL1o zwYAYQ+XWI!D0BP5dww33tD@*u_h~Mn6_DL^h1h@aXJ|WipGaceZ z0P}2am0CAO7;X+!um`Vh)pN$y@myU&b!RGBTCP$nbv%6(`qAiAQtEQ3X0~H_1gNG5 zK2mMu5!XJ#x{U(P_fdHC{{SX6^GJ7LAIjmroj$#*DtK(-WNry?Rn9*D0O3nzscQBT z8>4p|5ygc_w(`T%@ub{~idQt|Bl-st8Qv$lVTotChZr-qI2-Aem#8%OgKWJx(*w z3ThFS=uS;+T=8#?;ni*~kPuWT#L=ieSs&g5t!H08tKvN=tu7?Cmc}v)M+|tAIL33- zgX!L^+h1vh%td8s1P)sz*PZ_4Rf%p>?QZ4>VFuA*HyO}y0w*$lzNTBj1qCrIUhnRD)ri2(%5mNk>>Ji z!s!j9v$QJ{l`@vWe_jP$@J^d;t$5bmyicY{CX}oi@<`?RyrJEF>OFhHrhEBd)8&Qa zXUGgPzTGQNLWfOAzq93bj^RiW2_Fgx>^-RGQig?Dr>VE%D_;m%OLL|8T4a4Ol>X-J zKYa230G`#wUni9eiRL6QmHC79&#rq6Rrk2i{{XgQ(si9)J2+#L24`|wHYD`}oO@Lt z7h32R3=O8W{iSYlvOFwDQP7Wibkn_vn@JQdb;xZ)J;l6dZ7)(OWaUIL51)SGhdm8+9wqU8w!8M2wVf&{CXxi$@BkH< zVFz2xxJ6=CCM!$1QN%&C)3)KM%OI#35~{=0k~^+7Yk`8%^p6V z&bi%tUXMz#y0?OLSB@fMMCgY+))s}~ZBNDu`j7l2Z>N}JS#8}x{q7GV9mi}M+mW@Y zgsUjKBzy0Hzi3?#!@9AO_rcav!9E`18;k^2?y5QfdSbA?HGEE+#&;J!CDJTb-LD;t zP>;DDcv!$4lwfE1bgvgpH^dTZOBKbm%dwB|r0KUfImdqDyA2oNuf*+R!!4;>_*VAk zNP^_7nv?@67yHegwK1bko4lBvY0frCZNc#dkBF|W<5?aRI}BTl%zCQ!tPA}*(^R}$ zd)Ij`|_=m!G+J>pAT3cTUVZU}GV)O8C;Zesq&ibY8oixRt)amL?cnvU~K)a|u#N1>tFz`WrFB1LQA$u zWgpV3&u#=rki?sMklgRjJpF22nA2$C^?NZQIEa=;TuRv8@_JVptXo2F7f@)US*`fm z%Z1Mgmo;uulqd1SaiHUN>R+E9+iA9&Xnu4&?ZyO>C^lS9@(bDBh4U@fHDKH#GvD798~vl zsPhDSj{}B0{VFJ}^(^}7u3+dVQXM+S%7H%bMo`fdRI+lcbm3& zg0w^^P>YkmgtQE|qikX#;Y)6D=DJNd?XQ-o+A?JGHrqio5%iY?5=$ zNYH~4x82Jf!18fSCgyiDxm8WrK3ZkC@BL~>rf5q|EMZ<%0a=?U$~rI|s)IofnQ-Q3 z+CyPt<7sSl2h=V+Gc;$*DySBD-l1wtN1x`AK%>%g>@PG)p^BWSD=OFYR)Wlyl zNUg6X!pS2luv{=X=zfE}HcQBoP~jv)HW>n_*hhb*HaAC_G%?7^W;r2;9=Z0W^eJ}; zg(Ms>9=(M++}&nvl1CE1%N*onXD5%X zE$j>@VYOl~MnBd`!9B>wb4Yg}Nt#(u8>@K0I|^;X6W>1d9+;N*6UxbY?fc!5u;c9f z{{Sj-Ev#24V7ChB0S0H>t)Ao8+|zDu#7ZQ(yM_cjY}>@7d-_s)jS=5L6~MTQ%~e}@ zMs8MJj~jn@dk*06YMj;+-c1~~R}39wJ3{2Ell)x%b#ChV32kM*^I~LB5;%5$uYT$( z7rUHDyBSfEPr4T(Gme=Z{i+HqEaphsLvVsfhaiu-2le)<^Rh{7FOW;U*@0qs!0(RK z*roeIM|%Q~BwS)vA9ed2W8S5fWe+M_9s6=Oc2nz$3Po8iB1c#n<~Y`Fk#ydA=Od*- zEWy-9w<#Z%a$|Mn!R_>?&2BgsQbzI0nT?Z%FZ~5oYro#5waPB}2wyRjVMZugh<(-3 zaOOBuh8F{Z`Q%9mEHTp^ zfHe%;oo1Te2bGlzARKMSY=2sPmA$IRCFR|m;s_8v*q8>8lgg8hl(B;WN{wk7y*Fk?Nx4Lnq^31QwfSp`7QUAdSKJA^&R#WyVQKhZgQ#%c|(A`c_dQC z6UrAB`H~hV4C9gNGyQ4t$@YnSrIcD2*DU$Y`1)`=nvmRYK_Q4|IAve%{{VaIPRL^x z!_6Bc6GX)4%V*+6?0BnJ0@a1Q)=J0=?eatCBzN@1Dy-Uk_<%FVDuS%dk_UbdN~?U) z$v2djjRmYkeP4M{JjXd;?E;_TT&R`91b!7sRL~DEt29i^J2p80OKdI?M_RwSZtM6IJiP1?X3Lzwi*a122 z4Q81dB#PN&-{!kCsNAZLQ|@V}pcZ11Ni%ry{G~#Jw~UWU6(SN2$0EZ0~b)4kb#n?y;5UB8&)o4g?2iThLN%t+zM7nCQ{0d1`buAiy(n2@jKvgyIT<_u0E83U-mOTa$j!aDwx47yXH?^4 zoj#(a(QYHP)m|%@!^b2luO!1GIp{sAz3h*~-dcG3BH=L*~%W zw8wO8Yqol9R$$F?@<<($R)}m;2*?fS1!Y@E;@{+vSaQBguijkss}S8ZR?Tlc%yNZ{ z7fgNNd*i)FDVSU!dw_N^|uAR>k}wvF9p!aL>nw{LGjPia)BEIww> zkl>6QbOhCPmIj@miIzg32}1PexBmcIr1P$$K#6PehU8#;-%6yyp!q-+3d5X}QN@D78Lk2nLoB%J5AYm%RPTpAToMTj05@Zgp{q=#sNFwE z)Tff-ce{!>{IF3Uf(L$TNGxQDUx29Gi4<_(Ls2wl^@~j&`4s-{B_wAYV2?_c;bfUS z$w4C+NYs@IYgpRDLaHp08CDrtS38O~Pr{|mtb;c<0TmZJGq*i}_a>`HCA(cE&~oAM zlL()J2XHCyUPjUYph)q3=vad44@~|QqL9-p$troVtXr| z;IxiEhtPUcq`fjcVXm+_3mbMmwU2EiWJaUT-o)Wq`iyoS)n-eWe1T;QPGx02WURw# zk7~71*lJo2xSU)knrDvy;{<)<=};!6Eu?@z@|JJBK>MInGEZ(mB~(Qk{DJx2e!af6 z0L?%$zjDra(h+Yi&8^j4M)j+WM%{rn*-KTpmr-VxVp(Kd4#bh(stqxni%i~IAHL-{ zK7zHbph&KzOD8WD6oSdn`if$ta+iTIB%yaXJplB@Clx2C`E@AT+uGVl*Ahn2g->J6m<# zb-5I>ADA8=J;hSgq!x=Lu_Df;;I0{lIotPYwA8=xO0qs+H%X1>bC=qQR zJE+FK%vsG?pw=cFigN0Cb;QXZ20x2$C-zAyX8xKHzJ*pW};tO?zPCz* zD7Z!P@Nw%<@ohU3&1PIP%wz^O82%#NF;jh}290iB`Ed}zLB}5P9`pqH{R*=@{>*g(ew z`egbFKz_{`wlgECBs!JJBhrzj5XvOET*tL}UJo6OYVlPh?%18jUCQrtuunRJB86uM z<@!`3%9>IqBosKpk|5w^wv29E{{T8{=`l4>lEll#;GHA6kiRVX_KhPE>F} z&KnghQ(P8XS?^;|stJ*X0nhM?+KlhJ8`E$$)A?-@$&lE~W0j>wwkj?oMMhk%(sRh} zYH06LOvU8^y>^s8c%1e6RDW%0$c{LnP{U%OL6OfTjc(;mI@~T;v%6~Xq=pt zPCmKq#Zyl4#KF-HPXyfsx%RWeu;{&q zs1+`o1IHsml6fXl%-jC!bI^KJ63U1b0xL|}$XtA@?^|;!XbYAtr`Q>yj(6JF93EsD z&KUX%dTKWFN&bXbg#_d;Bk5Q-@=bMWZBfPxa5I43*{QT$PHPn1s01oOP;rbmOd4^_ z+NsLcglKe0aba}$;mnP z=~>e!l^}MHB{=1}QZzHoBCnT~9Ea>{&REK}u{_Ms`)f@g`$T_nhahl8T+*63(c4oS z;*LY*s5@AXTF8qF9Cs{Oqn65+<07q#dy^s{Eg#Fck~$BkrE5yG`K~0~kZMg7l96S2 z5+f(>l=UOr)K={*w{jG7kbplK1bbGP(13t#01R%!kM)H5dJ4#pyjLO^!=_K~B!}E7>kWLl|WW0P_?a(!p*_ zO!p3|hwnM#2S3WSii;h|(SoRxIY8$lsn4ONU24!l3&d?l&e>)~9248v(+%yNz1RsV z$cxC4asfV=siuNST-&5r00+d1K2|i_O=vXO_7W7@6yTl8t;rQFoLF_;y9AxVSDbp% zL1Q31CgRKUlHI)pPi-8rxMqy1{m9t$_&(~fiRQe9j??iHj` zB>6MYlSCJis0gkK5>=aEs>EEpW;Ty}z%a-kDD*h1RWz}t%H^2a);OA9w2=FJzbW|y z=eNC5)U_5=@~vk3Kkz(kcW3-FRy1D?+|4nux7{tsLPD|VPw@d)FD+92u2ciP zLCNt#axKJtGw_M%P7YK z3OzJ(@JrafeJBBWmV2` zS{Aw$y~Bug8#i^f0fUCa1L}QiLB^dKSyE`#LjLo4Wlc`BC%Pv zC>!}x^%S#8wvaQR8auURB;+__)A04FVvjg8%_CqPirD}Y>IYw~Nu}AwE!YcIc45Sd zf7R4LEHVHjW@bM={=$;1t>!xt?H)^yEV6AsAQ&g6)=^5S`Zv%8~a!8m{*4B2@D6apuQ;q7WfCPMOXphMBElqP zToJ<&hCkM#c`jhMlg@4BP+>s89`yt>ODyInT)7Fme$IsP#YKHI&kI98%PI}qj|IO9 z##o1ACdsZR`z61dHSXdcC|4k`>yN^+ZgtCReex@YOqLAC?w;bQ>K6LN+&itK1+oUk zJOSQ;q+49wBVD5iqhFafcdjb6>NjLWr738T;jP`=gz{g0<;t-bKa~u8n0BmqX-NRY zIaBLaC(%;SL#ln4n29162Z2xfBg8|%Rz=V6a57YSipSbX?k-t9%i4XkE95q%7%vd} z-3iZnl1pW`Pd*6Ul*mg5=N_C=={C_y?F_C6+4DZ`e+ruJ3GCsL;@(3fQKk#vl0U|W zQYjiO3NhYE4a+OUP>ylH4VttIUfVpdxefuqkp1j>dsJ4MkB9DULR>40ggD4N4tk$@ z$<=jeBay7E%&uc?(Xy{HXSnVKWb1hn=h)l3)?v4FQNpqSKs_JVJ*zKKxQI&k!0li# z5Wn6&m4R|~JJM0nmNp+c=bxoA(%$BLL}hej`>!F+YZqQjhf(Zqomn=upf8=dP+tTS z)}Jo7s6z`*kQDO}popHJcR$XnS=cOAk>AT2O^J+bS+K<8?+!X=^QE|kcEl3Ny5Jlx zKI-~?Dt)AZUd1zaG}8T)vdYB%_dJ1`a>o0h8 z0<2ocEH=jSR56H@vM63$`V4ifT%S>-CAFHuW4(Av#LUVY`@nUpmzFTX$#>>6M(Tfd z{{SgMKbyUD?6gDi6dbwAwXS$vT3hu^1@0)2sy-L^NPcd#C}cmwy6&J5w^yw_fIG9 zQrYW%B(~ITzqBApV0SC>FDsCF`U;ly&`MFce)BqRH@H~v3KtnAk6}-?ibs+>g<^+u zZ5=b~R$BsSr&$BB<90btJ7$s;w~1C&bCzNiy>ZmmZbrPQhTbyHW0ihnefyAMNcR6Dm{JbOL#1rLK^qTXH2h|&VHDsxVg5S(rFPPhsW#m0nn$>Jnv%qcVJ~fwES$?)5!0T4>^e%puqn+%C}M3}jT3OJ`|n z1Tvz?Qw$w>$GvCG*mk+f*?4hmZcd?U8)`}N`G-p@uisblxe`?c)!1H2bA7}qgBvK?!1|wB*H0B%wS>^$TeGl?2qlb+C%LaY(ljfn zu0`F>s`nCL0-&4>cExW00B0LES(S3X#}RM6Nwg%{HO{T6>Q@tejbr&@1x%xdIqgx6 zA62@K=eqgG%PK}m713!crRuinr`p@3NgHKI0PQ{UX_xwCEjszoGiB4erGjw>$O zWch57ODck8k&jYON|?hlua?8icW!qc5ozC1sWh}5F10FNrPw=x7(`B6BlM?TYr|ec z6eJ6xn_Y2$7acyeSHt!(XjjsGn&iAonM;$ql6eC)9nba+jl$}N_(dd{Zy=su9mlmj z33AYa-R8D{X{lz;tCBVkx~JBmwQG5`AaA9{;6!W=Hq{+p#zq3=7$?YbLiPUu8p>gL z=EHk<+geQRPw!{A^c4Ayc~n=>+t#&Caa{6Ezq*^7_cL1?f(Ei zl!&^yv-V)Nqf@n6M8S&6TaZU@rBI!MOg6$*8Msn;4eMH3ZHBdK$Zlj-%n9aT$6ALjad zRYcUFotoNPSs^U=Xt!s1?0D!7Gm3>OolCSfM7l++QbYcRLd03Js4x`glllI2S5efX zwVXk7Zv5aRgQNcdfUOyHSnkwEZ*uSuxSex>k4$>iFYE&(!qWO?b&r)V)}=}>a+;D_ z54XGXPIDTGGBJ*$`c=zQ8%CxKGN(eLIX;yoove1dB5P35=j993`sSD=c`uR{M1nGM z8yOXxr*h(%VkJhA%ErO=ef8iEYPGyaBFW_jVs^IC!VGn&tfht|D?BDfb|X9RG3`(C zqb>We>yz@X?C$ogTTHca95wW@Zetn;`NEE%e=2)LEJ)Ex!v(NhbCKJcZ0Rg9q^_+R zZ~2h-_Q<3Q2$9F0@-SSghQRy>dR7jFdz&*9{(Ig=45w<64`JS-jaJrww6>(m$TF(L zkbZ)vfhLeB+qE)VC!T7p-QCpFnC)STQh+i7pnXTyttQ0UL$2@Vm73x$J(Q{quGrdr z%|iyKA{AEhnVJ6pd6AFStv84yw2}$+bVwnczF78;-Vi^PM<0niCx38lmcfGY=7x|A zxA%v)wOUWHJn`;JG=+bA1;}7I;dspx>e~uQ=c1MSyBCb&soeOA(k5-QtZJWiiew+9 zR+i>yveBxRm+yd?8+zmp)YLnP)JQM2>qvJ^DR)*-11oSnPCJ^Zt9X+{xF*EiByY3= z$Z|mJ4Pt8Q_gaF_EyGE%aH^vK4@xZb%Q;p}h=ulU863B$t5J$M#s zKu;u3kOM}?hW8yQjpAwGXP3*6T)+T9)REW^dX}zInnu;`ucjpXftCm)V1-%nm&ZBu z0;y_x)vQ4ud6^jDl{&B;y|db~XVovRK()S&N1k%I87fav^`_{Wd>4_t3viIInU*sv z@<*?=30Rj><$~8U#?nPD#4JX}ZOymQz3VGpem%K9Unp;7 z5~%y#`KfI5xVIL#h{$4WmP`-F9qG}n#jcqoF+}k&c4UTgl`Ed3>s0KufomU=Jg9e` zN#Lo^@~QWp#rvyr=k|V`Zs@k`=OmVocgn={TCt(V_O~<1HNwL-z}Cv+q3)zsG}`@~ z*QQX?EI~23jubHJLF{VF>X!0GhS8mpQG+2F+kw~fq|~+=lwQY3zAC$(&{;o`8FExJ zrVf2RzJ{x`*4k~UwX>K?%H`eKa(0wZ@RNq?*h?%74_uPHoaqUg}JmrB|2xG%; z95qTsb6lx?t=vhey~&aoxWg0#kIS_(8#kJ9_RwTNcWzIVH@1JJTG)~@h@e&Zjz=B3 z)`T~r<}qn9pD=R{!~;H{`&IKjofEB=suN! zs`#8R7Uw=!yX@n!x) z9Ag9yq~oPSapMbnMG(S^vv%ST<%iVPNzwHi>GO83sGKxmIb8eG?Q~mfZ{9_bhQ~iQ z;6-c8O>Sq;K82t7OU2W?t8XDf zn7_;1)!FVPFb^tltP}TWqmX@RK2@?B=6ka~Eg|hMVqIF~?msvzFb;Yt^{XaH7?pVx z?%)<)o|O56LXn%LX;sND8T-Iv-?ybf4Vv4lLXP`$xqQat1Mlrp^%~Hc(nqy(Oukb$%_FbfJ$R~RZI7%n#eJC9$bZ2thlOxLTM zdv$nP6%1GdjyNOIrQEd4A$=Fx%g(MIL;PI|_hIi=>@DqH;ovT@M<5uLn<4(5l<8oC zWyCC7oa`f%sAEU7*t01UGvzb>uOCWe*mR~cUR9bnV+s4X2svUq)m8C4c0pixHj>9{ zE;EdCny-JO-0B*leU9=#$bM*)^Uiq{r>A^BcYXK4w=nsY&I)_uwHJ!qn^bQ^Lusre z_TOmIZ={WhCD{DI#yWddh0wL{5k0+(QW?UrW`wp2eSHO9vhc2tWgDcRA|c946CJGC zt%z+Q1IaAHNdVd-2j(8R>^Q7tUMpj0QIq(LWcX!iW)|}0m*&Xwd!VaUo(6)0~} zFy2Vx>sIcB+JKfB6fA64%R)1g>IkSIVv75pEOVT9T=9>kJY7XE?vrs)m{T9{zkK=% z$)@#YipxY#Z8oW9zh-NMOGuw=h^dl(wJxn@EQi`%)ljD4BafAR%~83Dtzv2Cc8)MW z4W0@9wO3Gvb+%cxE9itx^1Nq1ycqPPmBG6ry!!T)43j{!uJXB78Nq(UdwW&X)htrn zOCX1PebsNfoN|4umeln<9?jfGA&<;(A;=jX)qcb5+J<5lEwCtU_YJ`Ht8lV2RW8n+ z4-zHCnL&UsLo$z;3a)hvOLH4bGc&Z?7BEg+cKTH-L1@NXNaVzl!}7@+XJ$RAo*M98 zyQyoD+}z)JP&C+lu1hHI&q|vljX9q|m-^k-lX)(l(7G<-S!5h!`}V1{y+g!$gvn(R zD#pW+v!869;<}F#XqrxwaSW5pw_%79MZ2#YXWp@{ukLpkm&=CVcIgpUkUJ22QcW}s zHLEAmWP;t}i%`4WDsB=iLmR%e1LjXUXu`yE!zs@lsv$MJ*_y^YrvZz9I;JLg!4Bp} z1h(LQM_lw2(rts1MzNaS2_cpa88BqrI49Pid7kEPG!Pa^Hvm_FM_g7~>T+Bxu{kju z0FJ|<^ggDnEXxdKo^v~|--QE?|!3$Jto29&p$Ny(*pNr*#~LTadpp`C>!? zb^*{IU&g6luC;L~vr>Vdf=I>>wIqHX+`;G6envY&ka%xHRHGHSEy$K_Yfiamv$%

FU#(9Swy`C#@*sb;1|kU`l#TnGb^I$Dl=+?8DigNI z={#HGO&(i@f-8?G0sgi=PEXRf=`B1<;!V=&b}m*8+m|OLef>>pzlJ599_v%NRbU3@ zD}~+P09K#&WOkw*Mk$PPlnElEou?fRJ?SaJlJ`dADvagqd;xJB-)fTZG`mBDoE!uE zv0BZe!)+JYpH7Z9DZdecj2^#Jo^xF!akOkq@nsMzc_KU#dyswoDM^kg!`(b_M$&!e zQSu7PSc%Eml&C@`df3~^0E$g4M-*s2N5N(lV&>G_>TpdB#6~rQVQtsGI1GJ7L#+8L z4D&&DLL&K|ZgM0*e(3kEQ&7LZIiE|El74Wq^jfGz)ap4&Q(GMic*fgG0#PTJ?npji z&T-nX?|vcPT-`};YLa~8_nAL;&;ULAQ#>`I#d8bX>w6zyG9ZUphOFAQ1v z&2W$hMj6TxpU$*Vr%lE&2jGk{l(-kmy{f(r;H2QrCrxRF?N_BE%cX6JNXt1vA!8UmzpZB}B@*Kn*<@+2uMrFT1JD0YL63gfU9Y9%-KAHP&D!b+>r zfa8kLglN{M?H3TUGUWnq;Cq^zC_RGmms6jQPjq=MTFzHSJ6rvcp8mBuSj!y9w@yT_ zCL)ZEO8)>sSMPNV9tq^RlJubR6%iMO9Q8i_^_{4AhSN^4SYfh~d1YqbIB<53qZ#d6 zMao(kNhP^@eakGOdj_|jD8Pt5FbB3enyWPMz`#CZH0HjMQ{D5}B z13i0IHO{JU1|0JBbF$l40DwPpJVDpRGrPe!|BrjzEm5S zft|f^PBBS@n`CNIYrzza8^DTp{+eOJ9%Wfw(`EQj_A!3ENMhl(3pN&GgbI&Q3#vu&BL~<;xks$hgYevT7Pt+%t+To3~ z%G+60v$*whzmuA8-J;?N^FEtpfWD|&l$9L}#w+-wnn(7NGY_^=7N?3omdmmg@sxo9b zMH|-eTiV>n+Ke%n+A<7kxC_tT_ccOK5b7!Bt(NfUjIkn-wFZ9o*WROuUj}P~bC{*T zRB_PzQZ}7BD;+XLk=G31u0nI%9@SBdZ>XDTXi}5Jnx3M}95F=s^8I-JA&%6>Yh6nM zONf~wJLHX*IVa!xQeN6gbT?eW&zXOD<&CA2yst2uY?ksd zjSCcyx@640#P$`VZ+6gHte#XsV{ED_fDf_ttYuNHjZ`nWQq#b*CCUh-kVtuKKL)q0 zv@Ih@yb(bokB}>wA8-e`TFRTnki}zpf2GKb>c9|BAdbSJlg1KiK*$P#vuYGf?e)*8 ztR$+-R%)DLX=<02HggL|r&Yl_l(s{L{{TGHHk$Rsvo*ex5G<>;5RgmbsLyVD)fR^8 zSoYj`Mkx+6{BFLZ*j8oY-HX`9qE1v|-QxKSiO_WGk6yGWN2uJJHLkVMslc{JNSX_e zJ%q*12;-o~HCAM}XxCGYKitT06;S2M^&obohUPVlqe(94lQG;%bF}(<)`h0EueH>6 zI$x5_kp6SP4s+C??0=EwozmD_nZwDHFq$^~(A_BA$pn4e`qr)0@?P5`!={@!ppA1T z;kms}6tFB1+$5KgHe+MvrT`hwKaC~el6OC3fn)pJ|CyLu^?eCDucdUq5t@tvWvp+M#_?OSj&{J5G`ubHGrifsabF8HO3- ziDX!sCL6aNO5>CDqEky@q-D>b-p6|&yO=6C!9*OXJx3gLtxpVINn>y=p$jZg9LEHU zxPm(JYB9d%%-^lJjy>o1XO|q~arQp6%bR=`ebTVnv+(Peg?{{T`wYp<}=?4fkL)FU#ZCO3o0 z{3`9`y@lnllHSPeINK_K5yx--XH;{WE?OjsPy_(i(6}JDIP%&lN4tq9R1>Z3cfVkXfNWu3vnJmEMyyy zoM#_OQms+F#;L~J7|~eBk2JS(i+qoi6v%YX%6Q|_tGo{Y7S?xwyoy|HC(9Y`D{5r( z(o26mdVcgW4u`gB6G+o-P~OA~0T$A8mQTR-rOw3Z_Blk*JVB^KJU4N*$|`Ox2|bSo z=~~u)AJpZ%gZn~AQCulNiGiGS&uZ0ciEXV__}vjD-VuPy*j84fu12xBfHIiI=vZ_F z_Q$Ph8k3WIO$q&t%TO=YX$rY@hMi_&PSm= zs|x#57LvT_c^{c9Xt+_d2kuxN20dzyrQ)4F2+gy@{+6l3K>1lg?Y6X3r!7eKiaHyq zZLZw9UBPP84>xK?tAPj~$I0ngcULp%@w9htu}SupRV*^DbI|$ zoBjjzt5#YXT)ayItf&`svXjtbp!7cU*)DDL>22;r;z*IRJW-FE1G=Ao=~@Zm3pckq z#k?!!ArYHoVb}em=xck)5oK~~T_MJrpJlL_qPH$XDtyQfss6R0;lB$(eR%CWg&~bW z&fEqkve5n{f$rKvDYs^g6MLVP&OYb^sH!^0iYK?WODCIb(a2fkUIP1%ke+C-a|2<%fWj@zpRZW<*QrF@wY&JXa(gTY@)=D*=1y4Eh{eJx({T&lm6 z`#>JV^)<6Uh0VQ+yqc!zf|6E7C(0y!-(o#08Ai_Snkn;ah_6Goax`k#W_06jdjs0KgYd$}OVw+(TZ>~78C_dxW<5&&HMOO9 ze@@cw3_{%sK;fNK1Asaa=|ihZlyp~Msnn?TIPEjTSE(oVZN>D@5kPJc-0m6dPipi( zhW`K#{{Z1DzHJ-BULISi(iV}!Fx&vo$}{ve1>L>9^uKPmjThy|0~?2>biWAvX+Oiy z5J#)WWOg1UB=AS~Yl^-mb6RM0LXRTTQx5mSI+mAhbS`W~w6?^OH*&t*aBDb}c?a3; z^2Q)ogU{t&k?|A79v<;VqBRQ$MY7$0twmp#eQ-C{S0>(A;|Q`V7D;=t=sttmxuYi4 z-saq`q*gYu!E$Ah$d!OAyqS?ZKFveIf>PH2mPVms9nPh>}9yUw~Nbc#K4i3>CkqpZ|(NJi!hD9 zCef6^`qURtokk^!SXf5qk-HfB)v9traw5C&LunF5velFIo zEhDtkwDGtWW}i4Qp1=y)f(tos767I40;wy&K9wYP_9z{$;b4mSaG(NDpgo7RY@8#| z&GSB|Ibq-noqg167cxlZQvU#E+Cm0BbLm}Ph4AM{u(*y*V=)v#vPpWV9f8lx7MrOYTDkY`!28EIRFgMKRC}q2&h)uCoZXg&KZNv6Z(W>C ztzN1lNDknnDUaOOVKs(@WiOX$49^a5#U$h&l~x;T#SYWTmez%~p=IG$x%$;fd_$;d z>pVJEm~SJEa%WH(K+jMQB=OU&M5WHnBOX*-xzv8cEY2@cAw&V1PV4A>O%PwlGeaOx zm4-s6e0uv;3r!yO8Q%NE5+t#{8DbwPbJy@uS{{A2Ss;jS7~~)1J*r)nh@{C(kw)@J zV+e2ys~$x*aXRJXwlFE>#yF54N~boVsJ-E}c;fQ#3aLT7pJPpycw*miC}`9!S~*=^GTS^0*L&z8w;H79SEkR*9LJVv_++3u^$}&0H1o!lTo*Gn3>zoi~*j1 z5k-aA)ewl=4G}ve&j9-3pCV%BElg52@}->N1_L**_fM@-#N~{vpqTP@kGy^TfU7fo zsbUKRkjU7~uOe{XgFU(EY73arn9N8h_zM~iQ1{QZJxO|wwRt@FW004fn|m@Y6d~w9 zr!9r#5>FkH;LLEW!@hE9?Qrl|OCgaE$h$n;BJTdvk+1Y)u^pBw4-^WCky%zTs# z5ghkCbKbI_#c^FBn&BBxC{V2~(4ciB_x_c%Xie^AD)3C(zSSd-P&Rh=(Yu5XaIxfw z*BlK00DGquK9j6z(4G2dMP#nw~vI-pO7yZOS4B zUBB|kf9%GRr%guD)IFr7El!tAg`N+w>N=O4t(hJjr}snCcY0e3){(rcX%=M!ktzX< zXR+^!#k0GMR*b%vD+_juW0Uh1K9#X;JQmR+v|=E!1tYR!{A-qQvDFuIV@-*rm_U)U z`Ns-D=udjvjV!IKO|8==A#&04l3b3Swa!{=vOyZ%+6A{zcy?Tqj^5Rtnzp5=+)Z;c zkfe-AgZ$#Ty_}mjQ%M~@v*OFEO(tj4Aa5}M^8#b$UrbgL>V77cC7SAOrP%pHuGR1K z_NX6NMYmJ-f;Y*x%RNwz-&%s}#CF!xNb*I3k>o;pyL9|3NYQMUP`_txvC3zT+%KUc zIUV!red;}LUy{x;kOCzOh_Wz9_x2vO%4**d9s?DWbA)3d4CDjHex8-i>R%Bxtxhi| z?NPLnyCY8V0EI_J1E~K1Cc5e1>PuF0&lL#hb{9I%o%VqRylo`l{_vSH2*(2zoqw#n zcIf(~Z5!J;J6=tzwD2=ru8pheI*D6|?aRsu6FM#wpyLbgTh{s$YQqZ+`c->kyC15riv^yd3(HYCWn-$i7BWTU*^i z5e>z)%rVCrh?Z65*QXdg{c3wXCdNy~)Ggp2Xpsa#(}hyM!o&L3rL=Pht*#c%Mz)oV zOu*#)qks)siq_Zxinj%$+uS0ns3Ak7hmxn*ccf@%X_`QbJ;xad9y6b6!Oga5 zYa*O8+ligzP$Om-Qb7kDv+Gt7*`}IniB{eM0Z8`l$sYZwl3Ph`O0;U*PdHo!?rPL< z8&kScCK4|SgNzZ}9@ICW4+(t9_RUJwfnG@qv=BN~gwys}#?xEMU}?$7{vvrJ*i<(@ zWNMcG0P70?9xdGg=mk-aRh&m9yIdbU{EIml3D5U?@lum}28eq>cW->|W0B(y5AONe zzMooyQG{wTN??pAYylb^Y)^CErnA;%TW7U0q?;xu_eqC5_b0Vfx@(nuTH7>%q})JX z&px89UgWk#E!EAws`oZmilfOu@-#rE2k`w*wPjgq%r!iP5PxWJQv)GaKQKMBR_~e{ zi4je-jc^?K3Lgqfa7kX6ADvVa*-dyZZk$6jBqOs9Fa`j{b;c^jExVd}MfRl+mt!5w zQpLTVZQzzE*nK@}!Wk|XZK|kwTXN;Fc>Y4O(&B4JWuDPdN+=}<1a=>d5MF(z?O<3o z%$Ok^`X0k0r%K7wcONn&lKmOm$-NUQrd4B8fc@BgDwV^;%7!>N2Xv&!di(oRZf_^K zxI|q-IBn&9vqG`__#b$w>`AIxmF=ahYb@y{xG%K%?U1YLeMzmM4NT=EO=UivCDfXs zy=#b&VYar^7(9d9@%mMZO=)I8(y0(g#xm)UHdG=ZfpG4lMC7?BUL z=qW)iWYIEu8JCRWb&^SO@`WWw@Zw;jA zoyW^TBzP))e!Z#oFg=QxkOh%RIGdpa@&~1LtJuNrN)5cSM4Mh@hHxF#zH}JIeb4iy zzp-0a7P9IKBRqwXk%%Xcy26qKONe8h8AB|teBUoSf{uid?^d+?K_%o#Y>OlB!s7&z zdiCi__6uBPvMbww74W%aEZu#LOFe^`B9qM8qYi`|7CyvP{Tolyng+Os{YjCO`H%9u z=cqn}@ru{hG-=_pTkAzhRH!9S-%NGD^rYrmfz8`nOCFrj&1)up(&pafc`GMfjqQrm z8f!@$O>sAx$uVI%Bmw%YObfM{{UwqPPUBGtM2ln#@AeRBi5Jx5*u5~RmH?R zRJWOKtGAhOFgV~zOoj(8kavNxAAHpLdpF4;pU4I_0W zanNV;tPMG>87rdA-5|u1XxJU#zJNDIagEAE^Buyhhhq7VlZFX{$o0n@dK&39yGV3- zEwt-6ka;cg4ZO%0a!qrusKOsg#%f@4`$>;;cJV5sBhDoa(GeZOsuS(;49ae0`?L}IA%S< zj4!FH@~Uaq=G#$kEkpnoX8XSX09w0PYf~m~D5R310y5;gjO{+-(xVcuk|VcRjC)v( zgN%;3tCzwsWQsX+x*wg;qY!h#61r`+aKVn#pr^%96zK9ildHenZ?JZYviiYZOHk z_BLDNlJv?YU62gmqn=5})4fXO*5UrlQ_Ye%^7}XieL$-BHg_}Io4D?gBx#6{2=aD= zz!iGN-EAU}M{Ll{KzA?6W%l%_Z>gddRJxN;hU3XeCP-CQZP+R?z{jZdpc5sdJVioA z+Z}ggsOU{wwzdW+X4GTy)g>;(51EMjtN#GjrVS!nJMnn1LX$g#A~)S(*OAhfKA~cS z=1Y5tUdr9vhz8a}yCc;43W_T@wGBOBzh5Lk-haz0ZdT9mk<_0QH}7)p4rWv`+T1IgOB{vFGkE>yLc(s<|x>COPfpnHy|v9vGGrb6Fa$seLp_Yo>VtMnfjvAN}Gg zoEFAu!`<9WCX)=2v*A?#0CZ!q#Wa)LTq($Nt5^==~0%r`Q-B07Ew3Q?u|zmN zqd(rP=^gIv+FL!Sz>ygTAbo0L*-VP!SqlpVKqYW?m5=4;o=r#~xOj>-V_uCcLjVr^ zRH+EJj6*fU38j<$7Em~HI;(mC>qO=iFBl2E#%7Qol>G;4)0 zRe{y{l;fY)v@L$cYY&kOW(eJxq#kBTW6Aw%DhD5JhVI^A9ya~VI4m6h09r@ZL^k&p z<<(|(%#z4}tYbOgcIi)(m^qR(rkinD-s55}aJ=*DkyyL!TFH^Eg}E~_$03u4PJCV9Pm0;wx8o;q-j@Hzhbv}6-kO&ar0#T z-kp8_07}jAKDA{Y$5Rklv4Gg#jgFY_=~o_R?9r38iWh3^RuOsR2f+JGYt&<>)}yvD zTr5zuIYA=^8Tp1d+z-7`p8n@-c9N@)GFBpXKov9C(#w8`k;iDP(kLTwBRq_5KGnY| zmoc)N8riNOxo!B`QO4pi)1K9jtD>ZX7Ly@Cxn~W)BzE+xYkK!swV8s>WBupJw<+jF zS9V)vX_HcwTW;8V<=i9y@&NCT&XSFoH*-E<8A&onwe#}Ix$_TxJN+tWOFKCZm?Zl& zrv>JYY-FF|$ME8vC6H;`PSj&@69DQ*%JJvAp2Uh^((RQ>$EHke*xw0Pk>zJpMqQ@?B2m|myicuEk(JqIMLU9&G84c9+uEgpwEMk5E)3GZth-tlZ@N8r z?rDM%3c;nk>;AEWOD;m7Cxs`yeSMMecVuZYx~oqr%tq!$hlM{{d!(?WGEV5s$M=B= z0eIlmXp#$vAmHKhUJJpMO=xpa^y$ptBDsTLm0vV*Pg`EY^`i1)yoO)qSLjzd2g)IWdP!X0x)1%olN6q@<9}H zXK5@#?~!h@F4cGb=_BsvrfZqjVZF4JX&2X!Sk6~@hWuoyZ{Rq{&V4CQM0HVGm~zO| z+r7=Cb0Q<=Rg>=__w@d?MpceRGi-RAgXV^OfIBe9ty_F=Kpq#3(R&SLC0}oT{Rnbo28pul)`Gz>h z{{UL9O0gItm2Lqjj2t%vb^|@?G>MgpeWep43-aeRT<*bUI4T1hqRA)Ewqk>wpmwcY zHPvO^G^qhr9z=US_#KHK&x)wF?6K^H8xn8{IU@rk@z%C<>nS7O_IVkyqv!JeM+c}G z=zZ%Nl{Bz5WLbjQE#60kCHp++t1QyKN}i`5&{f-MBUSq^+8|d{J8l5VxIW!`RZDqo zVPP}6e8hcOJEUONbuEPbF4mB^_e{vDX!YcOfB~hNljn4n0y}3(>m2F~<;ooczDuSbeJv}qcHd!>E zHYp;y5k(soVZQ;+4sty+$f<0iS#IX@+S=nyWsYPFe|gF&&m@l346;nt<_n9plguR{ zcLa3oJuoU(f-(EXxC*j>1de`EImh8jEGKYeHcYCC{B4ng#^Fscvl$bxL|KZgQOH>o z4oZ>S{du5A8x}@M9ZY#*ryrN8rADAbo1{$9Um}lYeZIThG0kTW#XuMn>Fl zKi#YTF0-KtIHJr?B)LYlv;U zi~zR<30Ty1C zSYH8g#{;cNc9(AwTv|yBB<+Qj$01j$5%_hcwJ9Qu*5+s$EEgy@`Rl?Edt>_3jmk&9 z=2=%NfNsy-A5Utva||L+v%_rcjDSe7x6I?XA4;ktj5$P@2+(3lB^d}kJ#zXj^%G+xEh2%Xh+>M%LZ0#^-O;W!Ql2a1bhC>u_VMY z$orB;%O^gyYCW$INYz@&%#))q%WI4AURlIT) zW9cXHerBB{*LLwk1eY+!9^(E>$M?On*PrP{(AI>|&!?vCGU`)z<&4KFOPz$CxIJpD z_bATKB;lD?sxH+)JAG=s!av*6XN;ni!bqQY7(Si55A%TEPY6gPx{7;q9$X}2pKSVy zcR_HH;qb(Qu||jGjQrA*=xJoQYjdy-is-88CNd9RO;(BBNQ-A5-8^&# zra_rDTsl0M`LI6d_xGR?QdSQec~U%U=4XMAo9k8Xqk>?>#>!g@DOMoy+OZI9O`lCA41za}nZJnS4_y6fUgNW7ZLo6UWLFttzH$4hj)acp zt*SiGdHaL0JT@>G^v*j9k?k%EtZ>>%BvG(ylwL50zvoV}xQ9?F zFCo0zttkwT9$Awe5BSyXHrXYSq>^p%qXiyV{m66 zswB;04GcT4v>}cdZVCw)nUJ5nI)D#vdX^{|Sdu zoQ#PKjfQCnAtdx3^>SFQXSUe)aXX{`0Her}Z2`dVkLOM@+fMPMQDnTOUPj?d1hw(?vDXEH`Mq7>)uhotX7cY# zD#!={2+4k@1Jbgfu(G;#V+clKS8zPYM^1ayMoXwlHrQ(2EzF5Jl`=*`$P}Dswogpd zO&!9^b9Am`VxS}}xC%k!WBS&cY5UYI^~^|B3cN^|4!G&ZQ%gOHt+OoWd6pfv-ci9` zKK}r{9LN-8%(yHb?&Iw!n_p;+mP8m)^!2MYItxb`o-i^cWfv0U;P=~}m9h3n;FX?R zV&QD#X#(-Nf4mQBSYt-DH?l+)4ab)}06j;oOQ_8iKIL0|0p^NHqJVB(DBaah(yT+L z!UvrADqM*`Tov2uD%_CEBw{Cw`AWODL@-pInPE+ec%p@c!RwwefCqfk^R{T9kjQM3 zbz?MUHB*&jJe-^kM^o)ns=;L(msbKrc-SoGcgl&|k6NR3sb*g#A|7B|DkJn??+;T{ z&Z+0zv@zRG=V0F^;BbGfJGLzmuRY$IX(QWOH_F&()nv;rbInC1^{GZrH3)75fxhEo z?logUVSi^cne8N!JBI;0wi}td;g3K&)Q3hgqQep}W6soXyiapQmBQ?~HPR)*$34j; zY%Eu%F~({JH#ajhG1`TJ+cR9FVc7QD=~CKh@hs8Y$7khEaT!xK>?rl8+`|kI=1YVE zJei{d_%2F9@QMNK^4c6(UB71#;AVo zdolfMH&^imovbZ-ZoI@ni8`|bj(~Tj*y{HY7P*S)V)KDh6p`*FI`Dmel{+`6?u%D9 zDB&$6V(}!U{Iwr6hXidW`=hQst2W~8j`0)7W|A^go}6?5cB@LaB-_}G?|BQLMaDhz z+Noacxkj28SV*LlkQ@L<2P3eitR~Rrk)~!a%wm(v0JOaj_6OdZacpH@C832_A>Hzj zH)HhXp|QBLy@;zklStAP3!SRV(`onjt1T2;P+hA8&J|g?&tOld^QUb^dyZQconwhL z0V2Z~XvPS0CvbaUQeS(NY!Hv9FjRClixi>OLi$MnXd{+u88cxm$~P!@~TpT*8n`M#I^}1 zj@5JAqpXZ1{NW<1ZNbWQecKgntk}(yaq) zxg;QYv5m-t4!G(DIH+}5qNa=}G^hJ?S0*VVmMF)TSPUq~a5~nEu*hQG^R$~+aFNDy z`1)1fCKtF%^mWWXF-ISK^uWb3?N;U)W`(?&6crH2G6&^Q>NYh5k(CY6mPWOSCJGPk z|+ql^qE_l?BG9Y9$D_vB0G=ZO~v7{q8$f9gWS-rvaMk zXSR)_WWtV1Q?G1YZS8LEFC%7TD$<1@upZvkYAX7Z&7md7iX**A3&$itjf&*sb`K0O z+MGN=Gh-5h?3gehBOr9mW8CQ}_VW6ivW0|$A&C6DdoLaT0Ig1KC!X9-acL|la&6d< z7-Od+^{p)%Xh$@eVJ>2xc;nRK`!mW)qA~e>bI0|qh_#3yjb?@?8&so~e1-sVn$NZH z{q%r6&ZQZKbO)IF{SRUEtt7D~FcuWrBLXmb6Yo(eBBG>LZF1q^`$6*KmLu}3N3a5W zpI=&zXf-RVqjPy4(AWY(apxK>uFt2#7mZEK93vdSN}I5?=SF6Q#pCrJzhW?VKi z89WU4H5JXmyGXDwVH*r2gC#-f&vQ_rXJWaLsU+}61XAAKz!6*`%^@Q!dIEd;el?pV z^yse~?Fy3EmRQCWM{Il5N$jGVPmviVBhLGU$p<}tl^SVnZt_p3dGo`Og`LU3JxI-I z7$G?_dx^f<%3+D!V>mAp{Lzl>f!FCzwYrih{I;CUf^jcq_r+(zV~16mCPj$Ii@DW^ z2s!IkZ&Eu*kfbCO40R*EYTQsMGVVXM?4&O%OSLvzByF_gzVD?}`!rW?43mKw zKPr&e=C%Ji!nnYJeF@`@nP~kF6^> zu;xsYLxu^GK`JD+Mq4RneL39uxCjK9 zK)#@VI!l{L@9bv~-5u(oqjSQR&rJ3d`E?_m8akG_XK!IDLl{*DcI7HRhcvjq;UtjYDK- zjPxH`e$iZ?XQ6{7ib*WDSF@1209Ed4%n(B5SIU%y8903H6*Sr`>c;XLxYPc6!r<;B zwg+?VR&A^<=6^6oNGAb;^)%d-iBNYTNTHcgJj^3L)ysAEH9d}+w|5MY#~}=xWJ4#* z$EfTn;52H{&oU#o-N5;Z=dM4kJ5cczjC((_;PS+{LcxK^9Z9V3C$cRlpitJ37_5r6 z?!ID!^7=2mOqUig0RDQg+k+WyQL*|}71dHO&LIu*lOE%ZtUsMqd)Y+smyI1*6S6hO z&FfU6*qua;+h4O^%M1er-LNAK$UoyzYDqd>t-Pp0=W6fcY4`sC8o?Km+e#iQeT+_8 zNgp8nDocHGEArpwi>Hkwb1~+(H+~g0rh|E965NC(RoDnSu=VHp)`hN}rA=(#YPbkhh#RCTau3}Y{Ay{hEHwF$ z-;n-D4xkc@$L_Ln2K7&R z4~lfPjL!E&NLcMwJZ(C4tCDoh-sV%^gulQd9V+wSr~ zgs}U^9D`6@YdW>LOAFLp;C%6g;Evg>xf-1kd;L*m_o+wpx?Vave#oL`b&w^FG!ug*e;C*0Cg->PKnhzF>&ikx2WZwKaW0 zBu0B_@q{8Wr$41+2qn8#No83lWb2G&ed}1OqZ*FvlH&5}-X(}2+aL^Gx?ukRT9J&f zf~b7m;BLs}eT_((b0Ln{o+0^}NaP%L^s8xPtjUrO%a9kX4pBl;lQLqn)b1KtV}}T& ze9YVhHEPd6)Ro=5&=HscgvUOgO4GKpw!(>9B6sq{Ny{Ha$8x^0BIMh4Ih3K78s zb*!aVv7~7&*_RfY(PgEFdXu&CKI!+XwziO3ULd=TgPa6qe1XPK&{Ov^Msif4Id%i( zZ1$>`b_;Z$XY$u>;KESHa-U!6S@T@gMMqrq|ZMlBsCkrU6bdC+L^5#U`Pgf0l(`;ks8#jx`U9{2^6UifO&4mgZOu;Lb5cj7Y#DS3AZ)Z{KI--d-ly6{73|wNi(d;Q$^D`Ir{+d7 z1g)GC=xb`rLa~N1xFiDq)~&f^NC<}e2*@v3)M z%NbeXvL$6=yVDGac#oSRR1Zy!Wi}#pg!txlDV|3?UtjLv0+PcfShq42}r~C&?2Ge1oYT{`Epl?P(iZ!Xtt?3CS5J@v2uQ=$GvR((Ffj zaEP8zX9_S^J&inSGps@xCRo%lVdf@Fk8fJVxw)P;d#Mx5h=Quye)c;I)n?TUQAIra znN^8JKfrwrTBhEl`$Ud{T}m>qGDC^tAcLGK9=NC_yNk_8>^$w(=hFClQ-`muDQl4mcj3)k-XvGV5x0KWdN8pD~tK5tZct z{O-zT*z2v{2N| z&6~FI_;&6!cv+&$7Jaf4h8zL^0M?>SNiD7sqql+4S8GN%S01LbY*<*q907i4TXFR{ zrn!*6+3(eXVY$ML6$hvP0IHWFxO1~k`^9$G)BTz~{!1xRk`4jKPkPRHt}Wg;;enii zlzjZFp0zEwv$vfuWo2bgnLFpUG3#0%+Lkk@j`Bsz9jmhds^W_!uOcpQkI^OwqN`o8%iMY=XzW2Vf~>b0V27+^n+vqs++|9X^!RSYVUwaHEA$ zk-72%cOsWSFGA{I2_vtP&GR8oolmGE`BU|cI?~R}&Wi3_aT7Pn2d}v`n{}zITlPTi zHUf$dM(%!;`^mi67CENeq-76s#CG(hXL7EYP8-=Rh{x^$R2T+Hf8XF(y!M&5zuDy}BRJ%f>GiFj59)eGmcDFSd)!GpepK+v;}G$~ zu18$;_RVV=N()0TY~;p1r6$F9nI%Z% zlglC4u#oajP6b&SUZZsxAz?7an}*o_c0Iv8fUOc;Ox&9*T2{T zrFC%9Cgvl7vltt@)r~&M;UY_f5*2K+NB02MKqE1atWmw`!?eGd9`_Jq6 z)qAA--N`LwyS-&;WM)VQ&y4Z)^{ov%QMI?YZA(&>H^x9-e%W1WH_Z5HaSgL zNnJ}w&u|PyNAAZ}KVIgAnEk96qzVQJl4Z%oX5DJ5B&@jkm~P->H4wU;rc%n=VomXu zJY@d>I^9!d4yrWdzf@E&br?I!tV_YqUVgOuO+jtvONN2rk~Sp^jNtUnI#yI|E!2U& z&R;8%%0?EG$ewR9DJ5c z+}y}jRwAhoG6mbfJ^uh2TU`~EK2~ullRK4ou8Q8v>?!tXV@QBFLn~OlmK*B38R`vGHbXMA4pKzktEa!?g zKQz)f!Sw?i=A{;M+Q4pYt=XMM2$hKq7(eHl=5^(L4#?0=YID$N^9f|MxPZdR7$iye zoSvY2)tEHcXMruQRbtrqjljc3M@*jebHo?=Uz-)(gbO<;!>N-DIOiWq=dZO#x`9&O zOsQk#1kcIpN$*WLO%o*;8skr~wqnnCP6;X;^2hoLtuCPw#^ks_`2^?X%~yg;iKFuF z6;?+1e8SuhO24M~dgsoTOX$_%;0PP_KJ;6ca8COa+Q1xO{XP9FFkju+ zN#;nKi6ks8$MZhb)5YP4+$u)QuNFxXF(iXox3)3IAX|pr<`0xQ;1(Unx3xGRb@Cz0&;>={t3GHO_Kqs&(Bj;aI7 zWK;43{6AXL+M_i|wqwBwiOidP<(G~|0+H!btXC7r#n5?V}w$Xwy zwUl$T`qkTg69|aviI)4=0ZBbRm6WT*+B6x@>H0a9)@y)7%%mh6`Rl_IBQXmVuQI@6?T@M^lRCooPtg z6k{FC`82CYp!-F_!n+%IV1QuyfAy-WOm2UDZzOCtW<)%Jk5TJdS4m-a8lp!X$RIp# z6xf#eByQ)gddt2Rkokl|urqGJC9qHO70p}t!&rj-zQJyc;DP(kn>6dG zb$GKB_n4C4WU{6Lj9Zn)OKGWGOCvN- z36XHj&G$X>I#bX?fEc7()=#{mXT zTd%!XvWnVi8q(_9YRnZxirf#aHDO(l!8z0=b+eep-5WfH$8bA;^{YVXmm=BTDDdHa zKrfr3Iqz7O5aNh(@NCg|8B0$7D^0RFWcJLG3$6K=-bh5!&f zeQE5f@RpuM&T)~z9{$vsR=Hi&!n>K(PVNRjT5`gY$sB6g22L<>xYf6Tnpo`GL~;&V zLby1`-S?|7+9cA64#MmJQ=AXWwI?)&pxK(%Z({!dyn(XqmJG)kt=$J&g2PXi&f;Md zGqDWwazkhDudwu}Uq)!Iq&Ig;&}|ILGnGBXM6d|wca9?a0Ys*8`}^sARrX~R!>l?R;??%C(yw>bGn^rR7& z{{Tp~DvqNl&UpU->r^R9#keby+1odmBLf9V+()Hp$Wm2^h(MMz_l7XbjBO*mQ2xcd zwMJVRJmz&07~@=(CzFc1X`@|5B)2!#@;jJU%a1%peRJBflT6ks-3q$4kWxm92P+#w z3ZD5rd95gXH3DeMd3wsO(rt({pP!H7_Nw#P%W~^8#@UOkOmG;E*sW`Ow}Bcd;zo@l z+!>EfKcz&Z>{^Ps%U)Pc?LEWEguqlq<8TL|{{ZXNU+kYe3B|LNUQDbo2=7F zV_LSlG!fmxFKmmfCobW*1oY$9oXB_rC z)Jk%ZN+}u>TUjLW!D(a=0hgWdHvN8;9lKo3EVEkPL*+`KE5jL8Y;`}4Qikqjh2)yq zn5-F>b7ctWkEy4%$V){*H!-OwgQ?GNr9(`i_d(;EY%45~j9?y4?0$l?#;J8-GTuB4 z3X)VvqX*Pf^MfzWZQCV5DzE(Nw(E<5Bui?=E#lr;fcvEKN3Bvx3EaJ<>fRmm3(XR% zY~2hEfwZ2zuxh5IsLM2Kb#Edj(02I=fu7^*P#amqD|;o%Gb3(>HIJrv6{TmP!+9{C zQ?ZE)upg8j=M*;-?g>4N>nQczSqy1pS~MHX>~@6qKDDJ|a_tP3_l#OGfJjZb_9v}J zsOcB_T&;NlVv(@U=E9tRo|M_{+ftq>MOjoVY7TJO{*_-*@io1KjF$G$mfBWg z>709k*zr*qw)8;dWvG$s8k8a{+k(DqBZb?+2d^Hq^Q%EKKbTrL#x{U{>F?6H`|Wmh zpX}@um%&oXIv#61Z`f~*E*-vNPDdH8$l;q>obtpZ^g5km#QJGbVQXi;Ag411sX~Op-(m$J%A&RrC!k^oMHxnh z28?A_>+f1xPMn`=Gu$~;jz8ZNPNV5i>c$H~)j3Jn=j>MIU>&9m%$)+@wQuPD8o1PM zVOV0qxWuwIL>TI8Uskx#G_5)m)1{7SnGcx=PoMBOu64X|HLHcSS4k6&4j;49Hgow5Ekui<|M&vKDKSNF^}3^q^KKGo4bgQL^q z7q`%jv60nrpYX0()~5+_-&1%}lUHXa9-Tb)srFX#!n+1WIbyXWUJa7qv$S$a93VJw znc3+kfeyU!I`Sw<(8_BjHvAfx=*^d6O)Ka8w3aT!%*LpquPMSmIQL(^c7Z3ZXpS@w~bYo=9xETvD@f9s}5_~ zF7Xg9tlWq5KK}swJanpWaJF_*S;Yw5oVV{X`Sd;N<4)wc*xWCw>R0gF+Q9o{Y%z>y z1N+2!3a573rKFO)@WfRlsD%CqOT*{ipr5KJUiJoclW07N!fgU-@9Su^qyVW-}cGGKG zi``k=GcZN{+h=Zl4{Cbp7doSETSq{Q0SE5JbAoZ)=Cz=>w}waZZJs~?<}x<{=~{L= zg|vi6GN;`eQCDy0>V0b&)^XUV(@%3Q%fNQlk1UtlXD*{^ARvAsFz-u~`+~=*2cvL?VBfxA%wB-kmkSvOA?@R73o9(2DYj9$5tNJ@Hyb=3B!o^CM(7*)lo6Jx8TO zJl62V6U0_X!xmQl@2}LlA&7nC1g=~&jfGhfWN7nk$MTy2Rhq+~I${x7X>3RjKf>}KZE z(CTjIia2HxzDq91pd$d0>sT6wnH*3_B)~>xZLcR`-)Qv$wQcV%A+?P~t{NBFAZ#;a z{{R=(pudJ&nWAfkXv_{?IV2w|&e+>5^$ku_%0#$uSz9>%bQS{K3 z3%G84vwqDU&_js^N_*m~nYY9|yFV^n%&jAkaJl(g+clqeZE}|DaV5!nnMot&`Bgh1 z_5PIkE-mE?Z4^@ZvPH0mKY4iKwNdOxGcUVFnS$Ei$+w0uOy#!*W7UWiSN;+twuPdC z*?!Q^_wHduf)~MfQYfS;^X01wHfLtF_tOuF=Zd)o3xBQoOEY{5%#Jij+HZ;+pq`g_*KmYyBm=FbC_asfwjU3+9V zr9V==vY7pn=FSu46Xq;f%L7@LH*F1|5*1j}I}Y68f5weiXp7f(`ZbfRHkN2&wmFhL z-#Y`)=eshmS+F3!jvr!yjN0!W> z9(v&Z6|87ZYUs*Up%-JiwzIU;44Q_mB27D}@`Ma_Mt{0}#b@03ipmE|c&^cz7_+el zoc{ny;sDiem&<`=D;`S3taFq6$*cAr8^61l&2@3}#5PG8Zcn%2L&K;m$%$8#z7%TQ zYqD6|9Y)gLNkhm)ZU#v`!TNgDJI@pAI`cK8+IU#c-?(p;m$1Pd>i&GAojO9GfwRnI3s&Y~_6WjRqCo6euGh&`9>0xg*?4N+_T5_ILfi7n$mFNyJA2lSouK$vPt+rc_a@c- z;`y1~o@vy?M%EN5H112JX_|vTA+xs!>1uCZqWYbtUa1JM3G z>uS=^Qq=6*$aYxSimS+_PBXyzR(`eN}^56|-F2kBE- zOm9qbLdu2CWhHnk>5kQ-dJ|zD;_}t}iB-kCoHV%m$J5*T(d^0wC)pyWP{Z4|QO#-S(b=Won^M^%F_kD{7%JJpKJ_)! zWhR~NWsXE<0IIGFdpFXeb*}7-P-{||(XO<)*7apsBvsFpMoI!Y9PmymtWrpq z4I2550^miS#QM}4lsGd(YpFo4mcm4dv%SZn{XhEjniTqep&yctOm7zFV%Q9G%G6!8 za+21>*4B~QOtKh)#z{LS=aM>)T9(wLXoBADes>_q%gT>WYI^85S5m=qE$ka&k+!Dd zN~iU2H*Pli5$#cDCuCNUTAOn2u!(M9yHzVG4+BTJhpDL2 z_|F2nF2aPcKAzwT=A)W>iLAWFxR(AVV9+7L%1Hf3YS^`gctB^Yi%E46LgCMtK_v7i=~+_4sp{r=bqm>$%EM`l;4*{Lj^35g z3^RJkm`c62Mwf{`Af>IlTUZY+QIjlhgOGhc8o+-LYI>F2a>o>kl6<5O?_;6#_NxQJ z?PYQH%j8E_Zn??8JXWoii5D`>D2-(1J*&_Tq+cP4zd$>pTo3R<% z(YL2+*U~KFg&4tLzq`qnL&;On4r<-DopkX@KA#E`3T{lUOZGpNZdv#{NozQ+WSU78 zkpAm=R?kzMcFkux$kH${wOhNp8#RI*Dpa_^Z?mE4k;59vPwh=-%elCoWVlwu^9LY0 z_EzVdcJ!{FOtCiBcR*V`$Z~#TClM$-0iJVK^!-N8;>BTyLy1E%K5K#VHhYguipf>w z*%ipy&PAZ=ajIQO5sNty7a!|a(;lAnZr?~#q)jaF2yz?A4UD@3$-wMC`qj{CSIMkP z4cFOLDIq&&mQUiqz$iNpZ>13~nF^JH+2nT4!rYI1icY(*)jdoXv2kXWw^EmiciQ&{ zu1Mg4*bmmL#o(K1qmtU!Q+X#jRkw0>lj;v|dh9KrP8sD40y{ zk}RYZDmhjk=kcr_B1>av(NA+PMew!0lW*iEl;%Vk&Txm+{eP8h+e|HDOKGfvK_U6w zlbG}C>-D9Q_B~CXNPDRFFa=0EL`r++jV8+JnI26|CY2cDWMreS_j&JG%A}<3*|cDz zqAFe7q619-VP@b-K#lavcIQD}B`+&$fHj*dE5#X(H4cVcF&qSAeCfbS)@hJJ5-EmgqTX`XgTyrl9 zj@ak5b2ggxtE^1ZMF~j=2>_UJ$N2iy>v$!O=le!!N|2-EnB*4pQR_pGaVctasJB)R z_G#@*YQO6NO#T%G<=jd8(`IAZGlp#DwNHs##5zJ4QBHO1ZB5s8p_N(SBl=l=lLSh}_P+XubTiccVn zD<*P4$5H+j4Ta{U@ipbWk-2%B<&DNd0o3616*Qh4+6Jv=3f<1Qa559}tze?JIcFy= zj7)16*04yIivXTRS!LROR0E(Mr14eLNWV97M-p7eBSr*)PE|9|XSRPT*uK;B%LEe4 zkLE{|iZ_ttbMM9BYfm`HEQcemraT# zxsEsju{&7hpFX(su4z`3nbR6PsK|zUx#mQ&v+|;8PU9#U2mJS~?GigELyOrJCX9Tl zrvUnM{VNYr)#iy_IJCBtEH=p=27Rd^n%%D=y=l}(8wQw2NmL$(-}zKYbE4C;FJJ5S zvQ6e#!wl|(`H_xMexkGY+=vamw4!EW%*(eYKE(7DV^_3>*HT++WVcIOl?`fOY%n~Q z2mF4cwN{tyESn)wza%P!#{U3nakN#Co!ILzCZ0rS%wM|(AWu`CLC5o{p(!#lCBp{( zDEpJ_Y6P;9VlC~@k}x>OD0`23U+rBxK)C(*-tI=leukaE(6_UaGdp*1ae#XhS?S@uV_FRb>&a@9 zxCkA$JYXE2oy|2HZYLzxh_Mc>;k_co<+p?F3nP;E8?(4)?vYM|?H5-|sXRLfU}Hct zv<{i|HG4?-Z#I;tQ@f0`QW9;;9$5bX5Xa;}{5w>Z;#eXo(XbM+5aB@Y-~4L1;`S1Y zdy8ddB;)ORqok*KGDev~6noZ{)~?p@V$KdFOnFM#I32;NF&k@q$>h5zIF$?Icem$F z^P-82K1_imOtVJ7ls<>pR5-TH7K=kh$tSpzY>}#YkzzkJiBvxR^#|K+^oU+dXaHDF z@?3n6>$FyKV%-)o1n!LGgu-3}dVlq)m$9y^DzUmZ2$(ENl@YM*O-8`vGE4nW#17NJ zY~UF(uEzuL^c5AghP`QclHaR>^JDj9o(Hk%S0lG{B1n~lTY1l~rD<9SuF47Sk|^SZ zfR%?URn2V)QBCSq^DW>$WQ@d?`B{GPBeg=;3#u@J;UyOm%1XyD0G0K}rF2$$hM2k% zY4ECCOl4+?oCPP>Janv`V%FZmPqa-sGZB@!UZH;;!l6p+rUo?&2w2N<-eFFIjs`oP z)UjK`YZFG6QU_zg4hj?fYd+s!m__!eSwvBSB3PrzW-zXUv z>V2s+uLJ6LR^M&Av@*u*S#8_Yb#C|DTwTsC!RVlJmhnl-O_Yvw8xemTjni@0Rx4>`^5b_)Xt<- zT8U7nCoM-u1@wi!&kS&)q4Oh1z}!#MrYfr{kD0ENxf>oWm~K1brquNdOIRK`=UBrj zNZA_$j^z5EQ(X3?t+k}^UfU4J4ik5BI*gw6lp!gb%29$kEBod|h2)$n#0LDYQIATa zbK-3*MkPz}8$?N1cLm!GAv~)7Bi6F1UBtLh=G5i|_p&v!o&uPL-0Xbz_0OerkXc^E zz8jla~(PrW1QP{iiaG(yO`_9)KW{{UKjvPi6Dv$Y{s zOg{F`Px65W?8978PoUmq!B=ucr*q=Qelfo_)Oyx#S1Crt zH!StRe-=MT4Hf*Bxz%#;c{|kj@e%MzzLexIF`Vcf~!$bcEDqxwmL0XaSpXQ!0;_ z7~tUaHHBu4ey=UO6PIZjWE;NW^&XXXP}L@Q+TuCUzFph#^5@dCF7A$M zvvHDpjQ6Yw{8Mb!(A{2{K#pM?YDNx!&vRMwYnK!5is_WOb`bez=I6K9-nWh&w{~Rf zu7-}Ge*~8EG?Cpzib@-q4g(N=;m0}jtmnKoq$A1%Q@Dx}$0WJu1pXCP>U)Vwq?Zvw z@0DRIoGu4lzP|qe;ZZ|yjpQrXI?Q)&n6NR+#{>@DI@d&CqK zavus*4vakqTAIez3)YTRx)+wnPRE6r12=F_U&gUD?Otg-xipA;g$SbZCp)*0IU~?} zRofj_`sYJ=EKG4m7^*ygV06o1QgG8kl=ZVGGe>Es&j*rZjyRayvlHfh?lzxM)84CH zTtq;QSp?A#Iv>4})0(a?V|yW}w5%akWSsv1&ms;0vTESgoc@FAv z)mU`v)9X{&-ODA+YCcs2=2Onm>BU=ygmWW$_r&XGwkzvNrb*vwV1NMk&0ybNy^X(} zX*(B3e>L~+S3}Oi4^OYPSc=)2HCYQBN?8j&N`w3+t?AaNdExc1F#>hReSAUQ!ATz;yE+;g>uL-|vp(oLKmV`Fq+Y;;Y(ygfsD)||;BE?G8a>GpEnO4Hq2v#d@WMx9%+ z6|rHZM;rORRIHo=!LrMq!?DF_riLw=B(=AZC7A75S$3Uq|p=jj~A(+9WclVvO<= z9z8MJ{{XF5Z{)GkA~&%^9MiLG^SsO$SJxlJJ*yh)#A92G==xl3waFi8R>B`_^%a_& z>OC|@ys?Jmo7>AxGTcL998v^wW#^VY#;xhTCya<+Pg#JG%xHh%Mu7g6*lS&cWKKPRb%Ul9ngX!(t6sr3*8(!>i=5NT= zjwo*>Q>dAa$H)sY1p8;x+M!D~P4Pt}Tf**)Y{^lcIrXV*qcPcSYk4G9c3`U9k)EQP zs7UuxODvZnB`~Q_%Yq306N=-zM)nIID$;naS`;xxS*|6JaDWW(06UvFRVGK z^p@XtKRCjeJAv<3?}J;&ZQ5u|YXZo(Q1YdS>OP&v@~U&Kf~J48m(DTnoJI)@zN6FW zLh}zpG4HjVQ2B8~8nl`78dc6$vilkZl)9u*+gy2N-zp?Q^F-i&m3m7{Fwx6zd62xz z3n|@>z!BDq>!>0H?BgUa&WfiPZuPe^YeFpgmMpHXEi~4$yR~Q*B7Q~t%ES1*$?MHN zeNNVK4bH9vaZ39`NhZ@HH-`FMGmJ$=?7}^z^0f6;C-K{+y z`fF!>DriC^vtbl+7@nlnyLc>MSmKK3cuSMLpF1*thaHD%hbD?iGb++MI4#b_nkb$> zCOO#d+Q5CrJ$T0zsG4jM+f6;y%zjGQg^u1eEj`4fjtS@h89d~i;8p9WFKwm|HIy$4 zV{8c+Qm3o3%Y9NI zWNcbJpS+Fae3l2(9mQl?X|Y~HMa8PyN#&5MET1vK#&Rjb(rX}YKeWrDE+vLl!!NKu z=ZaF)X|fGo?(!hkdSbF%xdqZ;mJ8eI(w|{rFpXa37X_T}Rp1|bcAuc${i5Sg)r5_4 zDFF}n6Zk>@06puh@b`su&35)J4hz<{c2)Cdko>8h{>1ZBDI~5q!N}$YlXSr@Qr2h+ zJ9&!j$Q_8qEwr}s7+psAV`H|-8*9w{&VPh=_pax}{ui{I47Q(Drz`hZE(238~)+sx40E%3!OSNwX)PMqndecSV^_E5D(o^?}|=iP*>EN z3uO%P%_6QL9%jM&#S8pn*W7ohru%2ugs4Qbvh0dD_zZhHdJgBmYOf8~pT2v0CyUFM zZMbvs+V_iK&+Fd?`MZ_cswp%vC@Pym}tA z^01RMUuStyq4M3?zIV@HdjV66Sd!5d=8+`|e5dmdm^kC`6{6@y?4pxGBL!|%N;^8+ z&C3zoW4$taR=~VyWDq-JrF3hc$!l>2p(Ic=v6UYnP^#w8e?}~*rIISiZ zk8UK6Gv&w%bSJ5=w7Wk&(&Vk@BQ`=RfsZmSLH9HyPillqJ-oS6(8~(rY3q}kQr2?2 z#iZI5h9U@!&k|>-qy@p4HM+qFAU@%pqdf`yDsQQ1Vl*b~G|KYGsw9aN_x|vxn&vCH zURICi8Qd4HJ*o1n^1|sX`v&dFbewG+fcz=)EK%ABV#1C4<&X@SJ-vly*-0{-`=u>2 zDOQFpv7N(k6!E9q#cc}Ot;0sZl03unKe6mTof52T^KA)+1jt{E9@NH}zSh@JKv4it z@aL0{=|?eWj(35hxDvmY<=f}XX5|m22YRikLH2@U5fa7`xPy!wec_Io?^mZ}l0y)Y za>oG($tV0PHu7CU(nE12%Eux&R*{qC^8Im6FHyx^nAev{Z(`y(BQUfqBiR1{JZ=x( z&2lp)n>>==+`!^MI7^ueGMwO%>Uqenw^NC3ZsyZ%XMx=VI`EkPiYSWaS?W~|1p^_ysNiYGyCy~d$rAHzgi;}ZiGmW7cEu`8)j^otVGCJ%< zwiFJNA1x&XLT~xP@yV&JU^els#8yU7T!x*b1SrQqzO`8{XNE<%4-!Df%9*E4=V0tl zb5q)3pi9p&B~@k~Y(osB_s3z1Vkfg`lI1Mqf_UWfPUzWyW(0o;_5T10)3lgN42CtA z%UF&eld5eXagX9XYK^_!xs2l7ZsI{a#wlf$ zNMaY|U#Fq%in*uhj`vGr93`IXXjtTvfN`Cp(}7v@GA*dcLa&-tWRNJ>snBj2^{bZC zvt3~XQOw~;j#&30BdEu3^Yo~6>uH3BN8P#y=GEKxs<|U~xc>k@OHkNJ6{~!ptPWVl zU+0jM&J7w4!k`i{jsObeyry1Mk~zTi9jWt8_L;od z*Zlqjdn6`k6s*yw1p z5M1~AQzv;0Ar|3McqL&o$iHv_#@uwM;*DdrYpa;%Xq|}M8=wc0eHY%C79{hdndYA5 zLdR`{kDRtoDsj|QFtQhp;yA?1DZ)d$YO@ZxKGhpaWLS-xFO%jMj0VWgKJvGxwOBEt zTfrRf7;iP5QBMlJ$@M0L1X0HRZrLV?fhOmTmjm!UaZHYQGTCrP1n1tMc^>^`)#HaD7jDHkR8`=X9=`PMfm{PxXdy46Pd*!Xb2Ml= z79BaLAc|Po;sLh=$zcBgb+ev552&X7uI^YS%pQHYk92H^2bjIr-|JPQQn0)pOp(UJ zFp}BZo}ixen<~b#EKVY35^pSg!lRCzg*Ia}Lu0~A$&iB>Y!1iPsoY&!v~3mEsx4t< z`Ge;^ zd5g7;S<%KYy?`A!{#62A>Ig-Hh!VkRS>MO~p69FfT*(v};aA;@70Nu9z;{%mKuils4in8|Sfkz4P{ z7XTkjcluP8EN+{~7EaQZ$CyS3(;a9PiA&3BS*=_nI^y8Z$YktSvi&MJ?8C&rWO7VI z{HUarAMJXNLrZ&Z3c+I~yU5bWcF7R=6nD;jD(cx|dpMA(P=%1-9CkjPDRWsAlepjP z+oy^t=7G`|{oe4shjt_R(yH70o*Pu@hxDj(E-|r}cc;O1YRev| zRi6s(nImuY`cn$v=&cd2u^N+^~%rjr)&SutiAMpgg=?^aSXED_GZimZf5DB%I=flH=+ zjbtn&D4R!-B#)o2eR-+%jZ;n9mll^PNwKF+*E#1gK2#s>{b?A-G-S_m%9#0N1b`p= zhLgG~>tXL1lL!#1=Q~v3jycb*I(zRuR(ppIv3#Y9?efCJM4ECR_}j0GDgl}nIr&g9XTGJhLzRIN!Y9|9pe(&#tTOv`!f@}c^!|nShcYG zT+&%2YI*Yx8*axve;QSY#IZuQ+ff`M1i<P*EE9B z=7Gal&*dp2YxQ4qj^6baW}B2Gc4SXfEl%?N5fa(eUI|EHx8!y7 zKmC4{36}am;^NORF){gz*q`Cgt!X};6|_hia6#+5{{RuF-%Th)S8a&UmXSchocA7- zDI_MYVOnUPXPfNLB)(wgIV2|`f4Wb#TeY%C<@1q}CQ*Zqm3Z4o&d9$qgbXGl?+(g4 z(_Pjmk~tH}c=GAL1Tj4a6;4+L8xM%3wUb#S(X;?%PdUjv;jWbvOa7m5f(Zc~|AK^t@Y>Klg_ z@`;i)P*-C#eNH$Zg+!M&kfcfW^??l7kVtd5cgMXflWc!5I;dGUE2!saAwrdBW~%;8&-bNs3+i9E<%CtT+eAVLO7?lDzu=ewHm zt*znS&43Q?ldo!|u1jUr5nCj`yCdx&n~0m9J%?S!4kY8 zb;tHl(Da?-a#JjU0Te`R+X^vr6N*^a*5*94OK%jIx9Nvpo(^ zOmwReUQH~2V7Ri89X@|NV`(0rT1W)9R^~Ujf+^!Wt`*ZP=R9o#pyQj&y7ZAE%e^>qN3kGjERJBr2exQOsw!`uo!PGK+C( zV`j|RERvSWt9tWMd6v^Q^KgR%4Z!2(=O@@^nAuw5)uoC{SZ+L~k$-s1yS%mTaqCL9 zam@o;i-iQKP2tbV0Q>&At5aLs8 z6y`aUVQ_k`J-ur7o#)xKvDr!+%#0+k&+{-jw@VTWQige zIQ7q^V%s%VMJ+&i@kX22Nf{*q9C3_uP{@UMD%s(75My4XJO*2X5HP~-rh#-6Egw1Vh_xi;C>V(aJ`YC9o(`rhCpMC zh735yMiP>?wXvT7k_j$&bv?e6 zSX{!~v$kG4XLa(xlt!cG9;4E#&Ed7wSM3*y=txiT)?tBiFA zu+0}@&}6zefGU=00Rs#MHgV2r6D=v z9r50ziHvs-aejhH8FLhU1AuZ5(u=X^E!Lvtb8M>8vTayGf)#$18%c8=xozHCyOql> zMt$+nQ#82R;o_F*l_Z{K1gQIiKHUX9?c|NNMbqM^`y4n?pl3l+r9mO`!!7$q0q?c0{jiUJ)XKqyY`qkCcEueRf>L!+1Q}=SA z#?E??Qk%H7C_dK{2{tCiZ1Kk&3U_Fo2sEuK*5V1Yp{YQs%2i4Nd-0P{iwW%Y1ikx8 zx7qL_WG5K|oP)(n3Po)j8Fogcx*h@MiHF)Pp4#DA*rRzqU&(`G;En&APvO{(iq{(QcW01b1+L;`d+MtQ!l*KDyXHwW84l)O)wKDWNVmS(? zTlaZW&VP&P#XAb*#%SInduk*;S`zyoA(VFlvcI+_ytok~81R2_z4&AO(~5`fg2H&$ z?V%jGRtR|8>IDZ-M{U5ys6ZQlA1*uR)~!V%9Ij}*mQ&j@-dydBu>jFPF255-zkh$G zeFaCTYi(~EqyY}dz+;WXW1*~=Z|*MUDG>^}!m%7ZP36k*sg}{CiauPa#(uO~!%`nL z&kriImyiI!o`c)ct4l1*2{IH+fW(f&wML;GS(fMx-|F0q;Pl78pr^EpYdmIH3a9`m zagg4oivki0r-9j{nNW_wazG}C?_h>wWU~ZjU%Fd{KA&2ec+J2v?};0gjvQg6KhO%V zdua?8YLYxsJaMYX7l4ez?vi`@(R3>_OU`sfic^-^$wk5X6ILxPt=bh?=2URsFky|u z{A!+?45=Dh9#aSRjCll}gqpK^Z+W9MalG)4GnQ|?v)i7Ap_Z97m5fN{@RAiWSvetj zz^U$SUgmJJBgwaKoajAzeJTjAZWdf4BDesmZ5Uzd2YPp$ZWzUCtPw~umi|9cP}8`~ z`AkCP?Oj=}U}Aj6INYbY{VG50IJDF@@+$-<B2w?sMx;k{w>{CRyTC-0hIdmnqnS zDxqsDv@nRWQ;(ed$&SBV*0D*D@6d+kW}0s@7YfX~Nt3SH1=aa>xRw|iG$Z8*06zZ! zjb8f~+F*`FiDg$iP$PB6ueCNUD(PIAp-(TLFa!5--1}AYM#g-SY^A7a`i0fQLbm== zx&~Yx-n>%D7>2>FEgfVK0+M|x9vsr<)5FhwYXX$V zm$UD;cF%9drPZ?^vRzIB(?hUt%p z5=j>4iadS(7!PXZwNDt?K`2NVMv@KflfxfDkL6A>oVF%Vgf}8py08k@AgUf)aOZEK ztFY@ZY4Lre&l{1DyM`36rhA&h)I3ttTnJA)lxJYh2e;Crm6CTB?<($9;E%e)`@_>U zP7Us6rk2K??!Orsv0xPE%n#1udgIcu<<>7QE`_?tH@DqYUezt=wu;>z$Q4w{baR$t z-|(mqhhQc`yIUcE?~16!C30msNs-HEa&BfaGv{LGV_<$2dey>Py}ZtbrSC?(ppLK4wv&d$TeYv-jZ<76+C$CON zLql(Jv><}gInnHGvIw#zx{jhow<#dq~}3oyOS0$T0XZf;t~s+tNIVnn#Z420%D->+MrHa;udX z^D`1n5NaYwZS1Fx*yIEx2O~XlI@0Oh4~Fl2Q`1Mt0_!78%IO-wvbh7z_Vgl)r4&i+|Q?<7jHTENy#LH`EHO7}Hl1TwbBvJQBJdx@3sxfOC zuAu6-ts6#M-pb&WaUw7rb9Pr4|QLIl2~k52VBP3f^oGJQV&IBgO^8INSaVln_$ zUsXQ+^GI#(BuQE+P!jn04j2-6BC|C8NnpT28H;t7luU3)9<^Ul)=!WK1j{3oP(TB3 zsl`t#LClgSp7w1HEwRc&1}cjxmM+=P;ZD8Ou3|=l-f&q^JfMuMnH|2LomBqNw77MK zNy17)-_FgPO>Y9u*!A~!JGl4sn`@A5uL+5m3`P$9F@=URY~nu>M0n{Cz~4KA2?9i=Oevrk}_?R zskgZ@y7{vzpbU}rZ)4bc{VJWrQb@T{&aINZUrdg*W-E9^iHrOGYis+bJ$$y;g!^tGkd-PpxQ39iw)WXexRE$@LXGcy3pf z=A3zMsgegqJ^FN|OK2gDgnM)R37$u(_o2x!QD$>m#~kuV$%xrN1Al(?HM{{=FNKiz z0|1WIB(|?5z=kj0G>ihGjFQK-ECyRyrIeN9)>>~$k4YnC~Gl~fFE9`&m5*s~K90v2Tfj{avoK=u`73&{h-vc@Ibx$vVS z&lt z=zq_pR=JI>-aj=$G;rh5R$ui9*VrI(6 zjBGjetv0ri{F3k!x&0c=+`%ge9_BokB4mhQ z6+OqGp-4GVo+7oko+8b&?FR%i9FE|hc@bn{}!# z*?f$Vuq&hU&w3-gxRHXEVZbV*sH<}{Etn&X6bCXpAL1YE{{Wt99X@2c%d8C$4YirZ zKXh~k^%m+_m7{x zy@>Yqs#=_}2W5n+Cf}Ah7w><7ts^G%Gn7(y8*K&4%(pT^Bx1+q+xL^V{{XJGAi8}n z0;P7VM~#F4OCHD23dhqm5VrzT8%W0hfO%E)6>9TbhGZgHcLjfvK)5VFx_xO$NxgwJ zVmTw4a7=NAb&$JxV*~#HtSdTO(;UvwK#eKnob<<_?MbNW@}o&LyM=DCrZI!>S#3FY z-7{gF^4Q_ep!Ob>tRdXOb4z1kHP9nyUhOr&hQQIB;Cs~8kVzr{*m6fC57MsN*-Zq52*BtY<>MdLmDC25rK!(JXLg5iU{G}> zPXexK){-+7xI#zp1U)NOeJFWCNf?0aMl;tQwJn0%z^@d;hyG3EWP)VqnB_eIC=7qK3KuET2gmiuJDN5~4Rf(O>D z>bBN*`hpufR=4s%@>e+oV+0f5H8jjsBbMgJ$t3JC6N037d3mdP$fnTn~w0G^3id|Juz1F@FKf6 z!UT}AuGMDway$P3^{KZE^A@@;6_JTmMc^KX=}~oaRGLOK)-qhil3TGYG^JPM&zIb{ zwM4oUcC)HZvP82vSmh&x$5Kc2t>R{sC7z#bfR_1`kGxOu5Adg4>H3uSj|I=j=m1FY z2xZ46tyGd$L^^4+GRE56#9nD4F|a778Qw?q`qs31#1;liIefDIN|@1CmQ(yo>-6hT z&1qn;wEC00U|3 z-m6(@+KlQhLx8?{GAx7TR`dXL&0SG8!e=2`H6*4m3G~luOcl#^nuBRq4{->L7;)#q z!wV<3KDDsg-jO|-p32|Lc~|C+Sq33L#hT`|1cg=+EdFe4H?n8u3yz1@t6XYx7}=+W zHI5;-k$|J$)SAuH<}Fm@(VKS{fmF{JLfgM|S-w^yrhRFNd3S+x9-i^qmTxtr!THDV z5IPQc^{fds8J**f%_Di39ih4)$6Qrup7Qz?TWj*+@+Bw;814w~RT?OVTQs8x30tQLadCV^ZcK5N>RCraS{8QK z3J=@Lui6xd#DfG7dXKGFvQgAt+EOgr-CW;7lg6wQmGet*eOK#EpGcB-giRsZ`BXyO z5syz_dNj>q*&;U6SpD`GiqVey~^{nX?t|pCk zD30F*GkxbL)b|y<756cdv(RelZEYW)Y8*LpnAq|MtvY+DE#vcAY`d;d1>m0icBd_k z%3Nmf49Y=gWy0gs3UAn@w7QDk?a3lea=dLLITfXm8jlx-NKBEY@{95!fD0b=5EMa2tK~P^vQ27Hl?v(B3@Zl00f@2CD={ao-ZPFdwBr> zCpkaXndXxuj~gpGfI{<(bS9#OB)W8gR4OUR9l@oOOV%V)1-*o^jij@(WGMBb%cxwq z`iyr`k!-5U1`&Z61bfzAp&XY0y}X5hJA|pg2fyJ`$7vKm#U!~2{;(FuHFiA#Z!9Eh zc6X2*uq2Jk#~AdcoMOb(q>g?Mv|J%buF6Wlt7H>^JO2Rn>U(*me88m~_FQs(%~-lg zZ6)&=Lj=#xfCK*k>ZFDdBBY4{UBKjHs2%F=jO@^n!{)|j-l0L|81+7tHJzNKypF-; zWht<91GnQ&wzO#*aEu&su@lRCR>hz8PuUhZ;B=F5DuV%!9Oko>>}v>f6ige`K`pZ# zzy^5mr7B46B5yS9{oANk3ObDQR-u5$7`a%a3XQdQ^4a>;yDKJZzq4CgJjOV~O3D08 z+2j2B8pc%(<4;nhg{`7ohn6!UL_S4U+*BV^>r!0BX%s{B>9i$&$rCdH6Ff67U zIhm0#Kx_m#>VA~u(k>P+FDm4W7IonJRxYC4)-U}GzyVC6Kw8e(n=_Cmr96w@ujMhBXEhG}hrrV^UR|^u2z#in# zs>O}dwx)VreCr7?Fq0#5AkIBO^{MO{*57(OvCQXiXb(_5MLgSi(Fm{hyr_4B8Ud9& zV~({wt%a?c6oM8i0cLXBn?01C*!^j_D-xjZa>bURHsrjvltu!4u^98yjApJ|-o3&{ z<=vw`{J2HrEoH{`&Kf90k)cidgqaL`f#@mo>TuaQ%M5KPa0)DZY&h##HFu$Rv8uD$ zNpfzd4g0j+oZ~&Q^~Ej4?WutMnlHMUOq>JkYn;8+FM}wW(YF@JRKV->qQd6md6nIf zNF&XdWmi2#KW5s!#m=u|QaNUsOqPp#!t7sO4_Ut+O!X8Hc)S5`4aT zo^zh{OZ#8Uh+9m<&uo?~-+1;O)te>6lgP1ogK2CM!k#p{u)k<`1S=j}u02I{s&I-q z9a+hXJ>KF2OTc`yEB=C`NZxjTv(L`#gly;YtFY*8Dx=E~RV}vwau2wz?LS3^-Zhg^ zw~|0VhB5&`*wHGmfTK!tIhZUi^ZZw#v za&z69Mk+fNFK(foptbut5I$I%GlEV!H@#H4wY;)na|P~Xl#r@<#U5q7tE_)#Jc7|P zKd({`trincf3iVrnQ69--5mQ={3G0o_e{UK0{ZS^up!R!q-TzKsdTGtB3VK}>Po3& zxMZ;Q)jMwi>+d_AQHn4@zBOF1_6M=9$3(WC2!xQp z9it?qYI>gk0G)J}7SR2%8Zn$iJk@+~Ppx_L#!3p&I^%|m)tok)@U5ZRZfyXS+bbKA zc8_1LwQ5@UTH8;2&9r%7?La>Fv96OYh^|`uQ5NeTEwyrS>GZ01nyt;m?DC~ zqIHp8MSOWmK*+^n_=8cD+bp(!x|B#*NDyOpek*EJDPB;{ zq=aMqEGtgWS@8XS3i|Qb`BQfq7%=k6%i&AAx3hk{P6# zHmH;LolZw9kytQiqmB0J63f zfbCQ0z7x~qwFzr*L6wS_r6jN(^|Ia=(_n#Ka3F)r{oHOyGO*y0{>^iHS~Q-9sxz9@ z<41$d?dIt&y6!}kd`p%hEB zkKf9EU8lA?n$OpMD%r{!*1_EQZH0KG4HSq#D(ZijAP{Rg)WlcPD#&q-I&SRhEw8Nf zhYT#?QVBcHMIOIerL25Pw7!toSX@UlqV1KU93cMy8uR}E?Tuqpws+DkCPgIfna=I4 z++v`T;zW&Xq3SwwB%2J6nmvfGkI-pWDm>sh%$Y*)O@i)Ow^#nr{5IayBCLGuyQIH}~Z zds5p#jb%T)%KXfF_3c`=)*?%WQ)x1bR?E2n6dgAEn$FbqdoyshwsJEFiFqP+8ByFH zdP-N=8c1Cx#Lp_NysGS=vC9@O&-AM^S?P!sh03!ITo06P^!isfBlwGKlG@xwZX|8; zqQ&zV{Q>NKK&v(yMzwJk{YvTM5RWs=So$IUX04@b+?4O7ix>8zRkM+F=|GG&*&USd zx#Xzt=}~Cfdrfin6ETq#?nwda4;^c+(fl`fvlX|ihu+#MD;)QPa?vN;#7{T;Dw9Bh+vfP+-;vJ(tVP+Wf z4{$vytB#jslc1Ix} zy!v}qPPMOTciL%!-rU7Bj8twB%QTtX{>SN7 z66;OT=5c8$4&)ImyoEi&`c@n2){shOEXeTysD@0ldte&92`we$f zdygtBCXyMHMio?Y+56kOeLbq97ZgirvgVto+G+Oj{h8yDMnO<;+q$;w{{T94nyr-6 zFOg!(W9ae8{Kus~P>7p9E=wOMpxn{t3{Ul{GF!E_qJ|s+5m}P$2`>sS+ylSXvi`=*j~ww!6inM%R5)3%DK#uCS$jd<$2<*NS7B-8>lqi z6k=pm+(7Qb(uF2~#k#S-bW3ydO)D{pSNKnC`T=btPh+VoIu55dQ!wXSo$>Jt1xF&DWBiR3qdEouj*ZnsPw|C9W<}7?{S> z7YIkvnp~)tcFah8E;SbkJFWYTSI z)aoc&W0$oIKnh2tPa@phY65j~ZRH@`#@vKB=N_5#>BeejTBg?=Xu|igl=?%o1(Ms# zS0zDQa(h+n8%B~@47OIPE)jchSdRYy*EMe2!^--i-+#dGuDV^td$Z+so7No78xf0!kl0cfM9JDQ?2TMJ8LrppVDI2Dk)WMKaQ zo|UgJiJ`c%WSMtia0|9DG27CzHC;hj6)o-Dgk9cau*p82-qn6)!+ec}BQ#ifKT^yYT?`tFZBeMqVomrtrq6b%&SNJpBntMStv zy44t_zxzy$cJVx50k+;QQ$0x)q-ncqLz%64tX^Li#l*=N!x&mH0{V3Js`rrEv~U}n zlOvTZ@Us!Mf5-V%Z?vbJlU`j7tOBfz-yu=#JNwdUdX<~0nbt{=7E>TxkTcUX`8jqM zHOS_7xX+YTWQ^fA4Cl}v>6((zm=wxaEsvQA#>{p7(}lFc)i0K5Wn#*^Ps$HsYUC14YXd|O-ehwFBaE2el^({lEOg5gIfb*5jl%aK(tZEq}R^5)cb;1({xfC1}|dVa?4?UC)RqDNV; ziS43=bFj1n)A*mi{+Tm?fQz8?Msxk zy4q!ta8=F$UcA>Jd-xupvVj9_*C(DeO&o!H{jw&Cx`YP-qo_J6}Y)1&VNgqdE)zG!gfdh03U1y zenZ@LI&-Z~TMRbtaMRl7$1 z+1!vvg;k4hUw-v(P4O*`kq`D_+JcuPM=WmPik_#F&{aKG#bQYftRy^3`?QuYIOn0P zR3`cwzC=G#v^Lr%L|YWhT6S)xKKS>l^50oB<~UH6c*ev7JD2?b04mJX^?g$MHnW}? zA&MzM5xBu&j&tm4l6aEx#z`lJv zrA5XEZ?6>v&Z~89k}J;=F^ue8q!u2T_4lUU$>MEl)IO5yl~E(ci}K_9!|PP$(dPdE zme;0O?g#=cq%>?g^VkZg(~sH{Y}V8Ka+W~ar0mMj1^wgv$o_=Y{U%7h*q2kII}$ll zz(3(!t+t%{W%N;7DVb)FtCi;fgU(HLRyO*Lp!+7EqA3JzzBV`s`asvMV4t>70Rwk0t zH2V#poEAIQL-R&@;j`MbbojLwww`@N#$*T@IO9wV`g2^3oiRWR$F;yzPph?l#7ACGh~Joj1v{ zwz3;-;*M7`AZ}&g<0q&9^Y2bIEUbsgt;A%}wC4WIwVTaB7%@5O57wF{Sfoi~LnH6X zuTT%KwL_=q5j63@p}z2u=6MJxdk{PQD%2Wv(<{8!aETM<+N-yW^!m|sG=|tLa9vG( z0cndUS3*t{gZdt6_ZAB%ZARuL5wnzJC!rkFGR*)b32YVlR6ZL%zVyew7PmiOd$?KG z9&|a*%#7i^4l$a0k3znyuGv}4BGchm_K%ov%gAxt+v`;{>$|ODZMhtcyWc{l zlcXY;t><|6{PHVI**VW|agmzUwY1YTm;|XOpKwXfmT;@?bJDQ2&06l;Nc%3C0FvWz zD1#ffcgLj~6{Xr*c^4(nwmkW+TaphrtlD$Qb+o06MXGr_C4dVR*z0pcqi(7WL0> zdajqP<#~IVLL5q}I-dM`aZE+_Hn1{##_irU4tG>!JujH|V7LX(O?h2%>Z?%<>Ba&422i~h)`LODfMROp6Mo{+1%67OT)N!BXR8AV3GQS0=laIt4k2+BUzA9zftJsPzj(eEYAw1}w~`I;wQ zc^yS_Hu~Gy$%I#U?Z_r_G66lg>x$I0*X}|@jJw^54(0d&^r&gQN=+7|wy{fBDBrz= z?RZtPO7=PaVzKVh=6D@#)h;Imi$*z(M`b^SNpW{|4%S;Bh!L43Z@A+pzjK`CqKevf zc;#efB!2QZ`Y=4_-l{f;oVkqKTV_T(rptklU*$z}*J$nST6WrH+%}7OZ)&Urhs;7U zcYEic?@hVW9!)$!JPwS^;7$A|(0y@Ro*vb-dF|d!V){R`L-I)&8(B!>nyF2tbR?Da zIopjc?U}O+Y!Q-WUI0FXcdJ@Phj(KFT+XsfI}O4+llPalJq2v*o-^>hxEfBGW#`6D zs*GbtZVo7O>b>((n;o(a_0->=Zq2jsl(b-TMAZ3Nq2Q;q{$`FXxSPy zEpFWG^c z_(s=Hvp3LNh^7N%k`~VK><@aW@=?-HQ7g-1o?ER;TrtBOguJqDHsj^mnCd>hwV|i@ zJ_ooLV%}0?IbHpafByhoZHpU6w~{N1K+Yc_xCKv4t~nh~6>?ox;o@6C%R)YN3;a0i zfmq7BdO;0EUsAq-;hP&m_mddjNf5_x0bjZ5$F*%=Txq7&EiGq71O$)}g4`1!$z1Q(-5} z!2yS;#dG?Xi66>7Rn%lZ2&yty9ZB`BPgU`~%#$NrLS9cZ0u+32TpTGrpVqUVQIJM& zTIJ+rc4fCyw3h6o^Z*L=X<=Merxfui=#H*^T?9;GP3lGh8F|n5x#~Tu2+MIS&2a>~ z-e<><`70c&=nn%vg0p1R%gkf9RF5b&Z{?$7*P5pKh3u?jg4Rzho8*@{%V&}Yryq@V zLYFDeDy^L;yN63uyS|Yw96sqKhyoz>ARdHt;-a&)hW_myalIM0hVwA2dlkoDrA454 zI{xBD)U`{GCfOV=Se!d`;8$7UZ63lIi)vHHYZ!b$2*&2mZ$fK2wIKv+PMqeT2NdblPUy$h7>(t^T$*%8okV*G~Eh!tzOKJebe}nF%|O ze0o&cZl7VO!!?XrcltwRg~6K}NbCpUTrU+ibw>{bU`3#w<^AIvDDRQ$Q;TI#w~ThUZ!8elQk^#A zyDeQPDPcp4bcs?}J6;9&*R7Z{}N+CZ#etT98#=8~$>mtP@V*mjppD}Om40RO+w2IN4M)G+) zgP5cRjzedvkABtL3JNPznpK_7lGj$2Ik7y+mKcc&?ZbML=~YIjYkhGgrH#rwyH5B+ z95+2c^r}|VLn}!Y%*9cFSjgmlbz*t#r65ThcGp(Q6%|ey$3S=;KdoP~f@J$f$Sy5z zH7zez7hTc?0pkWuLKD4u4hmoL3)I}S9 z@^Q+pPk(yLwY!ch?UTYtGHzKB@Sx}K5mgwrjNFoDoX%~|`>EkRdWD3>auJ7T_s8c| zB70j4DdV~<%Dx1M1;rz!FM~%rUG25R{YPDyi>JiTr2;wFn ze&R*lwQ=0`IIGav+5jYxj7t*|ETZ{xF^*46larHGc*It6Goi37(VLyY6muG$t^U#M z1z)z%^(9wGNDDh{c06GB`c#@^ZGR9JmNE;4C2t{oVUs+4E4A?ABI&Z}_<^25k}e|$ zYIY;(>sF8 zc+X;LIN-L9=g50W#Ii)cF?*PJbT7&0?UkG^#FU+kjQ39?IY${ zBiRnn8|2TwUMjt#LQqVGOB;Av;v~^-WR-1|=DACNOD7p*Q}=@U51WkQp@=L2*1~u% z8)$hhA>}#gx6u04_JJdf9^f`3aAO4W2=}D4(_Vj*P_!|syE^#;1yrBn#U(e~u2LI& zTd4yjg9lV1Mv6#xZqHGk-(PB$$4+>!QrQG)1gb!eWXlN-Nnm|@Rp|CyuG#lntbBRN z-FtNF{OWilf>>5r#={vtYZH*m&=K5G?HJS(BUt1%u`IF?BypZP4@!^?I?6*N zLK5-$IXfN6KI9s+FbF)!04P@|t=NvHlG-MTW3p-3uc9s+C*Rhpn}}kK?e3&1Lz1dn zk(1x+Q`BU$Ufo-;jdlfO$^#f;J;%LQw!WI;NMVjNjH~l3i}LgQC*G^-SC)2cjeaD7 z7~(RHbNTlA)ktog2FY4QLc~NzCCAs--nEQ0A-zo*u2v-qis$!*K@EV7{?YAKE_Dqy z*!`;V;iN@x-Xa~pFzxu(cC)M4i6ep5cv$2~Zd)w;aKQJ;&mF3+pB?tD@X0)C*6S$~ zMyH*)`>cIOUMpDBidSU0YHCZU$0nMIb#HKDH!SS}ONV3i9RL*HF6i8?v=cm0vwx$` z{Hn1WulwHhEv|zMA{gWju@)rBAtkn++3WPJ7%Xh<1dyZ->ZBOipFUYX)Y9jQ*sC^C zvw~AJR_T6{NB}cM9x^ROLo{oOS8=QoCWIBl|6_y0XP11(YAOD-ue$JfC1{BO7^d z3x{~0?<9OaJ&jzC&1+=^;$R(vvMg zBTIP0GP;7e=tsG$+Et7KLveKRtZ(-c5C_xS>rh7|u(RXHIbb*AAzQc$>T5{cCAILj zk|-3U3nD~&9^m?(=hCKfZ(*pVxh!)-aXjl|r%UC>7tZ6A{{Z#WcG?xGjYh^YD;ZhC z5*YU5)7q&^smCywyoMxL!@ES-!O!YFs{Wg+yti;0FjLKpe({tM>~ZN?E@WPeuW@NB zhY4*S_W6-`!yj)!?N)5G(|aaAv!u8^KKKDZ@6TKx(ycYkq)H~awce|cWIzI@dbWPG z-TWHxkHbxB#`fdlQeCu)r7UH%xF{5!gb~3f1D>Or#=Uh$pEFnVE)eE+I3uQNL|fb3 zh~tjnutHZGO7=e9m9?SVT6lKPd`h<$6F2XqV~(H0^cB$fw@Qys)DqEbFq?J}jow&1 z?)s5j9FoG4HN0}X$c#eB&5gr6gH=vSr8O?&YmnKS##WaziyO8cWy-K*kZvpK&r0U? zyS0jCx4B18la_vjb|BP_-)ItC#KUZA12#7W?an(>q_?$u8SffKyShaJ+T9p!VbHcu zZ{=2!LT=?^kLEKp4zmapq{FfrWKC&k<)GOpUzvEzDeigbed@rqVB4PKe8m9YxP<=z zbPm|{sG_ou?OtqB`JcTC@*A|YqIm{BY+#R3=~SU6Os8Smh5TB5 zkXvh3a~$pSM8%5({c0PbY%PS7B$k5aY+D&7FXuKgQ;)mf+dNfv)Ggz5Wh{}f`B=6- zVbp(0r(-N(pUm?kK_fGn8}1T%VDtwZcCM&VvN`8fGQ`(*YveOWAcdzXEG+*3G-Dro z`BhcB-58GP!n3<1FT3TFo(Mg-q?+GbmQBndZK_Jb%Z1v1h@Yia)9-Yvh`gOCiGl%- z-$|11(11@xAFXN1WaX)=6qa|k&1__OPJT}%in71Ir}d{^+9A9*y9k|N5jlQ>G5jQV zZ1?L}&bp3|sU)_SMWBsCd5pO%dhzu4r^n(5{LQT+O!DD}IWdxX$fJ@=QFEg0rJ74{ z&BSU~d4lRgg)849rfOSxzSDTK!hEY&Kwby`09YJw#ZRZV<5V8}5iPW~g&ZkomO=r3 zasc!L^`{4srHaPZKQ>uM{CcYV<0Cu6a52U)Qroy*h7X-2s0zv}E~cG1I$$vsN8En`mty zzJgCX_mN2gWh0RK_pIG#v8-vLJ39?B+EZ_LE4Ym}MzNFf6W8lqK9Sf zZJa;t}#4!jNS~e(+nGiMs z`c$5NnPaG!o&pk8RhCaThCKAoPHAr*SfGiajZB_l4H4u8_o(NwqKhiLhC9c1&K5Oj zqYIGU$KIW8w{nPo(e_--#!6Sd|$CG$yL_#|*UQix+_G27eC9C_NZ%;1toQay)GdgIcbS}TZ$ z+E``S?mc+zw;bg9Q7Y<@$sAX9u=!zG(Nt}D2e>^24TXr^o$X%QQI?A2JaeGI`V;zA zcBTtG!&xai@%DjmnILokdJNT>4x<}KEvrKmD&X8KtGS3h0Qb#O@m8X-xogOcn@XD^ zmT#FZ8yVZj-N+mh-l;n?NJmqi*2-K*F36>bz`yHQ;2tn>j((NT>-P~|T$sGp61B8> zHw~O%W0UJ!+JuT2%X653a4u6hAxB~>66P@K*AtlC6XsG|Ay+(ZJX(C($$E`y(wY0DHD^6D3RDz6hnH-XPn$fu|lfT-n(K8y9NN_iC)OvQR z?Xp->DFbJD`4>fuGl9s2ju%2EFrayZICz!>@ucOOE-L;!jo()No#Jf$hY7aijX3e z!6E+u*>CantxfFnlQs3O(-38mAlg~Gu0>Uj3swIBN^7l-O9_0&IAPmp=rLMW_GaH~ ziKn~E8wQPc3}@Gx!gISFv@B`S#bm2@dkXE0l2v#d@t$hS+Pm7g6GW*K0;);ePy61K z%Wzs!lc{-RBQtIR0PHd7D$Sm&Z)ULD}2bPFV=Q-mfcB$-<6B$My{E`#T*7Y{1eMkL02hu_pKkR^E1N~O zXd%01^BzsFycSm^^cdksZ>2MJ)M%_iKazaNP=Z4r?w@l`w-+#lTT4a{Ba%_nZU?Df zY5=u;C7^~sI7v3>!aBg=SR8WMJQMY(;+o3eP)oaONp1Fi>f$*re8t8;hNlbW9V z0~ePR9!H!u$O*|#ILG@()})*4%WU=viqq}G37c_HdJkeLmvaS^DA9&YDv3sSoMZ5! z>G6ouMJJg_8US)~Y%E89jde23EOW*4VP=hhQrPGecB+8+a<#y>VH{)k z%3tN(>VLX3T5B7uh@vHP8vy&893HHv+Ov?sG-(~FNi6OORhfnqoSvlh8Shf0U6DPe zq%C4=DI*em+oX1k78&OUKf{jI1kZP=PNl9PN0V}eSok1t2=o-PI!$uW+ZjxWh|+D? zMr?NVsn*&k1n9_PQ5uW1&rW#3{v7&IbTR=HD9{+ccQO(O+GE@#z`;Jl)4fj(t+Oz< zEfggfVFPsBcnA5@n6%J&K&gU3@~At2Kks|@sU*3zSY%8803Zo%gmEDll1I-_eE_L# z7KmIE&C)qI)vZ*}{Ubip;Nc?`B}Au$(}ADd?Y z@$b^37Vto^!}cK2Z!LAdt0^6aZfU6niZa~lH#&l7laT_J-}a%xu=HGasbeK=V!0NE zPv0^RDBu(8OuVv7rSqfHW;ZY)7J;VWLGOXVI2}!2wz%^bVUT%yK~+@)2ce=;8cd34 zwCia8*zV35{JWULeCvUTGGr+jvygZ}`nJ(T(r zRUy=0$q_)r8Baovu@1VG0>xHrW;9?Na0x@-HXJKzSn6U8JF(osRP!h zx42nVR^JQ@o-hsvtxpkw<8QP`{!ZehuyUu@K9vo&Xrhru_e{8fQW$PyEa%L|-@2{a z9<<^oi_M>6@4#P}e7i^WsVBJ8?WVSt;@V4zC6ubq9G@xxI0rtpM(6E!lck$Xk*IRw zLON%tBfTUtMTR)n%(qpVKQnWxF~DQg^V9217TSHSy4uAH$r3v--8OPtw>^2On$k@| zb@HA#Sm4YMkf*m8=}(&8U|sx$AvW!VFWo=hKU!rKW4eOg<))b@#A~*HG=m(<+!2rV zdv^qN>sBMOxVxDmS)ND)XU#jxv!`HvaZOTf(pU3CBChE}jlpti#CGv9P_O0~j_Aho z`@njFdkU9wkzPRqO5E>uh#1uzf&lJmTHuIdic4LgB;L({NjT~cVNy*Ez0{3)Y_2i# zjP=MosrD5Fts35mVl0LbrQws;9s6R1xXEpG1|Tvta~TN>Z;pf1pXO=LB0{Pq+k)g3 zWB0vAJu1DEy~Vef*Dws01Z=?EPXpLgX6i7Fyn^BUu#drwzrFOOV7VpL(T?7EZYDU7 z?kG;f)71M_Yx}p12P_aL&YP1VayqxIJ6WH}u@7k8Yla)4PF;tvJ!+ezo_x^;6B4TJ zZMW_mbSL?WafvOYHd#d13TN{f(5_>(JACj*91h*;MbtjXi#@Dyvxh2UXTv5BA-!p1 z(dblEwP$gc^sRUaCc|?I&)U6iDk)}BX25= zlWzH>iBx=@$Kq)uGr=mf*82# zw}8g!BNlfYucsAB6U>V`Rn$?=FC&FYJjcw1&T!e_A4+n~8o?~nuaL$@1e1Vy#~A5Z znv_D~?IIUaMu3J?L57gyKQZr*N|5Ro?_}09$dgAN=D8^sB~MHrUut};o^)EgyOQcB zNtoec5remoI&~dQSG$}>_`JAgkr7m#$8v$tk>04?T{~M&_Rds!88c)u#52@mzw*UH zaFT8jq{>=F8xDAWI63W_wHpb_&T(3M2#MFy#B#5sVS8?(P_TZ_<8T!>|iPeyOt5Uj! z;Drf@FYg?V5Oycmnzc8ZB9nC(^Gr${soJwHI4Va>Q>3ym%!@4XxW->#;fWlN!kcw& zzCcMQM3IT|OZ~Ft_529=2AxBETITis?bu>jEL10-i~KTe{wG}U1r*_LdEQG&-C zj(+GhRvXKPw^dOT(V~^|T?fiK5$aF9Te3&KxF2Lqt!|-)@(5JuNcA+OdulY1sci<8 zai=mE$DD`fG0F2UJwN)?+uJE_a+bHzL_+~_5lzfj9CO&y?BuwOWN7}+0xUxW$NsQq zr@8m5LEh@xHnNH)OqH7D$NIDH_|^@(nj~i2+X#thDr)=P7z(alEli)K!}#hFzbrHbk=){F^(h%OLNZN#AB-yNgNU; zZY79$ix>$8a8P!Caz#>XR@91kBZBG4pM9M0szRkU$q555pHrUxn5M^fWqD{VT^S@K zh-WXz9f8MMxeP&66>xWRDv_1|cOI1$)N(E{3c(z?B4VJC?ma~tjAiU|Po~MUPB8|J zk;&-Yx%cl>;If*}P+zm%w2?^)saA74E*@`c+lc zA~0NC#}cdy81o`_%P<6FgZ(O%>>SoLU@DHy4a7_3uI5P)oUeR)(&~3Mu2wiC#9(A1 z4W~HnYa-tE)?^BaB-0}h#yLO;jrV@I^r>DIk_8@oaY&@3Pcs}b@1IIm)H#V4QZ}DZc~eWSjiaV7kd`7%g0M;n~* zKbO|G)Ha!JB)yy<+;%V=J7ZNP?jS|Uhj zrb5^UuH5%EsixX25~9m-95G6tGvt>{^aS>%-b)?avtA;TvM^P4fFd}?2dSu~K(`Rg zut*~tLa5}fM=VVjxLF}$o@fEI4%0G&u(05gdi(KGTF4?)fZPH5!tzEq%yh|>9I%|iV>*VE}qE!?Q8!ZtBL`N$luMmhDSO?sBiaMD7uT6rqTAW$&bg7`Dh2 zLhJ*80QIV{-#o~&PROCym4REGqq#KsZ>agrDdmzCg8n;yFp@?GagK-9sEhGCq;ES0 z3{kwp{9W^kjv^hFS*I!&a|p{4N&f(3RJO6i@tLlmF+v8&w~v{m&t5-Tw5&sSDk@x= zFH%5^%%fy6wi_AYvU^sAy}HE7vQsk2z>N;m2?HlSwVic6#hCLWjY_LvsUPbHa1B0h z6~S+CWJ^fZq>p4#GUsp8-l?X@=19{^h|xr<5XbWcRZizy)O8gbknUy7fC0Rb-#(tyC=%);W?gDPk1|dB zqHv_fG7oc~TBob{v|bYwts#(gaz@ZG(x{C(YwM*?wfSo6hG!%qdYVZr;)Y+b*`Kro z;5Zx~Qghm?m31M>vdqbH)-m3Qaul7;PbZG6>q!l)k;a!h)kLAcc1BEi?nNjhD8M!WbYI{n)`zKRSSC#^h$n7^^W@nPquk!>Pn_Mue6=+Zzi@#JAKHf;xd9lw^+J z^H5!k381=-o_kmVNKgc6PIix4j$3*?9@>XRkisTZplb(I}qU{BWx_z75T`!w-9UKxDuO6bU3=q&v$TN+Z z89TcS`qquh>2YbX!KcRwax*o=XDmSMGyJNga3UWykSwkS7`8(D0ROieC+r3-9@nrHuBhjJ#^l|x<&V(JS{mr#4NG}p)({yd|7F07nl!~Hw>&!LizwdrDWX8;oUbd8-@=HSB{(-F&wb%;~aHU?^bLqw`C!WlvU)B%MRpw zaaDN5XlCO%JxrKwCV7Ob82~RVdV^Xv7B^BlGRURlCj^Xw-iEecMX`q0?QJV8zdGW8hw6S4O-8rj<2$kD>gh^xLvZgG>-HJ?15=A4mR6|`A2 z$(mKYm+a_U%ZcPY2|XVjznwj%tFwA^p11nr|WEg^3q(eBga<9J`Xr@lLyxoc-(0vK+! zG?GZ03RS*VC#7cT`nAkbVj~KfRH^e6Wb@n7p}v+Uw=l?qseOsT4cz`UlY?y0N+}&I zGHC_Hton#WakZauP!GO4RSjnP*4!PJA(2pnHc1?Me}!Vct9&M|lXzO+CLuk}t~q)N0CY zBu8$uY3b*GXs?=AK5otzJxZy_AB_vB$84_-kt{)@T@Uj>Pd3$NM}>jO;|k9vRv6YjzDXSkJ<0x5mv<1v=Gm=XW+y3d zvS1HDeQK22jJrZxxsa$Kxaca7z|+|O#W4Uz!zL>6UE1F-9lN~s<9+E>elIZN-t z##@|^Q%tdz`cmy0qsD;kGAB9y={;&WEatbojwzfu1UslW$g4`*nYlL0`f}Vfl1kIC zBn^n8lg~=Kccxs+5xI{pLt;c6d0yt5XAhU1+sp7%%WMPfTlzi6mk2}G6p!$ z)}_0YkvE?-_VFv~FKCY`StKCf0o#t0i8ZOYo@+a49oi)k7JRCl{o*QkT3gv~T||*($QzvfW(XhPf_5lpH4CKq{@(@p(2S zyy^4&!I*7darLOp+5nN-N3^5obe}S}wN;-}jwNQ0d5p)Mqo?6iku9WXrGdD&cYCyq zIogI&c8^`y=soIhvf73g_R()fVgbj>!@fJ?-m}Hc)G~motCa*J4CHsgt$T^>mdS)+ znS??{EBqtI@d|(sLJu_6I6*cdU1={`-eI&l`EFQeVD%pKnvMLy1Whqjg+F&99(nKo z0PCiyGCizL!7TK9+esesQ46vHUv~_D+4mlmgx96nvA4_Jhw}dbgpT!-VXIos&|Auw zMB>ghevjR=+@5kzdRzN|>Tbee18rnpFh^RYO{b`(Sv8?z<58AJi9sYQ9!GIi7~U9u z(<`78F+^5gQHQNjYxyo?1WUr?q=>)gG?HB3HKcINNLcbvmCkeAR>}z+@~d)RHVx}= zZuT-AtOiE|y*^vlxFQ=#cVi@aHA5Y|fz|C|dxs11E;!9t(j{eIF5)E-s}>^}e4fDi zQ+6UQP1vdAOXoDQEP*fp+i!SmQHgMes9YF0`vgwNyQQX@&DC>}Ol|$%H ztxpxUo*GDD-LT-3D+Xdc0mnF~brGtf@2P;;S+~4o?Ks@a$I}%(fNS(5YzmG*0Wpr; z*0Hb`TV#gPL5%r}o!=;{5n96)vMr*5K|9GDkMXIMT?$mS)OUsSm~W((%tF{01;-fA zq3mlzQPS=7>7%jp31-PS$znf{s`_2s^^*wEL~=ZBwYCgyJ?l$O)ZW^4vbwiS>DtA!RbDLUP9(;C8JYYT6haz8EtC zSSjeIrU$K8ifJw&TPbc)U~oeZFAP2Rb*IeQ4pf;nhMLkdSzE^Cq)eFN7$gz*g>_ng zhODO2%3WR~T{4x}hn2^uu2vmDS%$bPDP`h`!qC2?lWV%wT^MIN8bL;Dh7NIL7L8?8~%))si;iAm32K%G1`qn`3 z{CIgTS&H>y?~SDP6|HX=yCibNcRewl=hB-Tl3mFq-S?L$jF0tcg%~&$q-5e_C2=jh zIbm^NvzPLNe5@R21B`wYmbz?OWvsV0?j-UUga@HH?Vi-INj{+wl2!>C$Z&Iw!?*&p zl@HO|=6sgk%Grsz0R&PUU@0?k!?56!Dna zFd0uqJY%&Mc2-Sx&|h5wix~4IFMt=&`kK(uq_ojiPc<3Q+!=`#S%1dh?dJx*aEqD%xi)(>+4Wm z#phkDmUizl#JOBQL5_3jQB8SwIeA*x1Q-b>KJf2~mOUw3{simlvobAn%Kux2{Dp>T8Y3Z+HTpitcpoE!u9m#pA>Q!6`C?YZq5w0?m7FxdV11Iw&?97PRSv< z#Y>8BQHpL}7FJ7m?pi^yow@)=U#(cw7+h&U7Is$3YzG-2bSKiQKazwaVD4OCbmUTq z{{V9wahVAWa^(EKl@7o$ZA)%hUm@28h~#?@rC9QTfnzeSmK!D@K5{YFK9u`HhW;ye z&RpS?{{RT}$E{!0wCi-X@}0`C8>E#^0ba#_!lB8OmCXBSBDlDD3rM?gRK&iXm1){> zBV4?Zv&^_G!<-I+rdi6xy4)j3V#E)-8}aFmwN7~w5T9tbC3BgEah3HI8pyToqHB9A z`@s`7pwX(f@&cZts@1ri)%V(6Hs)>WrSZ9kxam;Z>soXcpusA$1Au|~U-31YHnD8i zFi!l7c0Ot^Y>vN5T#iMmk%`(Jf9(p|oz{`$+r*2xWSDQ1^f)7odS~9EpHi_&%&}R# zQH0#C@&dU%#d6wqv6;=lw;M;@ApEE3D%aYM1;Wp>B>wI}klv%)>sY!eGeuQ2bYfj5 zL|bW|NFB%TosM^R98xvqyehXd%WVinD*_*syL$2b>ztDP=ap=rxdGRm@}3yug(i~Y z?N^B$l3S>hF5S8OGAezYht7+#-AM>}k<~YLb?0?Zx$#}awYjr`({%4HOw0gA9+;~- zZiM%DE^lWdIMe1=Y#&Sm>yGr~(6s3$md%?IM}rA1oT>Hvs@E)c6XtsqELT>%j2HsL z8JFi6&g0+cD@rX8qZvHHr1yNEt_5r9$sV0*wzfhcb1PvC!{*5Ck4l?Y@@`6%RGL*l z<MZ@zDEHbsJ+)(^Hf24b<%in+h2D2&4>wkK&_GwE05EA!ldKGmsCjwP@-PG_pw) z>I66&$nWa49LC*jCOU1V`JqgS0UQsfb5^D9k;<+*YZpzI7gp{lE+{Rj8P=_FKZl35>%9s&5fmT+?s9Xs*}AUX>FM?2w^Z~n=d(3F-*GrI!m3hdWyR!k#{15_eByr zc3`+;kO>6+YDw%o$kf3rVEow`$UcUz!KUfAR~sUk9hBuHJxIq&mJKf`C13ey$6!Cj zk4hZU1qm}XGzsq9?hhKj-FF_HewDAM*e$9nydq&5hGiXi;;mX~Y$P#-1)Xq8yU7N7arAK5TC}h;8*=&p$GjMb4YR%T8X9d$Gt;CsR1%nW9zusEpo1Zp^Oj5Cf zs#(a6A=xBM7_*spKnUr_dZ%r1X9GRKo;Fau$0fZ6d)4dBQs(`d-s08ejineds2TUo zNpImyPv_4YGLx9{n8EK_si?=^W^O#v&@HcC@JO0X!iGz5U5bz}dM~-CmfG^{MfUAd z5?3gTu;m!~n&|ZJ4XeQ>%z3e7NbRo)^5bJEU``t&82WoxPvPGSSZUv9c% z%Lx0FG3B4WJq1l2$%hUl+ZwoR4y=2M!linXHjOw(p?6o)^iM8X7B`d3$w3=qGM`^+ zr>ENis3Z!oDuJ1u&OEXzy~d&xHMxzvw~)G~c`kdY{*_XDi*}uC?&DOJQUgZvU@$$; z)2XP8B+6|jZzbNFZ9ddiQ$Nca1B^GlUAn%u)1i%Iea?7ZdYa>G?ru|5L8nG$i#sB6 z`9(bEll<$UvbVW1dD7akSjO)=IScftsZA|gE)s3%MSZPm5#D`j*e32chh1uR2T41I=axVZ$qyA2B|k;ZK#GYQ-XiSs(6{rS+OcnMHGV8(M8)b?`|PderLy}5!~8a zqQfn*hhZhwNjDsm>s9qlMd4&rLBTD%Xe^|T)e~LW%!}n-38M?PO@r65KD8-IO6)n3 z(Hcs!+mS0KNj{i3>?%D*^4>V*xbn+L@$Di;=jHA_2S2T6T1_REo#sm;w#i$}o>RL3 zo-jU~Q;^+ULa@mfn5xCZ#ykQK@}t?i+&R&eu4w7vG=x0PvK)@M+6d}B>c9LVwl?$I z+S%B;TicRLmpkTT*Kp{4zLleYB7%Rjt>ko#!pS3Yp^kqppQS+)!7a`hOXkBMX58dt zdaw9bWMwrQBblVxV$oz+BSR63V>Z+Wulq)--sy1Jyi(au6x-POah1tN-t+bLr_Vv#i`y;q=A2eb8Jaiy(__qcY>l|!W3a62*11^a zGsvU>Rpmz8f#`i|OPKY4C0C z*)?j&it376%Fk3-m+y$^?U{VFuMdx1VvGGJ%t^f~QKLYmgX z=94ie)-@ZsR_a0;LYP~0Tx>q0wrP@ScRH@yX)h5caCXG)k2Sk4M^CM4TQmsjEiHj? z=gW=9%no^`!mS^gw(y{kADk83!2bYBu3{~6#+l%~D^9l;y0ngrjkm}jGpQc^Da~&k zuxY%R95Z4xhzzbe7N}9a%W}%oG?Ez9?GA7UuQcc{VP^BzU_l!iRBoK}xO;lkH73ed zL+{^Aw?h-^PaKZ9O_Cj|-Ec)_-fLsXP4`hWh1kg=a-)vojY8HNsSB)&a@Nbe+AON$ zwtZ=z*f2aS$bpIZq(lVrGY*){x60#LS_PFx*kO1PpWNDqe#lOK2WdnrmqSCetSA4gnpAsWln32$y2o zDM^&=2cY&N(zZ1F3mB20W@#0q!xGsf9;e=uSJEt1*gTs_8zb`^{+{(5%Hy*r#OviP zt4fAO!CmK|{^>odQrg17WH!lgVUVdMnBXfO;0}Va?jUW zMx`o$95S(dg$ph-?d?!mtKGn}!4%QRUj`{i`ElKUt!o8jOWbtwP906m5~c?K05dsd z94kTIj)NwncCeLHR8mNhxPB|8he5HNZ`E%Z zP>>^4lLgrI+m3)%jf!ZtS3=fnWt6gQ^D~mm+aF5GSeI)=wMk!72E)S_GU-wqs5U~G zJNEp;p4Fpa;cJNyU#hfG=MKew@azxssoLe_b%yg(g)QQ5oFrtBx#{(;U&LP-mN@3H zw?{y(Rx!uUqtnx+L=}44A<5FFuG!Jg1a|0t*6AE^kT%B0ka})D^@FQw8Y0>YhPvG} zGnH0JIAhoW*CM$W*1Suv-7W2idiM#Q?Tw zpI(&hKjHqZEGekTC}affk%2rO-&)wyY^BmQBjw$Vv4vUfnLcRSuHb7rl_41N#L}E6 zDPBgtli{e02KM6Pw)%ai!iuu4Up`;`QtJR<@C>U%(x7h!}_E z_wr;ufcE-Q>K5s7HS@#piIQ(j7D4t}u2-pYbZovNlN_tAunB$tqY|WoE!T>@) zya)3XliJ!`4vy*Ve)(*f?WS`uc7%(6zp zBnRXkgw`GAr9PhMvfI3i7%r>7q4y@XHEY)yzPbS|wt ztsxt-Wb8FDsLYW<=2Q-{`N@?rzCP&pAFVS`@cdEUO{iQ67Ipx0E)`E=R+)dPK9nC( zU1r@RwRJ1zMY(2DF}IF~(E5+Uv-J-dYWno4Wu$3wHOqX`Nh5r!o}gCor!Iz0aoL2| z?PSR}nu>cbz(wX!j7ixufg#lF4%l*iNctwJ=qlEPbLyjGNBBF!MU4% zI6NyK!=bJ1HrGqlt)-6kMS*a>S&;5IA9w->U*%9*=&(i_Yw4Oc^6><69(U)jzZ_M| zJra8upp#FwK4ez~yvI3JBy+_nG{+dTLM<0cyNsK;S!~7?e5cs?&wo=@wJ!}>Th8#c zgrv!ZP40IqV~%@dQp;_t-A)w*O$nGj0{p{{K&z9;?|ScbB+}W&phqlybKM&}{yxT6_WlL{k8Jgo~rK?xbg!T!;!!ezUk?6%NHDu}~xg}CX?YMhfLy~u%_NM+_bem7^_ z_Z4_d)~IJzR9P1jc|$u7TpvMAtDuW5e`dj8vH91V7IiE4%QB2)kN&-6c)I@X>d1>Y z3Z~yLV>jObb;$LtIE%zo+^|yUe51D{em?b)sp;*1DlM(v;<9Gq5~p;0U=iE!rv#L) z$0qG$VqU$(cH(=7Sp1{_z~t^H9nbZw@vcDxkaz^nB)fTMRl@#KDkS1HBCYv zv_4s43P=Nvj63?~q_g;4VI+#;!5eoa6c8Nao_z&$s?<{4!P2Vw9G&#qrnhx;?K4a~ zw1|>1fsQ_>+O>5501PAEM!JHeo=TxGu0uKZ&uZ%5!}fNqHPR4o}?CfJP&SKcXU{??{6DzG7iebet(rz{>6K1wTd!4 zrd`55r3v*um8~wL7T>hbBteNHKn^emK}lmV8=5I2pL*{g41hf|*w+_4)~4RhFF>*I z>$3S$#9G=#D#kDaC;LGDTz9Q0Y`)DDI)Bz)B4xuu`Qo*U8h z;3RZuK|W-X9ByuS1F#;w>zvmly}W{ChHo=&RdC09k3s9jJN^*6i6yt1OO48@xuYY4 z$8*}QFoyDE%2L`WntvI=sa>ov*~qUXOf7t+!pKx*v*-ZsYI|wtn%{l3vr8dg^-tBY z>6)fAD_eAuI3rEcDGL)hA%34o+)-OB$W}Jp5y<(^ zPEUHC`WbZy)+wdLvmx?IWDqJibn91iw6;LIjv`*HjgE6$rjpdnrpc^jx--mSE{>55 zDLjYIQT`PyDR*%a8?xbnD)PuM2^FVkksDDZ(lK=#7ibDe^*+@DsugI2#N#cTXAS9& z)svEY7iVIS(yVO+lFY2LN~aTVBys$zqL}PLTHISW^B9=RNs+hI*0Mz*M_c8=2R=#; zKhLd05~ZuhaRUhh%Y+2vilr{%u|2VXqq5vQh-3Z6*672oeW{Y!>T|Q*TeA6kMr2@4 z8njy88$?TOK0zU6C7Mx;6Vw`I_lT@*t-PBxAjScbX2#WS`2LkQyDyf@Q$OswrI4D^ z{_5OtB*bWUh5qXg*FN=KG)+$S1i8~~-N|xHjxquCZ$ar&CZ}a1t<)HptL{#IX7vZ! zq>}zQm&=LTDNKQ$IOWjl$y7WQ1Zuyx{);O22DrZV8GwSV~tQ zDDHb=vGp$zSgq^5owT4vK-w4`ZT$U(usylV9{aaBJ!@BgyWr&t^AM(>Z ztDL;nbtqK*i3$;%AzoM>*rx?&prr0^X`UX@q5^64R9R$PITI4m`f=Oo-k#T59gVYC zOLC$e>^$ht&A9daO>-U^w!hbIq?Y>JK_2ffV|=IICb~OqJ}V~sJcxkD7*M0GDatky zWL{;%#FqjQ69QHhW%;&_0Va|yRuL0Qn=TIWj2*Znb^3Epy0iY&lkAp_a|BRledL4? z*&G4%s#-RO1R8w*0Pv8{``4VR7{<}phWvZd(ID34+laPX&2(*~R74EIL&hqN%K)UT9TK*;OQS z{J#on?3T@2JL7#cJ7kS!Rpk(E+5pB+YR{f{{{Xa%Pa7GZh}{lCW3l@CRTYlr>i%6O z;7tsBfs0Uq!BkEKPM#1FgywHj@ZM{RcH zN;;`QmnAX??g;hws?!OhnVC~_s`TCWSNp@>wv$UUpz~sp2IJ-~aM<>#g`K^WEe+L_ zkjX0MBF~V^+a{qhxmlZ`SzO6xx_PrKo0>+;WB}bywQp(B+eNt{3$(5b406NUKdm(e zon|36G9Cs??)igvA3@rmHOK@6R0@hum=^($e|m{F%Syr|aEY4Q;$l%(dNLoEC$&)2 zuG;yS`xB^6rwmMRattH3WUh~T#j`;F@ zJA2n9sA^*RSfrBbRY;}z)HwjD>PR1Z2dCDvbzc-|b~4Rz6ydHu>=2nx&NJ5-$4|zs zVC7K~>qaMCeXPfUBS^@oyM|9Be_F}D@dO%nF0SXA80THmh0gthoUiy-6?fxkhUrbi z22#d0W1WZB(*x3~>b^15FOja4y~2or`2bL$dVOoMjse8xo-H+@cg4Opw-*Z?k{5~j zSC&kTj5*+c7fR=i?DH1$E%wM*`EJj_9f|bfppQw^bs%pp?HS~hmWtgM48DZ+0=I1Z zAtbRhmrEkFk>QcS3P-hf+Lag_oYgAG%(0o>*{o2N;Rs~h#zW~^a_HKHq~}aFY-WZ} z-hu$w#B-X~y6}zdoG{(nODX#}42Ct@(U3m)K7zEZd^;p?Sxawq6Ee!i`C~)5fgCnZ z>s<9QP_~A!!^^3L-V{rM>al?D7tIqKHZjOQk4o8x!w{b$Eg}|3SJdoW3rwaDHwKoS_l;t zK~yBE4a0ho?^-t27I7p}qS9yJ+p>kXnEP;eKFP44 zg~FZ6$rb?}@!vdA&@?plZ!b;@e>K8w3PPwKIOF-(DRn*Nv}_7V1S(nKkT=S5bIyZ4$}lvO z>eD2RA@e4D`Csk;J-^1U*lR{eeCs*lcp@bt+tpkjTBjYH_qUHbTr-n_1+;6AC)APr zOnrWpBz_;B@=0{L3aZ<{9C>4I_GaZyKRWA@i$^MLGJDN-dEJGs8g%2!W%+k|4_e05 zOgfZP$2G}`nj$54IoeO~`+HT}?IPz(fZa->X%W;2qxnr&y}Nj(nrq7jKyU~EZT|pt z`kJUl+X_;BN^{#u1++G>TFecsTas2Ftl*4bd-kP<`I13)i zynizDz&^vj(y2B2PjcRLk;f(pRoWC5&p7`8JXc&5)}}4ku=5)VM{fjlrhTbZ=b3H;No+jG;x0o= zgTj3)M@}sh%+ad)fSTso-2%w7NOw7WfB@)fmZ7WLJmPi_B!R=cNc(pI#xdAcc`yE9 z0u{6uXM0>vgXM9Oqa8mAuRiFdYl|q%gUbx^<8rsC`csWGiImAA)Fi#0U$EIcP(+}z zG02P)$>Z-aJxxur=-EknwlYm3a!5D;bO+k132a%u(;RF(xc>lpq3}oe)2@O=D?xO! zi2~)(Uju0w997v9%q8TD6fJCzv5aJ|83R0$eN9ol@)`WoCf7*8LIyw}b;qgxwPa5c z%jMk4B9cYLx;t=N{4qtWjv7d!j4(v`w;&)n?hjG)r?C$2VyE_P=AS%rUIdkzFEeVA ze5{TYyKl!_bUanhHv0M~{K<>TqiR0f6;b>r)ce)QG}*3g);pM4US&B{`^rc055uUf zO*=#rp_G8D1bG1Q&Tv~boT|kdLY$e9bip;ecMEkQpmV~p8Nlv+D_$7VJ5zCDBq$Ua zw*cAWwtDkgQRzq!fCrWj5-H^SROZM?B#tLY+EKJ2T!r;G^{!b}xx8uEsbyxGhM6=o z6!PUl8PIGX=a5fd=~__SDYTB+Z9I*+49wp%V}L!W@mm7Lq_vRzm;ek6`hnh~mU~&0 zAPD4Vdn7`7!<;pX5G$mafeynPl7khy?f>y$vH?SXyDNZTyuG;e?O8yZ0G9^~uTWQr*f* z#g$8V*-{u-?o6_?Wq#dz0%{p|)l*`8iUgm66H9p5~%9^308t*auZXgVU{8L;?tizSbeP+&;qaNwJz)vNkdG z$EW$?w1hdC5}zr(ajRKd%L_|1kVahZnpQcBAKnA>sx#|CTWNf}u`PvVIo@;J{`gW=9?XF_CiWpg*L?w*R(Q}NF1#j%56{(lBax3dPwx?o` zX{1~%!d$e6A9SACYPVshU*3VaX0>;Z2HcaqSa46U@9$60w0j#nhq-0nBcXnps4CQ|FO@eg6PD z+gm$rGS~%FXv*O2{t@bZPJ7jhjZ(_q*T{||gOe+(V88n{hp1{&YBvjXq${ZTP;_uO z!2|i!Cn=gVqH0N~2<=YT47vXRSjgWpsQUJ*6Zn;mq->x~k~|=!WM_Zl+Ow>zXTQ`M z`JO_hmvz45!5_pi(0Yp0w$R|Wz58*OlOW7|o|Nqv?kl!Z)K>l*QFArll`~J}+#{de z`DAiOzrAVLX^*3%HgJzHOv7r7a50eCH4e3=$9Jd86wzZc21Xp<_7$-j3Efp?S6G0- z0|hwmQ#z51bS^M$>Q`G+FPR$!D(6g$xnht;=#kjWm$OOo&E|$)I%IYq*126)^fgc!BE;&b$BD=8B*u0e zbC2+(OI4ET1;jE(I$+B$Ko_wdp0%T68$zpjZ5fdxl$o+J5&gY0RW%!!BM@4P<$I}J zn(YTA7a0JK-%8J!mg11xJ|)>CLM46@RXc+W^)$~SCAN}#X(yU84$LvhV0j}w1rY&( zBipc!L4^VER~=8&+N6a9$RM`gE4d;vt=RtnDlQ_nUKoSh#+#!B)RDgNr(VWgt;m0u4H~D+#ClWhty(Dnv$SZOs5=<$0Q!&f#WyuAfkw=?9G8+?%)VO4 z`wr+Cc=spi-mJc%_8l+#C|^j{qiBvBcPoj1zE5C1>ptRRX>8Uv5<((Y+=_lzk%{DI z)9X~Oyh${6GQ($RWLadxBC3{k@5$}&Qj=qHv8x}9HH}8bTMb2Se$xf_lrIuOnLKU6 z`h9xSTH!bSjbv1RHH?xm$#(8>*n3u7V)83L?OXIBA3MobbISSyj<_A_?cLUqBufsE z&vNlM%?g||wmo`^Ia+oXHOrRf_E}|>?k(+-7}eZ5ZBv8X^vU$A7Mhi`7an9+HmD>3 z=s*|0TthU8g;Gz<2*>Nvvn1B+Vt=#RE;kML7SoX1PeP=6W}rHS&ZBE2qW01^-c^!S z;n%Wp(E3wJu;)g_-NmK;`6ENL@Y5q<8@B?obxW`<$dXl!z#$o%2ngsK9jiX?TDFD_ z&8Wb##y0s%Pwr3Cr!_@&_~zTFTB5WOwk{op;73je*0!fcax$H0qV?0yBytA0S1Shf zol|appX`p+&);hDT5UG>pha{~lx0ps0nRhfew8ka zFdoL3b&I`1c^>WrYfICz(o1(GtUifq^`U8}Szb?PYp|P3F^KP- z_+~wL?tKZYT#{z-gRz^Z+fS;^1@(j%R>s;_N#=Il6v@yjUgYEIKN{Ch4_ZBkkk-u| z%Q%dO+s^A0OLykO6s%w{N4E{{{o_~k>$#F)Z#JIMp{1L;;0BN15~d9Gsnk+9AOIIRfNYo+pAdC{zy zB2YNT^QbLt%yZ4Cxk+W6fb#GIB^;&PV7&e-P0Fh>C7bRW*H#~s8GHRN)_Jh8S*hL1S|jE>;v zzr8x%Ofo=Nv6XPoumn-ueQNlz^6kFYZEXJlW4Mp^(#UhUyW`X8Qr*U)Q?$~eR@NdJSaJH*vmL~;A!y6N3IdRD_`tQ$kBr%kHq;1rUbjEt_qhDhf*=qe?<8_|q}1%10i{J?*AKh~O;5yKl= zS=^U~X-S=A$zU^_WcJVIE9@Mbd!Gduq(0tAFK%UtXN7I0!k;&@1JBJ-CC$v2j|TLN z>;T5=o-@G)qqvgp?i@AMvu<*xG=mu*<4&EJ$X+0U6+)JNNC1A6CRLEln1QByc@wI~ zy|~VP@b&srZfA~Pv_2MDBT&*P>ixFku=e(+kM(ghOSojTYn+UCBBX)lx0LEJc`=2M z5~X(%JwB8d1bkZMwDkRr*U9-8T6|ceo@4N zH$u)q^2pjj86e}J6;0xmuUcza1dtellqt~v0DK<9)Ksb5u0jn);@ZXn_aO*;hEAAc z(0yy1)X~#UXv8fbmvE8X=gSADUWc$XyLUg?(XFoH+KJ7i#DeTkRs-9hu5(joNoHn( zd>GgFvi;eV_s99^PE{;vP6Z88PxP&ia}bP1is>Tc?E`_H=cii4YdGYW&6XvGQ#mX{ z-O%Lnb4-!HWf9#Ai_21GSpzYY=VNxj=m-?c8w+Tm zxVnzyc}~p26g;Wj^AXr&^H*WES6JJBN7xiULVamOcJCF|ozmhjnSu@iXRQLcUN{3R zD)?_YQi}v5_k-NjFx`t+^R8Aqd1H2tMZDw%1c8z0eQMNhH${63nIlO*deI-79S$lV z+?#1^@1R2*?nju%B&g&mG+a%x-Q3@48#XISBikIvm<)Sy{HYe=7-f5nLKjw<0!t0c zU^0%w(yC1yma>{5V-iHqh~<27C#SVLh=9V25B7zZ z`naTF3>&g{4t{RL^VX6Swvtf-U*cBzt>wlOetu}1o;c1Mw|ZHlp47%(HdvM0a6O6Z zf!?i7@Ea7<WmuL0apa(6O{AiCQ|@YcrnZX1?ANzQ5uCGu z!Q6d4s#tv6h=t3;gp828SOdoyC+Sq)dtE{%z7~(4H)Jp~47nU`Ut{l0YBWo^kvEw` z0g(~MEB^8RDuOWpNkE;StHnNe-=0T5l}T|an3*JFkU)(G0AskP267P!wpos1Dgno> zBs&ainW35~?G*z67$IIy9D;ggp@_!mxnX5lCvDb@IZ}F_JxwFErOd_SjzxrmlO(ca zH*8ZOGfNyyyF8&LJjZXF1Bz|C6o<_XLg_UYdhUV8}3Ifw}5b-``N z=01c9y{FoPxgv#uP+g-8OG>%zo+%PLi5e#m`AFmUMWf^%<*IJVu|=Q-Jk}q)MZ{&! z1Y~j3(xrkj#A0=ydCN+J1CMUhsv(k3FwU7kL6j4+L7Z{uY0rCb8LhPNyhVkZ%O5H9 zG`X1UO9Z855>IZjBNYmyVL<+$T5aSLO?5S-_Ds9LB?tj_k^DY~)||}~hB2X6c)muJ zzDZmAybqLmRg|=rOLK88grpI%mP5j0xb>;MhLM>K+*Yk_ffHm;m;){eJ;%AI5?JH9 zd9AY1%7b`z5Y$n_idxP(u^=DjNI%{YnlHf%wX_-t1VL{l8clE63{>y0}nFpF4;NmIEh zHW|)4XSFPHBgvMZC+;6cZopJ}cZY=caWDZGP?ay&mZ1mN*fXx6BsB%n^ zoTlJ$pK6&n^cqc(eU@Tlxse?LHxcKj2RZepl#SwLX_L!6SUkdTfH`;m)MGYuiIHSj00%Hx^#KIs;JT%TX(}zUPcUn+#_-et7jhr{1bu>F^XX z7gUNyK3bj$Z1P8@O=@{_&n`no9c1|l9OKfd&wFiaF)3*58Sd2%A@OlNKQ)bI^K^UqEW)aAWAkCZRYjz`SEj)tjQ&n2_}0A)Nuo)Tm(I)(T5 zsV)!h=44+etRbTyW-PB042cJ> zD0jHiEDJ_+G*elYVynGYO`{p>^r=xHw=C9d#RCUzgMfW0!sX+VJ0_2E$$`9M2abf* zE4kK4S~a+6<`NMe!SX2o0Bh9J>#1vDw;F;=6U79@S~n-J3Qul3(%#Q;Cj05-LZMYI zSJeKF}($%+e*;w%Q_jPU2%-mA}bZ5S4@$R(N7tg*XrfxF}Ip(YKh6D;t}Gg_(_ zAc&SkJ9dN6`{JU#luoj4xsQB6ETK+A;PFcwlUb|~q)NV9=X8s>F#2_-q*l|$@?FLI zmvU!#K2R~x`Weku3+jy0hJAzA`@wATE{{THH+ODB*b8{WEc9O&#VI1Q- z@y>DEifL*l?uxS9u!Zej1ulntgyEzB@Bzm`?NO!G)G#)0VUW%l3}zxqfzX0|sq)!8 z7Yc4O1dOVrN2KdfrqDhDhQAVy-dhNvaau$0Qdv(5~5baTuCB<_6B@ImbTKu%wXA?RP68$U?_4JOSy?r)q8j=Pto>Z*a=i z;dnb(7VqipOlvEvi9^LEB2_IceaQCr6qb0D`I59iAtBiYHw^lE)9xhl?c<7b<&Ev- z;C$GrwTG)FSYh)c-wUXjK$vHd7#)7KrDq+Y+dz`QV~R&_v%5b~I}=db+X&`KuOtZ5 zBCJubKzk|lC#`7M+q527xVR6qa>_PgMt;84jY%6qB-W7qwn*a^?%;gNbAp6)`qOP% z(i?GiBoo?5(mKf08G=QH&-_i%X2!Uh(i#`oue2W zcQuXKrI6`jyl7DoOot_v_VSDFJDPNm+}H+=Nb|rZ1z(s0&*x8uZ?dPHC6QR=Wgujg z^;&$vl?B8q%y!~3dYlfV`p`1GH&~qMY@$LCwmhI2e;(MUExoLlWu6IQk)Rlvq{{Wc zU#(4RY_`#u7Wr;f)AyNPa!yL;+x+`0AdLAF?+KE5;HmcXqT;aYw3^xmL18LSjIqGM z{{RftBIzv6E!Or`Tmg<$`c|#OE!xNSjqDLX$#1*`Rdv8;5~(VnqOjnP>yOTwVPh8V z-tu_bDJ+^Txn(Vnok_r|7P>{9t%IY`MDmf-uF>iC`t-%{m2HWMgy;_L5tS#K9%yS|$ zGsZT@o;`X~8t!>r!`iHmDgdb(fs77^+Nx?daTy+1;F={>RC|YP2P3Wry;iuoxPfJt z?D9Z}frHKWvFbgmRE(V2sr{fN*qf2m{qU!3iH}N)`(7o9R|U>|Fm(byL&5L|rRWMoxYB6*u9KWmmk@JOr-MNDUs zqttuTEn^|XF-W+8=1AFc-22wvg(j4d#|Eurz@(mT_%XOPIuq&bRW*t2qqvS;IYfbS z%HtTx>}hj5*sfhJLv3emvLhO~Sls3|Zn^89Z+cB?&rgEoZZx^1SWX7wypA~{qZbU> zR&rU;ZP;=6RO@p3l%hX10VE^je7=}Il(j<9qN7U#xVMT>!BZsRu?a%SBW-(~gJA&Y0Cp8(I3h_zcOlj(2G2if!nqwzIuCkHtBpmGLjZ)M zeW42z`_@#*1G1lbvu$i{Zb^WmNK|cH@VNG?c2Hfz2(-DmfmRcgQ4h@_J;(n5UZ1Gx zGwB3GlmYmc~Yf z33rHR1JncFp~@>l(r;4=FB3=mxNoCqqe4xzz;NBL-lyEt@8PzQ?eB%5l(d;tFObX! zU#GQIme@q)Wwc~aa&mK(JxCOuX|s^4!ePhyrSmr{j?BK99jS`!&=5^5j2blGycnSa z85s7Zn)<@Y9y@yxHO2>?j&bFI{3G77F15RbXS{_S_DZZ&<8rn;Q?i;KADzi%#B zz-J*j3Pu1p>qUXhBssMQk>+Tu#8Hu!QhszFUs}o4ri$=95k(?K6P1ktaC^sj9+ZIbk~tNB0mM8o0tK+{ROEExe0xf*~@<7`9BDFVd&6p6bp? zFKj_o$M1c4Jbtv;;StE5d~&R9{9V`I-lqEvrS*iLYP%2>1y$Lxyq?3<)jJU$VfWTk z>-PTuY`v6&678EKX&`hb=~UXuAwZ@w6>0 zuWmO8h>}6SaL27oVJ{Jud6*;P%Oip7%?>F7lWdl2eL^KvZ~`0|NeA##=~2n3TNxVJ zH!>;YU~bR7ZQ6KqR=Br#?GELUfMFu#iO2As!kPa72*N?R{E(6d!$^9cQHqag0=<;k zlV>ECS4#qr0BymTa>LTKn?W#$&BzJoG1^a2#a+_;FxKt;r5Ol(&B6kt$Uy2nv)Z*1 zBl1227S3Z4FAtZG(Q(ApH8wJ~jUN06492ize(T%_Zi_6ORcZ3b6h1S-M)Mqs@U zay`kehQ*8*rd>{8Vv)9+pD*Q&M^o*`6*JrHlYDlpib*M)Vb`+{uUg03NgDe&*um5M zCk#&8Vhapt9CAsMu}t?hu6!>sz$+rSj{|V!c;FwUYS;}v-H^?JZy>^iJeKw~YWD60 zRJF02bj-UNQ~v-h2e3YsldDovE;QhgineJTs+)Nh7}TFR0Qs4*jFZ?@km=AgKW3B& z<--`p?pS)#$2Fo$v7D@%u_-5vdSb3zMQJQ!Q@md)<}8$vM*({_JCABtY<5K`G{(A! zvs|lhU7{s8WXJImeQFr=m=@_FB^8zOgp2`G*k8^pCYMsUjLU*cq*&a!?dSljFK{iq zu_OXmZjZ?~amI7&ifU3rXXFm3dFY)X@~=#M+6{S$K`C?j9@I6mP&qM8Qw5 ztyl4;p=TtlQTD3F3pqb1$m#Vp&P%Qt5)*cUCUO9bwp$~nYa>_j6j9tw6yebdg5GB# zzug|SaiaOIL#nK5UTUjzGb|QzD*c>c%MM%9+NrhNGcVbL?p>gHfahcP2kB8*OFiRT zuE$8OB-mYtDA?c}bkAx_%USOk?EJ9|amR?_jC{d?0%!=JX`@UgdcMm{2RX-~F`eP7Qjbb=?Gs*t|8r4k=8Yu1~MJTx56p(ow zlU44;YG$0K^eH~5)^Id7)~hikyu^?K8Bg#Lih;E~QsgUM+sIY2Rao@nzp(z5vu~rp zU?&zv7nH8y8EwTzd;8MIZEBKp3K=KLfbE0FBxCcWryhXm$?j#@=@)azZY~Uge6QU{ zlgRGF*0e43sBG?k(q&!Iz^&#WAwWK!r`D|~Hx{GJaBahF$_=Ggrre5j_ZH?SfoEdC z0T%AxTFuH#)j}u+lJUl~Hwlhp10Vy~`_$GtV-`e)&B~YDCIB39-1-X4n_H539kl6{ zT~5~wHzQzRfKjJz{jIodO7t;Lot`3B zAo>pVnhd&;JP#(xqX-bM%oKIOrrTK!&c0mifaP9e zoS$!MNw`o-3zcm;u7(huFM$A-Wi$nEZHI_5cUW-{DLu#{21aq4l?70?YS z#j9_Gvr1S@dKDdj{{R6|Pim|@(Hu>+e|8;51EybC{?b_tw`VUj}q*ld3vB#+yVx7x6e)ByPdybW1Zy8g1I6_-&{oU zd5*;aEiTiHpIWzWk<4M5@^1VRyEL z*_4pQ4t`&8L=#L{{Z7t^8Q_^`!p_gSh>D=6vrMz79|gl&U-+#-nI0G@!F%ha7@XZ`NeuwfmzY<0(_Tw-S_8cOi03!G(2 zY!1gihq6~u*R+YAwBCu#3pL25ELXT>aG_{G=IgZwT0Vk8| zfm(6u=>%*40227pHC=>Ac|3Kj=P6%9T6EV^fwY#~iLmO?oytc;^{2o@R}JP)h{puG zFAMopliWOkz>ydYxep=7%XN< zVx7NyCQw3-q+tG)DqJM?iuqWfEPQ~+lb+e9=zbBlw^%hx)lmqSe5^s|0|iY(s!6Af zs~xxQ6^kfG$V2N{HyKOaG)dc0QU{tvw}eW?NX&up&!@d?$Kky`+D7|qxsL(vS!5wp z4}V(b{{XdMxQi0R!GjQtl72)~&8b{@YK~omgefHF@NZ6(N-`RfH-6iq`As#Yt4_sP zV{bEnx#)cesvIH~4oXjd)S zM$*U2gUbjYMLlj?aKZ2Inz;m1Ou{RfA%%ue9AIFE*LjAJz%&6+4!zinj_ zAi&RTR8m~aYKT<=vmp_r+>$ZS(#5V$w*tn@GPA@OI{*QY^$YaHXL(;kYb3Q9ec?OU z) zxi!7$Nr}ed#aE*q-%q7$P7{{qQk+xJ=orgvO^mk1STSiQe#855+?gw*O8f>>}t8sTe;uyTK%0B3;wvjLqx16jeLc%lze7>XWO~S%cxh|)DsocV0 z(&UUlz&*o-=bnUme_ErZCFG2asglXO?g_@_9rt=x#Hnoz5nRCoFm=P+BMf67bdT#< zw-MSzqB)6-$_lJV*aY??(uJb1JGMhMm!CD`KQJDjO32h# z?G}VZ8Ihf~DO1$?gXvk!Ud-)VtVFpJ?p{wFD@fD1l&ZAsYUwZ!cd8)|@=XQbK}U5g3oCIjvMuMow+J zmalb#eF(C*a*mw4Z3LC}rY51e9uYc;avM8-WggW|^h&Wmmf|M>0%RE4f2Bt=Wx!d& zoxCs~ezZ_c5ai3tB9n~B*`*2niC=w;DPk|Q)vl1k$Dg#?J~B~?fc!mJ@7kJ)^9*(fziFiAk!jw zc8io-hyE9QnAiKndVea^(X3*cZ?oMbkRmn~Ty<}6YMDtSH5SbI?P9%@B#}&y3IePj zocrRg#~s~`n%<+C6fp);yS`!90Q5A8r{1}dL0DBX#Hh)Wp2D4JX?3v3(XfS1RJ!mF zbM>flxmK~Abv4XUzTGu&NeUQ@^W6GXG`G3ExC>`%KTWZu&$<4Dj-YzhtgT|VCTZbm ziY|P$Vgnw*vDAA}4zp!xiABs(xC75<*KW_C>;+P7EfFnhQn&C{p)JZh(D`yE9(d&h ze7%R(r-Mh+?dA~b3y9UXd5Yh7e|Dt5@h!#Ammx0B*%8P;j1J$0Wa=_X*OA;!6tRGy zfE(|6oKU%*;Q3a@#q3&ZCzGY1M%nwgn|^l$E05tmpZ#vtR{5?aVke6+!a-68e?yMdtYBj)=vsY2lzpN$EWt+C2C3fa zzFMugU<)y4RUCnjy;UwJ8>HLAGUIP=raM&$uf#Hj5IZnj1{gegA8Ot-)y!p4nkP_r zA@eRDs7Ar!>7;Y3?6aOy(>0*+lhW>eCIghr_z!SHh9Ig%a?Ad6yT44rD~v& zlc?T=mztAKp#VF-gdF5lHqgs5e8U0192&I-n*@p`LP#8L4d2?WwWHf0MYm$xbLF>Q zd((1?B}Pr^R))fKmNr%fG*N&De|nM)Iw-e0%G=oFAv_IfO}Uw>!i+z&}|&tHk-&S%Da?oQaR6hnmb}A6UKzd#Z^>} z3wPtSY)z#j-)l*4j%usr|= z>sp!*hh~YE+Sb{(x*sgJD#xzU#lVW|p-c zro7GkD3)p9|@*#vIJcBc|LD^I(5;`c@OE z1ni9?3AJ`|&!ow4RylPC1Q1Ls+arbt`c>F;8*8*gyH=H#k2X`mKBBf-+R9z5=*X$S z0Q30z)7f6y?jv&1Bys>et(>1yzV$AvYeJPYh&1mHXqGTMaa&0ex!l&~LVw^(>GZ8j z3yWJDbLF`5M=l8Eex|Bf$8$MLOHDpR^20MrBWHNe7&TW=xbkLZU-b_jN*=k#CbD;% z)X{sp7O%AnNF&_mVn_3)=j8tYv;|g{?QU7+6RR-;VE}*+xvYIsM!JDFt*0KWUBmVe>1uD~iFs@dPoL{=((dXM5)%hB?h=UHF6dikAoNO*8zPeo`^ef1b6paMEbW z;u1G?O=25+sP2D(h|YNJ*Xc~W*KBTN-zM1Pi~`ZZcBvkx`PL2YwR5NtF4Vds1dT|? zK9rE`ySwrvQ@Ac$uz#g)sU)>A_KmYr`&vnE9?HV?S;B)G07xo(`_+YpXFhAZ(aN9# z@kl_x>_u0!wA0Wmb~7SI2nrnJt9LoZ|bWcq_y&T)#+xW&lG zyRr)$;4?E&q}76AvDKGAds^?t2kxAK4;zc6%?8+gGK|{Nic~E zKanQf4}V^14f`uIBIBMgpzZql)6S=H1VLR9RIkqRE;kQQJ?W((y9sN30!swtqmN{n zSf>D&Okjhar@nov#H{d2%+O{D5AOF4NUYhdQ&bFMK3UteE_W4P{Q8=;Yi>+pTbX1Z zDa5lk7#wt_qAQhkOIfu-Vz%Gqy6tc{+3pYYsxPG8Ex?dotg}YJSq6C>06xD;zXq=% zyh~)ZLW**zrv<;-9<-C{k;My2WKihD#;mw--Otc^*3srhQsr!al=ktkMDrdlBqlwf z3GMwVc&(N^c7B9@p9j4ybdG{<;amXHW9%2dVh^c4dvL8 zVGst5pF8&CIOi2#Sr_`7OETLPlmUz`H{*b~AEh*jY=TRsSj#r{9GMwc1y?;jwRb|) zm7;4&rxCPyW0m=Wli$?TR=RD~%w_MHfBRx<1H0;=DY~1Pg z(OE6T@y!g4!pL9cVUIyoZh?yEn~PR05(kVZz$dnALeb~E14BsUH+K+%wws0m<2fvN z80vnN1h%VjwO#R?i8_)`Ob@0hCvC=OE8ogvE{by|?a}ZKduFV|Z+R@TPj*8}tMW#v z@{D@>)UK^#3dJ;GZI(=VXfoLDYUGny%M`Zukj&F6Z;nK7kRCqw;X`)>jJRQFw|%Bn zK4Hs^xCC}u(rZiYL8XE_b%?M#yGu@+4yX9EP#%Z(ol5-P%q@u`MhI9af?OKxPw%9k# z9`#@VSo$ILKU$}EqiH(D*V%Oo2Rnv1lY)J{1uMs>+GTjP&prJ6i2SuAhbXwn_Uto6 zvg#U&6^aKj1JMWQ)po;1iZ~<|w(=O;_i_XoE03*g!=kz@V|-pye9|^}>H21+)Pz{n z8!#fbx{woh0wOsISbC1%%B-z~f%mk3b$(n9RDW99Uk=L*DQ|5gQKsf*L-ULuQ{4Be z7kb`_q{vOyq7%wqWnsZSfK+=&Cuo<*qpKyc(qom!pA)o+9_8|skbV9BovO~c;u}8< zqs@12Ey~-2<}eshj(^})%}?=u(%QybEd$I+{`4{`h77sqKA&3UwGD3X#4?hy$l~CU zI?UM$eQnt;0=f5?Ng^cMtW0+x6zVp-z-^ zNaU4TuXbBk)%6J)GpjTNrX(bgte%+eY9par*vOBnUcrKMG>e_v4{$qHBwC7FZnd?! zl2Tjd4*4sS>(`1)tE-5MK^pmnL>Xo|C2M|0j9l-lHYe5N(}d92NboDL*y`9V{xz9% ztGIM{*oE^+RAwbuo~IqNS^h=DFhPmi zARlbhdbNQ_OtH-A4;$e?cZbK!eT8$n*OrXe+3Bh-yuKFDVp$pGdA0?CfcZ(l&mNyz zuO$Nnc}Vw+P#F zPf_v1#cdc%N9*ZoqqIiZP5R1QF_e&1iUc!M3y8dAhQ` z^*f$nCe4FAG2XV9M6|Pyb+Y-PQx7@lM{W%cRH33nQK>CkGb}XyTK3S)fy#*v^3BuG zA4=A;O+!tAV~WyGE<#n>L7m6H>sH~^CbG5>TWQHJm_%IE3WF=d>&o4o921Bja&hgJ@R`Bu99kGq?fZqz#b!2I0w@{ zwQozj(`2=IuI`nH<~H5;81xwKO&%lh7l-uwB~3cw-|a~z$zf*p&T-ox)}kr5WQ)9F zwK35Zx_LA> zbrTZl@P7J9O3AyBk^0w1B`O+N$C{;Obk0q6o9lwC!^&kCD#suXe^c*TI&w=jz#46= zrON>{jrTsI(zoyY0S%l+OIag%2+D^)d)lc-;!902qiDelgXapMEQERw^U|A~Wgm44 zH02lXGVFdB)K(c5;^}Rnk88msr-o+ieGY%6Y|o+F*)((N4rE8S2g-<(hXdErvUFRU zTev2`f>7O{}u2tQ(mM6SdD6&2mcV*y&0(B7s4k zDD8)tw3gVXmG%Sht&2G3u(O)h&rOjU;C~ZmEKfMDagq%?REjoPZe@^$l_7nk1JB?E zZfO@n%2l_L37wg@Y-8K5;7>p*Cv_6wwbXo8F(;X6Eu5@fcyQlyo@++d-tSJ8XLvRe znS`Er_s@TNY}%!Tm?!Mgw3h>Fg<-dM^s3Ojl0qFKn26l@;j+pz>FHQDYy_i^nh8Rw389-^#isSVw;LL5maAS6w~dq2M&YBVULed1X@)|!2UDC*=d z%(=<*C$Oac%GBh!`%TnE5f|kwNIU&UwQbtyHgGVO%&0E7a>F_G#Xap<&X&;H$uFJ3 z7|2nMrlr(LSqqV~Bxtf+stG5CHkT@QDIrMptqnHD$_T-ZAqxg7;B+|SHFir|cwuL0 zkV<3Q6}t7~y+&?ONcL)_ytqS@jX`XBkH)iTI| zyulkJ;i6|dvO0{On5^4x?G?CKhNK~h+jbcV^8K(n)Y_%Z=AP;HxnhnrU}yPzW3RPh z;_snXNOq;AB+4Wk3`#cyg??o|x%H~PUFEC=VvqfK+Eu@Y9nYmj7ml&DQ>UBi9!=p4N)nG{cg7KAU zFu*4vy+@@&UiRuKlEKVuqrB!#3$HBAdl7jb=Gf;LVd+|H5CNSc+OfyE zk-Pee9gvmmRkn&nNl%lMjQoT)NglrSHNLNHrKz^Jv-6&OG@?bxkI;Q5GI1)A&>`k11z}h?^<_y zZJKE+H29ll($2*0IP^L6r)kNjJdbTCnA=F8rO9uXcX6KPrSTrGYGdSbjCVo;yJqOmQqH2~*_RnqR+D-_ZxF0C~>8-?z_^JHF3v#*p8D@y7Es&xv-sROkSaT2LANCG!j zkE;)AOjaDTMkO}x&9xg6M&mnw8cXXrrjXp}tLAbEnne4c59Lx?M(r!e2b6rV-#E80hMB_YU9B^~~HK}c?Ln1l0wseUH%I>4)J@M;TBc9s9C9y_El0**bN6eu6 ze@f0%Y^c*j8hwljGqt*lZz3gSk-1&RupQd14LC^4cpG3R<&91OKEFfhP`0fb$c=Gw z5@kO$MLEFWW~a8+;rS+Jt|V(XSp;vHBt=o?0($NA z_4lbB;z1Xh>O^~)+yaZq&!^Uyt#GBJXrIYaRoibULBR&JlIdVyvfEfZG9vD^lz`ib z>!0zgyZgqqm?i9iT>a%E8@~z=G>5W0aXcuXMZ9fda!5RyhfuytLZw|9Lw~9O0PuivZ<>%s@H@LpH=ZB zHkV)8JKa8A&lj2Uf$Ta8z`gOz5h_U}vNDoL^17)%#a!ffK6di+NL|JsbA9TP&q=xp zWWCq{JKjVeb$tiDdT^mm3sZ)5=RJvM*Dmhn^DL(>6yzv#@}9<{5#L$HjeT_!F=D{y z<_8@sPQysLg+QJZirKd;k~)m4^&5}9Y-zeYPY{CN$Rndj>ASB&q|=p1Q`nf(l+JSB zL%!5VjqR8~$8e2MZYSQYTX<}(*oN-fRe4is8Q`yQ2W)|yU`-TF ziIo0*yVj-OiDI*WOA;%gAHG@6c*lCpy??db3)!AXk#N3NFckFX6-QIHlH^Dl)tRlv zQA6X+3_4@K*0E8!eAZe7T8*Zu1KUOM9}=8IXsTP zLTao{EN+hoM8E)+Ozi`>_p5QWh1-~}F5JXad6LJ#9>dWLn6%CQl0MI}$zmeLVb*RXKEi^_K2hEh@ zJQ2Vim616|hC73)M$inZ81jB@hc!;$QIgu;K^(Fy@0iSl?oFBWJ?o`WQbsPTOxu?7 zz+Cx|$ir#e5=n{Q$0Hp$tn2H`g2>=R6tUi_pED0*?NpAYLoJwekR16=8w{lX03J_V zdQ>ydFgux(2yrBcrv(21d2{@|>u6E2oTqZl)U7-!E$&&RQ-D)~o}BkJdr#BlxPmwg zuG1@h?Zgr6an#mDwd7WeW|qccj!MhsIM~bU?e(d2`{?xPBC=4*USpBweb9N&HKT(e zNYI`c3ca`6;1Wp1ca%Aecm!~_ zn9l*fT7pex=4)ou-r9Jf2gxd2e)Amx9sP4!)2A~z&Loq^BuLEi0Lb}tWd0MfW=udwY~MkW%QHRZp8>n>5=J)n@CPB1o-3SAg(BfTvD0A`9f3{k{KoJ{G{c*hvP;GXr(I?e2KMv_~V zEo|5YNMrewgYt4g{_ynot2Wm!8cAy@W`)F-Q{&6vS=^ zKd7j69YSS=qkDiB=0J!xa8FZ;!&x(35q3+vdwWH)h#@jdgjJL0#xtCMciyD4)s-8~ zxU@L!3wcMGC1(VDsISida^&W$Y zO<1V5%OYv+@glP~mW82_8*be2NcE^w&eQEu*1|ZWl!DQD@$ODeNyopfSh}|R3AeX_ z)JdE=xXbc60D5{csU> zJ6A(tVgw#swjdA=Dzd7DX3keU0tg?aTD#Hhd_@GSbZ%NShiXS^+cuu$k@tx;ZV!hR zT2;Jy&Yu7i-~$}aTtB(bOp4YnoHyLf^F0w3l?1Uuj%9!>9L*voKvU2+ze?7ROrGKv zvilkl<(F>R9=ZK%I`Y=nOSU?#v~2N5BCYMJ$OB9m;c=e4o}GB2JyyZDM*!+_2b65?Ty@4f)mS6b;!m`RWw;AB&$3h3rah@G?ZuN7+~i2YNW_QcR_lT7 z+O27JQ7nrm+7>mIV$-V*et>qM707?GW@qy*U~?PDM4Q|3#ye2j71V||iUlRIM{q#w zLFw&Q@8gE*%0c#%9LoEmE0S1r3VUL$8~rM1JhHv{rJOTaFO-ZeX%9+fjk#7~> z+U};1A0#5HuE2mEK?8<9{*`{`Mi!RnY@=myC(S51Qa}B5e%{3v<-*Izlt~)N^C?e7 zJ*qJhs`*PCimdyY*}h&+-Tf;0I zyIEzMCBW(z(*~~G+nbpr5!(P0#5(w?B;GD5zvvj-zo=-JC zffcRo`MT3UW`;(JXeT)s9Y{Z|4ry#P8?yDSwY|Ye;f>L8wq1wjAP!hm@Y|p%5L`5T zmIsLe?ker1SGIv4PefT|Tr6`SVTxOLVN?k7FWNVsJi6d8Jb*1&e7}t0N1H{l#)Z%?Os;0f>(JIa_YSgxA;_=G?$QXk)AN}sT+h`$InsdX}(i} zrZ$O7e1*L~+9sa@%BRbRQ$ZN{Wi1{y`}=01_GMVDD?C@C_R~@F*4yTI*-jrFSdR3Q z{h>s%A}R;@l5vf)o}>=oRmsv>A@UK^YN-&M46b_aJx*#Hn@BDIU7l2U4G43@kKZ1Z zE=ZZJyO^iyo6yx4zDJd`_jgGk{p4})0|4=r zsiB@XmN^t6vwsV9JaW{NxFlY+)-@d})vavhNZsUZ?vV`h+uPgToGrIW8kt08N%H|D z?&G6+oYYp*M>H&|K79V|9fn)ir)tr(hTWB;w_wr83vWFE>x`dzR};{#utzJy_Lu|9L5i){{UX5ZDK1^9m7T?E0V~klHZL|)^$kU-QHv{ zyAWA;1$tvAy;M^b^dr=-G^cZWFp#GXj?9cvy*VuA&NN8c>Li|jw@ zlyt|v16Z2JR5HV6tf~QU>W3{$}8_ju@7_o}z|;_BYoYlvDh zgs5`dOn`A&8)lr%ZD9n?(s(A24=t{gd1)p->-uE$KGg-p_b@^)p`YxqCAP`#W{Y{+2T(ea4@$dZ z63VT68~w6dn1aV4Kf53dhB+JxIbjV+yOxGUzPUZflHxfdxSa>@pHsJ%%VOO@5R+<*7~5$ZPCFh*s#93q z!{o~MYYZ_KX^|iXP1xiE*P3dgdlKn4sYJ(V9+7h-dR5cf7|Yx0~BX&Z50$G!&@G&b`jYaQAM zC6Svq5ezT~_}4k+q>!Txk0d4;m3J0S=hGjSDtm|!thd^Xu_oL{HckSrFba;@sOGt< zim?;v@x^E(DBmf@(n-o=g2eJk_4TO5teSh>JB_f(8l|)ZWJlbw{{TI!K~`DhMVlqa z5db?N>5qI=QOC1kjE9k>CN+L?2LvB+-lfXL@}fy??XE;AJ?lXr%X#WZRwQ5r$3s#@ zZxT+oFulx$VF>%VBoEhplOyIhhT@U8cm1a~lFo z!1M}wao@dTDQZ=W&noD&VOz^&1jioS?I+fs1+>o5i_12K;T*Y%PsrZjRPO}v%+XGU zBybljK49Ijd-2+m+I5v}me$U7-8&;nSRJef^~XI9EVZ@0h2&PZ7uM}53cw8K zBxhrKAL~h|t3@hX#cgvko+EhvUoRu(Vo&p=v}0#%*A}q^P)_uaZ)I=xv+L_gx=lhy zXS_)L<*{P2BfrZYJD+N8A?}T- zPLeEqi&>#)?HMOxNor}oZ z5=4-UanyU&iPl>gW1bdxp-4i?3l@`ZImtavdFG|+8kDY5;aWK$k}bYwOS=8!$4vUu z?b;DH+AYGiJy*l2uBnKh-P(#rPs_N>xPAIeL8!VZ3K zN_IT8NiGVokd^s($rTJm*5cmg*&EE3UnsJ^S7-#_`kF5r$pYb{W|a=rwjC9{ezh$Y zko+PrwQb3`ZxN}} zrSlEEI5#p9UvSDG>;UY>sp?mYZxHh!kfsYCHAYpvSK5_^SH70wI3=2C64=TJw^?QbC6F;r8vA#E+`Pl#$C^XFpG|- zJ-zE&Sse>PwcO+-#F9-t~8Cwr6RRIO}ew7!~ng~ju`g(6qj8rJDGgQ*jHT7s4QA7=D-^{dxeA zio8JV!YlCL_w+Rs(WAoA8>EFnBt%Cq>IbDyv(A-5TS+Uce9(dv5syy%)CjQMlxvK< zjUfe>j1GVbECOzm?J+cC$xko|(oxAmy)n}{#Wo3T#%5>v)tM4P+yl@OI&n=Q_M=ZQ zm?Mx*FmO5_!`_Y4nE*+Ur~t^mR!2Ux(jAJE&bwCcNV_+VXDK|u<#-1;1n@l#Pj4x^ zxO4?ns;rw3?lGT61J~A(Pn&daCRn_?Y!`I_7GA}1?bkJ9PF*a{w{2rRtTGMKN{l{X z+i$NujTS>ljwOYWgbngL7xL8Pan~N+)g)I>b2M6w#6~oY$cXSaj+p-d>(k~kZh$mf zT*--DN6MtkGj&wJWM$8M8lp}wtT=n;> zO>P$7b6kh>*rbywKOh{a&uW-KYYU_=5!-GHW}l$xV7@iODPC9@ErdD3G}O?7u)Ad zs?0$IjuYxVDK4!nA+(OpcLj(q2#l36IsPwtmdmk5S!J`9>20P!@T#nUsUflb!`sl+ zSY}aq5?e_k%{03T+%{3O(MP^&T}7^Bic4Dq8(qs02$C*TDdRuqrB=OHF&lU$hG}7l z7~(0_$ie)5>8*uf*7}oNBzE_f@xqqUxVVf*hkkLm9+>tuVklse2Z}Q(aCbmK`APL} zYOAHgeRLJ40VQM*v~T|aEI{?gQ}0(T^f<_TJFH3v?wGJG&pi54ld(w>{h35E-V_NK zk7SBil_Yu&*{024B)3FXniG?jc?$!_L+wwsNG?HzwFR0$`P~jeDrW&tt5wOPi*pM} zRrwqcaNKearDo=fQDY&s8_Z6DgrjWFjDnc-Ju3RzBsLMWXnc_=NdzBxKS7@lZ<)m#)qBXyK*7k~v*g8|d@CLxQ;hm$%c3c)FHp zRJ*Ff8vgB=a(iGO%AuypRzgV_Ne$8$85mx8U;e+nQIN!u`B;_RNh{^agZSsLsor4F zHe~YH7GK_V;PuCPWyPDVxg~)@GD7uYeLX1HHxNg@UoXfptK$)`-X!*6jLeYv z6XimVbDVCg5nD=Q7O-2e#G9vQZQm*M^rcIAE(6Wvd2zqWT1D&+U&fGFiKV+#4yZG{ z?m~c*o^oo z9B4e&noZk>u@u`l8rA&Owrhr&u^h?)5g&Z^r%$A*js?Dq!m#C{R><7MbZ=4bOFD=Z zBts&xCxUaI!?5?Kxb?9O;k}a6?DJhUx`rgYk!N8&hC6#yaRaB`5RyH_aw-9G7=W$R z@Oo1SMVw~*M1zS0#Fat)?{iS3@yi@;WG<@2JVaxVar)CFw{3Wqu*+{`n`I<9l2$Go zC#sKXL#QMt?6Aqbqsj7s&&a!5+ujp%dI( zO>l`MWt3t!RpEd<4}YyB@wCXIBxjOLfQm8(2Y+nUs3c31F52Gd){ZBN>PcOf1xu5U zY#zh4R$H5ht`*T{L{=b5eqiMF8-J}qE6DPVI9(%7${E!cXk7Fo{5n+2cXE?YYO{^O zS9E0tRsDUsQORKDW`y$#8>ETXda^0pPff$1&+%0#uI?>kQh>wc?;!vT-$U^COZ}#`!=wKkZ|n zsMc840hjXIaa7;)1tjAm(DT-yn(r#o+{%gNpb|@rEO@}@6<#~mwUp010pcIS{{SrH z9-_2SLb-By?lfyTBh)XTa~qZU0VXlj5>HZU6Q}|aU^oi9k(l6?KgCp@IUA0F^IYd%8+B)a8J~Y&$b2We@A^|1OUCaK@zw1vx zvt<{uo+tzpPq2)ISmPnV&T>!lrMI(X2^-!b1e0{-*E^K3}OdWjwKx$b-9a&#q_{jOPz_(psuI%F=C8$1K2f2ip~OtRR%McOZm2 zLn%ENdJfeTlieks+T)1IAwPLg1GllyQ&%jn6`_-KLA=5ONK+)9`1(}J=?x`vSnRFg z^Okawn4&C^!o_#FA1Gsv0PZ@~n>%T(nlSeMeA_;FTL1!n=>-1(Dw5Mgy1Rvz8HACj z%iJi*Mm?L}uf-jlEE-FN6Xyz&4t}-GI)>4K1)3yUj9+HIiX!X#)Rl5vciZYgBCV~t zYeQ=l(y|h8>M(G7=By3&tg6;)BC*17IM07<(oC>`E#Bz|mNKlX&p*O_YZlE?C|+LO zy~xz<-Xkh)M2<*)Mhb9pJ;y`q`BKMq1e=~o))||2>06LJK9ynZHA|S}YdF=sp}FHR zgC-Ak^ry+AC8#MhVIX+--AuUOcax3yUA6-pWUW1e~A z`qZ`zk}HV>trXJ5u)qlk7#mNneQKTbURn!yr}GhpK~~F;Vro@$8Ijm;M&)CXKp}s+ z-ow_Q)E!(Y5`hT&%^w7D)E})hwFj{HFVq+$ELEeI8y$LoyehTau9&qflSs3c8&~ds zvPY#+YpD!Z3+EBY5^d#|o;mGJNm4ns1|?Xo_a~NK`1h?jOq|K()~9Lwn>0=PfR-(z z=0DPyH8pm7c0hc>K|(&^_oyX;)Ilt%6pqEec%krikGs!mBZ5z~q;RVjlmW1ho1a7J zRFWp_yB?zyH*uAoHj*R~qYhPuFhLbP-TY>CxGbSA9AuM^D~?I@6_sl+E|(@aqwTPr%7hErCLA(7&8=M@?#n4=uJ=u?NGS5l~P!P zhzg7%=eYx^Bfo0WDH85pw7*NZ<+%noNF4o`D`iXP1&`rUTwQ8cvVEZ}!b%9(&5e?< z?T+7CuczsnTvj3AofO13$}&e^?|W8_#-nR+ki|9?3}?$301@7k+%9LEH-Q>=Ld^1q z7P!F;+*Msd{tE?Uxw}=8M#HR;aHqE4O0{z}&E>S_!A$Om%#KIQz;++fs_IfC_O_aI zy1Y_F7!t<2K4{s1+^l=_tBuK!=;Sf8UBr{`Xyw@<#!K=~aDA%Mxto=VZssx}iB?6CzT~}danzcI z_fYe|NarSGUB+NOQrN)aq`k17INfD08Nl2L+hB;4K zb6d!piJezy$d?CcK9pS`voG0C3=x*KGDN05rHf>S@0zcDdlj)L@+!QI^M&Yf+z!<( zg{1KTbXf2KK+D9xO1mAMoO*;yacSpBNRc5p%O9_xtof2OQEeICRDdM0!;w2}5`*%u z8OPTZEwzBQM_Dx$k19pF5&p1~*XviUe#;%g+`Yn`^OB-WZH4=scH<*8rDcAyKyF}) z*_uW%GI?X=0R8ci#%f(hV&hE}bp0;s>dj}40%F`%JjTEh4!NgKrZg)J<-O@!hb3l2 zB#aM1+Mj&Wtji0?u%KM49up_2s`Ex}5TOiHcquZRZeQ`N?%OWO8g>&~$%rJeHftdu z`SNZkI~~KhqIlI}5KC~yoSszu!~?0%dd|1Jn++Yisx88p%1AeC1Ec5E;+VR!S|nm8 z1j#A$ceZ!na1MG3IbFqcNvT?$GDVWrW11VLMKa6$M~n~lYt=p*e$4v!#p`>0TS(DF z(~_ZWA?`og!0p#HNwiF| zCN{7mBp$W({2iBN*`8_aF|S6n*2fk$wOTZJsVlS1em#E8UlKoN>z461i0q}0M!DMy zJaO)8XD8((jsQJB5nKi5#5-F%VdhHA>OSav#@X!E`Z4=#d`0jt#BT(D!Z{7ZF9hH` zpe_{WCu`8F+24DU_;0>I-cSEYHY zGAVV&y|$KHi-n33hs-O~0(&1?qcaf{R zM$bx-nlt7h4A~@tLso+LXHzya-NmOC@*JC+bssaQs6VbNYe&&#TRAl6zJqbeX#{+M zoR!B=N3Cq>mmr_7Ea5}Q~Yf2?mz z^v5+$=R*5SFp|OT{G9pah7=R&=sl~jzqXF!P%=rCf+YqQKfv7w<5|zC*~tu=R=o%% z@&lp9~_ zz#R|0W5ePBXKr+@IaW1+x8N>v$F)gqsLwntZY`wp<{2_N{K^kdd(k&G?%3j@jeC2G zYaoWsR@kagBLZ-~{-&$GoUz%hrPQWC7~ne);ZGwc+tl+-xUsq`w#MUgNf-iUY~+4E zl(tqEmn@Na_$Y))6AbyD*{q8u61b6yE+3C20LdhG_Z4o^E%LaQ<~3jg{G%B?!St-y z=Z*KYkj)T-7Apt;Ob{c{~=^QAkObDmQIEPC5#uO_Jqvp|$ay<*K|&2vs3uSLL() z->p;Db;&geyv9aSqvTW=810kZv!;U5E0YVz=3D~6x%qyTI@{bvHeM)*FdIXRhV&%% z6x1UfP@JUEnr-H~kjU>LWF|=+n~$Ir?LOWaXBQWd`Q*4T$DVWQbI=dzR>q$?>JPaL zVoU)sZX`a#uobIqr%OC5EHFe_K~`lL-aTaR2;2@2Lq+OK=CVM^zhF2%y*~<6u+=7zM`F2Dh!h4Vg-;e8Rv}twW0QXjTDyGQLK2w zmKhD|Gfla*hm&ptdB>TH{JVXtG-&lQCAN-PB5PJHpY?-x2Lq9g)t`N1Eyc9f%PU4$ z7Lfv+h{5%(iDic7XM!n|N`P+N#~#DEtnm{`dePcJKJvI%CppJzwV|6xj?&Lcwz2-w zhjRt_O|lb^2Xmgera_3M-Eg}MgZD`p01r}s#-+OtAC#8+QfDM#`A6fgwK!=|37X2{ z@or=&T2ac3p2N@ztFdy}(zAPGY}WorRdN87fJh#qqLSI9mEC43B7&kJlaEOU_)?_N zd24MXp?`D&uO)h3lHi-&9J#F)WWLHF^{el;5uNoA)&=32*c@*s@v6UfJE`=3)) zZ>}f%CBoW42$Y=0%h5UOR&@*5f(avwa%Rbk9Ha>C( z%a5fIc@ir>kazYbPPwb)vNLkKE>EgVU7@#)palR%RKR23Bz3BvY1uXxEh7)%98}TT ztgL@{%p3qfZcvWmoR+g8SDl8(&KqtC#TQ6+Y@{I;w;7P`l#tQD9{~M*s#9kO!(7U; z%FJ@WU=M713b78zqXb(5#Fb|}?H^hh4YCg}U_@QpS#zJpi;BcB*h2!e(FZEOaAvkN zJymqw@Xv4N2~-0S$IM4;_Vuc^c8_!BOeFIaBN9m(FDf(onzsZoh)j`i8=)g{&wP4T zRV21%u!~PYCYsLYB5Crg?EHKX>MH$?clC9A0D|W6r4> z9(NC$Jun4p!v(AtBHrpV`^Nw)u)?2FP+wV1cESs`U~``}BLj}Wd(!sT8mD5NlyW(h z7ST~AP$YLi#c+6Z&m-J-;lgCf%SyR{v zFB-uunke>%2Yz>F(AJsNrHoEuwFT8O$Z%U`agpm(Zf@T4c$0wwA(gK zBEN|vHWuSik)kb(U@s@z6$PfFEv@ib;dNcA;y9a~gmLvXEyU2Q&3GTokVYCLcFb;j z@mcc6EyFCiF-DEOqgBBt(4N40cda6>wKH#B3sd-}LZ%(QT%or!oFK0i5%=cj?}z zj?&REXPBcakfRw<{{ZW!c&DNdeePG#G%b5m63rdn+1y|&FUp?d-2RoTci_d-StFY5 z0wiIs9fn9Jx93q=-)dH>=G5(t^TThY`Zwg{b z&eRM(a7R0o`c*mQv}eQKEJb)3UK`u%Tf65QThGL`{U?&S}*D#Q;T?-`{eBtyx| zXDyy;-88z9?Ms)l#_>rIn4mHAEI}*kKAx3CUMPLAf3E{>=HxQ=sb*)K2Lme0^BD$k z2caK#ubiP6{m7pnGXejx@y#dNWk->L@t~FqvamI zjUka^ic5JFK4|uqIN%@a??P-WhPAAhA!NFJjDsm3Ld(!}>raj#uNB0xI!I*Nn~n*` zK}i|3d*HFmT;WyMcN`Ahm2%qN=IY`*iSmLncB2l1rbSGpV$^On-cxIEB@r*06M#l? zJqf9vN4P~_CoDk>sz0B#S+~+|Zj|{mEL+2Ak)2e0tVVO6TC-!}+hKChNo-XR z4>Yr5pK9EKXkv|0c^wrG`pB`6KfR9l^rkD$rdTIfq{3%0rwpY1@2x|tHfX5D5&r;Z z>FVdnn6$8{$IXN7(yCq9s%?tuBjtuInEq2BJw|)tt+uIu9pISR0R(Eh$pd=*eMLzo zwHC7iLu|25z>^V(fw=br@~BdpA1q2XZ!{80*C`Z;BHCC)12Xmm`VUI871VJ9903%<>IeAH=WtQ7Dc@Y% zGY>U3WbQ7<1zR4Xt6kjM+#j;(63nbe?@s;8`FiH8OZID=`RMtPw#EthNBHKdUdHzE zL?vYfSd9om2aX{Apz?b-}tQTIh|o%AtiyLBCslmW96#tgBJ2sr3H zDiJJe6OD)i3;@6u_7utPPx$5jFS`QPv*tMe#CaASs=6BXiG?l za+5~Dw7ETb=ml21oi46gIp=rYfESJW{YRjwOWwHK(#0ZViOsaP3W3J&F~PtG`@Z!Y zEbI!%2qnH{B=hg|sV`bLaDX(j76CH60gm3a2iioutmEW3lY0J@(2}u>dXqeI+&7tU z4hJBh{04n$#kQiBY=Yw8Np&0LC5b|!5B7(xQ+do$yz)5tQwSTO_Nv!9nnf5g<%wJc zQZqt}mV)Nx)ag@QyM`%V*JDV^12aY&Jm(zrtox>rTD8QIfr57`E(j;n6^=D{pXM?! zWnY#s*va?ys}t*O_H{Dq5xEEFw~cUqw7rvv{i0=n!kC6}XgUKZIEPLjt z-fA(U%O#z{;}|8gw;q)UxHGO)oG~~jwMF)G@|9neiQEq$*0GAYo0I4|OOh?hNC1_3 z`WmWB$pZf3Lp!m{A;REx#afaW;Zb`d@*8MUe)k z2PSwKSRArr7_B>fItbNFQ?5z*m5(^4>GA&nXh@(Vunb5bb;qr1T4~ZW0K?^Fi6nJ6 z9ff65qDymHaK6Zn()Ub)cw>oBs6V~9&Q~8yRhP7d=V=p}CIBWshT-K|tM{yXBOqrNQ z!6cQ*1hzTHwPv9@j^>VWf;v5R??G=e?(u<*aM1^CgFTUmZ_O!c}>OO{$s8 zNK_~cLlU42)NyJBf`6nmyBM;Veq86)qmtU=QH;fGr5#2{k#aWuD@#N0rN9Ty&zKiJ zV+_Xp@CG_ovT%fM%;KjvWKE~*OQ!)Hj19Oh@T$3BdXt{?_+H~*xmk^@z`7PPN%u=< z9V?~q{{Vqx4z~*i!wj34FLBs&*0yxr4lqJpN98O}l7TURdWzwmCY)Y}Y$!>sPD@Sr zX>sB!N#)cpMYO0h<*+|ECyWutPSwz9e+SG$NrZ8rjx}wVT9J~j-6_+6iU&` z#bYINkFTvV<5blpj#F_m#~dlw%jX>i55J{xPZw5gr1Uytho=&yw}$k4L?Kc|JA*L| zfKR8jLvd{ly327D#9?FknkVVUO~<#^u6@4U)pZE2!mjPH#h;nV^~m(ke_Ej}^bX95 z6^za0vM)RyPJO-WE6wW5v{uAT3+ zOJOu|wX3Qx-P(!wfbISUqSN9x4KJ09z{hx$V2pbE({ABn|UG+F$OG^s7+I6NQ}5m_Y!3@9&=Gw2UJH9Hla>*0H^^r1BO20B945 zK9y%lv6AlOB3pT`%oS8)_kM=7Ep(hO`j3=3Z!udS1L!?#OG)t5sO<_Af!y_-ju}rv zJq{`-Sw$5ZZL*;7bT?sUy0w;92au1q%N^h7Jt?txd9A109J|Xf`!FZ?yB0o`+}lTD zmWyj(0bzw{!{jfytj$IX7!)D8Uof#JY-bETN2PNr@@GS%6k@}t+$+l~4et_u{Sb6H z?kdz+vk7vusu0`6_#}@&2d}kSg)9Kk$zT)P?)Yj17~%CkI$H!MzY%s;)4N^qHEgM2seuJKnEw>wqA#v8L z%-VRkd$=TI+@By1(2ltG%~rO*a=>2gEt9aP%D-GyZBqUA0`U(olCtCFbM5I)H00fo zoRy1`U%?*dea*ReCArVJ^sHO&6WhGvJ7mKnZCTWe9Dkm*PU~HbXGm^twz+?oFOQ(A zcRH1w&Y;%sr#ah)3co79sRp{~;nH_z6RUNhX{VNWUL}x6A!D;?&i?>!YSE1qEE4G^ zl20cj9p@zQ2tP{2uxrLD7PrFg2bwix^dL{){=^3Mofb5 zTGTD?S)q=tpx*O=@x^xV^bnmUaE}GV&Dk0CvStlS+9!$t8IsW+!qp{{Rp8 zR;9cTED&48Y^@9`Nss}S2l>^t7@`!W+0b}jOqS9!b9-?dF%TK!lkYdv^x~q`H4|}h z_IRaNQgaG{f<2G7ddsxAov&iFypZ`}_eQ(EW$lWVD`1d$v%xIsy!pm4w`V;`^sG4* z?rY5LVv(}9y}csh7mWk|0If#*r_@ufVS6N&OSEAeDnHk7?t6Y7hrLY&(UTC`PLt0Z zgrmYfRU@D|`^L4eV~0?QKGAO|m=G=+VlgPkKSAl~P0Gxb8>5^z^I5V@I;dUS_BiY9 zR_(8}_hID{!eZWf%f{j9>;-H-hoLlbtaBM9L@cney#HkQ!L_ipS{U;&xV z1ATi`ww6X&+2dv4Vsjw*9B1wU>M7>VDP&nEE@DjXg$_68x%Q^)8;*xZNQe4x{m~(s zE}KdB`co}pdqkB}$;M8_3-^bis}PV7&deDSK2-kz2poPUtcx?R-Ngz@iY1LzBl7SF z$3yOYXLiBz4qjRDCA-|0{oZX%4ttB~2w-U5@<($F>*=G|^0czoTTx;x|O2|W&ds=8gP zC6%JeVpMV(WFL8P&hK7&8lD?zt|X4`N5GA{jP4x;OQq=(Txy5RyNqokB@^Vq&*W&j zND{d`7V)Se-55H)@JPyx`j1+eSzX{;eVa0wHzUToSsSSQKT5G^Be|MDu8bp0$VkT> zG6i3`)0$r<=FL^1RLGH=mKf=pha*)Im84OVBokbK@+KKqI49E;9J}Np{KW{rDI0Nu zJ7?CMZ|qKi#c@E**=jq+kR{N8UZbKD0(IOj4SO(%Ne4 zr(17^b^&tH0HY-LC)8G6z2m(y-fg!slQ?xQAs;Eo>+M*VQR@2SUughZq(}^K!-yvfh<1j^4>W5V6^haw@=1qjQMhdO_Z4cj7)w%poZ2{Zam(TD zKHB9H!I=v%^Jck|_gM4;)SffzT3TL{X=tr>wr2|2kz{bibNq*Te79OQp4V5?m7KD3 zX(QoV9^`baZxHzM;t1ro(`-J?=0p*kVb^b5eRJNfKGvu|XH5^ey;Pseyk%G!+wAkZ zU?;AB#-oeHwz_#`wYrVX!g*oJhQ>W}T)ow0Kvyj84tiT+gD18hZwwue#b2VY!P?vLTw z5;dI2((-Y$I7REtXvd{kLT%=?iWaqAS85I0`e2^lUi5B=Mqyc+0wg9tTjfxCXZ$Ok zQ%_^26z#cYT|O&$Bbpl=+ky*DK-`BNK=i1ttyfTXdo7WGLdZ8@xb+zAPIg&JgCmIZ z);I5tzx`@M9h{P+!Y6_@e8^bjoDLg~-qja0vPFilvx84?_ek5gXwL)>QR-@)%O$4w zc^DAiyIBSRTyT92P`SB^Kw^{$cD`C9kf}qTy`Skw+SZj7yq{^+65uc1WylD9IqgN8 z4rGf9su<%p3j={BcRnyse|URUSo~Y0+D;CkrkjAT#E`ZD9=`RF;@=ar@};0nrvv1P zhSG7y??tS;ORMY2gk@Ak8Q&%p0<1j;`OR$#H&8!ybR(xf zPNumnOI_411d3yAt0yus$p_ZA(#KVf@*C+boJBmR%XJ(n>-yEh;Rjclr?)$>B#{_x zz&%L*wbf2ksd=39jasKGr`X?5Zt}$m+s<5l?D~q-hr#Kl+sUay8QmiUDLk<~vVH4j zTfHwrwRrTzfV=#uCBgYpPQQq(Tb~na-Y30XKTm;nmpkKBz~i{|`c|rSD!Z)_pCll) z)tc>Nq-fUA+ud84ZlplX3Xz5G0YA)krPjV6y^IpsX%;S$yg&~u45mAi*Cw#+H0^2C zUQ2maM=j+I-4t=3^XXeQdUd?olp2|5Xj5Aa zb6mM)0znXsWI`C^IqYh9JP#F(tkUauWY6W95+*nwL62JObbT;e!0lw4q$K7!m*!vo zzqLGRZF2)P&AP1W3lw9afMI%7dKsgL2`4Z{r4O!p-WXdWo{WGN$~`qs3t zp*S~d<%Z9gpz-Pm@6SV4nnuxr zim{Y**iqVXYQJc>kOF+nvmhK0I|{uOjpJPjr@B@Msu2LeKJ|VJ3wS`(r&R#H)NE&P z9+h)W()7(sRt(Rh{Rnp>E(=!&DkvH({lSbNrK)2-UbY3z+5F&{C4;|zbG z#SxlYgrfQx7Fs`v^}u6;QZ}WKtWluEr1$5r_p6q^8q{=@h6~|!I>g6wiCBGk!eT}foKrlAe935xC74^OD8F_ z680|!5n%WXeF(dg5ptzx`|r1IU0$S^|_?NLb$ta?If_jfUkj7OEf_kn($>jT6e6!gs!DCLGJKR0ceu`udun+SY^NsHU4!xV^gH zH=)fuTG}g9v++O0_?gS;wgx$l6$1gfKUHjTpM2LVb>jVNP`-Jjy(BYX;c|B;<67Py z_;ILe$N;x>X#iG97w;!#&$oKmo8k0!*5=w_3~LOay~a5su)*unx)iX~bV$Nc#8uSf z?JPA-W;JdvyXQPD<}X=>TlYYV05*8c!ugr&@r zAV|pIMtbw=O>;Vin>DS}aNgTYC6!6o8|2%J^V=1jsrcPyvPd2bGR(pW2>>s%de%0( ztoVaakR*2Qsl9x`oHGo63GMXnSW}}lxxA`G=&dfHxs_XR$^uj<>D%(BwvO`7%Wr+< z?1wR|tMbT6{VOX=({%_CTwF-#OAndHDeOmj=@U`YEMZ9RH3gX97HK2KNEyKTQ6$u? zf-NyXrPiTqEM=pTIOGTA1@JNG zMMD}}YD}#GaL&a{K>gr4}f3S zZRcf~U|GD(s@#UkWOY(0H2o;UZ1)!eRxS4x$S<7rIPF#5YfA-=*dWVD#Zm#nlg}g6 zn$wp{B6*EV0p{KrZ@yM^*dQl3QPHvMOBvHc87D4^{{SqC-1%Sad(~zUK`OQZ zTP2CyPwAgZ>xLD{d(6eww#Rd*`2PS(iU%r^h~r$v$ISkK8o}0X_04)n*ZW389Arrp zR?C8)?78nu(rg;>n#TVCQ}cr;F-EJkqt8|U0PELJp=t73s@z9z@cAx&MnJ)r``@25 zrR?Z!xGrh4k8cObXEa)c^wKnsIV(2o7|t?S4!{b~@b#p6eZ;qS9(=OgAoA{IlW-^x zLOTxQ7_PeF)(Mn{bt+Vl#d#;`=}${*OFN5sZf+8GlOMc=epOIAd(=Eblx+Hxsaf31 ziZxZ0T|2|@!Xg)UFvsMb>ZOhYdSO7maxen}D?`}}`2iw}Vbo&WX$Xhk}l4&0d zO8mI=Beh2_h^{ozb0VtAwL+vQnP)xv(_dKf=C-temjmXRU#kK#MtuRPnw?FGk1ScE zY>#kK+TUz)G^J0NyNeHCJJq+kx6&apT)6X8VmC#|R_~Eq{r>=qwDw;=PnHOyNca7v zWeil~f~0o#t~X!tcBL$9C4}rslF~}q-E;IFl&RroH?Dy?@rH=+F1&rGiza(3mnB?> zke=Pvxczg-O{(0crEHBMgXL1glh*OVmTvMj-{o}@xUE8+i z$nzDlM;&qPT}G9lLvA6lw({KhfW6DF%F0JU+;iXji`IHphYERCjUl-6ipcKUgkbuQ zTDM=5;UQ9T+~aLLCpG+{DH1@V8J;o3exiJm5Qfin9b$2;jH4kj(NkDjm2Z{1kMoYFBeLg(VTTx@>H!mho>^8)S?w zK~Om-G+bOmWplbXmg2!<2W`0h;;`yR(v`Ivq-C_WeU~e{?CQf9Z}y1oO*U7POAWPx z?qL4_zmX%tusv`)bIoL(_cXFw5o=yCxt<`FOCxPep&SG0lU&BLE~}_Yv)o@8RXA@i zAxZVeVfC(p`qNQ~W`YZKJ5Jc-jR65qRwL4?4Jzh)r)!0U;%EdT3xWXdYgqEFOr^}( zog1yTV}?gZBY6dQZZUv6XV>$qJ8$kCZQkHpv`QL6%kwTr0RI3w+qcl}MYL-zmzX36 ze5V^(dja0Gto%D>49|NCk2V#KCT76|b|=5Fshvon#+;eY+UdH9ju|Ir`CR#^coV1` z07p-u^sc{6TZ>im)C7=V#>}AY_B7Zeh!blqnSUh!Z&mHjtt-gUM-U8!A9eut?tQC{ ztldtA@Q*2Ca`p}9OLq`Sp*xmU;fd;4b{>^N_ToFcg^)5dqYCLCWl_{0=}=tVszbNS zGVab;9Ou~QwNkd!mJ|@n9D!qESx^Sp53OXWN$gviMvc~$B(SqvtcFZ)jJFEMus+nt z^;nUJ`&fA*Y)u!I6f1lCRAVFIrZp|Xc<+5_4 zuqW5wr8VS+D`bXkK_j_arU_<|{M!Kg{=oXzL}OzICda^FTUWWhyHKK1U@o|Lf$FE% z9>1kSmA83S+sqICp+MmYJ*kg!!epB5L&%OxAi&%YO!lZQE+>?zl0X>zku#{s&rY3d zMGZ-E&@HbZSGu!X)JXzi#F;C}{D;@tq)XMgb1YX1uES`M8{}s4$O>=-M18{EoL0Q3%bAz2FXMEM8#{7g11^Y19DVP6@tUk|BYVV} zH7_K8!d#Ajl~R})V`VvHXT*|>fc~mJl*fW;riE7dV~k`N-=mLA`qjlE9GQ07;5+7c z_mKHyWgA#$rYdWwH5;qJaF)_ZG-rLhO1xwHq)WR^Hj^4nqbY3Rh$x=qBg)xSly~kAwQYD?z|DDe_WP)n zpbP|ZkGbD=O;2xQbv>kW-OUOKE;9*ev%HR|rBrHzDoHmG2QBVyC}YrqGb@mS8Q z*&0HUz1f5R00>2`gIq(W!n^+aJ~EOF@qyS<4++IIiRZ(#V{)AA*nJ5dMQv)HAhi%& zO>Y^HM!AONTMOt0JBrKHd|(#p+fKQ4xO<3sSX6ps=g?MHoSCmIVo{^!U>{{%$)CJO{o?{q?L+O+0=~%jj#m%;$vm`PD zA==4|jQ1pVttK}DM`gB%MG}Q}h;0D-`kd1e+|QPV?8_%6K#_8Xzt`6&04T0x+IQBWqY=C2*j$$2~LFnuuI&y~MZjoi^IoIAz9TZ0;wn4{Fl4 z)x=Q&Z6QTLv5*|I{{XY@b6FOi9@p++n7*TFW|tA~kI7Qbxo^6C2_BWHrs!H~L-q@3 zXO7~`ETSfJnHj%~AI~8F0Q#a_sHJkwmmJ!K)RDdW>|wjfL4yGFC%N{kR~l676Ipra zleq)Ubjrj(y;E7q6{J#3UMN;l6J(2qEDumcL3^p}j%#JYsZL#&JNf7brE}g-V?xBO zqiJ!-(N4v4ox|>K?s1MYRIYW|EuxYmXEH!e=at=dx6`;4l{Ll6#-rZlP-78=0;m<8qFK4y&5ZP($Wr zrbmW3?QYa=`^zckX(v37K~^m$RhB!Zcw92_3Vf_bd>>kd%S%Ia^Zk}+fJJbV$&$nS zr2121y)QJbG})d)zak6;j04LN+!}_E(`AiETd~qvuWy$w0Wn6n+&Js>sxkPhPt>ka zr1Kz2Ms4H>K504WiitEy?Z0^U@mxzZxpkH@+fe@i2S3uRXxegV_HxBnBWv zZGpc$MtYppT~6-N)u(MhF}1l@k{FnemmK7F&#gxdz0$*V5RIc(Z!{wuw1Yfz*m_l! zmrPhA)ov};DV}1NFs~+69R@M_Q2A2@c2qu8%=&mqcTbO7?P}`dcW@)0piGE$99Q@s?kbxH74F<;X6Ut)#VxZnX z*eAc%y1y4(M`LiWZLCE#!*k@uxjg!g!nuF6=~r&?nfIa{#G~M&_Xi&J9L~i!r1URG zc_r%$J;;2qmH^@Q`h)mX*B17IL|Jat<5%9(E_!37Ai1-6qeY29jdI7KKT3l4SZin) z+g!pW+y1UZ-G%k`tnH}VvL(N|jzx`$5@EP?IoroitwRH{UTly$e2V!UaC_EumZ7R@ zjv%-&z=-)pSn-4ENb8!rZDWbp+(^W-jH0&${{WuU+O~`ou3w3it0lLV2!AtdfRM+y zt2XyiTRZ9raRk0|;bM|Mn0p`geGO4l1XobPTm2m|h)Kg|9Gw3EN|Bc4+FvqhB8FB` zhIGhm^uVan<*f^GNf}VF10yS)`5$v9r@dXWgHQ7e(z$TNg$~$MBh%2^H@G))d9=G-R7G`dWE41P)@J??41;xeGQpp=k6`g@q3RDsA>?(!sr4;hY(5iW+Fvl;Efz^QgKD6ST zv?fwfG^W*r1%t$e;8BAbfN|~XS-OU}w=Wz^3y}?c(u2i>}$Eqm)98@=#W(y|Nni4`b5$E}~5yo5FwrU&kaFRhB zw-IiZOesYF08}>QzC8!^uG(~Bk&LP~PkAa^-CW6QXEnvM+M*^uh5rDHB>w;}rDR=N zz|+SC&4iPX35IAT$COWI9q6A~w$kj~CYoD|SjlNZ0ts?+k)BRE)mSx4M~!t0bZF9f zc1H32=OdE1_3xVMjCpo5yEQFR-tN{!zm88SMg&{-?j+-b+KXEQX>`{?+F29j@{s3h ze-G4;T69Ylyph7{!TiD%WRp9y>N-`(jpf5fD7RGeSi)qDLg25jprt2ZO5`_|meRu< zseG-lg>kzqryQNV4m}N8v=KrQ9YR(tW_HA1C}ED{^{2(8CDaRhBEu|+BSkp2Bw!8$ zd;L1p_VGtM$8R+`buk6~QWoz{gY*xQFt)Aa2;-CV($N{H>%NIQ>iefm^7 zo||=VC)xxn44zOZjxx~_Ka00|%7ai_9a1Z;KGB*)lWQfw+>E0ma0jMpEkjtnyS7+N z!QCWgk}Q1er{B<4O82=#bol4f<@*KjNTe)GvOIf~gU;pj&!=jZ_V(;shI{DMP!S07 zj?`~cj^?YX-`-ogSe}KI4L6k|oaBH#2Tps_t!|56KAJT7Sh|L2r8|Z`zV)YVr6NYQhBOHo%u3Pn zPxn~&sjlN#p%U5!A%;s1eqcIh+LhOF*_L#PWI~T1*ur1kB!}i>=ugt7O>JV5c;m5D zSmY!jL6FC(2iCJb-}tjsO&0rGTY0B&(3e8281_D* zqE0baxuUxg8`&a|Eu1RB5Hl7}>)N;E(Gm2h?ovY09JyuBQaJVn26i#;^sAm9@f`McSiiL?410-%!1=p=UF)7xPgs_blEFUIk;+VMAJ1thJA-6; z_ccY4?5||fZYFt{L+0&_0C_yH^sa&_H0@JR7t;x0x3(LgiFgj(JAXd)ngL}NkNeAk zF)}iYnHRUdJ*t+&)TbF~8D_{5P6SI1{h@&D{{Z9bS7En`=HvT4i$swx$-Vwv$EYNK zGgYUAG>EK>xpU_>-0k4tds0a>aNEG*8A3X+e70~uz3)Tv4usa)j5ces>UBf7s@*@# zp?|nfsO?Oi?#M?iqr}dVL_!juE<5D$2~GygL@F=W^}fZ{h@xvA2A5NS5cNw20mhaJx^N5 zWBsceTI)-5ZDJUxx!<+ramUM!f5xe5J|VofgY4R7OKcm|KNIo5^}wcD>Wio|T%=RT zyhgK=#7sCVx7g;bQfXbH9Lt*Z=9g~EHM`tF9B}g`!{^Q*U@7#af(E!``z^U=Z=GRw z$=!->CYMu;T-+qm%^t>*CCYrGg~9Ls6>=*_HtRe#vm|k@*&C@X-G`^rn{kR3vMuAz z1hvjo4S=g1>Ib3kQblY67@@dla=gT#@5lGE=~7&>w92PW5D5U;^Na`XG1yblo+6-J zBD$^$uTrPCy?s=gXUcMwVPv^!;jw|;EqI;c90p_4Ki=qZ)Ksw8L1h%FZEY-}VBFG8 zDKEVC&#g&kHk}0VTEl-75JcxOr%=pEC9%|#o_d;Fdwa+v5#PGYJIV4x1Z7nE5tGJ8 zZ`Pr)q&g^%n;b^%6(c~zk@pwAJ?b*(bNhtd5;H2q2=iAs=hXM5xRGtt+D^+DJRdjj z`jN+Kt`hN4)+il=42gisuf0z$qal~&g(AIISYjoSqhJ`5@7(n3Rit;fSB$W1F6)@s zXKZBrqbI*gnrS0fQqsb~Nofi;7xAp^Vs{Z6ND@yy*g0lkRpLD`eK`FoxU@C7m8wj+ zaTUPKV>9m0?$@{DSUQ!>#E9B!-Nq!mZ!SrsgCZEZjQ1zswP|Y7nPHL%plKjbe$(ZB zSU}I12pp(Ag%?0pOKd`I8c!h3He58PJL2lQNbj1z9fiHL z1@1^&bWO~QBYB9vr1w4XR_3yfJ2utgiaFzsADvG`BccBQ>r*t=S&Lpt42?8sHW7`j z_*6C*Ea-E^ZyCMFNbT2kw9+O_s!uVI-|Jed=ING9Z>|#F>g7Mt1Rr%!ob6%UM{s$F)gxg(PcNw^-zM7$tbzMnLwg%w+EFNp%&ZR#AcG&mewF zKL`lm`<~vSqh~NNk|`1yWRuF?mnc zc%9LSVIuP(C%3g0Ocm}_7HOznt=6FBypfpxUWcV#cXG{j@+`PtE+-sk7|*p9%M$rd zA;FS!11^5+cgU-EIx|{ZG*=UO^6w@Y6;A`uj^dVuB-vf!O~qulVj>v~&4Q2bj^5O> zxk%8>1f}L)8ekXqg(M)KVd;vF8)>4ImMIjwua=P#cDN_6 z>DRRvLr8pfq9z_ivy^Lcz{=cbx%zu`ri((eq&8Ba-mAS>WFz&?f2a8fw(-Mp3?RDs zOu^%M2?rytKDBBWy}DsxrW~VdL4^Mp&W4B2Z<3xzG)^hepwHGI|^`) zRn<~CZDwc!4>7^Qx2RuwzZ7WRj|GA{gM=3G&379g4b>kmJ|drZ(=VBwI&t ztVZBQ=3qMeEnQ}UV-yz1i*Bj&lsk_6a>=UF*i(JLZ6 zr;vs@L~6mBD@h0M9E@%!(MPYT6o%F*B`8=RDZ6hZudPWs-$sVzVTl>kd8`vHDh>f( z?vLkE6h}|qU_|3oo&;$zJxE*PhRt(OY=JTW^fw$!VcQ~s>5*1t7Q;)og zTO0oX-So{*3^B)#CNboUFcNY`c_@8(sB$SpjwZJjrWjLd%*7>`^-g$TeNW|8Cl_}U z8;K=dq4qpmHuUJn>sqZ7x`@yMT$00Xe6K_Q0M@84wBvwPx4eiMr9+TF^z;;y)O@8G zt;mqZ&AA(CiGaq&JwY^&Xf9`SaESzpF$fQgFqP8cS?QiL@MGNP1;YZ?9T+1hpcGXO8h^jwkbz0g;yjBcU|6GRJjg|>I^@$})F)Mu;AQfIZ6-zMAH+w0r4n3QMpg)A zD-`XSBxdCC%Krd`D-@bz<#_F;`xT=;*HU4b-*GH|gyx^}J}lZSG$1e;{{UCoqiczk zKGAJ%$YVq0yreKV^{DOE<*p;OX^hZp9d`=8xzhhzT%?B# zzfR{hN;2_F3M}R_lM@__3u7abj`bbpsIfvFo-N^tP@@WX>-hCFxf>2-ZLR?E32qBIAl}L_q~o<|YZJ_07nW=Ok#e(a18A7c zTMfrm^!BLy`=&qX)5K+$8w?o%KtCx1zZF3)W<$N56_s*Or_Uhvrz^jj2_Q&|kU-=Q z=mj+p<{drsFj~odb1YGb3vP^zfWYv6r_fSeOyGIfv&5{33!LeXSAGw2qqb_0l*@RK8CksF_0jD-jBvi$^s7-5Y|@T2S+*ie_K9QL602cI>yhvL zsg}FtvX<8N*rX+i^5r?&M^-rh04A6;~+VU|^ukD77-+m09xz*dTB zXk-B**dgQwiFJDp>}^;=;4ij)>RolvwNJT~J%m=Ud95b~K(afgLC;JM z$DqYW9-l0?G6QcbJ1@wPwhLpg9@Wt^YIc&xJ-mk9$N?mpFm?gd{YPV1;>m9G;dqg> zXeWOvNaVvg&n_|BJ&iclO==Drnl_pkx4p9r>nV-Ik0Q4!q;jv@ij6EHkzU|JV1xo7 zw%^Mg+_pz!SFA))TQHX92aQ(}d3hKE2PF3Qrz==pO}O%BP^0&sAReRqE0R@aktB$VzTuG|2QSm_eLZRkZOyb`J<9KPWR^1-1wOg0wzq|(63#eM6`2kW(c9jl zdo7mPc)nFF^GHh^e=}68OSp0)7JCbudy#K%36aW$X!i0r$7RPiHfDDg+{*5Nq>-MZ91ozXZoWmzPa_7593pMPpHfG0T6;$%Pc4h%RkA4+ zv{1B3DxaPV1!8}_{qI_e)_aIuEN)`+Zlf$WmH8ceXTEBp-UtpK=PGQx*w2-f!HxOcsVe&hBQsnMeF@9@=ZDuWY!r(35 z8r=>Fj1$*z`c%+f+OFL#u2yDK!>Bk$KYNP88hzEx@=nt{WfU{;cI5ONbv1iSb<=dn zBe}TqU9MyoEQ$jjcyC}jVw;Ro5|d`Ya09i%mqkuwL-PUYN-c~M2_}X?zA=<6PDfFi zsFxR3*8KT{P%cWL8C;*|R@2M3og+ycsKI8G=Rf^w&7(xoDo+ix59X%w+$oW; z1y{XDW*%xt8+QRvVKelo+wHd+T(;06NXaYAX9>`gfHBxrc<$lKG}8%{mkSh4k1@NI z_8-!P9-?g!Hj(69IJdWL%r_Yjk{o+|DhVMr$9I?I%*sN?A;B2$?N@GYcEIJ`l(KxH zG0OfmR`N?hb#HuQk;Xu1jF~fFbkAX1M(oMi5XTgHhwq`6b4I0{8893V;Um2|H3<1J z$>vN!l_hMI9g6x7YNv5|YA#GS5tm@XNX&1vWRvpazC9_|O>=E8nLI9LQok~N!lZCU zdevBqh0EHOYnyVo+qE$K1M7j*)V2d;*cV1sbOAwgg+2FXsk?c%O&k!B8Y-D&2O)FU z9`u&8T+b|`9C>KJAXLi}o~O`Lwt~5&ts6)R2-qOpxH%w<=Bhk$My6L%ugemnfODLI zP)l(eM3S@sG(3?R#`FFZ=&og+-KA)OpO%wv2qPUZDX4|QStXKYd7MgF0lV6}cPC&# z;+!>$5`M>a&m^Tt46HE%>o5%}r`}aO;+8RTWfvEg>Vp_m^2YF^ zy;YE|O{ibZWjk9(<;M#~6U|~7XU{m}?v9@MsuA4Ca`7SoyAmN>laAiPuD+3Txwp-yo5vPl~S%J*m^)$nftrQ5R(& zzt{#;bW`nD%uTf$B;xuhFJq6ZW3L==aa5v$(%$#&QcQ(p>PvCQZfg8?w*l1;GOTB4 zRp0~M4wFxm@{CM+;;jJUzT6>iT!xwx5iJ6|p|g)r+hdyYML<24@E$fZrQ4m~yq7C7gW zA(P}1$j9a5kH(&K`5-1QEikK?Ro5#gum1q9wXP+#Q3!(ODGd9gDC^Gd;Cg*~RSR1< zw9MMY44dV1pE_;AB00f5vr*4-xl(0|D+OrY@Uob8YzqGXd0V*y&~&Si+NHdL1h|b^ zV+6|M=02G80-I>@8RLQ!X?*775CM;lN54Llnu8&gA(} z+{l2Dkh=f`{{ULA0zIs3@=uxMn3sk$=WlEdl@6<`nVC{O&m0)?NIdkxKU$>vv@l!9 zvn;t`n2Ip@4tw!hC^ly26wOPmQ7y8{R_SEGA!EkFjseX>KBUZ5E-qs%Sb2P7=kx=x ztVuPWI^5ny=MIHfsNwnTRVCCC85T8M$t*`}mdF5e&1)KFa;lAco22reD)ELauB7vm z*Ay2U(QW~eFaksl3jJEKQ&D!2TuKUgdqRQAfz*>$Y;_=#lM}P#1_j1b>s8BQ6-3E3 z3rS)oJ>o`Y+`qj0i|A^{hc6q$nygy2uBKK*;i3*eDterD`qOvEHKdapU}STd6<7ww zcq{BZD?aMxMv=|LC0A}4yMgUmQ>jvv)ako5)K1N6de)Kg?)|if(xx*`_$^(P^U}}%D^lXZNW))Qs9*>|k)58TgVg#TrA29JG9yDY zN{n2HSo8-yDCg4Ua)}d#jK`>=7}-F#WlR-(@=iL{*q+$H*1JN+-+iCvAon1FPJ+rU z%^khG&nDiX_}|=n3b#Fk=X8!!h|~!7;BLoWD+x~Kk%^lvz_)nX-Zu>x&mS_d{{R}Z zqDple$d|}gf>E+bBwj%F_NPwqG4s5^u?E&B)Nn`VRi@NZ-bJ=q)P-PW+t;7vLcEY{ z^(MaXkcNM@hFPPGpR^*m=smkp7L5hm43SK#xDB^FpHIT5L4P&Kmfkys`AH~;gDR8y z;PVMGiNjh< z^0XvwCQK3AIPPjWP5te%g}jZRO#PjZVRPM2u6=1nn*zxZordS(qUcxO{{XE}+k2Lh zMds8ry++mTn%II=tc)8B=hx^d&_z5p;oEFcAOa$*^B<}HwHKdy9a>0MP3#eWb^s^S zH7(uK$>utMKux|`OyT?Dk{Oq%M$#yWcLYLrv22cek9wgVf`&Eon7Ai9fgrK1nTF{^ zXv)MWQh{HUQtr8S7T<(nvhUW&Z$a8)g~3zY1)|+A{H=QIc9lFWiatQ5NSCE#R zMSF7;aj@mele5sC=QV9FE-hcmj&M=e3Kc*bx}1+nTWEgNsc`b7lSoRtAG&eh=}l-R zidLQ;dF@?Mw+-VGLfcp##8t^O^l1uCObxMkU~?ur1KOWyrO9J;YkJbX!V*fnM+1(d z9r03Wwig#sJa2Xi%_9_YrwDW2l%@$3MXa(!(8L*(=M1a!(>d zMu-q7W*m>kt!b8~=K4vJ?J}_flCDS0IKUmT>sM{OI|YoA+(Q9r9OcP5QoYAMzokj` zdpmeJK0ySLB)@f3_xGuF6WFx|O<||r-NidyK!uh7Wb)45GsbcG)b?v<=Bc|3V2|#! zXRCDM-nA}gy_Zgc#>+@PV}PwZc-yxe6YOi7yRy}-H!MMs_s#{sU#}SSd+zRr& zLjHA4wNJDIYjGPRmie6sIZB=@mbO)8nPhe(KnGLY1IO!4t0Ge*x(#!v2|TffRam}I z3Bcr4nXN6YXIHejDfWo*C~kK8;Ch;`sYzniaKdLc%-fjD=Kla6r?9GnRGL{1&@&ot zCHT%e=hBM|b>u5?5D?q6F_-=1a`JKYAD${HRtOI0C1Vi#^E&k7rhTgHGcK}HOKYG` z2zA-VzyAQPt4*ZJzbudD#(=T%*!gG=sP#0{5m_#$ls&v^tqgxVlD{*9>HZXx+!7!r zf0Y=tA~DdB+|sa&g_hnx7(QK#agRY&r@9%M4<&}>$~Hjy)3ai3!$sVdqscPiw`41f zlbUl*(l*s)MB9fe#t*lrHCjuUe8J{K?GQ{$lZRiSs2Ij2w~}ZXlNj9-V*n2M?^;Hk z%-oGTsilb_vj#ZCPD=neY>wx-rX}IEB_MzlU{G)~8SA_M0Iyk)&cfXi@)t0POAV*z z{OZ-!`rN?;1(c$a3}JBC^)%fygPo7LzBmxHY7#HtBZp(xCaF)UZ{PNS6`zFw02dyf zrmIgfFYabwPDub9XWV+zWb<+Mn9w(tHz&)~`qt5>6k{p2AKGbX8KQQ4uiY=wt2OMG z5`3r@JaSKC=~tq$I38>pnn9Or0JyEWd>y8~n%B}us?tS~5}sLU%A_H=Jd&QrD)7lO zlGjKIjv-KfPfYseui9x%<@shH%;0&BgN*tby>+KqY0^a+BRC`tvUMxzQXL@a)+X?V zjbz*)F8K_4pUS1xO=vjMv(%wBg=;O!i1tX)a=7_J9DUPO;;}JYWug%k`Lfx-HD>5b z8+nqUQdDdN^&N9d-a5;Y2{I50#LAI%I-iz(;DzRN$nY zb6U0*7Ph1`w*f+c14d3hzSVMF2Hh=0@u8mMC(0&X2=&Eg>Lkq-Hqpz^Vs7FtvXG@n zV6BXgL;f`^77{Ci8#5qKp$|S;^(ML@q+82xE~X>_k}wQKa0$*hG+V|j*9g^S(QvV1%}wh;Tom`w|sh4gRFRPTLWci z&p-V1m9vg{z^uECN@=HPCbVP({ENn92fwha?I}G?eb}PsnG|zwm6Bb`HvHvC&#$nl zA=EU@Jy5{|w!&C6(sg6$k<-$!E~mMaHMO|;)bw%Cd-~I3(k`PYX1Qi3I431feg|qj zlwRy!(pNU)@qMMCcY9STP6`#=%6+}+3(pv8I^^N?BvZ!XNXaOH z@t>*mt76no8$zT1@feROU?x3vltvAm$dw@d-+?^R?*ie*P4D}~63 zv5e=aKjTeo4)-OzSBK2DbqOelVF}1WM?;SO-Kqp=P0B?qjk(AlBVZp;YeL6GlJ?3? zRYa%k@Z`pNk~r(%>r^eia<>4^AmRAU{=L)#$GtboKp%TmH zyIWezE07Mt+>z~9B#oNdP12*RLje?g#GguJeqF4eKF=;i+5>U(bvQJ|)KE1Aw-L*0 zwmz{$%ZUL$-aRlqYAGUV7MCExQo7|HK}MVMSkOb|&er1N}}049hxMjYfHL)?2)o>DC)mR-jr2$n4Tob@KF zO%|_epwD8#{_ZiI|m?eLD)Z6v^gju{7F(TN!@ECzhx0 zpvMQlxfDxrbv$NS3%sEQ#!-#LbS>>sKBWq$moW{vGY|M z;-NQEM$TgckKzNNYB^Y&xms(eZSIrpDBHJjBz!Nh$E^)Kms1F#RfT)x^fevD)x^?a zL`P$0JPzLewMm`T$Tui=zEmEh_Z6ywXwAyZ)q?xTn8rq8`(zuBu-d(dKi_nqBTAtPfnVLY%eqF7!;Nq5BWVf{u+HO}u1{pr+`cdw! z0@8Ys+_OB9{i7x#aKJVWJAG;gCFb)UXxsQ4D&T-SA6n3l%Mmp4TDvG1U8ew_=~b>_ zX(BU5Q+kdWmx1UGC`}2b!qRDEMN5g*ksOH87il2>0FhQ_idZ5`X14v}u__0lsq}p= z{Zs97qN(i4y$xTFOI?9pCn=s^JW!t;2+d>(0mvDyonH^d91*w9!iCV1?YPb0}=8ujAgO*H+NAMck!p zrz7Wi__fJ)wYKXrKq1!oO!J;5d+b2(E3xQ`z5SUL2Y5b&v6-8e*XYWm-b#i zI-V5T(#dIc=S1;^jrM15I`iJSCpROe6x2vvU|BxV49h8uVd5DK7qB4p_N&&?z-3jQ z+irN0J^0!?8iso)rHovps?s;eNIyP3K9v=sUK1R!ZhtNLwq(h1{`E$Ng^TNzv$lB= z9FO87sUGLhRcUT5U|%U^7?HBO-z;)Esr2@%F|+D1G%(u}BNMt3*}(TBwK&+?ToDWs zFYeeht1sTpIV0QK(w>M0BugAbZjOWh03FRDl}Fhe zW^XZo4iD-*y{S^bDm~Qt@l+buPli;v z(XHlj6vW4gfK!e=us!O_YEs?D88)-Bmf=;iu#P&8wH@XCgUTa@{y0Y8-yCEw9WVzc zj+E14X&_C1Rkux$26cAk68nOWQ|bQz)}~(S6HRNNgM( zTz`#cEzB0PNYh%ek6>NS-Me+@Yf5U`ktUgvvE3|cFD>VRbCD#H?k~?zVbZn;w_9ep z3lhs11nfA^ur*lA8u@Up)=8ge^LfTctyH*^6S^{ni~@la@t)*X?KznI2E01FHkV{v zpdMsfU2(u2*m_kPmyMW6fngx#Cy%)Is36pBWE&pgcP|(tl^*p4&Z1QjytVSx@a-4} zaP|67so8^?u{G7~o=O>K0IP88z^apKi51B6aQPV_MgXDhuP5^ms_fsu$KD6u`ct1q zR=EpzFkORuiWdi`Z$Vn67^61i_A1FVlij`vDGMjW1HXx6`h)`*(!O6A2HOklEm$t}CC_^cKB^ zt)sg8ryxhcLVMRdYq`qI+0f-zMn;~N5XjTbCj64JN4usvRcra9js+7b3oGGv{{RX1 zt&4vT$kG&I9zZt6q;22z{{R}b4~C(>0tG_p19IC)0sD&6+QK@vN3xq*BNER`Yv&Wm z8BBfX*yIuZHLIlPa9v5Z5Eu`gna*+B^38NQW{GVCK2@|ENpCdoY^m&V=s2rax_q)+ zLvt0nMvlrP+5ir?=O2x7RK+{l9aQkEb|iinu!6x_;`|_#W=2)P;}{;)!4;L7Be;y_ zOb9~YpU2eJrOmaxOz=l?lBBD#VIT21Fle{}L5gBi!YR@JqutyfWw2@yi53earFnUUA?tMORRc9z!H zH$G(1s7U@|bAj*8M{}a;Hu{OO+Of|JLQ-8f6&@>UkyM-~^v!>9dQGkW9*Z%;mT`r06>elf@*Ej1U zqu`UA2J}DDy68MLX0DK}x~n^bzZd{_U@Ca+ESGh>3IuNDTW?|Ne=6pwj%|CU)bNpx z`kA_af#HQ){T5hLJ3{BEtpnk~6!FDvZp9GpJ4a4C{S7lz)NWz7Q)MA6Sgeg9#?m+# z_pVy&#G0kG(2C+|qgd3w;!YRqSVdK>?>21tDd>)}^TaS%?}}@f$Jvk>zFZQgr!|GF z_~Ha*T{z1mbDXOVRw4&hG}t7%zEN>>7ZZ%G7l!x$0P9wS8YcT;8$}s}x!$30OP<8` z6-p3>`jgEmY-8E@w^f^Mz?aMoCj<0L^$(Dc4=L~Zs|9XGKM)JTY|&6 z`g_(qaTuK;N%CZrkl=Cv)<7x0htPxiReQUqwUKOPouzk=3o9N71MZ*ks^`SoK9VjS_gB^kR`T7q2L0iWj4n7}J5)FNw02G>o>lpy z2W&?mk3;WR{{ZlnTI$!bCB)%ndv#HAUlERYQY#Nyxm3CXPmtU`?qm#hsr1EEXx>_x z%C(k;>v)1e5qPlMq$Qg2@}F-_xSN&Wot zPqlRRej6HO(wo@JJct7;9sujowrUiNmo-BQ$HSgz6Y5CQ7zt!ZnEcgfcyiq{BHIYJ zApS0g(AQ0-=~{GU65jA3&RN`?DDJeP>dhvYI;+O(fOhb4+*W^Bli1Z!k5ieK!;j_t zogsN1LAE&;qBo=aP;`WAV`FcpD?Cquau)-4as_o(*S1K~S&3B|R2gPD`F&{`&cWu{ zZ#y(#Zi&u7E!@)f(y;xEOhctC?6BNn(4U!NI4j5VtAk0jOJHJ%L}3KB@sW&l`qr=5 zp@!O7t)o!GC5wL$sDOfY^H%j5G+Zz|F6x(7Or=dCrM-=%v}^X;c}Ql$ZG1LQH9gI_ z%wiarNxKobJF)ex8B7twys&mSQhNdFD!hwt3rzQte(56&iih*htz_iexvi2#Ib)c_ zR68pIa#Ubv+zO#InvJ_g(qtU75uEPy9@TidKa`Qi<-EgyABG01o7-E7#E?vZVkH8w z&(F~FR}(ohD=U?q_K8&*SW1GYBRTFn)8eyhSYfe=B%WQ{r4TViZgMva@-xmUq6-^{ z1dc_l+>~d01pxb0GTcdR4o&zV;72N{%b#kyH?bEjJ>*)3>wPWY5Vurrg|u{D{r>zmW0Tg(#eA_vPY z)8E|tRnw2XswPiEI^yfdM)M@Xpe&`^^!KXqUTQjoD=J1rA=}GN-kARY>(%>xK51YZ zg2^c)mUaCA#a*94ytc7fiunreOp&VYAwcRq{i~;*DVaFQoa|m3zqtl@<5%S7IhW?! z>J4f|r`X%uG(Tv@K;Jn(EIy;${*`81sph~*nPR{gDUwI1s?P?as6uTlqEZ8raJ;v# z@~6(^E?A%{4Dtweu-lNM3y=Q2No{EQqza-;$MtNMNI{maP(rIyq&;faWBR`mTU8!00(tky61`nirqn;}aMap~<>G}t1F-N*@% z8Q5{obJCpr%Pv=qR<48$&I~mtraa1cN0x=kcW5Xf0x2>{;%ulIF_D zlBW_D9S5)0pLyW<;DTFgiI0~wd6yC&$of;?#MX8*o5<$|-XIPK1fKPgsQC6<%}?zk z<{LlM?fFUcG?JTPDMfBBn)bSECff19Q6Vuhe+kc0eQHau7TF0gV9Lykh9$D6>zd}S zXVi5W8f%$RqjvdKS7=l9rbB4fHq2&V8Q&c^9)`8{QF^vx?PRt!Z@fz=kWXy^Kiws= zcYi_cS=TzX{n#$PI{>p=W#nqz_!x9E> zPj2;I>=uYul)9OgmbcU0#P5GTD4xw^2>$>tUw>1Yt0WI%<%IFVh0aVYIdC~7^Y{-+-?z9Ec|a_1 zq+={c2Q|*crD`jGBy!w|cnFMx2ZC9<#fq|vjZ{H7%8I~vY*dlv_; zq|0w5`z__IurY>g+&Rf`I^*e0)NNz2V+^qKBzvMPc+aW!sqTDBW_+(M+BTV3?1l^| z&vqmE)-JWFL#c0?%ITCA9%8d@-+}x-gW9GMlPXe*EjFV4}bCc0pzaSr}Y`F`#{#;EGC!wjfeX=9cHyCO~i$3i>S z>XK$IrM5P8UlnPB7nag+;|KSOaezBkEdD;ebU|v8ExL{jhbxoq{cAE?c-j2RnarkH zPwr4{1a;5T)K#lbvk6*jq!K!>$f@^7u@$sv!YjFpt2W4|)ioVPcD%V?DRGFrtc;QB z1y2plpo`6x65y$25bz6kB+#}uvs^Z$_TXR!jSyobdseoe;7M)t_PL7XC0S%LI9%a( zbA##6r8!CwK$PUnt6h7{x{%on6^Jm}+_yaiSTX7sw?Al(7FNhE>T(qQJ64VEiS{ua zjjfhMhcaFOHrtG3@zmttQdp}^sIa_^0_8(V8tnjj;<9p!)fA&8qbS4S`-{20({*v@ zvdq7{W*{j%0BfSrw2Lt^SvoA6Bq5Y>^LqN#D_a}px@MMG+b4+AJTI^1S_+XxAr=>F zBJ2z2D9Kjz{41WMoV2;DB9PgmwzX*^ir^!{3bTWas(tDkSTC+7fhLijD8qR`om*!t$ zea&3Dc(fZ6ri*zYk+R9S?#KJz<5`hk4LU-xvqqq9^FwkDdVAG9Lf=;L3rj7v;f6Te zeC$49_4TTZ8*2LryDbVD*NDKmg;r?pEpBBf=#7Wz$tTk^$hDncTDyZyg(P%}ZLnNQ z#A7``^{WwlK8DuZUSHzj1;a@pk0YM#>?(UnBJk|y-sahEU~|3~4Yij(go^3CG`-cS zic`L(W})HjPI*}BQI>}#OAa&ZgGnxh6a{xHM7h}}Nb;p0LbP?;)>kx}e6dOc@ zG-{x;A8$&U8^xCE`!pr_ z%Caxa6dsuMtXpV|@Nbeflo?A(dyd>zosFiMGQHIB2_7^j4BP?g-qbioJBdxbjNAQB zS=FFWG~ni3hiFhJ+DBpDs(p^&Kp>siBLc3(WT?kd2U_2GWRh6rvrLGwYV54jZ`xx6+!OmV)GOa}_);f(2zox?;GxUZ>0U&wpCErFdx;C$h9y z+ButSb2}DpKZicvwY>(NXJseaq>IRS@wJ`uN4Oo$Rk)93)5UEfO71X|Lcc6|Ipf}w zoS#vuaaxt1Msp#OMR=AIgBa(_IL3aaqtz1cQM6=+bw&ql#zU4!!28^Po@pLcAj+>Z z+$P}SIS5Bw^kLll_NB77jV>D2Lxq|kHa}6GNG7EfYZUJO9_o*A3BS`s%Wyz~NSiCW z8OijiA<%!brh5TuA^Ru}B`Pvl^&Yj*Sn9Ia*)^e=&ACEtkbU%J>`$kq5^B-Vb9*)TywQICe3t?U5#QiE$XgK5BfdPh1+mXQzvnHo92(gJ1}`G5dp3+}`=> z*EcAztYd%_6OT{@O%ICnYb^qM__dojrL`fpG5N^P-9EJvl}EBPT!@<2NxZ&EeApTy zvIyiX#1|v@v)Z#)RJO9c@~&7*wqlaU<`6jaC!nf2-;MQe5wV3#t7PlATtb^!3F(45 znxko;&2{9*Jf3Vzmyl=gXTRcmRYr=l=VEmo?Gv<*#(HtIxV5v>ZQ@9yC1T&XhH4`m zw{}KLC}U8={bRO5`u;|DDz*&vk&P8GB3>0I(q zPu(_7O=?L4+FNPG{>?16IXP&L?vxK)_o?8xX_6BJzr8Mg(xC7Y9An=#BLuTQ+0jk| zD8r0!$G8L9qZf+~!!@~4At59<0RI5>svAXwx7M>H(LLL{{{YK2&j@NO>s#f7G|F=# zVTj>~6>V+&_+H)^)qu>_o{ zemYi;k2I55+<`cUEVv~h*2dA|`HTvlGs{y`(K`g9RG){0iz|C_0EAh_l_ckjb^2X%^0_r)6@CRrq#F34616oPm-$sV5d z=GS`t-R7qylosuB9}R(%jEt26tk`&0#2UtAl>`}!0o^jHJ1^ANbTBZ3yqUu+Wap$& zZ(8`5s9%VZ*??swS-|E+_4cYB9Mg3V5o)FjDMH4?`GP~c1m`#%&30ZL_%&`U4d%ZV z*zg)TmO>c%t~=J%kB4-R4O+8XX~l5jNSLU0RzJiz^s1G5G}BO8lNvQ&rdJHqRK zrwbWiL{)tGlAZw^Zpi8GD`ww9(sZK?7CLEfn7F$PHs{!SX0+WJPu<)?v1PY03O2AK zr~}ri>MVpbbIpf@0zw=gVUOutQk{4zM7Iy_Lv$O8)eO;Rxyg9Svh^{wC6c zMzPA0O!DIevJm_B2Q-!wUBZOUl13uV_fQ8@`k!j5JSP?739h0ZUzk{Y*bH-@n0~aP zqkFR3cF?P-+-g_PB3n#UEM=r^-*|M}k<`={x*W5^<C3(t$8RIy ziS(-z>XYeq*6`chLa1E%?<9F)fz(s47wr<5i!gcL8|hXvpcmp&p|ht17i8J<5y}R)eN8c@oL9&5%ckAZNjmyX5)~wDyoGFrXP9 zc1YVR(uwUZ9w^%5%h=?I;*W`G~y5h}Q4Y63)?=t`a&%I`f5*ZQ;m{ZGnTq^L&`K1h;Vc6Y|WB>Gbrd{@1->M7Vj2IU-wT z!o+<~sXvuciWe}tjGtzjZBRR6NP_Vp$YId!^!BXnYWDWpFEY~AoEm9Qr6@KWCLg?`?(*|x{I-Bk;+A?i3CgKsNfd$swp^G0Z|*2 zi0zI=1p^+W4)tEqgNJiE%SO`etsc_e*AU7JhIuz_E$DlFD%_eCjJk3gOE#HfKfi6@ zV07g7=B+$ZNh7S-JL6FPQtb@h-k74s#?IAO5X&h5hi91WABTF0RF`qa3gvrSDTW?< zQY2HhMZg~*`@H`EO4he%;I((lW+9mfVT1?Pql(md@d#1?$;?SR^5-2sm3Y9n(X5RC zj%GV9J0jzu`d2*VuBOqAwkaFLxpZq~`3rF;Rr(sKHKwC9(x=;%V;rg?5K#M{dfHtg zBo956%x?poq7+PFyRr5rpww9dn@A&Es)Z#_41Iq}g;TKHbkygf&{oF|Mh6J_Kq=XU}# z$j*BGE2#2Jg#IlnI>QRByg&~#dV*pY>+VfuYJMdWUCC;b`41)*8<`U-5BIU# z>sZn2vR&NyCPa9mbLZn3VcB!}aaONp{?xaP^vy9=B>81B9nF#c70{^0F6_tJxh)BG z-xEO%u#w8BRN5s`f@JQ0`t^%8yo!;uS0*-&a$}e_;7J__^{p*W!tV+XwS~AV8Ig9A z^YQn8z*JfvhT%z|x01$IidHP_>OM~RC%2%jRH;TLZB&$uDQ#NvSud_+LS0IuyG~aJ5=B{#XRKI4RZQjHPFWr zyrB6~7?TJ<9Dlkvq^qguhwSXGRJGEq^k^1ceM2;WiEWX7`V)|+(vn{mMC(q- z7oD*bMhiqfy^TW>YZt6c@+^L0aVw@o-oW<7UeUZ7!ey2nIh~2YV8dd1md{f}r3kCZ zf=%pKn)6iF;GXUqb`!>S`6}CTqkzgs^6grF7SL}Xw=F%?Z7U|`EJ?x7Pjl~DQ0Xw* z%#kh_NWoE%bYKo^LVHN3n|!tb8Z2kaJ+a>(OxGOo3R)wg6k64lAhHrXh~#5xmE1n# z4}R4t(&I+^AuQfzT3H%Hj(ZP4DVGhgn7M2+VPjK_kLz02!YQm3oBdcBD0n1#k7~!6 znQfj_1%;ef8hjNqCpdMO+D+kPbN<`c{d~ zS`yMlsU(GulvoBu+^oy;{V*z^ytKC5v)rjH+myNCeX&{hdd{PCQpyduQMxD(%w9NRGTrJ8>Z;z9WmOpg)8pNrBN-5v+E4f`I1lbzIUAAPo{qghyD^fNG%Ky z&Aj=9O|;~Wc=`&Yw#fv7?nGyJ*DPP8!~3eVYLGlwngnIs;D#%nF~aoc{{YupDo}bE zxyYV-+3u1<1SUA~fxDm`&(}3d^7U_|7N{QI18d3{4EngoKZR47f=s1u)jn~(PDwua z{{TOwLuIJPcQKMU$%;7&`GtC#-Y`hX%Iv#usZDnm*~nHRY(;#@$;Tg+6KVI>)1|q% zTdc8W+6mg;*{EZuWugU6hAp}!RN5=QnRJmX$|Owqe5hv$qTT0k6NYu zp!UdT5g@6(^Gw!~$Om!X%Kv7y3Yi{N#)o0UYvs4|=R_{?Rx)8RpxA zI+3)X=(+WzGTdIvY|%F8M1duhBN@mT!S)}nDb_Z(x2z($vdsI+!3;P>Vo%=3zvoYu z#Pc>+H#;9>Fh5MXNODiMdsOk*!>XXRj$MOyno-Ueb|ew$Q^9NGG?tNEs>sX!k&&D> zcwF`sJO2Qo+6#n%qB6M$ufR@&r_OW zY1a`;CC&I~;wy`GPz6}n9WYtOEk*bd@mx~Hpt?U zh6(Q3^u<>*u(?wpxv>#Kmoi+&r9d;r6yZtff$DqIUuKA>k#zC8tc+GLFylRV{Q|nm9^$RTZEbUHwp-|9xOFBaaq}nX#TQ}7iFC^ZlIX={G0xT4 zugekY52)`~($`AU(8n#yxMn+)E&61<}v-y2fw9rdbfzDj!15-?%22a@g)+*Bq%jH)5A9Vf?6vEZ5?Yw@gAXLBxGH*mYgIG? zv8j^eG;$!`R26wWK^=guX+2JeuEbiVj`uqzie&&oJfseIaJ?kQuVYs%t)aD%E$(j2 zZ5#c7R>SDl96}I8r>h5AZPm06C}1PchWmYF15qEU+P4tAz*` z&dC6D0CvS^YMRBgH_2^pV;y7jW3;6z(df!fx zLYB8gmy;&}K4#BO&4Ns%u(1KQkK+g1zyAPQvvmW$@h=kcA1MCqB1a*Whg_de^Tj2o z?Pg13Zw`z8i{v|Ra#U~0LVK|_qIJc-4IFBzJQ>-HVs0_cItt6QQ@!mH?7Ey}kVzfS zJ#kj%lGrlZUrdmB@rI5--zG z9o%lkBbOuWO#=W$&r=X&N^~O zYPiwr4otBW@W~`r=HBSK0`lD~_(;LwK=m}&NiCo^GoLZz1eXkW^dz2@R{rAV5MzeM zNth@Nj0D<$i#^9`mOT_}VIh)fQrwY+4}#6mf;+8g$r!7WEy|m9iD9`DOECFd4aX#X z(mkn<;f*g_y-D>nCVYk2=Io8|JqLQ#x6q=|<5+D|WzpqE3j&>p2fZv0ZxzaEaykc6 zWHB=Gr178rwM(j!_eaZp$7$Lyv_`enT|>6fZorUKpSpAC2Wq|cMG_f9?{b)s^jr@3 z>?t(mx{^55I;_S*tX*=dnc(Bs6>iSy<=u;z8+h`>i53KeALab(l2em+xoIRa-p}^+9X7{5=R_im_|Duw3Y5rpB2@utf6m}5g3AGknzWH@7k8s$9bv5Bv4jCyUgE! zRCMHas}{Bv`jyiNp%cmg1Qy^gr`DZg95(R>WF|Ip6p^6FQZVPbxd^_N$s*uCEid-Q3ZLnQ!AS5vZeHIA-ZrPi<2IEksOy8Ruy|^I4a=tniZ*ak~K6aEpWa`c``D zP_5KyEzvHL5UY$3d;V3`3JThoO0&L(^|YkMVz>?ENh!#iEMghp6Is`H(%izTmfXcN zhTVnSy*Cd<9{p;(H)!(=D16zG5Uhnt_1*_Z813w9 zNK=e9GnCwlHjuFQ(_lDbCbJ+kIZ+)N2py*B!bLbBTRPYLmu46jyeA5tD2?8p(V3HCDOE43z*ni zf+Ib4`ySuUsx0#}GtDe=+xa*t978GxRXzRx0M8mnxQdrBU20ZvC5QS<2H>fkS7>Z~ z?ho*T)6`ampQ9$4q6=kc5Kd&Nz3OCM`9~!z{|cc_DMuf1WD+zuPV)<~0E%+{&sycme(s+LqGDTL*U~ z43ZfMQ-Z{tL!z@e; z5*9Nam?x$W^7g8eAQ1hsYz2a5+NhgUx6|p(Sija|dskRgJ;6V`aNwRe+DEUwWl48` zbkWGHzFA^~6y7s#g~kgL*aQYbJ%EK&qb%wdlNKXZ>yYRywo*wHpk6I}}^;QL5K6BFe+ zWq|FI=}<=_tTQxIqDUlX3`fjPcp2;{d&_v{cDjv~6&6WVn+1n(D>Cy@NhE0?T(BGE zSo!%oXV6usIRlbK*{+R=4Q!=jSj>`%IUMyo)j959yNzdx_(ritUfdQTLwC=;WX-HW zG=XE7A2Cmu+xKo>$_IRURYcVM z%B_yQtE02it}b9LKA3?*;Lj8xcPQ#=xuZ>3i#aodeJkxZ2^rqTB?08$jkx~xYIs7@ zNTZVF=9A7c;xeZTw>?Pd_}5r;C?m4_cA^n{@JIuNSk&>m9>0}ACYI3M$9)Zx%WZH1 zMJ!}&KZjxHd*Y&1lZ~u3P27>}u5E%O62O6G-xEm}%JLD(2e;!_td=`SO~v!$v??ZhaEN6gV|U%R1Cw0NE=H-OZ;2M%t@>Me zl6=6dxFZ9hIpUvc!t!Y2irzRSCl0Q61|Q!40B7k@--w~J-Y-&O%aGj_5232oHz^El zc?`)jvTY$c=DxRde4ADtVTqpLhyz6;5Eya2!RPYzrHXlDvSpH2%R*7+Zd-185Ao|! z?v_H~EiwO`5 z7TmKgFgf+5cxKbdp5Qz_WP5ohY4-G|q!*i{w~xx-BJNWn=bpJ3=sl{rjunZnB-GHR z43SL4nDfz?FQp7DM{;aZ*{vmvnBWD590MkLs%z7-U7!1U&? zTw}^ro;(L}@ojjIMtcMvm>Ko8;NG++)Yc}_bC)gejB?ct8 zEIwyb_g5peVd{vFETRoQW--PlcqKV1-7*jNYhPHnd2OyDy(TvDvd;BNDAeMPzwqX=?;V!tx^$M+Lot(Fk#_^~_aH)b63=HD1)9n{8`^fM!xT*j>vsNLFORqK1 zxRfTxldqS9+*5Kwv7*+;SBveQVYiMMkDiQpkd8CQW5*QxokvN5;=QBKovx^ZZl^A2@9XY`3>r=QpAuUonyQ6lp zIxEGKY_E)_e)f7&+p>wEds$uG8H7+TLH*O3IhBN! z*#x?M)(xyG#!tMe1~#!DdZoUeb7^TVpC^*uX-Ha3ki;$yeMWoLk1A_8-%x3DbpHVA zA%EfSLH__6a#~t_uuk#1BuVB*9kNlsh-3LwIayrMM^YwLSvI>XP6waaL37ryd{(O zbH*|@AMarPMx&g*R8Ux^BYd{LMY}i4a_R__bR({QhOO<+)SVB=yfctE?VMDX33Fi* zYfwoI^-P*xFjM)6`T?@Z@M7+ z=9qE^xF^%nri;pw;vf?uNdQ?>h1!3;{OT!_Qa)S>5NJc0E?Ox1DH;5#-;r?UOQb0v z5rP&N&eAdWu~FtUL#LK$C*2H^rL@@d*zH*kdJk%`E5~tZBoM%%##w|!0zl{sQFH$Q z9?EW1&5&Gp9|bI+>=KGBf_dAkrZK&^v|dG)QbhIu}K_vXyI3s zVs{*#aZ{mb6u!+2H$qow32+Rku5ju}YwUmfqqxB2?bKSb0}D1oB7psb;i$d3H*r;%Jx3FQ1!^dek;jL}?Nt zExQ97w=L^@}Q86;2am@wN36a(@s?yIHy)@{^x1o{Xk)aSQ6XVlU5gtoqD7TMZZ;RSrh`9U2%y(*Fu zWXuVX7)zB6^N7I#sxrnUXb>PLGgf8RG(7m~;Q?8-* zc>dQI5|?i|LSyCaRFG&gU0UAX%eB;ER)Sedxl#b>*C+W^8%x`%rF(0!3aZPH;BCfF zABHhgNer^yM`avqnMPw=bv?x}%&8iwwGw@x7{mk({{S!EZ)NxQ0<4gTNMd;+Lpx=G zWfllvrt!nd~jC+V11!E0ja$Z3F%9YHi6+wZ&-^ausG7bT|>5WRvYnbvmj# zT-u_v$P!4L4YOo%!Q+~N?(Jn+TH@%2jWZ*=VUrwf$A4;Cm2@jyTn*96$W*4rWljk7 z6pk+>muyfoOrQoNWCiWVtwVCfE?wR&v9-KnCEdY2+dlOiSCZK>+e91f2niE2X9{}} z+>csZw-+%q__mwuFoEVsKtjhm3Fq_vRTIe`A5Xa_?C>_}V}#}W!_|rYWBiC`S*L|` z+d0BJxqmc{zQ0Ox#SS~hEPf>1e z1W>l2X$#!T89N|^@gN`G^dHL=QKO#4T_-3dF^5Pq?Z>ZrwD*xsdW##6?D;ML zHxU4(4}Y&tJ!%;rO_isf&h1_{;nW}A6bG(PS{1}Xbv228%_bq1WY`4YZ6`S#_B|>7 za*KC1P%uFM0P*v~q*8Y$&{bVPhgG$|ZSVuO7?cgswm$yu=M^QC3X0YiY*7{^4YcKC z1pcS>t8rGi!fAtQ0_DpzPqYV#I+50yV3S))(z_DZ672HScF)Qi>-klMhD(n%l6H<5 zzy0|v6V)RR1uuE06Iql zGsBY287Jn?Qh&yiXOsSwsM|;(*|3Rc<6M9Z8l*iBq@xqa7-> zosG4;aZ3%mM-ydYjpZx@XQOAoy&lrzCZ9Jg?3H*uw7MoZN;q+B|?NX2)Q0RI5H>;+@rT1j!T?Z{?@m?A3j zJ;)t>s@Bx;B-W%8dD7o`>F~cy5vwypJOp!`f&naoDHi+}gnQ!^-k5V*+*ClKsa$szN8hwIdKP z%xSX@AHEM^L+p>ukXw)6N98%)oDQQNl?jg4L=eY3%2`T@-ODI!XC9!_z1WLOdKxKO zTWMkt6WKISqe{X?lonI;Kf|9&sK(;Gi|wmg+g%2N>NeTKmBAzH=~!3y-bJxz+Z#zU zd2E9tKA88V)NkgNN4{3IjullA#+_wum?!v!WjK3GOFh^eVP%uelH!!M(RSV}pE!c^8m9VXU%&AlRRTmKynlX zCnMgf%Xe`;Ev*zb_Szk}-ReaO7bVKf*-Oc8E+w;)%%#}_$&w}t9S=N@Z(rq5Ca7*< zlF;d?Z}SroI1QZg;0}Y|y;oV>D_ULH$^NWjK)`4Eii+#X)UE~5hyv;pb3O*pI6lIf zRtF}@?sa##iaD(1iBLINRE+tU;C>ZaJExvjm&%btJ{SSh9ml0c!*COcVhqHp!W8gF z_|(2a1zEznuHl6TsqQL?EJJj$L*<)P^1RMuWd!8+&urCTRu7a!_$)|AZNPiywN_h) zONs4PL_S)EbsX|dGHZ-OwC*IIo%6sy&{1m>%p|L^S*N<(gXSA@4_==1$l2xGWmb(N zUQA8Qob=+GIJcHVG+?n{6iDsHM;Qask~yS#zH+K@fU39v_x$RtNn*|^1hc~-0vAz& z$L@2<2iAtP`&0RLmeRUJr+mo7e7^naD~&?Z8&MzHg6?caNZ_|{X}0pp{{X#}+#k3C zo*TauwH?R#t8H&AhSF`OJ-%pubNwpCuD2GSELMoeZ0qveINgJeM>PxEPJpD(u(v^+ z@#uZ(YkPEw!p6$;0v<0fls@MpiZs}1vhkkU_SQy7qXLs^^ zNVdk-;{=h@Bz}LTF%nrB8e~^yZU9^>6WIFH;^i!1XfEzm984Y5jBFmDei+3qiWwG> zab&+}yVDq}N5diNx%=4dOpe}p9t&G}Vvioc_aKOHaivKn(E96zSIXN%!T64 zBgasB8r9M@HQOp#pD}iWDrfGle()8QKkh<2q=k^}QJjzmLshOdmYk0=RSujMMGKMW z0Hcw}Ig&NJLbk=@Wk}+TAK*N0BlN6$OT?IYPVEu`QWSBVH$oWu`qM5o)VWz;OKE(+ zEBEQaIL~i-z|=KAE>R-8ZVCjjXFgc!2|dke3R)Rds+Pw{HAx!V%7)v^YhcYJZgTkP z#yT3OajQUIqi^G03Mo zyXLf1(lhq0>`SO#+oN0Cvq|KccQlIJsmDX>P>aWo(A_$+9qqI~ImKwjq_o;Lk?bl7bhoxvX`;d?`L_;nR-91|Gi=Pbn*7=cZXqgGLSs<4W16w{29|y8YRfP| zxd$gco`dODq=qYa+DT_tRZwFdqp;6C{Yn1qTsBb29HPo--B}Dwg+XH9-RGt%)rG#76Px?1 zSsrNk8yszj`}_ORW2@L)T}OC`kRX$4GZBEpu6_OM8BO0qRS2!h;=$5CFCR7n1GgJa zIVQC&B??Wl>BDLO*~q~?&OPd@YWA9hl8bvnL`+maXUXRtw8oML^1zf~jw4|wDhFS! zX56K@q*7ZCy3D(-78FD|*i>-5(nBO6U8Ah}H^?sS=>iI|w@%zUW>t}4>l&mM!S(y^0-Q+CsS(Qi2GG`b+g*FckOLqG$zIJXM$NaM% z{`JrZ?X4{(^X>e(NyY)rd*pgjXw3Fnqdm+a!$u0n8sm8${kWr4&xE`L>H*BPm3GMXxpnF&%-54J}0BDtumYa(F#{&nP z`}@>^qlCmRr1Ccc(K9*7_dc}*t!Ev$if3}TyJjU@p=*9%aFp zunUfXPfTNq)j^p$h}X5(=2I$3Y@`8+<8>d0KE3K6?V&ry(YV95(Y1Pdlj~S_x|2+v zRCqfuLMwl)9_EtbT|!8iEvH_fq==X(#B}^B)js5VLvrI&fn;dKyv5K1G^*e%fQ|+` zRY`RyC&$@m63%k7!c+ZNAJo=O=R;bXEOt(l8Ws(8Qe_xO zmLY;ixb^on6~3i)rQ8jH7tCx%9RUgKYfMRS${HJlf>7mMn%_7X>IbP62C-vh_9D8C zzy-cws6O!SfBMximB!VH^!74a3ssD!*;-edIM1;36>s*v~8l|vBQ0)UYA!!!``wG1TS7Q7hImz)WxbA zmLrh@tYS1K7PRb+Y6rKRA*)PcjrBaSq#Fo$XaEdDLGMt^AMzaii&4x zBv+LfK-g7|GlpZ_5<68{t|w+;EW-A38R1z3S9${wQe85iw*m_lYb!)q!_Hh#x+)PWjV;;36Hj&S^5et<=xDxz> z-22vwHd>J7eTiP?BOj9(D#Y;R@(Azrs&dVGE(laWr9!AVKaOdu=E~*@`nn24k}jDwoK8_2rU@MF*i_sYD;}K<~3V*WQrAVUD>ij`Woky(?-fJEUi79 z_fSf)$DO!gD|7^QHEd~?ut*-_>0Ud68Ia`pSRCW6MIF4B7g0UM@Nv8<$K~Ki`R+X` z)|kfmo(qL#^JOAQVIfL$#xu}XZcf@3q9(1T+1kY=&86bAG(*aSjm{e#JqHz5bo(kU zVQk1Y2#yOJ4At#P@AUbWbhB3rFh>!nJ6E${^**&x@50_ie9*JX(lQy9f(p$!i(a0Nl1%iWx`csUe4KgUM*CEp=pWT?`;0nj_1X`JCFzQ@@-dG%vdUIN- zrOO5TldHt)gLjr=CwiaZ{3_Lsnwq1-ad!SxL=-Mp8#+> z*{0pTM*KfY)3nnXSfiQ1kUDORp}|r(AlA)}iwt)H=E_w8R1|N$$m5?{vjlo{Fr+IV z`a{XJnZE2`^T7JlO0Qy}Nh2~n0^w0)h@puNNqG8k(9~bqwt`fFr%3k_V`e@70K&G+ z*S0=nNh%otCC<&t2d!mY>b4N@?p7N@m~hGRg>U}=RZ%j^7t4^VNxZRm#sM9Ot5-+QNL0(cXOjr$zZ{RH zX3HYP?k9EgfcbI4<2-!@IK{C_RxZHB0$wJjtLx&03=gB+$Ori#~{K0(W9KQj{NoYtUEa;dqkFekukt|I3$k0g*M{Oc_ufK zi-02;420*8;$Lc|O(&>1vqaq$nXX>$IFN8;btEs>-`<|B6|#9UN|K|TfH`5`8SPn6 z+}oY9Jb`lAXx+N|eQL|ksTh2#V;Zh^NgF~AM;RIF4;0)ICz#OG{8M~j5ZSO*I8zSX z1sLZ(y{aZA<;W5uox!G7USE!jj-2+Yzjz(W8!N_7BmI->QU+y>U6_2QAyr=~M zyA4B7ovyY^usmQERZJBff%mF6x|DYa-d($9F_hfgD|9BV-dW&AZt=0$^lTOOKBUzt z))ksGQc5%90DZyl@5NF`mPcnK#a{AeaHc#j%fxs+K=m~|Q$c;Xu4E0mFk*0Xmg$~7 zs@9vQ@3`4zIEXuA_l=x&&(rHwH8g)Q?(K?37EBdkw2yi&r6AbRi^R#N+LXSGJH-ar z+inW_AHuS4H7KQs-9*tUpS+=Y&#$#bF^1;Z9tm&~L$s63orw1p0cd5nYk46GS&kV9 z7^;L4cO}S4B+FqUTw^)M3Vmv|#loY!^IU;6gbnOC80k_;HN4Z0v`_Mq6KLR!bO-!u zn@-6aGi@S3cf{+EMRY|NN>(ikkc12qmKee9>V2wKyJuaJNDl>Y2RJ>eF=c6A&$y9O zaKnMdK;Qs7nzIbE1kBh~&T_*9Q*lC!+bleyJrfS3el1Yhy*)f2C zob5j1l`X?WV=Sy#{_N+kwJKOhLESM@`9*e*sU45CLuj=UeJm}WsF$~dc@g~Y82&c& zKU(T_FYNyS5?Za@yiu&>aWen_3ZsR^bI@7IYL9U((g|Zxx6KC&><4pNT5XZac?eyH z%<=~LR34`uwaHdW`ZK1KbhAc$kV9n8BzGhs0E8ogJB(D5Xiss4n%t_s8AA18?OV&F z!zIexF;nG{y!sBpt6AL}Sp?4s2YUuq8N!3qepMdPntK@Bvlf#R7=v1|jqoH>CJr&) zui9H$Tb+$)9Tl>Gzuq6`y(HHbB~idovW#bUT#8nbHH2H;#00q{x|{;Ng=Hq$vPmKT z0NIhX;x(hHj>1lH{{YviTSi+65@`>XrLyae8{hMy3B)52#=A(uo~P@Yt*Kuarj9qh z42Zc{$RsNsq?*po<1gK5zE+ha=?Q6@=8cyb3-$J_d8EC2Qo2>RQxPmI6%1^Ij@9SAt_qtS&$sMX4st=bDKXs2%PhNd$i^L>VTa;&t=1r|B z><9FxNq6N3jbRy81!rt*VcMFclesQ!k=!(1Sh-SNW6nFRUS;)(KkELv)>|-gSSuRip4&k?PjNp%I zWSZ5(D@SV|%zt)PL%|(C3eCN_JL6Uyxg|(Fu~hGGkg@U#vw358^%b&$>R~FD*wy~k zkjvz6Q1AhWpSp^b=d!xgh3uCCVq;Syu6Cg0Z6l`@k8dkHdx;<_e1{yLrB5BCkW8|~ z(S>rajac@{}y$wU6E61m5E##Qt*RCOrZ zSe9H)5UG5a$6R~Wn|lv2(mSZOuKd348*VrTu8SLJC1^J9nn8stCm^14^a8BKZE1F3 zTe*a;oC6zV40O+}bIQB9v}q$7PSWo$%y&^cN3gp^l6Icl`d3roy(%Z!7FW$o?%tWp ze|H_ev`0KCZ15y0<;XTjRA+O4bb3^_q*HddFKgqDSh_WKe7551w7}~$qs>$ay;JQZuvVfp26#oFU0IeUg ziC#B&)@BSspl!T&sO7MZMmJ!l`2Of(epBsKq=S@#%*LcNl7j+*tcmyJeDo)vAI`2= z+RrW{xlls3QBYtedIRrOCXH?6hGvmsk=ttH`2Dfz@9SGS8Gj|NVTwd&h^E5B13rR?lG&tK!P~XYV+V%z6yB(Wtj>o`CTRqX9A)Ae zjO^h(PAXfSKS@7CkttI+m|%9oy;F7Sb?S zgBgJsV0!)nvOG=VTYVx(Y{VjAaJT{{8R?wl{VB#0ld>jKj8P@Uq*B|6rMnVu1Z7v{ zQT{cbd8XQ4Ne#4emUM64HqdwRfuCVq=CR^rCQ!ze%(1EBWlR|-l>S|%q?1M(^L&}&V1JL%WdUu6xUORn3?_=4!FK&knex|w`O+L>^m_eh+`7414=Q;b$ z>;+8RVX;w8dz>7e9KYE2krNC;Q?@Bv45|%uS|*51sYxUAq;Zl|U{`Nt;d?u4aU(Jq z-V?c|UB!=opseQ_d5{)xVlA~E9*6L#mL^irsL+gAm!xTLqT0!MZ)lGzF&jdh1<&61 z`c>z=wwifowx4?#*UNbhOTYJhy{YZ~h)K7-Kvqswfo8{S`&3XVxlgrCaSX8rBg|O# zVe`nW+?=&$v5JnxsjeNMd(a9w8yOp)n0+d=&@`(*nIJ@U1I)o22<|G?m4q|xm+crt zbGR`*J$>l@!n20W*xh`|F)D&W#lH%bWXEEpQX7;F8Ci2769~o_C>#;(TY7z^$g^g; zbY)@kst$sqTOBOUmkk3%005|Nb5!8H8hfBp<{Zx8Yd#T7yM=5MHT>rdbqy z)9Fr<@;RejsA4F%Z<{;4@mnfs89BCSL8#2jzA__qV})hUez~P<)YI?$v2MOwF6BuS ze8lp{^Q@bjxR-QxQnaQ>_LpLRELC?CeW&-cNYSD$*?+n{KECy82!|$LyuX4;TIL;$ z#BC~h3y#$i-QHg8l1K?*!3)4pILFqhTeKHD<8*cM)RfC`-1OtAtBU9Bxt)o(bt8H% zJh$vm`R1zDChe7Bw$v@!Yv`_Ii+R}_?c7w4ZuO&~TiQu;9o5|NiSxN8kaEO-68d#D z2-Iz(jUo~=Nwl@O2l%^_Rqk)Uv*Z%V2ooxa1SDs1VcY)ztxs`XBdzfbq;`Pa=+`L1 zSr^aefHB+Bu=Pz+J6KGTUSzB7iDMkQd-_&1vUrx@!)OYle{{Uvq z4bS#u*7HR2jxokhT%SQj+_FImLABvNdovZr7bAxM02;5UYxgg69i6ygAb<#(LA!DH zKA&2x*z`!Y_ZAm6jR`XCXWPCUWaF+X2&Gn(tn<1CY$`^1IQmr$F>fAS(NE?O<-)4` zyYtV`Q{tXSc;4DT-fm9x9A~*6)L2(1xSSVehGkrwV4RW%VtZCZe{Z~zptf(9%sU8t zu^HrNzAFC!npZg0Bt$$DKGU+Zt;n@DDo?R zqyW1}&q4=IKRTHyGLwonEN0Pkmp*OU4WpPOCvM_>D=SmhyxXrLIh5s&<}rYP{{VCf zy<_n6T-I(@>i*C~c-*r#1Ex7|U_Uz7wD3NYrQHbbAAAgfna3edrhV%-I&|Kww5Kxy z$4$JwM!C4Wh%9IKMG3}xf-7@R@TR4#T8ZL}CA?A{{$R*)(Eh#aa?;M-UIn+YRo-@} zR16$?nzwbTrh{m7=*baDlPs*D1@*;qPP>!P+AvXCoZ+;%({lv(F~%F@GHuTkx_VgI z!jVf7u}O;!&4HhKk5ts{);7C}aVvmWI`SNL097b%uP)^KR92y4QS+HcY+$$2w2UPv z>L(9xC+IIz2JD7X=)qO(z+hS=hBikV>APa`uj>ElTAMKq+{ySSM##o|^ z0dfZopXe$(y*BZ|v^u_Xj7ag2uHK99O;btk4tfyyhGvS<>}-U{pch%UWV)W<`VUH> zZkI4BJ;m-Yzq`rho4s4r?QEsprdQ1CM{k zy5g0NX*Y8Cdq~tqgq)4co5?IsU!bVhQ-v-T;#)LyDYPp;1oX$(-m68U>a)m_TZi*z zBr>tvfI9Bga^4xiXB^&0OciqXZ8jZ>7bj2ixYm->XZvIQ6B(fhheMWxp`g&CeEu)E^ zV*!!MfU3=aKtFg2wd4q+DH%Z+89r~!aoZIe>L5E?T`2QNAxS_!T1x2-$+6aYV43Ax zX;*w_dqK=J&!e&EzJ%37JFFQe3+IaEg-vM$%#^5o}+rI*f;zR@dNA`%NaspO97 zj+JKqc9Gg8bdW|AHub{D4^i(~(^$zR+>bY;)P^s zWBFA9?ax!~?ayjQtJp-_e8miZg!I6y zZxGx|cVw$$aKF9I##4jGQJ-pt+U{s=m87;wB|tpZXZzpa1!)>`+?OP3L#D~6p^$}n z$NH}%ZQMS+ushbRmF|I|JH-1*5C(LV=RD^Gp1jvDb>e%`6T=0t^IgD$1As}zGV4U~ zZmFrs7QHNL@de(orWI6<4o6C_XMc&4&uxvZW8z(ucCvk!OjSf1Vv+(5N%pQ*e-Yek z0R&`{Hx!h)+It_b^sNarJsQd(b1`FZj69%^!jAs{QfbU!3&jVfzIOr<%!OiArECAY#bkiyP zk5tvJg_I3BA_*ia{W@fE-m>+5M@6)_j9LQwSOF7bdE=VVNmL`3ms0JNnqAD|3H1Ty zIR5}w6Ky>Atw}$yBDac2DYfdQC)+)v*39@I+k>ESJ< zhzBj7G0zMS@S2+KUipMDSx9`mG9nxXF67FZnBa%n{npd>jyee%COxC;d_dIgp;eL00)G{7lU`$>?#qmCuRw zo0DK|3@IypO-G|#rfYi%Kmaw8v|i6;lS9+f@I!ws{` zD0EoCVJSI5?gw*DG}w$hVF_*Bf_8Sa37# z*b338D3F}4RM#bV+8Y~NLo10q#&-F5Jy;)4YN=)5+pSp^C4j(_TriE?Ztu=LtEhb; zE+LU+mwes7~ z6OyW9$tTr*9--NMZ@Q7@Pe z&A9dK6b{vX*=u-KLB2+4_-9ah9`u(p#4pjdkqe!sP(Rg-b;o*5G1SN` zi>kOq^BA^r4}4UU&1Y(tS61_pZ*HF}O1WuRADE~kg&nHn+pq#G&EOFzk4mjV08nh&Bib!mi?Gj6HM2+qUKga>={{YsaE0`vREiyZGhst99VSn|x_V%q!UI>#- zYdsRmM81K5b6P8gg%X?VNg5#z~#BlTI86fsbnuyC8gx?mHTe$`as4_A^9R=XvB{L0@lNdR2=COPh?@y1IkZ zkG?6tA)(rRn2av`?6y0Ylhhu~>IQ24*Oqp{bt*8CG4gT2?0xGd_gMxh?QCcBM2LRS zV_pJ|!`vRVpC^dbWXi~!ln*ROIBwYb()Kf!q`HxdHz1zY-q&pFD$OLt7klIppOlYG zihPmDZtpG0Dv|(pzeTLbFNl%6wKFpnSCbqCJpj+AO0BE-g6R_C(^a21eUTN91RV6h z{&dwT3C=b(meR^;e#)@}_J!Q?i7=dYZ%U0ug{Ddp`Y|hkx)`nH*p7eN{{Uoqe=6sH zv^9NS%}8{)6h@!xg6&ow{?)VK?*wZ)h2le~xRN`rN)_lmRQ9TrR2HnxE>n6U!PH{a zyw(>Rk+HjH7#@e|TKaj@(%G8oH%3vwJ;!71S8nuZa=TF!F~mn03|EfbM-^3Jc~zDc zj|>Q9Vbs=K=-olB%J8!6K3sA>RQ#;K5HsGMmZntO4YZCifD{Zyea%Wu<9SlOsPdvh zC2+jT-7p7b1M8gjsU*6vv9)P_)wpK`NAQ#0qVC!jlIlh*WrarMat|J6-WT4ZoUN=% z*2^FI%tl=08R`pNV&+zLv$$_38}~Bg1D>D#YJ&G&wzACkkw#mcvAF?X=sjujP3R{m zqf!koPIhaXheo)3hEm57k5D^(YSgkOm8XaD&_n?pa;^UW*RE~+XB^;4vc+uDCSz#^ za!2sv+-DVysd&J?n)mr4RxF-FbOav0!-^w?tx{U81o0H$j;mAgBqAhRHS(g9cO~+2 zJ0Iy-+J?DrBu3?ze7k`1qI@^g@vbXV*0l?rLMwYEEM0K&7WqlXZ%?gW@V&gcZPZH8 z&n(_iWS<*^3{TCwJu9_gAx&K6c!^Dxwf_JVOL3)L!EBSsv@pPI9QIT6ti5Z*8kV6r zv$&omfnY`qiOD#|Gg{MFO>~n*1-AKJGifk5QIqpFKR!)ZxbW?kj|5WM%?-pv7Q^Ru z>}2OX6rP^7tX(*CGm@N+OHQ*f>QO7WNXO1qbCn1C-j&wrb`nQBya^z;2ntBchLO9D zI|_rtI(^NJ)Yn%wEWc_PXJ9#8{{SIcHZtDLJj&`ttQj&&gPy%d^`%m3PQ_EE(L9#3 zT^mTGhBGA6m9vf#PR9eC$Jgsf{xEMPv>O&;=9TSvH&ZPH&p zCRZT7dh_X5?W`l;=0wQnc0qo3pKqmL+!EB)CvlL=b$@Vfbi|V4<~9fwB|kRb;WcMZ z@Rj0R&!}r4OtY|A<5k<`k=;S`t?v$L%C}I=)5i>rCLu2#H~R7YYVNNRi-QxZFPFmZ z82sywRhrT!>I$d-LA0qrHwBg@xIl5*}ux~A*63kWMkaBa# z$74d=W8{`MBKLGamo4SGV1j)y#WKlfiPlC6P_`H#;SEJB@}jz)tat=xY4rl5npBzs zimd+tG0MgAhCYYTRj7r_%XEa1CDdMXIRzK^2Wo~(h?QA9)SnUl@SwpUdVMN3h6!bk zIIX@zx0i3e_~d7>s@IeKmNtgt2-!SzIq!+8^9u`Snh_8xBXs~1)Yn95v|%UIw%Uy2WFkamS+lv2e8U~R39Q?z z_L^3@wvJVr5=WK4DH`<29=`pm8=IAsExoj*UQGV}Ol{lT0qa#-@@0-f(4+*RSsl16 zp8mD8Vr3~Lim}02Smmqre;-~)7 zg$C7xM6$358Hs3!{vt=MQWpaLO}BHRnOkg`iZZtZEvL`i%#03YX8Ep+&- z;f=0r9uG10C}#(F9rM<@DKyIiqmQ-Akt%H=Bf}^jrm~epnWSLZ$mjG&iz$I4s36knJvV^nIoEH^PZlg@>4z4vVlr}&0P1KP6x0JJ2I-L(lV_=;vr zSr~A`JZ?S3B$_4PnQmn}w}a)b&y*566W{t)g_WiJC@id%R%`%S)G~s50DJLIL^XCK zRtECvEn?HyxQqzja4hbBhwJDnSuF^G;?$TS&zBeO@a}u5KHvRnwP&WyG_4(#vx#E) zkxJpb&Y1_d*0i**4a}Q&&UlcS17~vjk@(hgs~Ek_VNJ6R`K4=Qyd_dgBZ&lShPX^& zK>B~5TBu^0N#oK;*m*Z*UUn;Uf$HAX;DjK3A4Qq zBTKpEF=dr;jlZ2|?XF+5v4+|KnrP*>xs~AAf{n@P_jB5>SlA_$YdEnWl2kKDK11k# z#-fK?lGYOO+nHHpWow968SuByw@zHBI$4yS$3!bp$KF%lkP)$r%6>*nc{rnww5#H{wX+fdMj+ z^07U>o|Lia`n30^=Gg@PWJ6?e05U(kew8US^&R^gR&mLDGFwL}4JLQ9e+rJO2iC4O zh_S-y9iuV9CfSbd!1Zo=3ag>pNRcELCq7(-k^caRbJSkS~>W6r0c8f8itP+LMzSgi%#&;5cDsG06H8AR8RiDrU4tlKzI(;oFa zb2{7k^1&fF%DKi{`T##)YP&RNxm10w?pY&-7LFJb4&(0@&NIhR?NREjAg}@?D$OP* zayWGZxA#R~g*2(}B$nd&p(ZtXJl85!zJjHF5$3d(a^TA(XY8b$py%%q++u{)$72)7 zH!{x?+sN>3OiHXd9^>$<4QjVCm@e*+r~}SqQVuc4PvzdGYeJh}2_rYjH<7{PzCAs< z)tIfp$|2$;R%sXRu=MrLYe!L732Zd~0Jquy0A<2}qcM40oN2W4&ZQ+){p{+WcN`3lN`Ll4UqXW+Jg3T( zZdiYXT}?TqX=N-G7-MD#0Y`7^Svf@_tl0sxFKz|nD2Ew&v4J2waZ|x4g&rGW5=Nja znG_wk>CIh&z}U2YVUPFefxPEx{{VOn$KI#0yHrPxTYGnzT!c`d<~;rGpRH!(?ox?W zEhCb5xl6!&=)_@n62AO&&%G>mP_mg-$W+3WLCTTb`qiyk)WaG}Zt=8E-@3r$p8SvV z`Bqbwl0=P_(Ib;~S^3YsE9z1mbsv`&&{i@W?UFUaXRdgvmnZ`ztWprpTPUL?aypMg zQru5{ah;Kg!|=NR89tRXcFP}^X#W5r51E^(jQ2jYld$b`A?z<*SVeGR1Z+Uj?mt%b z%~H7VLp`OnhN%p0BAMDBB?6zDlauL=_0z!=X&;ox#6Cn*7x`a4^|c0{X{g%b7}7r? zEK4MZmOjI^YOxZ6&|bnb+~D+|1zTwMO>u2*spbJ0S7OK%bB=nG>sr>j39`14V6b-u z7{nY6$i(E5f4l8la@(`Su{`M(*T9|Q&c*t7IO*w5mLw4<*yJ>rN8R$1iiy^pN2@Lr zV-1RNT1b*EA#lMJPDcRasH{3}-O{>+mq-6=6BEgYvgUqkCu7GoFMtmm?3 zcw-WY)wo4t!k<&e^RC)jMCGYw$YZvK-pQ>2@?c@PI3a=dJ-@9__KEH!ON*<7-Q}Io zN0r`#pcwD(Pide{zHQzmBYTiC06hjfR(0LY%iG8Oo_9!PEYbzRE9yNl>E5+!?8{?9 z8@R2di^+!y({7Zh9WhYcYR(~BK_L^(D+_rdBPc(=lhXsOHRg$(=Z*ZBi~(a=NI7xT z`wFY4X_}mte_&+!Noj5nN4RY#``^M3r8Q(1W@OsD=43}{Zi?JuNo|G{k5ih^)Aaj= zj$kG7yva8UXBlYDcwpYA(zRpo=9?YT-dLF>oW>VqWPnrqgmfp|aw;fo=dg_1i+N@! zeqF$F$D-%k6#12c`RI)s-4ZNx$5;tlJ}IO@cAC$&sk5d;#=a~O^(8D&V0);^g( zUevbiA-Ib6HHO;a-ZmTVMna!a>U(obV=wwUNq=gr(w*$8fG=LS?dwI=hLLK@#?w@{ zlt&4dWO;?-ICz}(ApZbLlJ3sxSOZIPBT_caC;%BSF^qj`M6;4=ZZenS|i^sz*jc&cmRM!A^Eff7^8vvpJq1AprTh||M(a*7#z@X# z0J4L~%0D-1|q*!or1c-5z?eFYrtK10^MUfeTE&`Pbdj5E+=2ja- za9G@>%#C>RC@2&uUJ3QZT9VG{2_%m4(Ggw+Sz*8>PhG(FKD8uLHLa7}*h-=zr+3CGT5{c znY^?Rpxos~cArz}RulaonZDkvf<3V9L$q_x9nT$U(ZP2(4Gp-8MO?tnepv`SJTv&aES%I9nPf#@qnSF#r#L6#<% zjm0yxu6-#}PmlXOrZ(~IH+xK2CFD$;l zjZ3>4MqSQ_b0(n#FkRck9g8&bDcczS?Nvaw<2NPKe2kHh%ht;wOdkIad! z)=-%;EJz94+L~-$86vcBu}JI;3AY<_&PepCjO-kyBzizuku2p%%bzk;E0Y@$$RCex znX7T>rYXhk)Awu16#r&p2RB{nrP*OTW#{-&Rk>oy{dx!ngoJdxL(pVW93{tr)0nEfIAQ7DqSYpTg7SNP^V~5 zG1~~EKHimL)Z1Guw^CoMhb1CcPmmn)P!Yj6so9lt8eb3F={D27t?cAV=0#R^EJ;0b ze(0(fR_$*TV$B1?8=djpF(t_yu=<`q`qk1+Zr1X-Y{ab?CTo$oO7qj+s!I$|&-SaF z?idQkq4YTHDXFwWjm@cGNux+!CWS+=mPrm%ZaNSu8NSXIcYi4Z#uq4dDiC-h-`b_$ z5M&B+sQD^0f+-r_Z9_=Bwfj2FG;Ute0)djm519G^&*5KIq-Sa?FDO4^OQ+&0K9E;hC5OK)zaz0^_$Ig=Ago zpKD8a?Cv8VXU>h6=g;?8_5;?VzSPT>o+*KdAP%5_Lk`4_ze>Y<$=RA)X_84;ocy@p zcOKN6T?>pJy9foxw=|tSDEB#46Bq3K$hhE%-moF z{@@g`!4pFqX)%)D8IYDckEqX3Gf~fNB3&i;c0`W>(GLs4&vZmP=Z(@7k_wPvt zo~=28DLjKD2v^K=xHvt3-K`r)Rz(ozHwiZ7U@}8@KTaxMgV=`Z+G|T>mIo~;mlrHCb`nCE^V$=m1l}kh*%D-&q}dtV|gJc z(8+-jK6c#W(*lHrquOR~^mld{IsM@N@4hM8U8VeC)>+sol>L~FHV)Z6{*^9TSg56P zX`SYUU(P&XJu^wop{SKD*2;Uqr(QI| zIM>a(kvK@y@TgC6eLG{EQ?Kmgw<>Pg)-U3H*c(XWKHVy4EzD9lNQ(=G&B!f{*y)c- zm7zk58I9PVycpzj=}VhZluWSJvI8x-lPZL6cgmjJ4_a7O>gGtNkcnME&y<^dum@6m z{c7a@0BT~*BtB$;LgFPGcK-kg6v1p2jB;B@Lt`d4#~sNYm3+eG85N=leEVyb1pff7 z0zyQ&>6*Icd_+WhSV%{d2QlDxJ;|jJdDvL3-L|mG$NXcb6ivQ3T@{r)wj_sNUf)`l z?#)uM43OBu1*~$8ER3 zi;c}5*=>m7hJS{vO2HNOnge(VM0j{ek;MdY1|2KFC(jDR!z=~!v%Br&SnJ&LpW zau(jPo{o7u`ukMx<--VDSrc(wtZkOT_ol}fDzGFh$RB>xI4pbf=})>6Tgb`)btnob zUO_#1q{_M=DqWc_GI9ep!HzuzHbW|Gnl(UX`3o@lfE|r8>Ns2db?=hIg#&p3hkj}c zi;prTf>%NYb`(62dN9XoNopqSN%j}GNi^8ww-)jTI)#L*lRRy~+JA>Xr(P>K!LHlb z+QWNe2-|ZflF<^|Vg3bT#IYcCC$GIo_fgx({!%K+V!|nGlB2)UnJwg7q&DYvqL12N<`7F(#3dV(6FY%EGd$8 zFE4M;Zz7Ua!TucgC)c$yd)AP7VBuANiAG1Q3J&3P5({fv;Xan=(I`V3GZMy3e9Qsp zJ*tVEyw7m+M2ra%py7xIx1}S^Ze))38+L8E3o6OXOWnQdwDUxcEqwTtGXDUh0J$Xp z01+p+_pMY(Y?ga~_Od(K2%uQYJIZ)boB@&4pGs(!WPh=}>d4+m0Hj2DVD!d&)hXs{ zeEIehA#ifCocV*;Q1=ZWiVL~IBur(NGMJJ~j0G>*M_doitCUw|sc){`zSRwxR6wzq zWjl`0KJfK4w=9vs9inkO3deSH!5`i4?OC5^oLpOMmDgjj{qaA%1a$|#Dnz-FnB7Rg zNTK4o&? zV?EEcB9+J4U)~LuGsLLu_(I@q3=i>pdR1GilvCx+CfVm^5fV6K+>zLNQEw7k#O7IJ zWGuvhbH;lLnIN7hTIS|3s>ha-9Xn&&)KS!;IW2|r2ptF*46`Z1BmV$+in%P0acs%vHLkdyb!tOJQOu zE$(Cy%#k!fn=nY=ZDJ`J2_;mHSiHF&R?N79PkPEtq-hm$Burcz zLIFf@%^4ZMJwQK|H&KFZ9^O{FiAR+a+$$><44`)RJpirfBCv%T7t`gES37eH4beZV z4@#pJopBs;-A!Z!Xg0c*$R|CAZ2DG8uDY6Xb}89h+?^)hR`RAtxr1W)&<~P6qbvS; z)}dK(k+@r*`Uun-RT z{hNjOe2*fG9Ai(Z^N;sxQ=+)Eo5{NFPXfY zmObzXU!^`HbYED-lN?6)Jh{q4DuvmM!*c&3c2f_T1%-`#&KjBRiry?u(>MT z^Y2P6q>4FWySYY;kav~F81){)lX?OlZw<`S5@bY;*KBAPnE*XW_O=fhF%0v`?^3k_{gTZzjSa8v z*KYY^W$oxO-l?dDXqjvn7@5ixkxMf+dFSgxh!e{5q%p?lYTcO#0QJEgYPO*NxEz<54Rk-8KDoTP5;4y>kP`uYsD%!NF@29bIg39G~TND+JD4%6|7)Gk)d;S5~KeB zX5D$QIt)NhD#xg9)t`Ma5(w>?OKB$dt+F+PlO-4hSrXjGp9s(v$qp5?)%!t0E6ERN#O<=su^`qqvcxB~S-vi)*5$SYxsFtu9T7?e1chee=K{ z$>L)X#`XRdQT-~=09rIr1$RulTaTBIT>5&7sPTDhC6?M?k*@MphFgzr-{Dh2(``v1 z0QuPq3k;Gyew6KTi>h5La>VeUnKA^yM=6oX{0{_B(|>6!Z55NpAO&)-fCBfx>6(Ig zWN71$8F!G6E)&i_#-O>m22*CyNU~t=JFu}2Lyq-H1?)`jw+$>tV51*4K?kq5K}3>| zEKLQUlp}xL#?7BQ9;AMC0}#NEw6tZADUkELdVhhSPFZp{M1v@-M|0GVPpvyx3H3cb zS!MHlpwQ2S62dU5agwLfqo2sPB4XeO6EK802;;75TWv(!LfUnlQW(Q-aDHIf{{SEJ z(xS4xytsyI9a=?>HzACP5Cul>x)1lMY8nxkc1aazN4+Ry(caCwp=E0a`ZjMH3Kh+BPY=IHYWbJ;u!a146XmhwYka+eH< z%Lxy*;A9j26%E|6yF^T?h@_;8BRCmXU+$WDzKw&C<)E5VnByG){#8om>h|vO=UEg( z_x@P$8`xv?sN%VZOZJFtXNflF%#uKMH+K3{CUNwEJR-VwEA4-1#GMK5KfAI2AlIOCp5xBWGWhZN0JU z=|?Eki$83Hm-6KZ?e`_!h5QGtUbHf-W(7@**<@)4{yp@pN$=oTgp$A}W{~+y839<1 zFlf2Dy@|xG<%F?;gd8ayy@edNA39r|9mcoe{W8^9LboKLB6xm8RzBV98h;Q=Bu#A! zFBxoL61naxpSi!iOP{hyI=GO0u_)+$NU1I4m5Qkccc~cNS}I7*)^9{lbE-(t`Gx*b z_s_LbeNuVObC3@7a4>iu%BKnD+P&*5ZdWSto(2K*^`^DFFwBC^LndPlmFk4``eLp& zMly1dR&#fA81f6qKKJeq%*&5%rlqyFTZo|M>)*yMk`>sD-_jim~cEG8!0?tACc z6(c*urZb5E&)r;Sp1jpu6ne4N>1$~)Y4*Hdame7I^&Y04B{8`W+9-(z;Nu4@f2pXf zCxxA@?un5j8^fyOX(y&T)x=LeH@&#Dz=?MSjN=`%?^4;KU57?vd4&F4&g21=f0cdB zHsnlVQD%uGhC&Q3dXG=3G(%^18ZGsLnHD3ya92EiJu62_($XuhwX|EFM#@}&10O{d zoTQSus!f&b^pCZ?GT!Z3QS$M|c#Qkjz|*d5@6t=*ZoXdM+{Yg;kMACy^(Ez_=~i(w z>2gS9pZBd31p+^BQ=YXP(n}+3)5n~fxlO+@AKlNbbGbPhD5O_=n|m9O$m@XHq=#rE zXP-`<01QF%zSTtDY7xRMt>=VBW->^P9t#88Bc)AsJYktwge%oQ=by3lHCgXt-if_& zCo34iB=Q5{iOGV} zZP5S}?;mvk07}%h(bOX?wVM;SbF{19+t5;!U$V`1Aax3xf(09$anA#;KRVI0xQs*~ zTaYzitLHT7>!Di`# zYdcxISW-pRT)YxPv?{Nb(K$bO9P`H*Kc!Hc#8)xGmLN!WMp_0_fY0iC@%?FXxedug z+P|}~vjbEzg#~=Mr3Znxoum$?v&7Rpit;>XYaQ*g9%N^xK9!vMh1KiJ4A$%kP{(6q zVef(JYcvf}FP2S7T|qg8$v--JW4&mpyAtXnvxebT`Wft7Y*w-5B7RJSj&tiyySBTx zw@Zszl!)1%$zlGqw_nKCew(NjSf**>aIQ@LSjkn#1Mu%!@F;aMN)|%n_fn?{K|QM` znr4aJ6r)#(7+tKGlje}GJ9<>2c_oY~k92#tBOn(}d5roD|GC{9$#COp(X>c%~NYMk1b^F)%joK69gcizWE_WD#zZq&y25p0dy z0!J88-)KIyq+n+17DW3*hSnA>f~U+mIPQM646f0{(g{eFZ@!y0y@bHQc4R2ZBevUlKz*Ze|4S`2>9!cl>CZNV<`NuA6dG19ik- z#HY~rs#38nT*`(SQ4h)Tmmnx#nyuTXn-PWOA~;)eAXB-C?Z;}Kc!S2Qv9uyHgS>LX z(3+YZDtT=h^ZQX^wOIg9aI9 z$NIMP&1z}yadUBR2bC0YnMeXv>JM^gWQyHi$|~0>ArtI;sa*CRwHIlZW1sRhC2Yqj z0hos|u0THZX3E;)R$$Y##gFe1ho>0LCFJh&`7tm;^I}3*h}Y@d)`g6Bkh@#Ro>IFF zrIUqT=iJq|WC?0lwzds&(u={h$CgII41T9Q&1iuwxJP}e>GDN9V0P(DlS+ZhYSHg_ z;r{?u;fN2|@lLgYAh`=VG$a5mWdkW7{{R}wQn_goL-vc!%+rVSN8H0Ak4(h3+@=~ z0r&K$MQtR_E#cH+A;?&5WlZFbx%T&^boVQiq%Dv}u31+48aP?(bJw39we z%yY9IgRmW{{nv)|XeV`v3n7VF=MnJ(6VZqAHI=GOa~y(VQZ^U|VEKO<6`LjKIqrkp z3GHP&RB^ZYpIWnJ;tc6>K{eEJ$|XKumb*fn;16o%;?){y#k{aO&E{k@FT|YiKwL=WcklE>;=NSEJwf3s*9+y3fC4qb82Ks|o6jddCY2^^g< zxzA60R<<&7E}Q22EBV(^g6znlhs(FN>Zb0Hw&+S_h7%d%-yW3%-o%abEa4f%pekKM2IaSO_N@D> zyNOC8Dcih|=lN7p$qdA;!r{<;;Bk@k?^>uMH&OI2KDV%zj#goT^C8B4jZbN-Z0QJ<7Xfw$NDTPu<0N^cINH)o_$83y$7qI^T3b|_#ibWn-cX9IZoF7V;QLT*? zG}(@}kSiF1vnwuq#cU6!tzL!}w+lSERU}{@c&kH4eae@}%E8H!JYbJwikfQ%wX;n| zKnj-1nFkGy-qjMSnQ^6NS2i2uck=?sv4?2i_<=kMvu~nZ$s4>kQHWys+cERIrU#`@ z1*%JW-gsqsBUTbKecx;k%C)SP)@T;q;fho{)Rx+z4v9xKYxkpda?7qZq z&GLgApD+|4p!N5w5m+SA#G>XUMsu)*`^UaL{p)fVw6n2bx=E#v z>sog^E+bo6?%EYCh}1*!ocAPmH9;e|d)c8}E0hSx8!85V{{XNw*2J_~w1PP!cKbZ} zLyd>1IqRCOK9zMG#@I&Ve1M6IV+XDcTd}z-A@c*txCHO$~O>nsdL;=FDnx6+?9HxHY1h{zf| zmd*!1{;IW266&^HlUK4}CKrmauPqxf+(&cnD!OV?+y%F`RfR;1{#2?7Vc3E?3WhHa z8^o65?J@bQ7*LJDE9^Ve_EvM5{?4*Q?8Gdn%gFx#3cgsPFDJQb+B;e937$3psLXr% z`ePK>npn&Iu0SCt2pAp7gUI*oRj0g0LU)LkH`^fY2;c#VNSw;MT=EG3=dZmkTd?LW z-AyE{jReZ3Kb5x(<#Et^)f>hck^oNTUz#v-J%Op+%ETqkADk)bed?l1Z)tP(s4O3H zu1R+UXFquRRYo=j+bYFq^P)v2Rz;U3Q=uM$w35!@2idnqsuOZXWBIpwW}s{7XPNH& z=-13mzak9&6&zADG6fQ1b|65!oyXVOuTdn6*5cY}43oF|$nZR~g-mgpm2Pdgx{mdW z0!*s8#DRDPM`7#hS^j3kA(#mWY0LSquAyP1MbM9%Emy+B( zm-0@kSOFS^;~uq}bu_RRY>bhTV_YxS>T2Tz_cN5**wu$nmE{DhDxa23-!?zM_M}PD z&M^v>5VM~&%GqK)kF96Lsz$cPGzVgjl~;z{-=5}@Tl<@F9I};-)pq4E_x9@Ps%5nhcGf`e@YV7wDDFg21n}x^qtjE++RxKQk0N{{1R4~OL;4zbV z&n=$4O*Ks|SuUe{7p1(HEJUh|IYrx5rMZ&gMjN)XkTcJ3dRB~>11T^O+hGiM{zdR4nyKqP3PiKIJo zu|`VO!J(IdT3|_RhD6|l>}fiYj^!#+Wm{`COe$MpnXv5NHa*9ot52icM9lz&T(}>) zW83RVWuaZeaaBX!r#7{{ZXND_AbAZQUUaus-snAw#bb*8Mrgn%bZfMX_V+(pi8i(_ zDmT=;mR9iI18r>5Dlg3!UFZ4=Y$a{U62f1d!)^ft{{SE=INoU&b-Fr7v;ypMN%!`r zU)x1&B$D9D*DDh4jPbYA>MIVW`VzJ5w*pHdHbUwLo(Ko%eQMUFr3bM~%Uh)qFId6o zG1PuF&FWf&ma=`FtsS>0V56=*sEfo?GySIQ02M-n9Wmc^U$b_)C)z8UP)w!5NbM%q0hA609jd`gi5*@D)sp5l zTnFio($43buAg znPK?%`d0Og^l@6rWhIM7M1Ett0f$rAQfkE~bZ6XO3qtL4B1Wz-3lHJ#_|+@x$yP5V zBL$9jDCG0%YSqKRFf6RHC-A6U#CvP1pbiOC3&#|UIw(8{AEbDaHZ^^0if958B* z=&JjoiDco4`^5UzB-+$BYvn-+5=W54x8B7z9ah;c-gz+c7{_W@R>x%u9XNYXoQ~`r1(|ha8UPS?rThGLfRFMOqG>>XC&lQvuU1G=HfX1Qkb4aU%8L&)QfF)w#zAr zrpYR$2LSdb&=4wI?oxt8HuiC>eoT%^1J3q53c8V-P*4J=`=`^_@u*S<2+s-<=Lccr z06)pAwl;!eiLM#dj_feyN2k)FQ?k1>gdakvwqmh~_O4j(m=4{5pcR@@(lVx44WM8y zJN`XuOli%%e2CaFAgFFmYMi!-Jm%!$GPp)r7n9FycciA9FOj4~_BNMWK}izcWhNVf zzkk%@xZ|%wR_*l%werJ8Bq25|=NQLsJDRJgTwE>Tg5uzF7~BJV!7+eGu*XWTd8=94 z#%7Xb@{xXGcr4zd+OLvQ=ua|SYeYDPtXkriJmVp!*f zVowyXCA_Z_PZ-Qjer4m2@v1Z5q;~sOCpQBmWb)tOD;@kqA8b>@FPKAZ^3DWA{{Rv7 z`c+1gk|tGRnbq9iTj|@Ka?CjiyRBn*lg1BV=EB!jNeqY`;{$}_B~Pgpfp_9vR9nvl zh>3Tm*yeM&kE!~5)oDu00^7wJox~mg0L0Dp^s9~!)a^9)DW_g}^2SR@ z3h<-QXZhB=syam&-M!ggQPG4CvSn!{^2uon=Z{=fSoEo(U$x6B1ym$EE_Z$(m1x{* z)|V=*CQ>8-NB!fTqw}q3qtYg|FmYggJt^|YaqsjVltQ97!KQL{N1vI%>-djarq?1%c;VCTHWau%VPTvD){^T~zJ?&T_ezZy`lXUTnTM`@ zDil5ImClQh>&nqg48#S8lvU5v)G$vexQ14l0g#=$x-j>sMZ#L&NgcZ@#>k$3xg$G8 zSCVMdBV!4?`4SR&BdYs-Yef#kbDK-2+9jgJ9kJXeGEDoqA5ZYC{X#FZCB%hYMB{7$ zbN9QCsj5wReKu`up#{l}!qa?@7njn;{6D^ebbFS#{ z%aM>e{Kl4RD;J0x30&jvZ*1-3sQ&;8l5-n_Czyueh9iv+-yl|WKW@m8ag#Yx@*^Ne*K^%`0Irsg;;5=Rm!;2v@B?V7O?!5mPW`DN!OXD#dL zQ$hA*oo=3Ijx>;OWo}mZJ;gdW z+WF(mDUSY?6ib4_CdpSMkKC?$$RCU6@Z9y;Qj(vXX1Ex_DQ%_htY9>mZg)^W?` z`7%i#nH-I{u{d92?@mjJq_1*q7 z`K_dZQahm}Wsk_xj1Uj=qd*pU3~-ByV47S4N+V-<^ru}3cTAJqb5C0bQtq8?ZzSq3nPaq7B6$)O_k$ctdf86d9KA2NZ`vM&y;dJ;Q%_C)#fu(@C{$>Y+Cj|obeJ6>NYWh_-?X8B0< z$69G5?$|c%WLGoXY8QWDv|ywtY(h`k$)ZhG6^(qWq;H@1p-w2^l+(m$szs?%Kt5S< zoZ^Xu+J(zYBP>?3f2t}moOaK8x1(scw>J`8M2zgQU?NAI$~%urZP{uGUFcD~yttl5 zm12=6DmNoA&m3f9wNsPrGQ%Pm%uJTC1`s{E1!40!p}9yz3M2&9t~ zxr{*?LIh{2mAyg#02+l_2yT>{IV8H0E3)vi2Qh^hk1R3N{cBzudzr2L+jS+R9ZC!q z$6spI(R>dMl{?JRv#h{o7EhQrB(js!>FruKdIimuxbqZ~B9P`WkC*&vXNZmLhYBrj zW!cNC&!&Bv?ipG!^0)-i%g=YVr`QcB{#r{=U_UjHcP8)KRZLh<~%~up($slF_y~9@(soYsI5f zy@{_Sjjfe{nISx>$K51%=QWQ$hpAp%vNiOA-QVYp$szIC5Azi=Xm<862aXhpmB^FM zVn;v52d`{av875H^&!r0LKib#N9G%6Xcfq}Wh4arx|-@V9}mT8B1x;>q_%evgb>4! zk0ZaS^%akQcGECR33!n)BPiXm$5&78lUlIpVrGipR9O_wA!tNrZhblL z{{YsjF+rxSq7fP)4#4&_qbn5SbC%QU2HX)wxu9 zkfR8)@UynL)8lrNaol{U9|4mCs3Ms>5iBYofU8PAVbqgWFYhi9t=X)DkR;;huB%_E|Wp!A0{KXGq1|t!2bYxuFh?uvHNVubA$elS0#t_ ztSh}qEu)U=S<1#({hhZRu18!_N3LE^es2_FH4C)}$j@>8YbO~ub44VJcQKiXWL=WT zp|&yIvpoR=y;PjLVRN@>!iGVC+cjbxOYQ3Xa`~z`Om&hRI|5|OLK6q3L;2+-S6{b zvHDb(Z55dkCZ!2hLHs<1{J5%dZRkzaiPSah<%Ohxq+J~Rk`u-_=~b@0i%SC)j73af zgBzc^eGj>+(s-sFKg>_GL$*F5W zv7GA0ChVH6tFV>kb&ZBLXXaCn&{l25?YpZ;ujYusAsw(m9rMuEJR??~RlA)Z=Kb7J zD)No*>T5>FLs%jfxBHHAa_zv+IsEIR*~TUu@{wsREj0@zF$q>ya=2gh#e*@pKu-KDq5&(%L-8*7s8} zSpZ2~a0jvVt9Lq;-GPyBB6(&CIgLgbagI9Z1v zM=SVOH+Ov{lRQ?pGDztDX5sgTVe}Qz{{U$Cp5skYY$3v_+J_rL`;O$)7aBX<6R13q zs!EH!oiK6!&MIlklj1GK%VP##7;2Y^v6;=n$O^29xlgD60III(eiqiXhG}nYwiyO| z!k{YWs9bbE%DR0k!p);2mzDt@%$a9Ua1S^i?R(aSV7G5BITlM9EyAnBaLXon6*I*} zJ3$p1E$(x+9v_a(ED^#HV{^Gl+Ynlg!tfW}&S?&N(Ws*1fSB`r0Ij%~ToZhDJrlYZsbg_pP@bDTxn~Z?i z=RVZ}{iezM=oBtj<+$`C(yhUi-5iWD*|VRQJx{GmWfg?Bk2JT)W5F@;fO)9rQQWkd z8s0t92?SwAGQ`F?Zs*#wzTK(m1WjjnC5fc-Bo7u#kM55_TbBAQ-RNm;qGnWFNWfqy z{KfDWskp0&lnEWX!s`eX$GHmoa-CtIHdUNHZstH$eRY&)8-lmhmaF5+< zG6z|t}p(J=)N2R@LV_p<&jyq&N>|Q_NH9;?e3X$eI!JWxJfH2ZX|twgnd84 zqPg(27i{Z(%`BTi&-ah8?@-!!X*AfH$VTJNJDj2Ay|dU-{oS`0zkLlQxw^cNxy{sA(XLvpv4toQ?-0rCHGQ zd#xQIw!YM)yNy@pV7T4yR_txXm`RNKfJJA^2)^YvDI=ZJ^xbCnP+8hJ zW=D)Y%tVv5G53AB^sPValW!shjH%n0(J`F+`&P8tjOWa@TW=yMBMMmn4};WkRArM+ zo++UFSDP485;*c0uI*}s%BbXtlOu8g--^98#8NRcIOZUYu<$_X zRMzTCc@|Y<^JQIu3uUq@v{6MQ>X%7#94CPBwg&Ec{{Wt8a-g|+bvs)I5zOkGGGx`?Ym z^RH#W>TycNYEpN&l^y3QkjP4hWXTQbid43m;$SDbjG{&ZJE_QSoN zBLFCg2IoHh)ryw)cX2Y=-N*=#`O?V5pi`f^zuwOkt*3ZlG^Iw=?p;pM!c66vdgRdT zg6)^>Y^!`y1MQU=sl}y$HWk65Xo~Hhs@3ynE@H^#ZkGIG}%6sQ6zK8kbIzH z?_=Jwt{#1ozL<$W{QT`41@6Foe;Uchn9)8{v;P2vk8>Ci5)5WbOY?>D^&9eyF83sj!Dnp z1yqkrySzt z<^@zhIcLu#9>5Btd8D+Cb$FgQVMff1*%>3KKb>G}J~eA_u*Gnma-GN#KnL4CzSWa| zt?OFD2<~KcP@gL)!tXtJ`d39fEZ(ffRp7Knj;F1|rCiHuZ`w&6fq<)Y&uo7x$D77C zvqsabiI`9Bu$x*l-ynD9s!wn&<3DbN;$J*@cLlOo`g+xgV-~PV#783k0IZT&{DAI!19ComsWiEbaidHjfjbDrA-TaqI_7deZ6s z8`X82xUVilAd)n341dPBU9q#tY{8Q+y?uy;kFpXXgwy1@m~Y4&z;7FdB` zKqWZ-A9|ASQni!Hmh$2&c+~AwkacfDKdpJQ#L4K6=+H}ZKT5DmOSX+BW@%!>#8>YO z_N_fC;?xDRV=PRe(<(dqdsSE^c=w~sjj=(FMf(2$ELN7Ca<(QxGRNf=0JHt=$B+ec zH+@Z#NOYR2+%>VDKx0P3FyJcveN9#KMYu@<2{ug5sf?e;)}oeZXO+WE8k}T_8vy?R zvsqf7i!JnUXJFBmJ5^;~x$Zr^>BcgXvI$BtTAGvUbIo;!XJYCKfPi57AJU;|t)i7b zv~I*vq4OCLa(8+ksjgo0;tkn`c8@is%@Q__Rqsy~xvcA^1XWY5! z1$4s+RlRgMrHF?^v)6n@6eS|Jw<@!OOP~x8MHK@-WPn8R9+Yi{=fdJndg=`g4${Mb0%&XpCB)=^)=N_kFz=FQOt&G8Rdz! z3ws$^U>VA`;73j=kV4ZqV9O@x&zhic-imz=YV+7fDOgNb7O~s_Vu4%cVmh`*YPV~m z#L0s~wc5N706=I5e zYlTbEn2TVBTsF*PDfafM-p=MwsdXAk`P~bu-~~UzeN8^oO)YqC?`~O=LKpmRs*eCk4rH*`$`n~ za8lGieym|z%=0bFpb2UAuw%ey#=wxp`-xx8tk zJ?s`p+(hxrp%j1y3Ho~vN?0`b;wue=d2cf^Mn*_JzQVSzB+>OVjW*xxjGr`(BXK4= zjCLNCn)4z?WOooQ^OGl1J*z%;%j8HMbp>UU?5~WJR>w{``chiY3~)sT*~=XHjU#6t zpEO6Rw6`!@t*prmjkV`s8F(C?Ii`8vW7HTki2|T5dpIY7O4khwx~`uGm?akrGWjEJ zVMbp|fZJ=BEgfLk#$gN`sCPSBTFD`W0?Vz-MSc}0SecStgboviUuP=-t z@@_Qrwtq5o!Z~0t-oC)rW$ZUM61JzaYQTX?5zMXM9^YD|Y>YR8?TC?6X}CyRcbb{y zeXG8f9u~Vfr&dL)jYnM7+Q@uw<#o-WUveV z$nJAlaIAJhTg&NusNO&nzDvlY@SJc+^{FoIR_=LF%^cBKu-ul;Szl|74lR9E_ji0HrBcd`AR z6$bV&+4FPUammkW&-+EnE3_~bd0Y2!vFf?tifRILv2tnMqZ=)o2M<)Mskr1|vj7#nvDj6pGbvR?%e$4h zh^(@zE0C(Ef=)4jeQLGzetd<|V^S0%B#d(s;~74r)^u8ox{bljxDJiAI}G~NmUkjx z^2>Ct(Le8EDsznE1Kie%7BO??2mRs9Yqd|x#C_9`Zq)#_n6vWi7#-?PRY$j_YDZ*l zppG_To9+*l67tTzhaIXZEXq&iNIbVwxzWFu=~kqPXwQJ$k0xtq*d%O2M#t`sck80BX!ru0)GRU@uT(r@#ToAqS+NG09w}RSvE^QdbIdu}@S$$XB z_Z7tP3A3S5YoVTy5VG5zW|4P7+p-j%^)!g>14VmtCzrS8Wl{`kJNwaV18Lu9)0l3z zcRpJeyp_pRW6KYes63DlX6WIu@=kuVVJ5?d!_ejaLp6E=n zlZ23gw>^D&ew8Y$ZKE&Q$a2PR3dJk=5z8kq5si z9Ad6Tr;BJ3>T$VT5T-ZffaeGNYFle-T{hAyt6P9%Sxk=9glFL=uuF{nel_AI+T6yi7=4%Yr_lq14vu?sGM+OT_yb9OP~OwF>Fa9A9W3y;P8gE5M5#>#h)rTA0dm zky1;oM^c(abY(G5y&5h7C%y$wrf7FE$}gfwHxN>EmOdDFApZajY3bT6yAL{hz!p=s zIN~H1KVI0biu%IY5<5n>5Qx+RAjVlp``4wVda0{+O4|V?l3e31vKD8~DuJ@T~E;c$0VnNH0dJK2=th;-uF7**@1-qE-AQCiq>z?P-(rMPyY7X)5Y?sUW<;kJkHiDl_q*O!heNU{{R*2C9{(52reyx1i2}=Fg+EjZy5X! zgTU)@`knhqVtj44dC@7>{{R#GM%BDq z;n8UJ5yLD&NWjXu?%C_jdbFj1o*K=2)*?}@&2_QoS7K{otziTugu$iUfbAZ~`_)<- zCVj%w1}Bues*ZR606|(eHqyPsw-=Wx6}c#>$`R>~v>=wwM14lpqH>|5jPdj>?cTh1 zbEU;xgZm(P60Ac4WBbO>%s{9vBbEswSfO34;HY85xXxESzO|!1qZmk??jv`V*-UD< zBnpaEwtHb|AXrvMD<1Rnf_Wr;DjmYeeXGKCSnXo6#FAl*X#W5%-uNEA)ndm}w$tq9 zyO=vKoX7|qZ3n$lfpqw8S5UOXu`_HpYQ!Ixt|{>Cc^VPDk;Y@e%7L8o>P<_rNfz#s z2+{5)nm0)X~k@VfT-qq>c-# zSsEawNkH83mC4#_ThwYOYuu!Auay%yjmzyV@{dvn=~X0+A&wZZ&->SrKzy(VCj|G$ z@~by;$8Q@&EDl~oz>xslo|RZzA}Yexk^sw_r$@^=_AC9+JC606W94L#EwrU>t|TG1 zkQ6b)5I*k}a^BWJe5-igcAWBK93r1mdI4GbYuVgWK>lwU*dRqn20ak|t6j7_<>WRb=`QQMlPn!cGe z4zSS0?sDuXE<}l1*FAOk&^ZTEzW~R3U zm$BQxrc19Z7_7$vGv9Y_#=7a#(B_>*dmEQmcNWk`dmBe0B&RFogOmfMV(U7Ut&Q1| zRhwdk+X~7uSo4wp0N3=ZQr;!i$M$8kf>~NU(X>m9=cvK-sA09UlFaIN_N$lyi8e4B zv+56e+A78}mCCjnw2P>VYhnu(46dI(?DZdoX%&tOxU|o<1v4-*N=FH}bB}uGt-RYy z$u!9=i~GZXwrsQ_|nNiG^l-%k5_9iY5(9D*c0arCQcZbFf_sOk~NsS9;z zys;pLCnEw@$5Wp5EEfrNZ8RH=x;QA%_n3vBX-g57U2Y!3jzfJ5!8eA1bbC&n3Cq&%1M89 z9`u_TK;-ov^=WQyQ%jUvp!t~QNsw+#`g$6zWu;#oI7fD5A@_xJUzo3Q2Xj!Qu4!!o zJvJMx+Q|`Ej?(^dIW5$j`ewB)UTw>IV~B>AW9^It1x5%yl*?&tucWt@B-pUV6eG9H zz;Vy5O>J)?#F0!9n|n6I`ANy@M{!Xp-(u8B9^XwZEP75|PSe9=AwPJJYL?nNi+x3A zWl#Yd$xgWX(Pur?#Leae@;2e+i9l_>p60dS(Bq3udz*hf02qoJr^^=ndsj1Wsilgx zx}el7+?$1se9f&JMmN7bK9#L+Wob2p=3BVF(ILR!_ekRkqu1KA?x2PstrQvgcMt&F zNF3n$R8H2C%N3;hg2^4jZA3*Np~v0_)PE|6c2O+9XnEH2e6X+vIG}O3rZ^|i)k$SG z^2u;*#>pd9kqbENXB;@l^(dK zaWXmX=CqY(c8X^V2$08=QI44H#Z_CF<4L3we(~FLB!_d6o&fd~=F+uD1IY%Us-xsb zc=v73Q|?c1N{U!)tgPDB8MemC6w1t5qi?C^nv!UT%!zNB?&3)7+EpHFZIMFqMml>6 zpG`5qTG~tayu|E@1N;K&2)y1XgQ4n(?NKgW&rU~nuR;n?vlbpG%Z~dh%T*rB6QZ>WG@iqt@@CQ@x zQ?L=UMQ##g3?4Z?@!UsZdK%7#;V&;Dfi0$vVaVLM2aFOi*wo>!{>QR(4J2$%As7Uc z{Y7N#Zx+j{RiR)d%&o$#c?Uj*o-&0+y7_CIvq%fGzo7o;s?TjT)#D_W0ti(Bbwl&# z9Y#Ciu0aY*d2ev1$%^k0gTIKt>QA}#^))T7rJe79~7 zwL_K1YZ1dFbEK2(dCXw`@kh&meJPT%$2XlL6o+{8AEzgximiLB-Ncr$$NSj@;bxH| z3V}{?8`u8;tyXO{m|~r6?-C|Pa!aWBq8`6rdNpFYCVf~#XC=*=w9s4OXE?z^dgt6$ zlo9=sSYu>yF7n~!A(c4Dg5WdkV7m zgT2XAVvOJgDUU$q`QZ}wK0sjE&QE<6R=3#Eora%%Mw(*0O7+y&ysjOW|ohQ%8 z7lq#^A#>Cb-K$dic&%-ux`@A$j>JmGm|OUV{{X76bvUJt-bf>CM2B*gP33dRZ-1>T zqi99568Ua5MjCy*alCLlH0q0jGsRGmZfA9YV3T%p8ifOq#xg3_t1-C?dwBtoAUmWM zZM3q1fu8N^YK_EgV(gaFg0rUOkVsEnanD2TP~F+oqhw90-b-m~3+S;%lD6e2P;OEO z&AO^ck*Q?2bUUyW&)v!XT;`z=tdgyj%yOIn@jNYptbe?F-#X@}4nkG=NDgZ`3LKtVr$Z zD&^I+yqD2fCAL!t!DDfg$2*VKoA%b!t>=gAZn2fbf+PXXI%S7EW2Gy*1&vz;)QX*2 z6@a9GK@&*_-gP{YoOK9cu9pR+v$~}6Oz^}c zN18*!G2~;X6}4n7t`KEfMJhN$w|CU~S0zcb>@^UziuMxHE}Js$T)H>~N8wgQuaz3X zZh?$VxuwS7q>g}gr$t~8Gdj3wBml9Hjo9e5a9UYHWYiKSiAtz1=4AbTxv5tw#T%Ei z(-kl8uA_yeVH|AD^D*s@dee^DSz|Ctp;eF-WEdx&#D1ckYPxh+GE8Gjo77*DB_J5o z{{R~2jQZ4{ypA;T<74J$a4VH3zVA=1Qg;=IF0}i5Fwr0?(7yTb9SQAC6GqTQXo^_eTo|2MvdE*Wj`Y~W$8ZoT4XvH5GG!lL!k*(Ll%Z&a zq(yO&5<6$e+&bf-IO38?Jli>9ia8$U6aKAR7*qF2_2-|ZHJa*RCs@Kq8|Fr2;EZD# z9qQNFV{NisLNK3m4pemNPjOQ0hLyD&{9bfMF@3;)u)iCm7h5St~~&$CAZw|Yh(#Y5G+#2cz^GE zkF8DaQb5V&!@AQjbyNE2{m#B#XK26@2lY8IHqmzFK6hlaoz`qR`CB$?u6F_e`78)T1m7!lNF znsCyzNV`}l-JX7*jaHIkxwUJMC79(Vf4dfaeNHHnZ=9hxUBl))0(+eLQ%HA3gwyYC z0Y7JyM-rJN=V&YIR4s!f%OJVkiHRlGJ9_c|0N1B0#EC3dSMw0cL%Pax>JI>ao@x;{ z+N~pyuayjLO325cJu{A`sYQz9f>{O<3pN=n#(n#NC%3gv6!J$3+#v|hAyr8aAdgzl zh2wjqxtP0|L5|+uHrwVE{w#VC-klV-&tWCv$W`2wjUG>!5OI;~=|hWQ%wK7cWi4bb zfx{MIw{}KPUVu??cDC5NoUfB60`vEeerln)k#7n7_o!pJ`xz|xiGvWkuyd2fJ?f(dgx$!on4T2Jn;;-Bb;2dwh|T^Lv`5JGrxKRDqiC%tUCd$prDop!BU($+-KAfov6L zlq$HxL`MUTp4q5|q_g>U;^-qB>~#Ym_WIInlFem#ZdO)62td2Hl6eB5xsy|ebe6{w z0fdmmq^Lc;%~g>%82XVdB87RJ96G^(KAiN=r9*RcTIsakGAQDEaMF+CjgM@Of||lx zW(gsV)^qb*G=ukLdmIjOdCft1OxCiNnPPTK8JJ~e!TX>NR*eO4yB9M?V!MxGqd$YwIW<0F3(9zgY82hyt>tGQ*xgTW94VbVP8{5@%5o=IMN z$e4am>A{{THG9=9X6k(TOv zg$^WSRA$%+UvN7bnQpD)U$RMRa3l_w%G|L%V<3$BWAUZ2Q*Ef3Vs9X$3`rz;89DuH zM&8cprxsDdUP41N5IOc9l@gLgq}fC4>jMW{Be|S{?AY7t53M;!Oqk<#CmW?;HlJWS zRL0&&)US~sL~?dWr+6gt53M`MxPn5nzm!ylP*qwrGqWdvV|&Z>>4)noD-H5)Ggk6saYZk5(Ax9@RW{(#?(SAh;?O75NPx zXEiQXDMYR2PXayVyz9MzQx?!b8R#?6)j2Pw@(!DB5=QeeG%JNWe!cnaTJpm*ldjf{ zM(_ZVJgkQm9iE?ecQe}<37JS>IEFh50#knYH|pE%uI}iVj_axAXvA4f5xxJ z43e~WFKqE$8F3(yK~jKlxE(5Wu#?Y@+(e;1^SUlM=kck9wp2;>dA1||^rzlo^!EK} zN}_uWL%7*(FH#8|9)syomX_YhE$-v<9!41b(CIN>N~G zr)!{D!H(K25FNqJTiYDcJg^2Z&8WxnN0f{VGiRv-xu_vFqteZFI0pxr+RU=2;h`dKwzxBS__nL;-$vZKH7Gk^a#J znFE9=Z)YaxrRDt5xVCvD9@OmE6U1a|g`KU?NV4G+jNp3H?Hw#-Sz0jcC2WaTDUVOB zR*qs3UMR}R<{gr|axvKd07Fg^UBdR!M{bP+NYb>sM+Y4U@6UQkF*aCPB~)1!;F&T) z5HM68M^8$Op^ZYp5c1XYE)zS6>(6d#z9zY3TZ4(_2P+On0M0NyY0q&b#+&v@C6+j( zb}>&7#^>qD>y9e9MR8I~SB7Y=G~qN-ZjG8*I%lZIuWGLov&3wzttN2b#$$He(E-tc zKb1D-;?&*6Z*-D1%g3~NZWVF;{8eEz!v*AMl}Rei(4OZ$l~IW!ZAP5}mA1GT=u|n} zNIf~}Q%h}bns}Nkbe?%3#hVJ#6IIKXqX`g49v4OaI{{TZ*65!0S zEMP#$s3GrUfrksUC8UfnA?^7aKj zL_y4Mn|{j8oSc39_N$6)O_t(`W0^$PiyGVpP!4x+bB|9-t1a4z8d$Dd<@@It!S?jc zRMa(1MpRpAStSX|Mv;8$#yZtDno_yk(n#427(6H(;E!6>M4OrmaRVtxP=TDe5Bx{3 z(us%JZNrO%+Ub{j$ zuqSeP<@x-Wfi1V@AP?OPaDD0!>{tOP;PP|DTfMoRsai8tZYBZw=Uv+59RPELul0 zp+eIDo^U@PBe5N;Vt6BVc#*fHphVnYmIEgp#WdJLB8KMK4*1-=Ku=Z1Ge$F*w1XKGXJR?q_8Sx}?yfIIu2db4k&8G}8*SOEvgia~OLmM(T2*tkvdz1k{{V$p zM_Hq6N~KhjB904t8qup6C#hm-)feqH>`I8v;f^!kKDAl(3#hRrnwBoRPs`AH)uaYP zAMRO|pO65;53hRAw(#eZGyS4eFYc#S#kk7Z|1;g#f2iB!a zNu+Zjl~G&;Qb9SbYi%wTPqa%Q^2jTYFf;8|ZFGdXflrXp<=Ij9a&g|Wbs~*bCUd%V zmD}FW1>DSt-~~W2k>90sR#uU$D+GUYJ4-utKi%f9!KCcDXl|kror=ao_kEW>wV`XI zd8!rdntjWe7iJ2dQRpiwm6O=s6s(MyEn4A>Yy@P0yI+8Qxb0UViqu@lEVVe?TcWg* zFgrK@0CW!D{c5)Qbn&Tp!pPB`-!}xF%bInZaYPyJZ4SaSF(-`Yp{!i_jT9_bkX#s& zM@ML*R@mjTpq{y^mvBgl3_=%SIVz$y!=c9wpGunI^&^Sn5};QEGQSA?@H5(|35C>w zpK6xjHnGYNT4++YLJPg?JH}oRVO0$Zug(7Udz0RoZD|`ca7gG_G5zYP1D@4-$4tAs zxl}g^9E`gy=8`jj`RK>6$A4O#G$AZF5XRR%2kXNPf_Ub(HQ` z=_F^M2h>$jdn^+fO|r{uK^|nd!uT4!Ti#vGs#Hb=C z_p)OpGI;!JXf~CMW|P#f96KZPAyTeS&U)^QcE@^~>?ZQ*1wM zK1<6K9$SCM#Ds+dJx6@it0M|qw4ZK9c-WGzoRgotp602xB^1im7AtFR(8m{)?8O4e zcy`Wz4l7R13GT0j)KbWgB83pC{odi!h3G!D9QuMyW|lV*#pfi4Zyd*;Q{3b7sy6z} zP)hF}_?sj)#s8YZKmr#021Ts*OE^9riT8n;I5aqCHPbm=S}GF(q=K6zt) zNk3mo%bQY{%URxW6jBU%q+qZ6S?%?#>xtY$<=df~4VNl^U#&F+Cs3bD&Gw-rQ)^EX z+JIdVNGClGf1NC(VuiZX;&kFvluAYAc(i zk`Om4{I~}=KSDdwSiZM=d*{t@8|+i%qeK3!`W7Da`7}v%`Bk-LPqfP(_K6tbanSxF zwJ;!o3&d5_F2H|w58odD0M40xq(qRb39wjZL+CxdYgMv%CVErk z)7I6Qj1KP@%u>mXm_Em?PqaygD`=&qY3l@@OfV81KoVylpHHn_xzpscxOf(CFK7Z# zL1kciZS+30>v&oVi0s{qIUA;sC(6E#e`rFJQ!SxrzW}`^0wu zcRr@6-V+plWyVUy!nYYG(4OQ_syPFPF6Ly$7fE7^bc(2VBDNXFx1~BAD$dd+jvN5% zy9Lf$)O(t+v6c+h@R8*65#N$n_4?5r-KD&Uwwq>0Ic{_1o{fx(zGgtfXa>+^LP{#p^VpGu)`c!`m7 zI?R)k8%S3h@zWlFQc0{r7{_VIb|s4r6^DPP9V%Q|X`(G+-&4HS-E^>6JYm6=a;MlH z_EV8AF-9@|0^WWy(oS^PKX&}D|sIS?`J5^aX9HX3cK9xd5b&SVlaIYrj z4YxQSO!TV4>QO68D-DZ{nhHhzF~KUx%Q#VK7C zFRfXePigY7>Bm9qQ9&2k(W5dl{N`vp zG_5{VMUrXN!V*~_WITP zE88m_9y=r`C0UuJXHYVKx+^C(jT95y&Cz@-{*v>3mkg&SN!#Tghicnj31}9G%l6&! z470zOeop)W{&7`q^*LTs6`a5{iH8r#VUE?E7Nc^~wUmIir1;+blYEz3hC%H@V#pR)e|Q&D^DXs^^*(I%Ch<03{;9(R4k z_4LhM((Yc_%u!5b!(atWwgLC5%GTB*(b<}HSy;C?IP4Fo9Vut=Eyb(^SgPC3j$h}D zF(CBEwM3JVNu+NN?9_zcPK2135-PVOcQuoLs@u;F>uACSVid*!XI|MpwVb-Xt$NLR z?urjtk#UwE!+}_O#nzzLqSh$cT0@pO#s^*irwVssom(vqy3542dSFksWLwBc%06L8 z@(T9n)O%G_)ZjL92`yo1-N=q*Aw~)4M{(&*MOcYV-*RiY{???rg3~S|Qu!ojj(SxY zY}#vKCz2FHG20j%hUiK5r!(9}#ye;R9d^19Fg~7@9Co(>a?9ih$HO>smJYeZ14h2ir(#e&AqnyBy~o z1t-`pk7nCBD6?h@H$*+>@J!ge(rL&}Xl?$9m4Zl6^8}x-BgK03ebr&xLpINhdZo)K$yv zeK3R1ZHyVrZV(O8DD|k8^<$nutrN4xHZ(`?A9GodT}^js9MZ54a>W#~ZQOd5$LULR zZt{6(gj+-oB@Qxi>&0vA`;qN0v8i%wF4bhSc2Z#pEMbNNcRuwVE*jo6w@5@htfAMI z{{RD7YYo|0+9e_)NJ)X%gtiXdbF)I+ zK+7C-t&~-aoSn;3N*VrU{xO%wIQ05dajm&YM1ZO$LN4#Unu*Vt`L@KM<9Gv=0R z=0pLTZucr(PeWB?LuIRtLgi91Z8U8pK&nR~1DdZLq}M1~X$WS{@OynJBV{Tex3_s@ zjj#%~cY0NuX@dzNbSZ`zW*nn;7@_H~Eq5zlSWE)P94E~nn84_9*EI^;Im61tuowmU zk7Hdd7nW(K7$u3k!sH1sK5zDYy{kUpfe=)LWHDt@Mp$}gp-r-#CApg&yM{|-o;J@X z0{~~#){HU5v6W&{K>ibqeiV^GvnU-3a_XUS+0P*Q`&GC!=awRFZ5d?gjN>Ewrj+Gv z%7h<5i4b-X#t^ao5!idxi0q`1Ws*yF01P2s#;;pwKoKl4I>#sQyXBC2F~=gOw~A|d z9Rev#aV9bt_sBgfnpHa;5vJ{_4w<7grDVB{;R=3S@L2v8uDWHVwSrw+#_q{3O32w> zJDS3~)+e%vEXs_+OrTc5_BpAcmgev?dF&!kHz63_$FQtrcd4v-QDXa8ot=${K_=p& zQy9i-gx8l3ac^`k_cSghOQG)@1#O9u8`?{E6tZ1BlF2Sh%_9;RdVUoB&|4})GDa7mTylLXyw5cM0Jsx3 zmPgGh@w9phy&aW=cCkI#a$}R^h;n)kbMNU^+e=asT?=}ziuBuybg{Bn!HO(4SC#y0 z9!cc8M{8-aj4<(*%P;s;<8T%cIO^v9v~Cbb}4Lg0D!F+A+hh{SEnZXGl2Q7wxJBY`4q?!YXd ze5k}{=Khs(#iq1>BG9~&F~L+B=9HS~RATy-1(Y`O%-8QEvw1+szjteT4@$2-pK{2z zV#N7U9ic!SM`CNGmrsbs^2sps)mP1oj#Qq2pI>UJai*9QO$JHH;GMv?^rWOyf-?f# z#(ddJw!l@P2evC;Mve=tFeA+FT;KuN`+X`4y&v~Li5$D0S`qUu2j0h}LwTh#%jWs7 zv6OB_7~X%vllO{V>8C8WcCxRW>SkETGb)0GPfX^k6L+OU9F}*#X_F>acT=zv+a8q+ zHzj8M<+(>B2?lopo|Prmrt;gVwutUUBLzXg_x7fu?hZ(=cc`I;CA6Ds7cI1OQ`~V; z+{j(l@6BN^LKV0e?gy=BwDze9NJ@^OnR}9YkJhTqe>%(MEMo-#-Ht)^t)ouH4xwsW zn8e>{gsU!o=6F82rc0{Ja01_bxde7mU7L72MPzxnp=AaVsLHb&Qtfh&)qev9+~7#xGTr8 zLlWnldQ+c8vddhHQ*$v--LlKIa(ndYLy|)FZIzPQzE*Mu{{WPQ9S7Iet|g^MxzLi*6C+&49F5Hw$!wom##IgDPeT$o z0F=fcIdBHjKJfRgEh;$UlteDPwkws7_=o=hTi&CR(%v#-wzwu;`3E@%)MAo3rJ5EH zGNSFwlDd4v1NU=T$+nFmtUpk;p6gIZzWA5{A!XxtYA^iP zew7JJ!#s~O40 z7V6l~s{pdDKF+cn62pz%I9ztDA2#gKS(y(SZ+4V?smdcZPCZ3lwo8U!(WIVJH_Ie| zZU-F?u`bwk;AqxRavN2OUtwKDylS$=*9 zC@`!3^<%2o(?_{x*3%&Zw?BIT9Q|o-BK_N3sdmeoU*?KKiVBTb*y7~aVZibl?vcvJ*w+S^2X9ZAzKs)ve+Y!}bS?MfqZOBLorC9nT$V zpZp{idUS?6_DN+VfV}`cxIfCeROa+Z!qHoo8%@(KVp(I6q>f0+yLDDL=yTGl+-eX? z-bJZM-BcsToUrsh!m{qQ!x<>WOE_X9&H+7f^sMW@5Gq9#z4IzbHV*H)S3H1Ea63^N zbCbM6 zG;xi=BjJy}Y4YjUmo~n1Q%J&YCWbz8I{p>WWfLp51ve_)LvB=sD;X!S_4TIN$2Hyg zx4DVpfRG;IHo^BG4w$VwFArQp0d%-&RA4ulIV;&g?^i7}$nBw)*3k%CpOR)_ou{vU zgNn)3gk6eM+09yLM)qg6xRUXg&M9diV!N<!S^TDp|{kf6gmk^OlG>5Y+!=&H_Nb|s6h1nYV@}Lbc(PIp_2~a z;QJb7t)jcV__g~(h1)H@?qnIj5pSJBjx_>MPF+NqENdZXMi@G24Q}_;FXJ((a(Pic4L{2_+;aaRrWdMl4%{bO)aUwOmH*lR~T99M5lG39G9X6aR><_l4Jno zw;sH9q?25QrSs;)E&{kGEO0ve4{CyIKi@QAF(xoKH&8uKdXIU4#U!h=E9N`^Nh79f zp++qkH>qx0t1~a|H?y*-MGyB^9Zgn{+R7N*2|z`_i+3Xvm7~Tk4JG;o^4I=GaJ_BQ*BCVUz zB&sdhaj+18k~97lfcEg}GevNa`9!(d=AXOxRqS5a%miq%d8!w1T$LWbO4d+X5~R!b zTBXIjKW#{m$rEot6RQr?`+Y$#&^)9DcHZA68BeDkm0HFr?UAIGY_Z9WRWc9fR%42H zA~@H66qP$b1M68dk$Qwz(p%q)cCr#ItFhU!`=Wc})KV?s*56{i4_k>iSLe_ z56-S#i#wY*ZT4=CGF?c1Ta0pg;-rSrEfda;Q2>w?k)#<7>S`;C+berRa<>aCcpy7* zxO@5vT84!is3nMqW;g>ZjrFMGyRwRQw7S$HP|^PI0)H-?ReQZsT}o+IG3Kml4#>s| z4uYvJoFtsdG6iW695*D^k&3paPFm<_PkjkkW49h^9En+*C6}_3OosAFhUgz+tN!S@ zCuhICOQz|oaXMNmZEPKg$C7`oJ_t>ua@<~s)gY53o}GC7DSM;TkZFY3waL6@h_(p> zgO0hOku9QEiWdSm2h7J0p5D~!zZ6kiMjwT(_^p{zMgFSJQ#8vT|eV&^;Da#VE&vb7Hte`i7+iCGl1EwIX}^L8J6+|C6izbGqrQuJ?N)O`-JChj;71Sku#Ytu3B#?a~MA^bJy^z z_r5ZQ?s)C3>=kn!8JV{M$6spT+wAtu<-{booum2TRv_c+TNYjw);GXrx02XL^U6zZ z1qk4RI{hh5ln|piG)sE+H%@{}pk0}^+mds)``=IgwNGcDTs@@M(p$7!fk^zu&j9rm zn{j5g7w>y?tff>I1FXO7`wE)Z#gbjJ!E(~X0ne1U!uo!6H7k3dxo@eV_6s&tsm|HJ6BHxqE0$o2m0k$`t&V z9S^C=>q~7s6MpIK-g!U)5+XM$4_{nWo4ZpL%OH$IHYtf2M+E->7DZdO)+1Y!YrZ97 z3A<&H_hvZa;~!7Lx$&uLau2mMh+r?j1pLX4xUC4Sa3qr5R6HnLhCKD@Riv<<{h8vj zZ!D&H9Axz))KiBfcL{Scg6in5Z-nU^ml*T@Vx)8+_RU<Wa|70KKKI%nqWJ*zGW?(dmyk_jVN z*_F847;j8>HL-7DHMNkuP!w<5xruG-^rVTcB)@Cx8OrUCY6*FWIO!qZn|G1?wk;&`IoO%(2d}ki+h}@hGD9?)q-}G+FamyD4o{^M+``c!CiRV2%ehY2 z+4;_K+Mj0eT+Y$PNb=(I44h%}{onAZZbc-KrGEB0YHhT`M9LY%91?NRRt}>&v`q@e zKuoZO4jKJ=boI?cajGQKDm|R8MncNcVR8QNb6C*o8im}~HptB2kDa1Vm@a*L0aZ?m zda`F#Y>N}!!rPgZr$t@PvG7!Xwed)tU0UnwGvQwv$gt%v%=Noy=4m1KX!0)7CZAH{7&RBT2^4bCn%99qJ1m5iI34 z*DdlogCvT6T%SW)`dzP^Cz~t|zDWxaQ;o;D$9m_SqaBT77RpcIx$SM*Ym|*-F=jC1 zaaBF=I-Gu0X7b^=K-` z_4cXkv{8S0^F?mT=jD;vi9VS29+<7mIPJ9fR_jr^TUb#rclXC{t!F9Ap{+V`>P=&% z*xAN^v>*?dhnJDb_o}USkzKXuv&3s<0)>zbSeX1{pi8;ivd!FDH;^cd+`s#BJ%xmAQ+k=x&R&q$NXV`U$f;6~CA2ss^b z*w!OXw>pcho3x1$8x*bvNj%ndu9CM8Zi{f>LPO=7K56v&R+Ks_S*-WB`l|@hyv0Qa zl6^7T+NH)2*lJRlG+OK0p;&HF6gD5^%V(ztwOBTi+*=>D-XEVnTq}@s-*N9y*uxSl zx-ZVnmM89*&qLC*E@h4>R^E0Cun#FfZ zMI1I;h4hUs=j@w9pJCWls8llx$rKHQV0QcmdP|WrF#Bd;Z!_gGkC*B_D?VoTEk@dp zn_80FFKcoEXz?Nsx`!S8Ppx6!TwH6Ht7I+~dF3FJ7D6Z;Fb8_Pz}!V9n{N}mPT4zv z1UWrHsVps8)qc?w1rd(ZlmO&)VeMBLMhfC-v6fnOn*e8wpn(n*&IoUDR*afg*^D?t zIM15rrq0}VrIzSSe$B89;18FU2d+MsxLgL;~T^9;fd0cihxuqwlSt99$AAi|l zY?RN=-2FlANi;U;9zN0}BxlS|lxO?}5ziIEZ<9GF09eis9jZAWF*I!mB~-YNb~ro} zO#Yb!{!?)nkpzR`tbjI9CymEN$_|-|I)o*l}lTNmZLK6_8fCpZ88l^UqdFPAgXSR%} zK3vBn9DK?##WfTr*{+gr#GYu}csVEK1EKoVQcjzrYpaOjFD}oNWCM<$Q&6sAidlTf zajUH3FZr zIYyPhSx)mJ{oML}4QWSlD!`E$wkl1&V5{>>*Z_NCpt*fc?&e>z#*Ak`m=TT$=n3sh za;%As)vlXuATlFJsl<{tGEeZ=BjQb8#24}l`!jHsSrPrAjuo7BTy_5d8t5!-WRR0} z5SPn*xN-8S&-1Hy7ARs7+##25%?u$x*vG%UJJ?M&jz>c9X1%FiNhR&Xh$cl6q@d?- zQS421FzF*mjalbVp}td|4k<2et|C<*ZIKsu&hFoI`(ve4j_O68X)mwhj@~59u!JPJ z^&W@TrOCIblx%6kHJ!YYNpEj}M+Ms;G3vwXOuCkI3XgRhd)pgW9Jd_-?NJGy<)M@$ zakP#8iRPRc5DXH-`=k5bwH@rXCP8)Qy2igOHwTq02h1_)=~7d6C2RRtaa&;StA|!` zls$?601AfNNYtX19}wK!EJbG_;)^CSKkF-u}T+$~Y6iz1xYOQT^HO=3VEEz)I>vPP1Ojd$vw=>-NhVUwt2_baI@A}cR z)Os{h(uLlg9BDjq#!^D@PbVOfe(CyEYn!QJl1r(G2r}fL{xW&`RoV3UVsu%q#Id}G z4!PO@9-U25cwsXaxtvT2g6VEg;3(;D2cwuRi>CoxO&HZo6or9Pjl$l}ahMHnseLeb#I?ViTA zgcOXNq=_}p8QUd|&X1)*EQ}Pc-PjWMK=NTw!uE>stOD(XCodvcs9# z%DF%Q9P!7cbe4KfKseODRW@TW_4ci|8uy+32>Qm^{fmrWsj}DBUm(MFzDs+|gcM zJAIH#u?~GY{V`5A@W(2osQyux1*9P49^$zhlR6TyldD@K(i1%U3{Dy|AIrF(;Usmc zDR&jgk@X!oqgt>zGGr6mK7$o*_TqTumeyb1Nxb0{0z&75`BrVtp&V(tTZoL3jh03q|$cafsmu@wCYfm`duITO~+N``PRcozcHfTOpNl@YeBjUwX=Ye%0jj zq-L=o@o#d#haE6@>FNIf)~va8ZxHx`;6tQB6vW5oo(z~%rdQO~(Zi*?|i+hsu7HKM?Bk>=2h03&^bu%gS!EO%yuxx-KN^x$9Neg z4DA;ZMvPTej}^6dWG;hw5xlXye=^1ZAbNgu`z;u0u()Xw+7?h`Ne1R4(*yXcUudjm zp>{(Rxe!S4>GumHNC{PK!RH_zqx>rgRW(o{(&CypWAZgMd|Wrq z>RCZNZcpyy0h+PoJL%FxZ*1tsRtTW{#OLn=*cz~r%0eW>v*fJmk%bxVF_F_3CyFyuVqdWucQb0F(ixsJGW6P|-5W}G&xaWx1L#7m!wKE{o*&zvY zAZ}QxMccTZnf9c)u@R|Bvk72TK|dgGfAOpLv!GUHkN0Sq1p0a(TFh(Lh_0I|i;+1C zxkwo#^f~E@QJkhX7{s!52o;pw$>fu@R3hb=I*@_CP*RNJODu{h^nV}MO+m6THtk0-PxTBKp>HutV!`JCfRGq<1BHhHKW;Zy295YD%o}6_V zrWu10u}re%&gQ`&jCQKGH&FQ`tj0!6w$x%bAMTG+QB8SmxnYh;mG=3YH(;;7=T@nb z=3Ba9Dy)BPWhLHAcM=wTh8*L69X^zecX&pBupPqn{0<8smo z#z@HL@U5XinaZI()}WU+5Z$p@b`Racqztg?as6v9?(WkP>Kb;QVS{(?SIpc)cVX^N zYKHQ3yDKH8O5}!Max;u&f5NjbE+@9PT2%o-JbZaxKpw@r&i|0%y&Lgm?wvH zq_w>44%plO0Ez;s+-edPmfG6kBZ2n$ix|k6hf+I?k?-t3$+pHXnerGbTT+DAhdJe7jiyROC#Ns&1JjPUqnhP%*mbShj1ha~fhXS^KsX&vM@pxCdn_c}hgWlh z9Gh}6{c5!DJ>>rYXNdU*Rz6&WZrYyyrxl@P;mi3iE&TgdbVk8NUJwz(H~3L_$5soP zS|X&{gL!gZ6B{!rR7T_j+~c?T_o?*DS?9Ti!sE+{r5Q!&0qe>4tGa)OqJ~2RW*HtQ zIgdQ{L$ddj9IF<$AcD9OD}ejfr!9CI$CZsJD-?2(9K zPfU6Yes#Iwi%B$Dt!}Qa)q)%ygXSQA4?do~>t6R*KV=s3S}dER3mlzT066;BEp;}n zbBPjoN>MJ zn;4u(xh6P*0#ChU+*m%R8mV8CW8#;nB(Gt!ru8a0-@_K_o}!EUa+DC#6}3N>I?ec8_x~ zVjL^&;~hm#@JYE+SvN#ZB_%LWdmmcPQ@NxeZOgiKtXhI7a}~IYDnqaO&^W;(^U0=O zX%Q5H?nEU-#6=>u9WXkdRTTrzWBM5OUX;aGsqTOf{y0<$i} za*KAj^W6yYj#Fyj5J9KvEbJwn=2+4{&L%1Z0ay;kQ*uu0l%83%e5F`+8!kUPEZoDm%BA<@sn? z`3yS~+}A-ZNZt)^gdr*6BFYiu}yc$m9Ur^~d?mZ3$S;NiwCKq$Lt> zm7Q4RNKeW2^{Uqf*43t+u2wJx*J3b)X0&c6NG@Twc}`@0BURl9*`x>TLZH<%-iZS=S^ZHX?P_>bEY5IgSn;f%^ftlQl9jCCO_hU}T zp*7;J$!?|sS@I!|KQkyj$Dq$sRHf8B<8$WD*9#g9K@hTS(Ag5oiII=k#rqh{Ze z845>pQbjEKw5bY|GHxrd@qvoRwY=4@UTB)#46-)FmSp*q4^L06P7>}|?IE#|WRB+G zh@^@>P_N#9%zru>VlCZhSFzns0F_}9TLqTqalvk(e++b~E@W$abhwLFwT|W?@?j3v zz~_(iimiVo#;h9dR+DT*ff^icVaD)3rB7+$-BSHz5kNM>7-0F!5<7uQLF(RwGU^fe zKiX0%u+PkM@~|GYqPI5ob2hCiL~X?mvHM&UGy+R6Ul4=&}JjG!mjB}28?7g|F>8*cfO)DA1VdOqqJLEaXJ3;Nmx z){l2{Jfb_ptM5l32VW0m1RZz9HX|E&^$W~cnRm`7ojPxFr zBu>&xCDD=g+cv8bJ*q#nO47!V*~tnLa6*n>xFfgqq|zxOKq8gZ zjlhLt{oq31>kmP*-`b^uL30_IWJvM|NO6O^JoKf6G8LQ22)mE^)dz9!f!I{W-I6k9 ziHK9Z`M~@=DqiIzHDXf=!!}Ar=0g$dk6enD2p=)XsKgVLaNM6jO+Gjy4)d9j5Ji`g zM*R&!vMb5H7F9UHG>zZW6`Ms{Qo=_oS{vBYXO>twU>60^UO}&nphZ`VZIF z*7Qr}X_Darw9G?X6Zc1NrYak2YdPC>8co;p-N7kW{S~fvrYb(5jy~KsL5CG}yqp+xNk#694 zE~VaplN32Cw>^HOilT4Z&0B3c3F44qA~0AGd;K`+L}Mu}2y;l9>Pu1nl^TnTjlu;V zGLiji1i!tsWoZhVnA>|L#CZh|Ma4&deQa+VMQMkf7*;PB!9sek)~eeZpPN#LO`d0E z@T9Z+RV%urNJYn4nNOom_>PT zu59%7x&6ll2izUW_7v+BYm*kK7zkp-YZ@lvHuZKL!S}1$g3M)gmVR!4+ENmj;~*S$ zp~(p=ne$lr_crs#xg&{GENlsB7!FAzwtG=+qsM&9Z*~h6V=Rsa3j>jXkL6nyejjUy zZKsa;A!wL+%Y%%LiaqOLbR>o4lTs}Rk};NxfxE6ft2tGQEm3U2i$`N*V6~2Sx0LM# zT<=0T>(>>drD(Q>;q4)ve7Bidj&jkk>QCcZtqHkh^5Y{a5Gt=;I`LC!wpO}yD`#n9 z$f5knWjvmG`_@ja&7(ykwY8k~?dMFdbLPxcl~4pjoM%7IoblVW!n(Aou^a;@cIbYU zYkXGn%PU>SBQj({fbL=1o|65D@1EQ33M1a}E(U)S{&=kUn>4aTSG+O(XK z%hYWgb3=LpS7pn4i03Qh%Lo$;J-*JUdLBQWNd>&NZf;Wa%QDBdIIbAC$T;Ahzl}21 zI3#GN^BPx*Qr={2Hu`PHp!BPkD|4dkfWW5a?Z?^G(oD$CQI!P&xSmaDBJbbx6rk%T)-&1o@v9 zt-G6@z&v5c?ibW{C$(o>_>$HP#@dR;%G->nF@*I#)Zq@La#~YpVYe~_g6d3cxIM?N zKhJ7`>>)(9F9&to`$uIVz(j5y^QHKBdKZN%O{Qgy4^!rH>^h9GEkO&5A!Q!^&i&`1-%c+?91?8-G>ifSI4q>~W8djpI&3=BCf{w^M4`6I?-n;8 z90BQyyyEu&=0F+0dR%!?+)Srv2)JGc8>$GT^6$RH#KkKO%=ZiO$lt`O2S6z~T)4)? zjZ!4kH0iCr$sgMa6C8`e=d*Fp`qd+&MQLo-lUp6Eq_x)mjB&<0R*W80@x7IZi78Z>OCqstZB%bxM-TC)N($V2Ho!#*`zTH zl=N{MRI?% zZexSz^7cy}4tXcr80czsW!lJ{A&5wl$sf*;k1WB)^Nt6-TbAra6lo2EM<^fZ4jd4? za6Y;1+L@!~TZpBIq=q?n!mFIf2lT2>YA&O7gCLn1!I=L55j{Amw{hHb`h=!7lHjUf z7Qs%oqzxM5%#iTxdi=kK6r8LUGp<`xwS>cD>nr(d zDwu{q{{UzM{Hns;TMLP$z*K#qnctzuAfDWsn&#Rw46?{D0_PE&AH&+SwH+$rYg}od zvw541zJJ!A?w_gcPU>0`)r}{2Vy(04)uw$A-!4xc3gmoP~c&hPR`PUz5l1+f162yPj1@63XaC=nIY4V~AxU|^>mkvad$AE+=`|3M= zDOn&!+1RQ{wqz`RR3sKr*CwQr28Jex7}Ux+S6sYp+pR?dMDxQOjAe++{+1Boop5ka z{d*qN_^oYH-fe$SyAjM>#2R@>Sc0B6d!JhRcVpwwvLnW2X)V+$M5W2(Z|V4bDcXay zPZh=7e9ZfmRj_0MdB>op7J*`AodZJ>^1-kr-PfOLtE}nQEvGzp5uYj43wfQ$Dt$#y zF!@_EJVkXfTU>eexe~$!ybK21cFF!M^!BU^tK+IP(_OZ~4$$Hj*iT}o>00`t%X?&+ zc~_N9#(eGEN5@g$oOG9CatHRF=yADf^PldM*#7`3vlKEck=;hG3oJtr;1&dR`k#8S{gJH4rps|_ z6bm_o?ekNN=b^{*sl*oX&m-DLwk3^7xR~U-5y|#Yc&z7HMGZlQlcvteF=-eZycLDl zh{!&prfX6gP4YU=b|q0B)E4WrFWe7$v8KSXNPf-|ZHTfw&<~eyr$2iYXnfYvOx8~$ z!}G;0xC&Gg>D<>hKRdWu!z~sz**DndchAm+xIjA}M)#{wERiaSOld6Au(pn2^0JO_ zeuJT=TiYsJ#rLFavjp=ok&oi`s}S4D@vXXB`LLY1n?H4rP(25wTv!g8-a?aFEXgA@ zdzIr&tf2O9UutTC*O9rHuH+Fq07l>kKEoAcBeo>kj?tz=0fytZzACkznQ;tvEqt=g zZMV#Ogl(&C3GQl>U_j3rfY4v2^?k4|-O?^PpL5!zg2`iv<2EgsT$fz)5b8-j^>)@F ztY1e2QD$iHw#gC!o)64VemTuG-pEAPx=p;Ta@kp3oz!2bmxup@cm|-Ccd2t@=h%wGOg+bGf;8YXLhss&5 zkR*-*A}>bwKZPw=(IC1>B{yXx8y!W!g>u0M89~6^?NdU_E>>`3Kr;Sj42lmxalvn; zQS)xLOfCwea;oXjd)1ikWBVeq3FMIh0(VfM{W$jRLq#IU8)cEBXJi0${{WVJb7;WR)If8*v}Xp}4w@ z9dU4yE-=j)$j(1XTfIE#)5mobi6n~K-eo6{M?WvGTB|b^*=9*+-4EL7^OmS_>uiZJ| zpIVAEODM`E=-SesGG-YJ#Qo4egnCt2E=zT6w>iGE-dPXNA!D~4hC5VN(Z_ptZ3mf; znTjYR4}9X5NuvnpeAs?s+cTVV&lL*ZUR+BwNJr zS2m9nvD{=>%MxUQGrRu)*FcsccFQa&Awjpy;X(D|r9p3H4T{LRU5iH^-TqWh@Cz?V&Ds_t9Z!( zD?04}XCH~Hkwh*dG2C4Feo$qG6Bje&jz%dtL~)BLwY0YvlUu{5FtyqYl7|?Njz_tx zGFdG53vm^Th)f$`m^K3(atEzBG~*?iwYajnl0hL30pPFUS~k%|e8kROJcx5`w~Vmh zs8Q@I8Px1+7^ghZb+?TqR+J0|`HBQEU)<9x5hJvzNBH`A?KwF<=z2JP*>6 zWmuzYW)ZI3Mv%oLW-EgsZHGL9JCj!}BUik5LNQq34Y-_=xjkwYfhUj3WKn48zGY%V z1Ka{Cds~AD^DW|#0UlBI+enSl-xX4_a1VET={2(J#(Jes}F3E5eu?~c*fv5r+?0%*>P(sOsTK~#=+eG z02jX$?5r{toLxqjzuD8tiM*w`Vlgf_+mGZ;3vUg*+20MoKsSbWIW65!(w`8BU8rd# zw?HuY`;oqW@W*?=4}-@_!15oVt1R%qEqeq8Xr*!HQc z<+od`-`dC&#uh9-LC^H2-dlZ=<+RD)EgJ4tiI2=%o<9nWnOl*`_M0o1=W`e_m1BrO zmm|3PdQ&H!@9l;_=_2J>+NM?@04ox`~1|@yC`QCj+_msuD*lERm}-XC)+Y1l}Toz}~c;d>rCR96~|w{xua zUuWOtZDm#JqmJGE>V>o1tkX!k*PpdRM2Qd0COVJzN2hw)G>CN#AMGXxfnRDz^U1vf zdC{IYKGd;a$r``eio%F@N#`!{Iv$wEO3jk;{IR>WxweU-E4nFS+_Plk1N*%GwJ{UH zaV50&g*>zmG=%)1lh6u&$ew$am7$8*uJ&gHmUtu~yuPFIs|6){ks*nhW&u(Z;77)H zpJU(YSuworGF=_0?8RC=zjq(r9+he<%UOcQH0nwJ0FRaguHQmGE|oH-H7l1I;$O3v zk_2{+O~OV|h9{51ip`wKCDIx1B1IB@{uTspAME;5?==`qO!8c$a)3zO*vkDqed>kY zv1fhc6p?TnDH~%lwlSVMEmR=Ll#y!039d)l<|tLp)rjC@_;c%3wB1L{o#VN-xDO-k zjl%(k40-Y@wCpvc}|<@vB!mlKGLDSZ>RN&PnbCPHaqz5`+ybu6(tO;Kz^ee>$@qlU&?A$U|!4Kis1}?=XXm zf<0=q>2o|k=p;QgSmM5+~s%Ri1b4hC{L>Q6R>&YIJ+W~H8OQ(|7R8&{DPy&&ePkdvh zI+|$GW4;LYfX5ih2#lm|0Cms!(<8W;Mm~aJY4dZDrarpd4WF&(@nQwS@2!ai}RqAG?M<%1%CltU`zF`y#Yh z(c%JkbIbaWJu}*fSeu8pRNT>R5@CS}{?FGPs#|4POHDdpiDz;=!JXtF!vsAy8nX;2 z?Yd&DgYG&EbLmdAX@$h80bQhdV5v5Z#4L=!y*u40G5ypXTKhmoTSQ06c*i8 zZK2d01zDNAwfp3H?j65cbSk!p>Y+{sI z`c-?$VX+=yyjzrxKQeH=iS!5j@k>?>rKvT={F4T?o(-1KjnPWLGM4F(MpA6;SP2;&%wya>?59*|yz^r+eBZk#Y=eLgLz<{>4aAKe*&IuSjK#sv zuhO8+&Hn(O7`I>%G3FoQ?VqJug^b+qu{Fi&PYYVjBY9`=KYMJaohg|`(TIo&AiGup1nA}=P(QOOm=UP-od z8j*=vxeeQ=VN>QtX=A>KI92}uTz*`A2c&Hz4# z{3=UU9Nt5^3zv3Mz`#=je;&QSqTfzX*_PgC2;rw-*adUgQZ}kU5$!T;;BYAt(&}=P zA$}V%GZ#`Igz}{BerMq&}426*pfN}S?+C&0>#*dGO`d!$Rqsqu7$Mu zU`B>W1dQrNGl0X>^QX0)t&kd2h_Vm^$`lRASac`asZ~)zbgp54W?S4o@eGlnK${t| zNFDM!nztT}ZerOl?$ri)Jv{+6s+M-~+nb55(Gns6=Owx6`Bm5~mOn9O0Rb6MN8eNY z>SbM*3J9TPr%7icg^02;s~GSJ_5T10&}(VZ+G!G4#9mlwBrBYbydK|5wPLAo$t)I9 zEYVyQk~7FXl;^f;+!``0az+pUSiIKk$8)hGf&LZGD!QE!r({-!#9Lj)BnS7AtdMQ{ ziVt({YQ!3KwZThkhm{gGX2fZPSF^*W?DdO{he1=BaQwM`k zTukk7-)EF5*a?iU1b?3OU~ZJGZWM9JP;d{U8jdRnFFe*aN|Me%S)?R^gZFVlVPh~s zKB02Aat2rm>@iHAc>9jS-n4J6LKzwyL(VnXdHt8J7k|jhE(9 zag`o}(xG!GcakU!kf;i>N^i+Lb>i(7_fY^yOjMITS)SD=>a z)<_y)1285zLUjYb;aM?U++0dzlGPl8go++K!JhRrH^yX>N_*tx$WE!P}az@&O&MlPT!k$6LYLepB;UC&8NsKrV5y?_LYMty6 zZ4GB~9p=iUEID6R9e}48iMt~<_gB5My-*|b;9^(hKsKr8BR$6yJnub`^T!p$X))(It8RD@E0)(*!fw|eMF9PPIC zEipc0%WG*f5<>5dkA9>NT8=?;Wq562gpLQ8P6=_>BC0rs;b6D2^Wu^>-z6=zh{t=09OY9d*i)aLT*qrk%WDMDKMZ306cX5Mw0>+NoBMD0EvWnjio2fZUAic z6z1}vV+*%A%PO8g#Yb>UBg-U-wVP>=Z*N>wSBZ5kxHeLReYi&}l6`3{K+v|mNX)Bn z0ghNeme%2Z`gSAosH71};MyZ9A^{SY$s^F7{{ULfwrL&K>Dou094j{LqXGOsUuw|P zG|7$fH169RgC6L}+TBils$HTA?183x9onpVVUR}InH@n<_4N8x#I`?UOS3AX$O-wP z!n^kXb{z5eR{f2>o2cp6Hu{+I#=ueqTp2(;ed`}kjaKK$hUA-ZgBC_Y`r@p{P zc02{g7_GfOMO$$lgdntw^JMe2PjT&5VoNyFW$cW}8=cD^4B6?=rDZCejTBLvr)lQb zOq|6NOY)Gb)Q_*VXgPqE& z@=6cNTeu>k(veq+H18viM2&STgx?C}LXnJaVbh=MQfnS4(+-YS+R4&+7vz9o1135g zbkD6}rP|%f%jdW(GrW_veuJe}S)jYP5VWD>7~LjzjCMH1TBe@lIon~n%=)~`CF~%i zo<v{JzAq7)(GLy&mKKJ-TJRYY-^!m(CNWMF?5YKvb)!QB5jP_>UmZP z?JeVz<|`p(MI;u;`@)8p(?pln@?0mAaUeu+2$C{X73i+b#c9j-~oy5qf2yP9$GD=8a(ZaRC9O41N-b2-k&vGI!AGQG=#8hnx_dMDG? zv9Gm>FC#YoVw7nMhU!B08K^F;oe=p-yGi+&9Gq0v`dUcdX40n^BRqZs`c}#ihNdoa zmV|b<(%;GjvM>XwU@&`TtfEOP$vV3$s*U@HVe5*}O)lb3^f!f7%H*nWcKVNcoglW9 z{i0Q6ia)#;A2vGHa;Ul&7(S+4T6~NfA*C**!>PwUpHFJJrr7Xt$$^7lsJzFob69<_mOsc$ zf;0zmnS^y|R?0P9s%iR|ru z+aim2-c!0>8<d0 zWOgB&_?IX7dsI0Vp=4&g%#kZw%BDEkbLMm(ojwC__c0cTG(-Jkt90XoRw1*TF|oaf zv*6{Irze5=RMyL9rD{>$POTcEZCh3u^9R4TdUv`GR*LgO6cCuwa7&My1mqv-QNG7! zh#1)zZJ1}M^r_ZH5wgJukO$tZK*-7U^rp*ZS_Wv-?!Vm}WS;aVsNIO{-dkzBxLIU? z$F?Sup84CKLDI7C;U5G2Zq|- z)SC!oL?oT(l?S=4VJkbCO*V>FdPLUoF^<;aNYC7nxxw~5s{NjwGPjl_01&x(2LPVg zr^TzwZMH?YJ0v)kG+u~5sj9cyz3ur9P{SLXEJOpede)x&h_q38BGY1=#d^&mD&Yif z04?iOE(OxOghpfy$yDGUPJ0T0uT9#@uL0T!3oLDbxb7-vm@o}D8}PA`cs}&hS{2hM zOlO_sw~-koRSc{SH-Gi1(ktvLWF-i}Z|{2IuiD$0?v&0FStC*+F|I!Y_*3ov&WMdN z@1aX6!{i*~?293AxGJBI6(@tub_Q_K)4| zW4q>8JOR&2(bFOjA&Tuo1E1alhC!ab{VJT2M5QM6A^QyR&E!vR;x-?A^()$+_C|2U zUNvC9yBOm>^`|6vdW7*PPu|XUBZce%!TM88n%gItE)k<|-o#fS{l}-cti7SHA~Mq0 zxCEny2Mp?Pr`%Jb7gI>TBCdY(3~+txP6USrU$K(7AUiO@`U-T3JHoNr*#dKw*auGJ z`%vm3s%3a1m>^`75?JSI^ds7mCAOP;O>#WJlJTnj(d=nwgH(?2+}Xr3$Oimy53r+6 z)AcE%dv%3cCQ>9>7YsS%j^?GbU7OIB-%KlMy4{oplWYh0ox0+#TFlRI)=@KgigM^z zJc^RY$!i(0eKZAD{m9%41~~b%Q`l*?%PX*wRd+u#1IQiE(y)}9+};tk#;${;*&BAf zxVj_G82#pOJw`vyY1i6D=ma{1FB_6XO%DW)-&}r`4V}|z*RX2oBD_||Z zr7&~TlivcMk4%?Rv{0jRE096&^Z=2+vF2_cQ9 zJEmCp?~j;t9CxOjmV|QM>O*N^YZOgu=k8pEbR2W&YIm3<$s7^|TXr5;WXL3nwRNWH zrU;oO9&DSNac-o0e_CWv+3$`?r7N+=oQslq>CG$LwHs(ux3yUBnA}KY7dS3sUJpDe z&q}`qggT7PaVmK$YO5k!`GjqJ<0ZT2(wi0fY4YArrcTp41xINR6vlc0dQoxa#i!4I zdlZ`;On)yxcs;wG)YaJZM7HY`_r*tZsjl{0UQ-K(Y@8f=)8%YAk#gq5EK|)4a)Ttf zoA-q6&w3L1BDn~+3c(P5>?t@tyw)}Dv~>4*m~D}UB|>;{>(6S+eQ}y&5G}N>K|OQn zn${GXTA5C?V)Qz={7ZV45}QSi-tqFgoCA;#Tz050HMJ=m6Q)?XK61AJk?CCH>XNZy zKzybIT^auX8eQ!;kIjNe$QV>7lUAuDX6xM38kF%tC5umyzj8XSBPZ6OxYjNa#Lx~2 z+IIK$Bl^`++qXBC!#{T>l2(aXo=BJ|137L8?~1hqh;nR?%Ny`#2)WGJC#R+=cy!G| zc4d)BY-L+%`@VzU6#|xB^TvV1i-n91!{64eo4d=4abzZuHXtZnut@Y2+h|c&8f>ju ze7LP;A&wZdna8)+H2E~9oOz0pF2jeW6O1#27|7}g^{WxaFNl}V z+=!#gML1FF-sJxPO3lrqRTRor`ebs-&hq34$I1`gJ*!UNL0Ol~fGo0ds<5d!KBRwI zk?wS)nMso>$`xW96=UDtgz>Gukp!A{ltsG6*k*s4Nj-j?)HzA54HAkZywYQ_vP-M7 z!bW0L2JQ!6r?qB7samXsDy9zcJce$$Cq}slq{{Uu=Gb7--rtG#4CZvN!odhV- zEJeZF=B9Ai=8{%giu&kGx{$F(xSTsO@&XKPKEH)lveY%JnI~wV`D8gW0h5gS8q^w9 zgj4yV=Q1=vNHdf51Jg9WZHgplEp`c3J`qp{&$+3*M`?8`CYL!PFScS;1-6ny52*F2 z7g0+{9@K0zy5LFF2K2>Ox`)I!jU0FEAyLClVdHPqa%#Pnnv%E@>Vi0yTr|vt?&qNP zqm^3hcecf;H8|!BS|@ToLKlo5U!^t1v2sin%pgDm2a$IWeX8Bgksg;e1e=xA{PF() zAEiSb&ZiLm%e&d;le!&|@XAL3)ZGP{GTE8rHw*{d!*f!9W2LRu>uH0+p>ic+Kw>gU z&p;~Pois4rBHzs%N+TN-E)MSM)n-k1O#2LkjjH^moBSlRd+0mzx`V%}x zDBWA0QDw|UTa_ob*06O?78wx7 zX(1A*IDGCy?0%Izl_#L@2qU4I!Y?rtxsDs#+hc!P@f>=6 zlsACzEaXwxJTagL+8=Bio6JSGY@g zAi1<`tb`+<;XU)7rmtA&=0$6p(qeff%gW4f7qWr=6@UH_>lLyRi}VCL7bIk-p#!~J zoKTXJ*ub`e^6uyT9vAY+0f{+3iK{lA9J;(%mg>dkN06u~{5bwqziTLR3c`VvHkL&l z2Ye2utV3-jymCbywBCP|Bq2uyGt>&oRod9mQ!8nH7SQZsF-vN?eEk?85?32EJ-741JmhKe`&3=86=H7qru}i{{R}TX{SjN%XK6sR+WF% zDd0Hh2c~K9*v2kJ#DuHt8{_9{W3YF&tdZ1 z%7rcMC;rj7nIxJI^@wBSj@TV4{L2hZ6v{HH7)E(wPhsg>cJFU(X)U*t7)yW@GsX)k z^#>J`r(H#BcGh=g9#xo#UNe)hcOcT{a$~iJ#bPfeNiOCnh(Qy=cAO5!6?03{9L?oL zEM>{x^YgJ!^`x5Q85D($eAn9yS;0J2X!QrS9&MbhmE5d4_vBQqN1=OG@-&n({iZ#L zPFQn;?dnZazLv(q7rQqstjGxmCxg)XRu%56sU^dGoTRar%PS6km5X;Zc=V5xQBYMgV#UZs^+t?Hf0|t>~TY29p(9$y!iW|^U3dum+dJWYbCmG2>6m9 za0veQ9dc>S5=O|vU?3}*L2Qr*Vd`r(^HYK;l_HgRY!F9d>r|lR#dM1|{!C6hvy?6j zXi46q9G~e~@yJJ+99G*@F=Fi59RC0hwN|>mxGI zJbi1X6!~MRla=0vt)hiLxdnlYXL-p!p!$kg;Y+1r+xDVlq)bCO^gry=Y^|;WrRv(s zp}tcoJPH*PkO>lDH^D|6|Hpf_JzA}S1EuWkiUg!Sz1i0 zWQJvC2Qj#hhCk2>mfF;%*Vxg7*9#W*3UCmfaZk6iyD{y&waOAilf}RQ_9C;C+bKrG zt2M~C5q-J`w#fq)*nQj{PhtG&-(vHicZL>_GU82#{NjyFUfXK0+235nB9sQ*p^t9$ zBa%n;^{FD&q|)t4WeOx4c5NAE&1ZH|Ug8-cSsLEXV=G66&IpGc$f`0ix0FtxnE(T5 z87JQ!m7_D*T$xrokqptt#jq!Q%t-uz89wzxV!(x`kvE+4(2?5|)9xmR$2%>|f9U>U zSpz0|XB`OdP1K^7QJLID5+jfdXrIOO?M#~1>0ra1$+9<FgTj-W78?mN^; zrpqtdQf_VJ1LSV1LF#?0OHYeTE{}I~{#u>y4o+Jhr_!!IvEjn9GFswZ0)}iHe^E=B z-$1dG{f!*UBVI=gZjlCp8PolG9_lGp!(zv8e+$N(0Ty<-9k6|B3(a0_a_S}1beSZX zW-+EtHsEv5VaIyE4TD?EeCZv=L1QAFu^&&yskWA)TCfVy%x>kBLlU42PbCy|$?j^n zS4c(Dt&K?t>4R@A1Xv6a>>q5A5cFk*OqOGN-1hLQMZcK ze7KofINXq=5uZ{jw7S0Oq_;Ate1ORPhqX^>Yj>)C{`4|8a87yt@3l=1f&{=A@L#EA z+(4}^lCv}Sp2Z7Bz0}4bnWI#cuJB2~^~FsFpQuVFl!=-}1^HZ;RrDRJY6xURF^EiM zM-SeNw6|`~><4-w+y4yoO4-| z#XNTH<+$?P5xLVRA6n=k@Vjf$%N?eu72}Cj{&SV|818EeUz1t4Y3zlvd1whPKnz@e z2_LO#33CxB*oGZe;=!6rcyTaIqE}JJ9qA#|X1yMD-OumTZP>ghUs}tC;_7IcOZI0} zJjSCNe;-PoU2@%}iaB5~GXDUta0cHm99GEn$y z-XU$K`4=k~!idykBaUk})(9_{*u3&AlgEfw7dd}ycjC6B@J@;}v@yD)NgmD4-#kQh zI34R5IH&I#B_^~v+pTL*@d=VBtr$sg#RKiyiO*7M-iP3OnKsVX1*M8Yvs+1>spxb4 zYfxBQ=~1PMTR-8n@+jk01b*NRgQrgQlD;3B^+na|$}*%n zkG!B(rk`aSFp5~-KivX13~yiW3fabtA>7a3lO;_a^77!tb*e1VxcL$SM&5Wn=BCqh z%|g^jUeZVuNwvuw9($4NTMCOBAF|v*6wyQ;0_mSMx?ofnF?n+>w8B9QxZN~e1D;Ca zv2|~uud^ey&@L|+O`_aP9TNp)l(OgCcNL|k_&{oMPrw;gz? zqO-WVyJ>`)W2q?8=V0kMPqL(2i@de4dV zeL%*xF|b(KO3Zjy2l!8~tz^Ze-fDoQ{n2O^MlPsNuXEUDt~8~)WKN`ZNV%;&*?s49!M7sXARw?|%Nn_fM24RpF5fVQ%kC9{p);TV!M$!v5Z z(-pC8;Q2J@66#X2qcJi@SCl<+D3xk((FswhJz2?UngG+Kd2U$AfrLXI-L2f3)Y7!b zr7}w^2*LxkyEzB2?OL;2yF^2`ml*`KPMIt{Gg8~xD?o%D<92{|k1N2OY^y0pD3EH^6>4kURxmg$Ut4>c=kcB^xM)u@HX29I$fLK?ty@6?Gu`boT&Nyc zCxAy@I}b`(p^7-AhB9{fDg?R7_p5PRw3jU~f#SCii5UmZV_#Bn$vu6m2HB)iMR_B( z^Yd=4yJm3h%8zP<1l%KvM<+ipljg_gS6*9pMV8<(MMBXuZG-xCssdRVRF({KdW;qJ zG?HU#!&WDWC74PWkV2s7S3PNy%5CjlQ2Rtl)$_MB)p(XYsKDjUW-apd=}p^bB&_n@ zk1a>cs&cG;nBtlzVveVL>u)Uf?ue?O1!w2*^))tyV|S^@t1EerBmAt4M&3T@_oGv_ z^GuT2M;0XkNSB?M?mg+z#bO{cX*$G$NYrGilkEBUQrz*}or3wW0eOTfBMx(d0s=wGZMfbIFeT*vistvg&~s7e7IzpVq)Ms@N>Zj+LoiT zBit@Ab!sAIWg*(`GDwlGPdaT}5Ts);XIN*(|2#i)AZddty$dMa_axzr=f!dsI_7k!jZF6T6 zM7I;NB(C02&TzfQ`$rY35u|FDqPEBH7>XXe1!c`D~`<4-d$?83gYH1Qp zDu$8CC*_bHiRcXzi%R2+lVq;~t&FJ^xG3W)(sP6B?^!mw47WF;{(FRtB5bL~K5p6e zt*u((+e}oR=H*`LKI9AcRD1fG;yg>^nD?6tD~O~&c!SuUs>9TFqLn#S*$SmdQ(BtZ zuCHZc{!^baS!6NDsChy<1O63CNpCNR8m|I5HzY_loOH>qM%MN2r$KwGhyi`E#3SXp z^~Ygbz8$w^Sc2>DyQIf-l7@Zb`=_BCbgr4;KaAZYshW5o{YZ|SJ+evj0!Hzaj|` za@?qw&B+9i#AEM$DH{G53280XSr#x97sldy^Ze@LP3}vb^hB1{w-DT`nSmD=A}Id! zM0E^(YH_HuC`Od5u*z`maG{SFU@ETbZ8i&;Cex&pq+qfm;O-}b^yaa(EpAJ6Hcqj# zWReH)_vhBMjVC5Vswi%D)~lpKUVT8j&$ss`DLz*AHP2u8y2{e&MZK#uvAYu!F4CkN zZEXI3O6D}1e-(JURY=9c#VG#(Qc>^#8RX;AwQW2Dc|OVSZY8)PQnxY$z$Ua*Y14O; zBic@X3Mt-r`e<*RiFo3;AL|Y>t?Qn`tZ30{I;@7|I;n>RcLSM_`g)&w=(Mkemb!E@ zUfoY<((eW*U`hq_Iq%O}+|u+b2%|TWkt{$4iBw=P9l`W96U5Srv=!LlLZqGKW@*|K zaYY;=JAmv<0X&%uzQ0P+x3G%xG8qC)jnsX|9RbB!wSekQ_VGwT&h+^>Qh$Vc(%H== zq-yd&+v2z(g~ILUJu&!KBb%1DI+RizG@FIKGT(V=BcKpT&;##|)d-H#b!cXsC{L5+ zUzE3UDKD=X?srbFxD5igF|O z9)y~bC|WCJvUc1MnHzZdi9gn<+{pHcHB)VQp>4YTG<)R$dQzE>9}{r zYLjBUwr5_p$qd#lZ*q~>+M|4+}F1et*q@SR3&7PoHS>?YpR|fpL3R`CznW_UH6KRJGx#+ z=0M?CX9xY@d;T?#s#@P#Guy=$<(5x0$WC&Hl0B;#^;-pl}6BjS}7{+stU%MQ03I zp9df8p2D?tRJOK+UftQNCBM(*fr8w6*EHwLqBl{#rMa#&TXvJ|u%A9v9&jzsK7-Iw zHH6Z~CZ!FNDny|gXMFVZ9-Pu!GuvOr^Dg;YYsYTnZo&Q^z*1h@+FP^F73_>+C6y+W zg2ev-4mxq#u+-Z^X!OXZc&#kF`5BJsOpVdKhhbLi4b1W_>5Zh47AUQN9zNYa&lQh% ztVUeg+Fcmk<5g*x{q5bjNfW5i4Nu{0`CX!9_JLKoq{emH7#`K5dDcDXs}5o zhFLl4eSaFBAsv)Hbi_NO;YLmu-1^pG@weFnTwz$4_OKW(R3G9W=cQp>c&H?pmPTi} zlVi&m`AQR!^fi=eRF>tskcrj9sj8W-ntjaJMt2+zdk)oS`$gm|(ZcdGe4$siD~+<3 zT)N$KZ3>P=XBjRO`g-~rxG$%B7QxvoN4n*6^C<0)N**0-IMsGK4MO3q+{Gyi7>qQI zPBwq_>z~*4Ju>EGn%e3xsUR^(9EFtQ1ZV46+TV#TKF;d)p<$T-Se>%x>V5wJt#k2D zEyd|9jktg!Q}<%^`z`R ze`gz+`$<^ShgZ|&{{Ta>os}Y+a)}t_WIcKBS1xZSw2^GmWs*7Ai;29vfJn|VdJ5)K zP?Fi!;u9a2Y{cxiUBLFo)}(DsZUmE~y9eQ;jrfZmo~Dmw8;jbrQ&rWL(%7t$saRwC z<#>KNdkUpCp{qv&$zuzW4pCc@*&WYeQ9~WA@Q%_(KfG@&d8|lcew1ocMI7a1V{sj{ zI}s4=IqoyxrYlIoE1?pc+blKQla+=jnT`RHL~MwTI%n6nwP_{qn;ojOPCSjpHUZZh zf@_-$Vnus$B8;|5J90fi#Z48=sKIUZ6_OIbrw5bhKhJ8XO>`2QOuc(|VP}3Mk{K96 zxsNhsV`dzjbS=`UT+X_LFsyQLSgg};`?%-_twnWlajIM-Lu^3H$}sAG$g7a)&|Ak8 zS4J@zeb`gT^(Lt#gxirxVsrqQ@FF|>w*ERuE$xkO%}rhxnA$2je59i&2h7J}d-SVUGHn;uc&yTBto41*BIjTya0K)R zwkkjEd0y3{d0DO7hF4L!eTnb=X_oqAZ8UeHGc+=skrbFY1Ci}h+u6=-l|%$Ygz`Z7 zfjxgp8j2cHWGa`srl8Q;*(`%+I>0z|ARRyjHUHB!G4!QKKrBcYa(!Q*1*cT7wn2?x? zkkP^c+6FoH6$CcdP`k$+uqowlWpFUrKJ{>087?Mdw~!LM3bWw+y+|IFC7ekY+0xzz zc9J$$H&{E9)E}*2>e$s&Gg`{>`rcCwpe-5$7>MA3o{j5I8hgmXOmsU~FWn=!_CEEo z9-S1IF+^T27j<~HzG^oV8Wk4j5;zk3Ipnc(6Fxc8hro7XQ@}sKH%JVD&B#r>xKq9{>RHP)B*bE+= z=1UczXkIl`w~zxS?)W}}rZ*`Ai*GmNoC0GflsM#p zQqf7HPS;bK(&`gy2|Er<%!6*wI(=!EH*;PrQpa^1X>%hKiB~1hatP^A*lI~{a$Z?f zK;sg?-9vT+{{TT%r?|BeG}}UXVz}H+fZ35qTOpY%Rzc3!coqe;TD5lX6#_ z#L=T%gpNksl1_4`xcRCL_H)FR+l|7rv$JI2`{ec%$(-F8qiZP{ESzo|u(FacMmtqg zcN@(z$9j__*h6l=dfX1#{{T4^Y6`?T8xTN^VrRFtb8OADobFuqAoo7h$>xp?&2T{E zF6QZqZKl6A3Awak1)u|G01$XTkH1>4bt27eBa3NcjDv-kSWZJ8qqz~aI)}N?aTE`?Y zTiTW0nB1psc+FRc%K=!Tgt-b9Ln7{3qsIUqzu`|uja=G5lFcFHE1kwX{{V(DND9&D zmlsM>D1*ftVnS4I1pE3{Q)#yibmHdG<8s(yPBNpWJu6--dz(9>Exqt-ge7;7N--zy zkWXXN-l~h+o13A!&DG(TY|lD^ih1M;xUw2Et@QKuaU`zsg?1_n{NU#qKDBR6&~LuT z(WKvIEbOtf46_{a-oVrCe#xdZeryjbn}&H=AD3MGxX(a8oo&IZ*;+eAb!eg@Lll+3 zWZnE(_4cOZ!6eI8UKVe$%W`kxX8}?*BmF@2_c{EkD=9oP;pULuuA_Hwt{U3P*?x4N zJhL`NBgRe|<3y(OugWVoLx4RR;hu@BaYSs7bw9 zZb@u(H~N%UQ$7BijzfI2A}C=GuN|A-s7&&;z0yZ>6lpR9k;)g4V~{<)zxvf)!B9st z!K$RHuZOloD}nBPb5}3)hK|{9BD;95e5S;TGKF!%vYr@@p!W6TidIN>Y=xTcXhPhX zqVj+ZDeO96(|@!q{D{rlv{OxT(A#EQD>rT5TA_1#_v>w=rM=0K#vVye%ATxGVfCqQ z=d`qIV;pAY2w8-mH!5+B!`rv1r^<=FiBndwy2C?r37Xns%>q7H9*1|gd{mlVp>863 zV{kaSEpo$+%lsgEVz4CDt|JcuYEZ>;>ya>kZ!v?Ag!dwuHobQ&>aA|OVO{GE(5%NC zo;uY!HxiwWn&(=zNP^s>24YGqZ;jO-+b<=RCPE=^^;?4QqaDw4@7l8Aw0IHc)jY|b zEw>RyS806oT=c*nonDn?L`8Ki9OSfvW`1mE3Oj%Gt0_Su)SES64LZ6>Z6wjccN1*I zOl*IMXQ}q9T4kuXl*we$2>3BI%!Pq&hc!n>hUVY|zO#7l0tbN-U<5n52EqB5f%L7b zZ8*;u0AfiAK&(y!5Am$+W1<@tVe?WjvutII?j=|59^@0$ds6wr2pnSySd#h4=b*(6 zHKo*|85NOR2&=mc7!G=UDwEvZ$#gCmQco*}nkB~2I0|W9GfRcl#M30oEZZ=huNmNE z)1F<yPlJ-rw0Ed&L`KAO%J_81)|Y zE+KODyzoS`{h*IB0l&%(!>?oX_Ng}_d1B`6QJCdJDFI37yjBF-^ilyA068fdF#ySd z+t#5M_jh*D-Q3$q3cDzrHUV+Q!aH%^rBRb7+9Y&S-pFDkw%Jr2%)=o^s2;UO>E@L| zRbU7VuB>wS?NCRkM#3m#NhUjwnyN}rK8#(RM*EH!e@tN)|OKn0-DA*tlfcqa>uXUzDaXqv~;#i4?%y{?l z&rY4c&lRPWiPq)cwIm8e5{5g-kurB8j;z_}DU!_B+G&YhlhIyJ;NyrMP*V_V%ST$qXInvthSZ(Ea z*4Q&B8F-_6j-2rN{!pjrw0%a-p&#~?AS;|GlA+g?C+(w4(+zAYu zmNhsLxc=~|(#`Hkd%4}w95_gcT(_eR;;6@W9E&p~PGcC|a6sCm9#_|PYCHKa*+H<> zL@W=?uNLCx)cOj+rrD=5Hzc@@&PTYpnc>_4L%WtEpdaB>TU)jh$zYN+momg;jx~G( zf(amZ#zt||Jk~a!74D^dBwDL9*Kx!d89`X$T;MPVsUz2=Y1=~cTgItw(*2%N$sqs; z*o~xv)N!2p(CrXSy@_pf=tbey=V>HJ*f*525D~H7ugX>P_-}9$g>SOE@*`!2re8*GD5Hqyn zrySy-zP@>7EU{cn?5f9e@S_;#J&rn6SRJfTcny;x#;qd*kt~NH3FImDKJ`}MEKeoG zmd`Ay8J25ia6HBDfOsGMYG$dbL2bGx)L~45U=km^anIKkQhj<=xQfjrfxwGv&KI6X zAo>qV(Lu8ZB$n;yz%*dS~PKEJ4QJ>zJygv-B#ApR=1Uo!m8~~+HuX9vGYyJKJ@B{@ z9K~u$9$MpryQkMamCx0>}N*djs3p*EgfMiIU+g-qipFmf}Fd zR?Zk>(z*>2I~mA=*_vr0kjUE{fVn&Z2VwbFnO!8#+E;s*F6^d}nP!=S1R42pw>@er zjU2X;Y;944r0pbk0D?yt$M{x+7ti*8E;ZilBo$mz9_M_@%yE}L&0NYbMd0*|uC z8)I*)6W*C7+k1H>F5svsB&+?~7b@q1+aTLY{RX=NSfD_aXrk%lPR=HB? zC(f-284@!7fBw49yOLXop4sHaRC#5TZd`O=d)CF|2ki1&+Cq~_mUN$g0e`!+)@=3{ zlS&v`$aY7S+_(UDAX81US{radx0NTj%SeGu#j=&>u~F-u)u9xUi>W8IwFMR+vH-c? zfyu{iYK6U?s};P6E)|f;yAnf&2m7bf*ov@`M{5`&IZU!K7c+UB1nabqtu_|WxVK{O zQn!X{Cx#|n_kmaC+3i>DH2YcYB)!vMkV`9=g{#TAl?O)2;Qs(h$hUHKl7Jn`F9Jr7>WUFSa=Y(EHYMPQ@lmK8JA}v2Bn%FhbHYD)L4!e*kIH zXj42w<4}TRbcb{$m@X7|KEGPO9&=r_7{lQpffL{?~?J<&R^D#Ua=b?gmL)IJ}jt+wk6BRG;gvd1Z5AFFfxUZSC5 z74;5I#|+k~Zc=M`gfn@#g-Y%%>z>&6qTUveyW4M@X&}K0oS@Gy>Ru2;J@*pJ4(~uD9T;5l1%3? zx^NYH2KUD~ucMsTE{Dmgc6yLq28I~^(iAB|B#g)MkOyyi#JX8x)Z@B)v`oefi!%~1 zGmHw|)ui8I?;iAuG75u@&gXy^J#u&gvGs5CSzak1XyxH#44k8T=cm%DlWh&g(lPZ2 z;~TH7u0*krMiic3Jn_=7-p=wpfx(cOi1IK?N8dT=n%LE&x@SwfmspZ8L#ijsAtS2e zp{hEBnv7P>W2al0rVE&r6c3n;ki`E0I;p#(u9DEJZ5`U8T29LGd4#O$0B>EaPdKPA z6YUpBZcw0Ne#2y-jq6SM>UCkSVoR;)Hm2NefXd{Brl3C?r zgbBioXD8OCoRdUIw6IFg7?)&m%Rb2ojO3;c4o5(0dpkDMCwI7y%~o%j5y%^R0iJ@H zn|#k|lKGN60gN7I3jyiv^r>f#DPTbMtX5I-7L$dL0C3poD|I4J*ljJ~CK4t<&RqG@ zoP{T#G|BF#dr36gdnqAQKRXf(QuD&F^re}~TLok-c&g1ba<|DK{vE!8mckkBh-scT zNlq|V?>BP3-Kv(OCK^LoYwf5uwHNQK<4I(Ri1M@44#(1)G?2#>;b52~BN40p=J%-P zL};bAzOi8wE+bIb+;iNDlIrHgVog37qRKhf+>&D>7SJO}_*&q3|=ryHwg4Rt(a#AU^=J{Dytx5amzG30 zI3Rn~RIym%4d?lWB3Th~yN{th^)xq$b10wfEP>+z?Z_Mv-kV4fWn|eRK{TQ_19N$N zhR;f}rQRl$EoCa1GpJ#gQR!8ny|%K9O$1^c<7DkH4$JTV0M?@U86lo4=o)KyP;8MG z3i;)}zT%;x?iWBX5;TT2FXl%iZNV7m)eYyFc8=1%oz zrd*RUNfZ`uG-^D<8jwD2`+Yu@J<{G;-LSbTE+V#BKF-4hlN=FCa{`&Ie#>%<(x{P4 zc`BzJ0rmAAs9TEUcJlq6#wjisB$;I)ha{X}f1hfvb9XJnL8sUkifdT|yE+C8#B#Xx z@0zu_CU&@y_DHH4EG7WQ41ToHb#E1!x3`iqvgE4CjmX)~K|Rl{J6H_yZwxNtHfI+S z9Izy@Zt6uc-7Y-O?8iqQRGIP~JQoN3s=aw|_9&MT+bTo{-#{3vpHuJcRCNobK2%S1 z09Gbl++dO1)g;)0S=l3&<|BZs@@_l~9&_vUs3(Hf@gC02rCA6r_X{CXx$eG#tK4cZ zT&adXIIL(?l^jS9_kC$1yoa9P6 zFvqP|`(@7cyNcA6X;?b&b^*$t{!rmi3xEv7E#NU6xLIfA#9Z z*v)*fY7c2Il31x6mwUC|eM;P5&3uuXSZ6j8Y#E8-__i{T@{{X9n);Se}$B9W?htKfhr-^PNg<(xT zX%;X>=Eo$>lD3zpyec(^MXThh%Icu#kH<`xdWL$~xcqmWso_Xkc_o-648-}G@VFmM` zTeaITA~FUVCdXFx^rl~V@!Cb3sOGzYh<%Xl+z8+i(zY#Zt|U_=h#V>3Dxd&?&>;F# zu4RF3nc##-#E8sEfH(Fh>FM63%FJpy6yeeeMs9DThDl6o`?WioFn_!{RQo)OrHbeV zc*f|!;~x3;{VCHsOzUcv@o;dGAxo%P+30Z*izJMpF=2)HsoIvmHUe z=QQYb19)OGYc}%18*h%@I5D-led^DK`UGFL-Cd$Uc)eC%n+yCRguk=3wB3IjF(-Y! zymA4xN#iFR@##k^3)q<4#|N1`?W2fhI5zU|!M#flx;j)!5<#>TW=M;xI}(6*2D7fN z+W5^Fxo<44IBYRr?vJHOrf8*6mewbb?EvOOurFiv&r?*Ok_+6D`&No6;Ez#;W)h6~ zP+>R&){=ReV#^oWBiI9AKMcR!Vmj2q-dk3YEK)m}vGYLf_YdRO=}ns5to5o=ZEJ+6Vb$E5d_}k3wfL`(=5Ze{5@*C zR|n(I?sEw9^#8@kB+t z$a2MrL;5f5+Wuiieb>riM` zI;Ol+P_RVW9Ds!4H!IW-eSIotw4Ml9U0g#Q%kK*aB<&-STDYXOChe0g?33yqZly4d zW5dTXF5SeALB~Qm=A^J+?8Z8dsS<6OcH6Ta2=zYx=9{QRX#`gC$uLA{RpbQxq>+q& zp8o)&Ev1g(q`GTqORQoz%j3%jJQL_DTE4|xv}9d1+QQQH?rg%Dq@APtp}7EhVAGBN z0G(|P=p6#Fcaa;J7qL_QDy8+#p=MgfD7MVs@$`JX!)X}=e^2v@_WGM$DZaA0Swt97 z6sz-Y=vWTJkL&amHqdj}nt9-WHQdq_GiEsONG#oOYCGBP5-8<{Cs%WYnb#?hIRsQU zYRMX?JDxcjNXGBJ$FLo$3yFTm5V%)%WN^}>6SNXJ!0-50v8Is@O^Gbgs!b$B0E2Xl z2QBUNAFU%nevXBjHD>vwXk$1j)G0o+>&AH;fo~f+kTQe-$VYs2sU#9xTdUb!MKtc^ z5+@iDjCLNr^`*NLxX-cKt-QiVR!O5V%EbJ;Ph;*XiwSL|ds+O)6DUI2C1YNrp2Xv= zXL?(H}F=rO)8Bw|qe_olSke`tNxyvMBWZLWm^An#f zF~`*LP5#toRcK}18c0<`AG$q#>Nbuix{Bn>heQi3V4N@=4OeId)JEb-(6Y=zglu&7 z^{P=sw#%|y#WVpf1`%ZY#~(TE{{ZT$(@fV9mYN9F7E)PL8CLWZiEAC}#VNO+5x?D5 z!9(h5XyA_A;3t@28{2WtLH;8~i(u82rMI`*WV;dpE@F;TDEVK|k6d@A+*-=fMHS_f zTjMB&8wPKw^c{KnRg(qPz>*lW(JWEzm(F4PvAa1L{_(-%+N29{7%b?n(qk6xhb2c= zK8gUKRw1(jK_!jfS(K@df~20LpQT>4vWsw%>`cod>`4T<18)N(tyhd&S*yT}y$KB) zV~yT$XV&f%AjdcjBX-Fv`;0 z6^$f_A|YeCLO-P`XEQJ&DitrDhI9vol!C^GA6UPLdXu z9!X5}Vg3|Na&9MZ?UGSI>JvVm$KJE9uVcHCTT3K;j)N1q;YjK;-hgIyM)NmC9z5PY z_ZF~KzE1qYm*VMyzdP(1Ows{y#9V7OvFUd+G!dZ5=f?F(B?4C^$` zRZ5(w6)H^6hK66XVN zu*&6u{`PB6NV8kTMwUc_%#en1yeB_+`VV@SQMc1cHie5SMp^Dru(A%+xzf;0U6{(V zFV%}r-F) zSoP!l^HuKPj^;9gQs!^Gh)BjgeW*%ZL9`c>+(<-`g!35)jD^4l+)`-zdt8Nr=J|*K zg4~j}Wj% zHqvd~%-ix*_be*&!EI+ek$sBd;ZhZAc~Ve3*Y16k4_cG#@VQ8Iy=74wA){hT=dW6F z+(;&QoZSQYjhE=p#84?}Rpj;ex>M(W3%HP?VWf?zs{J)83m5QAkV^GDjaI zswM#U`sbRd1fE^omb#UW7Um)LJE)&(2G1eAKhH{^$``T5EkPk%hLjV6qyGS}NvjWX zbx3^4CJ_0`(S$4;1pYM0E=9@)iWiPVW)X?8jyTW%0A8%eZe@XP8Zsl^SIo{6aO?D@ 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

HKPi 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 literal 0 HcmV?d00001 diff --git a/users/arkag/readme.md b/users/arkag/readme.md index 76a5c4525b6f..c685892f86be 100644 --- a/users/arkag/readme.md +++ b/users/arkag/readme.md @@ -1,3 +1,26 @@ +# Shot on Pixel 2 XL with Cheap Lamp at Work + +![mmm, tasty](mechmini2.jpg) + +# I don't know what I'm doing + +Some links: +* [Layout File: Mech Mini 2](layout_mm2) +* [Userspace Header](arkag_h) +* [Userspace Main](arkag_c) + +Here's a list of some things I have working with my currently [keyboard](mm2_home): + +* Reactive (sort of) fading while typing, ported from [Velocikey](https://github.com/qmk/qmk_firmware/pull/3754). +* OS Switching, storing to EEPROM +* OS Specific Macros and Shortcuts(WIN+SHIFT+S for Windows and CMD+SHIFT+4 for MacOS) +* Flashing RGB LED on OS change +* Hex Unicode Macros dependent on OS(half works on Windows due to [WinCompose](https://github.com/SamHocevar/wincompose) not functioning properly just yet). +* "Sleep" function activates after 3 minutes (breathing). +* Markdown style macros for surround type __eve__ ~~ryw~~ *her* **eee** (apparently only certain places support underline and strikethrough ಠ__ಠ) + +# License Stuff + Copyright 2018 arkag arkag@pm.me This program is free software: you can redistribute it and/or modify @@ -12,3 +35,8 @@ 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 . + +[arkag_c]: /users/arkag/arkag.c +[arkag_h]: /users/arkag/arkag.h +[layout_mm2]: /keyboards/mechmini/v2/keymaps/arkag/keymap.c +[mm2_home]: https://cartel.ltd/projects/mechmini2/ From 223081bf2b201a53fb0383d6be0cacb8cde39140 Mon Sep 17 00:00:00 2001 From: wanleg <32079073+wanleg@users.noreply.github.com> Date: Tue, 25 Sep 2018 15:39:41 -0700 Subject: [PATCH 041/505] Keymap: 4x4 pro micro (#3976) * 4x4 - pro micro version * pro-micro setup on 4x4 * tap dance LCTL/RESET key * remove test file * more research * revert a couple un-intended edits * opt_defs version of adding custom rules.mk variables * cleanup * cleanup * cleanup * cleanup * layout edits * layout edits * keymap edit * numpad layout change * got tap dance layer-switch working * keymap changes * temporary revert * restore previous settings * misc fixes * layer order change * fix layout matrix * Update tapdances.c --- keyboards/4x4/4x4.h | 4 +- layouts/community/ortho_4x12/wanleg/config.h | 19 ++++- layouts/community/ortho_4x12/wanleg/keymap.c | 17 +++++ users/wanleg/rules.mk | 12 +-- users/wanleg/tapdances.c | 77 ++++++++++++++++++-- users/wanleg/wanleg.c | 6 ++ users/wanleg/wanleg.h | 51 +++++++++---- 7 files changed, 158 insertions(+), 28 deletions(-) diff --git a/keyboards/4x4/4x4.h b/keyboards/4x4/4x4.h index db67ab34e961..ec75c3e28096 100644 --- a/keyboards/4x4/4x4.h +++ b/keyboards/4x4/4x4.h @@ -43,7 +43,7 @@ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, ___, ___, ___, ___}, \ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, ___, ___, ___, ___}, \ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, ___, ___, ___, ___}, \ - { K30, K31, K32, K33, K34, K35, K35, K37, K38, K39, K3a, K3b, ___, ___, ___, ___} \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, ___, ___, ___, ___} \ } #define LAYOUT_ortho_4x16( \ @@ -56,7 +56,7 @@ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, K0c, K0d, K0e, K0f }, \ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, K1c, K1d, K1e, K1f }, \ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, K2c, K2d, K2e, K2f }, \ - { K30, K31, K32, K33, K34, K35, K35, K37, K38, K39, K3a, K3b, K3c, K3d, K3e, K3f } \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, K3d, K3e, K3f } \ } #endif diff --git a/layouts/community/ortho_4x12/wanleg/config.h b/layouts/community/ortho_4x12/wanleg/config.h index 0d2cc591e3f8..2444b8b97617 100644 --- a/layouts/community/ortho_4x12/wanleg/config.h +++ b/layouts/community/ortho_4x12/wanleg/config.h @@ -1,7 +1,7 @@ #ifndef CONFIG_USER_H #define CONFIG_USER_H -//QMK DFU settings (ProMicro boards) +//QMK DFU settings (ProMicro boards with QMK bootloader) // set top left key as bootloader mode escape key on Lets Split rev2 #if defined(KEYBOARD_lets_split_rev2) #define QMK_LED B0 @@ -13,10 +13,25 @@ #endif // set top left key as bootloader mode escape key on 4x4 48key layout -#if defined(KEYBOARD_4x4) +#if defined(KEYBOARD_4x4) && !defined(PRO_MICRO) #define QMK_LED B0 #define QMK_ESC_OUTPUT C6 // usually COL #define QMK_ESC_INPUT B2 // usually ROW #endif +// use alternate settings for 4x4 board using ProMicro instead of Micro +// usage: make 4x4:wanleg PM=yes +#if defined(KEYBOARD_4x4) && defined(PRO_MICRO) +#define QMK_ESC_OUTPUT F4 // usually COL +#define QMK_ESC_INPUT D1 // usually ROW +#define QMK_LED B0 + +//need to undefine standard 4x4 array before defining alternate ProMicro array +#undef MATRIX_ROW_PINS +#undef MATRIX_COL_PINS +#define MATRIX_ROW_PINS { D1, D0, D4, C6 } +//last 4 elements of the column array are are not broken out on a ProMicro (included only to preserve array structure) +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, B6, B5, B4, E6, D7, F0, B7, D6, F1 } +#endif + #endif diff --git a/layouts/community/ortho_4x12/wanleg/keymap.c b/layouts/community/ortho_4x12/wanleg/keymap.c index f6030469c03f..6fe8446f6d30 100644 --- a/layouts/community/ortho_4x12/wanleg/keymap.c +++ b/layouts/community/ortho_4x12/wanleg/keymap.c @@ -15,6 +15,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______________Qwerty_Row__2_______________, KC_LCTL, KC_LGUI, KC_LALT, GHERKIN, SUBTER, SH_T(KC_SPC), SH_T(KC_SPC), SUPRA, KC_RGUI, KC_RALT, GHERKIN, KC_RCTL ), + +#elif defined(KEYBOARD_4x4) +[_GK] = LAYOUT_ortho_4x12_wrapper( + _______________GherkinLike_0_______________, + _______________GherkinLike_1_______________, + _______________GherkinLike_2_______________, + TD(RST_TAP_DANCE), KC_LGUI, KC_LALT, NUMPAD, NUMBER, ETCETERA, KC_SPC,DIRECTION, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL +), + +[PAD] = LAYOUT_ortho_4x4_wrapper( + _______________NUMPAD_Row__0_______________, + _______________NUMPAD_Row__1_______________, + _______________NUMPAD_Row__2_______________, + _______________NUMPAD_Row__3_______________ +), + #else [_GK] = LAYOUT_ortho_4x12_wrapper( _______________GherkinLike_0_______________, @@ -64,4 +80,5 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ______________ETCETERA_Row__2______________, ______________ETCETERA_Row__3______________ ), + }; diff --git a/users/wanleg/rules.mk b/users/wanleg/rules.mk index ac86769538e6..56304013153d 100644 --- a/users/wanleg/rules.mk +++ b/users/wanleg/rules.mk @@ -1,8 +1,4 @@ -ifeq ($(strip $(KEYBOARD)), lets_split_rev2) -SRC += ../../keyboards/lets_split/lets_split.c -endif - -SRC += wanleg.c tapdances.c +SRC += wanleg.c tapdances.c TAP_DANCE_ENABLE = yes MOUSEKEY_ENABLE = yes @@ -12,3 +8,9 @@ MOUSEKEY_ENABLE = yes ifeq ($(strip $(dfu)), qmk) BOOTLOADER = qmk-dfu endif + +#use alternate settings for 4x4 board using ProMicro instead of Micro +#usage: make 4x4:wanleg PM=yes +ifeq ($(strip $(PM)), yes) + OPT_DEFS += -DPRO_MICRO +endif diff --git a/users/wanleg/tapdances.c b/users/wanleg/tapdances.c index 6a98b896a5cb..0778bf5f7e8f 100644 --- a/users/wanleg/tapdances.c +++ b/users/wanleg/tapdances.c @@ -36,7 +36,7 @@ int cur_dance (qk_tap_dance_state_t *state) { } ///// QUAD FUNCTION TAP DANCE GENERAL SETUP SECTION END ///// ///// QUAD FUNCTION TAP DANCE PERSONALIZATION SECTION START ///// -//instantialize an instance of 'tap' for the 'ENT' tap dance. +//instantiate 'tap' for the 'ENT' tap dance. static tap ENTtap_state = { .is_press_action = true, .state = 0 @@ -67,7 +67,7 @@ void ENT_reset (qk_tap_dance_state_t *state, void *user_data) { ENTtap_state.state = 0; } -//instanalize an instance of 'tap' for the 'DEL' tap dance. +//instantiate 'tap' for the 'DEL' tap dance. static tap DELtap_state = { .is_press_action = true, .state = 0 @@ -95,7 +95,7 @@ void DEL_reset (qk_tap_dance_state_t *state, void *user_data) { DELtap_state.state = 0; } -//instantialize an instance of 'tap' for the 'CAD' tap dance. +//instantiate 'tap' for the 'CAD' tap dance. static tap CADtap_state = { .is_press_action = true, .state = 0 @@ -107,7 +107,9 @@ void CAD_finished (qk_tap_dance_state_t *state, void *user_data) { case SINGLE_TAP: //register_code(KC_SPC); SEND_STRING(SS_LGUI("l")); + #ifdef BACKLIGHT_ENABLE backlight_set(3); + #endif break; case SINGLE_HOLD: //register_code(KC_NO); @@ -121,7 +123,9 @@ void CAD_finished (qk_tap_dance_state_t *state, void *user_data) { case DOUBLE_TAP: //register_code(KC_ENT); SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_DELETE)))); + #ifdef BACKLIGHT_ENABLE backlight_set(0); + #endif break; //case DOUBLE_HOLD: register_code(KC_NO); break; //register this keycode when button is tapped and then held case DOUBLE_HOLD: @@ -136,7 +140,9 @@ void CAD_reset (qk_tap_dance_state_t *state, void *user_data) { case SINGLE_TAP: //unregister_code(KC_SPC); SEND_STRING(SS_LGUI("l")); + #ifdef BACKLIGHT_ENABLE backlight_set(3); + #endif break; case SINGLE_HOLD: register_code(KC_NO); //(un)register this keycode when button is held and then released @@ -145,13 +151,71 @@ void CAD_reset (qk_tap_dance_state_t *state, void *user_data) { case DOUBLE_TAP: //register_code(KC_ENT); SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_DELETE)))); + #ifdef BACKLIGHT_ENABLE backlight_set(0); + #endif break; case DOUBLE_HOLD: register_code(KC_NO); //(un)register this keycode when button is tapped and then held, and then released case DOUBLE_SINGLE_TAP: unregister_code(KC_NO); } CADtap_state.state = 0; -} +} + +//instantiate 'tap' for the 'RST' tap dance. +static tap RSTtap_state = { + .is_press_action = true, + .state = 0 +}; + +void RST_finished (qk_tap_dance_state_t *state, void *user_data) { + RSTtap_state.state = cur_dance(state); + switch (RSTtap_state.state) { + case SINGLE_TAP: register_code(KC_LCTL); break; + case SINGLE_HOLD: register_code(KC_LCTL); break; + case DOUBLE_TAP: reset_keyboard(); break; + case DOUBLE_HOLD: register_code(KC_NO); break; + case DOUBLE_SINGLE_TAP: register_code(KC_LCTL); unregister_code(KC_LCTL); register_code(KC_LCTL); + } +} + +void RST_reset (qk_tap_dance_state_t *state, void *user_data) { + switch (RSTtap_state.state) { + case SINGLE_TAP: unregister_code(KC_LCTL); break; + case SINGLE_HOLD: unregister_code(KC_LCTL); break; + case DOUBLE_TAP: unregister_code(KC_NO); break; + case DOUBLE_HOLD: unregister_code(KC_NO); + case DOUBLE_SINGLE_TAP: unregister_code(KC_LCTL); + } + RSTtap_state.state = 0; +} + +//instantiate 'tap' for the 'LYR' tap dance. +static tap LYRtap_state = { + .is_press_action = true, + .state = 0 +}; + +void LYR_finished (qk_tap_dance_state_t *state, void *user_data) { + LYRtap_state.state = cur_dance(state); + switch (LYRtap_state.state) { + case SINGLE_TAP: register_code(KC_PSLS); break; + case SINGLE_HOLD: register_code(KC_NO); break; + case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break; + case DOUBLE_HOLD: register_code(KC_NO); break; + case DOUBLE_SINGLE_TAP: register_code(KC_PSLS); unregister_code(KC_PSLS); register_code(KC_PSLS); + } +} + +void LYR_reset (qk_tap_dance_state_t *state, void *user_data) { + switch (LYRtap_state.state) { + case SINGLE_TAP: unregister_code(KC_PSLS); break; + case SINGLE_HOLD: unregister_code(KC_NO); break; + case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break; + case DOUBLE_HOLD: unregister_code(KC_NO); + case DOUBLE_SINGLE_TAP: unregister_code(KC_PSLS); + } + LYRtap_state.state = 0; +} ///// QUAD FUNCTION TAP DANCE PERSONALIZATION SECTION END ///// //Tap Dance Definitions @@ -162,8 +226,11 @@ qk_tap_dance_action_t tap_dance_actions[] = { ,[TD_Q_ESC] = ACTION_TAP_DANCE_DOUBLE(KC_Q, KC_ESC) ,[ENT_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ENT_finished, ENT_reset) ,[DEL_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, DEL_finished, DEL_reset) + ,[RST_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, RST_finished, RST_reset) ,[CAD_TD] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, CAD_finished, CAD_reset) + ,[LYR_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, LYR_finished, LYR_reset) + }; //In Layer declaration, add tap dance item in place of a key code -//TD(TD_SFT_CAPS) \ No newline at end of file +//TD(TD_SFT_CAPS) diff --git a/users/wanleg/wanleg.c b/users/wanleg/wanleg.c index 931546c15305..f22c34ba30fa 100644 --- a/users/wanleg/wanleg.c +++ b/users/wanleg/wanleg.c @@ -41,6 +41,12 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; + case NUMPAD: + if (record->event.pressed) { + set_single_persistent_default_layer(PAD); + } + return false; + break; case SUBTER: if (record->event.pressed) { layer_on(SUB); diff --git a/users/wanleg/wanleg.h b/users/wanleg/wanleg.h index 8b98ec7ddfb6..65028751a9ce 100644 --- a/users/wanleg/wanleg.h +++ b/users/wanleg/wanleg.h @@ -25,7 +25,8 @@ enum userspace_layers { NUM75, DIR75, ETC75, - FN75 + FN75, + PAD, }; #elif KEYBOARD_xd75 enum userspace_layers { @@ -49,29 +50,31 @@ enum userspace_layers { gNUM, gDIR, gETC, + PAD, }; #else enum userspace_layers { _GK = 0, + PAD, _QW, - QW75, - GK75, - gGK, ONE, SUB, SUP, NUM, DIR, ETC, + gGK, gNUM, gDIR, gETC, + QW75, + GK75, SUB75, SUP75, NUM75, DIR75, ETC75, - FN75 + FN75, }; #endif @@ -95,7 +98,8 @@ enum userspace_custom_keycodes { NUMBER75, DIRECTION75, ETCETERA75, - FUNCTION75 + FUNCTION75, + NUMPAD, }; @@ -107,6 +111,8 @@ enum { ,ENT_TAP_DANCE ,DEL_TAP_DANCE ,CAD_TD + ,RST_TAP_DANCE + ,LYR_TAP_DANCE }; #endif @@ -123,6 +129,7 @@ enum { #define LAYOUT_ortho_5x10_wrapper(...) LAYOUT_ortho_5x10(__VA_ARGS__) #define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) #define LAYOUT_ortho_5x15_wrapper(...) LAYOUT_ortho_5x15(__VA_ARGS__) +#define LAYOUT_ortho_4x4_wrapper(...) LAYOUT_ortho_4x4(__VA_ARGS__) // Blocks for each of the major keyboard layouts // Organized so we can quickly adapt and modify all of them @@ -141,7 +148,7 @@ enum { * | A | S | D | F | G | H | J | K | L | SPACE | * | | | | | | | | | |SFThold | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | Z | X | C | V/gNUM | B/gETC | N | M/gDIR | ,/GUI | ./ALT | BKSC | + * | Z | X | C | V/gNUM | B/gETC | N | M/gDIR | ,/GUI | ./ALT | BSPC | * | SFThold| | | | | | | | |CTRLhold| * '-----------------------------------------------------------------------------------------' */ @@ -168,7 +175,7 @@ enum { * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | F11 | F12 | | | | ENTER | SHIFT | GUI | ./ALT | BKSC | + * | F11 | F12 | | | | ENTER | SHIFT | GUI | ./ALT | BSPC | * | | | | | | | | | |CTRLhold| * '-----------------------------------------------------------------------------------------' */ @@ -191,12 +198,12 @@ enum { /* Gherkin-Like * .-----------------------------------------------------------------------------------------------------------. - * | ESC | Q//ESC | W | E | R | T | Y | U | I | O | P | BACKSP | + * | ESC | Q//ESC | W | E | R | T | Y | U | I | O | P | BSPC | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | TAB | A | S | D | F | G | H | J | K | L | SPACE | ' | * | | | | | | | | | | |SFThold | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * |SFT/CAPS| Z | X | C | V/NUM | B/ETC | N | M/DIR | ,/GUI | ./ALT | BKSC | ENT/SFT| + * |SFT/CAPS| Z | X | C | V/NUM | B/ETC | N | M/DIR | ,/GUI | ./ALT | BSPC | ENT/SFT| * | |SFThold | | | | | | | | |CTRLhold| | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | LCTRL | LGUI | ALT | ONEHAND| NUM | ETC | SPACE | DIR | RGUI | ALT | DEL | CTRL | @@ -210,7 +217,7 @@ enum { /* Qwerty * .-------------------------------------------------------------------------------------. - * | Esc | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * | Esc | Q | W | E | R | T | Y | U | I | O | P | BSPC | * |-------+------+------+------+------+-------------+------+------+------+------+-------| * | Tab | A | S | D | F | G | H | J | K | L | ; | ' | * |-------+------+------+------+------+------|------+------+------+------+------+-------| @@ -246,7 +253,7 @@ enum { * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | | F11 | F12 | | | | | | RGUI | ./ALT | BKSC | | + * | | F11 | F12 | | | | | | RGUI | ./ALT | BSPC | | * | | | | | | | | | | |CTRLhold| | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | | | gherkin| | | | ENTER | SHIFT | | | | | @@ -259,11 +266,11 @@ enum { /* Gherkin Numbers * .-----------------------------------------------------------------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | BACKSP | + * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | BSPC | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | | F11 | F12 | | | | ENTER | SHIFT | RGUI | ./ALT | BKSC | | + * | | F11 | F12 | | | | ENTER | SHIFT | RGUI | ./ALT | BSPC | | * | | | | | | | | | | |CTRLhold| | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | | | | | | | ENTER | SHIFT | RGUI | | | | @@ -307,4 +314,20 @@ enum { #define ______________ETCETERA_Row__2______________ _______, _______________Gherkin_ETC_2_______________, _______ #define ______________ETCETERA_Row__3______________ _______, _______, _______, _______, _______, _______, LALT(LCTL(KC_DEL)), _______, _______, _______, _______, _______ +/* Single 4x4 board only + * .-----------------------------------. + * | 7 | 8 | 9 | BSPC | + * |--------+--------+--------+--------| + * | 4 | 5 | 6 | SPACE | + * |--------+--------+--------+--------| + * | 1 | 2 | 3 | ENTER | + * |--------+--------+--------+--------| + * | 0 |/ //_GK | . | - | + * '-----------------------------------' + */ + +#define _______________NUMPAD_Row__0_______________ KC_KP_7, KC_KP_8, KC_KP_9, KC_BSPC +#define _______________NUMPAD_Row__1_______________ KC_KP_4, KC_KP_5, KC_KP_6, KC_SPC +#define _______________NUMPAD_Row__2_______________ KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT +#define _______________NUMPAD_Row__3_______________ KC_KP_0, TD(LYR_TAP_DANCE), KC_KP_DOT, KC_PMNS #endif // !USERSPACE From 627ee050b491cc9d6ab57f90ac0f0779f6be47c9 Mon Sep 17 00:00:00 2001 From: holtenc Date: Tue, 25 Sep 2018 17:48:01 -0500 Subject: [PATCH 042/505] Keyboard: Remove BACKLIGHT BREATHING as default config for Prime Keyboards (#3979) * initial commit * Update readme.md * Update keymap.c added comment for description of function to control LED as layer indicator * corrected formatting as requested. * format for configurator * corrected info.json to propertly reflect layout in Configurator * updated layouts to reflect physical keyboard * comment out BACKLIGHT BREATHING in config.h --- keyboards/primekb/prime_l/config.h | 2 +- keyboards/primekb/prime_m/config.h | 2 +- keyboards/primekb/prime_o/config.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboards/primekb/prime_l/config.h b/keyboards/primekb/prime_l/config.h index 46dd3604e48a..8e2457816667 100644 --- a/keyboards/primekb/prime_l/config.h +++ b/keyboards/primekb/prime_l/config.h @@ -40,7 +40,7 @@ along with this program. If not, see . #define DIODE_DIRECTION COL2ROW #define BACKLIGHT_PIN B6 -#define BACKLIGHT_BREATHING +/*#define BACKLIGHT_BREATHING*/ #define BACKLIGHT_LEVELS 4 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ diff --git a/keyboards/primekb/prime_m/config.h b/keyboards/primekb/prime_m/config.h index 82a8037c99fb..366504375e5a 100644 --- a/keyboards/primekb/prime_m/config.h +++ b/keyboards/primekb/prime_m/config.h @@ -40,7 +40,7 @@ along with this program. If not, see . #define DIODE_DIRECTION COL2ROW #define BACKLIGHT_PIN B7 -#define BACKLIGHT_BREATHING +/*#define BACKLIGHT_BREATHING*/ #define BACKLIGHT_LEVELS 4 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ diff --git a/keyboards/primekb/prime_o/config.h b/keyboards/primekb/prime_o/config.h index 9f634474cf15..eb897ef8fa3d 100644 --- a/keyboards/primekb/prime_o/config.h +++ b/keyboards/primekb/prime_o/config.h @@ -40,7 +40,7 @@ along with this program. If not, see . #define DIODE_DIRECTION COL2ROW #define BACKLIGHT_PIN B7 -#define BACKLIGHT_BREATHING +/*#define BACKLIGHT_BREATHING*/ #define BACKLIGHT_LEVELS 4 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ From 4d5705ea6ceeb11cd2adc018644ec87c51af4e86 Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Mon, 3 Sep 2018 08:26:53 +0100 Subject: [PATCH 043/505] Add new RGB matrix effect digital rain aka The Matrix --- quantum/rgb_matrix.c | 66 ++++++++++++++++++++++++++++++++++++++++++++ quantum/rgb_matrix.h | 1 + 2 files changed, 67 insertions(+) diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index 197bc1ac5e05..8ad00c37dd6b 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -510,6 +510,69 @@ void rgb_matrix_jellybean_raindrops( bool initialize ) { } } +void rgb_matrix_digital_rain( const bool initialize ) { + // algorithm ported from https://github.com/tremby/Kaleidoscope-LEDEffect-DigitalRain + const uint8_t drop_ticks = 28; + const uint8_t new_drop_probability = 24; + const uint8_t pure_green_intensity = 0xd0; + const uint8_t max_brightness_boost = 0xc0; + const uint8_t max_intensity = 0xff; + + static uint8_t map[MATRIX_COLS][MATRIX_ROWS] = {{0}}; + static uint8_t drop = 0; + + if (initialize) { + rgb_matrix_set_color_all(0, 0, 0); + memset(map, 0, sizeof map); + drop = 0; + } + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + if (row == 0 && drop == 0 && rand() < RAND_MAX / new_drop_probability) { + // top row, pixels have just fallen and we're + // making a new rain drop in this column + map[col][row] = max_intensity; + } + else if (map[col][row] > 0 && map[col][row] < max_intensity) { + // neither fully bright nor dark, decay it + map[col][row]--; + } + // set the pixel colour + uint8_t led, led_count; + map_row_column_to_led(row, col, &led, &led_count); + + if (map[col][row] > pure_green_intensity) { + const uint8_t boost = (uint8_t) ((uint16_t) max_brightness_boost + * (map[col][row] - pure_green_intensity) / (max_intensity - pure_green_intensity)); + rgb_matrix_set_color(led, boost, max_intensity, boost); + } + else { + const uint8_t green = (uint8_t) ((uint16_t) max_intensity * map[col][row] / pure_green_intensity); + rgb_matrix_set_color(led, 0, green, 0); + } + } + } + if (++drop > drop_ticks) { + // reset drop timer + drop = 0; + for (uint8_t row = MATRIX_ROWS - 1; row > 0; row--) { + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + // if ths is on the bottom row and bright allow decay + if (row == MATRIX_ROWS - 1 && map[col][row] == max_intensity) { + map[col][row]--; + } + // check if the pixel above is bright + if (map[col][row - 1] == max_intensity) { + // allow old bright pixel to decay + map[col][row - 1]--; + // make this pixel bright + map[col][row] = max_intensity; + } + } + } + } +} + void rgb_matrix_multisplash(void) { // if (g_any_key_hit < 0xFF) { HSV hsv = { .h = rgb_matrix_config.hue, .s = rgb_matrix_config.sat, .v = rgb_matrix_config.val }; @@ -685,6 +748,9 @@ void rgb_matrix_task(void) { case RGB_MATRIX_JELLYBEAN_RAINDROPS: rgb_matrix_jellybean_raindrops( initialize ); break; + case RGB_MATRIX_DIGITAL_RAIN: + rgb_matrix_digital_rain( initialize ); + break; #ifdef RGB_MATRIX_KEYPRESSES case RGB_MATRIX_SOLID_REACTIVE: rgb_matrix_solid_reactive(); diff --git a/quantum/rgb_matrix.h b/quantum/rgb_matrix.h index b91c9fba598c..046d98790f83 100644 --- a/quantum/rgb_matrix.h +++ b/quantum/rgb_matrix.h @@ -81,6 +81,7 @@ enum rgb_matrix_effects { RGB_MATRIX_RAINBOW_PINWHEELS, RGB_MATRIX_RAINBOW_MOVING_CHEVRON, RGB_MATRIX_JELLYBEAN_RAINDROPS, + RGB_MATRIX_DIGITAL_RAIN, #ifdef RGB_MATRIX_KEYPRESSES RGB_MATRIX_SOLID_REACTIVE, RGB_MATRIX_SPLASH, From 7f1268f35edb24d57f424a1936265ced78eb3daa Mon Sep 17 00:00:00 2001 From: Savio Fernandes Date: Thu, 27 Sep 2018 02:03:42 +0800 Subject: [PATCH 044/505] Keymap: add artbycrunk iris layout (#3964) * version 1 * version 1.1 * version 1.2 --- keyboards/iris/keymaps/saviof/config.h | 39 +++++++++ keyboards/iris/keymaps/saviof/keymap.c | 107 +++++++++++++++++++++++++ keyboards/iris/keymaps/saviof/rules.mk | 3 + 3 files changed, 149 insertions(+) create mode 100644 keyboards/iris/keymaps/saviof/config.h create mode 100644 keyboards/iris/keymaps/saviof/keymap.c create mode 100644 keyboards/iris/keymaps/saviof/rules.mk diff --git a/keyboards/iris/keymaps/saviof/config.h b/keyboards/iris/keymaps/saviof/config.h new file mode 100644 index 000000000000..eb4c7328ebab --- /dev/null +++ b/keyboards/iris/keymaps/saviof/config.h @@ -0,0 +1,39 @@ +/* +Copyright 2018 Savio Fernandes + +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 + +/* Use I2C or Serial, not both */ + +//#define USE_SERIAL +#define USE_I2C + +/* Select hand configuration */ + +//#define MASTER_LEFT +#define MASTER_RIGHT +// #define BACKLIGHT_BREATHING +// #define EE_HANDS + +#define TAPPING_TERM 200 + +// #undef RGBLED_NUM +// #define RGBLIGHT_ANIMATIONS +// #define RGBLED_NUM 30 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/iris/keymaps/saviof/keymap.c b/keyboards/iris/keymaps/saviof/keymap.c new file mode 100644 index 000000000000..a63e606821dc --- /dev/null +++ b/keyboards/iris/keymaps/saviof/keymap.c @@ -0,0 +1,107 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJ 3 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJ, +}; + +//Tap Dance Declarations +enum { + TD_SPC_ENT = 0 +}; + +//Tap Dance Definitions +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_SPC_ENT] = ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT) +}; + +#define KC_ KC_TRNS + +#define KC_LOWR LT(_LOWER, KC_LEFT) //LOWER +#define KC_RASE LT(_RAISE, KC_RIGHT) //RAISE +#define KC_ADJT LT(_ADJ, KC_LGUI) //RAISE +#define KC_SCET TD(TD_SPC_ENT) +#define KC_RST RESET +#define KC_BL_S BL_STEP +#define KC_DBUG DEBUG +#define KC_RTOG RGB_TOG +#define KC_RMOD RGB_MOD +#define KC_LMOD RGB_RMOD +#define KC_RHUI RGB_HUI +#define KC_RHUD RGB_HUD +#define KC_RSAI RGB_SAI +#define KC_RSAD RGB_SAD +#define KC_RVAI RGB_VAI +#define KC_RVAD RGB_VAD +#define KC_BTOG BL_TOGG +#define KC_BLVL BL_STEP +#define KC_BRTG BL_BRTG + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT_kc( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + TAB , Q , W , E , R , T , Y , U , I , O , P ,DEL , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, A , S , D , F , G , H , J , K , L ,SCLN,QUOT, + //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| + LCTL, Z , X , C , V , B ,HOME, END , N , M ,COMM,DOT ,SLSH,RSFT, + //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' + ADJT,LOWR, SPC, SCET,RASE, ENT + // `----+----+----' `----+----+----' + ), + + [_LOWER] = LAYOUT_kc( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + TILD,EXLM, AT ,HASH, DLR,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,BSPC, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + RST , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + DEL , ,LEFT,RGHT, UP ,LBRC, RBRC, P4 , P5 , P6 ,PLUS,PIPE, + //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| + BL_S, , , ,DOWN,LCBR,LPRN, RPRN,RCBR, P1 , P2 , P3 ,MINS, , + //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' + , ,DEL , DEL , , P0 + // `----+----+----' `----+----+----' + ), + + [_RAISE] = LAYOUT_kc( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + F12 , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 ,F11 , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN, , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ,MPRV,MNXT,VOLU,PGUP,UNDS, EQL ,HOME, , , ,BSLS, + //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| + MUTE,MSTP,MPLY,VOLD,PGDN,MINS, , ,PLUS,END , , , , , + //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' + , , , , , + // `----+----+----' `----+----+----' + ), + + [_ADJ] = LAYOUT_kc( + //,----+----+----+----+----+----. ,----+----+----+----+----+----. + ,LMOD, , , , , , , , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + RTOG,RMOD,RHUI,RSAI,RVAI, , BTOG,BLVL,BRTG, , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ,DBUG,RHUD,RSAD,RVAD, , , , , , , , + //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| + BL_S,RST , , , , , , , , , , , , , + //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' + , , , , , + // `----+----+----' `----+----+----' + ) + +}; diff --git a/keyboards/iris/keymaps/saviof/rules.mk b/keyboards/iris/keymaps/saviof/rules.mk new file mode 100644 index 000000000000..0e1023be1ae2 --- /dev/null +++ b/keyboards/iris/keymaps/saviof/rules.mk @@ -0,0 +1,3 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes +TAP_DANCE_ENABLE=yes From f3551747b3cd071bc242fd646f32567fb89f5356 Mon Sep 17 00:00:00 2001 From: KOBAYASHI Daisuke Date: Thu, 27 Sep 2018 03:04:31 +0900 Subject: [PATCH 045/505] Keymap: Add Koba's keymap for Ergo42. (#3965) * Keymap: Add Koba's keymap for Ergo42. * Fix: Remove unnecessary #define. * Fix: Rename readme files to lowercase. --- keyboards/ergo42/keymaps/koba/config.h | 33 ++++++ keyboards/ergo42/keymaps/koba/keymap.c | 128 +++++++++++++++++++++ keyboards/ergo42/keymaps/koba/readme.md | 57 +++++++++ keyboards/ergo42/keymaps/koba/readme_ja.md | 62 ++++++++++ 4 files changed, 280 insertions(+) create mode 100644 keyboards/ergo42/keymaps/koba/config.h create mode 100644 keyboards/ergo42/keymaps/koba/keymap.c create mode 100644 keyboards/ergo42/keymaps/koba/readme.md create mode 100644 keyboards/ergo42/keymaps/koba/readme_ja.md diff --git a/keyboards/ergo42/keymaps/koba/config.h b/keyboards/ergo42/keymaps/koba/config.h new file mode 100644 index 000000000000..360d6a562172 --- /dev/null +++ b/keyboards/ergo42/keymaps/koba/config.h @@ -0,0 +1,33 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + diff --git a/keyboards/ergo42/keymaps/koba/keymap.c b/keyboards/ergo42/keymaps/koba/keymap.c new file mode 100644 index 000000000000..f05f78b9e7c6 --- /dev/null +++ b/keyboards/ergo42/keymaps/koba/keymap.c @@ -0,0 +1,128 @@ +/* Copyright 2018 Daisuke Kobayashi + * + * 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 QMK_KEYBOARD_H +#include "keymap_jp.h" + +enum { + _WIN, + _MACOS, + _LOWER, + _RAISE, + _FUNC +}; + +#define KC_KNA KC_LANG1 +#define KC_EISU KC_LANG2 +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) +#define FN MO(_FUNC) +#define WIN DF(_WIN) +#define MACOS DF(_MACOS) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* WIN + * ,------------------------------------------------. ,------------------------------------------------. + * | Esc | Tab | Q | W | E | R | T | | Y | U | I | O | P | @ ` | Bksp | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | Del | Ctrl | A | S | D | F | G | | H | J | K | L | ; + | ; * |Enter | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | H/Z |Shift | Z | X | C | V | B | | N | M | , < | . > | / ? | Up |Shift | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Fn | Ctrl | Win | Alt | Mhen |LOWER |Space | |Space |RAISE | Henk | Menu | Left | Down |Right | + * `------------------------------------------------' `------------------------------------------------' + */ + [_WIN] = LAYOUT( \ + KC_ESC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JP_AT, KC_BSPC, \ + KC_DELT, KC_RCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, JP_COLN, KC_ENT, \ + KC_ZKHK, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, \ + FN, KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, LOWER, KC_SPC, KC_SPC, RAISE, KC_HENK, KC_APP, KC_LEFT, KC_DOWN, KC_RGHT \ + ), + + /* MACOS + * ,------------------------------------------------. ,------------------------------------------------. + * | Esc | Tab | Q | W | E | R | T | | Y | U | I | O | P | @ ` | Bksp | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | Del | Ctrl | A | S | D | F | G | | H | J | K | L | ; + | ; * |Enter | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | Caps |Shift | Z | X | C | V | B | | N | M | , < | . > | / ? | Up |Shift | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | Fn | Ctrl | Opt | Cmd | Eisu |LOWER |Space | |Space |RAISE | Kana | Cmd | Left | Down |Right | + * `------------------------------------------------' `------------------------------------------------' + */ + [_MACOS] = LAYOUT( \ + KC_ESC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JP_AT, KC_BSPC, \ + KC_DELT, KC_RCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, JP_COLN, KC_ENT, \ + KC_CAPS, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, \ + FN, KC_LCTL, KC_LALT, KC_LGUI, KC_EISU, LOWER, KC_SPC, KC_SPC, RAISE, KC_KNA, KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT \ + ), + + /* LOWER + * ,------------------------------------------------. ,------------------------------------------------. + * | | | ! | " | # | $ | % | | & | ' | ( | ) | | = | | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | | | XXXX | XXXX | XXXX | { | ( | | ) | } | XXXX | ~ | | | _ | | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | | | XXXX | XXXX | XXXX | XXXX | XXXX | | XXXX | XXXX | XXXX | XXXX | XXXX | PgUp | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | Home | PgDn | End | + * `------------------------------------------------' `------------------------------------------------' + */ + [_LOWER] = LAYOUT( \ + _______, _______, S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), JP_EQL, _______, \ + _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, JP_LCBR, JP_LPRN, JP_RPRN, JP_RCBR, XXXXXXX, JP_TILD, JP_PIPE, JP_UNDS, _______, \ + _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGUP, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END \ + ), + + /* RAISE + * ,------------------------------------------------. ,------------------------------------------------. + * | | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | | | F11 | F12 | XXXX | [ | ( | | ) | ] | XXXX | ^ | \ | \ | | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | | | + * `------------------------------------------------' `------------------------------------------------' + */ + [_RAISE] = LAYOUT( \ + _______, _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, _______, \ + _______, _______, KC_F11, KC_F12, XXXXXXX, JP_LBRC, JP_LPRN, JP_RPRN, JP_RBRC, XXXXXXX, JP_CIRC, KC_JYEN, KC_RO, _______, \ + _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + + /* FUNC + * ,------------------------------------------------. ,------------------------------------------------. + * |Reset | | XXXX | XXXX | XXXX | XXXX | XXXX | |PrtSc |SLock |Pause | XXXX | XXXX | XXXX | | + * |------+------+------+------+------+------+------| |-------------+------+------+------+------+------| + * | | | XXXX | XXXX | XXXX | XXXX | >Win | | Ins | XXXX | XXXX | XXXX | XXXX | XXXX | | + * |------+------+------+------+------+------+------| |------|------+------+------+------+------+------| + * | | | XXXX | XXXX | XXXX | XXXX | >Mac | | XXXX | XXXX | XXXX | XXXX | XXXX | Vol+ | | + * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| + * | | | | | | | | | | | | | | Vol- | Play | + * `------------------------------------------------' `------------------------------------------------' + */ + [_FUNC] = LAYOUT( \ + RESET, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PSCR, KC_SLCK, KC_PAUS, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ + _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, WIN, KC_INS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ + _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MACOS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLU, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, KC_VOLD, KC_MPLY \ + ) +}; + diff --git a/keyboards/ergo42/keymaps/koba/readme.md b/keyboards/ergo42/keymaps/koba/readme.md new file mode 100644 index 000000000000..1fe0543902f4 --- /dev/null +++ b/keyboards/ergo42/keymaps/koba/readme.md @@ -0,0 +1,57 @@ +# Keymap for Ergo42 + +## About + +This keymap is for Ergo42. + +- JIS layout. +- Independent Windows layout/MacOS layout layers. +- Bottom row keys arranged like a standard keyboard. +- Arrow keys are designed in the inverted-T. + +## Layout + +![keyboard-layout](https://user-images.githubusercontent.com/1042121/45888288-aa35ed00-bdf8-11e8-8741-71fe9a0fadc6.png) + +## Windows mode/MacOS mode + +|mode |key | +|------------|------------| +|Windows mode|Function + g| +|MacOS mode |Function + b| + +When switching mode, the following keys switches. + +|Windows |MacOS | +|---------------|------------| +|Alt |Command(GUI)| +|Windows(GUI) |Option(Alt) | +|Menu(App) |Command(GUI)| +|Muhenkan |Eisu | +|Henkan |Kana | +|Hankaku/Zenkaku|Caps | + +## Layers + +|No.|Name |Description | +|---|--------|---------------------------| +| 4 |Function|Mode switch, Media | +| 3 |Raise |Number, Function | +| 2 |Lower |Symbol, Home/End, PgUp/PgDn| +| 1 |MacOS |MacOS layout | +| 0 |Windows |Windows layout | + +When power is turn on, No.0 Windows layer becomes enabled. + +## Windows/MacOS layers + +Standard layers for Windows mode/MacOS mode. + +## Raise/Lower layers + +Layer enabled during pressing Raise or Lower key. + +## Function layer + +Layer enabled during pressing Function key. + diff --git a/keyboards/ergo42/keymaps/koba/readme_ja.md b/keyboards/ergo42/keymaps/koba/readme_ja.md new file mode 100644 index 000000000000..e1dbda821f02 --- /dev/null +++ b/keyboards/ergo42/keymaps/koba/readme_ja.md @@ -0,0 +1,62 @@ +# Keymap for Ergo42 + +## 概要 + +Ergo42 用キーマップです。 + +- JIS 配列 +- 独立した Windows 配列/MacOS 配列レイヤー +- 普通のキーボード配列に似せた最下段キー +- 逆 T 字 (凸型) 配列の矢印キー + +## レイアウト + +![keyboard-layout](https://user-images.githubusercontent.com/1042121/45888288-aa35ed00-bdf8-11e8-8741-71fe9a0fadc6.png) + +## Windows モード/MacOS モード + +|モード |キー | +|--------------|------------| +|Windows モード|Function + g| +|MacOS モード |Function + b| + +モードを切り替えることで下記のキーが切り替わります。 + +|Windows |MacOS | +|------------|------------| +|Alt |Command(GUI)| +|Windows(GUI)|Option(Alt) | +|Menu(App) |Command(GUI)| +|無変換 |英数 | +|変換 |かな | +|半角/全角 |Caps | + +## レイヤー + +|No.|名称 |内容 | +|---|--------|--------------------------| +| 4 |Function|モード切替, メディア | +| 3 |Raise |数字, ファンクションキー | +| 2 |Lower |記号, Home/End, PgUp/PgDn | +| 1 |MacOS |MacOS 配列 | +| 0 |Windows |Windows 配列 | + +電源 ON により No.0 の Windows レイヤーが有効になります。 + +## Windows/MacOS レイヤー + +Windows モード/MacOS モードの標準レイヤー。 + +## Raise/Lower レイヤー + +Raise キーまたは Lower キーを押している間だけ有効になるレイヤー。 + +普通のキーボードの最上段キー (数字/記号) に加えて、標準レイヤーに入らなかった記号キーが3つ (`[{`, `]}`, `\_`) 入っています。 +括弧キー `[{`, `]}` は `(`, `)` を加えて、左右対称に配置しました。 + +## Function レイヤー + +Function キーを押している間だけ有効になるレイヤー。 + +Windows モード/MacOS モードの切り替え、メディア系の操作、標準レイヤーに入らなかった機能キーのレイヤーです。 + From 722f06ff8c7c77843cc5be14d9fdb7d68a16ebf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Wed, 26 Sep 2018 20:08:56 +0200 Subject: [PATCH 046/505] Keymap: Update whitefox/konstantin keymap (#3980) * Rename constexpr keymap folder to konstantin * Replace numpad comma with Unicode comma * Rename tap dance constants * Move record->event.pressed check into switch * Use RShift as a dedicated Fn key --- .../{constexpr => konstantin}/config.h | 4 +- .../{constexpr => konstantin}/keymap.c | 50 ++++++++++--------- .../{constexpr => konstantin}/rules.mk | 0 3 files changed, 29 insertions(+), 25 deletions(-) rename keyboards/whitefox/keymaps/{constexpr => konstantin}/config.h (100%) rename keyboards/whitefox/keymaps/{constexpr => konstantin}/keymap.c (80%) rename keyboards/whitefox/keymaps/{constexpr => konstantin}/rules.mk (100%) diff --git a/keyboards/whitefox/keymaps/constexpr/config.h b/keyboards/whitefox/keymaps/konstantin/config.h similarity index 100% rename from keyboards/whitefox/keymaps/constexpr/config.h rename to keyboards/whitefox/keymaps/konstantin/config.h index b4bc05acf57b..ad40105a7c97 100644 --- a/keyboards/whitefox/keymaps/constexpr/config.h +++ b/keyboards/whitefox/keymaps/konstantin/config.h @@ -2,9 +2,9 @@ #define FORCE_NKRO -#define TAPPING_TOGGLE 2 -#define TAPPING_TERM 200 #define PERMISSIVE_HOLD +#define TAPPING_TERM 200 +#define TAPPING_TOGGLE 2 #define MOUSEKEY_DELAY 50 #define MOUSEKEY_INTERVAL 15 diff --git a/keyboards/whitefox/keymaps/constexpr/keymap.c b/keyboards/whitefox/keymaps/konstantin/keymap.c similarity index 80% rename from keyboards/whitefox/keymaps/constexpr/keymap.c rename to keyboards/whitefox/keymaps/konstantin/keymap.c index b19f1c81faed..6998798e3c72 100644 --- a/keyboards/whitefox/keymaps/constexpr/keymap.c +++ b/keyboards/whitefox/keymaps/konstantin/keymap.c @@ -1,12 +1,14 @@ #include QMK_KEYBOARD_H +#define FN MO(L_FN) #define FN_CAPS LT(L_FN, KC_CAPS) -#define FN_CTRL TD(TD_FN_CTRL) -#define RL_ALT TD(TD_RL_ALT) // Unused +#define FN_RCTL TD(TD_FN_RCTL) // Unused +#define RLALT TD(TD_RLALT) // Unused #define TOP LCTL(KC_HOME) #define BOTTOM LCTL(KC_END) +#define UC_COMM UC(0x002C) #define UC_LPRN UC(0x0028) #define UC_RPRN UC(0x0029) #define UC_EQLS UC(0x003D) @@ -32,19 +34,21 @@ enum custom_keycodes { bool process_record_user(uint16_t keycode, keyrecord_t *record) { - if (!record->event.pressed) { return true; } - switch (keycode) { case CLEAR: - SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); + if (record->event.pressed) { + SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); + } return false; case NUMPAD: - layer_invert(L_NUMPAD); - bool num_lock = host_keyboard_leds() & 1<event.pressed) { + layer_invert(L_NUMPAD); + bool num_lock = host_keyboard_leds() & 1< Date: Thu, 27 Sep 2018 03:13:19 +0900 Subject: [PATCH 047/505] Keyboard: Crkbd stands for Corne Keyboard, not helidox (#3985) --- keyboards/crkbd/info.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/crkbd/info.json b/keyboards/crkbd/info.json index d74bb49430e6..45a0255c1ac8 100644 --- a/keyboards/crkbd/info.json +++ b/keyboards/crkbd/info.json @@ -1,5 +1,5 @@ { - "keyboard_name": "crkbd (helidox) rev. 1", + "keyboard_name": "crkbd rev. 1", "url": "", "maintainer": "qmk", "width": 15, From dbdbbbd5c9b1458f682eec661d0a17f91dccb4dc Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Wed, 26 Sep 2018 12:17:54 -0700 Subject: [PATCH 048/505] Keyboard: Refactor XMMX keyboard to XMMX and Toad (#3955) * pull out toad keyboard and get it compiling * refactor xmmx * use the correct LAYOUT macros * move LED code out to toad.c file * move LED code out to xmmx.c file * adjust for correct number of columns and pins used * remove led set user --- keyboards/toad/config.h | 54 +++++++++++ .../keymaps/ansi_wk}/keymap.c | 19 +--- .../keymaps/ansi_wkl}/keymap.c | 21 +--- .../toad => toad/keymaps/default}/keymap.c | 21 +--- .../keymaps/iso_wk}/keymap.c | 21 +--- .../keymaps/iso_wkl}/keymap.c | 21 +--- keyboards/toad/readme.md | 14 +++ keyboards/toad/rules.mk | 56 +++++++++++ keyboards/toad/toad.c | 18 ++++ keyboards/toad/toad.h | 91 ++++++++++++++++++ .../{xmmx_ansi_wk => ansi_wk}/keymap.c | 21 +--- .../{xmmx_ansi_wkl => ansi_wkl}/keymap.c | 21 +--- keyboards/xmmx/keymaps/default/keymap.c | 21 +--- .../keymaps/{xmmx_iso_wk => iso_wk}/keymap.c | 21 +--- .../{xmmx_iso_wkl => iso_wkl}/keymap.c | 21 +--- keyboards/xmmx/readme.md | 8 +- keyboards/xmmx/xmmx.c | 17 ++++ keyboards/xmmx/xmmx.h | 96 +------------------ 18 files changed, 276 insertions(+), 286 deletions(-) create mode 100644 keyboards/toad/config.h rename keyboards/{xmmx/keymaps/toad_ansi_wk => toad/keymaps/ansi_wk}/keymap.c (68%) rename keyboards/{xmmx/keymaps/toad_ansi_wkl => toad/keymaps/ansi_wkl}/keymap.c (67%) rename keyboards/{xmmx/keymaps/toad => toad/keymaps/default}/keymap.c (69%) rename keyboards/{xmmx/keymaps/toad_iso_wk => toad/keymaps/iso_wk}/keymap.c (68%) rename keyboards/{xmmx/keymaps/toad_iso_wkl => toad/keymaps/iso_wkl}/keymap.c (67%) create mode 100644 keyboards/toad/readme.md create mode 100644 keyboards/toad/rules.mk create mode 100644 keyboards/toad/toad.c create mode 100644 keyboards/toad/toad.h rename keyboards/xmmx/keymaps/{xmmx_ansi_wk => ansi_wk}/keymap.c (73%) rename keyboards/xmmx/keymaps/{xmmx_ansi_wkl => ansi_wkl}/keymap.c (73%) rename keyboards/xmmx/keymaps/{xmmx_iso_wk => iso_wk}/keymap.c (73%) rename keyboards/xmmx/keymaps/{xmmx_iso_wkl => iso_wkl}/keymap.c (73%) diff --git a/keyboards/toad/config.h b/keyboards/toad/config.h new file mode 100644 index 000000000000..f1d32c15b6f4 --- /dev/null +++ b/keyboards/toad/config.h @@ -0,0 +1,54 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6776 +#define DEVICE_VER 0x0001 +#define MANUFACTURER farmakon +#define PRODUCT "TOAD" +#define DESCRIPTION "TOAD" + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 14 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { B0, F6, F5, F4, F1, F0 } +#define MATRIX_COL_PINS { B3, B2, B1, E6, B7, C7, C6, D4, D6, D7, B4, D0, D1, F7 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* number of backlight levels */ + +#ifdef BACKLIGHT_PIN +#define BACKLIGHT_LEVELS 0 +#endif + +/* 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)) \ +) + +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 0 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif + +#endif diff --git a/keyboards/xmmx/keymaps/toad_ansi_wk/keymap.c b/keyboards/toad/keymaps/ansi_wk/keymap.c similarity index 68% rename from keyboards/xmmx/keymaps/toad_ansi_wk/keymap.c rename to keyboards/toad/keymaps/ansi_wk/keymap.c index 5e61dfffbbd8..a4fd348f0ee3 100644 --- a/keyboards/xmmx/keymaps/toad_ansi_wk/keymap.c +++ b/keyboards/toad/keymaps/ansi_wk/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - TOAD_KEYMAP_ANSI_WK( + LAYOUT_ansi_wk( 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_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_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, \ @@ -12,19 +12,4 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ) }; -void led_set_user(uint8_t usb_led) { - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/keymaps/toad_ansi_wkl/keymap.c b/keyboards/toad/keymaps/ansi_wkl/keymap.c similarity index 67% rename from keyboards/xmmx/keymaps/toad_ansi_wkl/keymap.c rename to keyboards/toad/keymaps/ansi_wkl/keymap.c index 7778b06521be..7fb6b3b5993c 100644 --- a/keyboards/xmmx/keymaps/toad_ansi_wkl/keymap.c +++ b/keyboards/toad/keymaps/ansi_wkl/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - TOAD_KEYMAP_ANSI_WKL( + LAYOUT_ansi_wkl( 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_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_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, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/keymaps/toad/keymap.c b/keyboards/toad/keymaps/default/keymap.c similarity index 69% rename from keyboards/xmmx/keymaps/toad/keymap.c rename to keyboards/toad/keymaps/default/keymap.c index c13dc8f67121..4c30bdc44223 100644 --- a/keyboards/xmmx/keymaps/toad/keymap.c +++ b/keyboards/toad/keymaps/default/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - TOAD_KEYMAP( + LAYOUT_all( 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_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_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, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/keymaps/toad_iso_wk/keymap.c b/keyboards/toad/keymaps/iso_wk/keymap.c similarity index 68% rename from keyboards/xmmx/keymaps/toad_iso_wk/keymap.c rename to keyboards/toad/keymaps/iso_wk/keymap.c index c51ff862a0b4..2025504321f1 100644 --- a/keyboards/xmmx/keymaps/toad_iso_wk/keymap.c +++ b/keyboards/toad/keymaps/iso_wk/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - TOAD_KEYMAP_ISO_WK( + LAYOUT_iso_wk( 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_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_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, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/keymaps/toad_iso_wkl/keymap.c b/keyboards/toad/keymaps/iso_wkl/keymap.c similarity index 67% rename from keyboards/xmmx/keymaps/toad_iso_wkl/keymap.c rename to keyboards/toad/keymaps/iso_wkl/keymap.c index efcebc713bf4..1659d7b384e5 100644 --- a/keyboards/xmmx/keymaps/toad_iso_wkl/keymap.c +++ b/keyboards/toad/keymaps/iso_wkl/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - TOAD_KEYMAP_ISO_WKL( + LAYOUT_iso_wkl( 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_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_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, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/toad/readme.md b/keyboards/toad/readme.md new file mode 100644 index 000000000000..3f3bff5b5b31 --- /dev/null +++ b/keyboards/toad/readme.md @@ -0,0 +1,14 @@ +# Toad + +Toad: 70% Mechanical Keyboard PCB. + +Toad schematic and PCB are available opensource under Creative Commons BY-SA 3.0 license on EasyEDA at [this link](https://easyeda.com/farmakon/70_Keyboard-d4f6baf4792d4ada9c0571fa3713e461) + +For more informations on the Toad please visit this [geekhack.org thread](https://geekhack.org/index.php?topic=91388.0) + +Make examples for these keyboards (after setting up your build environment): + + make toad:default + + +See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. diff --git a/keyboards/toad/rules.mk b/keyboards/toad/rules.mk new file mode 100644 index 000000000000..ee87c6e8d49b --- /dev/null +++ b/keyboards/toad/rules.mk @@ -0,0 +1,56 @@ +# 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* +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# comment out to disable the options. +# +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 # Breathing sleep LED during USB suspend +NKRO_ENABLE ?= yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE ?= no # Enable keyboard backlight functionality +AUDIO_ENABLE ?= no +RGBLIGHT_ENABLE ?= no \ No newline at end of file diff --git a/keyboards/toad/toad.c b/keyboards/toad/toad.c new file mode 100644 index 000000000000..bc4db0339e51 --- /dev/null +++ b/keyboards/toad/toad.c @@ -0,0 +1,18 @@ +#include "toad.h" + +void led_set_user(uint8_t usb_led) { + + //LED1 + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRB |= (1 << 6); PORTB &= ~(1 << 6); + } else { + DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); + } + + //LED2 + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + DDRB |= (1 << 5); PORTB &= ~(1 << 5); + } else { + DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); + } +} diff --git a/keyboards/toad/toad.h b/keyboards/toad/toad.h new file mode 100644 index 000000000000..154068e42a7d --- /dev/null +++ b/keyboards/toad/toad.h @@ -0,0 +1,91 @@ +#ifndef TOAD +#define TOAD + +#include "quantum.h" + +// 70% keyboard: default - all keys +#define LAYOUT_all( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K013, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \ + K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, \ + K500, K501, K502, K507, K510, K511, K512, K513 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \ + { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413 }, \ + { K500, K501, K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,K510, K511, K512, K513 } \ +} + +// 70% keyboard: ANSI Winkey +#define LAYOUT_ansi_wk( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ + K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, \ + K500, K501, K502, K507, K510, K511, K512, K513 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO}, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO,K313 }, \ + { K400, KC_NO,K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO}, \ + { K500, K501, K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,K510, K511, K512, K513 } \ +} + +// 70% keyboard: ANSI Winkeyless +#define LAYOUT_ansi_wkl( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ + K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, \ + K500, K502, K507, K511, K513 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO}, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO,K313 }, \ + { K400, KC_NO,K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO}, \ + { K500, KC_NO,K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,KC_NO,K511, KC_NO,K513 } \ +} + +// 70% keyboard: ISO Winkey +#define LAYOUT_iso_wk( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \ + K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, \ + K500, K501, K502, K507, K510, K511, K512, K513 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO}, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, KC_NO}, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \ + { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO}, \ + { K500, K501, K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,K510, K511, K512, K513 } \ +} + +// 70% keyboard: ISO Winkeyless +#define LAYOUT_iso_wkl( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \ + K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, \ + K500, K502, K507, K511, K513 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO}, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, KC_NO}, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \ + { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO}, \ + { K500, KC_NO,K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,KC_NO,K511, KC_NO,K513 } \ +} + +#endif diff --git a/keyboards/xmmx/keymaps/xmmx_ansi_wk/keymap.c b/keyboards/xmmx/keymaps/ansi_wk/keymap.c similarity index 73% rename from keyboards/xmmx/keymaps/xmmx_ansi_wk/keymap.c rename to keyboards/xmmx/keymaps/ansi_wk/keymap.c index 20d55c1fd530..abdba99ba79d 100644 --- a/keyboards/xmmx/keymaps/xmmx_ansi_wk/keymap.c +++ b/keyboards/xmmx/keymaps/ansi_wk/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - KEYMAP_ANSI_WK( + LAYOUT_ansi_wk( 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_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, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/keymaps/xmmx_ansi_wkl/keymap.c b/keyboards/xmmx/keymaps/ansi_wkl/keymap.c similarity index 73% rename from keyboards/xmmx/keymaps/xmmx_ansi_wkl/keymap.c rename to keyboards/xmmx/keymaps/ansi_wkl/keymap.c index 3c8ba436f0c7..aeb61ff2cabb 100644 --- a/keyboards/xmmx/keymaps/xmmx_ansi_wkl/keymap.c +++ b/keyboards/xmmx/keymaps/ansi_wkl/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - KEYMAP_ANSI_WKL( + LAYOUT_ansi_wkl( 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_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, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/keymaps/default/keymap.c b/keyboards/xmmx/keymaps/default/keymap.c index 6b0a114328ee..a7522fe25a27 100644 --- a/keyboards/xmmx/keymaps/default/keymap.c +++ b/keyboards/xmmx/keymaps/default/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - KEYMAP( + LAYOUT_all( 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_BSPC, KC_INS,KC_HOME, KC_PGUP, \ 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, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/keymaps/xmmx_iso_wk/keymap.c b/keyboards/xmmx/keymaps/iso_wk/keymap.c similarity index 73% rename from keyboards/xmmx/keymaps/xmmx_iso_wk/keymap.c rename to keyboards/xmmx/keymaps/iso_wk/keymap.c index ee68253c7e26..882cb224a601 100644 --- a/keyboards/xmmx/keymaps/xmmx_iso_wk/keymap.c +++ b/keyboards/xmmx/keymaps/iso_wk/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - KEYMAP_ISO_WK( + LAYOUT_iso_wk( 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_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_DEL, KC_END, KC_PGDN, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/keymaps/xmmx_iso_wkl/keymap.c b/keyboards/xmmx/keymaps/iso_wkl/keymap.c similarity index 73% rename from keyboards/xmmx/keymaps/xmmx_iso_wkl/keymap.c rename to keyboards/xmmx/keymaps/iso_wkl/keymap.c index c27914e4516e..18ba79e1f951 100644 --- a/keyboards/xmmx/keymaps/xmmx_iso_wkl/keymap.c +++ b/keyboards/xmmx/keymaps/iso_wkl/keymap.c @@ -1,8 +1,8 @@ -#include "xmmx.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - KEYMAP_ISO_WKL( + LAYOUT_iso_wkl( 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_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_DEL, KC_END, KC_PGDN, \ @@ -11,20 +11,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT ) }; - -void led_set_user(uint8_t usb_led) { - - //LED1 - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRB |= (1 << 6); PORTB &= ~(1 << 6); - } else { - DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); - } - - //LED2 - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRB |= (1 << 5); PORTB &= ~(1 << 5); - } else { - DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); - } -} diff --git a/keyboards/xmmx/readme.md b/keyboards/xmmx/readme.md index cf16231e171b..8f94df4b92f7 100644 --- a/keyboards/xmmx/readme.md +++ b/keyboards/xmmx/readme.md @@ -1,20 +1,14 @@ -XMMX and Toad -======== +# XMMX XMMX: Tenkeyless Mechanical Keyboard PCB designed to fit Filco Majestouch TKL and Cooler Master Quickfire Rapid cases -Toad: 70% Mechanical Keyboard PCB. XMMX schematic and PCB are available opensource under Creative Commons BY-SA 3.0 license on EasyEDA at [this link](https://easyeda.com/farmakon/XMMX-0447d28c1e4644b88fd04905d983684d) -Toad schematic and PCB are available opensource under Creative Commons BY-SA 3.0 license on EasyEDA at [this link](https://easyeda.com/farmakon/70_Keyboard-d4f6baf4792d4ada9c0571fa3713e461) For more informations on the XMMX please visit this [geekhack.org thread](https://geekhack.org/index.php?topic=93422.0) -For more informations on the Toad please visit this [geekhack.org thread](https://geekhack.org/index.php?topic=91388.0) Make examples for these keyboards (after setting up your build environment): make xmmx:default - make xmmx:toad - See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. diff --git a/keyboards/xmmx/xmmx.c b/keyboards/xmmx/xmmx.c index 399ae4eb4412..4d410e90a008 100644 --- a/keyboards/xmmx/xmmx.c +++ b/keyboards/xmmx/xmmx.c @@ -1 +1,18 @@ #include "xmmx.h" + +void led_set_user(uint8_t usb_led) { + + //LED1 + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRB |= (1 << 6); PORTB &= ~(1 << 6); + } else { + DDRB &= ~(1 << 6); PORTB &= ~(1 << 6); + } + + //LED2 + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + DDRB |= (1 << 5); PORTB &= ~(1 << 5); + } else { + DDRB &= ~(1 << 5); PORTB &= ~(1 << 5); + } +} diff --git a/keyboards/xmmx/xmmx.h b/keyboards/xmmx/xmmx.h index ad6ae3014619..22d0f1480d8d 100644 --- a/keyboards/xmmx/xmmx.h +++ b/keyboards/xmmx/xmmx.h @@ -4,7 +4,7 @@ #include "quantum.h" // 80% keyboard: default - all keys -#define KEYMAP( \ +#define LAYOUT_all( \ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K013, K114, K115, K116, \ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, \ @@ -21,7 +21,7 @@ } // 80% keyboard: ANSI Winkey -#define KEYMAP_ANSI_WK( \ +#define LAYOUT_ansi_wk( \ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, \ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, \ @@ -38,7 +38,7 @@ } // 80% keyboard: ANSI Winkeyless -#define KEYMAP_ANSI_WKL( \ +#define LAYOUT_ansi_wkl( \ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, \ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, \ @@ -55,7 +55,7 @@ } // 80% keyboard: ISO Winkey -#define KEYMAP_ISO_WK( \ +#define LAYOUT_iso_wk( \ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, \ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K215, K216, \ @@ -72,7 +72,7 @@ } // 80% keyboard: ISO Winkeyless -#define KEYMAP_ISO_WKL( \ +#define LAYOUT_iso_wkl( \ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, \ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K215, K216, \ @@ -88,90 +88,4 @@ { K500, KC_NO,K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,KC_NO,K511, KC_NO,K513, K514, K515, K516 } \ } - -// 70% keyboard: default - all keys -#define TOAD_KEYMAP( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ - K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K013, \ - K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \ - K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, \ - K500, K501, K502, K507, K510, K511, K512, K513 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ - { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113 }, \ - { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \ - { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413 }, \ - { K500, K501, K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,K510, K511, K512, K513 } \ -} - -// 70% keyboard: ANSI Winkey -#define TOAD_KEYMAP_ANSI_WK( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ - K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, \ - K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ - K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, \ - K500, K501, K502, K507, K510, K511, K512, K513 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ - { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO}, \ - { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO,K313 }, \ - { K400, KC_NO,K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO}, \ - { K500, K501, K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,K510, K511, K512, K513 } \ -} - -// 70% keyboard: ANSI Winkeyless -#define TOAD_KEYMAP_ANSI_WKL( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ - K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, \ - K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ - K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, \ - K500, K502, K507, K511, K513 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ - { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO}, \ - { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO,K313 }, \ - { K400, KC_NO,K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO}, \ - { K500, KC_NO,K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,KC_NO,K511, KC_NO,K513 } \ -} - -// 70% keyboard: ISO Winkey -#define TOAD_KEYMAP_ISO_WK( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ - K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, \ - K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \ - K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, \ - K500, K501, K502, K507, K510, K511, K512, K513 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ - { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO}, \ - { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, KC_NO}, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \ - { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO}, \ - { K500, K501, K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,K510, K511, K512, K513 } \ -} - -// 70% keyboard: ISO Winkeyless -#define TOAD_KEYMAP_ISO_WKL( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, \ - K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K013, \ - K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \ - K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, \ - K500, K502, K507, K511, K513 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ - { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO}, \ - { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, KC_NO}, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \ - { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO}, \ - { K500, KC_NO,K502, KC_NO,KC_NO,KC_NO,KC_NO,K507, KC_NO,KC_NO,KC_NO,K511, KC_NO,K513 } \ -} - #endif From 96648a133de7f297157b7d447be59354c1200c09 Mon Sep 17 00:00:00 2001 From: mtdjr Date: Wed, 26 Sep 2018 15:23:30 -0400 Subject: [PATCH 049/505] Keymap: mtdjr userspace changes and Nyquist keymap addition (#3940) * holefully correct error in mtdjr userspace for layer_state_set_user * return state and wrap rgb actions in their own conditional * mtdjr nyquist and userspace updates * mtdjr updates as requested --- keyboards/nyquist/keymaps/mtdjr/config.h | 36 +++++++++++++ keyboards/nyquist/keymaps/mtdjr/keymap.c | 64 ++++++++++++++++++++++++ keyboards/nyquist/keymaps/mtdjr/rules.mk | 2 + users/mtdjr/mtdjr.c | 2 +- users/mtdjr/mtdjr.h | 2 +- 5 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 keyboards/nyquist/keymaps/mtdjr/config.h create mode 100644 keyboards/nyquist/keymaps/mtdjr/keymap.c create mode 100644 keyboards/nyquist/keymaps/mtdjr/rules.mk diff --git a/keyboards/nyquist/keymaps/mtdjr/config.h b/keyboards/nyquist/keymaps/mtdjr/config.h new file mode 100644 index 000000000000..0fa606f29653 --- /dev/null +++ b/keyboards/nyquist/keymaps/mtdjr/config.h @@ -0,0 +1,36 @@ +/* +Copyright 2017 Danny Nguyen + +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 + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 12 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/nyquist/keymaps/mtdjr/keymap.c b/keyboards/nyquist/keymaps/mtdjr/keymap.c new file mode 100644 index 000000000000..668e7964b587 --- /dev/null +++ b/keyboards/nyquist/keymaps/mtdjr/keymap.c @@ -0,0 +1,64 @@ +#include QMK_KEYBOARD_H +#include "mtdjr.h" + +extern keymap_config_t keymap_config; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = LAYOUT_kc ( +// ,-----------------------------. .-----------------------------. + GESC, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + TAB, Q , W , E , R , T , Y , U , I , O , P ,QUOT, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + RASE, A , S , D , F , G , H , J , K , L ,SCLN, ENT, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + LSFT, Z , X , C , V , B , N , M ,COMM, DOT,SLSH,xxxx, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + LOWR,LCTL,LALT,LGUI, SPC, SPC, SPC, SPC,LEFT,DOWN, UP ,RGHT +// '-----------------------------' '-----------------------------' +), + + [_LOWER] = LAYOUT_kc( +// ,-----------------------------. .-----------------------------. + TILD,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,UNDS,PLUS, DEL, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,LBRC,RBRC,BSLS, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + ,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,xxxx,xxxx, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + xxxx,UNDO, CUT,XCPY,XINS,xxxx, xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , ,MNXT,VOLD,VOLU,MPLY +// '-----------------------------' '-----------------------------' +), + + [_RAISE] = LAYOUT_kc( +// ,-----------------------------. .-----------------------------. + xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,MINS, EQL, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,LCBR,RCBR,PIPE, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + ,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,xxxx,xxxx, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, xxxx,xxxx,xxxx,xxxx,xxxx,xxxx, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , ,MNXT,VOLD,VOLU,MPLY +// '-----------------------------' '-----------------------------' +), + + [_ADJUST] = LAYOUT_kc( +// ,-----------------------------. .-----------------------------. + xxxx,ROOT,PPLY,PSEF,xxxx,xxxx, F1 , F2 , F3 , F4 , F5 , F6 , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + xxxx,xxxx,xxxx,xxxx, RST,xxxx, F7 , F8 , F9 , F10, F11, F12, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + , RGB,RHUI,RSAI,RVAI, MOD, xxxx,xxxx,xxxx,xxxx,xxxx, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + xxxx,RBTH,RHUD,RSAD,RVAD,RMOD, xxxx,xxxx,xxxx,xxxx,xxxx, BLB, +// |----+----+----+----+----+----| |----+----+----+----+----+----| + ,xxxx,xxxx,xxxx, , , , ,BLOF, BLD, BLI,BLON +// '-----------------------------' '-----------------------------' +) + +}; diff --git a/keyboards/nyquist/keymaps/mtdjr/rules.mk b/keyboards/nyquist/keymaps/mtdjr/rules.mk new file mode 100644 index 000000000000..d7463419b4fe --- /dev/null +++ b/keyboards/nyquist/keymaps/mtdjr/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes diff --git a/users/mtdjr/mtdjr.c b/users/mtdjr/mtdjr.c index d8d6871a1740..c31b077b4659 100644 --- a/users/mtdjr/mtdjr.c +++ b/users/mtdjr/mtdjr.c @@ -5,7 +5,7 @@ #endif #ifndef RGB_MODE - #define RGB_MODE 16 + #define RGB_MODE 2 #endif #ifndef RGB_HUE #define RGB_HUE 285 diff --git a/users/mtdjr/mtdjr.h b/users/mtdjr/mtdjr.h index 3efcb45ec2e2..85ca1596dce8 100644 --- a/users/mtdjr/mtdjr.h +++ b/users/mtdjr/mtdjr.h @@ -95,7 +95,7 @@ enum user_tapdance { #define KC_BLD BL_DEC #define KC_BLB BL_BRTG #define KC_BLON BL_ON -#define KB_BLOF BL_OFF +#define KC_BLOF BL_OFF #endif From c7ce0d21dc07e1154b6a40cd621eb2eef075483b Mon Sep 17 00:00:00 2001 From: Florian Didron Date: Tue, 25 Sep 2018 11:32:23 +0900 Subject: [PATCH 050/505] Moves animation calculation logic out of the for loops --- quantum/rgb_matrix.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index 8ad00c37dd6b..5fb59af8c023 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -438,10 +438,12 @@ void rgb_matrix_cycle_up_down(void) { void rgb_matrix_dual_beacon(void) { HSV hsv = { .h = rgb_matrix_config.hue, .s = rgb_matrix_config.sat, .v = rgb_matrix_config.val }; RGB rgb; - rgb_led led; + Point point; + double cos_value = cos(g_tick * PI / 128) / 32; + double sin_value = sin(g_tick * PI / 128) / 112; for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { - led = g_rgb_leds[i]; - hsv.h = ((led.point.y - 32.0)* cos(g_tick * PI / 128) / 32 + (led.point.x - 112.0) * sin(g_tick * PI / 128) / (112)) * (180) + rgb_matrix_config.hue; + point = g_rgb_leds[i].point; + hsv.h = ((point.y - 32.0)* cos_value + (point.x - 112.0) * sin_value) * (180) + rgb_matrix_config.hue; rgb = hsv_to_rgb( hsv ); rgb_matrix_set_color( i, rgb.r, rgb.g, rgb.b ); } @@ -450,10 +452,12 @@ void rgb_matrix_dual_beacon(void) { void rgb_matrix_rainbow_beacon(void) { HSV hsv = { .h = rgb_matrix_config.hue, .s = rgb_matrix_config.sat, .v = rgb_matrix_config.val }; RGB rgb; - rgb_led led; + Point point; + double cos_value = cos(g_tick * PI / 128); + double sin_value = sin(g_tick * PI / 128); for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { - led = g_rgb_leds[i]; - hsv.h = (1.5 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (led.point.y - 32.0)* cos(g_tick * PI / 128) + (1.5 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (led.point.x - 112.0) * sin(g_tick * PI / 128) + rgb_matrix_config.hue; + point = g_rgb_leds[i].point; + hsv.h = (1.5 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (point.y - 32.0)* cos_value + (1.5 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (point.x - 112.0) * sin_value + rgb_matrix_config.hue; rgb = hsv_to_rgb( hsv ); rgb_matrix_set_color( i, rgb.r, rgb.g, rgb.b ); } @@ -462,10 +466,12 @@ void rgb_matrix_rainbow_beacon(void) { void rgb_matrix_rainbow_pinwheels(void) { HSV hsv = { .h = rgb_matrix_config.hue, .s = rgb_matrix_config.sat, .v = rgb_matrix_config.val }; RGB rgb; - rgb_led led; + Point point; + double cos_value = cos(g_tick * PI / 128); + double sin_value = sin(g_tick * PI / 128); for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { - led = g_rgb_leds[i]; - hsv.h = (2 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (led.point.y - 32.0)* cos(g_tick * PI / 128) + (2 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (66 - abs(led.point.x - 112.0)) * sin(g_tick * PI / 128) + rgb_matrix_config.hue; + point = g_rgb_leds[i].point; + hsv.h = (2 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (point.y - 32.0)* cos_value + (2 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (66 - abs(point.x - 112.0)) * sin_value + rgb_matrix_config.hue; rgb = hsv_to_rgb( hsv ); rgb_matrix_set_color( i, rgb.r, rgb.g, rgb.b ); } @@ -474,12 +480,14 @@ void rgb_matrix_rainbow_pinwheels(void) { void rgb_matrix_rainbow_moving_chevron(void) { HSV hsv = { .h = rgb_matrix_config.hue, .s = rgb_matrix_config.sat, .v = rgb_matrix_config.val }; RGB rgb; - rgb_led led; + Point point; + uint8_t r = 128; + double cos_value = cos(r * PI / 128); + double sin_value = sin(r * PI / 128); + double multiplier = (g_tick / 256.0 * 224); for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { - led = g_rgb_leds[i]; - // uint8_t r = g_tick; - uint8_t r = 128; - hsv.h = (1.5 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * abs(led.point.y - 32.0)* sin(r * PI / 128) + (1.5 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (led.point.x - (g_tick / 256.0 * 224)) * cos(r * PI / 128) + rgb_matrix_config.hue; + point = g_rgb_leds[i].point; + hsv.h = (1.5 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * abs(point.y - 32.0)* sin_value + (1.5 * (rgb_matrix_config.speed == 0 ? 1 : rgb_matrix_config.speed)) * (point.x - multiplier) * cos_value + rgb_matrix_config.hue; rgb = hsv_to_rgb( hsv ); rgb_matrix_set_color( i, rgb.r, rgb.g, rgb.b ); } From ec0297027d5ad180af06d41dbfa351d313fe91e8 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 26 Sep 2018 19:19:38 -0700 Subject: [PATCH 051/505] Bugfix for 60_ansi_tsangan and 60_iso_tsangan layouts (#3987) This corrects the matrix macro reference for both of the keymap.c files in layouts/default. --- .../60_ansi_tsangan/default_60_ansi_tsangan/keymap.c | 12 ++++++------ .../60_iso_tsangan/default_60_iso_tsangan/keymap.c | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/layouts/default/60_ansi_tsangan/default_60_ansi_tsangan/keymap.c b/layouts/default/60_ansi_tsangan/default_60_ansi_tsangan/keymap.c index 8f7f5f8c6f92..e4562ede511d 100644 --- a/layouts/default/60_ansi_tsangan/default_60_ansi_tsangan/keymap.c +++ b/layouts/default/60_ansi_tsangan/default_60_ansi_tsangan/keymap.c @@ -1,11 +1,11 @@ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT_60_ansi( - 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_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 , KC_RCTL + [0] = LAYOUT_60_ansi_tsangan( + 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_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, KC_RCTL ) }; diff --git a/layouts/default/60_iso_tsangan/default_60_iso_tsangan/keymap.c b/layouts/default/60_iso_tsangan/default_60_iso_tsangan/keymap.c index 204a12d33d2d..94d763020703 100644 --- a/layouts/default/60_iso_tsangan/default_60_iso_tsangan/keymap.c +++ b/layouts/default/60_iso_tsangan/default_60_iso_tsangan/keymap.c @@ -1,11 +1,11 @@ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT_60_iso( - 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_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, - 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_LCTRL, KC_LALT, KC_LGUI, KC_SPACE, KC_RGUI, KC_RALT, KC_RCTL + [0] = LAYOUT_60_iso_tsangan( + 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_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, + 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_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL ) }; From 12ad59f99de0ecd2c81b92587c2858b3fb39523c Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Wed, 26 Sep 2018 22:09:05 -0700 Subject: [PATCH 052/505] Keyboard: Treasure Macropad (#3988) * port macropad over to qmk * add bootloader size --- keyboards/macropad/config.h | 224 +++++++++++++++++++ keyboards/macropad/info.json | 12 + keyboards/macropad/keymaps/default/config.h | 19 ++ keyboards/macropad/keymaps/default/keymap.c | 64 ++++++ keyboards/macropad/keymaps/default/readme.md | 1 + keyboards/macropad/macropad.c | 43 ++++ keyboards/macropad/macropad.h | 40 ++++ keyboards/macropad/readme.md | 13 ++ keyboards/macropad/rules.mk | 81 +++++++ 9 files changed, 497 insertions(+) create mode 100644 keyboards/macropad/config.h create mode 100644 keyboards/macropad/info.json create mode 100644 keyboards/macropad/keymaps/default/config.h create mode 100644 keyboards/macropad/keymaps/default/keymap.c create mode 100644 keyboards/macropad/keymaps/default/readme.md create mode 100644 keyboards/macropad/macropad.c create mode 100644 keyboards/macropad/macropad.h create mode 100644 keyboards/macropad/readme.md create mode 100644 keyboards/macropad/rules.mk diff --git a/keyboards/macropad/config.h b/keyboards/macropad/config.h new file mode 100644 index 000000000000..00f2e781103a --- /dev/null +++ b/keyboards/macropad/config.h @@ -0,0 +1,224 @@ +/* +Copyright 2018 MechMerlin + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Treasure +#define PRODUCT Macropad Type 9 +#define DESCRIPTION A custom macropad + +/* key matrix size */ +#define MATRIX_ROWS 3 +#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 { E6, D7, C6 } +#define MATRIX_COL_PINS { D1, D0, D4 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B5 +// #define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 10 + +// #define RGB_DI_PIN E2 +// #ifdef RGB_DI_PIN +// #define RGBLIGHT_ANIMATIONS +// #define RGBLED_NUM 16 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 +// #endif + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + diff --git a/keyboards/macropad/info.json b/keyboards/macropad/info.json new file mode 100644 index 000000000000..f946ed153eb2 --- /dev/null +++ b/keyboards/macropad/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Macropad", + "url": "", + "maintainer": "qmk", + "width": 3, + "height": 3, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}] + } + } +} diff --git a/keyboards/macropad/keymaps/default/config.h b/keyboards/macropad/keymaps/default/config.h new file mode 100644 index 000000000000..a3ed4f762a6e --- /dev/null +++ b/keyboards/macropad/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 MechMerlin + * + * 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 + +// place overrides here diff --git a/keyboards/macropad/keymaps/default/keymap.c b/keyboards/macropad/keymaps/default/keymap.c new file mode 100644 index 000000000000..300d5b1e4ca4 --- /dev/null +++ b/keyboards/macropad/keymaps/default/keymap.c @@ -0,0 +1,64 @@ +/* Copyright 2018 MechMerlin + * + * 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 QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( /* Base */ + KC_0, KC_1, KC_2, \ + KC_3, KC_4, KC_5, \ + KC_6, KC_7, KC_8 \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/macropad/keymaps/default/readme.md b/keyboards/macropad/keymaps/default/readme.md new file mode 100644 index 000000000000..bd3d78af21bb --- /dev/null +++ b/keyboards/macropad/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for macropad diff --git a/keyboards/macropad/macropad.c b/keyboards/macropad/macropad.c new file mode 100644 index 000000000000..0219746e1251 --- /dev/null +++ b/keyboards/macropad/macropad.c @@ -0,0 +1,43 @@ +/* Copyright 2018 MechMerlin + * + * 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 "macropad.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/macropad/macropad.h b/keyboards/macropad/macropad.h new file mode 100644 index 000000000000..94471d7c5728 --- /dev/null +++ b/keyboards/macropad/macropad.h @@ -0,0 +1,40 @@ +/* Copyright 2018 MechMerlin + * + * 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 MACROPAD_H +#define MACROPAD_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT( \ + K00, K01, K02, \ + K10, K11, K12, \ + K20, K21, K22 \ +) \ +{ \ + { K00, K01, K02 }, \ + { K10, K11, K12 }, \ + { K20, K21, K22 }, \ +} + +#endif diff --git a/keyboards/macropad/readme.md b/keyboards/macropad/readme.md new file mode 100644 index 000000000000..204ec1fd2301 --- /dev/null +++ b/keyboards/macropad/readme.md @@ -0,0 +1,13 @@ +# Macropad + +3x3 Macropad. + +Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin) +Hardware Supported: Treasure Macropad Type-9 +Hardware Availability: [Treasure](http://macropad.co/) + +Make example for this keyboard (after setting up your build environment): + + make macropad:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/macropad/rules.mk b/keyboards/macropad/rules.mk new file mode 100644 index 000000000000..599974d25a20 --- /dev/null +++ b/keyboards/macropad/rules.mk @@ -0,0 +1,81 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = 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 = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From f70f45ee677a2a39a759052a356e0c5d82e25424 Mon Sep 17 00:00:00 2001 From: James Laird-Wah Date: Fri, 28 Sep 2018 00:40:18 +1000 Subject: [PATCH 053/505] RGB Matrix refactoring to open up for new drivers (#3913) * rgb_matrix: use a driver ops struct This is intended to avoid #ifdef proliferation on adding more drivers, eg. model01, which use different architectures. * rgb_matrix: document driver struct members * rgb_matrix: remove unused LED testing code * rgb_matrix: don't build into IS31x drivers unless being used * rgb_matrix: refactor make config options This ensures that the necessary files are included for any custom RGB_MATRIX_ENABLE value, without having to add entries here for specific boards. This particularly affects model01 because its controller is integrated and won't be used anywhere else, so it's preferable not to put it in common_features.mk. This now validates the value of RGB_MATRIX_ENABLE. It was necessary to fix an error in ergodox_ez rules.mk using the wrong comment separator, yielding an invalid value. * IS31x drivers: don't write the control registers all the time This is only needed when they are changed. This is done in init() and board- or keymap-specific code is free to make further changes. * rgb_matrix: move structs from chip drivers to rgb_matrix_drivers.c This approach is specific to the rgb_matrix functionality, so keep it neatly separated from the raw chip drivers. --- common_features.mk | 24 ++++---- drivers/issi/is31fl3731.c | 1 - drivers/issi/is31fl3733.c | 3 +- keyboards/ergodox_ez/rules.mk | 2 +- quantum/rgb_matrix.c | 113 ++-------------------------------- quantum/rgb_matrix.h | 17 ++++- quantum/rgb_matrix_drivers.c | 82 ++++++++++++++++++++++++ 7 files changed, 113 insertions(+), 129 deletions(-) create mode 100644 quantum/rgb_matrix_drivers.c diff --git a/common_features.mk b/common_features.mk index 7af7789808df..6c835abde672 100644 --- a/common_features.mk +++ b/common_features.mk @@ -114,37 +114,35 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) endif endif -ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) +RGB_MATRIX_ENABLE ?= no +VALID_MATRIX_TYPES := yes IS31FL3731L IS31FL3733L custom +ifneq ($(strip $(RGB_MATRIX_ENABLE)), no) +ifeq ($(filter $(RGB_MATRIX_ENABLE),$(VALID_MATRIX_TYPES)),) + $(error RGB_MATRIX_ENABLE="$(RGB_MATRIX_ENABLE)" is not a valid matrix type) +endif OPT_DEFS += -DRGB_MATRIX_ENABLE - OPT_DEFS += -DIS31FL3731 - COMMON_VPATH += $(DRIVER_PATH)/issi - SRC += is31fl3731.c - SRC += i2c_master.c SRC += $(QUANTUM_DIR)/color.c SRC += $(QUANTUM_DIR)/rgb_matrix.c + SRC += $(QUANTUM_DIR)/rgb_matrix_drivers.c CIE1931_CURVE = yes endif +ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) + RGB_MATRIX_ENABLE = IS31FL3731 +endif + ifeq ($(strip $(RGB_MATRIX_ENABLE)), IS31FL3731) - OPT_DEFS += -DRGB_MATRIX_ENABLE OPT_DEFS += -DIS31FL3731 COMMON_VPATH += $(DRIVER_PATH)/issi SRC += is31fl3731.c SRC += i2c_master.c - SRC += $(QUANTUM_DIR)/color.c - SRC += $(QUANTUM_DIR)/rgb_matrix.c - CIE1931_CURVE = yes endif ifeq ($(strip $(RGB_MATRIX_ENABLE)), IS31FL3733) - OPT_DEFS += -DRGB_MATRIX_ENABLE OPT_DEFS += -DIS31FL3733 COMMON_VPATH += $(DRIVER_PATH)/issi SRC += is31fl3733.c SRC += i2c_master.c - SRC += $(QUANTUM_DIR)/color.c - SRC += $(QUANTUM_DIR)/rgb_matrix.c - CIE1931_CURVE = yes endif ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) diff --git a/drivers/issi/is31fl3731.c b/drivers/issi/is31fl3731.c index 4d0d6b8a5e7f..c9155f5a3738 100644 --- a/drivers/issi/is31fl3731.c +++ b/drivers/issi/is31fl3731.c @@ -268,4 +268,3 @@ void IS31FL3731_update_led_control_registers( uint8_t addr1, uint8_t addr2 ) } } } - diff --git a/drivers/issi/is31fl3733.c b/drivers/issi/is31fl3733.c index 4098b54689f8..c198ec517460 100644 --- a/drivers/issi/is31fl3733.c +++ b/drivers/issi/is31fl3733.c @@ -24,10 +24,10 @@ #include "wait.h" #endif -#include "is31fl3733.h" #include #include "i2c_master.h" #include "progmem.h" +#include "rgb_matrix.h" // This is a 7-bit address, that gets left-shifted and bit 0 // set to 0 for write, 1 for read (as per I2C protocol) @@ -250,4 +250,3 @@ void IS31FL3733_update_led_control_registers( uint8_t addr1, uint8_t addr2 ) } } } - diff --git a/keyboards/ergodox_ez/rules.mk b/keyboards/ergodox_ez/rules.mk index dfbdba10d66a..ef2aefbb9ae0 100644 --- a/keyboards/ergodox_ez/rules.mk +++ b/keyboards/ergodox_ez/rules.mk @@ -83,6 +83,6 @@ SWAP_HANDS_ENABLE= yes # Allow swapping hands of keyboard SLEEP_LED_ENABLE = no API_SYSEX_ENABLE = no RGBLIGHT_ENABLE = yes -RGB_MATRIX_ENABLE = no // enable later +RGB_MATRIX_ENABLE = no # enable later LAYOUTS = ergodox diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index 5fb59af8c023..807e4d62d191 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -18,7 +18,6 @@ #include "rgb_matrix.h" -#include "i2c_master.h" #include "progmem.h" #include "config.h" #include "eeprom.h" @@ -111,29 +110,15 @@ void map_row_column_to_led( uint8_t row, uint8_t column, uint8_t *led_i, uint8_t } void rgb_matrix_update_pwm_buffers(void) { -#ifdef IS31FL3731 - IS31FL3731_update_pwm_buffers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); - IS31FL3731_update_led_control_registers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); -#elif defined(IS31FL3733) - IS31FL3733_update_pwm_buffers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); - IS31FL3733_update_led_control_registers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); -#endif + rgb_matrix_driver.flush(); } void rgb_matrix_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) { -#ifdef IS31FL3731 - IS31FL3731_set_color( index, red, green, blue ); -#elif defined(IS31FL3733) - IS31FL3733_set_color( index, red, green, blue ); -#endif + rgb_matrix_driver.set_color(index, red, green, blue); } void rgb_matrix_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) { -#ifdef IS31FL3731 - IS31FL3731_set_color_all( red, green, blue ); -#elif defined(IS31FL3733) - IS31FL3733_set_color_all( red, green, blue ); -#endif + rgb_matrix_driver.set_color_all(red, green, blue); } bool process_rgb_matrix(uint16_t keycode, keyrecord_t *record) { @@ -196,47 +181,6 @@ void rgb_matrix_test(void) { } } -// This tests the LEDs -// Note that it will change the LED control registers -// in the LED drivers, and leave them in an invalid -// state for other backlight effects. -// ONLY USE THIS FOR TESTING LEDS! -void rgb_matrix_single_LED_test(void) { - static uint8_t color = 0; // 0,1,2 for R,G,B - static uint8_t row = 0; - static uint8_t column = 0; - - static uint8_t tick = 0; - tick++; - - if ( tick > 2 ) - { - tick = 0; - column++; - } - if ( column > MATRIX_COLS ) - { - column = 0; - row++; - } - if ( row > MATRIX_ROWS ) - { - row = 0; - color++; - } - if ( color > 2 ) - { - color = 0; - } - - uint8_t led[8], led_count; - map_row_column_to_led(row,column,led,&led_count); - for(uint8_t i = 0; i < led_count; i++) { - rgb_matrix_set_color_all( 40, 40, 40 ); - rgb_matrix_test_led( led[i], color==0, color==1, color==2 ); - } -} - // All LEDs off void rgb_matrix_all_off(void) { rgb_matrix_set_color_all( 0, 0, 0 ); @@ -817,7 +761,7 @@ void rgb_matrix_indicators_user(void) {} // } void rgb_matrix_init(void) { - rgb_matrix_setup_drivers(); + rgb_matrix_driver.init(); // TODO: put the 1 second startup delay here? @@ -841,33 +785,6 @@ void rgb_matrix_init(void) { eeconfig_debug_rgb_matrix(); // display current eeprom values } -void rgb_matrix_setup_drivers(void) { - // Initialize TWI - i2c_init(); -#ifdef IS31FL3731 - IS31FL3731_init( DRIVER_ADDR_1 ); - IS31FL3731_init( DRIVER_ADDR_2 ); -#elif defined (IS31FL3733) - IS31FL3733_init( DRIVER_ADDR_1 ); -#endif - - for ( int index = 0; index < DRIVER_LED_TOTAL; index++ ) { - bool enabled = true; - // This only caches it for later -#ifdef IS31FL3731 - IS31FL3731_set_led_control_register( index, enabled, enabled, enabled ); -#elif defined (IS31FL3733) - IS31FL3733_set_led_control_register( index, enabled, enabled, enabled ); -#endif - } - // This actually updates the LED drivers -#ifdef IS31FL3731 - IS31FL3731_update_led_control_registers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); -#elif defined (IS31FL3733) - IS31FL3733_update_led_control_registers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); -#endif -} - // Deals with the messy details of incrementing an integer uint8_t increment( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { int16_t new_value = value; @@ -910,28 +827,6 @@ uint8_t decrement( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { // } // } -void rgb_matrix_test_led( uint8_t index, bool red, bool green, bool blue ) { - for ( int i=0; i. + */ + +#include "rgb_matrix.h" + +/* Each driver needs to define the struct + * const rgb_matrix_driver_t rgb_matrix_driver; + * All members must be provided. + * Keyboard custom drivers can define this in their own files, it should only + * be here if shared between boards. + */ + +#if defined(IS31FL3731) || defined(IS31FL3733) + +#include "i2c_master.h" + +static void init( void ) +{ + i2c_init(); +#ifdef IS31FL3731 + IS31FL3731_init( DRIVER_ADDR_1 ); + IS31FL3731_init( DRIVER_ADDR_2 ); +#else + IS31FL3733_init( DRIVER_ADDR_1 ); +#endif + for ( int index = 0; index < DRIVER_LED_TOTAL; index++ ) { + bool enabled = true; + // This only caches it for later +#ifdef IS31FL3731 + IS31FL3731_set_led_control_register( index, enabled, enabled, enabled ); +#else + IS31FL3733_set_led_control_register( index, enabled, enabled, enabled ); +#endif + } + // This actually updates the LED drivers +#ifdef IS31FL3731 + IS31FL3731_update_led_control_registers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); +#else + IS31FL3733_update_led_control_registers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); +#endif +} + +#ifdef IS31FL3731 +static void flush( void ) +{ + IS31FL3731_update_pwm_buffers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); +} + +const rgb_matrix_driver_t rgb_matrix_driver = { + .init = init, + .flush = flush, + .set_color = IS31FL3731_set_color, + .set_color_all = IS31FL3731_set_color_all, +}; +#else +static void flush( void ) +{ + IS31FL3733_update_pwm_buffers( DRIVER_ADDR_1, DRIVER_ADDR_2 ); +} + +const rgb_matrix_driver_t rgb_matrix_driver = { + .init = init, + .flush = flush, + .set_color = IS31FL3733_set_color, + .set_color_all = IS31FL3733_set_color_all, +}; +#endif + +#endif From 13e166d9c42845e2622605e94d4a0c38fa5443a0 Mon Sep 17 00:00:00 2001 From: Wilba6582 Date: Fri, 28 Sep 2018 00:40:44 +1000 Subject: [PATCH 054/505] RAMA U80-A, wilba.tech WT60-A, WT65-A, WT80-A, IS31FL3736 driver (#3925) * Initial commit of RAMA U80-A * Initial commit of RAMA U80-A * Moved IS31FL3736 driver, minor cleanups * Superficial stuff * Review changes * Refactored to use common code. --- drivers/issi/is31fl3736.c | 306 ++++++++++++++++++ drivers/issi/is31fl3736.h | 172 ++++++++++ keyboards/rama/readme.md | 2 + keyboards/rama/u80_a/config.h | 187 +++++++++++ keyboards/rama/u80_a/info.json | 13 + keyboards/rama/u80_a/keymaps/default/keymap.c | 22 ++ keyboards/rama/u80_a/readme.md | 15 + keyboards/rama/u80_a/rules.mk | 68 ++++ keyboards/rama/u80_a/u80_a.c | 17 + keyboards/rama/u80_a/u80_a.h | 43 +++ keyboards/wilba_tech/wt60_a/config.h | 187 +++++++++++ keyboards/wilba_tech/wt60_a/info.json | 16 + .../keymaps/ansi_split_bs_rshift/keymap.c | 38 +++ .../wt60_a/keymaps/default/keymap.c | 38 +++ keyboards/wilba_tech/wt60_a/readme.md | 15 + keyboards/wilba_tech/wt60_a/rules.mk | 68 ++++ keyboards/wilba_tech/wt60_a/wt60_a.c | 17 + keyboards/wilba_tech/wt60_a/wt60_a.h | 52 +++ keyboards/wilba_tech/wt65_a/config.h | 187 +++++++++++ keyboards/wilba_tech/wt65_a/info.json | 13 + .../wt65_a/keymaps/default/keymap.c | 37 +++ keyboards/wilba_tech/wt65_a/readme.md | 15 + keyboards/wilba_tech/wt65_a/rules.mk | 68 ++++ keyboards/wilba_tech/wt65_a/wt65_a.c | 17 + keyboards/wilba_tech/wt65_a/wt65_a.h | 41 +++ keyboards/wilba_tech/wt80_a/config.h | 187 +++++++++++ keyboards/wilba_tech/wt80_a/info.json | 13 + .../wt80_a/keymaps/default/keymap.c | 22 ++ keyboards/wilba_tech/wt80_a/readme.md | 15 + keyboards/wilba_tech/wt80_a/rules.mk | 68 ++++ keyboards/wilba_tech/wt80_a/wt80_a.c | 17 + keyboards/wilba_tech/wt80_a/wt80_a.h | 43 +++ keyboards/wilba_tech/wt_main.c | 55 ++++ keyboards/wilba_tech/wt_mono_backlight.c | 116 +++++++ keyboards/wilba_tech/wt_mono_backlight.h | 33 ++ 35 files changed, 2223 insertions(+) create mode 100644 drivers/issi/is31fl3736.c create mode 100644 drivers/issi/is31fl3736.h create mode 100644 keyboards/rama/u80_a/config.h create mode 100644 keyboards/rama/u80_a/info.json create mode 100644 keyboards/rama/u80_a/keymaps/default/keymap.c create mode 100644 keyboards/rama/u80_a/readme.md create mode 100644 keyboards/rama/u80_a/rules.mk create mode 100644 keyboards/rama/u80_a/u80_a.c create mode 100644 keyboards/rama/u80_a/u80_a.h create mode 100644 keyboards/wilba_tech/wt60_a/config.h create mode 100644 keyboards/wilba_tech/wt60_a/info.json create mode 100644 keyboards/wilba_tech/wt60_a/keymaps/ansi_split_bs_rshift/keymap.c create mode 100644 keyboards/wilba_tech/wt60_a/keymaps/default/keymap.c create mode 100644 keyboards/wilba_tech/wt60_a/readme.md create mode 100644 keyboards/wilba_tech/wt60_a/rules.mk create mode 100644 keyboards/wilba_tech/wt60_a/wt60_a.c create mode 100644 keyboards/wilba_tech/wt60_a/wt60_a.h create mode 100644 keyboards/wilba_tech/wt65_a/config.h create mode 100644 keyboards/wilba_tech/wt65_a/info.json create mode 100644 keyboards/wilba_tech/wt65_a/keymaps/default/keymap.c create mode 100644 keyboards/wilba_tech/wt65_a/readme.md create mode 100644 keyboards/wilba_tech/wt65_a/rules.mk create mode 100644 keyboards/wilba_tech/wt65_a/wt65_a.c create mode 100644 keyboards/wilba_tech/wt65_a/wt65_a.h create mode 100644 keyboards/wilba_tech/wt80_a/config.h create mode 100644 keyboards/wilba_tech/wt80_a/info.json create mode 100644 keyboards/wilba_tech/wt80_a/keymaps/default/keymap.c create mode 100644 keyboards/wilba_tech/wt80_a/readme.md create mode 100644 keyboards/wilba_tech/wt80_a/rules.mk create mode 100644 keyboards/wilba_tech/wt80_a/wt80_a.c create mode 100644 keyboards/wilba_tech/wt80_a/wt80_a.h create mode 100644 keyboards/wilba_tech/wt_main.c create mode 100644 keyboards/wilba_tech/wt_mono_backlight.c create mode 100644 keyboards/wilba_tech/wt_mono_backlight.h diff --git a/drivers/issi/is31fl3736.c b/drivers/issi/is31fl3736.c new file mode 100644 index 000000000000..c5d431097198 --- /dev/null +++ b/drivers/issi/is31fl3736.c @@ -0,0 +1,306 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + + +#ifdef __AVR__ +#include +#include +#include +#else +#include "wait.h" +#endif + +#include "is31fl3736.h" +#include +#include "i2c_master.h" +#include "progmem.h" + + + +// This is a 7-bit address, that gets left-shifted and bit 0 +// set to 0 for write, 1 for read (as per I2C protocol) +// The address will vary depending on your wiring: +// 00 <-> GND +// 01 <-> SCL +// 10 <-> SDA +// 11 <-> VCC +// ADDR1 represents A1:A0 of the 7-bit address. +// ADDR2 represents A3:A2 of the 7-bit address. +// The result is: 0b101(ADDR2)(ADDR1) +#define ISSI_ADDR_DEFAULT 0x50 + +#define ISSI_COMMANDREGISTER 0xFD +#define ISSI_COMMANDREGISTER_WRITELOCK 0xFE +#define ISSI_INTERRUPTMASKREGISTER 0xF0 +#define ISSI_INTERRUPTSTATUSREGISTER 0xF1 + +#define ISSI_PAGE_LEDCONTROL 0x00 //PG0 +#define ISSI_PAGE_PWM 0x01 //PG1 +#define ISSI_PAGE_AUTOBREATH 0x02 //PG2 +#define ISSI_PAGE_FUNCTION 0x03 //PG3 + +#define ISSI_REG_CONFIGURATION 0x00 //PG3 +#define ISSI_REG_GLOBALCURRENT 0x01 //PG3 +#define ISSI_REG_RESET 0x11// PG3 +#define ISSI_REG_SWPULLUP 0x0F //PG3 +#define ISSI_REG_CSPULLUP 0x10 //PG3 + +#ifndef ISSI_TIMEOUT + #define ISSI_TIMEOUT 100 +#endif + +#ifndef ISSI_PERSISTENCE + #define ISSI_PERSISTENCE 0 +#endif + +// Transfer buffer for TWITransmitData() +uint8_t g_twi_transfer_buffer[20]; + +// These buffers match the IS31FL3736 PWM registers. +// The control buffers match the PG0 LED On/Off registers. +// Storing them like this is optimal for I2C transfers to the registers. +// We could optimize this and take out the unused registers from these +// buffers and the transfers in IS31FL3736_write_pwm_buffer() but it's +// probably not worth the extra complexity. +uint8_t g_pwm_buffer[DRIVER_COUNT][192]; +bool g_pwm_buffer_update_required = false; + +uint8_t g_led_control_registers[DRIVER_COUNT][24] = { { 0 }, { 0 } }; +bool g_led_control_registers_update_required = false; + +void IS31FL3736_write_register( uint8_t addr, uint8_t reg, uint8_t data ) +{ + g_twi_transfer_buffer[0] = reg; + g_twi_transfer_buffer[1] = data; + + #if ISSI_PERSISTENCE > 0 + for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { + if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) == 0) + break; + } + #else + i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT); + #endif +} + +void IS31FL3736_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ) +{ + // assumes PG1 is already selected + + // transmit PWM registers in 12 transfers of 16 bytes + // g_twi_transfer_buffer[] is 20 bytes + + // iterate over the pwm_buffer contents at 16 byte intervals + for ( int i = 0; i < 192; i += 16 ) { + g_twi_transfer_buffer[0] = i; + // copy the data from i to i+15 + // device will auto-increment register for data after the first byte + // thus this sets registers 0x00-0x0F, 0x10-0x1F, etc. in one transfer + for ( int j = 0; j < 16; j++ ) { + g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j]; + } + + #if ISSI_PERSISTENCE > 0 + for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) { + if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) == 0) + break; + } + #else + i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT); + #endif + } +} + +void IS31FL3736_init( uint8_t addr ) +{ + // In order to avoid the LEDs being driven with garbage data + // in the LED driver's PWM registers, shutdown is enabled last. + // Set up the mode and other settings, clear the PWM registers, + // then disable software shutdown. + + // Unlock the command register. + IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); + + // Select PG0 + IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL ); + // Turn off all LEDs. + for ( int i = 0x00; i <= 0x17; i++ ) + { + IS31FL3736_write_register( addr, i, 0x00 ); + } + + // Unlock the command register. + IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); + + // Select PG1 + IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM ); + // Set PWM on all LEDs to 0 + // No need to setup Breath registers to PWM as that is the default. + for ( int i = 0x00; i <= 0xBF; i++ ) + { + IS31FL3736_write_register( addr, i, 0x00 ); + } + + // Unlock the command register. + IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); + + // Select PG3 + IS31FL3736_write_register( addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION ); + // Set global current to maximum. + IS31FL3736_write_register( addr, ISSI_REG_GLOBALCURRENT, 0xFF ); + // Disable software shutdown. + IS31FL3736_write_register( addr, ISSI_REG_CONFIGURATION, 0x01 ); + + // Wait 10ms to ensure the device has woken up. + #ifdef __AVR__ + _delay_ms( 10 ); + #else + wait_ms(10); + #endif +} + +void IS31FL3736_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) +{ + if ( index >= 0 && index < DRIVER_LED_TOTAL ) { + is31_led led = g_is31_leds[index]; + + g_pwm_buffer[led.driver][led.r] = red; + g_pwm_buffer[led.driver][led.g] = green; + g_pwm_buffer[led.driver][led.b] = blue; + g_pwm_buffer_update_required = true; + } +} + +void IS31FL3736_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) +{ + for ( int i = 0; i < DRIVER_LED_TOTAL; i++ ) + { + IS31FL3736_set_color( i, red, green, blue ); + } +} + +void IS31FL3736_set_led_control_register( uint8_t index, bool red, bool green, bool blue ) +{ + is31_led led = g_is31_leds[index]; + + // IS31FL3733 + // The PWM register for a matrix position (0x00 to 0xBF) can be + // divided by 8 to get the LED control register (0x00 to 0x17), + // then mod 8 to get the bit position within that register. + + // IS31FL3736 + // The PWM register for a matrix position (0x00 to 0xBF) is interleaved, so: + // A1=0x00 A2=0x02 A3=0x04 A4=0x06 A5=0x08 A6=0x0A A7=0x0C A8=0x0E + // B1=0x10 B2=0x12 B3=0x14 + // But also, the LED control registers (0x00 to 0x17) are also interleaved, so: + // A1-A4=0x00 A5-A8=0x01 + // So, the same math applies. + + uint8_t control_register_r = led.r / 8; + uint8_t control_register_g = led.g / 8; + uint8_t control_register_b = led.b / 8; + + uint8_t bit_r = led.r % 8; + uint8_t bit_g = led.g % 8; + uint8_t bit_b = led.b % 8; + + if ( red ) { + g_led_control_registers[led.driver][control_register_r] |= (1 << bit_r); + } else { + g_led_control_registers[led.driver][control_register_r] &= ~(1 << bit_r); + } + if ( green ) { + g_led_control_registers[led.driver][control_register_g] |= (1 << bit_g); + } else { + g_led_control_registers[led.driver][control_register_g] &= ~(1 << bit_g); + } + if ( blue ) { + g_led_control_registers[led.driver][control_register_b] |= (1 << bit_b); + } else { + g_led_control_registers[led.driver][control_register_b] &= ~(1 << bit_b); + } + + g_led_control_registers_update_required = true; + +} + +void IS31FL3736_mono_set_brightness( int index, uint8_t value ) +{ + if ( index >= 0 && index < 96 ) { + // Index in range 0..95 -> A1..A8, B1..B8, etc. + // Map index 0..95 to registers 0x00..0xBE (interleaved) + uint8_t pwm_register = index * 2; + g_pwm_buffer[0][pwm_register] = value; + g_pwm_buffer_update_required = true; + } +} + +void IS31FL3736_mono_set_brightness_all( uint8_t value ) +{ + for ( int i = 0; i < 96; i++ ) + { + IS31FL3736_mono_set_brightness( i, value ); + } +} + +void IS31FL3736_mono_set_led_control_register( uint8_t index, bool enabled ) +{ + // Index in range 0..95 -> A1..A8, B1..B8, etc. + + // Map index 0..95 to registers 0x00..0xBE (interleaved) + uint8_t pwm_register = index * 2; + // Map register 0x00..0xBE (interleaved) into control register and bit + uint8_t control_register = pwm_register / 8; + uint8_t bit = pwm_register % 8; + + if ( enabled ) { + g_led_control_registers[0][control_register] |= (1 << bit); + } else { + g_led_control_registers[0][control_register] &= ~(1 << bit); + } + + g_led_control_registers_update_required = true; +} + +void IS31FL3736_update_pwm_buffers( uint8_t addr1, uint8_t addr2 ) +{ + if ( g_pwm_buffer_update_required ) + { + // Firstly we need to unlock the command register and select PG1 + IS31FL3736_write_register( addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); + IS31FL3736_write_register( addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM ); + + IS31FL3736_write_pwm_buffer( addr1, g_pwm_buffer[0] ); + //IS31FL3736_write_pwm_buffer( addr2, g_pwm_buffer[1] ); + } + g_pwm_buffer_update_required = false; +} + +void IS31FL3736_update_led_control_registers( uint8_t addr1, uint8_t addr2 ) +{ + if ( g_led_control_registers_update_required ) + { + // Firstly we need to unlock the command register and select PG0 + IS31FL3736_write_register( addr1, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5 ); + IS31FL3736_write_register( addr1, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL ); + for ( int i=0; i<24; i++ ) + { + IS31FL3736_write_register(addr1, i, g_led_control_registers[0][i] ); + //IS31FL3736_write_register(addr2, i, g_led_control_registers[1][i] ); + } + } +} + diff --git a/drivers/issi/is31fl3736.h b/drivers/issi/is31fl3736.h new file mode 100644 index 000000000000..cff50fd0d886 --- /dev/null +++ b/drivers/issi/is31fl3736.h @@ -0,0 +1,172 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 + +#include +#include + + +// Simple interface option. +// If these aren't defined, just define them to make it compile + + +#ifndef DRIVER_COUNT +#define DRIVER_COUNT 2 +#endif + +#ifndef DRIVER_LED_TOTAL +#define DRIVER_LED_TOTAL 96 +#endif + + +typedef struct is31_led { + uint8_t driver:2; + uint8_t r; + uint8_t g; + uint8_t b; +} __attribute__((packed)) is31_led; + +extern const is31_led g_is31_leds[DRIVER_LED_TOTAL]; + +void IS31FL3736_init( uint8_t addr ); +void IS31FL3736_write_register( uint8_t addr, uint8_t reg, uint8_t data ); +void IS31FL3736_write_pwm_buffer( uint8_t addr, uint8_t *pwm_buffer ); + +void IS31FL3736_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ); +void IS31FL3736_set_color_all( uint8_t red, uint8_t green, uint8_t blue ); + +void IS31FL3736_set_led_control_register( uint8_t index, bool red, bool green, bool blue ); + +void IS31FL3736_mono_set_brightness( int index, uint8_t value ); +void IS31FL3736_mono_set_brightness_all( uint8_t value ); +void IS31FL3736_mono_set_led_control_register( uint8_t index, bool enabled ); + +// This should not be called from an interrupt +// (eg. from a timer interrupt). +// Call this while idle (in between matrix scans). +// If the buffer is dirty, it will update the driver with the buffer. +void IS31FL3736_update_pwm_buffers( uint8_t addr1, uint8_t addr2 ); +void IS31FL3736_update_led_control_registers( uint8_t addr1, uint8_t addr2 ); + +#define A_1 0x00 +#define A_2 0x02 +#define A_3 0x04 +#define A_4 0x06 +#define A_5 0x08 +#define A_6 0x0A +#define A_7 0x0C +#define A_8 0x0E + +#define B_1 0x10 +#define B_2 0x12 +#define B_3 0x14 +#define B_4 0x16 +#define B_5 0x18 +#define B_6 0x1A +#define B_7 0x1C +#define B_8 0x1E + +#define C_1 0x20 +#define C_2 0x22 +#define C_3 0x24 +#define C_4 0x26 +#define C_5 0x28 +#define C_6 0x2A +#define C_7 0x2C +#define C_8 0x2E + +#define D_1 0x30 +#define D_2 0x32 +#define D_3 0x34 +#define D_4 0x36 +#define D_5 0x38 +#define D_6 0x3A +#define D_7 0x3C +#define D_8 0x3E + +#define E_1 0x40 +#define E_2 0x42 +#define E_3 0x44 +#define E_4 0x46 +#define E_5 0x48 +#define E_6 0x4A +#define E_7 0x4C +#define E_8 0x4E + +#define F_1 0x50 +#define F_2 0x52 +#define F_3 0x54 +#define F_4 0x56 +#define F_5 0x58 +#define F_6 0x5A +#define F_7 0x5C +#define F_8 0x5E + +#define G_1 0x60 +#define G_2 0x62 +#define G_3 0x64 +#define G_4 0x66 +#define G_5 0x68 +#define G_6 0x6A +#define G_7 0x6C +#define G_8 0x6E + +#define H_1 0x70 +#define H_2 0x72 +#define H_3 0x74 +#define H_4 0x76 +#define H_5 0x78 +#define H_6 0x7A +#define H_7 0x7C +#define H_8 0x7E + +#define I_1 0x80 +#define I_2 0x82 +#define I_3 0x84 +#define I_4 0x86 +#define I_5 0x88 +#define I_6 0x8A +#define I_7 0x8C +#define I_8 0x8E + +#define J_1 0x90 +#define J_2 0x92 +#define J_3 0x94 +#define J_4 0x96 +#define J_5 0x98 +#define J_6 0x9A +#define J_7 0x9C +#define J_8 0x9E + +#define K_1 0xA0 +#define K_2 0xA2 +#define K_3 0xA4 +#define K_4 0xA6 +#define K_5 0xA8 +#define K_6 0xAA +#define K_7 0xAC +#define K_8 0xAE + +#define L_1 0xB0 +#define L_2 0xB2 +#define L_3 0xB4 +#define L_4 0xB6 +#define L_5 0xB8 +#define L_6 0xBA +#define L_7 0xBC +#define L_8 0xBE + diff --git a/keyboards/rama/readme.md b/keyboards/rama/readme.md index 4625eb1ef508..c7ddf6d111d0 100644 --- a/keyboards/rama/readme.md +++ b/keyboards/rama/readme.md @@ -6,4 +6,6 @@ Firmware for keyboards designed by [RAMA WORKS](https://rama.works) [RAMA M60-A](https://rama.works/#/m60-a/) +[RAMA U80-A](https://rama.works/#/tkl-a/) + [RAMA M10-B](https://www.massdrop.com/buy/rama-m10-a?mode=guest_open) diff --git a/keyboards/rama/u80_a/config.h b/keyboards/rama/u80_a/config.h new file mode 100644 index 000000000000..bfd97282836d --- /dev/null +++ b/keyboards/rama/u80_a/config.h @@ -0,0 +1,187 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x5241 // "RW" +#define PRODUCT_ID 0x080A // 80-A +#define DEVICE_VER 0x0001 +#define MANUFACTURER RAMA.WORKS +#define PRODUCT RAMA U80-A +#define DESCRIPTION RAMA U80-A Keyboard + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 17 + +/* + * 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 { F1, F0, E6, F4, F6, F7 } +#define MATRIX_COL_PINS { F5, D5, B1, B2, B3, D3, D2, C7, C6, B6, B5, B4, D7, D6, D4, B7, B0 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION ROW2COL + +// #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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + diff --git a/keyboards/rama/u80_a/info.json b/keyboards/rama/u80_a/info.json new file mode 100644 index 000000000000..cb61c89b8810 --- /dev/null +++ b/keyboards/rama/u80_a/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "RAMA U80-A", + "url": "https://rama.works/#/tkl-a/", + "maintainer": "Wilba", + "bootloader": "atmel-dfu", + "width": 18.25, + "height": 6.5, + "layouts": { + "LAYOUT_all": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":2, "y":0}, {"label":"F2", "x":3, "y":0}, {"label":"F3", "x":4, "y":0}, {"label":"F4", "x":5, "y":0}, {"label":"F5", "x":6.5, "y":0}, {"label":"F6", "x":7.5, "y":0}, {"label":"F7", "x":8.5, "y":0}, {"label":"F8", "x":9.5, "y":0}, {"label":"F9", "x":11, "y":0}, {"label":"F10", "x":12, "y":0}, {"label":"F11", "x":13, "y":0}, {"label":"F12", "x":14, "y":0}, {"label":"PrtSc", "x":15.25, "y":0}, {"label":"Scroll Lock", "x":16.25, "y":0}, {"label":"Pause", "x":17.25, "y":0}, {"label":"~", "x":0, "y":1.5}, {"label":"!", "x":1, "y":1.5}, {"label":"@", "x":2, "y":1.5}, {"label":"#", "x":3, "y":1.5}, {"label":"$", "x":4, "y":1.5}, {"label":"%", "x":5, "y":1.5}, {"label":"^", "x":6, "y":1.5}, {"label":"&", "x":7, "y":1.5}, {"label":"*", "x":8, "y":1.5}, {"label":"(", "x":9, "y":1.5}, {"label":")", "x":10, "y":1.5}, {"label":"_", "x":11, "y":1.5}, {"label":"+", "x":12, "y":1.5}, {"label":"Backspace", "x":13, "y":1.5}, {"x":14, "y":1.5}, {"label":"Insert", "x":15.25, "y":1.5}, {"label":"Home", "x":16.25, "y":1.5}, {"label":"PgUp", "x":17.25, "y":1.5}, {"label":"Tab", "x":0, "y":2.5, "w":1.5}, {"label":"Q", "x":1.5, "y":2.5}, {"label":"W", "x":2.5, "y":2.5}, {"label":"E", "x":3.5, "y":2.5}, {"label":"R", "x":4.5, "y":2.5}, {"label":"T", "x":5.5, "y":2.5}, {"label":"Y", "x":6.5, "y":2.5}, {"label":"U", "x":7.5, "y":2.5}, {"label":"I", "x":8.5, "y":2.5}, {"label":"O", "x":9.5, "y":2.5}, {"label":"P", "x":10.5, "y":2.5}, {"label":"{", "x":11.5, "y":2.5}, {"label":"}", "x":12.5, "y":2.5}, {"label":"|", "x":13.5, "y":2.5, "w":1.5}, {"label":"Delete", "x":15.25, "y":2.5}, {"label":"End", "x":16.25, "y":2.5}, {"label":"PgDn", "x":17.25, "y":2.5}, {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, {"label":"A", "x":1.75, "y":3.5}, {"label":"S", "x":2.75, "y":3.5}, {"label":"D", "x":3.75, "y":3.5}, {"label":"F", "x":4.75, "y":3.5}, {"label":"G", "x":5.75, "y":3.5}, {"label":"H", "x":6.75, "y":3.5}, {"label":"J", "x":7.75, "y":3.5}, {"label":"K", "x":8.75, "y":3.5}, {"label":"L", "x":9.75, "y":3.5}, {"label":":", "x":10.75, "y":3.5}, {"label":"\"", "x":11.75, "y":3.5}, {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, {"label":"Shift", "x":0, "y":4.5, "w":2.25}, {"label":"Z", "x":2.25, "y":4.5}, {"label":"X", "x":3.25, "y":4.5}, {"label":"C", "x":4.25, "y":4.5}, {"label":"V", "x":5.25, "y":4.5}, {"label":"B", "x":6.25, "y":4.5}, {"label":"N", "x":7.25, "y":4.5}, {"label":"M", "x":8.25, "y":4.5}, {"label":"<", "x":9.25, "y":4.5}, {"label":">", "x":10.25, "y":4.5}, {"label":"?", "x":11.25, "y":4.5}, {"label":"Shift", "x":12.25, "y":4.5, "w":1.75}, {"x":14, "y":4.5}, {"label":"\u2191", "x":16.25, "y":4.5}, {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, {"label":"Win", "x":1.25, "y":5.5, "w":1.25}, {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, {"x":3.75, "y":5.5, "w":6.25}, {"label":"Alt", "x":10, "y":5.5, "w":1.25}, {"label":"Win", "x":11.25, "y":5.5, "w":1.25}, {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, {"label":"\u2190", "x":15.25, "y":5.5}, {"label":"\u2193", "x":16.25, "y":5.5}, {"label":"\u2192", "x":17.25, "y":5.5}] + } + } +} diff --git a/keyboards/rama/u80_a/keymaps/default/keymap.c b/keyboards/rama/u80_a/keymaps/default/keymap.c new file mode 100644 index 000000000000..cf9225e3e5ac --- /dev/null +++ b/keyboards/rama/u80_a/keymaps/default/keymap.c @@ -0,0 +1,22 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT_all( + 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_BSPC, KC_INS, KC_HOME, KC_PGUP, + 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_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_TRNS, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [1] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; + diff --git a/keyboards/rama/u80_a/readme.md b/keyboards/rama/u80_a/readme.md new file mode 100644 index 000000000000..c98d00cb6b4d --- /dev/null +++ b/keyboards/rama/u80_a/readme.md @@ -0,0 +1,15 @@ +# RAMA U80-A + +![RAMA U80-A](https://something.com/something.jpg) + +A TKL keyboard. [More info at RAMA WORKS](https://rama.works/#/tkl-a/) + +Keyboard Maintainer: [Wilba6582](https://github.com/Wilba6582) +Hardware Supported: RAMA U80-A PCB +Hardware Availability: [RAMA WORKS Store](https://ramaworks.store/) + +Make example for this keyboard (after setting up your build environment): + + make rama/u80_a:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). \ No newline at end of file diff --git a/keyboards/rama/u80_a/rules.mk b/keyboards/rama/u80_a/rules.mk new file mode 100644 index 000000000000..99224c247cdd --- /dev/null +++ b/keyboards/rama/u80_a/rules.mk @@ -0,0 +1,68 @@ +# project specific files +SRC = drivers/issi/is31fl3736.c \ + drivers/avr/i2c_master.c \ + keyboards/wilba_tech/wt_mono_backlight.c \ + keyboards/wilba_tech/wt_main.c + +# 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 +BOOTLOADER = atmel-dfu + + +# 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 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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches diff --git a/keyboards/rama/u80_a/u80_a.c b/keyboards/rama/u80_a/u80_a.c new file mode 100644 index 000000000000..ccff6d62c94b --- /dev/null +++ b/keyboards/rama/u80_a/u80_a.c @@ -0,0 +1,17 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +// Nothing to see here, move along... ;-) diff --git a/keyboards/rama/u80_a/u80_a.h b/keyboards/rama/u80_a/u80_a.h new file mode 100644 index 000000000000..26403ef3475a --- /dev/null +++ b/keyboards/rama/u80_a/u80_a.h @@ -0,0 +1,43 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 + +#include "quantum.h" + +#define ____ KC_NO + +// Right switch of split backspace is at 3,13 and is the only switch +// whose physical position doesn't match switch matrix position :-( +// However, it also makes no sense to view the physical as 18 columns, +// so the numbering goes 00 to 16. Deal with it. + +#define LAYOUT_all( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K313, K114, K115, K116, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, \ + K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K415, \ + K500, K501, K502, K506, K510, K511, K512, K513, K514, K515, K516 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, ____, K014, K015, K016 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, ____, ____, ____ }, \ + { K400, ____, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, ____, K415, ____ }, \ + { K500, K501, K502, ____, ____, ____, K506, ____, ____, ____, K510, K511, K512, K513, K514, K515, K516 } \ +} + diff --git a/keyboards/wilba_tech/wt60_a/config.h b/keyboards/wilba_tech/wt60_a/config.h new file mode 100644 index 000000000000..95f4c786e61d --- /dev/null +++ b/keyboards/wilba_tech/wt60_a/config.h @@ -0,0 +1,187 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x6582 // wilba.tech +#define PRODUCT_ID 0x060A // 60-A +#define DEVICE_VER 0x0001 +#define MANUFACTURER wilba.tech +#define PRODUCT wilba.tech WT60-A +#define DESCRIPTION wilba.tech WT60-A + +/* 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, E6, F4, F6, F7 } +#define MATRIX_COL_PINS { F5, D5, B1, B2, B3, D3, D2, C7, C6, B6, B5, B4, D7, D6 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION ROW2COL + +// #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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + diff --git a/keyboards/wilba_tech/wt60_a/info.json b/keyboards/wilba_tech/wt60_a/info.json new file mode 100644 index 000000000000..3b3614a8bf9d --- /dev/null +++ b/keyboards/wilba_tech/wt60_a/info.json @@ -0,0 +1,16 @@ +{ + "keyboard_name": "wilba.tech WT60-A", + "url": "https://wilba.tech", + "maintainer": "Wilba", + "bootloader": "atmel-dfu", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_60_ansi": { + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + }, + "LAYOUT_60_ansi_split_bs_rshift": { + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + } + } +} \ No newline at end of file diff --git a/keyboards/wilba_tech/wt60_a/keymaps/ansi_split_bs_rshift/keymap.c b/keyboards/wilba_tech/wt60_a/keymaps/ansi_split_bs_rshift/keymap.c new file mode 100644 index 000000000000..95e01fc2cac3 --- /dev/null +++ b/keyboards/wilba_tech/wt60_a/keymaps/ansi_split_bs_rshift/keymap.c @@ -0,0 +1,38 @@ +// ANSI split backspace/right shift layout for WT60-A +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +// Default layer +[0] = LAYOUT_60_ansi_split_bs_rshift( + 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_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_BSPC, + 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, MO(1), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL), + +// Fn1 Layer +[1] = LAYOUT_60_ansi_split_bs_rshift( + 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_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_EJCT, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn2 Layer +[2] = LAYOUT_60_ansi_split_bs_rshift( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn3 Layer +[3] = LAYOUT_60_ansi_split_bs_rshift( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; diff --git a/keyboards/wilba_tech/wt60_a/keymaps/default/keymap.c b/keyboards/wilba_tech/wt60_a/keymaps/default/keymap.c new file mode 100644 index 000000000000..566736f5e3bf --- /dev/null +++ b/keyboards/wilba_tech/wt60_a/keymaps/default/keymap.c @@ -0,0 +1,38 @@ +// Default layout for WT60-A +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +// Default layer +[0] = LAYOUT_60_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, MO(1), KC_RCTL), + +// Fn1 Layer +[1] = LAYOUT_60_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_CAPS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_END, KC_PGDN, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn2 Layer +[2] = LAYOUT_60_ansi( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +// Fn3 Layer +[3] = LAYOUT_60_ansi( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; diff --git a/keyboards/wilba_tech/wt60_a/readme.md b/keyboards/wilba_tech/wt60_a/readme.md new file mode 100644 index 000000000000..d7a73165d4a4 --- /dev/null +++ b/keyboards/wilba_tech/wt60_a/readme.md @@ -0,0 +1,15 @@ +# WILBA.TECH WT60-A + +![WILBA.TECH WT60-A](https://wilba.tech) + +WT60-A is a keyboard PCB supporting 60% layout. [More info at wilba.tech](https://wilba.tech/) + +Keyboard Maintainer: [Wilba6582](https://github.com/Wilba6582) +Hardware Supported: WILBA.TECH WT65-A +Hardware Availability: Custom keyboard group buys + +Make example for this keyboard (after setting up your build environment): + + make wilba_tech/wt60_a:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). \ No newline at end of file diff --git a/keyboards/wilba_tech/wt60_a/rules.mk b/keyboards/wilba_tech/wt60_a/rules.mk new file mode 100644 index 000000000000..99224c247cdd --- /dev/null +++ b/keyboards/wilba_tech/wt60_a/rules.mk @@ -0,0 +1,68 @@ +# project specific files +SRC = drivers/issi/is31fl3736.c \ + drivers/avr/i2c_master.c \ + keyboards/wilba_tech/wt_mono_backlight.c \ + keyboards/wilba_tech/wt_main.c + +# 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 +BOOTLOADER = atmel-dfu + + +# 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 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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches diff --git a/keyboards/wilba_tech/wt60_a/wt60_a.c b/keyboards/wilba_tech/wt60_a/wt60_a.c new file mode 100644 index 000000000000..ccff6d62c94b --- /dev/null +++ b/keyboards/wilba_tech/wt60_a/wt60_a.c @@ -0,0 +1,17 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +// Nothing to see here, move along... ;-) diff --git a/keyboards/wilba_tech/wt60_a/wt60_a.h b/keyboards/wilba_tech/wt60_a/wt60_a.h new file mode 100644 index 000000000000..8ac8d9216745 --- /dev/null +++ b/keyboards/wilba_tech/wt60_a/wt60_a.h @@ -0,0 +1,52 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 + +#include "quantum.h" + +#define ____ KC_NO + +#define LAYOUT_60_ansi_split_bs_rshift( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K213, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \ + K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \ + K400, K401, K402, K406, K410, K411, K412, K413 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \ + { K300, ____, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \ + { K400, K401, K402, ____, ____, ____, K406, ____, ____, ____, K410, K411, K412, K413 } \ +} + +#define LAYOUT_60_ansi( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \ + K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, \ + K400, K401, K402, K406, K410, K411, K412, K413 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, ____ }, \ + { K300, ____, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, ____ }, \ + { K400, K401, K402, ____, ____, ____, K406, ____, ____, ____, K410, K411, K412, K413 } \ +} + + + diff --git a/keyboards/wilba_tech/wt65_a/config.h b/keyboards/wilba_tech/wt65_a/config.h new file mode 100644 index 000000000000..fa919f186b55 --- /dev/null +++ b/keyboards/wilba_tech/wt65_a/config.h @@ -0,0 +1,187 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x6582 // wilba.tech +#define PRODUCT_ID 0x065A // 65-A +#define DEVICE_VER 0x0001 +#define MANUFACTURER wilba.tech +#define PRODUCT wilba.tech WT65-A +#define DESCRIPTION wilba.tech WT65-A + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 15 + +/* + * 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, E6, F4, F6, F7 } +#define MATRIX_COL_PINS { F5, D5, B1, B2, B3, D3, D2, C7, C6, B6, B5, B4, D7, D6, D4 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION ROW2COL + +// #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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + diff --git a/keyboards/wilba_tech/wt65_a/info.json b/keyboards/wilba_tech/wt65_a/info.json new file mode 100644 index 000000000000..f2b18dadd1b1 --- /dev/null +++ b/keyboards/wilba_tech/wt65_a/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "wilba.tech WT65-A", + "url": "https://wilba.tech", + "maintainer": "Wilba", + "bootloader": "atmel-dfu", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT_all": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"|", "x":13, "y":0}, {"label":"Del", "x":14, "y":0}, {"label":"Home", "x":15, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Backspace", "x":13.5, "y":1, "w":1.5}, {"label":"PgUp", "x":15, "y":1}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"PgDn", "x":15, "y":2}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"\u2191", "x":14, "y":3}, {"label":"End", "x":15, "y":3}, {"label":"Fn", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"\u2190", "x":13, "y":4}, {"label":"\u2193", "x":14, "y":4}, {"label":"\u2192", "x":15, "y":4}] + } + } +} \ No newline at end of file diff --git a/keyboards/wilba_tech/wt65_a/keymaps/default/keymap.c b/keyboards/wilba_tech/wt65_a/keymaps/default/keymap.c new file mode 100644 index 000000000000..c5ae81168097 --- /dev/null +++ b/keyboards/wilba_tech/wt65_a/keymaps/default/keymap.c @@ -0,0 +1,37 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + // Default layer + [0] = LAYOUT_all( + 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_HOME, + 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_PGUP, + 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_PGDN, + 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_END, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT), + + // Fn1 Layer + [1] = LAYOUT_all( + 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_CAPS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_END, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + // Fn2 Layer + [2] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + // Fn3 Layer + [3] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + diff --git a/keyboards/wilba_tech/wt65_a/readme.md b/keyboards/wilba_tech/wt65_a/readme.md new file mode 100644 index 000000000000..1551b55b57a4 --- /dev/null +++ b/keyboards/wilba_tech/wt65_a/readme.md @@ -0,0 +1,15 @@ +# WILBA.TECH WT65-A + +![WILBA.TECH WT65-A](https://wilba.tech) + +WT65-A is a keyboard PCB supporting 65% layout with 0.25U blocker. [More info at wilba.tech](https://wilba.tech/) + +Keyboard Maintainer: [Wilba6582](https://github.com/Wilba6582) +Hardware Supported: WILBA.TECH WT65-A +Hardware Availability: Custom keyboard group buys + +Make example for this keyboard (after setting up your build environment): + + make wilba_tech/wt65_a:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). \ No newline at end of file diff --git a/keyboards/wilba_tech/wt65_a/rules.mk b/keyboards/wilba_tech/wt65_a/rules.mk new file mode 100644 index 000000000000..99224c247cdd --- /dev/null +++ b/keyboards/wilba_tech/wt65_a/rules.mk @@ -0,0 +1,68 @@ +# project specific files +SRC = drivers/issi/is31fl3736.c \ + drivers/avr/i2c_master.c \ + keyboards/wilba_tech/wt_mono_backlight.c \ + keyboards/wilba_tech/wt_main.c + +# 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 +BOOTLOADER = atmel-dfu + + +# 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 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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches diff --git a/keyboards/wilba_tech/wt65_a/wt65_a.c b/keyboards/wilba_tech/wt65_a/wt65_a.c new file mode 100644 index 000000000000..ccff6d62c94b --- /dev/null +++ b/keyboards/wilba_tech/wt65_a/wt65_a.c @@ -0,0 +1,17 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +// Nothing to see here, move along... ;-) diff --git a/keyboards/wilba_tech/wt65_a/wt65_a.h b/keyboards/wilba_tech/wt65_a/wt65_a.h new file mode 100644 index 000000000000..9c3e6e12beb3 --- /dev/null +++ b/keyboards/wilba_tech/wt65_a/wt65_a.h @@ -0,0 +1,41 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 + +#include "quantum.h" + +#define ____ KC_NO + +// Right switch of split backspace is at 2,13 and is the only switch +// whose physical position doesn't match switch matrix position :-( +// However, it also makes no sense to view the physical as 16 columns, +// so the numbering goes 00 to 14. Deal with it. + +#define LAYOUT_all( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K213, K014, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, \ + K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \ + K400, K401, K402, K406, K410, K411, K412, K413, K414 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214 }, \ + { K300, ____, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \ + { K400, K401, K402, ____, ____, ____, K406, ____, ____, ____, K410, K411, K412, K413, K414 } \ +} + diff --git a/keyboards/wilba_tech/wt80_a/config.h b/keyboards/wilba_tech/wt80_a/config.h new file mode 100644 index 000000000000..9687cb6d680a --- /dev/null +++ b/keyboards/wilba_tech/wt80_a/config.h @@ -0,0 +1,187 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x6582 // wilba.tech +#define PRODUCT_ID 0x080A // 80-A +#define DEVICE_VER 0x0001 +#define MANUFACTURER wilba.tech +#define PRODUCT wilba.tech WT80-A +#define DESCRIPTION wilba.tech WT80-A + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 17 + +/* + * 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 { F1, F0, E6, F4, F6, F7 } +#define MATRIX_COL_PINS { F5, D5, B1, B2, B3, D3, D2, C7, C6, B6, B5, B4, D7, D6, D4, B7, B0 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION ROW2COL + +// #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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + diff --git a/keyboards/wilba_tech/wt80_a/info.json b/keyboards/wilba_tech/wt80_a/info.json new file mode 100644 index 000000000000..a43acb2f5a3e --- /dev/null +++ b/keyboards/wilba_tech/wt80_a/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "wilba.tech WT80-A", + "url": "https://wilba.tech", + "maintainer": "Wilba", + "bootloader": "atmel-dfu", + "width": 18.25, + "height": 6.5, + "layouts": { + "LAYOUT_all": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":2, "y":0}, {"label":"F2", "x":3, "y":0}, {"label":"F3", "x":4, "y":0}, {"label":"F4", "x":5, "y":0}, {"label":"F5", "x":6.5, "y":0}, {"label":"F6", "x":7.5, "y":0}, {"label":"F7", "x":8.5, "y":0}, {"label":"F8", "x":9.5, "y":0}, {"label":"F9", "x":11, "y":0}, {"label":"F10", "x":12, "y":0}, {"label":"F11", "x":13, "y":0}, {"label":"F12", "x":14, "y":0}, {"label":"PrtSc", "x":15.25, "y":0}, {"label":"Scroll Lock", "x":16.25, "y":0}, {"label":"Pause", "x":17.25, "y":0}, {"label":"~", "x":0, "y":1.5}, {"label":"!", "x":1, "y":1.5}, {"label":"@", "x":2, "y":1.5}, {"label":"#", "x":3, "y":1.5}, {"label":"$", "x":4, "y":1.5}, {"label":"%", "x":5, "y":1.5}, {"label":"^", "x":6, "y":1.5}, {"label":"&", "x":7, "y":1.5}, {"label":"*", "x":8, "y":1.5}, {"label":"(", "x":9, "y":1.5}, {"label":")", "x":10, "y":1.5}, {"label":"_", "x":11, "y":1.5}, {"label":"+", "x":12, "y":1.5}, {"label":"Backspace", "x":13, "y":1.5}, {"x":14, "y":1.5}, {"label":"Insert", "x":15.25, "y":1.5}, {"label":"Home", "x":16.25, "y":1.5}, {"label":"PgUp", "x":17.25, "y":1.5}, {"label":"Tab", "x":0, "y":2.5, "w":1.5}, {"label":"Q", "x":1.5, "y":2.5}, {"label":"W", "x":2.5, "y":2.5}, {"label":"E", "x":3.5, "y":2.5}, {"label":"R", "x":4.5, "y":2.5}, {"label":"T", "x":5.5, "y":2.5}, {"label":"Y", "x":6.5, "y":2.5}, {"label":"U", "x":7.5, "y":2.5}, {"label":"I", "x":8.5, "y":2.5}, {"label":"O", "x":9.5, "y":2.5}, {"label":"P", "x":10.5, "y":2.5}, {"label":"{", "x":11.5, "y":2.5}, {"label":"}", "x":12.5, "y":2.5}, {"label":"|", "x":13.5, "y":2.5, "w":1.5}, {"label":"Delete", "x":15.25, "y":2.5}, {"label":"End", "x":16.25, "y":2.5}, {"label":"PgDn", "x":17.25, "y":2.5}, {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, {"label":"A", "x":1.75, "y":3.5}, {"label":"S", "x":2.75, "y":3.5}, {"label":"D", "x":3.75, "y":3.5}, {"label":"F", "x":4.75, "y":3.5}, {"label":"G", "x":5.75, "y":3.5}, {"label":"H", "x":6.75, "y":3.5}, {"label":"J", "x":7.75, "y":3.5}, {"label":"K", "x":8.75, "y":3.5}, {"label":"L", "x":9.75, "y":3.5}, {"label":":", "x":10.75, "y":3.5}, {"label":"\"", "x":11.75, "y":3.5}, {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, {"label":"Shift", "x":0, "y":4.5, "w":2.25}, {"label":"Z", "x":2.25, "y":4.5}, {"label":"X", "x":3.25, "y":4.5}, {"label":"C", "x":4.25, "y":4.5}, {"label":"V", "x":5.25, "y":4.5}, {"label":"B", "x":6.25, "y":4.5}, {"label":"N", "x":7.25, "y":4.5}, {"label":"M", "x":8.25, "y":4.5}, {"label":"<", "x":9.25, "y":4.5}, {"label":">", "x":10.25, "y":4.5}, {"label":"?", "x":11.25, "y":4.5}, {"label":"Shift", "x":12.25, "y":4.5, "w":1.75}, {"x":14, "y":4.5}, {"label":"\u2191", "x":16.25, "y":4.5}, {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, {"label":"Win", "x":1.25, "y":5.5, "w":1.25}, {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, {"x":3.75, "y":5.5, "w":6.25}, {"label":"Alt", "x":10, "y":5.5, "w":1.25}, {"label":"Win", "x":11.25, "y":5.5, "w":1.25}, {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, {"label":"\u2190", "x":15.25, "y":5.5}, {"label":"\u2193", "x":16.25, "y":5.5}, {"label":"\u2192", "x":17.25, "y":5.5}] + } + } +} diff --git a/keyboards/wilba_tech/wt80_a/keymaps/default/keymap.c b/keyboards/wilba_tech/wt80_a/keymaps/default/keymap.c new file mode 100644 index 000000000000..cf9225e3e5ac --- /dev/null +++ b/keyboards/wilba_tech/wt80_a/keymaps/default/keymap.c @@ -0,0 +1,22 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT_all( + 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_BSPC, KC_INS, KC_HOME, KC_PGUP, + 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_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_TRNS, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [1] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; + diff --git a/keyboards/wilba_tech/wt80_a/readme.md b/keyboards/wilba_tech/wt80_a/readme.md new file mode 100644 index 000000000000..011805748f69 --- /dev/null +++ b/keyboards/wilba_tech/wt80_a/readme.md @@ -0,0 +1,15 @@ +# WILBA.TECH WT80-A + +![WILBA.TECH WT80-A](https://wilba./tech) + +WT80-A is a keyboard PCB supporting TKL layout with 0.25U gaps. [More info at wilba.tech](https://wilba.tech/) + +Keyboard Maintainer: [Wilba6582](https://github.com/Wilba6582) +Hardware Supported: WILBA.TECH WT80-A +Hardware Availability: Custom keyboard group buys + +Make example for this keyboard (after setting up your build environment): + + make wilba_tech/wt80_a:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). \ No newline at end of file diff --git a/keyboards/wilba_tech/wt80_a/rules.mk b/keyboards/wilba_tech/wt80_a/rules.mk new file mode 100644 index 000000000000..99224c247cdd --- /dev/null +++ b/keyboards/wilba_tech/wt80_a/rules.mk @@ -0,0 +1,68 @@ +# project specific files +SRC = drivers/issi/is31fl3736.c \ + drivers/avr/i2c_master.c \ + keyboards/wilba_tech/wt_mono_backlight.c \ + keyboards/wilba_tech/wt_main.c + +# 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 +BOOTLOADER = atmel-dfu + + +# 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 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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches diff --git a/keyboards/wilba_tech/wt80_a/wt80_a.c b/keyboards/wilba_tech/wt80_a/wt80_a.c new file mode 100644 index 000000000000..ccff6d62c94b --- /dev/null +++ b/keyboards/wilba_tech/wt80_a/wt80_a.c @@ -0,0 +1,17 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ + +// Nothing to see here, move along... ;-) diff --git a/keyboards/wilba_tech/wt80_a/wt80_a.h b/keyboards/wilba_tech/wt80_a/wt80_a.h new file mode 100644 index 000000000000..26403ef3475a --- /dev/null +++ b/keyboards/wilba_tech/wt80_a/wt80_a.h @@ -0,0 +1,43 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 + +#include "quantum.h" + +#define ____ KC_NO + +// Right switch of split backspace is at 3,13 and is the only switch +// whose physical position doesn't match switch matrix position :-( +// However, it also makes no sense to view the physical as 18 columns, +// so the numbering goes 00 to 16. Deal with it. + +#define LAYOUT_all( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K313, K114, K115, K116, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, \ + K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K415, \ + K500, K501, K502, K506, K510, K511, K512, K513, K514, K515, K516 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, ____, K014, K015, K016 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, ____, ____, ____ }, \ + { K400, ____, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, ____, K415, ____ }, \ + { K500, K501, K502, ____, ____, ____, K506, ____, ____, ____, K510, K511, K512, K513, K514, K515, K516 } \ +} + diff --git a/keyboards/wilba_tech/wt_main.c b/keyboards/wilba_tech/wt_main.c new file mode 100644 index 000000000000..f514dbefcda2 --- /dev/null +++ b/keyboards/wilba_tech/wt_main.c @@ -0,0 +1,55 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 "keyboards/wilba_tech/wt_mono_backlight.h" + +void bootmagic_lite(void) +{ + // The lite version of TMK's bootmagic. + // 100% less potential for accidentally making the + // keyboard do stupid things. + + // We need multiple scans because debouncing can't be turned off. + matrix_scan(); + wait_ms(DEBOUNCING_DELAY); + wait_ms(DEBOUNCING_DELAY); + matrix_scan(); + + // If the Esc (matrix 0,0) is held down on power up, + // reset the EEPROM valid state and jump to bootloader. + if ( matrix_get_row(0) & (1<<0) ) { + // Set the TMK/QMK EEPROM state as invalid. + eeconfig_disable(); + // Jump to bootloader. + bootloader_jump(); + } +} + +void matrix_init_kb(void) +{ + bootmagic_lite(); + backlight_init_drivers(); + backlight_timer_init(); + backlight_timer_enable(); + matrix_init_user(); +} + +void matrix_scan_kb(void) +{ + backlight_update_pwm_buffers(); + matrix_scan_user(); +} diff --git a/keyboards/wilba_tech/wt_mono_backlight.c b/keyboards/wilba_tech/wt_mono_backlight.c new file mode 100644 index 000000000000..bf485bce1f23 --- /dev/null +++ b/keyboards/wilba_tech/wt_mono_backlight.c @@ -0,0 +1,116 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 "wt_mono_backlight.h" +#include "drivers/avr/i2c_master.h" +#include "drivers/issi/is31fl3736.h" + +#include + +#define ISSI_ADDR_DEFAULT 0x50 + +bool g_suspend_state = false; + +// Global tick at 20 Hz +uint32_t g_tick = 0; +uint8_t g_config_effect_speed = 0; +uint8_t g_config_brightness = 255; + +void backlight_init_drivers(void) +{ + // Initialize I2C + i2c_init(); + IS31FL3736_init( ISSI_ADDR_DEFAULT ); + + for ( uint8_t index = 0; index < 96; index++ ) { + IS31FL3736_mono_set_led_control_register( index, true ); + } + IS31FL3736_update_led_control_registers( ISSI_ADDR_DEFAULT, 0x00 ); +} + + +// This is (F_CPU/1024) / 20 Hz +// = 15625 Hz / 20 Hz +// = 781 +#define TIMER3_TOP 781 + +void backlight_timer_init(void) +{ + static uint8_t backlight_timer_is_init = 0; + if ( backlight_timer_is_init ) { + return; + } + backlight_timer_is_init = 1; + + // Timer 3 setup + TCCR3B = _BV(WGM32) | // CTC mode OCR3A as TOP + _BV(CS32) | _BV(CS30); // prescale by /1024 + // Set TOP value + uint8_t sreg = SREG; + cli(); + + OCR3AH = (TIMER3_TOP >> 8) & 0xff; + OCR3AL = TIMER3_TOP & 0xff; + SREG = sreg; +} + +void backlight_timer_enable(void) +{ + TIMSK3 |= _BV(OCIE3A); +} + +void backlight_timer_disable(void) +{ + TIMSK3 &= ~_BV(OCIE3A); +} + +void backlight_set_suspend_state(bool state) +{ + g_suspend_state = state; +} + +void backlight_effect_cycle_all(void) +{ + uint8_t offset = ( g_tick << g_config_effect_speed ) & 0xFF; + + backlight_set_brightness_all( offset ); +} + +ISR(TIMER3_COMPA_vect) +{ + // delay 1 second before driving LEDs or doing anything else + static uint8_t startup_tick = 0; + if ( startup_tick < 20 ) { + startup_tick++; + return; + } + + g_tick++; + + //backlight_effect_cycle_all(); + backlight_set_brightness_all( 255 ); +} + +void backlight_update_pwm_buffers(void) +{ + IS31FL3736_update_pwm_buffers(ISSI_ADDR_DEFAULT,0x00); +} + +void backlight_set_brightness_all( uint8_t value ) +{ + IS31FL3736_mono_set_brightness_all( value ); +} + diff --git a/keyboards/wilba_tech/wt_mono_backlight.h b/keyboards/wilba_tech/wt_mono_backlight.h new file mode 100644 index 000000000000..70031bedc747 --- /dev/null +++ b/keyboards/wilba_tech/wt_mono_backlight.h @@ -0,0 +1,33 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 + +#include +#include + +void backlight_init_drivers(void); + +void backlight_timer_init(void); +void backlight_timer_enable(void); +void backlight_timer_disable(void); + +void backlight_set_suspend_state(bool state); + +void backlight_update_pwm_buffers(void); + +void backlight_set_brightness_all( uint8_t value ); + From 8b2591c707abe670dbd1ab21237870bc989d0614 Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Thu, 27 Sep 2018 19:47:26 +0100 Subject: [PATCH 055/505] Keymap: Clean-up of dshields keymaps. (#3983) --- keyboards/model01/keymaps/dshields/config.h | 3 -- keyboards/model01/keymaps/dshields/rules.mk | 3 +- keyboards/planck/keymaps/dshields/config.h | 15 +------ keyboards/planck/keymaps/dshields/keymap.c | 44 --------------------- 4 files changed, 2 insertions(+), 63 deletions(-) diff --git a/keyboards/model01/keymaps/dshields/config.h b/keyboards/model01/keymaps/dshields/config.h index 86a4dd531475..4d609e43684d 100644 --- a/keyboards/model01/keymaps/dshields/config.h +++ b/keyboards/model01/keymaps/dshields/config.h @@ -1,8 +1,5 @@ #pragma once -#define _______ KC_TRNS -#define XXXXXXX KC_NO - #define USB_MAX_POWER_CONSUMPTION 100 #define ONESHOT_TAP_TOGGLE 2 #define ONESHOT_TIMEOUT 3000 diff --git a/keyboards/model01/keymaps/dshields/rules.mk b/keyboards/model01/keymaps/dshields/rules.mk index 4d1abd88ad33..6c605daecf53 100644 --- a/keyboards/model01/keymaps/dshields/rules.mk +++ b/keyboards/model01/keymaps/dshields/rules.mk @@ -1,2 +1 @@ -# used by default keymap -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +MOUSEKEY_ENABLE = yes diff --git a/keyboards/planck/keymaps/dshields/config.h b/keyboards/planck/keymaps/dshields/config.h index 9ba854ef0452..b149530b8d0b 100644 --- a/keyboards/planck/keymaps/dshields/config.h +++ b/keyboards/planck/keymaps/dshields/config.h @@ -1,15 +1,4 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" - -#define QMK_ESC_OUTPUT F1 -#define QMK_ESC_INPUT D5 -#define QMK_LED E6 -#define QMK_SPEAKER C6 - -#define _______ KC_TRNS -#define XXXXXXX KC_NO +#pragma once #define USB_MAX_POWER_CONSUMPTION 100 #define ONESHOT_TAP_TOGGLE 2 @@ -39,5 +28,3 @@ // mod-tap keys #define MT_SPC SFT_T(KC_SPC) -#endif - diff --git a/keyboards/planck/keymaps/dshields/keymap.c b/keyboards/planck/keymaps/dshields/keymap.c index a39dc5e77685..11abaa6b071f 100644 --- a/keyboards/planck/keymaps/dshields/keymap.c +++ b/keyboards/planck/keymaps/dshields/keymap.c @@ -17,68 +17,24 @@ enum planck_keycodes { DYNAMIC_MACRO_RANGE = SAFE_RANGE }; #endif const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* Default - * ,-----------------------------------------------------------------------------------. - * | Q | W | E | R | T | Esc | Bksp | Y | U | I | O | P | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | A | S | D | F | G | Tab | Enter| H | J | K | L | ; | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Z | X | C | V | B | Shift|DmPlay| N | M | , | . | / | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | Super| Alt | Fun | Lower| Space | Raise| Left | Down | Up |Right | - * `-----------------------------------------------------------------------------------' - */ [DEF] = LAYOUT_planck_grid( KC_Q, KC_W, KC_E, KC_R, KC_T, KC_ESC, KC_BSPC, KC_Y, KC_U, KC_I, KC_O, KC_P , KC_A, KC_S, KC_D, KC_F, KC_G, KC_TAB, KC_ENT, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_Z, KC_X, KC_C, KC_V, KC_B, OSM_SFT, DM_PLAY, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, OSM_CTL, KC_LGUI, OSM_ALT, OSL_FUN, OSL_LWR, MT_SPC, MT_SPC, OSL_RSE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), - /* Lower - * ,-----------------------------------------------------------------------------------. - * | ! | @ | # | $ | % | | | ^ | & | * | ( | ) | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | ~ | | | | | | | _ | + | | { | } | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | " | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Home | PgDn | PgUp | End | - * `-----------------------------------------------------------------------------------' - */ [LWR] = LAYOUT_planck_grid( KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______, _______, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_TILD, _______, _______, _______, _______, _______, _______, KC_UNDS, KC_PLUS, _______, KC_LCBR, KC_RCBR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DQUO, KC_PIPE, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END ), - /* Raise - * ,-----------------------------------------------------------------------------------. - * | 1 | 2 | 3 | 4 | 5 | | | 6 | 7 | 8 | 9 | 0 | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | ` | | | | | | | - | = | | [ | ] | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | ' | \ | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Home | PgDn | PgUp | End | - * `-----------------------------------------------------------------------------------' - */ [RSE] = LAYOUT_planck_grid( KC_1, KC_2, KC_3, KC_4, KC_5, _______, _______, KC_6, KC_7, KC_8, KC_9, KC_0 , KC_GRV, _______, _______, _______, _______, _______, _______, KC_MINS, KC_EQL, _______, KC_LBRC, KC_RBRC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_QUOT, KC_BSLS, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END ), - /* Function - * ,-----------------------------------------------------------------------------------. - * | F1 | F2 | F3 | F4 | F5 | Reset|Delete| F6 | F7 | F8 | F9 | F10 | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | F11 | F12 | F13 | F14 | F15 | | | |MsWhLt|MsWhDn|MsWhUp|MsWhRt| - * |------+------+------+------+------+------|------+------+------+------+------+------| - * |BlTggl|BlStep| | | |DmStrt|DmStop| | |MsBtn1|MsBtn2|MsBtn3| - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | |MsLeft|MsDown| MsUp |MsRght| - * `-----------------------------------------------------------------------------------' - */ [FUN] = LAYOUT_planck_grid( KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, RESET, KC_DEL, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 , KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, From 8ef747accf6e59ff50a3dde1cb34f56e4edce9fe Mon Sep 17 00:00:00 2001 From: skullydazed Date: Thu, 27 Sep 2018 13:32:01 -0700 Subject: [PATCH 056/505] Treat too-large firmwares as an error, not a warning (#3956) * Treat too-large firmwares as an error, not a warning * switch the order of printing * I think I have it * adjust the formatting some more --- message.mk | 6 +++--- tmk_core/rules.mk | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/message.mk b/message.mk index 427925dac13a..6894dd8cb504 100644 --- a/message.mk +++ b/message.mk @@ -77,6 +77,6 @@ endef MSG_MAKE_TEST = $(eval $(call GENERATE_MSG_MAKE_TEST))$(MSG_MAKE_TEST_ACTUAL) MSG_TEST = Testing $(BOLD)$(TEST_NAME)$(NO_COLOR) MSG_CHECK_FILESIZE = Checking file size of $(TARGET).hex -MSG_FILE_TOO_BIG = $(ERROR_COLOR)Your file is too big!$(NO_COLOR) $(CURRENT_SIZE)/$(MAX_SIZE) ($(OVER_SIZE) over)\n -MSG_FILE_TOO_SMALL = Your file is too small! $(CURRENT_SIZE)/$(MAX_SIZE)\n -MSG_FILE_JUST_RIGHT = File size is fine - $(CURRENT_SIZE)/$(MAX_SIZE) ($(FREE_SIZE) free)\n +MSG_FILE_TOO_BIG = $(ERROR_COLOR)The firmware is too large!$(NO_COLOR) $(CURRENT_SIZE)/$(MAX_SIZE) ($(OVER_SIZE) bytes over)\n +MSG_FILE_TOO_SMALL = The firmware is too small! $(CURRENT_SIZE)/$(MAX_SIZE)\n +MSG_FILE_JUST_RIGHT = The firmware size is fine - $(CURRENT_SIZE)/$(MAX_SIZE) ($(FREE_SIZE) bytes free)\n diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index 5b1858b71869..f1ef733f6904 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -378,7 +378,7 @@ check-size: $(eval OVER_SIZE=$(shell expr $(CURRENT_SIZE) - $(MAX_SIZE))) if [ $(MAX_SIZE) -gt 0 ] && [ $(CURRENT_SIZE) -gt 0 ]; then \ $(SILENT) || printf "$(MSG_CHECK_FILESIZE)" | $(AWK_CMD); \ - if [ $(CURRENT_SIZE) -gt $(MAX_SIZE) ]; then $(PRINT_WARNING_PLAIN); $(SILENT) || printf " * $(MSG_FILE_TOO_BIG)" ; else $(PRINT_OK); $(SILENT) || printf " * $(MSG_FILE_JUST_RIGHT)"; fi \ + if [ $(CURRENT_SIZE) -gt $(MAX_SIZE) ]; then printf "\n * $(MSG_FILE_TOO_BIG)"; $(PRINT_ERROR_PLAIN); else $(PRINT_OK); $(SILENT) || printf " * $(MSG_FILE_JUST_RIGHT)"; fi \ fi else check-size: From a65085a89354e89ddd3517aa63c74ef6dd32ca8b Mon Sep 17 00:00:00 2001 From: Pekaso Date: Fri, 28 Sep 2018 10:06:19 +0900 Subject: [PATCH 057/505] Keyboard: [Fortitude60] LED fix and Serial improvement (#3982) * arrangement Underglow * modified serial function references from helix * Remove defines (ws2812_*REG) --- keyboards/fortitude60/config.h | 1 + .../fortitude60/keymaps/default/config.h | 1 - .../fortitude60/keymaps/default/keymap.c | 4 +- .../fortitude60/keymaps/default/rules.mk | 1 + keyboards/fortitude60/rev1/config.h | 11 +- keyboards/fortitude60/rev1/rules.mk | 1 - keyboards/fortitude60/serial.c | 451 +++++++++++++----- keyboards/fortitude60/serial.h | 86 +++- keyboards/fortitude60/serial_config.h | 14 + 9 files changed, 420 insertions(+), 150 deletions(-) create mode 100644 keyboards/fortitude60/serial_config.h diff --git a/keyboards/fortitude60/config.h b/keyboards/fortitude60/config.h index 863722d7d04d..27a44ab9286c 100644 --- a/keyboards/fortitude60/config.h +++ b/keyboards/fortitude60/config.h @@ -19,5 +19,6 @@ along with this program. If not, see . #define CONFIG_H #include "config_common.h" +#include #endif // CONFIG_H diff --git a/keyboards/fortitude60/keymaps/default/config.h b/keyboards/fortitude60/keymaps/default/config.h index b356791fc8cd..17483734816c 100644 --- a/keyboards/fortitude60/keymaps/default/config.h +++ b/keyboards/fortitude60/keymaps/default/config.h @@ -28,7 +28,6 @@ along with this program. If not, see . // #define MASTER_RIGHT #define EE_HANDS -#define USE_SERIAL_PD2 /* #undef RGBLED_NUM */ /* #define RGBLIGHT_ANIMATIONS */ /* #define RGBLED_NUM 12 */ diff --git a/keyboards/fortitude60/keymaps/default/keymap.c b/keyboards/fortitude60/keymaps/default/keymap.c index 18d2527e452f..9d724a8ec63d 100644 --- a/keyboards/fortitude60/keymaps/default/keymap.c +++ b/keyboards/fortitude60/keymaps/default/keymap.c @@ -119,9 +119,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------. ,-----------------------------------------. * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | * |------+------+------+------+------+------. ,------+------+------+------+------+------| - * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | + * | ` | 1 | ↑ | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | * |------+------+------+------+------+------. ,------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | | | + * | Del | ← | ↓ | → | F4 | F5 | | F6 | - | = | [ | ] | | | * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| * | | F7 | F8 | F9 | F10 | F11 | | | F12 |ISO # |ISO / | | | | * `-------------+------+------+------+------+------+------+------+------+------+------+-------------' diff --git a/keyboards/fortitude60/keymaps/default/rules.mk b/keyboards/fortitude60/keymaps/default/rules.mk index e0ed6f0c2d6f..1964bd0a7c25 100644 --- a/keyboards/fortitude60/keymaps/default/rules.mk +++ b/keyboards/fortitude60/keymaps/default/rules.mk @@ -1 +1,2 @@ RGBLIGHT_ENABLE = no +BACKLIGHT_ENABLE = no \ No newline at end of file diff --git a/keyboards/fortitude60/rev1/config.h b/keyboards/fortitude60/rev1/config.h index 4ba195ff8ea8..8c6f21afe67b 100644 --- a/keyboards/fortitude60/rev1/config.h +++ b/keyboards/fortitude60/rev1/config.h @@ -64,12 +64,11 @@ along with this program. If not, see . ) /* 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 */ - +#ifdef RGBLIGHT_ENABLE + #define RGB_DI_PIN B5 + #define RGBLIGHT_TIMER + #define RGBLED_NUM 18 // Number of LEDs */ +#endif /* * Feature disable options * These options are also useful to firmware size reduction. diff --git a/keyboards/fortitude60/rev1/rules.mk b/keyboards/fortitude60/rev1/rules.mk index bd518d8f273f..e69de29bb2d1 100644 --- a/keyboards/fortitude60/rev1/rules.mk +++ b/keyboards/fortitude60/rev1/rules.mk @@ -1 +0,0 @@ -BACKLIGHT_ENABLE = yes diff --git a/keyboards/fortitude60/serial.c b/keyboards/fortitude60/serial.c index 46dfad021d7f..cea1a5f6caab 100644 --- a/keyboards/fortitude60/serial.c +++ b/keyboards/fortitude60/serial.c @@ -9,34 +9,128 @@ #include #include #include +#include #include #include "serial.h" +//#include + +#ifdef USE_SERIAL + +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; + #endif + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; + #endif + uint8_t volatile status0 = 0; + +SSTD_t transactions[] = { + { (uint8_t *)&status0, + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer, + #else + 0, (uint8_t *)NULL, + #endif + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer + #else + 0, (uint8_t *)NULL, + #endif + } +}; + +void serial_master_init(void) +{ soft_serial_initiator_init(transactions); } -#ifndef USE_I2C +void serial_slave_init(void) +{ soft_serial_target_init(transactions); } -// Serial pulse period in microseconds. Its probably a bad idea to lower this -// value. -#define SERIAL_DELAY 24 +// 0 => no error +// 1 => slave did not respond +// 2 => checksum error +int serial_update_buffers() +{ return soft_serial_transaction(); } + +#endif // Simple API (OLD API, compatible with let's split serial.c) + +#define ALWAYS_INLINE __attribute__((always_inline)) +#define NO_INLINE __attribute__((noinline)) +#define _delay_sub_us(x) __builtin_avr_delay_cycles(x) + +// Serial pulse period in microseconds. +#define TID_SEND_ADJUST 14 + +#define SELECT_SERIAL_SPEED 1 +#if SELECT_SERIAL_SPEED == 0 + // Very High speed + #define SERIAL_DELAY 4 // micro sec + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 1 + // High speed + #define SERIAL_DELAY 6 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 2 + // Middle speed + #define SERIAL_DELAY 12 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 3 + // Low speed + #define SERIAL_DELAY 24 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#elif SELECT_SERIAL_SPEED == 4 + // Very Low speed + #define SERIAL_DELAY 50 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles +#else +#error Illegal Serial Speed +#endif -uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; -uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; -#define SLAVE_DATA_CORRUPT (1<<0) -volatile uint8_t status = 0; +#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) +#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) + +#define SLAVE_INT_WIDTH_US 1 +#ifndef SERIAL_USE_MULTI_TRANSACTION + #define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY +#else + #define SLAVE_INT_ACK_WIDTH_UNIT 2 + #define SLAVE_INT_ACK_WIDTH 4 +#endif + +static SSTD_t *Transaction_table = NULL; inline static void serial_delay(void) { _delay_us(SERIAL_DELAY); } +inline static +void serial_delay_half1(void) { + _delay_us(SERIAL_DELAY_HALF1); +} + +inline static +void serial_delay_half2(void) { + _delay_us(SERIAL_DELAY_HALF2); +} + +inline static void serial_output(void) ALWAYS_INLINE; inline static void serial_output(void) { SERIAL_PIN_DDR |= SERIAL_PIN_MASK; } // make the serial pin an input with pull-up resistor +inline static void serial_input_with_pullup(void) ALWAYS_INLINE; inline static -void serial_input(void) { +void serial_input_with_pullup(void) { SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK; SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } @@ -46,190 +140,305 @@ uint8_t serial_read_pin(void) { return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); } +inline static void serial_low(void) ALWAYS_INLINE; inline static void serial_low(void) { SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; } +inline static void serial_high(void) ALWAYS_INLINE; inline static void serial_high(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } -void serial_master_init(void) { - serial_output(); - serial_high(); +void soft_serial_initiator_init(SSTD_t *sstd_table) +{ + Transaction_table = sstd_table; + serial_output(); + serial_high(); } -void serial_slave_init(void) { - serial_input(); - -#ifndef USE_SERIAL_PD2 - // Enable INT0 - EIMSK |= _BV(INT0); - // Trigger on falling edge of INT0 - EICRA &= ~(_BV(ISC00) | _BV(ISC01)); +void soft_serial_target_init(SSTD_t *sstd_table) +{ + Transaction_table = sstd_table; + serial_input_with_pullup(); + +#if SERIAL_PIN_MASK == _BV(PD0) + // Enable INT0 + EIMSK |= _BV(INT0); + // Trigger on falling edge of INT0 + EICRA &= ~(_BV(ISC00) | _BV(ISC01)); +#elif SERIAL_PIN_MASK == _BV(PD2) + // Enable INT2 + EIMSK |= _BV(INT2); + // Trigger on falling edge of INT2 + EICRA &= ~(_BV(ISC20) | _BV(ISC21)); #else - // Enable INT2 - EIMSK |= _BV(INT2); - // Trigger on falling edge of INT2 - EICRA &= ~(_BV(ISC20) | _BV(ISC21)); + #error unknown SERIAL_PIN_MASK value #endif } -// Used by the master to synchronize timing with the slave. +// Used by the sender to synchronize timing with the reciver. +static void sync_recv(void) NO_INLINE; static void sync_recv(void) { - serial_input(); - // This shouldn't hang if the slave disconnects because the - // serial line will float to high if the slave does disconnect. + for (uint8_t i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) { + } + // This shouldn't hang if the target disconnects because the + // serial line will float to high if the target does disconnect. while (!serial_read_pin()); - serial_delay(); } -// Used by the slave to send a synchronization signal to the master. +// Used by the reciver to send a synchronization signal to the sender. +static void sync_send(void)NO_INLINE; static void sync_send(void) { - serial_output(); - serial_low(); serial_delay(); - serial_high(); } // Reads a byte from the serial line -static -uint8_t serial_read_byte(void) { - uint8_t byte = 0; - serial_input(); - for ( uint8_t i = 0; i < 8; ++i) { - byte = (byte << 1) | serial_read_pin(); - serial_delay(); - _delay_us(1); +static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) NO_INLINE; +static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { + uint8_t byte, i, p, pb; + + _delay_sub_us(READ_WRITE_START_ADJUST); + for( i = 0, byte = 0, p = 0; i < bit; i++ ) { + serial_delay_half1(); // read the middle of pulses + if( serial_read_pin() ) { + byte = (byte << 1) | 1; p ^= 1; + } else { + byte = (byte << 1) | 0; p ^= 0; + } + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); + serial_delay_half2(); } + /* recive parity bit */ + serial_delay_half1(); // read the middle of pulses + pb = serial_read_pin(); + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); + serial_delay_half2(); + + *pterrcount += (p != pb)? 1 : 0; return byte; } // Sends a byte with MSB ordering -static -void serial_write_byte(uint8_t data) { - uint8_t b = 8; - serial_output(); - while( b-- ) { - if(data & (1 << b)) { - serial_high(); - } else { - serial_low(); +void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE; +void serial_write_chunk(uint8_t data, uint8_t bit) { + uint8_t b, p; + for( p = 0, b = 1<<(bit-1); b ; b >>= 1) { + if(data & b) { + serial_high(); p ^= 1; + } else { + serial_low(); p ^= 0; + } + serial_delay(); } + /* send parity bit */ + if(p & 1) { serial_high(); } + else { serial_low(); } serial_delay(); - } -} -// interrupt handle to be used by the slave device -ISR(SERIAL_PIN_INTERRUPT) { - sync_send(); + serial_low(); // sync_send() / senc_recv() need raise edge +} - uint8_t checksum = 0; - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_slave_buffer[i]); +static void serial_send_packet(uint8_t *buffer, uint8_t size) NO_INLINE; +static +void serial_send_packet(uint8_t *buffer, uint8_t size) { + for (uint8_t i = 0; i < size; ++i) { + uint8_t data; + data = buffer[i]; sync_send(); - checksum += serial_slave_buffer[i]; + serial_write_chunk(data,8); } - serial_write_byte(checksum); - sync_send(); +} - // wait for the sync to finish sending - serial_delay(); +static uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) NO_INLINE; +static +uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) { + uint8_t pecount = 0; + for (uint8_t i = 0; i < size; ++i) { + uint8_t data; + sync_recv(); + data = serial_read_chunk(&pecount, 8); + buffer[i] = data; + } + return pecount == 0; +} - // read the middle of pulses - _delay_us(SERIAL_DELAY/2); +inline static +void change_sender2reciver(void) { + sync_send(); //0 + serial_delay_half1(); //1 + serial_low(); //2 + serial_input_with_pullup(); //2 + serial_delay_half1(); //3 +} - uint8_t checksum_computed = 0; - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_master_buffer[i] = serial_read_byte(); - sync_send(); - checksum_computed += serial_master_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_send(); +inline static +void change_reciver2sender(void) { + sync_recv(); //0 + serial_delay(); //1 + serial_low(); //3 + serial_output(); //3 + serial_delay_half1(); //4 +} - serial_input(); // end transaction +// interrupt handle to be used by the target device +ISR(SERIAL_PIN_INTERRUPT) { - if ( checksum_computed != checksum_received ) { - status |= SLAVE_DATA_CORRUPT; +#ifndef SERIAL_USE_MULTI_TRANSACTION + serial_low(); + serial_output(); + SSTD_t *trans = Transaction_table; +#else + // recive transaction table index + uint8_t tid; + uint8_t pecount = 0; + sync_recv(); + tid = serial_read_chunk(&pecount,4); + if(pecount> 0) + return; + serial_delay_half1(); + + serial_high(); // response step1 low->high + serial_output(); + _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT*SLAVE_INT_ACK_WIDTH); + SSTD_t *trans = &Transaction_table[tid]; + serial_low(); // response step2 ack high->low +#endif + + // target send phase + if( trans->target2initiator_buffer_size > 0 ) + serial_send_packet((uint8_t *)trans->target2initiator_buffer, + trans->target2initiator_buffer_size); + // target switch to input + change_sender2reciver(); + + // target recive phase + if( trans->initiator2target_buffer_size > 0 ) { + if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer, + trans->initiator2target_buffer_size) ) { + *trans->status = TRANSACTION_ACCEPTED; + } else { + *trans->status = TRANSACTION_DATA_ERROR; + } } else { - status &= ~SLAVE_DATA_CORRUPT; + *trans->status = TRANSACTION_ACCEPTED; } -} -inline -bool serial_slave_DATA_CORRUPT(void) { - return status & SLAVE_DATA_CORRUPT; + sync_recv(); //weit initiator output to high } -// Copies the serial_slave_buffer to the master and sends the -// serial_master_buffer to the slave. +///////// +// start transaction by initiator +// +// int soft_serial_transaction(int sstd_index) // // Returns: -// 0 => no error -// 1 => slave did not respond -int serial_update_buffers(void) { - // this code is very time dependent, so we need to disable interrupts +// TRANSACTION_END +// TRANSACTION_NO_RESPONSE +// TRANSACTION_DATA_ERROR +// this code is very time dependent, so we need to disable interrupts +#ifndef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_transaction(void) { + SSTD_t *trans = Transaction_table; +#else +int soft_serial_transaction(int sstd_index) { + SSTD_t *trans = &Transaction_table[sstd_index]; +#endif cli(); - // signal to the slave that we want to start a transaction + // signal to the target that we want to start a transaction serial_output(); serial_low(); - _delay_us(1); + _delay_us(SLAVE_INT_WIDTH_US); - // wait for the slaves response - serial_input(); - serial_high(); - _delay_us(SERIAL_DELAY); +#ifndef SERIAL_USE_MULTI_TRANSACTION + // wait for the target response + serial_input_with_pullup(); + _delay_us(SLAVE_INT_RESPONSE_TIME); - // check if the slave is present + // check if the target is present if (serial_read_pin()) { - // slave failed to pull the line low, assume not present + // target failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; sei(); - return 1; + return TRANSACTION_NO_RESPONSE; } - // if the slave is present syncronize with it - sync_recv(); - - uint8_t checksum_computed = 0; - // receive data from the slave - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_slave_buffer[i] = serial_read_byte(); - sync_recv(); - checksum_computed += serial_slave_buffer[i]; +#else + // send transaction table index + sync_send(); + _delay_sub_us(TID_SEND_ADJUST); + serial_write_chunk(sstd_index, 4); + serial_delay_half1(); + + // wait for the target response (step1 low->high) + serial_input_with_pullup(); + while( !serial_read_pin() ) { + _delay_sub_us(2); } - uint8_t checksum_received = serial_read_byte(); - sync_recv(); - if (checksum_computed != checksum_received) { - sei(); - return 2; + // check if the target is present (step2 high->low) + for( int i = 0; serial_read_pin(); i++ ) { + if (i > SLAVE_INT_ACK_WIDTH + 1) { + // slave failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; + sei(); + return TRANSACTION_NO_RESPONSE; + } + _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT); } +#endif - uint8_t checksum = 0; - // send data to the slave - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_master_buffer[i]); - sync_recv(); - checksum += serial_master_buffer[i]; + // initiator recive phase + // if the target is present syncronize with it + if( trans->target2initiator_buffer_size > 0 ) { + if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer, + trans->target2initiator_buffer_size) ) { + serial_output(); + serial_high(); + *trans->status = TRANSACTION_DATA_ERROR; + sei(); + return TRANSACTION_DATA_ERROR; + } + } + + // initiator switch to output + change_reciver2sender(); + + // initiator send phase + if( trans->initiator2target_buffer_size > 0 ) { + serial_send_packet((uint8_t *)trans->initiator2target_buffer, + trans->initiator2target_buffer_size); } - serial_write_byte(checksum); - sync_recv(); // always, release the line when not in use - serial_output(); - serial_high(); + sync_send(); + *trans->status = TRANSACTION_END; sei(); - return 0; + return TRANSACTION_END; } +#ifdef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_get_and_clean_status(int sstd_index) { + SSTD_t *trans = &Transaction_table[sstd_index]; + cli(); + int retval = *trans->status; + *trans->status = 0;; + sei(); + return retval; +} #endif + +#endif \ No newline at end of file diff --git a/keyboards/fortitude60/serial.h b/keyboards/fortitude60/serial.h index 361f1881b675..d008980556ce 100644 --- a/keyboards/fortitude60/serial.h +++ b/keyboards/fortitude60/serial.h @@ -1,32 +1,80 @@ -#ifndef MY_SERIAL_H -#define MY_SERIAL_H +#ifndef SOFT_SERIAL_H +#define SOFT_SERIAL_H -#include "config.h" #include -/* TODO: some defines for interrupt setup */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND +// ///////////////////////////////////////////////////////////////// +// Need Soft Serial defines in serial_config.h +// ///////////////////////////////////////////////////////////////// +// ex. +// #define SERIAL_PIN_DDR DDRD +// #define SERIAL_PIN_PORT PORTD +// #define SERIAL_PIN_INPUT PIND +// #define SERIAL_PIN_MASK _BV(PD?) ?=0,2 +// #define SERIAL_PIN_INTERRUPT INT?_vect ?=0,2 +// +// //// USE Simple API (OLD API, compatible with let's split serial.c) +// ex. +// #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +// #define SERIAL_MASTER_BUFFER_LENGTH 1 +// +// //// USE flexible API (using multi-type transaction function) +// #define SERIAL_USE_MULTI_TRANSACTION +// +// ///////////////////////////////////////////////////////////////// -#ifndef USE_SERIAL_PD2 -#define SERIAL_PIN_MASK _BV(PD0) -#define SERIAL_PIN_INTERRUPT INT0_vect -#else -#define SERIAL_PIN_MASK _BV(PD2) -#define SERIAL_PIN_INTERRUPT INT2_vect -#endif - -#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -#define SERIAL_MASTER_BUFFER_LENGTH 1 -// Buffers for master - slave communication +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ +#if SERIAL_SLAVE_BUFFER_LENGTH > 0 extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; +#endif +#if SERIAL_MASTER_BUFFER_LENGTH > 0 extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; +#endif void serial_master_init(void); void serial_slave_init(void); int serial_update_buffers(void); -bool serial_slave_data_corrupt(void); +#endif // USE Simple API + +// Soft Serial Transaction Descriptor +typedef struct _SSTD_t { + uint8_t *status; + uint8_t initiator2target_buffer_size; + uint8_t *initiator2target_buffer; + uint8_t target2initiator_buffer_size; + uint8_t *target2initiator_buffer; +} SSTD_t; + +// initiator is transaction start side +void soft_serial_initiator_init(SSTD_t *sstd_table); +// target is interrupt accept side +void soft_serial_target_init(SSTD_t *sstd_table); + +// initiator resullt +#define TRANSACTION_END 0 +#define TRANSACTION_NO_RESPONSE 0x1 +#define TRANSACTION_DATA_ERROR 0x2 +#ifndef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_transaction(void); +#else +int soft_serial_transaction(int sstd_index); #endif + +// target status +// *SSTD_t.status has +// initiator: +// TRANSACTION_END +// or TRANSACTION_NO_RESPONSE +// or TRANSACTION_DATA_ERROR +// target: +// TRANSACTION_DATA_ERROR +// or TRANSACTION_ACCEPTED +#define TRANSACTION_ACCEPTED 0x4 +#ifdef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_get_and_clean_status(int sstd_index); +#endif + +#endif /* SOFT_SERIAL_H */ \ No newline at end of file diff --git a/keyboards/fortitude60/serial_config.h b/keyboards/fortitude60/serial_config.h new file mode 100644 index 000000000000..96a54afbd801 --- /dev/null +++ b/keyboards/fortitude60/serial_config.h @@ -0,0 +1,14 @@ +#ifndef SOFT_SERIAL_CONFIG_H +#define SOFT_SERIAL_CONFIG_H + +/* Soft Serial defines */ +#define SERIAL_PIN_DDR DDRD +#define SERIAL_PIN_PORT PORTD +#define SERIAL_PIN_INPUT PIND +#define SERIAL_PIN_MASK _BV(PD2) +#define SERIAL_PIN_INTERRUPT INT2_vect + +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH 1 + +#endif /* SOFT_SERIAL_CONFIG_H */ \ No newline at end of file From 246d539f295c70846aa4ecaf9cfbe79b959bf3c7 Mon Sep 17 00:00:00 2001 From: Ethan Madden Date: Thu, 27 Sep 2018 18:09:23 -0700 Subject: [PATCH 058/505] Keymap: add clicky support to jetpacktuxedo keymap (#3990) controlled by dip 3 with pitch modulated by the knob --- keyboards/planck/keymaps/jetpacktuxedo/config.h | 2 ++ keyboards/planck/keymaps/jetpacktuxedo/keymap.c | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/keyboards/planck/keymaps/jetpacktuxedo/config.h b/keyboards/planck/keymaps/jetpacktuxedo/config.h index f216dc02dcd4..7efe97a57371 100644 --- a/keyboards/planck/keymaps/jetpacktuxedo/config.h +++ b/keyboards/planck/keymaps/jetpacktuxedo/config.h @@ -2,6 +2,7 @@ #ifdef AUDIO_ENABLE #define STARTUP_SONG SONG(PLANCK_SOUND) + #define AUDIO_CLICKY #endif /* @@ -30,3 +31,4 @@ // Most tactile encoders have detents every 4 stages #define ENCODER_RESOLUTION 4 + diff --git a/keyboards/planck/keymaps/jetpacktuxedo/keymap.c b/keyboards/planck/keymaps/jetpacktuxedo/keymap.c index 2994c0c07749..132405686265 100644 --- a/keyboards/planck/keymaps/jetpacktuxedo/keymap.c +++ b/keyboards/planck/keymaps/jetpacktuxedo/keymap.c @@ -189,6 +189,13 @@ uint8_t muse_offset = 70; uint16_t muse_tempo = 20; void encoder_update(bool clockwise) { + if (is_clicky_on()) { + if (clockwise) { + clicky_freq_up(); + } else { + clicky_freq_down(); + } + } else if (muse_mode) { if (IS_LAYER_ON(_RAISE)) { if (clockwise) { @@ -248,6 +255,12 @@ void dip_update(uint8_t index, bool active) { stop_all_notes(); #endif } + case 2: + if (active) { + clicky_on(); + } else { + clicky_off(); + } } } From edeace279b1cdc5a5450cc5b41d49b341a3a121f Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 27 Sep 2018 18:12:32 -0700 Subject: [PATCH 059/505] Make Audio Clicky's randomness a float Rather than a define, but read from the define. This way, a smart coder could externally configure the randomness, changing it on the fly This is also a precursor step to adding full on support for configurable randomness. --- quantum/process_keycode/process_clicky.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/quantum/process_keycode/process_clicky.c b/quantum/process_keycode/process_clicky.c index 36578047adbb..8238c263f91d 100644 --- a/quantum/process_keycode/process_clicky.c +++ b/quantum/process_keycode/process_clicky.c @@ -20,6 +20,7 @@ #endif // !AUDIO_CLICKY_FREQ_RANDOMNESS float clicky_freq = AUDIO_CLICKY_FREQ_DEFAULT; +float clicky_rand = AUDIO_CLICKY_FREQ_RANDOMNESS; float clicky_song[][2] = {{AUDIO_CLICKY_FREQ_DEFAULT, 3}, {AUDIO_CLICKY_FREQ_DEFAULT, 1}}; // 3 and 1 --> durations extern audio_config_t audio_config; @@ -33,8 +34,8 @@ void clicky_play(void) { #ifndef NO_MUSIC_MODE if (music_activated || midi_activated) return; #endif // !NO_MUSIC_MODE - clicky_song[0][0] = 2.0f * clicky_freq * (1.0f + AUDIO_CLICKY_FREQ_RANDOMNESS * ( ((float)rand()) / ((float)(RAND_MAX)) ) ); - clicky_song[1][0] = clicky_freq * (1.0f + AUDIO_CLICKY_FREQ_RANDOMNESS * ( ((float)rand()) / ((float)(RAND_MAX)) ) ); + clicky_song[0][0] = 2.0f * clicky_freq * (1.0f + clicky_rand * ( ((float)rand()) / ((float)(RAND_MAX)) ) ); + clicky_song[1][0] = clicky_freq * (1.0f + clicky_rand * ( ((float)rand()) / ((float)(RAND_MAX)) ) ); PLAY_SONG(clicky_song); } From baebbc096702c3ecc0ee89b4fbf5749e79f02375 Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Fri, 28 Sep 2018 11:02:12 +0900 Subject: [PATCH 060/505] add 'mavrdude' target into tmk_core/avr.mk (#3986) * add 'mavrdude' target into tmk_core/avr.mk I made it a little convenient when writing the same binary to multiple Pro Micro. * rename target name 'mavrdude' to 'avrdude-loop' * modify docs/flashing.md about avrdude-loop * mdify docs/flashing.md again * modifi docs/flashing.md 3rd --- docs/flashing.md | 6 ++++++ tmk_core/avr.mk | 12 +++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/flashing.md b/docs/flashing.md index e5fe59f8f039..66c08a361045 100644 --- a/docs/flashing.md +++ b/docs/flashing.md @@ -78,6 +78,12 @@ or make ::avrdude +or if you want to flash multiple boards, use the following command + + make ::avrdude-loop + +When you're done flashing boards, you'll need to hit Ctrl + C or whatever the correct keystroke is for your operating system to break the loop. + ## Halfkay Halfkay is a super-slim protocol developed by PJRC that uses HID, and come on all Teensys (namely the 2.0). diff --git a/tmk_core/avr.mk b/tmk_core/avr.mk index 2f955b18fe71..add904c9c521 100644 --- a/tmk_core/avr.mk +++ b/tmk_core/avr.mk @@ -169,7 +169,8 @@ dfu-ee: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep fi $(DFU_PROGRAMMER) $(MCU) reset -avrdude: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware +define EXEC_AVRDUDE + USB= ;\ if $(GREP) -q -s Microsoft /proc/version; then \ echo 'ERROR: AVR flashing cannot be automated within the Windows Subsystem for Linux (WSL) currently. Instead, take the .hex file generated and flash it using AVRDUDE, AVRDUDESS, or XLoader.'; \ else \ @@ -191,6 +192,15 @@ avrdude: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware sleep 1; \ avrdude -p $(MCU) -c avr109 -P $$USB -U flash:w:$(BUILD_DIR)/$(TARGET).hex; \ fi +endef + +avrdude: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware + $(call EXEC_AVRDUDE) + +avrdude-loop: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware + while true; do \ + $(call EXEC_AVRDUDE) ; \ + done # Convert hex to bin. bin: $(BUILD_DIR)/$(TARGET).hex From 96c9ebc2e48b8f327bca2a2d5db77c0ab2ef6c8a Mon Sep 17 00:00:00 2001 From: Chiang Fong Lee Date: Sat, 18 Aug 2018 12:19:29 +0800 Subject: [PATCH 061/505] Revert "Split Common: Serial Backlight LED fix (#3586)" This reverts commit 3eabd7946ec5e47d12d603d591e8d8658d82fa42. --- quantum/split_common/matrix.c | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/quantum/split_common/matrix.c b/quantum/split_common/matrix.c index 3d2983f2ef65..ff6738b58f4c 100644 --- a/quantum/split_common/matrix.c +++ b/quantum/split_common/matrix.c @@ -355,24 +355,6 @@ void matrix_slave_scan(void) { for (int i = 0; i < ROWS_PER_HAND; ++i) { serial_slave_buffer[i] = matrix[offset+i]; } -#endif -#ifdef USE_I2C -#ifdef BACKLIGHT_ENABLE - // Read backlight level sent from master and update level on slave - backlight_set(i2c_slave_buffer[0]); -#endif - for (int i = 0; i < ROWS_PER_HAND; ++i) { - i2c_slave_buffer[i+1] = matrix[offset+i]; - } -#else // USE_SERIAL - for (int i = 0; i < ROWS_PER_HAND; ++i) { - serial_slave_buffer[i] = matrix[offset+i]; - } - -#ifdef BACKLIGHT_ENABLE - // Read backlight level sent from master and update level on slave - backlight_set(serial_master_buffer[SERIAL_BACKLIT_START]); -#endif #endif matrix_slave_scan_user(); } From 7d2d0c6795eaaa87d4e13fc159807b64ca2d71f9 Mon Sep 17 00:00:00 2001 From: Chiang Fong Lee Date: Sat, 18 Aug 2018 12:46:12 +0800 Subject: [PATCH 062/505] split_common: fix backlight update for serial boards --- quantum/split_common/split_util.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index 13b09d5b815a..7c87de4d9bde 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -106,14 +106,14 @@ void keyboard_slave_loop(void) { // Read Backlight Info #ifdef BACKLIGHT_ENABLE - if (BACKLIT_DIRTY) { - #ifdef USE_I2C + #ifdef USE_I2C + if (BACKLIT_DIRTY) { backlight_set(i2c_slave_buffer[I2C_BACKLIT_START]); - #else // USE_SERIAL - backlight_set(serial_master_buffer[SERIAL_BACKLIT_START]); - #endif - BACKLIT_DIRTY = false; - } + BACKLIT_DIRTY = false; + } + #else // USE_SERIAL + backlight_set(serial_master_buffer[SERIAL_BACKLIT_START]); + #endif #endif // Read RGB Info #ifdef RGBLIGHT_ENABLE From b382076ad1a6d857b6f185077b5f3635801b4ad6 Mon Sep 17 00:00:00 2001 From: James Laird-Wah Date: Fri, 28 Sep 2018 13:53:36 +1000 Subject: [PATCH 063/505] Keyboard: keyboardio model01: rgbmatrix support (#3989) * model01: implement RGB matrix feature LEDs can still be individually controlled if this is switched off. * model01: use fast banked LED setting commands * model01: update default keymap to use RGB matrix * model01: update RGB matrix support to match common_features.mk * rgb_matrix: include This was missing after commit 4d5705ea6ceeb11cd2adc018644ec87c51af4e86 which introduces a use of memset(). * model01: make g_rgb_leds weak This allows users to override which LEDs are configured as modifiers, or tweak the x/y coordinates, should they so choose. --- keyboards/model01/config.h | 3 + keyboards/model01/keymaps/default/keymap.c | 57 ++++++-- keyboards/model01/leds.c | 144 ++++++++++++++++++--- keyboards/model01/leds.h | 9 +- keyboards/model01/rules.mk | 4 +- quantum/rgb_matrix.c | 1 + 6 files changed, 182 insertions(+), 36 deletions(-) diff --git a/keyboards/model01/config.h b/keyboards/model01/config.h index 796653f459cd..167310731f8e 100644 --- a/keyboards/model01/config.h +++ b/keyboards/model01/config.h @@ -33,3 +33,6 @@ along with this program. If not, see . /* The scanners already debounce for us */ #define DEBOUNCING_DELAY 0 + +/* RGB matrix constants */ +#define DRIVER_LED_TOTAL 64 diff --git a/keyboards/model01/keymaps/default/keymap.c b/keyboards/model01/keymaps/default/keymap.c index cdc050cd90b7..a6e5303fe83d 100644 --- a/keyboards/model01/keymaps/default/keymap.c +++ b/keyboards/model01/keymaps/default/keymap.c @@ -26,7 +26,7 @@ enum { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [DEF] = LAYOUT( RESET , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , TG(NUM), - KC_GRV , KC_Q , KC_W , KC_E , KC_R , KC_T , _______, _______, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_EQL , + KC_GRV , KC_Q , KC_W , KC_E , KC_R , KC_T , RGB_MOD, _______, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_EQL , KC_PGUP, KC_A , KC_S , KC_D , KC_F , KC_G , KC_TAB , KC_ENT , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, KC_PGDN, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_ESC , _______, KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_MINS, KC_LCTL, KC_RCTL, @@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [FUN] = LAYOUT( _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , - KC_TAB , _______, KC_MS_U, _______, KC_BTN3, _______, _______, KC_MPRV, KC_MNXT, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12 , + KC_TAB , _______, KC_MS_U, _______, KC_BTN3, _______, RGB_TOG, KC_MPRV, KC_MNXT, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_F12 , KC_HOME, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN1, _______, _______, KC_MPLY, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, _______, KC_END , KC_PSCR, KC_INS , _______, KC_BTN2, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_BSLS, KC_PIPE, _______, _______, @@ -73,21 +73,52 @@ LAYOUT( ) */ +static void set_numpad_colours(int on, void (*write)(int, uint8_t, uint8_t, uint8_t)) { + if (!on) { + for (int i=44; i<=60; i++) + write(i, 0, 0, 0); + write(63, 0, 0, 0); + return; + } + + /* main number keys */ + for (int i=44; i<=47; i++) + write(i, 255, 0, 0); + for (int i=49; i<=54; i++) + write(i, 255, 0, 0); + + /* accessory keys */ + write(48, 128, 128, 0); + for (int i=55; i<=59; i++) + write(i, 128, 128, 0); + + // enter + write(63, 0, 128, 0); + + // num key + write(60, 128, 0, 128); +} + +#ifdef RGB_MATRIX_ENABLE +/* the RGB matrix effects will overwrite the numpad indicator. + * this handy mechanism allows to override the matrix effects. + */ +void rgb_matrix_indicators_user(void) { + if (layer_state & (1< #include #include +#include +#include #include "model01.h" #define I2C_TIMEOUT 1000 -#define LINCOR(i) pgm_read_byte(&CIE1931_CURVE[i]) - -int set_all_leds_to_raw(uint8_t r, uint8_t g, uint8_t b) { +void set_all_leds_to(uint8_t r, uint8_t g, uint8_t b) { uint8_t buf[] = { TWI_CMD_LED_SET_ALL_TO, b, g, r }; - int ret = 0; - ret |= i2c_transmit(I2C_ADDR(LEFT), buf, sizeof(buf), I2C_TIMEOUT); - ret |= i2c_transmit(I2C_ADDR(RIGHT), buf, sizeof(buf), I2C_TIMEOUT); + i2c_transmit(I2C_ADDR(LEFT), buf, sizeof(buf), I2C_TIMEOUT); + i2c_transmit(I2C_ADDR(RIGHT), buf, sizeof(buf), I2C_TIMEOUT); _delay_us(10); - return ret; -} - -int set_all_leds_to(uint8_t r, uint8_t g, uint8_t b) { - return set_all_leds_to_raw(LINCOR(r), LINCOR(g), LINCOR(b)); } -int set_led_to_raw(uint8_t led, uint8_t r, uint8_t g, uint8_t b) { +void set_led_to(int led, uint8_t r, uint8_t g, uint8_t b) { uint8_t buf[] = { TWI_CMD_LED_SET_ONE_TO, led & 0x1f, b, g, r }; int hand = (led >= 32) ? RIGHT : LEFT; - int ret = i2c_transmit(I2C_ADDR(hand), buf, sizeof(buf), I2C_TIMEOUT); + i2c_transmit(I2C_ADDR(hand), buf, sizeof(buf), I2C_TIMEOUT); _delay_us(10); - return ret; } -int set_led_to(uint8_t led, uint8_t r, uint8_t g, uint8_t b) { - return set_led_to_raw(led, LINCOR(r), LINCOR(g), LINCOR(b)); +#ifdef RGB_MATRIX_ENABLE + +__attribute__ ((weak)) +const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { + {{0x73}, { 3, 35}, 0}, + {{0x72}, { 0, 26}, 0}, + {{0x71}, { 0, 17}, 0}, + {{0x70}, { 0, 6}, 0}, + {{0x60}, { 14, 5}, 0}, + {{0x61}, { 15, 16}, 0}, + {{0x62}, { 16, 25}, 0}, + {{0x63}, { 17, 34}, 0}, + {{0x53}, { 31, 29}, 0}, + {{0x52}, { 31, 19}, 0}, + {{0x51}, { 30, 11}, 0}, + {{0x50}, { 30, 1}, 0}, + {{0x40}, { 45, 0}, 0}, + {{0x41}, { 45, 8}, 0}, + {{0x42}, { 46, 17}, 0}, + {{0x43}, { 46, 27}, 0}, + {{0x33}, { 60, 27}, 0}, + {{0x32}, { 60, 18}, 0}, + {{0x31}, { 60, 9}, 0}, + {{0x30}, { 60, 0}, 0}, + {{0x20}, { 74, 2}, 0}, + {{0x21}, { 74, 11}, 0}, + {{0x22}, { 75, 20}, 0}, + {{0x23}, { 74, 28}, 0}, + {{0x12}, { 89, 30}, 0}, + {{0x11}, { 89, 19}, 0}, + {{0x10}, { 89, 7}, 0}, + {{0x00}, { 70, 38}, 1}, + {{0x01}, { 82, 41}, 1}, + {{0x02}, { 93, 45}, 1}, + {{0x03}, {104, 50}, 1}, + {{0x13}, { 74, 64}, 1}, + {{0x67}, {149, 64}, 1}, + {{0x77}, {119, 50}, 1}, + {{0x76}, {130, 45}, 1}, + {{0x75}, {141, 41}, 1}, + {{0x74}, {153, 38}, 1}, + {{0x64}, {134, 7}, 0}, + {{0x65}, {134, 19}, 0}, + {{0x66}, {134, 30}, 0}, + {{0x57}, {149, 28}, 0}, + {{0x56}, {148, 20}, 0}, + {{0x55}, {149, 11}, 0}, + {{0x54}, {149, 2}, 0}, + {{0x44}, {163, 0}, 0}, + {{0x45}, {163, 9}, 0}, + {{0x46}, {163, 18}, 0}, + {{0x47}, {163, 27}, 0}, + {{0x37}, {177, 27}, 0}, + {{0x36}, {177, 17}, 0}, + {{0x35}, {178, 8}, 0}, + {{0x34}, {178, 0}, 0}, + {{0x24}, {193, 1}, 0}, + {{0x25}, {193, 11}, 0}, + {{0x26}, {192, 19}, 0}, + {{0x27}, {192, 29}, 0}, + {{0x17}, {206, 34}, 0}, + {{0x16}, {207, 25}, 0}, + {{0x15}, {208, 16}, 0}, + {{0x14}, {209, 5}, 0}, + {{0x04}, {224, 6}, 0}, + {{0x05}, {223, 17}, 0}, + {{0x06}, {223, 26}, 0}, + {{0x07}, {220, 35}, 0}, +}; + +static struct { + uint8_t b; + uint8_t g; + uint8_t r; +} __attribute__((packed)) led_state[64]; + +static void set_color(int index, uint8_t r, uint8_t g, uint8_t b) { + led_state[index].r = r; + led_state[index].g = g; + led_state[index].b = b; +} + +static void set_color_all(uint8_t r, uint8_t g, uint8_t b) { + for (int i=0; i +#include -int set_all_leds_to(uint8_t r, uint8_t g, uint8_t b); -int set_led_to(uint8_t led, uint8_t r, uint8_t g, uint8_t b); - -/* Raw (gamma uncorrected) LED values */ -int set_all_leds_to_raw(uint8_t r, uint8_t g, uint8_t b); -int set_led_to_raw(uint8_t led, uint8_t r, uint8_t g, uint8_t b); +void set_all_leds_to(uint8_t r, uint8_t g, uint8_t b); +void set_led_to(int led, uint8_t r, uint8_t g, uint8_t b); diff --git a/keyboards/model01/rules.mk b/keyboards/model01/rules.mk index cab7065ff8ff..49ab981d148c 100644 --- a/keyboards/model01/rules.mk +++ b/keyboards/model01/rules.mk @@ -59,4 +59,6 @@ MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) UNICODE_ENABLE = no # Unicode CUSTOM_MATRIX = yes -CIE1931_CURVE = yes + +# You can set RGB_MATRIX_ENABLE = no in your rules.mk to disable this and save the Flash +RGB_MATRIX_ENABLE = custom # Enable RGB matrix effects (+10000). diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index 807e4d62d191..b282284a138e 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -21,6 +21,7 @@ #include "progmem.h" #include "config.h" #include "eeprom.h" +#include #include rgb_config_t rgb_matrix_config; From a173eda6d28bd09b2d59448a6532edb7a6c8e358 Mon Sep 17 00:00:00 2001 From: Wilba6582 Date: Fri, 28 Sep 2018 14:09:14 +1000 Subject: [PATCH 064/505] Improved dynamic keymaps (#3972) * Improved dynamic keymaps * K&R sucks --- keyboards/zeal60/zeal60.c | 9 ++++---- keyboards/zeal60/zeal60_api.h | 2 +- quantum/dynamic_keymap.c | 42 +++++++++++++---------------------- quantum/dynamic_keymap.h | 7 ++---- 4 files changed, 22 insertions(+), 38 deletions(-) diff --git a/keyboards/zeal60/zeal60.c b/keyboards/zeal60/zeal60.c index e516c4dbfc6d..092235ca61bb 100644 --- a/keyboards/zeal60/zeal60.c +++ b/keyboards/zeal60/zeal60.c @@ -81,9 +81,9 @@ void raw_hid_receive( uint8_t *data, uint8_t length ) dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] ); break; } - case id_dynamic_keymap_clear_all: + case id_dynamic_keymap_reset: { - dynamic_keymap_clear_all(); + dynamic_keymap_reset(); break; } #endif // DYNAMIC_KEYMAP_ENABLE @@ -171,9 +171,8 @@ void matrix_init_kb(void) #endif // RGB_BACKLIGHT_ENABLED #ifdef DYNAMIC_KEYMAP_ENABLE - // This saves "empty" keymaps so it falls back to the keymaps - // in the firmware (aka. progmem/flash) - dynamic_keymap_clear_all(); + // This resets the keymaps in EEPROM to what is in flash. + dynamic_keymap_reset(); #endif // Save the magic number last, in case saving was interrupted diff --git a/keyboards/zeal60/zeal60_api.h b/keyboards/zeal60/zeal60_api.h index baa8ac09f8ae..eaac3ad7ce17 100644 --- a/keyboards/zeal60/zeal60_api.h +++ b/keyboards/zeal60/zeal60_api.h @@ -24,7 +24,7 @@ enum zeal60_command_id id_set_keyboard_value, id_dynamic_keymap_get_keycode, id_dynamic_keymap_set_keycode, - id_dynamic_keymap_clear_all, + id_dynamic_keymap_reset, id_backlight_config_set_value, id_backlight_config_get_value, id_backlight_config_save, diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c index 9f18612d56cf..2c989d691803 100644 --- a/quantum/dynamic_keymap.c +++ b/quantum/dynamic_keymap.c @@ -16,6 +16,8 @@ #include "config.h" #include "keymap.h" // to get keymaps[][][] +#include "tmk_core/common/eeprom.h" +#include "progmem.h"// to read default from flash #include "dynamic_keymap.h" @@ -29,8 +31,6 @@ #error DYNAMIC_KEYMAP_LAYER_COUNT not defined #endif -#define KC_EENULL 0xFFFF // TODO: move to enum quantum_keycodes - void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column) { // TODO: optimize this with some left shifts @@ -55,16 +55,15 @@ void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint eeprom_update_byte(address+1, (uint8_t)(keycode & 0xFF)); } -void dynamic_keymap_clear_all(void) +void dynamic_keymap_reset(void) { - // Save "empty" keymaps. - for ( int layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++ ) - { - for ( int row = 0; row < MATRIX_ROWS; row++ ) - { - for ( int column = 0; column < MATRIX_COLS; column++ ) - { - dynamic_keymap_set_keycode(layer, row, column, KC_EENULL); + // Reset the keymaps in EEPROM to what is in flash. + // All keyboards using dynamic keymaps should define a layout + // for the same number of layers as DYNAMIC_KEYMAP_LAYER_COUNT. + for ( int layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++ ) { + for ( int row = 0; row < MATRIX_ROWS; row++ ) { + for ( int column = 0; column < MATRIX_COLS; column++ ) { + dynamic_keymap_set_keycode(layer, row, column, pgm_read_word(&keymaps[layer][row][column])); } } } @@ -73,24 +72,13 @@ void dynamic_keymap_clear_all(void) // This overrides the one in quantum/keymap_common.c uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) { - // This used to test EEPROM for magic bytes, but it was redundant. - // Test for EEPROM usage change (fresh install, address change, etc.) - // externally and call dynamic_keymap_default_save() if ( layer < DYNAMIC_KEYMAP_LAYER_COUNT && - key.row < MATRIX_ROWS && // possibly redundant - key.col < MATRIX_COLS ) // possibly redundant - { - uint16_t keycode = dynamic_keymap_get_keycode(layer, key.row, key.col); - - // If keycode is not "empty", return it, otherwise - // drop down to return the one in flash - if ( keycode != KC_EENULL) - { - return keycode; - } + key.row < MATRIX_ROWS && + key.col < MATRIX_COLS ) { + return dynamic_keymap_get_keycode(layer, key.row, key.col); + } else { + return KC_NO; } - - return pgm_read_word(&keymaps[layer][key.row][key.col]); } #endif // DYNAMIC_KEYMAP_ENABLE diff --git a/quantum/dynamic_keymap.h b/quantum/dynamic_keymap.h index b0133aeb85aa..bd76adae209a 100644 --- a/quantum/dynamic_keymap.h +++ b/quantum/dynamic_keymap.h @@ -13,9 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - -#ifndef DYNAMIC_KEYMAP_H -#define DYNAMIC_KEYMAP_H +#pragma once #include #include @@ -23,9 +21,8 @@ void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column); uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column); void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode); -void dynamic_keymap_clear_all(void); +void dynamic_keymap_reset(void); // This overrides the one in quantum/keymap_common.c // uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); -#endif //DYNAMIC_KEYMAP_H From 31afdd81a1e7cdb8808c8eb32e0ebe69c3d15f5c Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 07:15:20 -0700 Subject: [PATCH 065/505] Optimize size of JC65/v32a keyboard --- keyboards/jc65/v32a/config.h | 7 ++++--- keyboards/jc65/v32a/rules.mk | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/keyboards/jc65/v32a/config.h b/keyboards/jc65/v32a/config.h index dc6d280f52da..466cb7a28e4c 100644 --- a/keyboards/jc65/v32a/config.h +++ b/keyboards/jc65/v32a/config.h @@ -15,8 +15,7 @@ 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 +#pragma once #include "config_common.h" @@ -43,4 +42,6 @@ along with this program. If not, see . /* key combination for command */ #define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) -#endif +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION + diff --git a/keyboards/jc65/v32a/rules.mk b/keyboards/jc65/v32a/rules.mk index 1ea19fe00eea..5c8e63283db0 100644 --- a/keyboards/jc65/v32a/rules.mk +++ b/keyboards/jc65/v32a/rules.mk @@ -26,7 +26,7 @@ F_CPU = 12000000 # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = bootloadHID From a4bdab68370bc1497a7d5aa32d05bd8a6b3c3c14 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 07:09:46 -0700 Subject: [PATCH 066/505] Optimize size of Hadron keyboard --- keyboards/hadron/config.h | 19 +++++--------- keyboards/hadron/keymaps/default/rules.mk | 4 +-- keyboards/hadron/rules.mk | 32 +++++++++++------------ keyboards/hadron/ver0/config.h | 7 ++--- keyboards/hadron/ver2/config.h | 7 ++--- keyboards/hadron/ver2/rules.mk | 2 +- 6 files changed, 28 insertions(+), 43 deletions(-) diff --git a/keyboards/hadron/config.h b/keyboards/hadron/config.h index 0c19d6c7910c..9111ad727967 100644 --- a/keyboards/hadron/config.h +++ b/keyboards/hadron/config.h @@ -15,8 +15,7 @@ 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 +#pragma once #include "config_common.h" @@ -30,7 +29,7 @@ along with this program. If not, see . -//#define AUDIO_VOICES +//#define AUDIO_VOICES //#define BACKLIGHT_PIN B7 @@ -71,13 +70,7 @@ along with this program. If not, see . //#define NO_ACTION_LAYER //#define NO_ACTION_TAPPING //#define NO_ACTION_ONESHOT -//#define NO_ACTION_MACRO -//#define NO_ACTION_FUNCTION -#ifdef SUBPROJECT_ver0 - #include "ver0/config.h" -#endif -#ifdef SUBPROJECT_ver2 - #include "ver2/config.h" -#endif - -#endif +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION + + diff --git a/keyboards/hadron/keymaps/default/rules.mk b/keyboards/hadron/keymaps/default/rules.mk index 1f3975255a1f..4d08544f3ad4 100644 --- a/keyboards/hadron/keymaps/default/rules.mk +++ b/keyboards/hadron/keymaps/default/rules.mk @@ -21,6 +21,4 @@ SWAP_HANDS_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 +EXTRAFLAGS += -flto diff --git a/keyboards/hadron/rules.mk b/keyboards/hadron/rules.mk index 66a900825a43..1f835e066036 100644 --- a/keyboards/hadron/rules.mk +++ b/keyboards/hadron/rules.mk @@ -44,30 +44,30 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Atmel DFU loader 4096 # LUFA bootloader 4096 # USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=512 +BOOTLOADER = halfkay # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# 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 -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. +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 +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. API_SYSEX_ENABLE = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend SRC = i2c.c \ ssd1306.c -DEFAULT_FOLDER = hadron/ver2 \ No newline at end of file +DEFAULT_FOLDER = hadron/ver2 diff --git a/keyboards/hadron/ver0/config.h b/keyboards/hadron/ver0/config.h index 039d4f1c718a..2157a52cee0c 100644 --- a/keyboards/hadron/ver0/config.h +++ b/keyboards/hadron/ver0/config.h @@ -14,10 +14,7 @@ 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 VER0_CONFIG_H -#define VER0_CONFIG_H - -#include "../config.h" +#pragma once /* USB Device descriptor parameter */ #define DEVICE_VER 0x0001 @@ -32,4 +29,4 @@ along with this program. If not, see . #define UNUSED_PINS -#endif + diff --git a/keyboards/hadron/ver2/config.h b/keyboards/hadron/ver2/config.h index 71a0ab5b3fec..5ee3f931ff72 100644 --- a/keyboards/hadron/ver2/config.h +++ b/keyboards/hadron/ver2/config.h @@ -14,10 +14,7 @@ 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 VER2_CONFIG_H -#define VER2_CONFIG_H - -#include "../config.h" +#pragma once /* USB Device descriptor parameter */ #define DEVICE_VER 0x0002 @@ -32,4 +29,4 @@ along with this program. If not, see . #define UNUSED_PINS -#endif + diff --git a/keyboards/hadron/ver2/rules.mk b/keyboards/hadron/ver2/rules.mk index a3952a5d338e..521493b3d39b 100644 --- a/keyboards/hadron/ver2/rules.mk +++ b/keyboards/hadron/ver2/rules.mk @@ -1 +1 @@ -#AUDIO_ENABLE ?= yes # Audio output on port C6 \ No newline at end of file +#AUDIO_ENABLE = yes # Audio output on port C6 From 8847b2abbff5c6d55cf43402d394e9db751f728f Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 07:24:08 -0700 Subject: [PATCH 067/505] Optimize size of Vitamins_Included keyboard --- keyboards/vitamins_included/config.h | 10 +--------- keyboards/vitamins_included/keymaps/default/config.h | 7 +------ keyboards/vitamins_included/keymaps/default/keymap.c | 12 +++--------- keyboards/vitamins_included/keymaps/default/rules.mk | 4 +--- keyboards/vitamins_included/rules.mk | 5 ++--- 5 files changed, 8 insertions(+), 30 deletions(-) diff --git a/keyboards/vitamins_included/config.h b/keyboards/vitamins_included/config.h index 27924ae46c8c..abbb31056372 100644 --- a/keyboards/vitamins_included/config.h +++ b/keyboards/vitamins_included/config.h @@ -16,20 +16,12 @@ 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 +#pragma once #include "config_common.h" -#if !defined(NO_DEBUG) && !defined(CONSOLE_ENABLE) -#define NO_DEBUG -#endif // !NO_DEBUG -#if !defined(NO_PRINT) && !defined(CONSOLE_ENABLE) -#define NO_PRINT -#endif // !NO_PRINT #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION #define DISABLE_LEADER -#endif diff --git a/keyboards/vitamins_included/keymaps/default/config.h b/keyboards/vitamins_included/keymaps/default/config.h index 35f641a94a93..aba9fa7d403c 100644 --- a/keyboards/vitamins_included/keymaps/default/config.h +++ b/keyboards/vitamins_included/keymaps/default/config.h @@ -18,10 +18,7 @@ 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 - -#include "../../config.h" +#pragma once /* Use I2C or Serial, not both */ @@ -40,5 +37,3 @@ along with this program. If not, see . SONG(COLEMAK_SOUND) \ } #endif - -#endif diff --git a/keyboards/vitamins_included/keymaps/default/keymap.c b/keyboards/vitamins_included/keymaps/default/keymap.c index f25e2fd32eae..13b48e7640b5 100644 --- a/keyboards/vitamins_included/keymaps/default/keymap.c +++ b/keyboards/vitamins_included/keymaps/default/keymap.c @@ -1,6 +1,4 @@ #include QMK_KEYBOARD_H -#include "action_layer.h" -#include "eeconfig.h" extern keymap_config_t keymap_config; @@ -141,28 +139,24 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -void persistent_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) { - persistent_default_layer_set(1UL<<_QWERTY); + set_single_persistent_default_layer(_QWERTY); } return false; break; case COLEMAK: if (record->event.pressed) { - persistent_default_layer_set(1UL<<_COLEMAK); + set_single_persistent_default_layer(_COLEMAK); } return false; break; case DVORAK: if (record->event.pressed) { - persistent_default_layer_set(1UL<<_DVORAK); + set_single_persistent_default_layer(_DVORAK); } return false; break; diff --git a/keyboards/vitamins_included/keymaps/default/rules.mk b/keyboards/vitamins_included/keymaps/default/rules.mk index 457a3d01d4a4..8b137891791f 100644 --- a/keyboards/vitamins_included/keymaps/default/rules.mk +++ b/keyboards/vitamins_included/keymaps/default/rules.mk @@ -1,3 +1 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif + diff --git a/keyboards/vitamins_included/rules.mk b/keyboards/vitamins_included/rules.mk index 2291b21161ce..8ac39dffbc95 100644 --- a/keyboards/vitamins_included/rules.mk +++ b/keyboards/vitamins_included/rules.mk @@ -56,7 +56,7 @@ 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 +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 MIDI_ENABLE = no # MIDI controls @@ -64,7 +64,6 @@ 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. -USE_I2C = 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 @@ -74,4 +73,4 @@ LAYOUTS = ortho_4x12 DEFAULT_FOLDER = vitamins_included/rev1 -EXTRAFLAGS += -flto \ No newline at end of file +EXTRAFLAGS += -flto From ebc143297c24bdd894340ffece2d93f15fbd5c1c Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 07:18:43 -0700 Subject: [PATCH 068/505] Optimize size of Pearl keyboard --- keyboards/pearl/config.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/keyboards/pearl/config.h b/keyboards/pearl/config.h index 9f7a148f9839..c0594bf91ab2 100644 --- a/keyboards/pearl/config.h +++ b/keyboards/pearl/config.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef PEARL_CONFIG_H -#define PEARL_CONFIG_H +#pragma once #include "config_common.h" @@ -46,4 +45,6 @@ along with this program. If not, see . /* key combination for command */ #define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) -#endif +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION + From 9ade35a9fedbc6e4e77f422ed5fb514348e754ad Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 07:00:11 -0700 Subject: [PATCH 069/505] Optimize size of USB_USB BLE Converter --- keyboards/converter/usb_usb/ble/config.h | 8 ++++---- keyboards/converter/usb_usb/ble/rules.mk | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/keyboards/converter/usb_usb/ble/config.h b/keyboards/converter/usb_usb/ble/config.h index 45aa778d571d..5333e17c82e4 100644 --- a/keyboards/converter/usb_usb/ble/config.h +++ b/keyboards/converter/usb_usb/ble/config.h @@ -1,13 +1,13 @@ -#ifndef CONFIG_BLE_H -#define CONFIG_BLE_H +#pragma once #undef PRODUCT #define PRODUCT QMK BLE Adapter #undef DESCRIPTION -#define DESCRIPTION +#define DESCRIPTION // Turn off the mode leds on the BLE module #define ADAFRUIT_BLE_ENABLE_MODE_LEDS 0 #define ADAFRUIT_BLE_ENABLE_POWER_LED 0 -#endif +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION diff --git a/keyboards/converter/usb_usb/ble/rules.mk b/keyboards/converter/usb_usb/ble/rules.mk index 16090962d9b8..84aa767f543f 100644 --- a/keyboards/converter/usb_usb/ble/rules.mk +++ b/keyboards/converter/usb_usb/ble/rules.mk @@ -1,3 +1,23 @@ BLUETOOTH = AdafruitBLE ADAFRUIT_BLE_ENABLE = yes F_CPU = 8000000 + +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 +# 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 +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +EXTRAFLAGS += -flto From 8454fa5e9faab3a969168447d42369828f8ade91 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 09:04:30 -0700 Subject: [PATCH 070/505] Update Document Templates to reflect newer wording and URLs (#4006) * Add pragma once info to contributing guidelines * Fix links in readme template to match doc site * Revert changes to contributing doc as somebody already changed it --- docs/documentation_templates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/documentation_templates.md b/docs/documentation_templates.md index 18829ed0f085..ba3830b64c7f 100644 --- a/docs/documentation_templates.md +++ b/docs/documentation_templates.md @@ -36,7 +36,7 @@ Make example for this keyboard (after setting up your build environment): make planck/rev4:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). ``` There needs to be two spaces at the end of the `Keyboard Maintainer` and `Hardware Supported` lines for it to render correctly with Markdown. From fa47f5fb15cca3bea9ab4de1001fcfecd43dac19 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 09:27:51 -0700 Subject: [PATCH 071/505] Update to the Userspace documentation (#4005) * Overhaul to Userspace Documentation * Formatting issues * Additionaly formatting fixes * Add Readme info * Additionaly Readme info * Formatting fixes --- docs/feature_userspace.md | 178 ++++++++++++++++++++++++++++---------- 1 file changed, 133 insertions(+), 45 deletions(-) diff --git a/docs/feature_userspace.md b/docs/feature_userspace.md index 5f7c05b83b74..b7fc9d809965 100644 --- a/docs/feature_userspace.md +++ b/docs/feature_userspace.md @@ -5,15 +5,12 @@ If you use more than one keyboard with a similar keymap, you might see the benef * `/users//` (added to the path automatically) * `readme.md` (optional, recommended) * `rules.mk` (included automatically) + * `config.h` (included automatically) * `.h` (optional) * `.c` (optional) - * `config.h` (optional) + * `cool_rgb_stuff.c` (optional) + * `cool_rgb_stuff.h` (optional) -`.c` will need to be added to the SRC in `rules.mk` like this: - - SRC += .c - -Additional files may be added in the same way - it's recommended you have one named ``.c/.h though. All this only happens when you build a keymap named ``, like this: @@ -23,82 +20,179 @@ For example, make planck:jack -Will include the `/users/jack/` folder in the path, along with `/users/jack/rules.mk`. +Will include the `/users/jack/` folder in the path, along with `/users/jack/rules.mk`. -Additionally, `config.h` here will be processed like the same file in your keymap folder. This is handled separately from the `.h` file. +!> This `name` can be [overridden](#override-default-userspace), if needed. -The reason for this, is that `.h` won't be added in time to add settings (such as `#define TAPPING_TERM 100`), and including the `` file in any `config.h` files will result in compile issues. +## `Rules.mk` + +The `rules.mk` is one of the two files that gets processed automatically. This is how you add additional source files (such as `.c`) will be added when compiling. -So you should use the `config.h` for QMK settings, and the `.h` file for user or keymap specific settings. +It's highly recommended that you use `.c` as the default source file to be added. And to add it, you need to add it the SRC in `rules.mk` like this: -`/users//rules.mk` will be included in the build _after_ the `rules.mk` from your keymap. This allows you to have features in your userspace `rules.mk` that depend on individual QMK features that may or may not be available on a specific keyboard. For example, if you have RGB control features shared between all your keyboards that support RGB lighting, you can `define RGB_ENABLE` in your keymap `rules.mk` and then check for the variable in your userspace `rules.mk` like this: + SRC += .c + +Additional files may be added in the same way - it's recommended you have one named ``.c/.h to start off with, though. + +The `/users//rules.mk` file will be included in the build _after_ the `rules.mk` from your keymap. This allows you to have features in your userspace `rules.mk` that depend on individual QMK features that may or may not be available on a specific keyboard. + +For example, if you have RGB control features shared between all your keyboards that support RGB lighting, you can add support for that if the RGBLIGHT feature is enabled: ```make -ifdef RGB_ENABLE - # Include my fancy rgb functions source here +ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) + # Include my fancy rgb functions source here + SRC += cool_rgb_stuff.c endif ``` -Because of this, any time you turn on QMK features in your `users//rules.mk`, you should conditionally enable them only if the flag isn't already defined, like this: + +Alternatively, you can `define RGB_ENABLE` in your keymap's `rules.mk` and then check for the variable in your userspace's `rules.mk` like this: ```make -ifndef TAP_DANCE_ENABLE - TAP_DANCE_ENABLE = yes +ifdef RGB_ENABLE + # Include my fancy rgb functions source here + SRC += cool_rgb_stuff.c endif ``` -This will ensure that you can explicitly turn off features for an individual keymap. -## Readme +### Override default userspace + +By default the userspace used will be the same as the keymap name. In some situations this isn't desirable. For instance, if you use the [layout](feature_layouts.md) feature you can't use the same name for different keymaps (e.g. ANSI and ISO). You can name your layouts `mylayout-ansi` and `mylayout-iso` and add the following line to your layout's `rules.mk`: + +``` +USER_NAME := mylayout +``` + +This is also useful if you have multiple different keyboards with different features physically present on the board (such as one with RGB Lights, and one with Audio, or different number of LEDs, or connected to a different PIN on the controller). + +## Configuration Options (`config.h`) + +Additionally, `config.h` here will be processed like the same file in your keymap folder. This is handled separately from the `.h` file. + +The reason for this, is that `.h` won't be added in time to add settings (such as `#define TAPPING_TERM 100`), and including the `` file in any `config.h` files will result in compile issues. + +!>You should use the `config.h` for [configuration options](config_options.md), and the `.h` file for user or keymap specific settings (such as the enum for layer or keycodes) + + +## Readme (`readme.md`) Please include authorship (your name, github username, email), and optionally [a license that's GPL compatible](https://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses). -## `Config.h` +You can use this as a template: +``` +Copyright @ + +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 . +``` + +You'd want to replace the year, name, email and github username with your info. + +Additionally, this is a good place to document your code, if you wish to share it with others. + +# Examples + +For a brief example, checkout [`/users/_example/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna). +For a more complicaed example, checkout [`/users/drashna/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna)'s userspace. + + +## Customized Functions + +QMK has a bunch of [functions](custom_quantum_functions.md) that have [`_quantum`, `_kb`, and `_user` versions](custom_quantum_functions.md#a-word-on-core-vs-keyboards-vs-keymap) that you can use. You will pretty much always want to use the user version of these functions. But the problem is that if you use them in your userspace, then you don't have a version that you can use in your keymap. + +However, you can actually add support for keymap version, so that you can use it in both your userspace and your keymap! -If you do add a `config,h` file, you want to make sure that it only gets processed once. So you may want to start off with something like this: +For instance, lets looks at the `layer_state_set_user` function. Lets enable the [Tri Layer State](ref_functions.md#olkb-tri-layers) functionalitly to all of our boards, and then still have your `keymap.c` still able to use this functionality. + +In your `` file, you'd want to add this: ```c -#ifndef USERSPACE_CONFIG_H -#define USERSPACE_CONFIG_H +__attribute__ ((weak)) +uint32_t layer_state_set_keymap (uint32_t state) { + return state; +} + +uint32_t layer_state_set_user (uint32_t state) { + state = update_tri_layer_state(state, 2, 3, 5); + return layer_state_set_keymap (state); +} +``` +The `__attribute__ ((weak))` part tells the compiler that this is a placce holder function that can then be replaced by a version in your `keymap.c`. That way, you don't need to add it to your `keymap.c`, but if you do, you won't get any conflicts because the function is the same name. -// Put normal config.h settings here: +The `_keymap` part here doesn't matter, it just needs to be something other than `_quantum`, `_kb`, or `_user`, since those are already in use. So you could use `layer_state_set_mine`, `layer_state_set_fn`, or anything else. -#endif // !USERSPACE_CONFIG_H +You can see a list of this and other common functions in [`template.c`](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/template.c) in [`users/drashna`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna). + +## Custom Features + +Since the Userspace feature can support a staggering number of boards, you may have boards that you want to enable certain functionality for, but not for others. And you can actually create "features" that you can enable or disable in your own userspace. + +For instance, if you wanted to have a bunch of macros available, but only on certain boards (to save space), you could "hide" them being a `#ifdef MACROS_ENABLED`, and then enable it per board. To do this, add this to your rules.mk +```make +ifeq ($(strip $(MACROS_ENABLED)), yes) + OPT_DEFS += -DMACROS_ENABLED +endif ``` +The `OPT_DEFS` setting causee `MACROS_ENABLED` to be defined for your keyboards (note the `-D` in front of the name), and you could use `#ifdef MACROS_ENABLED` to check the status in your c/h files, and handle that code based on that. -You can use any option hre that you could use in your keymap's `config.h` file. You can find a list of vales [here](config_options.md). +Then you add `MACROS_ENABLED = yes` to the `rules.mk` for you keymap to enable this feature and the code in your userspace. -## Example +And in your `process_record_user` function, you'd do something like this: +```c +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { +#ifdef MACROS_ENABLED + case MACRO1: + if (!record->event.pressed) { + SEND_STRING("This is macro 1!"); + } + break; + case MACRO2: + if (!record->event.pressed) { + SEND_STRING("This is macro 2!"); + } + break; +#endif + } + return true; +} +``` -For a brief example, checkout `/users/_example/` , or for a more detailed examples check out [`template.h`](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/template.h) and [`template.c`](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/template.c) in `/users/drashna/` . -### Consolidated Macros +## Consolidated Macros -If you wanted to consolidate macros and other functions into your userspace for all of your keymaps, you can do that. The issue is that you then cannot call any function defined in your userspace, or it gets complicated. To better handle this, you can call the functions here and create new functions to use in individual keymaps. +If you wanted to consolidate macros and other functions into your userspace for all of your keymaps, you can do that. This builds upon the [Customized Functions](#customized-functions) example above. This lets you maintain a bunch of macros that are shared between the different keyboards, and allow for keyboard specific macros, too. First, you'd want to go through all of your `keymap.c` files and replace `process_record_user` with `process_record_keymap` instead. This way, you can still use keyboard specific codes on those boards, and use your custom "global" keycodes as well. You'll also want to replace `SAFE_RANGE` with `NEW_SAFE_RANGE` so that you wont have any overlapping keycodes Then add `#include ` to all of your keymap.c files. This allows you to use these new keycodes without having to redefine them in each keymap. Once you've done that, you'll want to set the keycode definitions that you need to the `.h` file. For instance: -``` -#ifndef USERSPACE -#define USERSPACE +```c +#pragma once #include "quantum.h" +#include "action.h" +#include "version.h" // Define all of enum custom_keycodes { KC_MAKE = SAFE_RANGE, NEW_SAFE_RANGE //use "NEW_SAFE_RANGE" for keymap specific codes }; - -#endif ``` Now you want to create the `.c` file, and add this content to it: -``` +```c #include ".h" -#include "quantum.h" -#include "action.h" -#include "version.h" __attribute__ ((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { @@ -126,14 +220,8 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } ``` -This will add a new `KC_MAKE` keycode that can be used in any of your keymaps. And this keycode will output `make :`, making frequent compiling easier. And this will work with any keyboard and any keymap as it will output the current boards info, so that you don't have to type this out every time. +This will add a new `KC_MAKE` keycode that can be used in any of your keymaps. And this keycode will output `make :`, making frequent compiling easier. And this will work with any keyboard and any keymap as it will output the current boards info, so that you don't have to type this out every time. Additionally, this should flash the newly compiled firmware automatically, using the correct utility, based on the bootloader settings (or default to just generating the HEX file). However, it should be noted that this may not work on all systems. AVRDUDE doesn't work on WSL, namely (and will dump the HEX in the ".build" folder instead). -## Override default userspace -By default the userspace used will be the same as the keymap name. In some situations this isn't desirable. For instance, if you use the [layout](feature_layouts.md) feature you can't use the same name for different keymaps (e.g. ANSI and ISO). You can name your layouts `mylayout-ansi` and `mylayout-iso` and add the following line to your layout's `rules.mk`: - -``` -USER_NAME := mylayout -``` From 7fe03d085c2ecaa324779093eceb1a12313ca25d Mon Sep 17 00:00:00 2001 From: yiancar Date: Fri, 28 Sep 2018 17:33:11 +0100 Subject: [PATCH 072/505] Update quantum matrix to support both AVR and Chibios ARM (#3968) * Update quantum matrix to support both AVR and Chibios ARM - Addition of STM32 pin definitions - Created abstruction layer defines to control GPIO (This is a bit pointless for Chibios as we are creating a PAL ontop of a PAL but it is necessary for uniformity with AVR) - Modified matrix.c to use the above functions * minor ifdef fix * Rename of functions and docs - Added documentation. - Renamed functions according to Jack's spec. * Massdrop fix * Update matrix.c * Update quantum.h * Update quantum.h * Update quantum.h * Update internals_gpio_control.md --- docs/internals_gpio_control.md | 23 ++++ quantum/config_common.h | 199 ++++++++++++++++++++++++--------- quantum/matrix.c | 49 +++----- quantum/quantum.h | 69 ++++++++++-- 4 files changed, 244 insertions(+), 96 deletions(-) create mode 100644 docs/internals_gpio_control.md diff --git a/docs/internals_gpio_control.md b/docs/internals_gpio_control.md new file mode 100644 index 000000000000..21643d30c961 --- /dev/null +++ b/docs/internals_gpio_control.md @@ -0,0 +1,23 @@ +# GPIO Control + +QMK has a GPIO control abstraction layer which is micro-controller agnostic. This is done to allow easy access to pin control across different platforms. + +## Functions + +The following functions can provide basic control of GPIOs and are found in `quantum/quantum.h`. + +|Function |Description | +|----------------------|------------------------------------------------------------------| +|`setPinInput(pin)` |Set pin as input with high impedance (High-Z) | +|`setPinInputHigh(pin)`|Set pin as input with build in pull-up | +|`setPinInputLow(pin)` |Set pin as input with build in pull-down (Supported only on STM32)| +|`setPinOutput(pin)` |Set pin as output | +|`writePinHige(pin)` |Set pin level as high, assuming it is an output | +|`writePinLow(pin)` |Set pin level as low, assuming it is an output | +|`writePin(pin, level)`|Set pin level, assuming it is an output | +|`readPin(pin)` |Returns the level of the pin | + +## Advance settings + +Each micro-controller can have multiple advance settings regarding its GPIO. This abstraction layer does not limit the use of architecture specific functions. Advance users should consult the datasheet of there desired device and include any needed libraries. For AVR the standard avr/io.h library is used and for STM32 the Chibios [PAL library](http://chibios.sourceforge.net/docs3/hal/group___p_a_l.html) is used. + diff --git a/quantum/config_common.h b/quantum/config_common.h index f6f51b367da1..288617255f51 100644 --- a/quantum/config_common.h +++ b/quantum/config_common.h @@ -23,57 +23,154 @@ #define CUSTOM_MATRIX 2 /* Disables built-in matrix scanning code */ #ifdef __AVR__ - /* I/O pins */ - #ifndef F0 - #define B0 0x30 - #define B1 0x31 - #define B2 0x32 - #define B3 0x33 - #define B4 0x34 - #define B5 0x35 - #define B6 0x36 - #define B7 0x37 - #define C0 0x60 - #define C1 0x61 - #define C2 0x62 - #define C3 0x63 - #define C4 0x64 - #define C5 0x65 - #define C6 0x66 - #define C7 0x67 - #define D0 0x90 - #define D1 0x91 - #define D2 0x92 - #define D3 0x93 - #define D4 0x94 - #define D5 0x95 - #define D6 0x96 - #define D7 0x97 - #define E0 0xC0 - #define E1 0xC1 - #define E2 0xC2 - #define E3 0xC3 - #define E4 0xC4 - #define E5 0xC5 - #define E6 0xC6 - #define E7 0xC7 - #define F0 0xF0 - #define F1 0xF1 - #define F2 0xF2 - #define F3 0xF3 - #define F4 0xF4 - #define F5 0xF5 - #define F6 0xF6 - #define F7 0xF7 - #define A0 0x00 - #define A1 0x01 - #define A2 0x02 - #define A3 0x03 - #define A4 0x04 - #define A5 0x05 - #define A6 0x06 - #define A7 0x07 - #endif + /* I/O pins */ + #ifndef F0 + #define B0 0x30 + #define B1 0x31 + #define B2 0x32 + #define B3 0x33 + #define B4 0x34 + #define B5 0x35 + #define B6 0x36 + #define B7 0x37 + #define C0 0x60 + #define C1 0x61 + #define C2 0x62 + #define C3 0x63 + #define C4 0x64 + #define C5 0x65 + #define C6 0x66 + #define C7 0x67 + #define D0 0x90 + #define D1 0x91 + #define D2 0x92 + #define D3 0x93 + #define D4 0x94 + #define D5 0x95 + #define D6 0x96 + #define D7 0x97 + #define E0 0xC0 + #define E1 0xC1 + #define E2 0xC2 + #define E3 0xC3 + #define E4 0xC4 + #define E5 0xC5 + #define E6 0xC6 + #define E7 0xC7 + #define F0 0xF0 + #define F1 0xF1 + #define F2 0xF2 + #define F3 0xF3 + #define F4 0xF4 + #define F5 0xF5 + #define F6 0xF6 + #define F7 0xF7 + #define A0 0x00 + #define A1 0x01 + #define A2 0x02 + #define A3 0x03 + #define A4 0x04 + #define A5 0x05 + #define A6 0x06 + #define A7 0x07 + #endif +#elif defined(PROTOCOL_CHIBIOS) + #define A0 PAL_LINE(GPIOA, 0) + #define A1 PAL_LINE(GPIOA, 1) + #define A2 PAL_LINE(GPIOA, 2) + #define A3 PAL_LINE(GPIOA, 3) + #define A4 PAL_LINE(GPIOA, 4) + #define A5 PAL_LINE(GPIOA, 5) + #define A6 PAL_LINE(GPIOA, 6) + #define A7 PAL_LINE(GPIOA, 7) + #define A8 PAL_LINE(GPIOA, 8) + #define A9 PAL_LINE(GPIOA, 9) + #define A10 PAL_LINE(GPIOA, 10) + #define A11 PAL_LINE(GPIOA, 11) + #define A12 PAL_LINE(GPIOA, 12) + #define A13 PAL_LINE(GPIOA, 13) + #define A14 PAL_LINE(GPIOA, 14) + #define A15 PAL_LINE(GPIOA, 15) + #define B0 PAL_LINE(GPIOB, 0) + #define B1 PAL_LINE(GPIOB, 1) + #define B2 PAL_LINE(GPIOB, 2) + #define B3 PAL_LINE(GPIOB, 3) + #define B4 PAL_LINE(GPIOB, 4) + #define B5 PAL_LINE(GPIOB, 5) + #define B6 PAL_LINE(GPIOB, 6) + #define B7 PAL_LINE(GPIOB, 7) + #define B8 PAL_LINE(GPIOB, 8) + #define B9 PAL_LINE(GPIOB, 9) + #define B10 PAL_LINE(GPIOB, 10) + #define B11 PAL_LINE(GPIOB, 11) + #define B12 PAL_LINE(GPIOB, 12) + #define B13 PAL_LINE(GPIOB, 13) + #define B14 PAL_LINE(GPIOB, 14) + #define B15 PAL_LINE(GPIOB, 15) + #define C0 PAL_LINE(GPIOC, 0) + #define C1 PAL_LINE(GPIOC, 1) + #define C2 PAL_LINE(GPIOC, 2) + #define C3 PAL_LINE(GPIOC, 3) + #define C4 PAL_LINE(GPIOC, 4) + #define C5 PAL_LINE(GPIOC, 5) + #define C6 PAL_LINE(GPIOC, 6) + #define C7 PAL_LINE(GPIOC, 7) + #define C8 PAL_LINE(GPIOC, 8) + #define C9 PAL_LINE(GPIOC, 9) + #define C10 PAL_LINE(GPIOC, 10) + #define C11 PAL_LINE(GPIOC, 11) + #define C12 PAL_LINE(GPIOC, 12) + #define C13 PAL_LINE(GPIOC, 13) + #define C14 PAL_LINE(GPIOC, 14) + #define C15 PAL_LINE(GPIOC, 15) + #define D0 PAL_LINE(GPIOD, 0) + #define D1 PAL_LINE(GPIOD, 1) + #define D2 PAL_LINE(GPIOD, 2) + #define D3 PAL_LINE(GPIOD, 3) + #define D4 PAL_LINE(GPIOD, 4) + #define D5 PAL_LINE(GPIOD, 5) + #define D6 PAL_LINE(GPIOD, 6) + #define D7 PAL_LINE(GPIOD, 7) + #define D8 PAL_LINE(GPIOD, 8) + #define D9 PAL_LINE(GPIOD, 9) + #define D10 PAL_LINE(GPIOD, 10) + #define D11 PAL_LINE(GPIOD, 11) + #define D12 PAL_LINE(GPIOD, 12) + #define D13 PAL_LINE(GPIOD, 13) + #define D14 PAL_LINE(GPIOD, 14) + #define D15 PAL_LINE(GPIOD, 15) + #define E0 PAL_LINE(GPIOE, 0) + #define E1 PAL_LINE(GPIOE, 1) + #define E2 PAL_LINE(GPIOE, 2) + #define E3 PAL_LINE(GPIOE, 3) + #define E4 PAL_LINE(GPIOE, 4) + #define E5 PAL_LINE(GPIOE, 5) + #define E6 PAL_LINE(GPIOE, 6) + #define E7 PAL_LINE(GPIOE, 7) + #define E8 PAL_LINE(GPIOE, 8) + #define E9 PAL_LINE(GPIOE, 9) + #define E10 PAL_LINE(GPIOE, 10) + #define E11 PAL_LINE(GPIOE, 11) + #define E12 PAL_LINE(GPIOE, 12) + #define E13 PAL_LINE(GPIOE, 13) + #define E14 PAL_LINE(GPIOE, 14) + #define E15 PAL_LINE(GPIOE, 15) + #define F0 PAL_LINE(GPIOF, 0) + #define F1 PAL_LINE(GPIOF, 1) + #define F2 PAL_LINE(GPIOF, 2) + #define F3 PAL_LINE(GPIOF, 3) + #define F4 PAL_LINE(GPIOF, 4) + #define F5 PAL_LINE(GPIOF, 5) + #define F6 PAL_LINE(GPIOF, 6) + #define F7 PAL_LINE(GPIOF, 7) + #define F8 PAL_LINE(GPIOF, 8) + #define F9 PAL_LINE(GPIOF, 9) + #define F10 PAL_LINE(GPIOF, 10) + #define F11 PAL_LINE(GPIOF, 11) + #define F12 PAL_LINE(GPIOF, 12) + #define F13 PAL_LINE(GPIOF, 13) + #define F14 PAL_LINE(GPIOF, 14) + #define F15 PAL_LINE(GPIOF, 15) #endif /* USART configuration */ diff --git a/quantum/matrix.c b/quantum/matrix.c index 3600d4e7b54c..9b5ce33d2395 100644 --- a/quantum/matrix.c +++ b/quantum/matrix.c @@ -1,5 +1,5 @@ /* -Copyright 2012-2017 Jun Wako, Jack Humbert +Copyright 2012-2018 Jun Wako, Jack Humbert, Yiancar 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 @@ -16,15 +16,13 @@ along with this program. If not, see . */ #include #include -#if defined(__AVR__) -#include -#endif #include "wait.h" #include "print.h" #include "debug.h" #include "util.h" #include "matrix.h" #include "timer.h" +#include "quantum.h" /* Set 0 if debouncing isn't needed */ @@ -60,8 +58,8 @@ along with this program. If not, see . #endif #if (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW) -static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; -static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; +static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; #endif /* matrix state(1:on, 0:off) */ @@ -271,9 +269,7 @@ uint8_t matrix_key_count(void) static void init_cols(void) { for(uint8_t x = 0; x < MATRIX_COLS; x++) { - uint8_t pin = col_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInputHigh(col_pins[x]); } } @@ -293,8 +289,7 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { // Select the col pin to read (active low) - uint8_t pin = col_pins[col_index]; - uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); + uint8_t pin_state = readPin(col_pins[col_index]); // Populate the matrix row with the state of the col pin current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); @@ -308,24 +303,19 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) static void select_row(uint8_t row) { - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + setPinOutput(row_pins[row]); + writePinLow(row_pins[row]); } static void unselect_row(uint8_t row) { - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInputHigh(row_pins[row]); } static void unselect_rows(void) { for(uint8_t x = 0; x < MATRIX_ROWS; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInput(row_pins[x]); } } @@ -334,9 +324,7 @@ static void unselect_rows(void) static void init_rows(void) { for(uint8_t x = 0; x < MATRIX_ROWS; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInputHigh(row_pins[x]); } } @@ -356,7 +344,7 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) matrix_row_t last_row_value = current_matrix[row_index]; // Check row pin state - if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) + if (readPin(row_pins[row_index]) == 0) { // Pin LO, set col bit current_matrix[row_index] |= (ROW_SHIFTER << current_col); @@ -382,24 +370,19 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) static void select_col(uint8_t col) { - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + setPinOutput(col_pins[col]); + writePinLow(col_pins[col]); } static void unselect_col(uint8_t col) { - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInputHigh(col_pins[col]); } static void unselect_cols(void) { for(uint8_t x = 0; x < MATRIX_COLS; x++) { - uint8_t pin = col_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + setPinInputHigh(col_pins[x]); } } diff --git a/quantum/quantum.h b/quantum/quantum.h index 7cf16d81e68b..6833332117b8 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -1,4 +1,4 @@ -/* Copyright 2016-2017 Erez Zukerman, Jack Humbert +/* Copyright 2016-2018 Erez Zukerman, Jack Humbert, Yiancar * * 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 @@ -17,9 +17,12 @@ #define QUANTUM_H #if defined(__AVR__) -#include -#include -#include + #include + #include + #include +#endif +#if defined(PROTOCOL_CHIBIOS) + #include "hal.h" #endif #include "wait.h" #include "matrix.h" @@ -33,11 +36,11 @@ #ifdef RGBLIGHT_ENABLE #include "rgblight.h" #else - #ifdef RGB_MATRIX_ENABLE - /* dummy define RGBLIGHT_MODE_xxxx */ - #define RGBLIGHT_H_DUMMY_DEFINE - #include "rgblight.h" - #endif + #ifdef RGB_MATRIX_ENABLE + /* dummy define RGBLIGHT_MODE_xxxx */ + #define RGBLIGHT_H_DUMMY_DEFINE + #include "rgblight.h" + #endif #endif #ifdef SPLIT_KEYBOARD @@ -76,9 +79,9 @@ extern uint32_t default_layer_state; #ifdef AUDIO_ENABLE #include "audio.h" #include "process_audio.h" - #ifdef AUDIO_CLICKY - #include "process_clicky.h" - #endif // AUDIO_CLICKY + #ifdef AUDIO_CLICKY + #include "process_clicky.h" + #endif // AUDIO_CLICKY #endif #ifdef STENO_ENABLE @@ -133,6 +136,48 @@ extern uint32_t default_layer_state; #include "hd44780.h" #endif +//Function substitutions to ease GPIO manipulation +#ifdef __AVR__ + #define pin_t uint8_t + #define setPinInput(pin) _SFR_IO8((pin >> 4) + 1) &= ~ _BV(pin & 0xF) + #define setPinInputHigh(pin) ({\ + _SFR_IO8((pin >> 4) + 1) &= ~ _BV(pin & 0xF);\ + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF);\ + }) + #define setPinInputLow(pin) _Static_assert(0, "AVR Processors cannot impliment an input as pull low") + #define setPinOutput(pin) _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF) + + #define writePinHigh(pin) _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF) + #define writePinLow(pin) _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF) + static inline void writePin(pin_t pin, uint8_t level){ + if (level){ + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); + } else { + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); + } + } + + #define readPin(pin) (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)) +#elif defined(PROTOCOL_CHIBIOS) + #define pin_t ioline_t + #define setPinInput(pin) palSetLineMode(pin, PAL_MODE_INPUT) + #define setPinInputHigh(pin) palSetLineMode(pin, PAL_MODE_INPUT_PULLUP) + #define setPinInputLow(pin) palSetLineMode(pin, PAL_MODE_INPUT_PULLDOWN) + #define setPinOutput(pin) palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL) + + #define writePinHigh(pin) palSetLine(pin) + #define writePinLow(pin) palClearLine(pin) + static inline void writePin(pin_t pin, uint8_t level){ + if (level){ + palSetLine(pin); + } else { + palClearLine(pin); + } + } + + #define readPin(pin) palReadLine(pin) +#endif + #define STRINGIZE(z) #z #define ADD_SLASH_X(y) STRINGIZE(\x ## y) #define SYMBOL_STR(x) ADD_SLASH_X(x) From daa11dc414d505076ebdf147a4e2c800b8a06190 Mon Sep 17 00:00:00 2001 From: Wilba6582 Date: Sat, 29 Sep 2018 02:01:00 +1000 Subject: [PATCH 073/505] Changed VID/PID, added commands, refactoring --- keyboards/rama/m60_a/config.h | 4 +- keyboards/zeal60/zeal60.c | 134 ++++++++++++++++------------------ keyboards/zeal60/zeal60_api.h | 9 ++- 3 files changed, 74 insertions(+), 73 deletions(-) diff --git a/keyboards/rama/m60_a/config.h b/keyboards/rama/m60_a/config.h index 45e7d8896386..03794965fcfc 100644 --- a/keyboards/rama/m60_a/config.h +++ b/keyboards/rama/m60_a/config.h @@ -18,8 +18,8 @@ #include "config_common.h" // USB Device descriptor parameter -#define VENDOR_ID 0xFEED // This is same as Zeal60 for now -#define PRODUCT_ID 0x6060 // This is same as Zeal60 for now +#define VENDOR_ID 0x5241 // "RW" +#define PRODUCT_ID 0x060A // 60-A #define DEVICE_VER 0x0001 #define MANUFACTURER RAMA.WORKS #define PRODUCT RAMA M60-A diff --git a/keyboards/zeal60/zeal60.c b/keyboards/zeal60/zeal60.c index 092235ca61bb..be54f75f3d10 100644 --- a/keyboards/zeal60/zeal60.c +++ b/keyboards/zeal60/zeal60.c @@ -38,6 +38,14 @@ void eeprom_set_valid(bool valid) eeprom_update_byte(((void*)EEPROM_VERSION_ADDR), valid ? EEPROM_VERSION : 0xFF); } +void eeprom_reset(void) +{ + // Set the Zeal60 specific EEPROM state as invalid. + eeprom_set_valid(false); + // Set the TMK/QMK EEPROM state as invalid. + eeconfig_disable(); +} + #ifdef RAW_ENABLE void raw_hid_receive( uint8_t *data, uint8_t length ) @@ -54,7 +62,7 @@ void raw_hid_receive( uint8_t *data, uint8_t length ) } case id_get_keyboard_value: { - if ( command_data[0] == 0x01 ) + if ( command_data[0] == id_uptime ) { uint32_t value = timer_read32(); command_data[1] = (value >> 24 ) & 0xFF; @@ -104,6 +112,21 @@ void raw_hid_receive( uint8_t *data, uint8_t length ) break; } #endif // RGB_BACKLIGHT_ENABLED + case id_eeprom_reset: + { + eeprom_reset(); + break; + } + case id_bootloader_jump: + { + // Need to send data back before the jump + // Informs host that the command is handled + raw_hid_send( data, length ); + // Give host time to read it + wait_ms(100); + bootloader_jump(); + break; + } default: { // Unhandled message. @@ -119,74 +142,61 @@ void raw_hid_receive( uint8_t *data, uint8_t length ) #endif -void bootmagic_lite(void) +void main_init(void) { - // The lite version of TMK's bootmagic. - // 100% less potential for accidentally making the - // keyboard do stupid things. - - // We need multiple scans because debouncing can't be turned off. - matrix_scan(); - wait_ms(DEBOUNCING_DELAY); - wait_ms(DEBOUNCING_DELAY); - matrix_scan(); - - // If the Esc and space bar are held down on power up, - // reset the EEPROM valid state and jump to bootloader. - // Assumes Esc is at [0,0] and spacebar is at [4,7]. - // This isn't very generalized, but we need something that doesn't - // rely on user's keymaps in firmware or EEPROM. - if ( ( matrix_get_row(0) & (1<<0) ) && - ( matrix_get_row(4) & (1<<7) ) ) - { - // Set the Zeal60 specific EEPROM state as invalid. - eeprom_set_valid(false); - // Set the TMK/QMK EEPROM state as invalid. - eeconfig_disable(); - // Jump to bootloader. - bootloader_jump(); - } -} - -void matrix_init_kb(void) -{ - bootmagic_lite(); - // If the EEPROM has the magic, the data is good. // OK to load from EEPROM. - if (eeprom_is_valid()) - { + if (eeprom_is_valid()) { #if RGB_BACKLIGHT_ENABLED backlight_config_load(); #endif // RGB_BACKLIGHT_ENABLED - // TODO: do something to "turn on" keymaps in EEPROM? - } - else - { + } else { #if RGB_BACKLIGHT_ENABLED // If the EEPROM has not been saved before, or is out of date, // save the default values to the EEPROM. Default values // come from construction of the zeal_backlight_config instance. backlight_config_save(); #endif // RGB_BACKLIGHT_ENABLED - #ifdef DYNAMIC_KEYMAP_ENABLE // This resets the keymaps in EEPROM to what is in flash. dynamic_keymap_reset(); #endif - // Save the magic number last, in case saving was interrupted eeprom_set_valid(true); } - #if RGB_BACKLIGHT_ENABLED // Initialize LED drivers for backlight. backlight_init_drivers(); - + backlight_timer_init(); backlight_timer_enable(); #endif // RGB_BACKLIGHT_ENABLED +} +void bootmagic_lite(void) +{ + // The lite version of TMK's bootmagic. + // 100% less potential for accidentally making the + // keyboard do stupid things. + + // We need multiple scans because debouncing can't be turned off. + matrix_scan(); + wait_ms(DEBOUNCING_DELAY); + wait_ms(DEBOUNCING_DELAY); + matrix_scan(); + + // If the Esc (matrix 0,0) is held down on power up, + // reset the EEPROM valid state and jump to bootloader. + if ( matrix_get_row(0) & (1<<0) ) { + eeprom_reset(); + bootloader_jump(); + } +} + +void matrix_init_kb(void) +{ + bootmagic_lite(); + main_init(); matrix_init_user(); } @@ -205,29 +215,22 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) process_record_backlight(keycode, record); #endif // BACKLIGHT_ENABLED - switch(keycode) - { + switch(keycode) { case FN_MO13: - if (record->event.pressed) - { + if (record->event.pressed) { layer_on(1); update_tri_layer(1, 2, 3); - } - else - { + } else { layer_off(1); update_tri_layer(1, 2, 3); } return false; break; case FN_MO23: - if (record->event.pressed) - { + if (record->event.pressed) { layer_on(2); update_tri_layer(1, 2, 3); - } - else - { + } else { layer_off(2); update_tri_layer(1, 2, 3); } @@ -247,8 +250,7 @@ uint16_t keymap_function_id_to_action( uint16_t function_id ) if ( function_id >= 0x0F00 && function_id <= 0x0FFF ) { uint8_t id = function_id & 0xFF; - switch ( id ) - { + switch ( id ) { case TRIPLE_TAP_1_3: case TRIPLE_TAP_2_3: { @@ -293,24 +295,16 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { case TRIPLE_TAP_1_3: case TRIPLE_TAP_2_3: - if (record->event.pressed) - { + if (record->event.pressed) { layer_on( id == TRIPLE_TAP_1_3 ? 1 : 2 ); - - if (record->tap.count && !record->tap.interrupted) - { - if (record->tap.count >= 3) - { + if (record->tap.count && !record->tap.interrupted) { + if (record->tap.count >= 3) { layer_invert(3); } - } - else - { + } else { record->tap.count = 0; } - } - else - { + } else { layer_off( id == TRIPLE_TAP_1_3 ? 1 : 2 ); } break; diff --git a/keyboards/zeal60/zeal60_api.h b/keyboards/zeal60/zeal60_api.h index eaac3ad7ce17..a65bf2f509f8 100644 --- a/keyboards/zeal60/zeal60_api.h +++ b/keyboards/zeal60/zeal60_api.h @@ -28,6 +28,13 @@ enum zeal60_command_id id_backlight_config_set_value, id_backlight_config_get_value, id_backlight_config_save, - + id_eeprom_reset, + id_bootloader_jump, id_unhandled = 0xFF, }; + +enum zeal60_keyboard_value_id +{ + id_uptime = 0x01 +}; + From f1b2d46eafbec2b834dc4bcb5ba2dac9f913eed8 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Fri, 28 Sep 2018 11:34:40 -0700 Subject: [PATCH 074/505] Spell-check update for Userspace documentation Because leaving review comments on a PR that's already been merged doesn't make any sense. --- docs/feature_userspace.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/feature_userspace.md b/docs/feature_userspace.md index b7fc9d809965..5a9fc287b3e1 100644 --- a/docs/feature_userspace.md +++ b/docs/feature_userspace.md @@ -100,7 +100,7 @@ Additionally, this is a good place to document your code, if you wish to share i # Examples For a brief example, checkout [`/users/_example/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna). -For a more complicaed example, checkout [`/users/drashna/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna)'s userspace. +For a more complicated example, checkout [`/users/drashna/`](https://github.com/qmk/qmk_firmware/tree/master/users/drashna)'s userspace. ## Customized Functions @@ -124,7 +124,7 @@ uint32_t layer_state_set_user (uint32_t state) { return layer_state_set_keymap (state); } ``` -The `__attribute__ ((weak))` part tells the compiler that this is a placce holder function that can then be replaced by a version in your `keymap.c`. That way, you don't need to add it to your `keymap.c`, but if you do, you won't get any conflicts because the function is the same name. +The `__attribute__ ((weak))` part tells the compiler that this is a placeholder function that can then be replaced by a version in your `keymap.c`. That way, you don't need to add it to your `keymap.c`, but if you do, you won't get any conflicts because the function is the same name. The `_keymap` part here doesn't matter, it just needs to be something other than `_quantum`, `_kb`, or `_user`, since those are already in use. So you could use `layer_state_set_mine`, `layer_state_set_fn`, or anything else. @@ -140,7 +140,7 @@ ifeq ($(strip $(MACROS_ENABLED)), yes) OPT_DEFS += -DMACROS_ENABLED endif ``` -The `OPT_DEFS` setting causee `MACROS_ENABLED` to be defined for your keyboards (note the `-D` in front of the name), and you could use `#ifdef MACROS_ENABLED` to check the status in your c/h files, and handle that code based on that. +The `OPT_DEFS` setting causes `MACROS_ENABLED` to be defined for your keyboards (note the `-D` in front of the name), and you could use `#ifdef MACROS_ENABLED` to check the status in your c/h files, and handle that code based on that. Then you add `MACROS_ENABLED = yes` to the `rules.mk` for you keymap to enable this feature and the code in your userspace. @@ -220,7 +220,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } ``` -This will add a new `KC_MAKE` keycode that can be used in any of your keymaps. And this keycode will output `make :`, making frequent compiling easier. And this will work with any keyboard and any keymap as it will output the current boards info, so that you don't have to type this out every time. +This will add a new `KC_MAKE` keycode that can be used in any of your keymaps. And this keycode will output `make :`, making frequent compiling easier. And this will work with any keyboard and any keymap as it will output the current boards info, so that you don't have to type this out every time. Additionally, this should flash the newly compiled firmware automatically, using the correct utility, based on the bootloader settings (or default to just generating the HEX file). However, it should be noted that this may not work on all systems. AVRDUDE doesn't work on WSL, namely (and will dump the HEX in the ".build" folder instead). From cb468e030712731cffb288cb6d8433cf3b953491 Mon Sep 17 00:00:00 2001 From: Ethan Madden Date: Fri, 28 Sep 2018 12:44:15 -0700 Subject: [PATCH 075/505] Keymap: Clicky frequency modulation (#4012) Also worked around my busted dipswitch 2... --- .../planck/keymaps/jetpacktuxedo/keymap.c | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/keyboards/planck/keymaps/jetpacktuxedo/keymap.c b/keyboards/planck/keymaps/jetpacktuxedo/keymap.c index 132405686265..b344bd0767af 100644 --- a/keyboards/planck/keymaps/jetpacktuxedo/keymap.c +++ b/keyboards/planck/keymaps/jetpacktuxedo/keymap.c @@ -188,15 +188,24 @@ uint16_t muse_counter = 0; uint8_t muse_offset = 70; uint16_t muse_tempo = 20; +extern float clicky_rand; + void encoder_update(bool clockwise) { if (is_clicky_on()) { - if (clockwise) { - clicky_freq_up(); + if (IS_LAYER_ON(_RAISE)) { + if (clockwise) { + clicky_rand += 0.5f; + } else { + clicky_rand -= 0.5f; + } } else { - clicky_freq_down(); + if (clockwise) { + clicky_freq_up(); + } else { + clicky_freq_down(); + } } - } else - if (muse_mode) { + } else if (muse_mode) { if (IS_LAYER_ON(_RAISE)) { if (clockwise) { muse_offset++; @@ -255,7 +264,8 @@ void dip_update(uint8_t index, bool active) { stop_all_notes(); #endif } - case 2: + break; + case 3: if (active) { clicky_on(); } else { From e4eeb1eb230a4d92f1c88197b71a07b342966e73 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 13:32:54 -0700 Subject: [PATCH 076/505] Fix RGB Matrix feature processing in common_features.mk Specifically, an "L" got appended to the controller names for te "valid types", but did not get appended to the blocks that include the specific drives. So, this breaks anything that isn't "Yes". --- common_features.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common_features.mk b/common_features.mk index 6c835abde672..65ff6b5b3844 100644 --- a/common_features.mk +++ b/common_features.mk @@ -115,7 +115,7 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) endif RGB_MATRIX_ENABLE ?= no -VALID_MATRIX_TYPES := yes IS31FL3731L IS31FL3733L custom +VALID_MATRIX_TYPES := yes IS31FL3731 IS31FL3733 custom ifneq ($(strip $(RGB_MATRIX_ENABLE)), no) ifeq ($(filter $(RGB_MATRIX_ENABLE),$(VALID_MATRIX_TYPES)),) $(error RGB_MATRIX_ENABLE="$(RGB_MATRIX_ENABLE)" is not a valid matrix type) From e2dee054d0649cb7b5b051a04a9bd82d14a0fdcd Mon Sep 17 00:00:00 2001 From: Takuya Urakawa Date: Sat, 29 Sep 2018 10:30:44 +0900 Subject: [PATCH 077/505] add st-link_cli flashing (#3899) * add st-link_cli support * format names --- tmk_core/chibios.mk | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tmk_core/chibios.mk b/tmk_core/chibios.mk index 25c49204bc22..014c8d502ad9 100644 --- a/tmk_core/chibios.mk +++ b/tmk_core/chibios.mk @@ -198,10 +198,13 @@ ifneq ("$(SERIAL)","") DFU_ARGS += -S $(SERIAL) endif +ST_LINK_ARGS ?= + # List any extra directories to look for libraries here. EXTRALIBDIRS = $(RULESPATH)/ld DFU_UTIL ?= dfu-util +ST_LINK_CLI ?= st-link_cli # Generate a .qmk for the QMK-FF qmk: $(BUILD_DIR)/$(TARGET).bin @@ -230,5 +233,8 @@ qmk: $(BUILD_DIR)/$(TARGET).bin dfu-util: $(BUILD_DIR)/$(TARGET).bin cpfirmware sizeafter $(DFU_UTIL) $(DFU_ARGS) -D $(BUILD_DIR)/$(TARGET).bin +st-link-cli: $(BUILD_DIR)/$(TARGET).hex sizeafter + $(ST_LINK_CLI) $(ST_LINK_ARGS) -q -c SWD -p $(BUILD_DIR)/$(TARGET).hex -Rst + bin: $(BUILD_DIR)/$(TARGET).bin sizeafter $(COPY) $(BUILD_DIR)/$(TARGET).bin $(TARGET).bin; From 239f02408e219567be060be7e65e92e888304ed0 Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Fri, 28 Sep 2018 21:32:15 -0400 Subject: [PATCH 078/505] Massdrop keyboard updates for SEND_STRING, syscalls, stdio, debug prints, Auto Shift (#3973) * Update for SEND_STRING usage Update for SEND_STRING usage. Sending keyboard reports (kbd, nkro) now obey the minimum polling time. While attempting to send a keyboard report and waiting for a USB poll, other functions of the keyboard, including LED effects and power management, will continue to operate at their intended intervals. * Updates for send string, syscalls, stdio, debug prints, auto shift Now properly waiting for previous keys sent over USB to complete before sending new. Added heap to linker and now compiling with syscalls support. Removed custom string functions and now using stdio. dprintf now works as intended through virtser device. * CTRL and ALT keymap updates CTRL mac keymap updated ALT default and mac keymap updated ALT rules.mk added Auto Shift with default no * Code cleanup as per discussion with vomindoraan Code cleanup as per discussion with vomindoraan --- keyboards/massdrop/alt/alt.h | 10 + .../massdrop/alt/keymaps/default/keymap.c | 35 +-- keyboards/massdrop/alt/keymaps/mac/keymap.c | 33 +-- keyboards/massdrop/alt/rules.mk | 1 + keyboards/massdrop/ctrl/ctrl.h | 10 + .../massdrop/ctrl/keymaps/default/keymap.c | 39 +-- keyboards/massdrop/ctrl/keymaps/mac/keymap.c | 41 +-- keyboards/massdrop/ctrl/rules.mk | 1 + .../1.0.70/gcc/gcc/samd51j18a_flash.ld | 16 +- tmk_core/arm_atsam.mk | 2 +- tmk_core/common/arm_atsam/printf.h | 2 +- tmk_core/common/print.h | 2 +- tmk_core/protocol/arm_atsam.mk | 1 - .../protocol/arm_atsam/arm_atsam_protocol.h | 1 - tmk_core/protocol/arm_atsam/d51_util.h | 10 + tmk_core/protocol/arm_atsam/main_arm_atsam.c | 136 +++++---- tmk_core/protocol/arm_atsam/usb/spfssf.c | 268 ------------------ tmk_core/protocol/arm_atsam/usb/spfssf.h | 57 ---- tmk_core/protocol/arm_atsam/usb/udi_cdc.c | 8 +- tmk_core/protocol/arm_atsam/usb/udi_cdc.h | 10 +- tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c | 10 +- tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h | 2 + 22 files changed, 175 insertions(+), 520 deletions(-) delete mode 100644 tmk_core/protocol/arm_atsam/usb/spfssf.c delete mode 100644 tmk_core/protocol/arm_atsam/usb/spfssf.h diff --git a/keyboards/massdrop/alt/alt.h b/keyboards/massdrop/alt/alt.h index 387985512ba0..8dfed8d2d6d8 100644 --- a/keyboards/massdrop/alt/alt.h +++ b/keyboards/massdrop/alt/alt.h @@ -22,3 +22,13 @@ { K45, KC_NO, K46, K47, K48, K49, K50, K51, K52, K53, K54, K55, K56, K57, K58, }, \ { K59, K60, K61, KC_NO, KC_NO, KC_NO, K62, KC_NO, KC_NO, KC_NO, K63, K64, K65, K66, K67, }, \ } + +#define TOGGLE_FLAG_AND_PRINT(var, name) { \ + if (var) { \ + dprintf(name " disabled\r\n"); \ + var = !var; \ + } else { \ + var = !var; \ + dprintf(name " enabled\r\n"); \ + } \ + } diff --git a/keyboards/massdrop/alt/keymaps/default/keymap.c b/keyboards/massdrop/alt/keymaps/default/keymap.c index 0cbce8629328..a5c443ffcde2 100644 --- a/keyboards/massdrop/alt/keymaps/default/keymap.c +++ b/keyboards/massdrop/alt/keymaps/default/keymap.c @@ -136,8 +136,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case L_T_BR: if (record->event.pressed) { led_animation_breathing = !led_animation_breathing; - if (led_animation_breathing) - { + if (led_animation_breathing) { gcr_breathe = gcr_desired; led_animation_breathe_cur = BREATHE_MIN_STEP; breathe_dir = 1; @@ -151,50 +150,32 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return false; case U_T_AUTO: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - usb_extra_manual = !usb_extra_manual; - CDC_print("USB extra port manual mode "); - CDC_print(usb_extra_manual ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); } return false; case U_T_AGCR: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - usb_gcr_auto = !usb_gcr_auto; - CDC_print("USB GCR auto mode "); - CDC_print(usb_gcr_auto ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); } return false; case DBG_TOG: if (record->event.pressed) { - debug_enable = !debug_enable; - CDC_print("Debug mode "); - CDC_print(debug_enable ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); } return false; case DBG_MTRX: if (record->event.pressed) { - debug_matrix = !debug_matrix; - CDC_print("Debug matrix "); - CDC_print(debug_matrix ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); } return false; case DBG_KBD: if (record->event.pressed) { - debug_keyboard = !debug_keyboard; - CDC_print("Debug keyboard "); - CDC_print(debug_keyboard ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); } return false; case DBG_MOU: if (record->event.pressed) { - debug_mouse = !debug_mouse; - CDC_print("Debug mouse "); - CDC_print(debug_mouse ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); } return false; case MD_BOOT: @@ -209,4 +190,4 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { default: return true; //Process all other keycodes normally } -} \ No newline at end of file +} diff --git a/keyboards/massdrop/alt/keymaps/mac/keymap.c b/keyboards/massdrop/alt/keymaps/mac/keymap.c index e886290e7e87..d6978fd80128 100644 --- a/keyboards/massdrop/alt/keymaps/mac/keymap.c +++ b/keyboards/massdrop/alt/keymaps/mac/keymap.c @@ -136,8 +136,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case L_T_BR: if (record->event.pressed) { led_animation_breathing = !led_animation_breathing; - if (led_animation_breathing) - { + if (led_animation_breathing) { gcr_breathe = gcr_desired; led_animation_breathe_cur = BREATHE_MIN_STEP; breathe_dir = 1; @@ -151,50 +150,32 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return false; case U_T_AUTO: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - usb_extra_manual = !usb_extra_manual; - CDC_print("USB extra port manual mode "); - CDC_print(usb_extra_manual ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); } return false; case U_T_AGCR: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - usb_gcr_auto = !usb_gcr_auto; - CDC_print("USB GCR auto mode "); - CDC_print(usb_gcr_auto ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); } return false; case DBG_TOG: if (record->event.pressed) { - debug_enable = !debug_enable; - CDC_print("Debug mode "); - CDC_print(debug_enable ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); } return false; case DBG_MTRX: if (record->event.pressed) { - debug_matrix = !debug_matrix; - CDC_print("Debug matrix "); - CDC_print(debug_matrix ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); } return false; case DBG_KBD: if (record->event.pressed) { - debug_keyboard = !debug_keyboard; - CDC_print("Debug keyboard "); - CDC_print(debug_keyboard ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); } return false; case DBG_MOU: if (record->event.pressed) { - debug_mouse = !debug_mouse; - CDC_print("Debug mouse "); - CDC_print(debug_mouse ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); } return false; case MD_BOOT: diff --git a/keyboards/massdrop/alt/rules.mk b/keyboards/massdrop/alt/rules.mk index daf679585280..c5539158f580 100644 --- a/keyboards/massdrop/alt/rules.mk +++ b/keyboards/massdrop/alt/rules.mk @@ -30,3 +30,4 @@ FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) VIRTSER_ENABLE = no # USB Serial Driver RAW_ENABLE = no # Raw device +AUTO_SHIFT_ENABLE = no # Auto Shift diff --git a/keyboards/massdrop/ctrl/ctrl.h b/keyboards/massdrop/ctrl/ctrl.h index dc7c7eabe5e5..c83efca16d15 100644 --- a/keyboards/massdrop/ctrl/ctrl.h +++ b/keyboards/massdrop/ctrl/ctrl.h @@ -30,3 +30,13 @@ { K59, K60, K61, K62, K63, K76, K50, K33 }, \ { K72, K73, K74, K75, K85, K86, K87, }, \ } + +#define TOGGLE_FLAG_AND_PRINT(var, name) { \ + if (var) { \ + dprintf(name " disabled\r\n"); \ + var = !var; \ + } else { \ + var = !var; \ + dprintf(name " enabled\r\n"); \ + } \ + } diff --git a/keyboards/massdrop/ctrl/keymaps/default/keymap.c b/keyboards/massdrop/ctrl/keymaps/default/keymap.c index 9bfb7fec58d7..88c1ac31239a 100644 --- a/keyboards/massdrop/ctrl/keymaps/default/keymap.c +++ b/keyboards/massdrop/ctrl/keymaps/default/keymap.c @@ -33,7 +33,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_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_UP, \ - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ ), [1] = LAYOUT( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, \ @@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_VOLD, \ L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, MD_BOOT, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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] = LAYOUT( @@ -50,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ ), */ }; @@ -139,8 +139,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case L_T_BR: if (record->event.pressed) { led_animation_breathing = !led_animation_breathing; - if (led_animation_breathing) - { + if (led_animation_breathing) { gcr_breathe = gcr_desired; led_animation_breathe_cur = BREATHE_MIN_STEP; breathe_dir = 1; @@ -154,50 +153,32 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return false; case U_T_AUTO: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - usb_extra_manual = !usb_extra_manual; - CDC_print("USB extra port manual mode "); - CDC_print(usb_extra_manual ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); } return false; case U_T_AGCR: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - usb_gcr_auto = !usb_gcr_auto; - CDC_print("USB GCR auto mode "); - CDC_print(usb_gcr_auto ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); } return false; case DBG_TOG: if (record->event.pressed) { - debug_enable = !debug_enable; - CDC_print("Debug mode "); - CDC_print(debug_enable ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); } return false; case DBG_MTRX: if (record->event.pressed) { - debug_matrix = !debug_matrix; - CDC_print("Debug matrix "); - CDC_print(debug_matrix ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); } return false; case DBG_KBD: if (record->event.pressed) { - debug_keyboard = !debug_keyboard; - CDC_print("Debug keyboard "); - CDC_print(debug_keyboard ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); } return false; case DBG_MOU: if (record->event.pressed) { - debug_mouse = !debug_mouse; - CDC_print("Debug mouse "); - CDC_print(debug_mouse ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); } return false; case MD_BOOT: diff --git a/keyboards/massdrop/ctrl/keymaps/mac/keymap.c b/keyboards/massdrop/ctrl/keymaps/mac/keymap.c index a03f891e8c52..6c5dfe19c026 100644 --- a/keyboards/massdrop/ctrl/keymaps/mac/keymap.c +++ b/keyboards/massdrop/ctrl/keymaps/mac/keymap.c @@ -33,15 +33,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_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_UP, \ - KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(1), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ ), [1] = LAYOUT( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MSTP, KC_VOLU, \ L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_VOLD, \ L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, MD_BOOT, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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] = LAYOUT( @@ -50,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ ), */ }; @@ -139,8 +139,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case L_T_BR: if (record->event.pressed) { led_animation_breathing = !led_animation_breathing; - if (led_animation_breathing) - { + if (led_animation_breathing) { gcr_breathe = gcr_desired; led_animation_breathe_cur = BREATHE_MIN_STEP; breathe_dir = 1; @@ -154,50 +153,32 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return false; case U_T_AUTO: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - usb_extra_manual = !usb_extra_manual; - CDC_print("USB extra port manual mode "); - CDC_print(usb_extra_manual ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); } return false; case U_T_AGCR: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - usb_gcr_auto = !usb_gcr_auto; - CDC_print("USB GCR auto mode "); - CDC_print(usb_gcr_auto ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); } return false; case DBG_TOG: if (record->event.pressed) { - debug_enable = !debug_enable; - CDC_print("Debug mode "); - CDC_print(debug_enable ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); } return false; case DBG_MTRX: if (record->event.pressed) { - debug_matrix = !debug_matrix; - CDC_print("Debug matrix "); - CDC_print(debug_matrix ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); } return false; case DBG_KBD: if (record->event.pressed) { - debug_keyboard = !debug_keyboard; - CDC_print("Debug keyboard "); - CDC_print(debug_keyboard ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); } return false; case DBG_MOU: if (record->event.pressed) { - debug_mouse = !debug_mouse; - CDC_print("Debug mouse "); - CDC_print(debug_mouse ? "enabled" : "disabled"); - CDC_print("\r\n"); + TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); } return false; case MD_BOOT: diff --git a/keyboards/massdrop/ctrl/rules.mk b/keyboards/massdrop/ctrl/rules.mk index daf679585280..c5539158f580 100644 --- a/keyboards/massdrop/ctrl/rules.mk +++ b/keyboards/massdrop/ctrl/rules.mk @@ -30,3 +30,4 @@ FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) VIRTSER_ENABLE = no # USB Serial Driver RAW_ENABLE = no # Raw device +AUTO_SHIFT_ENABLE = no # Auto Shift diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld index 3d114f5b7b8c..35db619717af 100644 --- a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld @@ -35,7 +35,7 @@ SEARCH_DIR(.) /* Memory Spaces Definitions */ MEMORY { - //rom (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000 +/*rom (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000*/ rom (rx) : ORIGIN = 0x00004000, LENGTH = 0x0003C000 ram (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00020000 bkupram (rwx) : ORIGIN = 0x47000000, LENGTH = 0x00002000 @@ -45,6 +45,9 @@ MEMORY /* The stack size used by the application. NOTE: you need to adjust according to your application. */ STACK_SIZE = DEFINED(STACK_SIZE) ? STACK_SIZE : DEFINED(__stack_size__) ? __stack_size__ : 0x8000; +/* The heap size used by the application. */ +HEAP_SIZE = DEFINED(HEAP_SIZE) ? HEAP_SIZE : DEFINED(__heap_size__) ? __heap_size__ : 0x800; + _srom = ORIGIN(rom); _lrom = LENGTH(rom); _erom = ORIGIN(rom) + LENGTH(rom); @@ -153,6 +156,17 @@ SECTIONS _ezero = .; } > ram + /* .heap section for syscalls */ + .heap (NOLOAD) : + { + . = ALIGN(4); + _end = .; + end = .; + _heap_start = .; + . = . + HEAP_SIZE; + _heap_end = .; + } > ram + /* stack section */ .stack (NOLOAD): { diff --git a/tmk_core/arm_atsam.mk b/tmk_core/arm_atsam.mk index ef412d59d659..06823fb629f9 100644 --- a/tmk_core/arm_atsam.mk +++ b/tmk_core/arm_atsam.mk @@ -36,7 +36,7 @@ LDFLAGS +=-Wl,--gc-sections LDFLAGS += -Wl,-Map="%OUT%%PROJ_NAME%.map" LDFLAGS += -Wl,--start-group LDFLAGS += -Wl,--end-group -LDFLAGS += -Wl,--gc-sections +LDFLAGS += --specs=rdimon.specs LDFLAGS += -T$(LIB_PATH)/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld OPT_DEFS += -DPROTOCOL_ARM_ATSAM diff --git a/tmk_core/common/arm_atsam/printf.h b/tmk_core/common/arm_atsam/printf.h index 582c83bf5485..3206b40bdbc7 100644 --- a/tmk_core/common/arm_atsam/printf.h +++ b/tmk_core/common/arm_atsam/printf.h @@ -1,8 +1,8 @@ #ifndef _PRINTF_H_ #define _PRINTF_H_ -#define __xprintf dpf int dpf(const char *_Format, ...); +#define __xprintf dpf #endif //_PRINTF_H_ diff --git a/tmk_core/common/print.h b/tmk_core/common/print.h index 9cbe67bad67e..d9452765725d 100644 --- a/tmk_core/common/print.h +++ b/tmk_core/common/print.h @@ -29,7 +29,7 @@ #include #include "util.h" -#if defined(PROTOCOL_CHIBIOS) +#if defined(PROTOCOL_CHIBIOS) || defined(PROTOCOL_ARM_ATSAM) #define PSTR(x) x #endif diff --git a/tmk_core/protocol/arm_atsam.mk b/tmk_core/protocol/arm_atsam.mk index d535b64cd796..04e02790a0dc 100644 --- a/tmk_core/protocol/arm_atsam.mk +++ b/tmk_core/protocol/arm_atsam.mk @@ -10,7 +10,6 @@ SRC += $(ARM_ATSAM_DIR)/spi.c SRC += $(ARM_ATSAM_DIR)/startup.c SRC += $(ARM_ATSAM_DIR)/usb/main_usb.c -SRC += $(ARM_ATSAM_DIR)/usb/spfssf.c SRC += $(ARM_ATSAM_DIR)/usb/udc.c SRC += $(ARM_ATSAM_DIR)/usb/udi_cdc.c SRC += $(ARM_ATSAM_DIR)/usb/udi_hid.c diff --git a/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h b/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h index be73beccd7e4..2ba0991749cc 100644 --- a/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h +++ b/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h @@ -36,7 +36,6 @@ along with this program. If not, see . #include "issi3733_driver.h" #include "./usb/compiler.h" #include "./usb/udc.h" -#include "./usb/spfssf.h" #include "./usb/udi_cdc.h" #endif //MD_BOOTLOADER diff --git a/tmk_core/protocol/arm_atsam/d51_util.h b/tmk_core/protocol/arm_atsam/d51_util.h index 465889c7cbed..7a35f7989f7c 100644 --- a/tmk_core/protocol/arm_atsam/d51_util.h +++ b/tmk_core/protocol/arm_atsam/d51_util.h @@ -32,6 +32,16 @@ along with this program. If not, see . #define m15_on REG_PORT_OUTSET1 = 0x40000000 //PB30 High #define m15_off REG_PORT_OUTCLR1 = 0x40000000 //PB30 Low +//Debug Port PB23 +#define m27_ena REG_PORT_DIRSET1 = 0x800000 //PB23 Output +#define m27_on REG_PORT_OUTSET1 = 0x800000 //PB23 High +#define m27_off REG_PORT_OUTCLR1 = 0x800000 //PB23 Low + +//Debug Port PB31 +#define m28_ena REG_PORT_DIRSET1 = 0x80000000 //PB31 Output +#define m28_on REG_PORT_OUTSET1 = 0x80000000 //PB31 High +#define m28_off REG_PORT_OUTCLR1 = 0x80000000 //PB31 Low + #define m15_loop(M15X) {uint8_t M15L=M15X; while(M15L--){m15_on;CLK_delay_us(1);m15_off;}} void m15_print(uint32_t x); diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c index 8cc7767038d6..676dac4ea3bd 100644 --- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c +++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c @@ -31,6 +31,7 @@ along with this program. If not, see . //From keyboard's directory #include "config_led.h" +void main_subtasks(void); uint8_t keyboard_leds(void); void send_keyboard(report_keyboard_t *report); void send_mouse(report_mouse_t *report); @@ -65,7 +66,7 @@ void send_keyboard(report_keyboard_t *report) if (!keymap_config.nkro) { #endif //NKRO_ENABLE - dprint("s-kbd\r\n"); + while (udi_hid_kbd_b_report_trans_ongoing) { main_subtasks(); } //Run other tasks while waiting for USB to be free irqflags = __get_PRIMASK(); __disable_irq(); @@ -81,7 +82,7 @@ void send_keyboard(report_keyboard_t *report) } else { - dprint("s-nkro\r\n"); + while (udi_hid_nkro_b_report_trans_ongoing) { main_subtasks(); } //Run other tasks while waiting for USB to be free irqflags = __get_PRIMASK(); __disable_irq(); @@ -102,8 +103,6 @@ void send_mouse(report_mouse_t *report) #ifdef MOUSEKEY_ENABLE uint32_t irqflags; - dprint("s-mou\r\n"); - irqflags = __get_PRIMASK(); __disable_irq(); __DMB(); @@ -120,8 +119,6 @@ void send_mouse(report_mouse_t *report) void send_system(uint16_t data) { #ifdef EXTRAKEY_ENABLE - dprintf("s-exks %i\r\n", data); - uint32_t irqflags; irqflags = __get_PRIMASK(); @@ -142,8 +139,6 @@ void send_system(uint16_t data) void send_consumer(uint16_t data) { #ifdef EXTRAKEY_ENABLE - dprintf("s-exkc %i\r\n",data); - uint32_t irqflags; irqflags = __get_PRIMASK(); @@ -160,6 +155,77 @@ void send_consumer(uint16_t data) #endif //EXTRAKEY_ENABLE } +uint8_t g_drvid; + +void main_subtask_usb_state(void) +{ + if (usb_state == USB_STATE_POWERDOWN) + { + uint32_t timer_led = timer_read32(); + + led_on; + if (led_enabled) + { + for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++) + { + I2C3733_Control_Set(0); + } + } + while (usb_state == USB_STATE_POWERDOWN) + { + if (timer_read32() - timer_led > 1000) led_off; //Good to indicate went to sleep, but only for a second + } + if (led_enabled) + { + for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++) + { + I2C3733_Control_Set(1); + } + } + led_off; + } +} + +void main_subtask_led(void) +{ + led_matrix_task(); +} + +void main_subtask_power_check(void) +{ + static uint64_t next_5v_checkup = 0; + + if (CLK_get_ms() > next_5v_checkup) + { + next_5v_checkup = CLK_get_ms() + 5; + + v_5v = adc_get(ADC_5V); + v_5v_avg = 0.9 * v_5v_avg + 0.1 * v_5v; + + gcr_compute(); + } +} + +void main_subtask_usb_extra_device(void) +{ + static uint64_t next_usb_checkup = 0; + + if (CLK_get_ms() > next_usb_checkup) + { + next_usb_checkup = CLK_get_ms() + 10; + + USB_HandleExtraDevice(); + } +} + +void main_subtasks(void) +{ + main_subtask_usb_state(); + main_subtask_led(); + main_subtask_power_check(); + main_subtask_usb_extra_device(); +} + int main(void) { led_ena; @@ -201,9 +267,8 @@ int main(void) i2c_led_q_init(); - uint8_t drvid; - for (drvid=0;drvid 1000) led_off; //Good to indicate went to sleep, but only for a second - } - if (led_enabled) - { - for (drvid=0;drvid next_5v_checkup) - { - next_5v_checkup = CLK_get_ms() + 5; - - v_5v = adc_get(ADC_5V); - v_5v_avg = 0.9 * v_5v_avg + 0.1 * v_5v; - - gcr_compute(); - } - - if (CLK_get_ms() > next_usb_checkup) - { - next_usb_checkup = CLK_get_ms() + 10; - - USB_HandleExtraDevice(); - } + main_subtasks(); //Note these tasks will also be run while waiting for USB keyboard polling intervals #ifdef VIRTSER_ENABLE if (CLK_get_ms() > next_print) { next_print = CLK_get_ms() + 250; - //dpf("5v=%i 5vu=%i dlow=%i dhi=%i gca=%i gcd=%i\r\n",v_5v,v_5v_avg,v_5v_avg-V5_LOW,v_5v_avg-V5_HIGH,gcr_actual,gcr_desired); + dprintf("5v=%u 5vu=%u dlow=%u dhi=%u gca=%u gcd=%u\r\n",v_5v,v_5v_avg,v_5v_avg-V5_LOW,v_5v_avg-V5_HIGH,gcr_actual,gcr_desired); } #endif //VIRTSER_ENABLE } diff --git a/tmk_core/protocol/arm_atsam/usb/spfssf.c b/tmk_core/protocol/arm_atsam/usb/spfssf.c deleted file mode 100644 index 449a8bb7d074..000000000000 --- a/tmk_core/protocol/arm_atsam/usb/spfssf.c +++ /dev/null @@ -1,268 +0,0 @@ -#include "samd51j18a.h" -#include "stdarg.h" -#include "spfssf.h" -#include "usb_util.h" - -int vspf(char *_Dest, const char *_Format, va_list va) -{ - //va_list va; //Variable argument list variable - char *d = _Dest; //Pointer to dest - - //va_start(va,_Format); //Initialize the variable argument list - while (*_Format) //While not end of format string - { - if (*_Format == SPF_SPEC_START) //If current format string character is the specifier start character - { - _Format++; //Skip over the character - while (*_Format && *_Format <= 64) _Format++; //Forward past any options - if (*_Format == SPF_SPEC_START) *d++ = *_Format; //If the character is the specifier start character, output the character and advance dest - else if (*_Format == SPF_SPEC_LONG) //If the character is the long type - { - _Format++; //Skip over the character - if (*_Format == SPF_SPEC_DECIMAL) //If the character is the decimal type - { - int64_t buf = va_arg(va,int64_t); //Get the next value from the va list - //if (buf < 0) { *d++ = '-'; buf = -buf; } //If the given number is negative, add a negative sign to the dest and invert number - //spf_uint2str_32_3t(&d,buf,32); //Perform the conversion - d += UTIL_ltoa_radix(buf, d, 10); - } - else if (*_Format == SPF_SPEC_UNSIGNED) //If the character is the unsigned type - { - uint64_t num = va_arg(va,uint64_t); //Get the next value from the va list - //spf_uint2str_32_3t(&d,num,32); //Perform the conversion - d += UTIL_ltoa_radix(num, d, 10); - } - else if (*_Format == SPF_SPEC_UHINT || *_Format == SPF_SPEC_UHINT_UP) //If the character is the unsigned type - { - uint64_t buf = va_arg(va,uint64_t); //Get the next value from the va list - //spf_uint2hex_32(&d,(unsigned long) buf); - d += UTIL_ltoa_radix(buf, d, 16); - } - else //If the character was not a known type - { - *d++ = SPF_SPEC_START; //Output the start specifier - *d++ = SPF_SPEC_LONG; //Output the long type - *d++ = *_Format; //Output the unknown type - } - } - else if (*_Format == SPF_SPEC_DECIMAL) //If the character is the decimal type - { - int buf = va_arg(va,int); //Get the next value from the va list - //if (buf < 0) { *d++ = '-'; buf = -buf; } //If the given number is negative, add a negative sign to the dest and invert number - //spf_uint2str_32_3t(&d,buf,16); //Perform the conversion - d += UTIL_itoa(buf, d); - } - else if (*_Format == SPF_SPEC_INT) //If the character is the integer type - { - int buf = va_arg(va,int); //Get the next value from the va list - //if (buf < 0) { *d++ = '-'; buf = -buf; } //If the given number is negative, add a negative sign to the dest and inverted number - //spf_uint2str_32_3t(&d,buf,16); //Perform the conversion - d += UTIL_itoa(buf, d); - } - else if (*_Format == SPF_SPEC_UINT) //If the character is the unsigned integer type - { - int buf = va_arg(va,int); //Get the next value from the va list - //spf_uint2str_32_3t(&d,buf,16); //Perform the conversion - d += UTIL_utoa(buf, d); - } - else if (*_Format == SPF_SPEC_STRING) //If the character is the string type - { - char *buf = va_arg(va,char*); //Get the next value from the va list - while (*buf) *d++ = *buf++; //Perform the conversion (simply output characters and adcance pointers) - } - else if (*_Format == SPF_SPEC_UHINT || *_Format == SPF_SPEC_UHINT_UP) //If the character is the short type - { - int buf = va_arg(va,unsigned int); //Get the next value from the va list - //spf_uint2hex_32(&d,(unsigned long) buf); //Perform the conversion - d += UTIL_utoa(buf, d); - } - else //If the character type is unknown - { - *d++ = SPF_SPEC_START; //Output the start specifier - *d++ = *_Format; //Output the unknown type - } - } - else *d++ = *_Format; //If the character is unknown, output it to dest and advance dest - _Format++; //Advance the format buffer pointer to next character - } - //va_end(va); //End the variable argument list - - *d = '\0'; //Cap off the destination string with a zero - - return d - _Dest; //Return the length of the destintion buffer -} - -int spf(char *_Dest, const char *_Format, ...) -{ - va_list va; //Variable argument list variable - int result; - - va_start(va,_Format); //Initialize the variable argument list - result = vspf(_Dest, _Format, va); - va_end(va); - return result; -} - -//sscanf string to number (integer types) -int64_t ssf_ston(const char **_Src, uint32_t count, uint32_t *conv_count) -{ - int64_t value = 0; //Return value accumulator - uint32_t counter=count; //Counter to keep track of numbers converted - const char* p; //Pointer to first non space character - - while (*(*_Src) == SSF_SKIP_SPACE) (*_Src)++; //Forward through the whitespace to next non whitespace - - p = (*_Src); //Set pointer to first non space character - if (*p == '+' || *p == '-') (*_Src)++; //Skip over sign if any - while (*(*_Src) >= ASCII_NUM_START && - *(*_Src) <= ASCII_NUM_END && - counter) //While the source character is a digit and counter is not zero - { - value *= 10; //Multiply result by 10 to make room for next 1's place number - value += *(*_Src)++ - ASCII_NUM_START; //Add source number to value - counter--; //Decrement counter - } - if (counter - count == 0) return 0; //If no number conversion were performed, return 0 - if (*p == '-') value = -value; //If the number given was negative, make the result negative - - if (conv_count) (*conv_count)++; //Increment the converted count - return value; //Return the value -} - -uint64_t ssf_hton(const char **_Src, uint32_t count,uint32_t *conv_count) -{ - int64_t value=0; //Return value accumulator - uint32_t counter=count; //Counter to keep track of numbers converted - //const char* p; //Pointer to first non space character - char c; - - while (*(*_Src) == SSF_SKIP_SPACE) (*_Src)++; //Forward through the whitespace to next non whitespace - - //p = (*_Src); //Set pointer to first non space character - - while (counter) - { - c = *(*_Src)++; - if (c >= 'a' && c <= 'f') c -= ('a'-'A'); //toupper - if (c < '0' || (c > '9' && c < 'A') || c > 'F') break; - value *= 16; //Multiply result by 10 to make room for next 1's place number - c = c - '0'; - if (c > 9) c -= 7; - value += c; //Add source number to value - counter--; //Decrement counter - } - - if (counter - count == 0) return 0; //If no number conversion were performed, return 0 - //if (*p == '-') value = -value; //If the number given was negative, make the result negative - - if (conv_count) (*conv_count)++; //Increment the converted count - return value; -} - -//sscanf -int ssf(const char *_Src, const char *_Format, ...) -{ - va_list va; //Variable argument list variable - unsigned char looking_for=0; //Static char specified in format to be found in source - uint32_t conv_count=0; //Count of conversions made - - va_start(va,_Format); //Initialize the variable argument list - while (*_Format) //While the format string has not been fully read - { - if (looking_for != 0) //If we are looking for a matching character in the source string - { - while (*_Src != looking_for && *_Src) _Src++; //While the character is not found in the source string and not the end of the source - // string, increment the pointer position - if (*_Src == looking_for) _Src++; //If the character was found, step over it - else break; //Else the end was reached and the scan is now invalid (Could not find static character) - looking_for = 0; //Clear the looking for character - } - if (*_Format == SSF_SPEC_START) //If the current format character is the specifier start character - { - _Format++; //Step over the specifier start character - if (*_Format == SSF_SPEC_DECIMAL) //If the decimal specifier type is found - { - int *value=va_arg(va,int*); //User given destination address - //*value = (int)ssf_ston(&_Src,5,&conv_count); //Run conversion - *value = (int)ssf_ston(&_Src,10,&conv_count); //Run conversion - } - else if (*_Format == SSF_SPEC_LONG) //If the long specifier type is found - { - _Format++; //Skip over the specifier type - if (*_Format == SSF_SPEC_DECIMAL) //If the decimal specifier type is found - { - int64_t *value=va_arg(va,int64_t*); //User given destination address - //*value = (int64_t)ssf_ston(&_Src,10,&conv_count); //Run conversion - *value = (int64_t)ssf_ston(&_Src,19,&conv_count); //Run conversion - } - else if (*_Format == SSF_SPEC_UHINT) //If the decimal specifier type is found - { - uint64_t *value=va_arg(va,uint64_t *); //User given destination address - //*value = (uint64_t int)ssf_hton(&_Src,12,&conv_count); //Run conversion - *value = (uint64_t)ssf_hton(&_Src,16,&conv_count); //Run conversion - } - } - else if (*_Format == SSF_SPEC_SHORTINT) //If the short int specifier type is found - { - _Format++; //Skip over the specifier type - if (*_Format == SSF_SPEC_SHORTINT) //If the short int specifier type is found - { - _Format++; //Skip over the specifier type - if (*_Format == SSF_SPEC_DECIMAL) //If the decimal specifier type is found - { - unsigned char *value=va_arg(va,unsigned char*); //User given destination address - //*value = (unsigned char)ssf_ston(&_Src,3,&conv_count); //Run conversion - *value = (unsigned char)ssf_ston(&_Src,5,&conv_count); //Run conversion - } - } - } - else if (*_Format == SSF_SPEC_STRING) //If the specifier type is string - { - char *value=va_arg(va,char*); //User given destination address, max chars read pointer - while (*_Src == SSF_SKIP_SPACE) _Src++; //Forward through the whitespace to next non whitespace - while (*_Src != SSF_SKIP_SPACE && *_Src) *value++ = *_Src++; //While any character but space and not end of string and not end location, copy char to dest - *value = 0; //Cap off the string pointer with zero - conv_count++; //Increment the converted count - } - else if (*_Format == SSF_SPEC_VERSION) //If the specifier type is string - { - char *value=va_arg(va,char*); //User given destination address, max chars read pointer - while (*_Src == SSF_SKIP_SPACE) _Src++; //Forward through the whitespace to next non whitespace - while (*_Src != SSF_DELIM_COMMA && *_Src) *value++ = *_Src++; //While any character but space and not end of string and not end location, copy char to dest - *value = 0; //Cap off the string pointer with zero - conv_count++; //Increment the converted count - } - else if (*_Format >= ASCII_NUM_START && *_Format <= ASCII_NUM_END) - { - uint32_t len = (uint32_t)ssf_ston(&_Format,3,NULL); //Convert the given length - if (*_Format == SSF_SPEC_STRING) //If the specifier type is string - { - char *value=va_arg(va,char*),*e; //User given destination address, max chars read pointer - while (*_Src == SSF_SKIP_SPACE) _Src++; //Forward through the whitespace to next non whitespace - e = (char*)_Src+len; //Set a maximum length pointer location - while (*_Src != SSF_SKIP_SPACE && *_Src && _Src != e) *value++ = *_Src++; //While any character but space and not end of string and not end location, copy char to dest - *value = 0; //Cap off the string pointer with zero - conv_count++; //Increment the converted count - } - else if (*_Format == SSF_SPEC_VERSION) //If the specifier type is string - { - char *value=va_arg(va,char*),*e; //User given destination address, max chars read pointer - while (*_Src == SSF_SKIP_SPACE) _Src++; //Forward through the whitespace to next non whitespace - e = (char*)_Src+len; //Set a maximum length pointer location - while (*_Src != SSF_DELIM_COMMA && *_Src && _Src != e) *value++ = *_Src++; //While any character but space and not end of string and not end location, copy char to dest - *value = 0; //Cap off the string pointer with zero - conv_count++; //Increment the converted count - } - } - else if (*_Format == SSF_SPEC_START) looking_for = *_Format; //If another start specifier character is found, output a specifier character - else break; //Scan is now invalid (Uknown type specified) - } - else if (*_Format == SSF_SKIP_SPACE) { } //If a space is found, ignore it - else looking_for = *_Format; //If any other character is found, it is static and should be found in src as well - _Format++; //Skip over current format character - } - - va_end(va); //End the variable argument list - return conv_count; //Return the number of conversions made -} - diff --git a/tmk_core/protocol/arm_atsam/usb/spfssf.h b/tmk_core/protocol/arm_atsam/usb/spfssf.h deleted file mode 100644 index 337a904dfee7..000000000000 --- a/tmk_core/protocol/arm_atsam/usb/spfssf.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef ____spfssf_h -#define ____spfssf_h - -#include - -#define sprintf spf -#define sscanf ssf - -#define SIZEOF_OFFSET 1 - -#ifndef NULL -#define NULL 0 -#endif - -#define SPF_NONE 0 - -#define SPF_SPEC_START 37 //% -#define SPF_SPEC_DECIMAL 100 //d 16bit dec signed (-32767 to 32767) DONE same as i -#define SPF_SPEC_INT 105 //i 16bit dec signed (-32767 to 32767) DONE same as d -#define SPF_SPEC_UINT 117 //u 16bit dec unsigned (0 to 65535) DONE -#define SPF_SPEC_STRING 115 //s variable length (abcd...) DONE -#define SPF_SPEC_UHINT 120 //x 16bit hex lwrc (7fa) DONE -#define SPF_SPEC_UHINT_UP 88 //x 16bit hex lwrc (7fa) DONE -#define SPF_SPEC_LONG 108 //l start of either ld or lu DONE -#define SPF_SPEC_DECIMAL 100 //ld 32bit dec signed (-2147483647 to 2147483647) DONE -#define SPF_SPEC_UNSIGNED 117 //lu 32bit dec unsigned (0 to 4294967295) DONE -#define SPF_SPEC_UHINT 120 //lx 32bit hex unsigned (0 to ffffffff) DONE - -#define SSF_SPEC_START 37 //% -#define SSF_SPEC_SHORTINT 104 //h 8bit dec signed (-127 to 127) DONE -#define SSF_LEN_SHORTINT 3 //hhd -#define SSF_SPEC_DECIMAL 100 //d 16bit dec signed (-32767 to 32767) DONE -#define SSF_LEN_DECIMAL 5 //32767 -#define SSF_SPEC_INT 105 //i 16bit dec signed (-32767 to 32767) DONE -#define SSF_LEN_INT 5 //32767 -#define SSF_SPEC_LONG 108 //l start of either ld or lu DONE -#define SSF_SPEC_DECIMAL 100 //ld 32bit dec signed (-2147483647 to 2147483647) DONE -#define SSF_SPEC_UHINT 120 //lx 32bit hex unsigned DONE -#define SSF_LEN_LDECIMAL 10 //2147483647 -#define SSF_SPEC_STRING 115 //s variable length (abcd...) DONE -#define SSF_SKIP_SPACE 32 //space - -#define SSF_SPEC_VERSION 118 //v collect to comma delimiter - special -#define SSF_DELIM_COMMA 44 //, - -#define ASCII_NUM_START 48 //0 -#define ASCII_NUM_END 58 //9 - -#define T_UINT32_0_LIMIT 14 -#define T_UINT32_1_LIMIT 27 - -int vspf(char *_Dest, const char *_Format, va_list va); -int spf(char *_Dest, const char *_Format, ...); -int ssf(const char *_Src, const char *_Format, ...); - -#endif //____spfssf_h - diff --git a/tmk_core/protocol/arm_atsam/usb/udi_cdc.c b/tmk_core/protocol/arm_atsam/usb/udi_cdc.c index b4159d325160..15f0f760cc35 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_cdc.c +++ b/tmk_core/protocol/arm_atsam/usb/udi_cdc.c @@ -54,7 +54,6 @@ #include #include "udi_cdc_conf.h" #include "udi_device_conf.h" -#include "spfssf.h" #include "stdarg.h" #include "tmk_core/protocol/arm_atsam/clks.h" @@ -1259,7 +1258,6 @@ uint32_t CDC_print(char *printbuf) return 1; } - char printbuf[CDC_PRINTBUF_SIZE]; int dpf(const char *_Format, ...) @@ -1267,8 +1265,8 @@ int dpf(const char *_Format, ...) va_list va; //Variable argument list variable int result; - va_start(va,_Format); //Initialize the variable argument list - result = vspf(printbuf, _Format, va); + va_start(va, _Format); //Initialize the variable argument list + result = vsnprintf(printbuf, CDC_PRINTBUF_SIZE, _Format, va); va_end(va); CDC_print(printbuf); @@ -1377,8 +1375,6 @@ void CDC_init(void) printbuf[0]=0; } -char printbuf[CDC_PRINTBUF_SIZE]; - #endif //CDC line 62 //@} diff --git a/tmk_core/protocol/arm_atsam/usb/udi_cdc.h b/tmk_core/protocol/arm_atsam/usb/udi_cdc.h index 6b70e96d0e2f..e134cf236089 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_cdc.h +++ b/tmk_core/protocol/arm_atsam/usb/udi_cdc.h @@ -57,8 +57,8 @@ #include "udi.h" // Check the number of port -#ifndef UDI_CDC_PORT_NB -# define UDI_CDC_PORT_NB 1 +#ifndef UDI_CDC_PORT_NB +# define UDI_CDC_PORT_NB 1 #endif #if (UDI_CDC_PORT_NB > 1) # error UDI_CDC_PORT_NB must be at most 1 @@ -86,9 +86,6 @@ extern UDC_DESC_STORAGE udi_api_t udi_api_cdc_data; //! CDC data endpoints size for FS speed (8B, 16B, 32B, 64B) #define UDI_CDC_DATA_EPS_FS_SIZE CDC_RX_SIZE -#define CDC_PRINT_BUF_SIZE 256 -extern char printbuf[CDC_PRINT_BUF_SIZE]; - //@} /** @@ -371,9 +368,6 @@ uint32_t CDC_print(char *printbuf); uint32_t CDC_input(void); void CDC_init(void); -#define __xprintf dpf -int dpf(const char *_Format, ...); - #ifdef __cplusplus } #endif diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c index 18f69350c0f1..1a6f7905e683 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c @@ -45,6 +45,7 @@ */ #include "samd51j18a.h" +#include "d51_util.h" #include "conf_usb.h" #include "usb_protocol.h" #include "udd.h" @@ -86,7 +87,7 @@ bool udi_hid_kbd_b_report_valid; COMPILER_WORD_ALIGNED uint8_t udi_hid_kbd_report[UDI_HID_KBD_REPORT_SIZE]; -static bool udi_hid_kbd_b_report_trans_ongoing; +volatile bool udi_hid_kbd_b_report_trans_ongoing; COMPILER_WORD_ALIGNED static uint8_t udi_hid_kbd_report_trans[UDI_HID_KBD_REPORT_SIZE]; @@ -186,8 +187,7 @@ bool udi_hid_kbd_send_report(void) return false; } - memcpy(udi_hid_kbd_report_trans, udi_hid_kbd_report, - UDI_HID_KBD_REPORT_SIZE); + memcpy(udi_hid_kbd_report_trans, udi_hid_kbd_report, UDI_HID_KBD_REPORT_SIZE); udi_hid_kbd_b_report_valid = false; udi_hid_kbd_b_report_trans_ongoing = udd_ep_run(UDI_HID_KBD_EP_IN | USB_EP_DIR_IN, @@ -249,7 +249,7 @@ bool udi_hid_nkro_b_report_valid; COMPILER_WORD_ALIGNED uint8_t udi_hid_nkro_report[UDI_HID_NKRO_REPORT_SIZE]; -static bool udi_hid_nkro_b_report_trans_ongoing; +volatile bool udi_hid_nkro_b_report_trans_ongoing; COMPILER_WORD_ALIGNED static uint8_t udi_hid_nkro_report_trans[UDI_HID_NKRO_REPORT_SIZE]; @@ -355,7 +355,7 @@ bool udi_hid_nkro_send_report(void) return false; } - memcpy(udi_hid_nkro_report_trans, udi_hid_nkro_report,UDI_HID_NKRO_REPORT_SIZE); + memcpy(udi_hid_nkro_report_trans, udi_hid_nkro_report, UDI_HID_NKRO_REPORT_SIZE); udi_hid_nkro_b_report_valid = false; udi_hid_nkro_b_report_trans_ongoing = udd_ep_run(UDI_HID_NKRO_EP_IN | USB_EP_DIR_IN, diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h index 9a2741534dd5..babfdb7a78da 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h @@ -60,6 +60,7 @@ extern "C" { #ifdef KBD extern UDC_DESC_STORAGE udi_api_t udi_api_hid_kbd; extern bool udi_hid_kbd_b_report_valid; +extern volatile bool udi_hid_kbd_b_report_trans_ongoing; extern uint8_t udi_hid_kbd_report_set; bool udi_hid_kbd_send_report(void); #endif //KBD @@ -70,6 +71,7 @@ bool udi_hid_kbd_send_report(void); #ifdef NKRO extern UDC_DESC_STORAGE udi_api_t udi_api_hid_nkro; extern bool udi_hid_nkro_b_report_valid; +extern volatile bool udi_hid_nkro_b_report_trans_ongoing; bool udi_hid_nkro_send_report(void); #endif //NKRO From ab83aedfabd7f11d914466d008ab5938b3e0107f Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 19:22:31 -0700 Subject: [PATCH 079/505] Second attempt to reduce the size of the USB BLE Converter (#4010) * Disable Leader to reduce firmware size for Travis * Additionaly fixes to USB_USB\BLE Keyboard converter * Disable One Shots to get USB to USB BLE converter to fit --- keyboards/converter/usb_usb/ble/config.h | 2 + keyboards/converter/usb_usb/ble/rules.mk | 2 +- keyboards/converter/usb_usb/keymap.c | 288 ----------------------- 3 files changed, 3 insertions(+), 289 deletions(-) delete mode 100644 keyboards/converter/usb_usb/keymap.c diff --git a/keyboards/converter/usb_usb/ble/config.h b/keyboards/converter/usb_usb/ble/config.h index 5333e17c82e4..3bf3b2963a82 100644 --- a/keyboards/converter/usb_usb/ble/config.h +++ b/keyboards/converter/usb_usb/ble/config.h @@ -11,3 +11,5 @@ #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION +#define NO_ACTION_ONESHOT + diff --git a/keyboards/converter/usb_usb/ble/rules.mk b/keyboards/converter/usb_usb/ble/rules.mk index 84aa767f543f..f5ab3880bfcf 100644 --- a/keyboards/converter/usb_usb/ble/rules.mk +++ b/keyboards/converter/usb_usb/ble/rules.mk @@ -4,7 +4,7 @@ F_CPU = 8000000 BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = no # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/converter/usb_usb/keymap.c b/keyboards/converter/usb_usb/keymap.c deleted file mode 100644 index 16f2a28092b6..000000000000 --- a/keyboards/converter/usb_usb/keymap.c +++ /dev/null @@ -1,288 +0,0 @@ -/* -Copyright 2017 Balz Guenat - -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 "keymap_common.h" - - -const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { - /* 0: plain Qwerty without layer switching - * ,---------------. ,---------------. ,---------------. - * |F13|F14|F15|F16| |F17|F18|F19|F20| |F21|F22|F23|F24| - * ,---. |---------------| |---------------| |---------------| ,-----------. ,---------------. ,-------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut|Pwr| | Help | - * `---' `---------------' `---------------' `---------------' `-----------' `---------------' `-------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. ,-------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| |Stp|Agn| - * |-----------------------------------------------------------| |-----------| |---------------| |-------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| |Mnu|Und| - * |-----------------------------------------------------------| `-----------' |---------------| |-------| - * |CapsL | A| S| D| F| G| H| J| K| L| ;| :| #|Retn| | 4| 5| 6|KP,| |Sel|Cpy| - * |-----------------------------------------------------------| ,---. |---------------| |-------| - * |Shft| <| Z| X| C| V| B| N| M| ,| ,| /| RO|Shift | |Up | | 1| 2| 3|KP=| |Exe|Pst| - * |-----------------------------------------------------------| ,-----------. |---------------| |-------| - * |Ctl|Gui|Alt|MHEN|HNJ| Space |H/E|HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| |Fnd|Cut| - * `-----------------------------------------------------------' `-----------' `---------------' `-------' - */ - // KEYMAP_ALL( - // F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - // ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, - // GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, - // TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, MENU,UNDO, - // CAPS,A, S, D, F, G, H, J, K, L, SCLN,QUOT, NUHS,ENT, P4, P5, P6, PCMM, SLCT,COPY, - // LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PEQL, EXEC,PSTE, - // LCTL,LGUI,LALT,MHEN,HANJ, SPC, HAEN,HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT, FIND,CUT - // ), - KEYMAP_ALL( - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, MENU,UNDO, - FN0, A, S, D, F, G, H, J, K, L, SCLN,QUOT, NUHS,ENT, P4, P5, P6, PCMM, SLCT,COPY, - LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PEQL, EXEC,PSTE, - LCTL,LGUI,LALT,MHEN,HANJ, SPC, HAEN,HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT, FIND,CUT - ), - KEYMAP_ALL( - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, - TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS, - GRV, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - CAPS,MPRV,VOLU,MNXT,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - TRNS,MUTE,VOLD,MPLY,TRNS,TRNS,LEFT,DOWN,UP, RGHT,TRNS,TRNS, TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS, TRNS,TRNS, TRNS,TRNS - ), -}; - -// const action_t fn_actions[] PROGMEM = {}; - -const action_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(1), -}; - - - -/* - * Keymap samples - */ -#if 0 - /* ANSI layout - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| - * `---' `---------------' `---------------' `---------------' `-----------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| Bsp| |Ins|Hom|PgU| |NmL| /| *| -| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| - * |-----------------------------------------------------------| `-----------' |-----------| | - * |CapsL | A| S| D| F| G| H| J| K| L| ;| '| Return| | 4| 5| 6| | - * |-----------------------------------------------------------| ,---. |---------------| - * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | - * |-----------------------------------------------------------| ,-----------. |-----------| | - * |Ctl|Gui|Alt| Space |Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .|Ent| - * `-----------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, ENT, P4, P5, P6, PPLS, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT - ), - - /* ISO layout - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| - * `---' `---------------' `---------------' `---------------' `-----------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| ^| Bsp| |Ins|Hom|PgU| |NmL| /| *| -| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Retn| |Del|End|PgD| | 7| 8| 9| +| - * |------------------------------------------------------` | `-----------' |-----------| | - * |CapsL | A| S| D| F| G| H| J| K| L| ;| '| #| | | 4| 5| 6| | - * |-----------------------------------------------------------| ,---. |---------------| - * |Shft|\ | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3|Ent| - * |-----------------------------------------------------------| ,-----------. |-----------| | - * |Ctl|Gui|Alt| Space |HNK|KNA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP_ISO( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,ENT, DEL, END, PGDN, P7, P8, P9, PPLS, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS, P4, P5, P6, - LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, PENT, - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT - ), - - /* JIS layout - * ,---. ,---------------. ,---------------. ,---------------. ,-----------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| - * `---' `---------------' `---------------' `---------------' `-----------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| ^|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| - * |-----------------------------------------------------------| |-----------| |---------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| @| [| Retn| |Del|End|PgD| | 7| 8| 9| +| - * |------------------------------------------------------` | `-----------' |-----------| | - * |CapsL | A| S| D| F| G| H| J| K| L| ;| :| ]| | | 4| 5| 6| | - * |-----------------------------------------------------------| ,---. |---------------| - * |Shft | Z| X| C| V| B| N| M| ,| ,| /| RO|Shift | |Up | | 1| 2| 3|Ent| - * |-----------------------------------------------------------| ,-----------. |-----------| | - * |Ctl|Gui|Alt|MHEN| Space |HENK|KNA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .| | - * `-----------------------------------------------------------' `-----------' `---------------' - */ - KEYMAP_JIS( - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JPY, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, ENT, DEL, END, PGDN, P7, P8, P9, PPLS, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS, P4, P5, P6, - LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PENT, - LCTL,LGUI,LALT,MHEN, SPC, HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT - ), - - /* Colemak http://colemak.com - * ,-----------------------------------------------------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| - * |-----------------------------------------------------------| - * |Tab | Q| W| F| P| G| J| L| U| Y| ;| [| ]| \| - * |-----------------------------------------------------------| - * |BackSp| A| R| S| T| D| H| N| E| I| O| '|Return | - * |-----------------------------------------------------------| - * |Shift | Z| X| C| V| B| K| M| ,| ,| /|Shift | - * |-----------------------------------------------------------| - * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| - * `----------------------------------------------------------' - */ - KEYMAP_ALL( - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, - TAB, Q, W, F, P, G, J, L, U, Y, SCLN,LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, MENU,UNDO, - BSPC,A, R, S, T, D, H, N, E, I, O, QUOT, NUHS,ENT, P4, P5, P6, PCMM, SLCT,COPY, - LSFT,NUBS,Z, X, C, V, B, K, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PEQL, EXEC,PSTE, - LCTL,LGUI,LALT,MHEN,HANJ, SPC, HAEN,HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT, FIND,CUT - ), - - /* Dvorak http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard - * ,-----------------------------------------------------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| [| ]|Backspa| - * |-----------------------------------------------------------| - * |Tab | '| ,| .| P| Y| F| G| C| R| L| /| =| \| - * |-----------------------------------------------------------| - * |BackSp| A| O| E| U| I| D| H| T| N| S| -|Return | - * |-----------------------------------------------------------| - * |Shift | ;| Q| J| K| X| B| M| Wl V| Z|Shift | - * |-----------------------------------------------------------| - * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| - * `-----------------------------------------------------------' - */ - KEYMAP_ALL( - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, LBRC,RBRC,JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, - TAB, QUOT,COMM,DOT, P, Y, F, G, C, R, L, SLSH,EQL, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, MENU,UNDO, - CAPS,A, O, E, U, I, D, H, T, N, S, MINS, NUHS,ENT, P4, P5, P6, PCMM, SLCT,COPY, - LSFT,NUBS,SCLN,Q, J, K, X, B, M, W, V, Z, RO, RSFT, UP, P1, P2, P3, PEQL, EXEC,PSTE, - LCTL,LGUI,LALT,MHEN,HANJ, SPC, HAEN,HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT, FIND,CUT - ), - - /* Workman http://viralintrospection.wordpress.com/2010/09/06/a-different-philosophy-in-designing-keyboard-layouts/ - * ,-----------------------------------------------------------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| - * |-----------------------------------------------------------| - * |Tab | Q| D| R| W| B| J| F| U| P| ;| [| ]| \| - * |-----------------------------------------------------------| - * |CapsLo| A| S| H| T| G| Y| N| E| O| I| '|Return | - * |-----------------------------------------------------------| - * |Shift | Z| X| M| C| V| K| L| ,| ,| /|Shift | - * |-----------------------------------------------------------| - * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| - * `-----------------------------------------------------------' - */ - KEYMAP_ALL( - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, - GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, - TAB, Q, D, R, W, B, J, F, U, P, SCLN,LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, MENU,UNDO, - CAPS,A, S, H, T, G, Y, N, E, O, I, QUOT, NUHS,ENT, P4, P5, P6, PCMM, SLCT,COPY, - LSFT,NUBS,Z, X, M, C, V, K, L, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PEQL, EXEC,PSTE, - LCTL,LGUI,LALT,MHEN,HANJ, SPC, HAEN,HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT, FIND,CUT - ), - - -/* - * SpaceFN layout - * http://geekhack.org/index.php?topic=51069.0 - */ -const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* 0: plain Qwerty - * ,---------------. ,---------------. ,---------------. - * |F13|F14|F15|F16| |F17|F18|F19|F20| |F21|F22|F23|F24| - * ,---. |---------------| |---------------| |---------------| ,-----------. ,---------------. ,-------. - * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut|Pwr| | Help | - * `---' `---------------' `---------------' `---------------' `-----------' `---------------' `-------' - * ,-----------------------------------------------------------. ,-----------. ,---------------. ,-------. - * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| |Stp|Agn| - * |-----------------------------------------------------------| |-----------| |---------------| |-------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| |Mnu|Und| - * |-----------------------------------------------------------| `-----------' |---------------| |-------| - * |LCtrl | A| S| D| F| G| H| J| K| L| ;| :| #|Retn| | 4| 5| 6|KP,| |Sel|Cpy| - * |-----------------------------------------------------------| ,---. |---------------| |-------| - * |Shft| <| Z| X| C| V| B| N| M| ,| ,| /| RO|Shift | |Up | | 1| 2| 3|KP=| |Exe|Pst| - * |-----------------------------------------------------------| ,-----------. |---------------| |-------| - * |Ctl|Gui|Alt|MHEN|HNJ| Space |H/E|HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| |Fnd|Cut| - * `-----------------------------------------------------------' `-----------' `---------------' `-------' - */ - [0] = KEYMAP_ALL( - F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, - ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, - ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, - TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, BSLS, DEL, END, PGDN, P7, P8, P9, PPLS, MENU,UNDO, - LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT, NUHS,ENT, P4, P5, P6, PCMM, SLCT,COPY, - LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PEQL, EXEC,PSTE, - LCTL,LGUI,LALT,MHEN,HANJ, FN0, HAEN,HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT, FIND,CUT - ), - - /* 1: SpaceFN - * ,-----------------------------------------------------------. - * |` | F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete | - * |-----------------------------------------------------------| - * |Caps | | |Esc| | | |Hom|Up |End|Psc|Slk|Pau|Ins | - * |-----------------------------------------------------------| - * | | | | | | |PgU|Lef|Dow|Rig| | | | - * |-----------------------------------------------------------| - * | | | | | |Spc|PgD|` |~ | |Men| | - * |-----------------------------------------------------------| - * | | | | | | | | | - * `-----------------------------------------------------------' - */ - [1] = KEYMAP_ALL( - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, - TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS, - GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - CAPS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,UP, END, PSCR,SLCK,PAUS, INS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS, TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN1, TRNS,APP, TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, - TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS, TRNS,TRNS, TRNS,TRNS - ), -}; - -const action_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_TAP_KEY(1, KC_SPACE), - [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde -}; - -#endif From 3d767e4aab5a6c87cb334a22ffaa9b6ad8e76393 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 10:37:50 -0700 Subject: [PATCH 080/505] Disable Moueskeys to reduce Vitamins Included firmware size --- keyboards/vitamins_included/config.h | 2 +- keyboards/vitamins_included/rules.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/vitamins_included/config.h b/keyboards/vitamins_included/config.h index abbb31056372..bcaf777c7756 100644 --- a/keyboards/vitamins_included/config.h +++ b/keyboards/vitamins_included/config.h @@ -23,5 +23,5 @@ along with this program. If not, see . #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION -#define DISABLE_LEADER + diff --git a/keyboards/vitamins_included/rules.mk b/keyboards/vitamins_included/rules.mk index 8ac39dffbc95..4f6d497a6b11 100644 --- a/keyboards/vitamins_included/rules.mk +++ b/keyboards/vitamins_included/rules.mk @@ -53,7 +53,7 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # 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) COMMAND_ENABLE = no # Commands for debug and configuration From 20a10bd0846d502069203419f57e36fd7467df5e Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 28 Sep 2018 19:23:13 -0700 Subject: [PATCH 081/505] Size fix for Hadron, take 2 (#4009) * Add Link Time Optimization to reduce firmware size * Disable Mousekeys on Hadron to save room --- keyboards/hadron/keymaps/default/rules.mk | 2 +- keyboards/hadron/rules.mk | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/keyboards/hadron/keymaps/default/rules.mk b/keyboards/hadron/keymaps/default/rules.mk index 4d08544f3ad4..545ffa75c177 100644 --- a/keyboards/hadron/keymaps/default/rules.mk +++ b/keyboards/hadron/keymaps/default/rules.mk @@ -5,7 +5,7 @@ # 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 = no # Audio control and System control(+450) CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = no # Commands for debug and configuration diff --git a/keyboards/hadron/rules.mk b/keyboards/hadron/rules.mk index 1f835e066036..2a8b780450f8 100644 --- a/keyboards/hadron/rules.mk +++ b/keyboards/hadron/rules.mk @@ -71,3 +71,5 @@ SRC = i2c.c \ ssd1306.c DEFAULT_FOLDER = hadron/ver2 + +EXTRAFLAGS += -flto From daf0cc60bff54be948c923cdc40aa80b82a27f6d Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Fri, 28 Sep 2018 22:34:56 -0400 Subject: [PATCH 082/505] CTRL keyboard bootloader_jump support Adds support for CTRL keyboards to enter bootloader via bootloader_jump() --- .../1.0.70/gcc/gcc/samd51j18a_flash.ld | 3 ++ tmk_core/common/arm_atsam/bootloader.c | 32 ++++++++++--------- tmk_core/protocol/arm_atsam/md_bootloader.h | 7 ++++ tmk_core/protocol/arm_atsam/startup.c | 11 +++++++ 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld index 35db619717af..1c635478633e 100644 --- a/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld +++ b/lib/arm_atsam/packs/atmel/SAMD51_DFP/1.0.70/gcc/gcc/samd51j18a_flash.ld @@ -51,6 +51,9 @@ HEAP_SIZE = DEFINED(HEAP_SIZE) ? HEAP_SIZE : DEFINED(__heap_size__) ? __heap_siz _srom = ORIGIN(rom); _lrom = LENGTH(rom); _erom = ORIGIN(rom) + LENGTH(rom); +_sram = ORIGIN(ram); +_lram = LENGTH(ram); +_eram = ORIGIN(ram) + LENGTH(ram); /* Section Definitions */ SECTIONS diff --git a/tmk_core/common/arm_atsam/bootloader.c b/tmk_core/common/arm_atsam/bootloader.c index 9701a6219618..ba71bfeb0b74 100644 --- a/tmk_core/common/arm_atsam/bootloader.c +++ b/tmk_core/common/arm_atsam/bootloader.c @@ -16,25 +16,27 @@ #include "bootloader.h" #include "samd51j18a.h" +#include "md_bootloader.h" //Set watchdog timer to reset. Directs the bootloader to stay in programming mode. -void bootloader_jump(void) -{ - //Keyboards released with certain bootloader can not enter bootloader from app until workaround is created - uint8_t ver_no_jump[] = "v2.18Jun 22 2018 17:28:08"; - uint8_t *ver_check = ver_no_jump; - uint8_t *boot_check = (uint8_t *)0x21A0; - while (*ver_check && *boot_check == *ver_check) - { - ver_check++; - boot_check++; +void bootloader_jump(void) { +#ifdef KEYBOARD_massdrop_ctrl + //CTRL keyboards released with bootloader version below must use RAM method. Otherwise use WDT method. + uint8_t ver_ram_method[] = "v2.18Jun 22 2018 17:28:08"; //The version to match (NULL terminated by compiler) + uint8_t *ver_check = ver_ram_method; //Pointer to version match string for traversal + uint8_t *ver_rom = (uint8_t *)0x21A0; //Pointer to address in ROM where this specific bootloader version would exist + + while (*ver_check && *ver_rom == *ver_check) { //While there are check version characters to match and bootloader's version matches check's version + ver_check++; //Move check version pointer to next character + ver_rom++; //Move ROM version pointer to next character } - if (!*ver_check) - { - //Version match - //Software workaround would go here - return; //No software restart method implemented... must use hardware reset button + + if (!*ver_check) { //If check version pointer is NULL, all characters have matched + *MAGIC_ADDR = BOOTLOADER_MAGIC; //Set magic number into RAM + NVIC_SystemReset(); //Perform system reset + while (1) {} //Won't get here } +#endif WDT->CTRLA.bit.ENABLE = 0; while (WDT->SYNCBUSY.bit.ENABLE) {} diff --git a/tmk_core/protocol/arm_atsam/md_bootloader.h b/tmk_core/protocol/arm_atsam/md_bootloader.h index 1316876c848e..956145c31322 100644 --- a/tmk_core/protocol/arm_atsam/md_bootloader.h +++ b/tmk_core/protocol/arm_atsam/md_bootloader.h @@ -7,6 +7,13 @@ extern uint32_t _erom; #define BOOTLOADER_SERIAL_MAX_SIZE 20 //DO NOT MODIFY! +#ifdef KEYBOARD_massdrop_ctrl +//WARNING: These are only for CTRL bootloader release "v2.18Jun 22 2018 17:28:08" for bootloader_jump support +extern uint32_t _eram; +#define BOOTLOADER_MAGIC 0x3B9ACA00 +#define MAGIC_ADDR (uint32_t *)(&_eram - 4) +#endif + #ifdef MD_BOOTLOADER #define MCU_HZ 48000000 diff --git a/tmk_core/protocol/arm_atsam/startup.c b/tmk_core/protocol/arm_atsam/startup.c index a62d02f1ca57..f29fac179b8c 100644 --- a/tmk_core/protocol/arm_atsam/startup.c +++ b/tmk_core/protocol/arm_atsam/startup.c @@ -28,6 +28,7 @@ */ #include "samd51.h" +#include "md_bootloader.h" /* Initialize segments */ extern uint32_t _sfixed; @@ -500,6 +501,16 @@ const DeviceVectors exception_table = { */ void Reset_Handler(void) { +#ifdef KEYBOARD_massdrop_ctrl + /* WARNING: This is only for CTRL bootloader release "v2.18Jun 22 2018 17:28:08" for bootloader_jump support */ + if (*MAGIC_ADDR == BOOTLOADER_MAGIC) { + /* At this point, the bootloader's memory is initialized properly, so undo the jump to here, then jump back */ + *MAGIC_ADDR = 0x00000000; /* Change value to prevent potential bootloader entrance loop */ + __set_MSP(0x20008818); /* MSP according to bootloader */ + SCB->VTOR = 0x00000000; /* Vector table back to bootloader's */ + asm("bx %0"::"r"(0x00001267)); /* Jump past bootloader RCAUSE check using THUMB */ + } +#endif uint32_t *pSrc, *pDest; /* Initialize the relocate segment */ From 9f8bbe2f3f30c39f1ed44a6a2de63f39b405391f Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 29 Sep 2018 08:47:16 -0700 Subject: [PATCH 083/505] Keyboard: converter/hp_46010a: Configurator support (#4017) --- keyboards/converter/hp_46010a/info.json | 115 ++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/keyboards/converter/hp_46010a/info.json b/keyboards/converter/hp_46010a/info.json index de68a122858b..91dcf97ecca4 100644 --- a/keyboards/converter/hp_46010a/info.json +++ b/keyboards/converter/hp_46010a/info.json @@ -3,4 +3,119 @@ "keyboard_folder": "converter/HP_46010A", "url": "https://deskthority.net/wiki/HP_46010A", "maintainer": "listofoptions", + "width": 22, + "height": 7, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Reset", "x":0, "y":0}, + {"label":"Stop", "x":1, "y":0}, + {"label":"F1", "x":2.5, "y":0, "w":1.25}, + {"label":"F2", "x":3.75, "y":0, "w":1.25}, + {"label":"F3", "x":5, "y":0, "w":1.25}, + {"label":"F4", "x":6.25, "y":0, "w":1.25}, + {"label":"Menu", "x":7.5, "y":0}, + {"label":"User", "x":8.5, "y":0}, + {"label":"F5", "x":9.5, "y":0, "w":1.25}, + {"label":"F6", "x":10.75, "y":0, "w":1.25}, + {"label":"F7", "x":12, "y":0, "w":1.25}, + {"label":"F8", "x":13.25, "y":0, "w":1.25}, + {"label":"Clear line", "x":15, "y":0}, + {"label":"Clear display", "x":16, "y":0}, + {"x":18, "y":0}, + {"x":19, "y":0}, + {"x":20, "y":0}, + {"x":21, "y":0}, + {"label":"`", "x":0, "y":2, "w":1.25}, + {"label":"1", "x":1.25, "y":2}, + {"label":"2", "x":2.25, "y":2}, + {"label":"3", "x":3.25, "y":2}, + {"label":"4", "x":4.25, "y":2}, + {"label":"5", "x":5.25, "y":2}, + {"label":"6", "x":6.25, "y":2}, + {"label":"7", "x":7.25, "y":2}, + {"label":"8", "x":8.25, "y":2}, + {"label":"9", "x":9.25, "y":2}, + {"label":"0", "x":10.25, "y":2}, + {"label":"-", "x":11.25, "y":2}, + {"label":"=", "x":12.25, "y":2}, + {"label":"Backspace", "x":13.25, "y":2, "w":1.5}, + {"label":"Insert line", "x":15, "y":2}, + {"label":"Delete line", "x":16, "y":2}, + {"label":"*", "x":18, "y":2}, + {"label":"/", "x":19, "y":2}, + {"label":"+", "x":20, "y":2}, + {"label":"-", "x":21, "y":2}, + {"label":"Tab", "x":0, "y":3, "w":1.75}, + {"label":"Q", "x":1.75, "y":3}, + {"label":"W", "x":2.75, "y":3}, + {"label":"E", "x":3.75, "y":3}, + {"label":"R", "x":4.75, "y":3}, + {"label":"T", "x":5.75, "y":3}, + {"label":"Y", "x":6.75, "y":3}, + {"label":"U", "x":7.75, "y":3}, + {"label":"I", "x":8.75, "y":3}, + {"label":"O", "x":9.75, "y":3}, + {"label":"P", "x":10.75, "y":3}, + {"label":"[", "x":11.75, "y":3}, + {"label":"]", "x":12.75, "y":3}, + {"label":"\\", "x":13.75, "y":3}, + {"label":"Insert char", "x":15, "y":3}, + {"label":"Delete char", "x":16, "y":3}, + {"label":"7", "x":18, "y":3}, + {"label":"8", "x":19, "y":3}, + {"label":"9", "x":20, "y":3}, + {"label":"Enter", "x":21, "y":3}, + {"label":"Caps Lock", "x":0, "y":4}, + {"label":"Ctrl", "x":1, "y":4}, + {"label":"A", "x":2, "y":4}, + {"label":"S", "x":3, "y":4}, + {"label":"D", "x":4, "y":4}, + {"label":"F", "x":5, "y":4}, + {"label":"G", "x":6, "y":4}, + {"label":"H", "x":7, "y":4}, + {"label":"J", "x":8, "y":4}, + {"label":"K", "x":9, "y":4}, + {"label":"L", "x":10, "y":4}, + {"label":";", "x":11, "y":4}, + {"label":"'", "x":12, "y":4}, + {"label":"Return", "x":13, "y":4, "w":1.75}, + {"label":"Cursor", "x":15, "y":4}, + {"label":"Prev", "x":16, "y":4}, + {"label":"4", "x":18, "y":4}, + {"label":"5", "x":19, "y":4}, + {"label":"6", "x":20, "y":4}, + {"label":",", "x":21, "y":4}, + {"label":"Del", "x":0, "y":5}, + {"label":"Shift", "x":1.25, "y":5, "w":1.25}, + {"label":"Z", "x":2.5, "y":5}, + {"label":"X", "x":3.5, "y":5}, + {"label":"C", "x":4.5, "y":5}, + {"label":"V", "x":5.5, "y":5}, + {"label":"B", "x":6.5, "y":5}, + {"label":"N", "x":7.5, "y":5}, + {"label":"M", "x":8.5, "y":5}, + {"label":",", "x":9.5, "y":5}, + {"label":".", "x":10.5, "y":5}, + {"label":"/", "x":11.5, "y":5}, + {"label":"Shift", "x":12.5, "y":5, "w":1.25}, + {"label":"Select", "x":14, "y":5}, + {"label":"Up", "x":15, "y":5}, + {"label":"Next", "x":16, "y":5}, + {"label":"1", "x":18, "y":5}, + {"label":"2", "x":19, "y":5}, + {"label":"3", "x":20, "y":5}, + {"label":"Tab", "x":21, "y":5, "h":2}, + {"label":"Win", "x":0, "y":6}, + {"label":"Extend Char", "x":2.5, "y":6}, + {"x":3.5, "y":6, "w":8}, + {"label":"Extend Char", "x":11.5, "y":6}, + {"label":"Left", "x":14, "y":6}, + {"label":"Down", "x":15, "y":6}, + {"label":"Right", "x":16, "y":6}, + {"label":"0", "x":18, "y":6, "w":2}, + {"label":".", "x":20, "y":6} + ] + } + } } From 1da2f8d5467e5a9b9300437d2afc86d2c1f63370 Mon Sep 17 00:00:00 2001 From: Shaleen Jain Date: Sat, 29 Sep 2018 21:19:51 +0530 Subject: [PATCH 084/505] Keymap: tada68: add shalzz's layout (#4019) --- keyboards/tada68/keymaps/shalzz/config.h | 4 ++ keyboards/tada68/keymaps/shalzz/keymap.c | 53 +++++++++++++++++++++++ keyboards/tada68/keymaps/shalzz/readme.md | 43 ++++++++++++++++++ keyboards/tada68/keymaps/shalzz/rules.mk | 12 +++++ 4 files changed, 112 insertions(+) create mode 100644 keyboards/tada68/keymaps/shalzz/config.h create mode 100644 keyboards/tada68/keymaps/shalzz/keymap.c create mode 100644 keyboards/tada68/keymaps/shalzz/readme.md create mode 100644 keyboards/tada68/keymaps/shalzz/rules.mk diff --git a/keyboards/tada68/keymaps/shalzz/config.h b/keyboards/tada68/keymaps/shalzz/config.h new file mode 100644 index 000000000000..3214a33fb4fe --- /dev/null +++ b/keyboards/tada68/keymaps/shalzz/config.h @@ -0,0 +1,4 @@ +#pragma once + +#define DISABLE_SPACE_CADET_ROLLOVER +#define GRAVE_ESC_ALT_OVERRIDE diff --git a/keyboards/tada68/keymaps/shalzz/keymap.c b/keyboards/tada68/keymaps/shalzz/keymap.c new file mode 100644 index 000000000000..e2b4c170e574 --- /dev/null +++ b/keyboards/tada68/keymaps/shalzz/keymap.c @@ -0,0 +1,53 @@ +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 + +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| [| ]| \ |Del | + * |----------------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return |PgUp| + * |----------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |FN |Alt|Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + * + * Note: Shift + Esc = ~ + * Win + Esc = ` + */ +[_BL] = LAYOUT_ansi( + KC_GESC, 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_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_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_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSPC,KC_UP,KC_PGDN, \ + KC_LCTL, KC_LGUI,KC_LALT, LT(_BL, KC_SPC), MO(_FL),KC_RALT,KC_RCTRL, KC_LEFT,KC_DOWN,KC_RGHT), + + /* Keymap _FL: Function Layer + * ,----------------------------------------------------------------. + * | | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |PRSC| + * |----------------------------------------------------------------| + * | | |Up | | | | | | | | | | | |Ins | + * |----------------------------------------------------------------| + * | |<- |Dn | ->| | |<- |Dn |Up | ->| | | |Hme | + * |----------------------------------------------------------------| + * | ( | | |Bl-|BL |BL+| | |VU-|VU+|MUT| ) | |End | + * |----------------------------------------------------------------| + * | | | | | | | | | | | + * `----------------------------------------------------------------' + */ +[_FL] = LAYOUT_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_PSCR, \ + _______,_______, KC_UP,_______,_______, _______,_______,_______,_______,_______,_______,_______,_______, _______,KC_INS, \ + _______,KC_LEFT,KC_DOWN,KC_RIGHT,_______,_______,KC_LEFT,KC_DOWN,KC_UP,KC_RGHT,_______,_______, _______,KC_HOME, \ + KC_LPRN,_______,_______,BL_DEC, BL_TOGG,BL_INC, _______,_______,KC_VOLD,KC_VOLU,KC_MUTE,KC_RPRN, _______, KC_END, \ + _______,_______,_______, _______, _______,_______,_______,_______,_______, _______), +}; diff --git a/keyboards/tada68/keymaps/shalzz/readme.md b/keyboards/tada68/keymaps/shalzz/readme.md new file mode 100644 index 000000000000..3e4cf60673f2 --- /dev/null +++ b/keyboards/tada68/keymaps/shalzz/readme.md @@ -0,0 +1,43 @@ +# Shalzz's Unix layout + +This layout is based on the Unix Layout with a few changes. + +``` + Base Layer +,----------------------------------------------------------------. +|Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |~ ` | +|----------------------------------------------------------------| +|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |Del | +|----------------------------------------------------------------| +|CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return |PgUp| +|----------------------------------------------------------------| +|Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| +|----------------------------------------------------------------| +|Ctrl|Win |Alt | Space |Alt| FN|Ctrl|Lef|Dow|Rig | +`----------------------------------------------------------------' +Note: Shift + Esc = ~ + Win + Esc = ` + Fn + LShift = ( + Fn + RShift = ) + + Fn Layer +,----------------------------------------------------------------. +| | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |PRSC| +|----------------------------------------------------------------| +| | |Up | | | | | | | | | | | |Ins | +|----------------------------------------------------------------| +| |<- |Dn | ->| | |<- |Dn |Up | ->| | | |Hme | +|----------------------------------------------------------------| +| ( | | |Bl-|BL |BL+| | |VU-|VU+|MUT| ) | |End | +|----------------------------------------------------------------| +| | | | | | | | | | | +`----------------------------------------------------------------' + +``` + +The changes that were applied over the Unix layout: + +* Left and Right Shift when pressed alone emit `(` and `)` respectively. Hold shift for normal behaviour. +* Fn + Left and Right Shift also act as actual `(` and `)` keys respectively. +* Changed PrintSc to `Fn+`` +* Fixed Holding down space activating the function layer instead of the lower layer. diff --git a/keyboards/tada68/keymaps/shalzz/rules.mk b/keyboards/tada68/keymaps/shalzz/rules.mk new file mode 100644 index 000000000000..1df3af955d4e --- /dev/null +++ b/keyboards/tada68/keymaps/shalzz/rules.mk @@ -0,0 +1,12 @@ +# 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 +# +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +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 = yes # Enable keyboard backlight functionality +AUDIO_ENABLE = no # Audio output on port C6 +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend From 4f6495108087da13d7ee44c1f6ced03ebdfb934d Mon Sep 17 00:00:00 2001 From: marksard <38324387+marksard@users.noreply.github.com> Date: Sun, 30 Sep 2018 02:25:03 +0900 Subject: [PATCH 085/505] Keymap: Fixed a possible of buffer overflow. (#4016) Update inline funnction to static inline function. Fixed error of if enabe ADJUST_MACRO_ENABLE. --- .../helix/rev2/keymaps/five_rows_jis/keymap.c | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c b/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c index 141b22275375..df00366e3935 100644 --- a/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c +++ b/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c @@ -214,7 +214,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #endif #ifdef SSD1306OLED -char keylog[20] = {}; +char keylog[24] = {}; const char code_to_name[60] = { ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', @@ -223,7 +223,7 @@ const char code_to_name[60] = { 'R', 'E', 'B', 'T', ' ', '-', ' ', '@', ' ', ' ', ' ', ';', ':', ' ', ',', '.', '/', ' ', ' ', ' '}; -inline void set_keylog(uint16_t keycode, keyrecord_t *record) +static inline void set_keylog(uint16_t keycode, keyrecord_t *record) { char name = ' '; uint8_t leds = host_keyboard_leds(); @@ -246,6 +246,12 @@ inline void set_keylog(uint16_t keycode, keyrecord_t *record) } #endif +#ifdef RGBLIGHT_ENABLE +#define RGBLIGHT(mode) rgblight_mode(mode) +#else +#define RGBLIGHT(mode) +#endif + // define variables for reactive RGB int RGB_current_mode; #ifdef ADJUST_MACRO_ENABLE @@ -263,12 +269,6 @@ void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { #define ADJUST_MACRO(layer1, layer2, layer3) #endif -#ifdef RGBLIGHT_ENABLE -#define RGBLIGHT(mode) rgblight_mode(mode) -#else -#define RGBLIGHT(mode) -#endif - bool process_record_user(uint16_t keycode, keyrecord_t *record) { #ifdef SSD1306OLED if (record->event.pressed) { @@ -344,7 +344,7 @@ void matrix_scan_user(void) { iota_gfx_task(); // this is what updates the display continuously } -inline void matrix_update(struct CharacterMatrix *dest, +static inline 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)); @@ -367,13 +367,15 @@ const char helix_logo[]={ 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4, 0}; -inline void render_logo(struct CharacterMatrix *matrix) { + +static inline void render_logo(struct CharacterMatrix *matrix) { matrix_write(matrix, helix_logo); } const char mac_win_logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; -inline void render_status(struct CharacterMatrix *matrix) { + +static inline void render_status(struct CharacterMatrix *matrix) { char buf[20]; // Render to mode icon From cd215209efb0e236b691b51c3397495d4449623b Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Sun, 30 Sep 2018 02:40:54 +0900 Subject: [PATCH 086/505] Helix led_test keymap reduce size (#4023) * Helix: make rgblight modes selectable. No change in build result. * edit the comment of helix/rev2/keymaps/default/keymap.c * Helix led_test keymap: reduced the size. --- keyboards/helix/config.h | 13 +++++++++++++ keyboards/helix/rev2/keymaps/default/keymap.c | 2 +- keyboards/helix/rev2/keymaps/led_test/config.h | 16 +++++++++++++--- .../helix/rev2/keymaps/led_test/led_test_init.c | 4 ++-- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/keyboards/helix/config.h b/keyboards/helix/config.h index fbfbd3280434..b79093d871d6 100644 --- a/keyboards/helix/config.h +++ b/keyboards/helix/config.h @@ -48,4 +48,17 @@ along with this program. If not, see . #define DISABLE_LEADER #endif // USE_Link_Time_Optimization +#if defined(LED_ANIMATIONS) || defined(RGBLIGHT_ANIMATIONS) + #undef RGBLIGHT_ANIMATIONS + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + #define RGBLIGHT_EFFECT_RGB_TEST + #define RGBLIGHT_EFFECT_ALTERNATING +#endif + #endif /* CONFIG_H */ diff --git a/keyboards/helix/rev2/keymaps/default/keymap.c b/keyboards/helix/rev2/keymaps/default/keymap.c index dca9be9a47bc..087bd8e517ff 100644 --- a/keyboards/helix/rev2/keymaps/default/keymap.c +++ b/keyboards/helix/rev2/keymaps/default/keymap.c @@ -512,7 +512,7 @@ void music_scale_user(void) // hook point for 'led_test' keymap // 'default' keymap's led_test_init() is empty function, do nothing -// 'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(35); +// 'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(RGBLIGHT_MODE_RGB_TEST); __attribute__ ((weak)) void led_test_init(void) {} diff --git a/keyboards/helix/rev2/keymaps/led_test/config.h b/keyboards/helix/rev2/keymaps/led_test/config.h index 0438254528c8..094195fc6e03 100644 --- a/keyboards/helix/rev2/keymaps/led_test/config.h +++ b/keyboards/helix/rev2/keymaps/led_test/config.h @@ -21,9 +21,19 @@ along with this program. If not, see . #ifndef CONFIG_USER_H #define CONFIG_USER_H -// if you need more program area, try uncomment follow line -#include "serial_config_simpleapi.h" - // place overrides here +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#undef RGBLIGHT_EFFECT_BREATHING +#undef RGBLIGHT_EFFECT_RAINBOW_MOOD +#undef RGBLIGHT_EFFECT_RAINBOW_SWIRL +#undef RGBLIGHT_EFFECT_SNAKE +#undef RGBLIGHT_EFFECT_KNIGHT +#undef RGBLIGHT_EFFECT_CHRISTMAS +#undef RGBLIGHT_EFFECT_STATIC_GRADIENT +//#undef RGBLIGHT_EFFECT_RGB_TEST // led_test keymap need only this. +#undef RGBLIGHT_EFFECT_ALTERNATING + #endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/rev2/keymaps/led_test/led_test_init.c b/keyboards/helix/rev2/keymaps/led_test/led_test_init.c index 1d9cb4ebdea9..85f5d1aa7efb 100644 --- a/keyboards/helix/rev2/keymaps/led_test/led_test_init.c +++ b/keyboards/helix/rev2/keymaps/led_test/led_test_init.c @@ -5,7 +5,7 @@ void led_test_init(void) { static int scan_count = 0; if( scan_count == 2 ) { rgblight_enable_noeeprom(); - rgblight_mode_noeeprom(35); + rgblight_mode_noeeprom(RGBLIGHT_MODE_RGB_TEST); } if( scan_count < 3 ) scan_count ++; } @@ -15,6 +15,6 @@ void led_test_init(void) { // can use this? void startup_user(void) { rgblight_enable_noeeprom(); - rgblight_mode_noeeprom(35); + rgblight_mode_noeeprom(RGBLIGHT_MODE_RGB_TEST); } #endif From 68854f0735ecfa69e383c1f7c93211a6ad89e13b Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 29 Sep 2018 12:44:12 -0700 Subject: [PATCH 087/505] Keyboard: converter/hp_46010a: rename layout macro to LAYOUT (#4024) Messed up in my previous PR (#4017) by providing the wrong matrix name. Fixing by changing the matrix name instead, because there's only one at this point. Thought it made more sense this way. --- keyboards/converter/hp_46010a/hp_46010a.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/keyboards/converter/hp_46010a/hp_46010a.h b/keyboards/converter/hp_46010a/hp_46010a.h index db64ce24a586..fd5adfc63998 100644 --- a/keyboards/converter/hp_46010a/hp_46010a.h +++ b/keyboards/converter/hp_46010a/hp_46010a.h @@ -35,7 +35,7 @@ along with this program. If not, see . * `-----------------------------------------------------------------------------------' `-------------------' */ -#define LAYOUT_HP_46010A( \ +#define LAYOUT( \ KEY_RES, KEY_STOP, KEY_F1, KEY_F2, KEY_F3, KEY_F4,KEY_MENU,KEY_USER, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_CLRL, KEY_CLRD, KEY_B1, KEY_B2, KEY_B3, KEY_B4, \ KEY_GRAV, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINU, KEY_PLUS, KEY_BACK, KEY_INSL, KEY_DELL, KEY_MULT, KEY_DIV, KEY_ADD, KEY_SUBT, \ KEY_TAB, KEY_Q,KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P, KEY_LBRA, KEY_RBRA, KEY_PIPE, KEY_INSC, KEY_DELC, KEY_P7, KEY_P8, KEY_P9, KEY_PADE, \ @@ -58,5 +58,3 @@ along with this program. If not, see . {KEY_B1, KEY_P0, KEY_B2, KC_NO, KEY_B3, KEY_PDOT, KEY_B4, KC_NO }, \ {KEY_B, KEY_V, KEY_C, KEY_X, KEY_Z, KEY_PRNT, KEY_DELE, KEY_N }, \ } - -#define LAYOUT LAYOUT_HP_46010A From 92d95ba1e1223538f8c16fe2d17a23fa0dd67725 Mon Sep 17 00:00:00 2001 From: izzy84075 Date: Sat, 29 Sep 2018 12:44:54 -0700 Subject: [PATCH 088/505] Keyboard: Add basic support for the YD68 / YD68v2 PCBs. (#4020) * Add basic support for the YD68 / YD68v2. Keymap and WS2812 underlighting work. Capslock LED should work, though I don't have one populated to test. Backlight LEDs are not set up, as they're not on a hardware PWM pin, could be set up as software. * Fix Imgur link * Fix default keymap to match the stock firmware * Fix the Hardware Supported line and add a short description --- keyboards/yd68/config.h | 224 +++++++++++++++++++++++ keyboards/yd68/info.json | 13 ++ keyboards/yd68/keymaps/default/config.h | 19 ++ keyboards/yd68/keymaps/default/keymap.c | 65 +++++++ keyboards/yd68/keymaps/default/readme.md | 1 + keyboards/yd68/readme.md | 15 ++ keyboards/yd68/rules.mk | 81 ++++++++ keyboards/yd68/yd68.c | 73 ++++++++ keyboards/yd68/yd68.h | 62 +++++++ 9 files changed, 553 insertions(+) create mode 100644 keyboards/yd68/config.h create mode 100644 keyboards/yd68/info.json create mode 100644 keyboards/yd68/keymaps/default/config.h create mode 100644 keyboards/yd68/keymaps/default/keymap.c create mode 100644 keyboards/yd68/keymaps/default/readme.md create mode 100644 keyboards/yd68/readme.md create mode 100644 keyboards/yd68/rules.mk create mode 100644 keyboards/yd68/yd68.c create mode 100644 keyboards/yd68/yd68.h diff --git a/keyboards/yd68/config.h b/keyboards/yd68/config.h new file mode 100644 index 000000000000..1b4d7f7a1330 --- /dev/null +++ b/keyboards/yd68/config.h @@ -0,0 +1,224 @@ +/* +Copyright 2018 Ryan "Izzy" Bales + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0002 +#define MANUFACTURER YANG +#define PRODUCT YD68v2 +#define DESCRIPTION 65% board with Bluetooth + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 15 + +/* + * 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 { B5, C6, C7, D7, B4 } +#define MATRIX_COL_PINS { B6, F7, F6, F5, F4, F1, F0, E6, B0, B7, D0, D1, D2, D3, D5 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + +#define RGB_DI_PIN B3 +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 10 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + diff --git a/keyboards/yd68/info.json b/keyboards/yd68/info.json new file mode 100644 index 000000000000..b392f03865ba --- /dev/null +++ b/keyboards/yd68/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "YD68", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT_ansi": { + "key_count": 68, + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"x":15, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"x":15, "y":2}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4}, {"label":"Win", "x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}] + } + } +} \ No newline at end of file diff --git a/keyboards/yd68/keymaps/default/config.h b/keyboards/yd68/keymaps/default/config.h new file mode 100644 index 000000000000..405f9355003e --- /dev/null +++ b/keyboards/yd68/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 Ryan "Izzy" Bales + * + * 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 + +// place overrides here diff --git a/keyboards/yd68/keymaps/default/keymap.c b/keyboards/yd68/keymaps/default/keymap.c new file mode 100644 index 000000000000..290aa0d61ec2 --- /dev/null +++ b/keyboards/yd68/keymaps/default/keymap.c @@ -0,0 +1,65 @@ +/* Copyright 2018 Ryan "Izzy" Bales + * + * 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 QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + YD68_BT_PWR = SAFE_RANGE, + YD68_RGB_PWR, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ansi( /* Base */ + 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_HOME, \ + 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_END, \ + 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_SPC, KC_RALT,KC_RGUI,KC_RCTRL,KC_LEFT,KC_DOWN,KC_RGHT \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case YD68_BT_PWR: + if (record->event.pressed) { + // when keycode YD68_BT_PWR is pressed + } else { + // when keycode YD68_BT_PWR is released + } + break; + case YD68_RGB_PWR: + if (record->event.pressed) { + // when keycode YD68_RGB_PWR is pressed + PORTE ^= (1<<2); + } else { + // when keycode YD68_RGB_PWR is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/yd68/keymaps/default/readme.md b/keyboards/yd68/keymaps/default/readme.md new file mode 100644 index 000000000000..877e64f18bee --- /dev/null +++ b/keyboards/yd68/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for yd68 \ No newline at end of file diff --git a/keyboards/yd68/readme.md b/keyboards/yd68/readme.md new file mode 100644 index 000000000000..7e5e83bcc9d8 --- /dev/null +++ b/keyboards/yd68/readme.md @@ -0,0 +1,15 @@ +# yd68 + +[yd68](https://imgur.com/gallery/Ygo668L) + +A 68-key board with RGB underlighting and bluetooth. + +Keyboard Maintainer: [Izzy84075](https://github.com/izzy84075) +Hardware Supported: YD68/YD68v2 +Hardware Availability: [KBDFans](https://kbdfans.cn/collections/diy-kit/products/yd68-65-bluetooth-custom-keyboard-pcb) + +Make example for this keyboard (after setting up your build environment): + + make yd68:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/yd68/rules.mk b/keyboards/yd68/rules.mk new file mode 100644 index 000000000000..197402e8ab60 --- /dev/null +++ b/keyboards/yd68/rules.mk @@ -0,0 +1,81 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) diff --git a/keyboards/yd68/yd68.c b/keyboards/yd68/yd68.c new file mode 100644 index 000000000000..f34661dd37cc --- /dev/null +++ b/keyboards/yd68/yd68.c @@ -0,0 +1,73 @@ +/* Copyright 2018 Ryan "Izzy" Bales + * + * 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 "yd68.h" + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + //Capslock LED Output Low + DDRD |= (1<<4); + PORTD &= ~(1<<4); + + //Backlight LEDs Output Low + DDRD |= (1<<6); + PORTD &= ~(1<<6); + + //RGB power output low + DDRE |= (1<<2); + PORTE &= ~(1<<2); + + //Bluetooth power output high + DDRB |= (1<<2); + PORTB |= (1<<2); + + //RGB data output low + DDRB |= (1<<3); + PORTB &= ~(1<<3); + + 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 + + if (usb_led & (1<. + */ +#ifndef YD68_H +#define YD68_H + +#include "quantum.h" + +#define XXX KC_NO + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +/* YD68 ANSI layout + * ,----------------------------------------------------------------. + * | 00 |01| 02| 03| 04| 05| 06| 07| 08| 09| 0a| 0b| 0c| 0e | 48 | + * |----------------------------------------------------------------| + * | 10 | 11| 12| 13| 14| 15| 16| 17| 18| 19| 1a| 1b| 1c| 1d | 1e | + * |----------------------------------------------------------------| + * | 20 | 21| 22| 23| 24| 25| 26| 27| 28| 29| 2a| 2b| 2d | 2e | + * |----------------------------------------------------------------| + * | 30 | 32| 33| 34| 35| 36| 37| 38| 39| 3a| 3b| 3c | 3d| 3e | + * |----------------------------------------------------------------| + * | 40 | 41 | 42 | 46 | 49| 4a| 4b| 4c| 4d| 4e | + * `----------------------------------------------------------------' + */ +// The first section contains all of the arguments +// The second converts the arguments into a two-dimensional array + +#define LAYOUT_ansi( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, k48, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2d, k2e, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \ + k40, k41, k42, k46, k49, k4a, k4b, k4c, k4d, k4e \ +) \ +{ \ + {k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, XXX, k0e}, \ + {k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e}, \ + {k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, XXX, k2d, k2e}, \ + {k30, XXX, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e}, \ + {k40, k41, k42, XXX, XXX, XXX, k46, XXX, k48, k49, k4a, k4b, k4c, k4d, k4e} \ +} + +#endif From 170507896d4d7fe12e1fa2c31ab8589e4cbdf7ba Mon Sep 17 00:00:00 2001 From: Yan-Fa Li Date: Sat, 29 Sep 2018 16:16:21 -0700 Subject: [PATCH 089/505] Keyboard: Update info.json to match LAYOUT (#4027) * Update info.json to match LAYOUT * update mf68_ble info.json LAYOUT -> LAYOUT_68_ansi --- keyboards/mf68/info.json | 2 +- keyboards/mf68_ble/info.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/mf68/info.json b/keyboards/mf68/info.json index d41c2176a9b4..fae15aaf5fb6 100644 --- a/keyboards/mf68/info.json +++ b/keyboards/mf68/info.json @@ -5,7 +5,7 @@ "width": 17.25, "height": 5, "layouts": { - "LAYOUT": { + "LAYOUT_68_ansi": { "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"x":15.25, "y":1}, {"x":16.25, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"x":15.25, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"x":14.25, "y":4}, {"x":15.25, "y":4}, {"x":16.25, "y":4}] } } diff --git a/keyboards/mf68_ble/info.json b/keyboards/mf68_ble/info.json index 1f8aaed9246d..4cd9b2c83c83 100644 --- a/keyboards/mf68_ble/info.json +++ b/keyboards/mf68_ble/info.json @@ -5,7 +5,7 @@ "width": 17.25, "height": 5, "layouts": { - "LAYOUT": { + "LAYOUT_68_ansi": { "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"x":15.25, "y":1}, {"x":16.25, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"x":15.25, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"x":14.25, "y":4}, {"x":15.25, "y":4}, {"x":16.25, "y":4}] } } From 3875d6f5815bf263cb3ee5d18b74c5ec8ab865f2 Mon Sep 17 00:00:00 2001 From: Alexander Kagno Date: Sat, 29 Sep 2018 18:51:06 -0600 Subject: [PATCH 090/505] Keymap: Added Leader Key Functionality (#4025) * deleting arkag branch, forcibly moving changes over to master * fade_color function added, not tested * added half functions some stuff * surround_type function implemented and working. * added flashing function and removed fading, flashing supports infinite flashing along with controlled number flashes * added a fade state machine and functionality * build optimizations, changed fade to bounce between bounds rather than roll over, added a HALMAK layout * changes to sleep breath function, changed how I will switch to HALMAK * support for halmak added * support for activity detection added, condensed fading and flashing state machines, removed support for HALMAK and COLEMAK because arkag is stupid * changed sleep and inactive behaviors, now the color shifting reverses on state change, yay! save_color and reset_color are made to enable layer color changing to look cooler. * reformatted some if statements in state detection * changes to force fade to pause on boot, or plug in. * Attempting to move over to userspace, pushing to repository for help * userspace stuff.... * userspace stuff.... * layout changes, working userspace, Removed left side shift and replaced it with a MT() for LSFT and SPC. Userspace seems to be working properly now! HURRAY * Layout change Removed space/shift and reset modifiers to what they were originally. Added homerow modifiers. * Removed excessive tabs in files * Moved mods on homerow around... * changes recommended by @drashna * removed homerow mods, more flashy lighting! * changed delays for lighting. * velocikey code retro fit into userspace to match typing speed currently "working" but isn't as reactive as I want. * Readme and other documentation hidden throughout code * Added a pretty picture * pretty picture actually added * More readme updates * Velocikey now working inside my userspace! * Changed repo macro and fixed readme * Removed media layer, moved media control to LAZY layer * fixed more merge issues when I had to merge... * implemented some leader key stuff * removed merge garbage... * changes requested by @drashna, leader key switch from macros --- keyboards/mechmini/v2/keymaps/arkag/config.h | 2 +- keyboards/mechmini/v2/keymaps/arkag/keymap.c | 14 +- keyboards/mechmini/v2/keymaps/arkag/rules.mk | 1 + users/arkag/arkag.c | 213 +++++++------------ users/arkag/config.h | 5 +- 5 files changed, 93 insertions(+), 142 deletions(-) diff --git a/keyboards/mechmini/v2/keymaps/arkag/config.h b/keyboards/mechmini/v2/keymaps/arkag/config.h index f5f3a90fa70c..e89adc0978ce 100644 --- a/keyboards/mechmini/v2/keymaps/arkag/config.h +++ b/keyboards/mechmini/v2/keymaps/arkag/config.h @@ -3,5 +3,5 @@ // save me space! #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION -#define DISABLE_LEADER +// #define DISABLE_LEADER #define NO_MUSIC_MODE diff --git a/keyboards/mechmini/v2/keymaps/arkag/keymap.c b/keyboards/mechmini/v2/keymaps/arkag/keymap.c index 7038f220c45e..29e125394bcd 100644 --- a/keyboards/mechmini/v2/keymaps/arkag/keymap.c +++ b/keyboards/mechmini/v2/keymaps/arkag/keymap.c @@ -8,10 +8,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = LAYOUT_2u_space_ortho( - KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_LEAD, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, QUOTE, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_ENT, - M_PMOD, LRALT, M_SMOD, LOWER, RAISE, KC_SPC, KC_SLSH, LAZY, KC_LEFT, KC_DOWN, KC_RGHT), + M_PMOD, LRALT, M_SMOD, LOWER, RAISE, KC_SPC, KC_SLSH, KC_BSLS, KC_LEFT, KC_DOWN, KC_RGHT), [_RAISE] = LAYOUT_2u_space_ortho( GRAVE, KC_1, KC_2, THREE, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, @@ -20,10 +20,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, KEEB, _______, _______, _______, M_OS, KC_PSLS, KC_PMNS, KC_PAST), [_LOWER] = LAYOUT_2u_space_ortho( - _______, _______, _______, _______, _______, _______, _______, M_ULIN, M_ITAL, _______, M_P_B, M_C_A_D, - _______, _______, STRIKE, _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_CAPS, KC_DEL, _______, _______, _______, M_BOLD, _______, _______, _______, _______, KC_PGUP, _______, - _______, _______, _______, _______, _______, _______, KC_BSLS, M_CALC, KC_HOME, KC_PGDN, KC_END), + KC_ESC, _______, _______, _______, _______, _______, _______, _______, _______, _______, M_P_B, M_C_A_D, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_CAPS, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END), [_KEEB] = LAYOUT_2u_space_ortho( KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, @@ -35,5 +35,5 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, M_TM, _______, M_SNIPT, M_SHRUG, _______, _______, KC_MUTE, _______, _______, _______, _______, _______, M_GGT, _______, M_UF, M_LOD, M_REPO, _______, _______, _______, _______, _______, _______, _______, _______, _______, M_TF, M_LENNY, _______, KC_VOLU, KC_MPLY, - _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT), + _______, _______, _______, _______, _______, _______, M_CALC, _______, KC_MPRV, KC_VOLD, KC_MNXT), }; diff --git a/keyboards/mechmini/v2/keymaps/arkag/rules.mk b/keyboards/mechmini/v2/keymaps/arkag/rules.mk index d6c210e9e867..c1d5afa1ebae 100644 --- a/keyboards/mechmini/v2/keymaps/arkag/rules.mk +++ b/keyboards/mechmini/v2/keymaps/arkag/rules.mk @@ -11,6 +11,7 @@ AUDIO_ENABLE = no RGBLIGHT_ENABLE = yes TAP_DANCE_ENABLE = yes UNICODE_ENABLE = yes +LEADER_ENABLE = yes # save me space! EXTRAFLAGS += -flto diff --git a/users/arkag/arkag.c b/users/arkag/arkag.c index a35e13ed6b61..212d06de67cf 100644 --- a/users/arkag/arkag.c +++ b/users/arkag/arkag.c @@ -370,115 +370,70 @@ void matrix_init_user(void) { set_os(current_os, false); } +LEADER_EXTERNS(); + void matrix_scan_user(void) { check_state(); flash_rgb(); fade_rgb(); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case M_PMOD: - if (record->event.pressed) { - pri_mod(true); - } else { - pri_mod(false); - } - return false; + LEADER_DICTIONARY() { + leading = false; + leader_end(); - case M_SMOD: - if (record->event.pressed) { - sec_mod(true); - } else { - sec_mod(false); - } - return false; - - case M_P_B: - if (record->event.pressed) { + // begin OS functions + SEQ_TWO_KEYS(KC_P, KC_B) { if (current_os == OS_WIN) { SEND_STRING(SS_DOWN(X_LGUI) SS_TAP(X_PAUSE) SS_UP(X_LGUI)); } else { } } - return false; - - case M_C_A_D: - if (record->event.pressed) { + SEQ_THREE_KEYS(KC_C, KC_A, KC_D) { if (current_os == OS_WIN) { SEND_STRING(SS_DOWN(X_LCTRL) SS_DOWN(X_LALT) SS_TAP(X_DELETE) SS_UP(X_LALT) SS_UP(X_LCTRL)); } else { } } - return false; - - case M_CALC: - if (record->event.pressed) { + SEQ_FOUR_KEYS(KC_C, KC_A, KC_L, KC_C) { if (current_os == OS_WIN) { SEND_STRING(SS_TAP(X_CALCULATOR)); } else if (current_os == OS_MAC) { SEND_STRING(SS_DOWN(X_LGUI) SS_TAP(X_SPACE) SS_UP(X_LGUI) "calculator" SS_TAP(X_ENTER)); } } - return false; - - case M_OS: - if (record->event.pressed) { - set_os((current_os+1) % _OS_COUNT, true); - } - return false; - - case M_LOD: - if (record->event.pressed) { - send_unicode_hex_string("0CA0 005F 005F 0CA0"); - } - return false; + // end OS functions - case M_LENNY: - if (record->event.pressed) { - send_unicode_hex_string("0028 0020 0361 00B0 0020 035C 0296 0020 0361 00B0 0029"); + // begin format functions + SEQ_ONE_KEY(KC_B) { + surround_type(4, KC_8, true); } - return false; - - - case M_TF: - if (record->event.pressed) { - send_unicode_hex_string("0028 256F 2035 0414 2032 0029 256F 5F61 253B 2501 253B"); + SEQ_ONE_KEY(KC_I) { + surround_type(2, KC_8, true); } - return false; - - case M_UF: - if (record->event.pressed) { - send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 0020 30CE 0029"); + SEQ_ONE_KEY(KC_U) { + surround_type(4, KC_MINS, true); } - return false; - - case M_SHRUG: - if (record->event.pressed) { - send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); + SEQ_ONE_KEY(KC_S) { + surround_type(4, KC_GRAVE, true); } - return false; - - case M_TM: - if (record->event.pressed) { - send_unicode_hex_string("2122"); + SEQ_TWO_KEYS(KC_S, KC_S) { + if (current_os == OS_MAC) { + long_keystroke(3, (uint16_t[]){KC_LGUI, KC_LSFT, KC_4}); + } else if (current_os == OS_WIN) { + long_keystroke(3, (uint16_t[]){KC_LGUI, KC_LSFT, KC_S}); + } else { + return; + } } - return false; - - case M_REPO: - if (record->event.pressed) { - SEND_STRING("https://github.com/qmk/qmk_firmware/tree/master/users/arkag"); + SEQ_ONE_KEY(KC_C) { + surround_type(2, KC_GRAVE, false); } - return false; - - case M_GGT: - if (record->event.pressed) { - SEND_STRING("@GrahamGoldenTech.com"); + SEQ_TWO_KEYS(KC_C, KC_C) { + surround_type(6, KC_GRAVE, false); } - return false; + // end format functions - case M_SNIPT: - if (record->event.pressed) { + // start fancy functions + SEQ_THREE_KEYS(KC_C, KC_C, KC_C) { surround_type(6, KC_GRAVE, false); pri_mod(true); tap_key(KC_V); @@ -488,44 +443,68 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { tap_key(KC_RGHT); tap_key(KC_ENTER); } - return false; + // end fancy functions - case M_BOLD: - if (record->event.pressed) { - surround_type(4, KC_8, true); + // start typing functions + SEQ_TWO_KEYS(KC_T, KC_M) { + // ™ + send_unicode_hex_string("2122"); } - return false; + SEQ_THREE_KEYS(KC_G, KC_G, KC_T) { + SEND_STRING("@GrahamGoldenTech.com"); + } + SEQ_THREE_KEYS(KC_L, KC_O, KC_D) { + // ಠ__ಠ + send_unicode_hex_string("0CA0 005F 005F 0CA0"); + } + SEQ_FOUR_KEYS(KC_R, KC_E, KC_P, KC_O) { + SEND_STRING("https://github.com/qmk/qmk_firmware/tree/master/users/arkag"); + } + SEQ_FOUR_KEYS(KC_F, KC_L, KC_I, KC_P) { + // (╯‵Д′)╯彡┻━┻ + send_unicode_hex_string("0028 256F 2035 0414 2032 0029 256F 5F61 253B 2501 253B"); + } + SEQ_FIVE_KEYS(KC_U, KC_F, KC_L, KC_I, KC_P) { + // ┬─┬ノ( º _ º ノ) + send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 0020 30CE 0029"); + } + SEQ_FIVE_KEYS(KC_L, KC_E, KC_N, KC_N, KC_Y) { + // ( ͡° ͜ʖ ͡°) + send_unicode_hex_string("0028 0020 0361 00B0 0020 035C 0296 0020 0361 00B0 0029"); + } + SEQ_FIVE_KEYS(KC_S, KC_H, KC_R, KC_U, KC_G) { + // ¯\_(ツ)_/¯ + send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); + } + // end typing functions - case M_ITAL: + } +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case M_PMOD: if (record->event.pressed) { - surround_type(2, KC_8, true); + pri_mod(true); + } else { + pri_mod(false); } return false; - case M_ULIN: + case M_SMOD: if (record->event.pressed) { - surround_type(4, KC_MINS, true); + sec_mod(true); + } else { + sec_mod(false); } return false; - case KC_LSFT: + case M_OS: if (record->event.pressed) { - save_color(underglow); - underglow = mod_color(underglow, true, 75); - SEND_STRING(SS_DOWN(X_LSHIFT)); - } else { - reset_color(); - SEND_STRING(SS_UP(X_LSHIFT)); + set_os((current_os+1) % _OS_COUNT, true); } return false; - case MEDIA: - case LAZY: - case KEEB: - case RAISE: - case LOWER: - return true; - default: if (record->event.pressed) { state = active; @@ -535,36 +514,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } } -uint32_t layer_state_set_user(uint32_t state) { - switch (biton32(state)) { - case _LAZY: - save_color(underglow); - underglow = mod_color(underglow, true, 50); - break; - case _MEDIA: - save_color(underglow); - underglow = mod_color(underglow, true, 150); - break; - case _KEEB: - save_color(underglow); - underglow = mod_color(underglow, false, 150); - break; - case _LOWER: - save_color(underglow); - underglow = mod_color(underglow, false, 100); - break; - case _RAISE: - save_color(underglow); - underglow = mod_color(underglow, true, 100); - break; - default: - reset_color(); - break; - } - set_color(underglow, false); - return state; -} - //Tap Dance Definitions qk_tap_dance_action_t tap_dance_actions[] = { [TD_3_GRV_ACT] = ACTION_TAP_DANCE_FN (dance_3), diff --git a/users/arkag/config.h b/users/arkag/config.h index e715e5534ee0..2e0a9ad01998 100644 --- a/users/arkag/config.h +++ b/users/arkag/config.h @@ -1,5 +1,6 @@ #pragma once -#define TAPPING_TERM 200 +#define TAPPING_TERM 200 +#define LEADER_TIMEOUT 250 -#define IGNORE_MOD_TAP_INTERRUPT +#define LEADER_PER_KEY_TIMING From 6734cd9c5c7b63677d3d4cf9bef8ccf878fd3551 Mon Sep 17 00:00:00 2001 From: Wilba6582 Date: Mon, 1 Oct 2018 00:31:23 +1000 Subject: [PATCH 091/505] Keyboard: Zeal60: Fix getting backlight values "id_*_indicator_row_col" (#4030) --- keyboards/zeal60/rgb_backlight.c | 33 ++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/keyboards/zeal60/rgb_backlight.c b/keyboards/zeal60/rgb_backlight.c index 9f62a8d38187..ce8b1cb17920 100644 --- a/keyboards/zeal60/rgb_backlight.c +++ b/keyboards/zeal60/rgb_backlight.c @@ -916,6 +916,31 @@ void backlight_set_indicator_index( uint8_t *index, uint8_t row, uint8_t column } } +void backlight_get_indicator_row_col( uint8_t index, uint8_t *row, uint8_t *column ) +{ + if ( index == 255 || index == 254 ) + { + // Special value, 255=none, 254=all + *row = index; + *column = 0; + return; + } + for ( uint8_t r = 0; r < MATRIX_ROWS; r++ ) + { + for ( uint8_t c = 0; c < MATRIX_COLS; c++ ) + { + uint8_t i = 255; + map_row_column_to_led( r, c, &i ); + if ( i == index ) + { + *row = r; + *column = c; + return; + } + } + } +} + // Some helpers for setting/getting HSV void _set_color( HSV *color, uint8_t *data ) { @@ -1146,7 +1171,7 @@ void backlight_config_get_value( uint8_t *data ) } case id_caps_lock_indicator_row_col: { - //*value_data = g_config.caps_lock_indicator.index; + backlight_get_indicator_row_col( g_config.caps_lock_indicator.index, &(value_data[0]), &(value_data[1]) ); break; } case id_layer_1_indicator_color: @@ -1156,7 +1181,7 @@ void backlight_config_get_value( uint8_t *data ) } case id_layer_1_indicator_row_col: { - //*value_data = g_config.layer_1_indicator.index; + backlight_get_indicator_row_col( g_config.layer_1_indicator.index, &(value_data[0]), &(value_data[1]) ); break; } case id_layer_2_indicator_color: @@ -1166,7 +1191,7 @@ void backlight_config_get_value( uint8_t *data ) } case id_layer_2_indicator_row_col: { - //*value_data = g_config.layer_2_indicator.index; + backlight_get_indicator_row_col( g_config.layer_2_indicator.index, &(value_data[0]), &(value_data[1]) ); break; } case id_layer_3_indicator_color: @@ -1176,7 +1201,7 @@ void backlight_config_get_value( uint8_t *data ) } case id_layer_3_indicator_row_col: { - //*value_data = g_config.layer_3_indicator.index; + backlight_get_indicator_row_col( g_config.layer_3_indicator.index, &(value_data[0]), &(value_data[1]) ); break; } case id_alphas_mods: From 66ef1e3d6770e388d631d25e4cd1c6b1640cea24 Mon Sep 17 00:00:00 2001 From: Wilba6582 Date: Mon, 1 Oct 2018 01:35:10 +1000 Subject: [PATCH 092/505] RAMA M6-B and IS31FL3218 driver (#4021) * Initial RAMA M6-B commit. * Moved IS31FL3218 driver, minor cleanups * Refactor, added dynamic keymap. * Added dynamic keymaps to RAMA M6-A * Refactor M6-A and M6-B to use common code. * Formatting * Cleanup * Cleanup * Changes from review --- drivers/issi/is31fl3218.c | 102 ++++++ .../config.h => drivers/issi/is31fl3218.h | 16 +- keyboards/rama/m6_a/config.h | 24 +- keyboards/rama/m6_a/keymaps/default/keymap.c | 316 +----------------- keyboards/rama/m6_a/m6_a.c | 31 +- keyboards/rama/m6_a/readme.md | 2 +- keyboards/rama/m6_a/rules.mk | 44 ++- keyboards/rama/m6_b/config.h | 129 +++++++ keyboards/rama/m6_b/info.json | 19 ++ keyboards/rama/m6_b/keymaps/default/keymap.c | 16 + keyboards/rama/m6_b/m6_b.c | 230 +++++++++++++ keyboards/rama/m6_b/m6_b.h | 28 ++ keyboards/rama/m6_b/m6_b_api.h | 39 +++ keyboards/rama/m6_b/readme.md | 15 + keyboards/rama/m6_b/rgb_backlight.c | 139 ++++++++ keyboards/rama/m6_b/rgb_backlight.h | 34 ++ keyboards/rama/m6_b/rules.mk | 77 +++++ quantum/dynamic_keymap.c | 2 +- 18 files changed, 885 insertions(+), 378 deletions(-) create mode 100644 drivers/issi/is31fl3218.c rename keyboards/rama/m6_a/keymaps/default/config.h => drivers/issi/is31fl3218.h (67%) create mode 100644 keyboards/rama/m6_b/config.h create mode 100644 keyboards/rama/m6_b/info.json create mode 100644 keyboards/rama/m6_b/keymaps/default/keymap.c create mode 100644 keyboards/rama/m6_b/m6_b.c create mode 100644 keyboards/rama/m6_b/m6_b.h create mode 100644 keyboards/rama/m6_b/m6_b_api.h create mode 100644 keyboards/rama/m6_b/readme.md create mode 100644 keyboards/rama/m6_b/rgb_backlight.c create mode 100644 keyboards/rama/m6_b/rgb_backlight.h create mode 100644 keyboards/rama/m6_b/rules.mk diff --git a/drivers/issi/is31fl3218.c b/drivers/issi/is31fl3218.c new file mode 100644 index 000000000000..db44f725644f --- /dev/null +++ b/drivers/issi/is31fl3218.c @@ -0,0 +1,102 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 "is31fl3218.h" +#include "i2c_master.h" + +// This is the full 8-bit address +#define ISSI_ADDRESS 0b10101000 + +// These are the register addresses +#define ISSI_REG_SHUTDOWN 0x00 +#define ISSI_REG_PWM 0x01 +#define ISSI_REG_CONTROL 0x13 +#define ISSI_REG_UPDATE 0x16 +#define ISSI_REG_RESET 0x17 + +// Default timeout if no I2C response +#define ISSI_TIMEOUT 100 + +// Reusable buffer for transfers +uint8_t g_twi_transfer_buffer[20]; + +// IS31FL3218 has 18 PWM outputs and a fixed I2C address, so no chaining. +// If used as RGB LED driver, LEDs are assigned RGB,RGB,RGB,RGB,RGB,RGB +uint8_t g_pwm_buffer[18]; +bool g_pwm_buffer_update_required = false; + +void IS31FL3218_write_register( uint8_t reg, uint8_t data ) +{ + g_twi_transfer_buffer[0] = reg; + g_twi_transfer_buffer[1] = data; + i2c_transmit( ISSI_ADDRESS, g_twi_transfer_buffer, 2, ISSI_TIMEOUT); +} + +void IS31FL3218_write_pwm_buffer( uint8_t *pwm_buffer ) +{ + g_twi_transfer_buffer[0] = ISSI_REG_PWM; + for ( int i=0; i<18; i++ ) { + g_twi_transfer_buffer[1+i] = pwm_buffer[i]; + } + + i2c_transmit( ISSI_ADDRESS, g_twi_transfer_buffer, 19, ISSI_TIMEOUT); +} + +void IS31FL3218_init(void) +{ + // In case we ever want to reinitialize (?) + IS31FL3218_write_register( ISSI_REG_RESET, 0x00 ); + + // Turn off software shutdown + IS31FL3218_write_register( ISSI_REG_SHUTDOWN, 0x01 ); + + // Set all PWM values to zero + for ( uint8_t i = 0; i < 18; i++ ) { + IS31FL3218_write_register( ISSI_REG_PWM+i, 0x00 ); + } + + // Enable all channels + for ( uint8_t i = 0; i < 3; i++ ) { + IS31FL3218_write_register( ISSI_REG_CONTROL+i, 0b00111111 ); + } + + // Load PWM registers and LED Control register data + IS31FL3218_write_register( ISSI_REG_UPDATE, 0x01 ); +} + +void IS31FL3218_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) +{ + g_pwm_buffer[index * 3 + 0] = red; + g_pwm_buffer[index * 3 + 1] = green; + g_pwm_buffer[index * 3 + 2] = blue; + g_pwm_buffer_update_required = true; +} + +void IS31FL3218_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) +{ + for ( int i = 0; i < 6; i++ ) { + IS31FL3218_set_color( i, red, green, blue ); + } +} + +void IS31FL3218_update_pwm_buffers(void) +{ + if ( g_pwm_buffer_update_required ) { + IS31FL3218_write_pwm_buffer( g_pwm_buffer ); + // Load PWM registers and LED Control register data + IS31FL3218_write_register( ISSI_REG_UPDATE, 0x01 ); + } + g_pwm_buffer_update_required = false; +} diff --git a/keyboards/rama/m6_a/keymaps/default/config.h b/drivers/issi/is31fl3218.h similarity index 67% rename from keyboards/rama/m6_a/keymaps/default/config.h rename to drivers/issi/is31fl3218.h index d150575c1a73..2d24e514638e 100644 --- a/keyboards/rama/m6_a/keymaps/default/config.h +++ b/drivers/issi/is31fl3218.h @@ -1,4 +1,4 @@ -/* Copyright 2018 Wilba +/* Copyright 2018 Jason Williams (Wilba) * * 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 @@ -13,12 +13,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +#pragma once -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#include +#include -#include "../../config.h" - -// place overrides here - -#endif +void IS31FL3218_init(void); +void IS31FL3218_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ); +void IS31FL3218_set_color_all( uint8_t red, uint8_t green, uint8_t blue ); +void IS31FL3218_update_pwm_buffers(void); diff --git a/keyboards/rama/m6_a/config.h b/keyboards/rama/m6_a/config.h index 0c5355f4a8ad..8d77f5339d5a 100644 --- a/keyboards/rama/m6_a/config.h +++ b/keyboards/rama/m6_a/config.h @@ -15,8 +15,7 @@ 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 +#pragma once #include "config_common.h" @@ -187,4 +186,23 @@ along with this program. If not, see . /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 -#endif +#define RGB_BACKLIGHT_ENABLED 0 + +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION_ADDR 34 + +// Backlight config starts after EEPROM version +#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 +// Dynamic keymap starts after backlight config (35+37) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 diff --git a/keyboards/rama/m6_a/keymaps/default/keymap.c b/keyboards/rama/m6_a/keymaps/default/keymap.c index 6b15f3cd102d..7a408fa8aa56 100644 --- a/keyboards/rama/m6_a/keymaps/default/keymap.c +++ b/keyboards/rama/m6_a/keymaps/default/keymap.c @@ -3,322 +3,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT( - TO(1), KC_A, KC_B, KC_C, KC_D, KC_E), + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6), LAYOUT( - TO(2), KC_F, KC_G, KC_H, KC_I, KC_J), + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), LAYOUT( - TO(3), KC_K, KC_L, KC_M, KC_N, KC_O), + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), LAYOUT( - TO(4), KC_P, KC_Q, KC_R, KC_S, KC_T), + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO) }; - LAYOUT( - TO(5), KC_U, KC_V, KC_W, KC_X, KC_Y), - - LAYOUT( - TO(0), KC_Z, KC_1, KC_2, KC_3, KC_4)}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - //keyevent_t event = record->event; - - switch (id) - { - case 0: - if (record->event.pressed) - { - return MACRO(T(T), T(G), T(L), T(H), T(F), T(ENT), END); - } - break; - case 1: - if (record->event.pressed) - { - return MACRO(T(T), T(G), T(G), T(ENT), END); - } - break; - case 2: - if (record->event.pressed) - { - return MACRO(D(NO), T(L), U(NO), END); - } - break; - case 3: - if (record->event.pressed) - { - return MACRO(D(LCTL), T(Z), U(LCTL), END); - } - break; - case 4: - if (record->event.pressed) - { - return MACRO(D(LCTL), D(LSFT), T(Z), U(LSFT), U(LCTL), END); - } - break; - case 5: - if (record->event.pressed) - { - return MACRO(D(LCTL), T(X), U(LCTL), END); - } - break; - case 6: - if (record->event.pressed) - { - return MACRO(D(LCTL), T(C), U(LCTL), END); - } - break; - case 7: - if (record->event.pressed) - { - return MACRO(D(LCTL), T(V), U(LCTL), END); - } - break; - } - return MACRO_NONE; -} - -// M6-A LEDs are connected to D6, B6, F5, B4, C7, F7 -// This is 1-based because I copied it from Knops code. -void set_switch_led(int ledId, bool state) -{ - if (state) - { - switch (ledId) - { - case 1: - PORTD |= (1 << 6); - break; - case 2: - PORTB |= (1 << 6); - break; - case 3: - PORTF |= (1 << 5); - break; - case 4: - PORTB |= (1 << 4); - break; - case 5: - PORTC |= (1 << 7); - break; - case 6: - PORTF |= (1 << 7); - break; - } - } - else - { - switch (ledId) - { - case 1: - PORTD &= ~(1 << 6); - break; - case 2: - PORTB &= ~(1 << 6); - break; - case 3: - PORTF &= ~(1 << 5); - break; - case 4: - PORTB &= ~(1 << 4); - break; - case 5: - PORTC &= ~(1 << 7); - break; - case 6: - PORTF &= ~(1 << 7); - break; - } - } -} - -void set_layer_led(int layerId) -{ - // UNUSED -} - -void led_set_layer(int layer); - -void matrix_init_user(void) -{ - led_init_ports(); - led_set_layer(0); -} - -void matrix_scan_user(void) -{ -} - -// M6-A LEDs are connected to D6, B6, F5, B4, C7, F7 -void led_init_ports() -{ - // Switch #1 - DDRD |= (1 << 6); - PORTD &= ~(1 << 6); - - // Switch #2 - DDRB |= (1 << 6); - PORTB &= ~(1 << 6); - - // Switch #3 - DDRF |= (1 << 5); - PORTF &= ~(1 << 5); - - // Switch #4 - DDRB |= (1 << 4); - PORTB &= ~(1 << 4); - - // Switch #5 - DDRC |= (1 << 7); - PORTC &= ~(1 << 7); - - // Switch #6 - DDRF |= (1 << 7); - PORTF &= ~(1 << 7); -} - -void led_set_user(uint8_t usb_led) -{ - - if (usb_led & (1 << USB_LED_NUM_LOCK)) - { - } - else - { - } - - if (usb_led & (1 << USB_LED_CAPS_LOCK)) - { - } - else - { - } - - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) - { - } - else - { - } - - if (usb_led & (1 << USB_LED_COMPOSE)) - { - } - else - { - } - - if (usb_led & (1 << USB_LED_KANA)) - { - } - else - { - } -} - -void led_set_layer(int layer) -{ - switch (layer) - { - case 0: - set_switch_led(1, true); - set_switch_led(2, false); - set_switch_led(3, false); - set_switch_led(4, false); - set_switch_led(5, false); - set_switch_led(6, false); - break; - case 1: - set_switch_led(1, false); - set_switch_led(2, true); - set_switch_led(3, false); - set_switch_led(4, false); - set_switch_led(5, false); - set_switch_led(6, false); - break; - case 2: - set_switch_led(1, false); - set_switch_led(2, false); - set_switch_led(3, true); - set_switch_led(4, false); - set_switch_led(5, false); - set_switch_led(6, false); - break; - case 3: - set_switch_led(1, false); - set_switch_led(2, false); - set_switch_led(3, false); - set_switch_led(4, true); - set_switch_led(5, false); - set_switch_led(6, false); - break; - case 4: - set_switch_led(1, false); - set_switch_led(2, false); - set_switch_led(3, false); - set_switch_led(4, false); - set_switch_led(5, true); - set_switch_led(6, false); - break; - case 5: - set_switch_led(1, false); - set_switch_led(2, false); - set_switch_led(3, false); - set_switch_led(4, false); - set_switch_led(5, false); - set_switch_led(6, true); - break; - default: - set_switch_led(1, true); - set_switch_led(2, true); - set_switch_led(3, true); - set_switch_led(4, true); - set_switch_led(5, true); - set_switch_led(6, true); - break; - } -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) -{ - switch (keycode) - { - case TO(0): - if (record->event.pressed) - { - led_set_layer(0); - } - break; - case TO(1): - if (record->event.pressed) - { - led_set_layer(1); - } - break; - case TO(2): - if (record->event.pressed) - { - led_set_layer(2); - } - break; - case TO(3): - if (record->event.pressed) - { - led_set_layer(3); - } - break; - case TO(4): - if (record->event.pressed) - { - led_set_layer(4); - } - break; - case TO(5): - if (record->event.pressed) - { - led_set_layer(5); - } - break; - } - return true; -} diff --git a/keyboards/rama/m6_a/m6_a.c b/keyboards/rama/m6_a/m6_a.c index 1c84ea2b83da..fa1900360090 100644 --- a/keyboards/rama/m6_a/m6_a.c +++ b/keyboards/rama/m6_a/m6_a.c @@ -1,4 +1,4 @@ -/* Copyright 2018 Wilba +/* Copyright 2018 Jason Williams (Wilba) * * 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 @@ -13,32 +13,3 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "m6_a.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/rama/m6_a/readme.md b/keyboards/rama/m6_a/readme.md index 5dd2b92e1916..ceaf6a88de26 100644 --- a/keyboards/rama/m6_a/readme.md +++ b/keyboards/rama/m6_a/readme.md @@ -12,4 +12,4 @@ Make example for this keyboard (after setting up your build environment): make rama/m6_a:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. \ No newline at end of file +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). \ No newline at end of file diff --git a/keyboards/rama/m6_a/rules.mk b/keyboards/rama/m6_a/rules.mk index ca2a2a5f80be..ed85ac36d0c3 100644 --- a/keyboards/rama/m6_a/rules.mk +++ b/keyboards/rama/m6_a/rules.mk @@ -1,5 +1,7 @@ +# project specific files +SRC = keyboards/rama/m6_b/m6_b.c + # MCU name -#MCU = at90usb1286 MCU = atmega32u4 # Processor frequency. @@ -38,31 +40,27 @@ 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 - +# Boot Section +BOOTLOADER = atmel-dfu # 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 +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 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE ?= no # Breathing sleep LED during USB suspend +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # 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 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 -FAUXCLICKY_ENABLE ?= no # Use buzzer to emulate clicky switches +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes \ No newline at end of file diff --git a/keyboards/rama/m6_b/config.h b/keyboards/rama/m6_b/config.h new file mode 100644 index 000000000000..1adaad3f9ed1 --- /dev/null +++ b/keyboards/rama/m6_b/config.h @@ -0,0 +1,129 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x5241 // "RW" +#define PRODUCT_ID 0x006B // 6-B +#define DEVICE_VER 0x0001 +#define MANUFACTURER RAMA.WORKS +#define PRODUCT RAMA M6-B +#define DESCRIPTION RAMA M6-B Macropad + +/* key matrix size */ +#define MATRIX_ROWS 1 +#define MATRIX_COLS 6 + +/* + * 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 { E6 } +#define MATRIX_COL_PINS { D4, B5, F4, D7, C6, F6 } +#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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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)) \ +) + +#define RGB_BACKLIGHT_ENABLED 1 + +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION_ADDR 34 + +// Backlight config starts after EEPROM version +#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 +// Dynamic keymap starts after backlight config (35+37) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 diff --git a/keyboards/rama/m6_b/info.json b/keyboards/rama/m6_b/info.json new file mode 100644 index 000000000000..c88a3cc61855 --- /dev/null +++ b/keyboards/rama/m6_b/info.json @@ -0,0 +1,19 @@ +{ + "keyboard_name": "m6-b", + "url": "", + "maintainer": "qmk", + "width": 3, + "height": 2, + "layouts": { + "LAYOUT": { + "layout": [ + { "x": 0, "y": 0 }, + { "x": 1, "y": 0 }, + { "x": 2, "y": 0 }, + { "x": 0, "y": 1 }, + { "x": 1, "y": 1 }, + { "x": 2, "y": 1 } + ] + } + } +} diff --git a/keyboards/rama/m6_b/keymaps/default/keymap.c b/keyboards/rama/m6_b/keymaps/default/keymap.c new file mode 100644 index 000000000000..7a408fa8aa56 --- /dev/null +++ b/keyboards/rama/m6_b/keymaps/default/keymap.c @@ -0,0 +1,16 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + LAYOUT( + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6), + + LAYOUT( + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), + + LAYOUT( + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), + + LAYOUT( + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO) }; + diff --git a/keyboards/rama/m6_b/m6_b.c b/keyboards/rama/m6_b/m6_b.c new file mode 100644 index 000000000000..e7cd2f62872a --- /dev/null +++ b/keyboards/rama/m6_b/m6_b.c @@ -0,0 +1,230 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 "m6_b.h" +#include "m6_b_api.h" + +// Check that no backlight functions are called +#if RGB_BACKLIGHT_ENABLED +#include "rgb_backlight.h" +#endif // RGB_BACKLIGHT_ENABLED + +#include "raw_hid.h" +#include "dynamic_keymap.h" +#include "timer.h" +#include "tmk_core/common/eeprom.h" + +bool eeprom_is_valid(void) +{ + return (eeprom_read_word(((void*)EEPROM_MAGIC_ADDR)) == EEPROM_MAGIC && + eeprom_read_byte(((void*)EEPROM_VERSION_ADDR)) == EEPROM_VERSION); +} + +void eeprom_set_valid(bool valid) +{ + eeprom_update_word(((void*)EEPROM_MAGIC_ADDR), valid ? EEPROM_MAGIC : 0xFFFF); + eeprom_update_byte(((void*)EEPROM_VERSION_ADDR), valid ? EEPROM_VERSION : 0xFF); +} + +void eeprom_reset(void) +{ + // Set the keyboard-specific EEPROM state as invalid. + eeprom_set_valid(false); + // Set the TMK/QMK EEPROM state as invalid. + eeconfig_disable(); +} + +#ifdef RAW_ENABLE + +void raw_hid_receive( uint8_t *data, uint8_t length ) +{ + uint8_t *command_id = &(data[0]); + uint8_t *command_data = &(data[1]); + switch ( *command_id ) + { + case id_get_protocol_version: + { + command_data[0] = PROTOCOL_VERSION >> 8; + command_data[1] = PROTOCOL_VERSION & 0xFF; + break; + } + case id_get_keyboard_value: + { + if ( command_data[0] == id_uptime ) + { + uint32_t value = timer_read32(); + command_data[1] = (value >> 24 ) & 0xFF; + command_data[2] = (value >> 16 ) & 0xFF; + command_data[3] = (value >> 8 ) & 0xFF; + command_data[4] = value & 0xFF; + } + else + { + *command_id = id_unhandled; + } + break; + } +#ifdef DYNAMIC_KEYMAP_ENABLE + case id_dynamic_keymap_get_keycode: + { + uint16_t keycode = dynamic_keymap_get_keycode( command_data[0], command_data[1], command_data[2] ); + command_data[3] = keycode >> 8; + command_data[4] = keycode & 0xFF; + break; + } + case id_dynamic_keymap_set_keycode: + { + dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] ); + break; + } + case id_dynamic_keymap_reset: + { + dynamic_keymap_reset(); + break; + } +#endif // DYNAMIC_KEYMAP_ENABLE +#if RGB_BACKLIGHT_ENABLED + case id_backlight_config_set_value: + { + //backlight_config_set_value(command_data); + break; + } + case id_backlight_config_get_value: + { + //backlight_config_get_value(command_data); + break; + } + case id_backlight_config_save: + { + //backlight_config_save(); + break; + } +#endif // RGB_BACKLIGHT_ENABLED + case id_eeprom_reset: + { + eeprom_reset(); + break; + } + case id_bootloader_jump: + { + // Need to send data back before the jump + // Informs host that the command is handled + raw_hid_send( data, length ); + // Give host time to read it + wait_ms(100); + bootloader_jump(); + break; + } + default: + { + // Unhandled message. + *command_id = id_unhandled; + break; + } + } + + // Return same buffer with values changed + raw_hid_send( data, length ); + +} + +#endif + +void main_init(void) +{ + // If the EEPROM has the magic, the data is good. + // OK to load from EEPROM. + if (eeprom_is_valid()) { +#if RGB_BACKLIGHT_ENABLED + //backlight_config_load(); +#endif // RGB_BACKLIGHT_ENABLED + } else { +#if RGB_BACKLIGHT_ENABLED + // If the EEPROM has not been saved before, or is out of date, + // save the default values to the EEPROM. Default values + // come from construction of the zeal_backlight_config instance. + //backlight_config_save(); +#endif // RGB_BACKLIGHT_ENABLED +#ifdef DYNAMIC_KEYMAP_ENABLE + // This resets the keymaps in EEPROM to what is in flash. + dynamic_keymap_reset(); +#endif + // Save the magic number last, in case saving was interrupted + eeprom_set_valid(true); + } +#if RGB_BACKLIGHT_ENABLED + // Initialize LED drivers for backlight. + backlight_init_drivers(); + + backlight_timer_init(); + backlight_timer_enable(); +#endif // RGB_BACKLIGHT_ENABLED +} + +void bootmagic_lite(void) +{ + // The lite version of TMK's bootmagic. + // 100% less potential for accidentally making the + // keyboard do stupid things. + + // We need multiple scans because debouncing can't be turned off. + matrix_scan(); + wait_ms(DEBOUNCING_DELAY); + wait_ms(DEBOUNCING_DELAY); + matrix_scan(); + + // If the Esc (matrix 0,0) is held down on power up, + // reset the EEPROM valid state and jump to bootloader. + if ( matrix_get_row(0) & (1<<0) ) { + eeprom_reset(); + bootloader_jump(); + } +} + +void matrix_init_kb(void) { + bootmagic_lite(); + main_init(); + matrix_init_user(); +} + +void matrix_scan_kb(void) { +#if RGB_BACKLIGHT_ENABLED + // This only updates the LED driver buffers if something has changed. + backlight_update_pwm_buffers(); +#endif // BACKLIGHT_ENABLED + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + led_set_user(usb_led); +} + +void suspend_power_down_kb(void) +{ +#if RGB_BACKLIGHT_ENABLED + //backlight_set_suspend_state(true); +#endif // BACKLIGHT_ENABLED +} + +void suspend_wakeup_init_kb(void) +{ +#if RGB_BACKLIGHT_ENABLED + //backlight_set_suspend_state(false); +#endif // BACKLIGHT_ENABLED +} diff --git a/keyboards/rama/m6_b/m6_b.h b/keyboards/rama/m6_b/m6_b.h new file mode 100644 index 000000000000..bd4158bcb10c --- /dev/null +++ b/keyboards/rama/m6_b/m6_b.h @@ -0,0 +1,28 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 + +#include "quantum.h" + +// This a shortcut to help you visually see your layout. +// The first section contains all of the arguments +// The second converts the arguments into a two-dimensional array +#define LAYOUT( \ + K00, K01, K02, K03, K04, K05) \ + { \ + {K00, K01, K02, K03, K04, K05}, \ + } + diff --git a/keyboards/rama/m6_b/m6_b_api.h b/keyboards/rama/m6_b/m6_b_api.h new file mode 100644 index 000000000000..041fd6e6eed7 --- /dev/null +++ b/keyboards/rama/m6_b/m6_b_api.h @@ -0,0 +1,39 @@ +/* Copyright 2017 Jason Williams (Wilba) + * + * 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 + +#define PROTOCOL_VERSION 0x0001 + +enum m6_b_command_id +{ + id_get_protocol_version = 0x01, // always 0x01 + id_get_keyboard_value, + id_set_keyboard_value, + id_dynamic_keymap_get_keycode, + id_dynamic_keymap_set_keycode, + id_dynamic_keymap_reset, + id_backlight_config_set_value, + id_backlight_config_get_value, + id_backlight_config_save, + id_eeprom_reset, + id_bootloader_jump, + id_unhandled = 0xFF, +}; + +enum m6_b_keyboard_value_id +{ + id_uptime = 0x01 +}; diff --git a/keyboards/rama/m6_b/readme.md b/keyboards/rama/m6_b/readme.md new file mode 100644 index 000000000000..d6bdd0c4c208 --- /dev/null +++ b/keyboards/rama/m6_b/readme.md @@ -0,0 +1,15 @@ +# RAMA M6-B + +![RAMA M6-B](https://static1.squarespace.com/static/563c788ae4b099120ae219e2/t/59fc7b1053450adf5bf9a852/1515932239307/RAMA-RAMA-M6-DSA-XO-CAPS.73-3_1.jpg?format=1500w) + +A 6-key companion keyboard. [More info at RAMA WORKS](https://rama.works/m6a) + +Keyboard Maintainer: [Wilba6582](https://github.com/Wilba6582) +Hardware Supported: RAMA M6-B PCB +Hardware Availability: [RAMA WORKS Store](https://ramaworks.store/) + +Make example for this keyboard (after setting up your build environment): + + make rama/m6_b:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). \ No newline at end of file diff --git a/keyboards/rama/m6_b/rgb_backlight.c b/keyboards/rama/m6_b/rgb_backlight.c new file mode 100644 index 000000000000..8f7ac06303e4 --- /dev/null +++ b/keyboards/rama/m6_b/rgb_backlight.c @@ -0,0 +1,139 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 . + */ +#if RGB_BACKLIGHT_ENABLED + +#include "rgb_backlight.h" +//#include "rgb_backlight_api.h" + +#include +#include +#include +#include "progmem.h" + +#include "quantum/color.h" +#include "drivers/avr/i2c_master.h" +#include "drivers/issi/is31fl3218.h" + +bool g_suspend_state = false; + +// Global tick at 20 Hz +uint32_t g_tick = 0; +uint8_t g_config_effect_speed = 0; +uint8_t g_config_brightness = 255; + +void backlight_update_pwm_buffers(void) +{ + IS31FL3218_update_pwm_buffers(); +} + +void backlight_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) +{ + IS31FL3218_set_color( index, red, green, blue ); +} + +void backlight_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) +{ + IS31FL3218_set_color_all( red, green, blue ); +} + + +// This is (F_CPU/1024) / 20 Hz +// = 15625 Hz / 20 Hz +// = 781 +#define TIMER3_TOP 260 + +void backlight_timer_init(void) +{ + static uint8_t backlight_timer_is_init = 0; + if ( backlight_timer_is_init ) + { + return; + } + backlight_timer_is_init = 1; + + // Timer 3 setup + TCCR3B = _BV(WGM32) | // CTC mode OCR3A as TOP + _BV(CS32) | _BV(CS30); // prescale by /1024 + // Set TOP value + uint8_t sreg = SREG; + cli(); + + OCR3AH = (TIMER3_TOP >> 8) & 0xff; + OCR3AL = TIMER3_TOP & 0xff; + SREG = sreg; +} + +void backlight_timer_enable(void) +{ + TIMSK3 |= _BV(OCIE3A); +} + +void backlight_timer_disable(void) +{ + TIMSK3 &= ~_BV(OCIE3A); +} + +void backlight_set_suspend_state(bool state) +{ + g_suspend_state = state; +} + +void backlight_effect_cycle_all(void) +{ + uint8_t hueOffset = ( g_tick << g_config_effect_speed ) & 0xFF; + uint8_t satOffset = 127; + // Relies on hue being 8-bit and wrapping + for ( int i=0; i<6; i++ ) + { + HSV hsv = { .h = hueOffset, .s = satOffset, .v = g_config_brightness }; + RGB rgb = hsv_to_rgb( hsv ); + backlight_set_color( i, rgb.r, rgb.g, rgb.b ); + } +} + +ISR(TIMER3_COMPA_vect) +{ + // delay 1 second before driving LEDs or doing anything else + static uint8_t startup_tick = 0; + if ( startup_tick < 20 ) + { + startup_tick++; + return; + } + + g_tick++; + + if ( g_suspend_state ) + { + backlight_set_color_all( 0, 0, 0 ); + } + else + { + //HSV hsv = { .h = 240, .s = 255, .v = g_config_brightness }; + //RGB rgb = hsv_to_rgb( hsv ); + //backlight_set_color_all( rgb.r, rgb.g, rgb.b ); + backlight_effect_cycle_all(); + } +} + +void backlight_init_drivers(void) +{ + // Initialize I2C + i2c_init(); + IS31FL3218_init(); +} + +#endif // RGB_BACKLIGHT_ENABLED diff --git a/keyboards/rama/m6_b/rgb_backlight.h b/keyboards/rama/m6_b/rgb_backlight.h new file mode 100644 index 000000000000..bbf605284b85 --- /dev/null +++ b/keyboards/rama/m6_b/rgb_backlight.h @@ -0,0 +1,34 @@ +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 + +#if RGB_BACKLIGHT_ENABLED +#else +#error rgb_backlight.h included when RGB_BACKLIGHT_ENABLED == 0 +#endif // RGB_BACKLIGHT_ENABLED + +#include +#include + +#include "quantum/color.h" + +void backlight_init_drivers(void); +void backlight_update_pwm_buffers(void); +void backlight_timer_init(void); +void backlight_timer_enable(void); +void backlight_timer_disable(void); +void backlight_set_suspend_state(bool state); + diff --git a/keyboards/rama/m6_b/rules.mk b/keyboards/rama/m6_b/rules.mk new file mode 100644 index 000000000000..8226debd4561 --- /dev/null +++ b/keyboards/rama/m6_b/rules.mk @@ -0,0 +1,77 @@ +# project specific files +SRC = rgb_backlight.c \ + quantum/color.c \ + drivers/issi/is31fl3218.c \ + drivers/avr/i2c_master.c + + +# 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 +BOOTLOADER = atmel-dfu + +# Do not put the microcontroller into power saving mode +# when we get USB suspend event. We want it to keep updating +# backlight effects. +OPT_DEFS += -DNO_SUSPEND_POWER_DOWN + + +# Build Options +# change yes to no to disable +# +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 +# 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 = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes +CIE1931_CURVE = yes diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c index 2c989d691803..ee39a20251b3 100644 --- a/quantum/dynamic_keymap.c +++ b/quantum/dynamic_keymap.c @@ -17,7 +17,7 @@ #include "config.h" #include "keymap.h" // to get keymaps[][][] #include "tmk_core/common/eeprom.h" -#include "progmem.h"// to read default from flash +#include "progmem.h" // to read default from flash #include "dynamic_keymap.h" From a7d46f1b0f4d18699a38898ff68114204d4c087d Mon Sep 17 00:00:00 2001 From: Erovia Date: Sun, 30 Sep 2018 20:14:06 +0200 Subject: [PATCH 093/505] Keymap: Add ErgoDone keymap with QWERTY and COLEMAK Mod-DH (#3884) * Custom keymap for the ErgoDone The keymap supports QWERTY and COLEMAK MOD-DH with LED indication. * Enable Space Cadet Shift * Fix after-boot layer indicator LED * Implement keyboard suspend, move layer LED handling to function, unify identation * Add readme.md with layout * Optimize LED handling, add include guard Read the default layer via the proper EEPROM function, so the calling of bootmagic() is no longer necessary. Fix bug when the CapsLock LED wasn't working anymore after a layer switch. --- keyboards/ergodone/keymaps/erovia/config.h | 3 + keyboards/ergodone/keymaps/erovia/keymap.c | 233 ++++++++++++++++++++ keyboards/ergodone/keymaps/erovia/readme.md | 76 +++++++ keyboards/ergodone/keymaps/erovia/rules.mk | 1 + 4 files changed, 313 insertions(+) create mode 100644 keyboards/ergodone/keymaps/erovia/config.h create mode 100644 keyboards/ergodone/keymaps/erovia/keymap.c create mode 100644 keyboards/ergodone/keymaps/erovia/readme.md create mode 100644 keyboards/ergodone/keymaps/erovia/rules.mk diff --git a/keyboards/ergodone/keymaps/erovia/config.h b/keyboards/ergodone/keymaps/erovia/config.h new file mode 100644 index 000000000000..60c6ad4a12cb --- /dev/null +++ b/keyboards/ergodone/keymaps/erovia/config.h @@ -0,0 +1,3 @@ +#pragma once + +#define DISABLE_SPACE_CADET_ROLLOVER diff --git a/keyboards/ergodone/keymaps/erovia/keymap.c b/keyboards/ergodone/keymaps/erovia/keymap.c new file mode 100644 index 000000000000..627805afb077 --- /dev/null +++ b/keyboards/ergodone/keymaps/erovia/keymap.c @@ -0,0 +1,233 @@ +#include QMK_KEYBOARD_H +#include "version.h" +#include "bootmagic.h" + +#define QWERTY 0 // qwerty layer +#define COLEMAK 1 // colemak layer +#define FN 2 // function layer + +enum custom_keycodes { + QWRTY = SAFE_RANGE, // can always be here + CLMK, + VRSN, + FNCTN +}; + +/* false: Caps Lock LED is off + true: Caps Lock LED is on */ +bool CAPS_LED = false; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Qwerty layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | Copy | | Paste| 6 | 7 | 8 | 9 | 0 | Sleep | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | E | R | T | Mute | | { | Y | U | I | O | P | \ | + * |--------+------+------+------+------+------| | | [ |------+------+------+------+------+--------| + * | Esc | A | S | D | F | G |------| |------| H | J | K | L | ; | ' | + * |--------+------+------+------+------+------| Fn1 | | } |------+------+------+------+------+--------| + * | LShift | Z | X | C | V | B | | | ] | N | M | , | . | / | RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |LCtrl | LGui | LAlt | Left | Right| | Down | Up | - | = | RCtrl | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | Caps | LGui | | Ins | Del | + * ,------|------|------| |------+--------+------. + * | | | Home | | PgUp | | | + * | Space|Backsp|------| |------| Tab |Enter | + * | |ace | End | | PgDn | | | + * `--------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[QWERTY] = LAYOUT_ergodox( // layer 0 : qwerty + // left hand + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_COPY, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_MUTE, + KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_FN1, + KC_LCTL, KC_LGUI, KC_LALT, KC_LEFT, KC_RGHT, + KC_CAPS, KC_LGUI, + KC_HOME, + KC_SPC, KC_BSPC, KC_END, + // right hand + KC_PASTE, KC_6, KC_7, KC_8, KC_9, KC_0, KC_SLEP, + KC_LBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOTE, + KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, + KC_DOWN, KC_UP, KC_MINS, KC_EQL, KC_RCTL, + KC_INS, KC_DEL, + KC_PGUP, + KC_PGDN, KC_TAB, KC_ENT +), +/* Keymap 1: Colemak layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | Copy | | Paste| 6 | 7 | 8 | 9 | 0 | Sleep | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Tab | Q | W | F | P | B | Mute | | { | J | L | U | Y | ; | \ | + * |--------+------+------+------+------+------| | | [ |------+------+------+------+------+--------| + * | Esc | A | R | S | T | G |------| |------| M | N | E | I | O | ' | + * |--------+------+------+------+------+------| Fn1 | | } |------+------+------+------+------+--------| + * | LShift | Z | X | C | D | V | | | ] | K | H | , | . | / | RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |LCtrl | LGui | LAlt | Left | Right| | Down | Up | - | = | RCtrl | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | Caps | LGui | | Ins | Del | + * ,------|------|------| |------+--------+------. + * | | | Home | | PgUp | | | + * | Space|Backsp|------| |------| Tab |Enter | + * | |ace | End | | PgDn | | | + * `--------------------' `----------------------' + */ +[COLEMAK] = LAYOUT_ergodox( // layer 1 : colemak + // left hand + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_COPY, + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_MUTE, + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_G, + KC_LSPO, KC_Z, KC_X, KC_C, KC_D, KC_V, KC_FN1, + KC_LCTL, KC_LGUI, KC_LALT, KC_LEFT, KC_RGHT, + KC_CAPS, KC_LGUI, + KC_HOME, + KC_SPC, KC_BSPC, KC_END, + // right hand + KC_PASTE, KC_6, KC_7, KC_8, KC_9, KC_0, KC_SLEP, + KC_LBRC, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS, + KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOTE, + KC_RBRC, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, + KC_DOWN, KC_UP, KC_MINS, KC_EQL, KC_RCTL, + KC_INS, KC_DEL, + KC_PGUP, + KC_PGDN, KC_TAB, KC_ENT +), +/* Keymap 2: Function Layer + * + * ,---------------------------------------------------. ,--------------------------------------------------. + * |Version | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | | + * |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| + * | | | | Prev | Play | Next | | | | | | | | | | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | |VolDn | VolUp|------| |------| |QWRTY | CLMK | | | | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | | | | | | | | | + * `-----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | | | + * | | |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// Functions +[FN] = LAYOUT_ergodox( + // left hand + VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, QWRTY, CLMK, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS +), +}; + +const uint16_t PROGMEM fn_actions[] = { + [1] = ACTION_LAYER_TAP_TOGGLE(FN) // FN1 - Momentary Layer 1 +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case VRSN: + if (record->event.pressed) { + SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION); + } + return false; + break; + case QWRTY: + if (record->event.pressed) { + set_single_persistent_default_layer(QWERTY); + } + return false; + break; + case CLMK: + if (record->event.pressed) { + set_single_persistent_default_layer(COLEMAK); + } + return false; + break; + case KC_CAPS: + if (record->event.pressed) { + // Turn LED1 On/Off for Caps Lock + if (CAPS_LED) { + ergodox_right_led_1_off(); + CAPS_LED = false; + } else { + ergodox_right_led_1_on(); + CAPS_LED = true; + } + } + return true; + break; + } + return true; +}; + +// Set LED according to the default layer +void default_layer_led_set(void) { + switch (biton32(eeconfig_read_default_layer())) { + case COLEMAK: + // LED2 for COLEMAK + ergodox_right_led_2_on(); + break; + case QWERTY: + // LED3 for QWERTY + ergodox_right_led_3_on(); + break; + }; +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + default_layer_led_set(); +}; + +uint32_t layer_state_set_user(uint32_t state) { + ergodox_led_all_off(); + switch (biton32(state)) { + case FN: + // Red led on Pro Micro for Fn layer + ergodox_board_led_on(); + break; + }; + + if (CAPS_LED) { + ergodox_right_led_1_on(); + } + + default_layer_led_set(); + + return state; +}; + +void suspend_power_down_user(void) { + ergodox_led_all_off(); +}; + +void suspend_wakeup_init_user(void) { + default_layer_led_set(); +}; diff --git a/keyboards/ergodone/keymaps/erovia/readme.md b/keyboards/ergodone/keymaps/erovia/readme.md new file mode 100644 index 000000000000..160c8759837b --- /dev/null +++ b/keyboards/ergodone/keymaps/erovia/readme.md @@ -0,0 +1,76 @@ +# Erovia's ErdoDone Keymap + +My personal ErgoDone keymap based on the *default* keymap. + +**Features** + +* Qwerty and Colemak Mod-DH support +* Space Cadet Shift +* LED indicator for: active layout, CapsLock, Function layer + +## QWERTY (Normal) Layer +``` +,--------------------------------------------------. ,--------------------------------------------------. +| ` | 1 | 2 | 3 | 4 | 5 | Copy | | Paste| 6 | 7 | 8 | 9 | 0 | Sleep | +|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| +| Tab | Q | W | E | R | T | Mute | | { | Y | U | I | O | P | \ | +|--------+------+------+------+------+------| | | [ |------+------+------+------+------+--------| +| Esc | A | S | D | F | G |------| |------| H | J | K | L | ; | ' | +|--------+------+------+------+------+------| Fn1 | | } |------+------+------+------+------+--------| +| LShift | Z | X | C | V | B | | | ] | N | M | , | . | / | RShift | +`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + |LCtrl | LGui | LAlt | Left | Right| | Down | Up | - | = | RCtrl | + `----------------------------------' `----------------------------------' + ,-------------. ,-------------. + | Caps | LGui | | Ins | Del | + ,------|------|------| |------+--------+------. + | | | Home | | PgUp | | | + | Space|Backsp|------| |------| Tab |Enter | + | |ace | End | | PgDn | | | + `--------------------' `----------------------' +``` + +## Colemak Layer +Switch from `Fn1` layer. +``` +,--------------------------------------------------. ,--------------------------------------------------. +| ` | 1 | 2 | 3 | 4 | 5 | Copy | | Paste| 6 | 7 | 8 | 9 | 0 | Sleep | +|--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| +| Tab | Q | W | F | P | B | Mute | | { | J | L | U | Y | ; | \ | +|--------+------+------+------+------+------| | | [ |------+------+------+------+------+--------| +| Esc | A | R | S | T | G |------| |------| M | N | E | I | O | ' | +|--------+------+------+------+------+------| Fn1 | | } |------+------+------+------+------+--------| +| LShift | Z | X | C | D | V | | | ] | K | H | , | . | / | RShift | +`--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + |LCtrl | LGui | LAlt | Left | Right| | Down | Up | - | = | RCtrl | + `----------------------------------' `----------------------------------' + ,-------------. ,-------------. + | Caps | LGui | | Ins | Del | + ,------|------|------| |------+--------+------. + | | | Home | | PgUp | | | + | Space|Backsp|------| |------| Tab |Enter | + | |ace | End | | PgDn | | | + `--------------------' `----------------------' +``` + +## Function Layer +``` +,---------------------------------------------------. ,--------------------------------------------------. +|Version | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | | +|---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| +| | | | Prev | Play | Next | | | | | | | | | | +|---------+------+------+------+------+------| | | |------+------+------+------+------+--------| +| | | | |VolDn | VolUp|------| |------| |QWRTY | CLMK | | | | +|---------+------+------+------+------+------| | | |------+------+------+------+------+--------| +| | | | | | | | | | | | | | | | +`---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + | | | | | | | | | | | | + `-----------------------------------' `----------------------------------' + ,-------------. ,-------------. + | | | | | | + ,------|------|------| |------+------+------. + | | | | | | | | + | | |------| |------| | | + | | | | | | | | + `--------------------' `--------------------' +``` diff --git a/keyboards/ergodone/keymaps/erovia/rules.mk b/keyboards/ergodone/keymaps/erovia/rules.mk new file mode 100644 index 000000000000..f7b7da719e15 --- /dev/null +++ b/keyboards/ergodone/keymaps/erovia/rules.mk @@ -0,0 +1 @@ +COMMAND_ENABLE = no # Commands for debug and configuration From a6c85f1c2383616e875e7cdc6ce31873d6fb0ce3 Mon Sep 17 00:00:00 2001 From: OlliGranlund Date: Sun, 30 Sep 2018 23:50:16 +0300 Subject: [PATCH 094/505] Keymap: add olligranlund Iris + satan layouts (#4031) * init * function layout planning * nordic keymap v1.0 * Added latest satan layouts, updated readmes * Cleaning code * Renamed ISO -> iso --- .../iris/keymaps/olligranlund_nordic/config.h | 36 +++++ .../iris/keymaps/olligranlund_nordic/keymap.c | 131 ++++++++++++++++++ .../keymaps/olligranlund_nordic/readme.md | 11 ++ .../iris/keymaps/olligranlund_nordic/rules.mk | 2 + .../satan/keymaps/olligranlund_iso/config.h | 17 +++ .../satan/keymaps/olligranlund_iso/keymap.c | 99 +++++++++++++ .../satan/keymaps/olligranlund_iso/readme.md | 18 +++ .../satan/keymaps/olligranlund_iso/rules.mk | 17 +++ 8 files changed, 331 insertions(+) create mode 100644 keyboards/iris/keymaps/olligranlund_nordic/config.h create mode 100644 keyboards/iris/keymaps/olligranlund_nordic/keymap.c create mode 100644 keyboards/iris/keymaps/olligranlund_nordic/readme.md create mode 100644 keyboards/iris/keymaps/olligranlund_nordic/rules.mk create mode 100644 keyboards/satan/keymaps/olligranlund_iso/config.h create mode 100644 keyboards/satan/keymaps/olligranlund_iso/keymap.c create mode 100644 keyboards/satan/keymaps/olligranlund_iso/readme.md create mode 100644 keyboards/satan/keymaps/olligranlund_iso/rules.mk diff --git a/keyboards/iris/keymaps/olligranlund_nordic/config.h b/keyboards/iris/keymaps/olligranlund_nordic/config.h new file mode 100644 index 000000000000..259f2a7424b7 --- /dev/null +++ b/keyboards/iris/keymaps/olligranlund_nordic/config.h @@ -0,0 +1,36 @@ +/* +Copyright 2017 Danny Nguyen + +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 + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +//#define USE_I2C + +/* Select hand configuration */ + +// #define MASTER_LEFT +// #define MASTER_RIGHT +#define EE_HANDS + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 18 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/iris/keymaps/olligranlund_nordic/keymap.c b/keyboards/iris/keymaps/olligranlund_nordic/keymap.c new file mode 100644 index 000000000000..65ed6d289b4e --- /dev/null +++ b/keyboards/iris/keymaps/olligranlund_nordic/keymap.c @@ -0,0 +1,131 @@ +#include QMK_KEYBOARD_H +#include "keymap_swedish.h" + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST +}; + +#define KC_ KC_TRNS + +#define KC_LOWER LOWER +#define KC_RAISE RAISE +#define KC_ADJ ADJUST +#define KC_RST RESET + +#define KC_AA NO_AA +#define KC_AE NO_AE +#define KC_OE NO_OSLH + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ +LT(_LOWER, KC_TAB),KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_AA, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_OE, KC_AE, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, RAISE, KC_BSPC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_MINS, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + KC_LGUI, KC_LALT, KC_SPC, KC_ENT, ADJUST, KC_RALT + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_LOWER] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + NO_TILD, KC_EXLM, NO_AT, KC_HASH, NO_DLR, KC_PERC, NO_CIRC, NO_AMPR, NO_ASTR, NO_SLSH, NO_LPRN, NO_RPRN, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_UP, KC_PGDOWN, NO_LCBR, NO_RCBR, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, NO_BSLS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, NO_LBRC, NO_RBRC, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_TRNS, KC_GRAVE, KC_CIRC, KC_QUOTE, NO_LESS, NO_GRTR, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_RAISE] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + NO_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_7, KC_8, KC_9, NO_MINS, NO_ASTR, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_4, KC_5, KC_6, NO_PLUS, NO_SLSH, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_1, KC_2, KC_3, KC_0, KC_TRNS, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_ADJUST] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + BL_TOGG, BL_STEP, BL_BRTG, RGB_TOG, RGB_RMOD, RGB_MOD, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + BL_DEC, _______, BL_INC, RGB_VAD, RGB_SAI, RGB_VAI, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, RGB_HUD, RGB_SAD, RGB_HUI, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, _______, _______, _______, _______ + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ) +}; + +void persistent_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) { + set_single_persistent_default_layer(_QWERTY); + } + 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; +} diff --git a/keyboards/iris/keymaps/olligranlund_nordic/readme.md b/keyboards/iris/keymaps/olligranlund_nordic/readme.md new file mode 100644 index 000000000000..72eccde10293 --- /dev/null +++ b/keyboards/iris/keymaps/olligranlund_nordic/readme.md @@ -0,0 +1,11 @@ +# Iris Nordic Layout +### by Oliver Granlund + +![Finished product](https://i.imgur.com/zqSBc3t.jpg) + +This is for those who insist to use keyboard with ÅÄÖ. Also thought about the +gaming aspect with this keyboard, therefore space on left side. + +At first I thought about having backspace in the upper right corner of the +slave side, but that made it really clunky to fix your text. Thumbs should take +care of this job instead. diff --git a/keyboards/iris/keymaps/olligranlund_nordic/rules.mk b/keyboards/iris/keymaps/olligranlund_nordic/rules.mk new file mode 100644 index 000000000000..d7463419b4fe --- /dev/null +++ b/keyboards/iris/keymaps/olligranlund_nordic/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes diff --git a/keyboards/satan/keymaps/olligranlund_iso/config.h b/keyboards/satan/keymaps/olligranlund_iso/config.h new file mode 100644 index 000000000000..eab4c8e97533 --- /dev/null +++ b/keyboards/satan/keymaps/olligranlund_iso/config.h @@ -0,0 +1,17 @@ +// Backlight configuration +#undef BACKLIGHT_LEVELS +#define BACKLIGHT_LEVELS 10 + +// Underlight configuration +#undef RGB_DI_PIN +#define RGB_DI_PIN B2 +#undef RGBLED_NUM +#define RGBLED_NUM 16 // Number of LEDs +#undef RGBLIGHT_HUE_STEP +#define RGBLIGHT_HUE_STEP 8 +#undef RGBLIGHT_SAT_STEP +#define RGBLIGHT_SAT_STEP 8 +#undef RGBLIGHT_VAL_STEP +#define RGBLIGHT_VAL_STEP 8 + +#define RGBLIGHT_ANIMATIONS diff --git a/keyboards/satan/keymaps/olligranlund_iso/keymap.c b/keyboards/satan/keymaps/olligranlund_iso/keymap.c new file mode 100644 index 000000000000..5016d4377960 --- /dev/null +++ b/keyboards/satan/keymaps/olligranlund_iso/keymap.c @@ -0,0 +1,99 @@ +#include QMK_KEYBOARD_H + +#define BASE 0 // Default layer +#define MOUSE 1 // Space layer +#define NUMPAD 2 // Alt layer +#define CAPS 3 // Caps layer + +// 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 + +// 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 + +// increase readability +#define _______ KC_TRNS +#define XXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Keymap BASE: (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| [| ]| R | + * |-----------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '| # | R | + * |-----------------------------------------------------------| + * |Shft| \ | Z| X| C| V| B| N| M| ,| .| /|Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Alt |Gui |FN |Ctrl | + * `-----------------------------------------------------------| + */ + +[ BASE ] = KEYMAP_ISO_SPLITRSHIFT( + 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, XXXXX, \ + LT(CAPS, 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_NUHS, KC_ENT, \ + 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, XXXXX, \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT, MO(CAPS), TG(NUMPAD), TG(MOUSE)), + +[ MOUSE ] = KEYMAP( // Mouse controls + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXX,\ + _______, _______, _______, _______, _______, _______, _______, KC_MS_BTN1, KC_MS_U, KC_MS_BTN2, _______, _______, _______, _______,\ + _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, _______,\ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXX,\ + _______, _______, _______, _______, _______, _______, _______, _______), + +[ NUMPAD ] = KEYMAP( //Numpad and alt shortcuts + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXX,\ + _______, BL_TOGG, BL_DEC, BL_INC, _______, _______, _______, KC_1, KC_2, KC_3, _______, _______, _______, _______,\ + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, _______, _______, KC_4, KC_5, KC_6, _______, _______, _______, _______,\ + _______, _______, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_7, KC_8, KC_9, KC_0, _______, _______, XXXXX,\ + _______, _______, _______, _______, _______, _______, _______, _______), + +[ CAPS ] = KEYMAP( // Main "function" key, arrows, media control + KC_GRAVE, 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, XXXXX,\ + _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, _______, PGDN, KC_UP, PGUP, PSCR, SLCK, PAUS, _______,\ + _______, KC__VOLDOWN, KC__MUTE, KC__VOLUP, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______,\ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXX,\ + _______, _______, _______, _______, _______, _______, _______, _______) + +}; diff --git a/keyboards/satan/keymaps/olligranlund_iso/readme.md b/keyboards/satan/keymaps/olligranlund_iso/readme.md new file mode 100644 index 000000000000..e0801ef8584d --- /dev/null +++ b/keyboards/satan/keymaps/olligranlund_iso/readme.md @@ -0,0 +1,18 @@ +# ISO layout for the Satan GH60 +### Originally by Ben James, forked by Oliver Granlund + +![Finished product](https://i.imgur.com/s5HAgr6.jpg) + +I've wanted to make this as close to a P0ker as possible, but some macros in +the P0ker don't make sense... + +Some of the features: +* Caps activates special features when held: + * Arrow keys directly under right hand + * Volume control + * Fn keys on number row + * PageUp/PageDn/Home/other general buttons +* Mouse control +* Numpad (works so much better if this would be ortho) +### RGB-strip +![Behind the scenes](https://i.imgur.com/reHLXrc.jpg) diff --git a/keyboards/satan/keymaps/olligranlund_iso/rules.mk b/keyboards/satan/keymaps/olligranlund_iso/rules.mk new file mode 100644 index 000000000000..c96deccaa998 --- /dev/null +++ b/keyboards/satan/keymaps/olligranlund_iso/rules.mk @@ -0,0 +1,17 @@ +# 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 = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # 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 = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend From a398d2cece1ee69006cf26e9a86fbf38e1acb0d1 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sun, 30 Sep 2018 22:06:29 -0700 Subject: [PATCH 095/505] Keymap: Add noroadsleft keymap for KC60 (#3876) * Add personal KC60 keymap * Update personal KC60 keymap * Keymap update 2018-05-30 01:53 UTC-7 * Added macro: T_PEEKR * Added macro for MacOS Select All; modified MacOS function layer * Added git branch-name macro * Added GitHub signature macro * Added readme files * Added Quake 2 and System layers * Refactored keymap readme * Refactored to add userspace files; added Colemak layer * Minor code cleanup; updated readme files * Reverted use of userspace Decided not to make use of the Userspace feature at this time. Reverted its addition, and updated the readme files where needed (they were linking to userspace files). * Updated per review comments by @drashna * Refactor buggy macros I'm still not sure these work properly * Fix Windows shortcuts * Fix Mac shortcuts, possibly Untested; still may be broken. * Remove PREVENT_STUCK_MODIFIERS from config.h Deprecated by #3107 --- keyboards/kc60/keymaps/noroadsleft/config.h | 8 + keyboards/kc60/keymaps/noroadsleft/keymap.c | 393 ++++++++++++++++++ keyboards/kc60/keymaps/noroadsleft/readme.md | 29 ++ .../kc60/keymaps/noroadsleft/readme_ch1.md | 70 ++++ .../kc60/keymaps/noroadsleft/readme_ch2.md | 26 ++ .../kc60/keymaps/noroadsleft/readme_ch3.md | 39 ++ .../kc60/keymaps/noroadsleft/readme_ch4.md | 54 +++ .../kc60/keymaps/noroadsleft/readme_ch5.md | 84 ++++ .../kc60/keymaps/noroadsleft/readme_git.md | 56 +++ keyboards/kc60/keymaps/noroadsleft/rules.mk | 2 + 10 files changed, 761 insertions(+) create mode 100644 keyboards/kc60/keymaps/noroadsleft/config.h create mode 100644 keyboards/kc60/keymaps/noroadsleft/keymap.c create mode 100644 keyboards/kc60/keymaps/noroadsleft/readme.md create mode 100644 keyboards/kc60/keymaps/noroadsleft/readme_ch1.md create mode 100644 keyboards/kc60/keymaps/noroadsleft/readme_ch2.md create mode 100644 keyboards/kc60/keymaps/noroadsleft/readme_ch3.md create mode 100644 keyboards/kc60/keymaps/noroadsleft/readme_ch4.md create mode 100644 keyboards/kc60/keymaps/noroadsleft/readme_ch5.md create mode 100644 keyboards/kc60/keymaps/noroadsleft/readme_git.md create mode 100644 keyboards/kc60/keymaps/noroadsleft/rules.mk diff --git a/keyboards/kc60/keymaps/noroadsleft/config.h b/keyboards/kc60/keymaps/noroadsleft/config.h new file mode 100644 index 000000000000..e216d050b161 --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/config.h @@ -0,0 +1,8 @@ +#pragma once + +#define PERMISSIVE_HOLD // https://docs.qmk.fm/#/feature_advanced_keycodes?id=permissive-hold + +// Enable single-color backlighting +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 5 +#define BREATHING_PERIOD 4 diff --git a/keyboards/kc60/keymaps/noroadsleft/keymap.c b/keyboards/kc60/keymaps/noroadsleft/keymap.c new file mode 100644 index 000000000000..f28f2144f0c6 --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/keymap.c @@ -0,0 +1,393 @@ +#include QMK_KEYBOARD_H +#include +//#include +#include + + +/********************** +** LAYER DEFINITIONS ** +**********************/ +enum layers_keymap { + // BASE LAYERS + _QWERTY = 0, + _DVORAK, + _COLEMAK, + _MAC, + _QUAKE2, + _QUAKE2_DVORAK, + _QUAKE2_CONSOLE, + + // FUNCTION LAYERS + _FUNCWIN, + _FUNCMAC, + _FUNCQ2, + + // OTHER LAYERS + _NUMPAD, + _MACROS, + _SYSTEM +}; + +// LAYER SHORT CODES +#define _QW _QWERTY +#define _DV _DVORAK +#define _CM _COLEMAK +#define _MC _MAC +#define _Q2 _QUAKE2 +#define _QD _QUAKE2_DVORAK +#define _QC _QUAKE2_CONSOLE +#define _FW _FUNCWIN +#define _FM _FUNCMAC +#define _FQ _FUNCQ2 +#define _NP _NUMPAD +#define _MA _MACROS +#define _SY _SYSTEM + + +// KEYCODE DEFINITIONS +#define NO_CHNG KC_TRNS // Note for me for keys I need to leave as Pass-through + +#define FW_CAPS LT(_FUNCWIN, KC_CAPS) // _FUNCWIN when held, Caps Lock when tapped +#define FM_CAPS LT(_FUNCMAC, KC_CAPS) // _FUNCMAC when held, Caps Lock when tapped +#define Q2_CAPS LT(_FUNCQ2, KC_CAPS) // _FUNCQ2 when held, Caps Lock when tapped + +#define WN_SALL LCTL(DV_A) // Windows/Linux Select All +#define WN_UNDO LCTL(DV_Z) // Windows/Linux Undo +#define WN_CUT LCTL(DV_X) // Windows/Linux Cut +#define WN_COPY LCTL(DV_C) // Windows/Linux Copy +#define WN_PSTE LCTL(DV_V) // Windows/Linux Paste + +#define MC_PSCR LGUI(LSFT(KC_3)) // MacOS Print Screen (Command + Shift + 3) +#define MC_HOME LGUI(KC_LEFT) // MacOS Home (Command + Left Arrow) +#define MC_END LGUI(KC_RGHT) // MacOS End (Command + Right Arrow) +#define MC_SALL LGUI(KC_A) // MacOS Select All +//#define MC_UNDO LGUI(KC_Z) // MacOS Undo // replaced by macro +#define MC_CUT LGUI(KC_X) // MacOS Cut +#define MC_COPY LGUI(KC_C) // MacOS Copy +//#define MC_PSTE LGUI(KC_V) // MacOS Paste // replaced by macro + + +// MACRO DEFINITIONS +enum custom_keycodes { + F_CAPS = SAFE_RANGE, + T_L3DED, + G_PUSH, + G_FTCH, + G_COMM, + G_RST, + G_C10R, + G_BRCH, + SIGNA, + GO_Q2, + Q2_ON, + Q2_OFF, + Q2_ESC, + Q2_GRV, + MC_UNDO, + MC_PSTE +}; + + +// define modifiers +#define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) +#define MODS_CTRL_MASK (MOD_BIT(KC_LCTL)|MOD_BIT(KC_RCTRL)) +#define MODS_ALT_MASK (MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) +#define MODS_GUI_MASK (MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)) + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + uint8_t modifiers = get_mods(); + switch(keycode) { + // these are our macros! + case F_CAPS: + /* + Objective: write a macro that checks the current layers that are + enabled, and activates the appropriate function layer. + */ + if ( biton32(layer_state) == _MAC ) { + if (record->event.pressed) { + layer_on(_FUNCMAC); + } else { + layer_off(_FUNCMAC); + } + } else { + if (record->event.pressed) { + layer_on(_FUNCWIN); + } else { + layer_off(_FUNCWIN); + } + }; + return false; + break; + case T_L3DED: + if (record->event.pressed) { + SEND_STRING("lavak3DED "); + }; + return false; + break; + case G_PUSH: + if (record->event.pressed) { + SEND_STRING("git push origin "); + }; + return false; + break; + case G_FTCH: + if (record->event.pressed) { + SEND_STRING("git fetch upstream"); + }; + return false; + break; + case G_COMM: + if (record->event.pressed) { + SEND_STRING("git commit -m \"\"" SS_TAP(X_LEFT)); + layer_off(_MACROS); + }; + return false; + break; + case G_RST: + if (record->event.pressed) { + SEND_STRING("git histt -n 10" SS_TAP(X_ENTER) "git reset --soft "); + layer_off(_MACROS); + }; + return false; + break; + case G_C10R: + if (record->event.pressed) { + SEND_STRING("cf/"); + layer_off(_MACROS); + }; + return false; + break; + case G_BRCH: + if (record->event.pressed) { + SEND_STRING("$(git branch-name)"); + layer_off(_MACROS); + }; + return false; + break; + case SIGNA: + if (record->event.pressed) { + SEND_STRING("\\- @noroadsleft" SS_TAP(X_ENTER)); + layer_off(_MACROS); + }; + return false; + break; + case GO_Q2: + if (record->event.pressed) { + //default_layer_set(_QWERTY); + layer_move(_QWERTY); // TO(_QWERTY); + layer_on(_QUAKE2); + //layer_off(_SYSTEM); + }; + return false; + break; + case Q2_ON: + if (record->event.pressed) { + SEND_STRING(SS_TAP(X_ENTER)); + layer_on(_DVORAK); + layer_on(_QUAKE2_DVORAK); + }; + return false; + break; + case Q2_OFF: + if (record->event.pressed) { + SEND_STRING(SS_TAP(X_ENTER)); + layer_move(_QWERTY); // TO(_QWERTY); + layer_on(_QUAKE2); + }; + return false; + break; + case Q2_ESC: + if (record->event.pressed) { + SEND_STRING(SS_TAP(X_ESCAPE)); + layer_move(_QWERTY); // TO(_QWERTY); + layer_on(_QUAKE2); + }; + return false; + break; + case Q2_GRV: + if (record->event.pressed) { + SEND_STRING(SS_TAP(X_GRAVE)); + layer_on(_DVORAK); + layer_on(_QUAKE2_DVORAK); + layer_on(_QUAKE2_CONSOLE); + }; + return false; + break; + case MC_UNDO: + if (record->event.pressed) { + if ( modifiers & MODS_SHIFT_MASK ) { + SEND_STRING( SS_DOWN(X_LSHIFT) SS_DOWN(X_LGUI) SS_TAP(X_Z) SS_UP(X_LGUI) SS_UP(X_LSHIFT) ); + } else { + SEND_STRING( SS_DOWN(X_LGUI) SS_TAP(X_Z) SS_UP(X_LGUI) ); + } + }; + return false; + break; + case MC_PSTE: + if (record->event.pressed) { + if ( modifiers & MODS_SHIFT_MASK ) { + SEND_STRING( SS_DOWN(X_LSHIFT) SS_DOWN(X_LGUI) SS_DOWN(X_LALT) SS_TAP(X_V) SS_UP(X_LALT) SS_UP(X_LGUI) SS_UP(X_LSHIFT) ); + } else { + SEND_STRING( SS_DOWN(X_LGUI) SS_TAP(X_V) SS_UP(X_LGUI) ); + } + }; + return false; + break; + } // switch() + return true; +}; + + +// KEYMAPS +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /**************** + ** BASE LAYERS ** + ****************/ + + /* QWERTY */ + [_QWERTY] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + KC_GESC, 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, \ + FW_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, MO(_FW), KC_RCTL \ + ), + + /* Dvorak */ + [_DVORAK] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + KC_GESC, 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_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, \ + FW_CAPS, 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, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FW), KC_RCTL \ + ), + + /* Colemak */ + [_COLEMAK] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + KC_GESC, 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_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, \ + FW_CAPS, 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, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FW), KC_RCTL \ + ), + + /**************** + ** OS OVERLAYS ** + ****************/ + + /* Mac */ + [_MAC] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + FM_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, MO(_FM), _______ \ + ), + + /********************* + ** QUAKE 2 OVERLAYS ** + *********************/ + + /* Quake 2 */ + [_QUAKE2] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + Q2_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, Q2_ON, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, MO(_FQ), _______ \ + ), + + [_QUAKE2_DVORAK] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + Q2_ESC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + Q2_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, Q2_OFF, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, MO(_FQ), _______ \ + ), + + [_QUAKE2_CONSOLE] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + Q2_ESC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + Q2_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_ENT, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, MO(_FQ), _______ \ + ), + + /******************** + ** FUNCTION LAYERS ** + ********************/ + + /* Windows Fn layer */ + [_FUNCWIN] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + 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_CALC, KC_APP, _______, _______, _______, KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_PSCR, KC_SLCK, KC_PAUS, \ + NO_CHNG, WN_SALL, _______, _______, _______, _______, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, KC_PENT, \ + _______, WN_UNDO, WN_CUT, WN_COPY, WN_PSTE, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, TG(_SY), _______, \ + _______, _______, _______, TG(_NP), _______, TG(_MA), NO_CHNG, _______ \ + ), + + /* MacOS Fn layer */ + [_FUNCMAC] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + 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_INS, MC_HOME, KC_UP, MC_END, KC_PGUP, MC_PSCR, _______, _______, \ + NO_CHNG, MC_SALL, _______, _______, _______, _______, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, _______, \ + _______, MC_UNDO, MC_CUT, MC_COPY, MC_PSTE, _______, _______, _______, _______, _______, TG(_SY), _______, \ + _______, _______, _______, TG(_NP), _______, _______, NO_CHNG, _______ \ + ), + + /* Quake 2 Fn layer */ + [_FUNCQ2] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + Q2_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_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_PSCR, KC_SLCK, KC_PAUS, \ + NO_CHNG, _______, _______, _______, _______, _______, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, KC_ENT, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, TG(_SY), _______, \ + _______, _______, _______, _______, _______, _______, NO_CHNG, _______ \ + ), + + /***************** + ** OTHER LAYERS ** + *****************/ + + /* Numpad layer */ + [_NUMPAD] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + _______, _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, _______, _______, \ + _______, _______, _______, _______, KC_E, KC_F, _______, KC_P4, KC_P5, KC_P6, KC_PAST, KC_PSLS, KC_PEQL, _______, \ + _______, _______, _______, _______, KC_C, KC_D, _______, KC_P1, KC_P2, KC_P3, KC_PPLS, KC_PMNS, KC_PENT, \ + _______, _______, _______, _______, KC_A, KC_B, _______, KC_P0, _______, KC_PDOT, _______, _______, \ + _______, _______, _______, TG(_NP), _______, _______, NO_CHNG, _______ \ + ), + + /* Macro layer */ + [_MACROS] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + TG(_MA), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, G_PUSH, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, G_RST, G_FTCH, G_COMM, _______, _______, _______, _______, T_L3DED, _______, _______, _______, \ + _______, _______, _______, G_C10R, _______, G_BRCH, SIGNA, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, NO_CHNG, _______ \ + ), + + /* System layer */ + [_SYSTEM] = LAYOUT_60_ansi( + // 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 + TG(_SY), TO(_QW), TO(_DV), TO(_CM), GO_Q2, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, DEBUG, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, TG(_MC), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, BL_DEC, BL_TOGG, BL_INC, BL_BRTG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NO_CHNG, XXXXXXX \ + ), + +}; diff --git a/keyboards/kc60/keymaps/noroadsleft/readme.md b/keyboards/kc60/keymaps/noroadsleft/readme.md new file mode 100644 index 000000000000..737fdc06bbed --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/readme.md @@ -0,0 +1,29 @@ +# @noroadsleft's KC60 keymap + +### Last updated: September 2, 2018, 1:03 PM UTC-0700 + +![](https://i.imgur.com/tzhXQYI.jpg) + +I am a full-time Dvorak typist, and occasional semi-serious FPS gamer. The layers are oriented towards a mix of typing and gaming. + + +---- + +# Outline + +- [Base Layers](./readme_ch1.md) + - Layer 0: QWERTY `_QW` + - Layer 1: Hardware Dvorak `_DV` + - Layer 2: Hardware Colemak `_CM` +- [OS Overlays](./readme_ch2.md) + - Layer 3: MacOS Overlay `_MC` +- [Quake 2 Overlays](./readme_ch3.md) + - Layers 4, 5 and 6: Quake 2 `_Q2`, Quake 2 Dvorak `_QD`, and Quake 2 Console `_QC` +- [Function Layers](./readme_ch4.md) + - Layer 7: Windows Fn layer `_FW` + - Layer 8: MacOS-oriented Fn layer `_FM` + - Layer 9: Quake 2 Fn layer `_FQ` +- [Other Layers](./readme_ch5.md) + - Layer 10: Numpad layer `_NP` + - Layer 11: Macro layer `_MA` + - Layer 12: System layer `_SY` diff --git a/keyboards/kc60/keymaps/noroadsleft/readme_ch1.md b/keyboards/kc60/keymaps/noroadsleft/readme_ch1.md new file mode 100644 index 000000000000..bee0709f4880 --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/readme_ch1.md @@ -0,0 +1,70 @@ +# @noroadsleft's KC60 keymap + +- [Table of Contents](./readme.md) + 1. **Base Layers** + 2. [**OS Overlays**](./readme_ch2.md) + 3. [Quake 2 Overlays](./readme_ch3.md) + 4. [Function Layers](./readme_ch4.md) + 5. [Other Layers](./readme_ch5.md) + +### Last updated: September 2, 2018, 1:03 PM UTC-0700 + + +---- + +## Layer 0: QWERTY - `_QW` + +Standard QWERTY layout, with three QMK features: + +- The `Menu` key has been replaced by `MO(_FW)`, which moves to my Windows Fn layer when held. +- The `Caps Lock` key has been replaced with a dual function `LT()` key, which opens the Windows Fn layer when held, and is `Caps Lock` when tapped +- The `Escape` key has been replaced with a `KC_GESC` `` ` ~ `` key when used with a `Fn` key or a `Shift` key + +###### For the rest of this readme, the physical location of keys will be referred to by their function in a US QWERTY layout. + +![QWERTY layer](https://i.imgur.com/2eVsefw.png) + +Keycode(s) Sent | Notes +:---------------------------------------------------- | :---- +[`KC_GESC`](https://docs.qmk.fm/#/feature_grave_esc) | `Esc` when tapped alone, `` ` ~ `` when used with a `Shift` or `GUI` key. +`LT(_FW, KC_CAPS)` | Opens the Windows Fn layer when held; toggles Caps Lock when tapped. +`MO(_FW)` | Opens the Windows Fn layer when held. + + +---- + +## Layer 1: Hardware Dvorak - `_DV` + +### Accessed by holding either `Fn` and tapping `/?` key, then tapping `2@`. + +A hardware-based Dvorak Simplified layout. At my weekend job, I use a shared computer that runs MacOS Sierra, in US QWERTY layout. In this layer, I can leave the system in QWERTY, plug my keyboard in, and still type in Dvorak. + +![Hardware Dvorak layer](https://i.imgur.com/a6hYedB.png) + +Keycode(s) Sent | Notes +:---------------------------------------------------- | :---- +[`KC_GESC`](https://docs.qmk.fm/#/feature_grave_esc) | `Esc` when tapped alone, `` ` ~ `` when used with a `Shift` or `GUI` key. +`LT(_FW, KC_CAPS)` | Opens the Windows Fn layer when held; toggles Caps Lock when tapped. +`MO(_FW)` | Opens the Windows Fn layer when held. + + +---- + +## Layer 2: Hardware Colemak `_CM` + +### Accessed by holding either `Fn` and tapping `/?` key, then tapping `3#`. + +A hardware-based Colemak layout. Been thinking of trying it, so it's here. + +![Hardware Colemak layer](https://i.imgur.com/dbQ6HDW.png) + +Keycode(s) Sent | Notes +:---------------------------------------------------- | :---- +[`KC_GESC`](https://docs.qmk.fm/#/feature_grave_esc) | `Esc` when tapped alone, `` ` ~ `` when used with a `Shift` or `GUI` key. +`LT(_FW, KC_CAPS)` | Opens the Windows Fn layer when held; toggles Caps Lock when tapped. +`MO(_FW)` | Opens the Windows Fn layer when held. + + +---- + +Next Chapter: [OS Overlays](./readme_ch2.md) diff --git a/keyboards/kc60/keymaps/noroadsleft/readme_ch2.md b/keyboards/kc60/keymaps/noroadsleft/readme_ch2.md new file mode 100644 index 000000000000..75a4fc524496 --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/readme_ch2.md @@ -0,0 +1,26 @@ +# @noroadsleft's KC60 keymap + +- [Table of Contents](./readme.md) + 1. [Base Layers](./readme_ch1.md) + 2. **OS Overlays** + 3. [Quake 2 Overlays](./readme_ch3.md) + 4. [Function Layers](./readme_ch4.md) + 5. [Other Layers](./readme_ch5.md) + +### Last updated: September 2, 2018, 1:03 PM UTC-0700 + + +---- + +## Layer 3: Layer 3: MacOS Overlay `_MC` + +### Toggled by holding either `Fn` and tapping `/?` key, then tapping `W`. + +This layer overrides the `Fn` keys on whichever base layer is currently enabled, sending the keyboard to the MacOS-oriented Fn layer `_FM`, instead of the Windows Fn layer `_FW`. + +![MacOS Overlay](https://i.imgur.com/lxsEVpm.png) + + +---- + +Next Chapter: [Quake 2 Overlays](./readme_ch3.md) diff --git a/keyboards/kc60/keymaps/noroadsleft/readme_ch3.md b/keyboards/kc60/keymaps/noroadsleft/readme_ch3.md new file mode 100644 index 000000000000..80549ba5ce69 --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/readme_ch3.md @@ -0,0 +1,39 @@ +# @noroadsleft's KC60 keymap + +- [Table of Contents](./readme.md) + 1. [Base Layers](./readme_ch1.md) + 2. [OS Overlays](./readme_ch2.md) + 3. **Quake 2 Overlays** + 4. [Function Layers](./readme_ch4.md) + 5. [Other Layers](./readme_ch5.md) + +### Last updated: September 2, 2018, 1:03 PM UTC-0700 + + +---- + +## Layers 4, 5 and 6: Quake 2 `_Q2`, Quake 2 Dvorak `_QD`, and Quake 2 Console `_QC` + +### Accessed by holding either `Fn` key and tapping the `/?` key, then tapping `4$` + +These layers were born out of the confusion I have had trying to use the in-game chat and the console in [Quake 2](https://en.wikipedia.org/wiki/Quake_II). When Quake 2 came out, alternate keyboard layouts weren't really a thing. As a result, all in-game text input is hard-locked to US QWERTY, regardless of what the operating system is using for its input method. + +I'm attempting to solve this by some creative use of QMK's macro feature. The keycode in the System layer that enables these layers, [`GO_Q2`](./keymap.c#L386), is a [macro](./keymap.c#L175-183) that sets the default layer to the QWERTY layer, then turns the Quake 2 layer `_Q2` on. The result is a partially-overwritten QWERTY layer, that has some keycodes with some creative layer switching. + +When I hit the `Enter` key (bound in-game to text chat), the [macro keycode](./keymap.c#L184-L191) I've created sends the keycode for `Enter`, then follows with enabling the Hardware Dvorak layer and its corresponding overlay. Now the game is in text chat mode, and my keyboard is in Dvorak. When I hit `Enter` again, another `Enter` [keycode macro](./keymap.c#L192-L199) is sent, which sends the message, then the macro brings me back to the standard QWERTY+Quake 2 setup. Hitting `Escape` instead runs a [macro](./keymap.c#L200-L207) that cancels the sending of the message, and undoes the layers. + +I have been testing this configuration for a few months. Sometimes I end up still in Dvorak mode without any text input systems (in-game chat or the console) running, but it pretty much always happens when I'm focused on the game, so I don't know the cause yet. + +### Layer 4: Quake 2 +![Quake 2](https://i.imgur.com/WEZ9p2u.png) + +### Layer 5: Quake 2 Dvorak +![Quake 2 Dvorak](https://i.imgur.com/rhugHN4.png) + +### Layer 6: Quake 2 Console +![Quake 2 Console](https://i.imgur.com/dRTAjcy.png) + + +---- + +Next Chapter: [Function Layers](./readme_ch4.md) diff --git a/keyboards/kc60/keymaps/noroadsleft/readme_ch4.md b/keyboards/kc60/keymaps/noroadsleft/readme_ch4.md new file mode 100644 index 000000000000..f1b50846d9a1 --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/readme_ch4.md @@ -0,0 +1,54 @@ +# @noroadsleft's KC60 keymap + +- [Table of Contents](./readme.md) + 1. [Base Layers](./readme_ch1.md) + 2. [OS Overlays](./readme_ch2.md) + 3. [Quake 2 Overlays](./readme_ch3.md) + 4. **Function Layers** + 5. [Other Layers](./readme_ch5.md) + +### Last updated: September 2, 2018, 1:03 PM UTC-0700 + + +---- + +## Layer 7: Windows Fn layer - `_FW` + +### Accessed by holding either `Fn` key in Layer 0 + +Arrows, Navigation keys (Insert, Home, Page Up, etc.), and Function keys are here. Also has keys for Calculator, Menu, Volume Control, and shortcuts for Select All, Undo, Cut, Copy, and Paste. Numpad Enter for when I'm working in Adobe Photoshop, because it treats Numpad Enter differently from the regular Enter key. + +![Windows Fn layer](https://i.imgur.com/XwCshcz.png) + + +---- + +## Layer 8: MacOS-oriented Fn layer - `_FM` + +### Accessed by holding either `Fn` key in Layer 1 + +Based on my Windows Fn layer, but swaps a few functions for a MacOS environment. Arrow, Navigation, and Function keys are basically unchanged from Layer 2. This layer enables using either `Fn` key as a sort of simulated `Command` key, which I find easier to reach and use. + +![MacOS-oriented Fn layer](https://i.imgur.com/Z11kRu2.png) + + +---- + +## Layer 9: Quake 2 Fn layer - `_FQ` + +### Accessed by holding either `Fn` key while either Quake 2 overlay is active. + +Based on the Windows function layer, but removes some functions that are pointless to have while in the game. + +![Quake 2 Fn layer](https://i.imgur.com/9PG7yWb.png) + +Keycode(s) Sent | Notes +:-------------------------------- | :---- +[`Q2_GRV`](./keymap.c#L208-L216) | Sends `KC_GRV`, then enables the Dvorak, Quake 2 Dvorak, and Quake 2 Console layers. + + + + +---- + +Next Chapter: [Other Layers](./readme_ch5.md) diff --git a/keyboards/kc60/keymaps/noroadsleft/readme_ch5.md b/keyboards/kc60/keymaps/noroadsleft/readme_ch5.md new file mode 100644 index 000000000000..64102eb88d2a --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/readme_ch5.md @@ -0,0 +1,84 @@ +# @noroadsleft's KC60 keymap + +- [Table of Contents](./readme.md) + 1. [Base Layers](./readme_ch1.md) + 2. [OS Overlays](./readme_ch2.md) + 3. [Quake 2 Overlays](./readme_ch3.md) + 4. [Function Layers](./readme_ch4.md) + 5. **Other Layers** + +### Last updated: September 2, 2018, 1:03 PM UTC-0700 + + +---- + +## Layer 10: Numpad layer - `_NP` + +### Accessed by holding either `Fn` key and tapping `Space`, from any of the Base Layers + +Puts a Numpad on the right-hand side of the keyboard. A through F included for hexadecimal input. Tapping `Space` returns to the previous Base Layer. + +![Numpad layer](https://i.imgur.com/fKVRkGH.png) + + +---- + +## Layer 11: Macro layer - `_MA` + +### Accessed by holding the `Fn` key and tapping the right-side `Win` key + +Has some macros that I use in Git, and some frequently-typed strings. + +Tapping `Esc` exits the Macro layer, if the macro used doesn't do it automatically. + +![Macro layer](https://i.imgur.com/wgbsluI.png) + + +### Macros + +[![lavak3DED](https://static-cdn.jtvnw.net/emoticons/v1/821796/1.0)](./keymap.c#L122-L127) +Inputs: `lavak3DED ` +Twitch emote for [a streamer I watch a lot](https://www.twitch.tv/lavak3_). + +[G_PUSH](./keymap.c#L128-L133) +Inputs: `git push origin ` +Everything from here down is related to Git or GitHub. + +[G_FTCH](./keymap.c#L134-L139) +Inputs: `git fetch upstream` + +[G_COMM](./keymap.c#L140-L146) +Inputs: `git commit -m ""` `[Left]` +Readies a `git commit` command, moves the cursor between the quotation marks, then disables the Macro layer. + +[G_RST](./keymap.c#L147-L153) +Inputs: `git histt -n 10`, Enter, `git reset --soft ` +Runs a [git alias](./readme_git.md) that shows my last ten commits, then readies a `git reset --soft`. For when I commit something too soon. Disables the Macro layer when complete. + +[G_C10R](./keymap.c#L154-L160) +Inputs: `cf/` +A branch prefix I use for my current work in QMK. Disables the Macro layer when finished. + +[G_BRCH](./keymap.c#L161-L167) +Inputs: `$(git branch-name)` +A [git alias](./readme_git.md) that returns the name of the current branch. Disables the Macro layer when finished. + +[SIGNA](./keymap.c#L168-L174) +Inputs: `\- @noroadsleft` `[Enter]` +Sometimes on GitHub, I sign my comments. Types my GitHub name in Markdown syntax, and then taps the `Enter` key. Disables the Macro layer when finished. + + +---- + +### Layer 12: System layer - `_SY` + +#### Accessed by holding either `Fn` key and tapping the `/?` key + +This is where I change my keyboard function. Base layer select on `1` through `3`, Backlight controls on `C` through `N`, Reset on `8*`, Debug on `0)`. + +![System layer](https://i.imgur.com/95ovTBn.png) + + +---- + +[Back to the index.](./) diff --git a/keyboards/kc60/keymaps/noroadsleft/readme_git.md b/keyboards/kc60/keymaps/noroadsleft/readme_git.md new file mode 100644 index 000000000000..585d9c8909c8 --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/readme_git.md @@ -0,0 +1,56 @@ +# @noroadsleft's Git aliases + +[Return to the directory index.](./) + +``` +[alias] + # change branches + co = checkout + cob = checkout -b + + # sync master + sync = "!f() { if [ $(git branch-name) != "master" ]; then git checkout master; fi; git pull upstream master; git push origin master; }; f" + + # Return the last five commits on the branch, in a more compact format + hist = log --pretty=format:\"%C(yellow)%h%Creset %Cgreen%ad%Creset%n %w(100,0,3)%s%d [%an]%n\" --graph --date=iso-local -n 5 + histm = log --pretty=format:\"%C(yellow)%h%Creset %w(100,0,3)%s%d [%an]\" --graph --date=iso-local -n 5 + histt = log --pretty=format:\"%C(yellow)%h%Creset %<(88,trunc)%s [%an]\" --graph --date=iso-local -n 5 + histb = log --reverse --pretty=format:\"- %<(98,trunc)%s [%an]\" --date=iso-local -n 5 + + # compact diff + df = "diff --compact-summary" + + # Short-form status + st = "!git status --short" + + # Returns the name of the current branch + branch-name = "!git rev-parse --abbrev-ref HEAD" + + # short-form of the above + bn = "!git branch-name" + + po = "push origin ($(git branch-name))" + + # List the stashes + sl = "stash list" + + # Show the contents of a numbered stash + # Syntax: + # git st-show + st-show = "!f() { git stash show stash@{$1} -p; }; f" + + # Apply a stash, without deleting it from the list of stashes + # Syntax: + # git st-copy + st-copy = "!f() { git stash apply stash@{$1}; }; f" + + # Unstage a file + unstage = "reset HEAD" + + # Restore a file to the state it was in when checked out + restore = "checkout --" + + # Compare local master repo to its upstream branch. If anything is returned, local branch has diverged from upstream. + cm = "!f() { git fetch upstream master; git diff $(git branch-name) upstream/master --compact-summary; }; f" + cml = "!f() { git fetch upstream master; git diff $(git branch-name) upstream/master; }; f" +``` diff --git a/keyboards/kc60/keymaps/noroadsleft/rules.mk b/keyboards/kc60/keymaps/noroadsleft/rules.mk new file mode 100644 index 000000000000..9d78fc0fb32d --- /dev/null +++ b/keyboards/kc60/keymaps/noroadsleft/rules.mk @@ -0,0 +1,2 @@ +# https://github.com/qmk/qmk_firmware/issues/3448#issuecomment-406636125 +EXTRAFLAGS += -flto From 9d949389f92b6b397ed62246b60ead86d80a57a1 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 1 Oct 2018 08:09:05 -0700 Subject: [PATCH 096/505] Adds default value for TAPPING_TERM if Tap Dance is enabled (#2785) * Force require TAPPING_TERM if Tap Dance is enabled * Handle lack of TAPPING_TERM more gracefully --- quantum/process_keycode/process_tap_dance.c | 4 ++++ quantum/quantum.h | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/quantum/process_keycode/process_tap_dance.c b/quantum/process_keycode/process_tap_dance.c index 83378069122e..b55ace5ba837 100644 --- a/quantum/process_keycode/process_tap_dance.c +++ b/quantum/process_keycode/process_tap_dance.c @@ -16,6 +16,10 @@ #include "quantum.h" #include "action_tapping.h" +#ifndef TAPPING_TERM +#define TAPPING_TERM 200 +#endif + #ifndef NO_ACTION_ONESHOT uint8_t get_oneshot_mods(void); #endif diff --git a/quantum/quantum.h b/quantum/quantum.h index 6833332117b8..87a61356c7dc 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -31,7 +31,7 @@ #include "backlight.h" #endif #if !defined(RGBLIGHT_ENABLE) && !defined(RGB_MATRIX_ENABLE) - #include "rgb.h" + #include "rgb.h" #endif #ifdef RGBLIGHT_ENABLE #include "rgblight.h" @@ -108,7 +108,9 @@ extern uint32_t default_layer_state; #include "process_unicodemap.h" #endif -#include "process_tap_dance.h" +#ifdef TAP_DANCE_ENABLE + #include "process_tap_dance.h" +#endif #ifdef PRINTING_ENABLE #include "process_printer.h" From 3907ed034bec6730d8bff401ac632161540ea3cb Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 1 Oct 2018 08:09:57 -0700 Subject: [PATCH 097/505] Fix YMDK NP21 keyboard to use proper keyboard level functions (#3042) * Use proper function levels * Add matrix init functions * Convert KEYMAP to LAYOUT Or @mechmerlin is going to hunt me down and harm me... probably :) * Fix conflict issues --- keyboards/ymdk_np21/keymaps/default/keymap.c | 7 +++---- keyboards/ymdk_np21/matrix.c | 11 +++++++++++ keyboards/ymdk_np21/ymdk_np21.c | 6 ++++-- keyboards/ymdk_np21/ymdk_np21.h | 4 +--- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/keyboards/ymdk_np21/keymaps/default/keymap.c b/keyboards/ymdk_np21/keymaps/default/keymap.c index e79d326b7c94..3ade30479fad 100644 --- a/keyboards/ymdk_np21/keymaps/default/keymap.c +++ b/keyboards/ymdk_np21/keymaps/default/keymap.c @@ -1,5 +1,4 @@ -#include "ymdk_np21.h" -#include "action_layer.h" +#include QMK_KEYBOARD_H #define _NP 0 #define _BL 1 @@ -21,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Enter| Enter| + | + | - | FN | * `-----------------------------------------' */ -[_NP] = KEYMAP( \ +[_NP] = LAYOUT( \ KC_KP_0, KC_KP_1, KC_KP_4, KC_KP_7, KC_NUMLOCK, KC_ESC, \ KC_DOT, KC_KP_2, KC_KP_5, KC_KP_8, KC_KP_SLASH, KC_TAB, \ KC_KP_DOT, KC_KP_3, KC_KP_6, KC_KP_9, KC_KP_ASTERISK, KC_BSPACE, \ @@ -38,7 +37,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | BL_DEC | BL_DEC | BL_INC | BL_INC | | | * `---------------------------------------------' */ -[_BL] = KEYMAP( \ +[_BL] = LAYOUT( \ BL_BRTG, _______, _______, _______, _______, _______, \ _______, BL_OFF, BL_TOGG, BL_ON, _______, _______, \ _______, _______, _______, _______, _______, _______, \ diff --git a/keyboards/ymdk_np21/matrix.c b/keyboards/ymdk_np21/matrix.c index a9e9cb53970c..b2bfb2f0bb2e 100644 --- a/keyboards/ymdk_np21/matrix.c +++ b/keyboards/ymdk_np21/matrix.c @@ -91,12 +91,23 @@ uint8_t matrix_scan(void) { return 1; } +__attribute__ ((weak)) +void matrix_scan_user(void) {}; + +__attribute__ ((weak)) void matrix_scan_kb(void) { // Looping keyboard code goes here // This runs every cycle (a lot) matrix_scan_user(); }; +__attribute__ ((weak)) +void matrix_init_user(void) {}; + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} // declarations void matrix_set_row_status(uint8_t row) { DDRB = (1 << row); diff --git a/keyboards/ymdk_np21/ymdk_np21.c b/keyboards/ymdk_np21/ymdk_np21.c index 670083a11618..c1b11b4046f2 100644 --- a/keyboards/ymdk_np21/ymdk_np21.c +++ b/keyboards/ymdk_np21/ymdk_np21.c @@ -34,7 +34,7 @@ extern rgblight_config_t rgblight_config; // @Override void matrix_init_kb(void) { // call user level keymaps, if any - // matrix_init_user(); + matrix_init_user(); } #ifdef BACKLIGHT_ENABLE @@ -67,7 +67,7 @@ void rgblight_set(void) { } bool rgb_init = false; -void matrix_scan_user(void) { +void matrix_scan_kb(void) { // if LEDs were previously on before poweroff, turn them back on if (rgb_init == false && rgblight_config.enable) { i2c_init(); @@ -77,4 +77,6 @@ void matrix_scan_user(void) { rgblight_task(); /* Nothing else for now. */ + + matrix_scan_user(); } diff --git a/keyboards/ymdk_np21/ymdk_np21.h b/keyboards/ymdk_np21/ymdk_np21.h index babdc84831c4..728406d6e5e6 100644 --- a/keyboards/ymdk_np21/ymdk_np21.h +++ b/keyboards/ymdk_np21/ymdk_np21.h @@ -25,7 +25,7 @@ along with this program. If not, see . void matrix_init_user(void); // TODO port this to other PS2AVRGB boards -#define KEYMAP_GRID( \ +#define LAYOUT( \ K01, K02, K03, K04, K05, K06, \ K11, K12, K13, K14, K15, K16, \ K21, K22, K23, K24, K25, K26, \ @@ -38,6 +38,4 @@ void matrix_init_user(void); // TODO port this to other PS2AVRGB boards { K36, K35, K34, K33, K32, K31 } \ } -#define KEYMAP KEYMAP_GRID - #endif From 45a4a0a7fc32f521ad6487c19201340b81aaad5c Mon Sep 17 00:00:00 2001 From: Andrew Kannan Date: Mon, 1 Oct 2018 12:25:16 -0400 Subject: [PATCH 098/505] Keyboard: Adding initial luddite keyboard framework (#4029) * Adding initial luddite keyboard framework * Use pragma and update readme * Remove duplicate macro definitions --- keyboards/luddite/README.md | 18 +++++++ keyboards/luddite/config.h | 48 ++++++++++++++++++ keyboards/luddite/keymaps/default/keymap.c | 32 ++++++++++++ keyboards/luddite/luddite.c | 1 + keyboards/luddite/luddite.h | 21 ++++++++ keyboards/luddite/rules.mk | 59 ++++++++++++++++++++++ 6 files changed, 179 insertions(+) create mode 100644 keyboards/luddite/README.md create mode 100644 keyboards/luddite/config.h create mode 100644 keyboards/luddite/keymaps/default/keymap.c create mode 100644 keyboards/luddite/luddite.c create mode 100644 keyboards/luddite/luddite.h create mode 100644 keyboards/luddite/rules.mk diff --git a/keyboards/luddite/README.md b/keyboards/luddite/README.md new file mode 100644 index 000000000000..72666dda5fd2 --- /dev/null +++ b/keyboards/luddite/README.md @@ -0,0 +1,18 @@ +# Luddite + +Luddite 60% keyboard with backlight and RGB underglow. + +* [The original TMK firmware](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/luddite) + +Keyboard Maintainer: QMK Community +Hardware Supported: Luddite PCB +Hardware Availability: [Luddite project on 40% Keyboards](http://www.40percent.club/search/label/luddite) + +Make example for this keyboard (after setting up your build environment): + + make luddite:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +First pass at adding support for the luddite keyboard. Compiles but completely +untested. Intended to kick-start development. diff --git a/keyboards/luddite/config.h b/keyboards/luddite/config.h new file mode 100644 index 000000000000..62ff72bb03d0 --- /dev/null +++ b/keyboards/luddite/config.h @@ -0,0 +1,48 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0A0C +#define DEVICE_VER 0x1001 +#define MANUFACTURER di0ib +#define PRODUCT Luddite +#define DESCRIPTION Luddite Keyboard + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 8 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { D3, D2, D1, D0, D4, C6, D7, E6 } +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, B6 } +#define UNUSED_PINS + +/* number of backlight levels */ +#define BACKLIGHT_PIN B5 +#ifdef BACKLIGHT_PIN +#define BACKLIGHT_LEVELS 4 +#endif + +/* 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 B4 +#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 diff --git a/keyboards/luddite/keymaps/default/keymap.c b/keyboards/luddite/keymaps/default/keymap.c new file mode 100644 index 000000000000..4d6ae0d524ef --- /dev/null +++ b/keyboards/luddite/keymaps/default/keymap.c @@ -0,0 +1,32 @@ +#include QMK_KEYBOARD_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 _BASE 0 +#define _FN1 1 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_60_ansi( + KC_GESC, 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 , MO(_FN1) , KC_RCTL + ), + + [_FN1] = LAYOUT_60_ansi( + KC_GESC, 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_BSPC, \ + RGB_TOG, RGB_MOD, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,\ + BL_INC, BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + KC_GRV, _______, _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/luddite/luddite.c b/keyboards/luddite/luddite.c new file mode 100644 index 000000000000..3e720ad571ca --- /dev/null +++ b/keyboards/luddite/luddite.c @@ -0,0 +1 @@ +#include "luddite.h" diff --git a/keyboards/luddite/luddite.h b/keyboards/luddite/luddite.h new file mode 100644 index 000000000000..1ba743e9e77e --- /dev/null +++ b/keyboards/luddite/luddite.h @@ -0,0 +1,21 @@ +#pragma once + +#include "quantum.h" + +#define LAYOUT_60_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K10, K11, K12, K13, K14, K15, \ + K16, K17, K20, K21, K22, K23, K24, K25, K26, K27, K30, K31, K32, K33, \ + K34, K35, K36, K37, K40, K41, K42, K43, K44, K45, K46, K47, K50, \ + K51, K52, K53, K54, K55, K56, K57, K60, K61, K62, K63, K64, \ + K65, K66, K67, K70, K71, K72, K73, K74\ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07 }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ + { K20, K21, K22, K23, K24, K25, K26, K27 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37 }, \ + { K40, K41, K42, K43, K44, K45, K46, K47 }, \ + { K50, K51, K52, K53, K54, K55, K56, K57 }, \ + { K60, K61, K62, K63, K64, K65, K66, K67 }, \ + { K70, K71, K72, K73, K74 }, \ +} + diff --git a/keyboards/luddite/rules.mk b/keyboards/luddite/rules.mk new file mode 100644 index 000000000000..2f7d847bf06c --- /dev/null +++ b/keyboards/luddite/rules.mk @@ -0,0 +1,59 @@ +# 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) + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = caterina + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = yes + +LAYOUTS = 60_ansi From 285ed08867931e967d2660f6179a57d247191d4c Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Mon, 1 Oct 2018 09:34:20 -0700 Subject: [PATCH 099/505] Keyboard: Rename macropad to treasure/type9 (#4035) * rename macropad keyboard to type9 under the treasure directory * fixup the readme * rename macropad to type9 * moar renames --- keyboards/macropad/keymaps/default/readme.md | 1 - keyboards/{macropad => treasure/type9}/config.h | 2 +- keyboards/{macropad => treasure/type9}/info.json | 2 +- .../{macropad => treasure/type9}/keymaps/default/config.h | 0 .../{macropad => treasure/type9}/keymaps/default/keymap.c | 0 keyboards/treasure/type9/keymaps/default/readme.md | 1 + keyboards/{macropad => treasure/type9}/readme.md | 4 ++-- keyboards/{macropad => treasure/type9}/rules.mk | 0 keyboards/{macropad/macropad.c => treasure/type9/type9.c} | 2 +- keyboards/{macropad/macropad.h => treasure/type9/type9.h} | 4 ++-- 10 files changed, 8 insertions(+), 8 deletions(-) delete mode 100644 keyboards/macropad/keymaps/default/readme.md rename keyboards/{macropad => treasure/type9}/config.h (99%) rename keyboards/{macropad => treasure/type9}/info.json (90%) rename keyboards/{macropad => treasure/type9}/keymaps/default/config.h (100%) rename keyboards/{macropad => treasure/type9}/keymaps/default/keymap.c (100%) create mode 100644 keyboards/treasure/type9/keymaps/default/readme.md rename keyboards/{macropad => treasure/type9}/readme.md (92%) rename keyboards/{macropad => treasure/type9}/rules.mk (100%) rename keyboards/{macropad/macropad.c => treasure/type9/type9.c} (98%) rename keyboards/{macropad/macropad.h => treasure/type9/type9.h} (96%) diff --git a/keyboards/macropad/keymaps/default/readme.md b/keyboards/macropad/keymaps/default/readme.md deleted file mode 100644 index bd3d78af21bb..000000000000 --- a/keyboards/macropad/keymaps/default/readme.md +++ /dev/null @@ -1 +0,0 @@ -# The default keymap for macropad diff --git a/keyboards/macropad/config.h b/keyboards/treasure/type9/config.h similarity index 99% rename from keyboards/macropad/config.h rename to keyboards/treasure/type9/config.h index 00f2e781103a..55f0a8595694 100644 --- a/keyboards/macropad/config.h +++ b/keyboards/treasure/type9/config.h @@ -24,7 +24,7 @@ along with this program. If not, see . #define PRODUCT_ID 0x0000 #define DEVICE_VER 0x0001 #define MANUFACTURER Treasure -#define PRODUCT Macropad Type 9 +#define PRODUCT Type 9 #define DESCRIPTION A custom macropad /* key matrix size */ diff --git a/keyboards/macropad/info.json b/keyboards/treasure/type9/info.json similarity index 90% rename from keyboards/macropad/info.json rename to keyboards/treasure/type9/info.json index f946ed153eb2..7e7b1d0bdac3 100644 --- a/keyboards/macropad/info.json +++ b/keyboards/treasure/type9/info.json @@ -1,5 +1,5 @@ { - "keyboard_name": "Macropad", + "keyboard_name": "Type-9", "url": "", "maintainer": "qmk", "width": 3, diff --git a/keyboards/macropad/keymaps/default/config.h b/keyboards/treasure/type9/keymaps/default/config.h similarity index 100% rename from keyboards/macropad/keymaps/default/config.h rename to keyboards/treasure/type9/keymaps/default/config.h diff --git a/keyboards/macropad/keymaps/default/keymap.c b/keyboards/treasure/type9/keymaps/default/keymap.c similarity index 100% rename from keyboards/macropad/keymaps/default/keymap.c rename to keyboards/treasure/type9/keymaps/default/keymap.c diff --git a/keyboards/treasure/type9/keymaps/default/readme.md b/keyboards/treasure/type9/keymaps/default/readme.md new file mode 100644 index 000000000000..94784baccdff --- /dev/null +++ b/keyboards/treasure/type9/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for Type-9 diff --git a/keyboards/macropad/readme.md b/keyboards/treasure/type9/readme.md similarity index 92% rename from keyboards/macropad/readme.md rename to keyboards/treasure/type9/readme.md index 204ec1fd2301..7c567f91b9e4 100644 --- a/keyboards/macropad/readme.md +++ b/keyboards/treasure/type9/readme.md @@ -1,4 +1,4 @@ -# Macropad +# Type-9 3x3 Macropad. @@ -8,6 +8,6 @@ Hardware Availability: [Treasure](http://macropad.co/) Make example for this keyboard (after setting up your build environment): - make macropad:default + make treasure/type9:default See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/macropad/rules.mk b/keyboards/treasure/type9/rules.mk similarity index 100% rename from keyboards/macropad/rules.mk rename to keyboards/treasure/type9/rules.mk diff --git a/keyboards/macropad/macropad.c b/keyboards/treasure/type9/type9.c similarity index 98% rename from keyboards/macropad/macropad.c rename to keyboards/treasure/type9/type9.c index 0219746e1251..58a9c8f52de5 100644 --- a/keyboards/macropad/macropad.c +++ b/keyboards/treasure/type9/type9.c @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "macropad.h" +#include "type9.h" void matrix_init_kb(void) { // put your keyboard start-up code here diff --git a/keyboards/macropad/macropad.h b/keyboards/treasure/type9/type9.h similarity index 96% rename from keyboards/macropad/macropad.h rename to keyboards/treasure/type9/type9.h index 94471d7c5728..4e3c235d11b0 100644 --- a/keyboards/macropad/macropad.h +++ b/keyboards/treasure/type9/type9.h @@ -13,8 +13,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef MACROPAD_H -#define MACROPAD_H +#ifndef TYPE9_H +#define TYPE9_H #include "quantum.h" From b3f6aa9480a5ddb0b0ba0d611d988121c0ff848b Mon Sep 17 00:00:00 2001 From: Anthony Som Date: Mon, 1 Oct 2018 17:39:45 +0100 Subject: [PATCH 100/505] Correct small typo A small typo (it -> in) that I noticed while reading through the documentation --- docs/flashing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/flashing.md b/docs/flashing.md index 66c08a361045..1edbe2225364 100644 --- a/docs/flashing.md +++ b/docs/flashing.md @@ -2,7 +2,7 @@ There are quite a few different types of bootloaders that keyboards use, and just about all of the use a different flashing method. Luckily, projects like the [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) aim to be compatible with all the different types without having to think about it much, but this article will describe the different types of bootloaders, and available methods for flashing them. -If you have a bootloader selected with the `BOOTLOADER` variable in your `rules.mk`, QMK will automatically calculate if your .hex file is the right size to be flashed to the device, and output the total size it bytes (along with the max). To run this process manually, compile with the target `check-size`, eg `make planck/rev4:default:check-size`. +If you have a bootloader selected with the `BOOTLOADER` variable in your `rules.mk`, QMK will automatically calculate if your .hex file is the right size to be flashed to the device, and output the total size in bytes (along with the max). To run this process manually, compile with the target `check-size`, eg `make planck/rev4:default:check-size`. ## DFU From da6c58175a74e4bb5a6c67f7e8b63567c14800d7 Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Fri, 28 Sep 2018 09:33:51 +0100 Subject: [PATCH 101/505] Make digital rain RGB matrix effect #define configurable. --- docs/feature_rgb_matrix.md | 1 + keyboards/model01/keymaps/dshields/config.h | 1 + keyboards/planck/keymaps/dshields/config.h | 1 + quantum/rgb_matrix.c | 8 ++++++-- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/feature_rgb_matrix.md b/docs/feature_rgb_matrix.md index 4f827f8dc9d9..809d034bdc1a 100644 --- a/docs/feature_rgb_matrix.md +++ b/docs/feature_rgb_matrix.md @@ -140,6 +140,7 @@ These are the effects that are currently available: RGB_MATRIX_RAINBOW_PINWHEELS, RGB_MATRIX_RAINBOW_MOVING_CHEVRON, RGB_MATRIX_JELLYBEAN_RAINDROPS, + RGB_MATRIX_DIGITAL_RAIN, #ifdef RGB_MATRIX_KEYPRESSES RGB_MATRIX_SOLID_REACTIVE, RGB_MATRIX_SPLASH, diff --git a/keyboards/model01/keymaps/dshields/config.h b/keyboards/model01/keymaps/dshields/config.h index 4d609e43684d..4de2d3cbb303 100644 --- a/keyboards/model01/keymaps/dshields/config.h +++ b/keyboards/model01/keymaps/dshields/config.h @@ -1,5 +1,6 @@ #pragma once +#define RGB_DIGITAL_RAIN_DROPS 18 #define USB_MAX_POWER_CONSUMPTION 100 #define ONESHOT_TAP_TOGGLE 2 #define ONESHOT_TIMEOUT 3000 diff --git a/keyboards/planck/keymaps/dshields/config.h b/keyboards/planck/keymaps/dshields/config.h index b149530b8d0b..512e2fbc6484 100644 --- a/keyboards/planck/keymaps/dshields/config.h +++ b/keyboards/planck/keymaps/dshields/config.h @@ -1,5 +1,6 @@ #pragma once +#define RGB_DIGITAL_RAIN_DROPS 24 #define USB_MAX_POWER_CONSUMPTION 100 #define ONESHOT_TAP_TOGGLE 2 #define ONESHOT_TIMEOUT 3000 diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index b282284a138e..f0c2ddfdfbba 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -50,6 +50,11 @@ rgb_config_t rgb_matrix_config; #define RGB_MATRIX_MAXIMUM_BRIGHTNESS 255 #endif +#ifndef RGB_DIGITAL_RAIN_DROPS + // lower the number for denser effect/wider keyboard + #define RGB_DIGITAL_RAIN_DROPS 24 +#endif + bool g_suspend_state = false; // Global tick at 20 Hz @@ -466,7 +471,6 @@ void rgb_matrix_jellybean_raindrops( bool initialize ) { void rgb_matrix_digital_rain( const bool initialize ) { // algorithm ported from https://github.com/tremby/Kaleidoscope-LEDEffect-DigitalRain const uint8_t drop_ticks = 28; - const uint8_t new_drop_probability = 24; const uint8_t pure_green_intensity = 0xd0; const uint8_t max_brightness_boost = 0xc0; const uint8_t max_intensity = 0xff; @@ -481,7 +485,7 @@ void rgb_matrix_digital_rain( const bool initialize ) { } for (uint8_t col = 0; col < MATRIX_COLS; col++) { for (uint8_t row = 0; row < MATRIX_ROWS; row++) { - if (row == 0 && drop == 0 && rand() < RAND_MAX / new_drop_probability) { + if (row == 0 && drop == 0 && rand() < RAND_MAX / RGB_DIGITAL_RAIN_DROPS) { // top row, pixels have just fallen and we're // making a new rain drop in this column map[col][row] = max_intensity; From 4318797d198b58bb807b3e436c7d8924d8b4a6fe Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 27 Aug 2018 09:16:54 -0700 Subject: [PATCH 102/505] Add user level to default_layer_state_set --- tmk_core/common/action_layer.c | 11 ++++++++++- tmk_core/common/action_layer.h | 2 ++ users/drashna/drashna.c | 4 ++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c index 62375dfbfebe..b8dcb34f3a04 100644 --- a/tmk_core/common/action_layer.c +++ b/tmk_core/common/action_layer.c @@ -15,13 +15,22 @@ */ uint32_t default_layer_state = 0; +/** \brief Default Layer State Set At user Level + * + * FIXME: Needs docs + */ +__attribute__((weak)) +uint32_t default_layer_state_set_user(uint32_t state) { + return state; +} + /** \brief Default Layer State Set At Keyboard Level * * FIXME: Needs docs */ __attribute__((weak)) uint32_t default_layer_state_set_kb(uint32_t state) { - return state; + return default_layer_state_set_user(state); } /** \brief Default Layer State Set diff --git a/tmk_core/common/action_layer.h b/tmk_core/common/action_layer.h index 7bf116be2d4b..6d48321f9278 100644 --- a/tmk_core/common/action_layer.h +++ b/tmk_core/common/action_layer.h @@ -31,6 +31,8 @@ void default_layer_set(uint32_t state); __attribute__((weak)) uint32_t default_layer_state_set_kb(uint32_t state); +__attribute__((weak)) +uint32_t default_layer_state_set_user(uint32_t state); #ifndef NO_ACTION_LAYER /* bitwise operation */ diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 7bb272a26737..9489fb456776 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -403,8 +403,8 @@ uint32_t layer_state_set_user(uint32_t state) { } -uint32_t default_layer_state_set_kb(uint32_t state) { - return default_layer_state_set_keymap (state); +uint32_t default_layer_state_set_user(uint32_t state) { + return default_layer_state_set_keymap(state); } From e885c793bcffcba03e18e93e41120b21cdfb6b75 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 1 Oct 2018 17:53:14 -0700 Subject: [PATCH 103/505] Add Function level EECONFIG code for EEPROM (#3084) * Add Function level EEPROM configuration Add kb and user functions for EEPROM, and example of how to use it. * Bug fixes and demo * Additional cleanup * Add EEPROM reset macro to example * Forgot init function in list * Move eeconfig_init_quantum function to quantum.c and actually set default layer * See if removing weak quantum function fixes issue * Fix travis compile error * Remove ifdef blocks from EECONFIG so settings are always set * Fix for ARM EEPROM updates * Fix merge issues * Fix potential STM32 EEPROM issues --- docs/custom_quantum_functions.md | 140 +++++++++ .../ergodox_ez/keymaps/rgb_layer/config.h | 24 ++ .../ergodox_ez/keymaps/rgb_layer/keymap.c | 271 ++++++++++++++++++ quantum/quantum.c | 3 + tmk_core/common/eeconfig.c | 103 +++++-- tmk_core/common/eeconfig.h | 44 ++- 6 files changed, 545 insertions(+), 40 deletions(-) create mode 100644 keyboards/ergodox_ez/keymaps/rgb_layer/config.h create mode 100644 keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c diff --git a/docs/custom_quantum_functions.md b/docs/custom_quantum_functions.md index 10c5c75a2d14..f8b84cd6b360 100644 --- a/docs/custom_quantum_functions.md +++ b/docs/custom_quantum_functions.md @@ -244,3 +244,143 @@ uint32_t layer_state_set_user(uint32_t state) { * Keymap: `uint32_t layer_state_set_user(uint32_t state)` The `state` is the bitmask of the active layers, as explained in the [Keymap Overview](keymap.md#keymap-layer-status) + + +# Persistent Configuration (EEPROM) + +This allows you to configure persistent settings for your keyboard. These settings are stored in the EEPROM of your controller, and are retained even after power loss. The settings can be read with `eeconfig_read_kb` and `eeconfig_read_user`, and can be written to using `eeconfig_update_kb` and `eeconfig_update_user`. This is useful for features that you want to be able to toggle (like toggling rgb layer indication). Additionally, you can use `eeconfig_init_kb` and `eeconfig_init_user` to set the default values for the EEPROM. + +The complicated part here, is that there are a bunch of ways that you can store and access data via EEPROM, and there is no "correct" way to do this. However, you only have a DWORD (4 bytes) for each function. + +Keep in mind that EEPROM has a limited number of writes. While this is very high, it's not the only thing writing to the EEPROM, and if you write too often, you can potentially drastically shorten the life of your MCU. + +* If you don't understand the example, then you may want to avoid using this feature, as it is rather complicated. + +### Example Implementation + +This is an example of how to add settings, and read and write it. We're using the user keymap for the example here. This is a complex function, and has a lot going on. In fact, it uses a lot of the above functions to work! + + +In your keymap.c file, add this to the top: +``` +typedef union { + uint32_t raw; + struct { + bool rgb_layer_change :1; + }; +} user_config_t; + +user_config_t user_config; +``` + +This sets up a 32 bit structure that we can store settings with in memory, and write to the EEPROM. Using this removes the need to define variables, since they're defined in this structure. Remember that `bool` (boolean) values use 1 bit, `uint8_t` uses 8 bits, `uint16_t` uses up 16 bits. You can mix and match, but changing the order can cause issues, as it will change the values that are read and written. + +We're using `rgb_layer_change`, for the `layer_state_set_*` function, and use `matrix_init_user` and `process_record_user` to configure everything. + +Now, using the `matrix_init_user` code above, you want to add `eeconfig_read_user()` to it, to populate the structure you've just created. And you can then immediately use this structure to control functionality in your keymap. And It should look like: +``` +void matrix_init_user(void) { + // Call the keymap level matrix init. + + // Read the user config from EEPROM + user_config.raw = eeconfig_read_user(); + + // Set default layer, if enabled + if (user_config.rgb_layer_change) { + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom_cyan(); + rgblight_mode_noeeprom(1); + } +} +``` +The above function will use the EEPROM config immediately after reading it, to set the default layer's RGB color. The "raw" value of it is converted in a usable structure based on the "union" that you created above. + +``` +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case _RAISE: + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_magenta(); rgblight_mode_noeeprom(1); } + break; + case _LOWER: + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_red(); rgblight_mode_noeeprom(1); } + break; + case _PLOVER: + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_green(); rgblight_mode_noeeprom(1); } + break; + case _ADJUST: + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_white(); rgblight_mode_noeeprom(1); } + break; + default: // for any other layers, or the default layer + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_cyan(); rgblight_mode_noeeprom(1); } + break; + } + return state; +} +``` +This will cause the RGB underglow to be changed ONLY if the value was enabled. Now to configure this value, create a new keycode for `process_record_user` called `RGB_LYR` and `EPRM`. Additionally, we want to make sure that if you use the normal RGB codes, that it turns off Using the example above, make it look this: +``` + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case FOO: + if (record->event.pressed) { + // Do something when pressed + } else { + // Do something else when release + } + return false; // Skip all further processing of this key + case KC_ENTER: + // Play a tone when enter is pressed + if (record->event.pressed) { + PLAY_NOTE_ARRAY(tone_qwerty); + } + return true; // Let QMK send the enter press/release events + case EPRM: + if (record->event.pressed) { + eeconfig_init(); // resets the EEPROM to default + } + return false; + case RGB_LYR: // This allows me to use underglow as layer indication, or as normal + if (record->event.pressed) { + user_config.rgb_layer_change ^= 1; // Toggles the status + eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM + if (user_config.rgb_layer_change) { // if layer state indication is enabled, + layer_state_set(layer_state); // then immediately update the layer color + } + } + return false; break; + case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // For any of the RGB codes (see quantum_keycodes.h, L400 for reference) + if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled + if (user_config.rgb_layer_change) { // only if this is enabled + user_config.rgb_layer_change = false; // disable it, and + eeconfig_update_user(user_config.raw); // write the setings to EEPROM + } + } + return true; break; + default: + return true; // Process all other keycodes normally + } +} +``` +And lastly, you want to add the `eeconfig_init_user` function, so that when the EEPROM is reset, you can specify default values, and even custom actions. For example, if you want to set rgb layer indication by default, and save the default valued. + +``` +void eeconfig_init_user(void) { // EEPROM is getting reset! + user_config.rgb_layer_change = true; // We want this enabled by default + eeconfig_update_user(user_config.raw); // Write default value to EEPROM now + + // use the non noeeprom versions, to write these values to EEPROM too + rgblight_enable(); // Enable RGB by default + rgblight_sethsv_cyan(); // Set it to CYAN by default + rgblight_mode(1); // set to solid by default +} +``` + +And you're done. The RGB layer indication will only work if you want it to. And it will be saved, even after unplugging the board. And if you use any of the RGB codes, it will disable the layer indication, so that it stays on the mode and color that you set it to. + +### 'EECONFIG' Function Documentation + +* Keyboard/Revision: `void eeconfig_init_kb(void)`, `uint32_t eeconfig_read_kb(void)` and `void eeconfig_update_kb(uint32_t val)` +* Keymap: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)` and `void eeconfig_update_user(uint32_t val)` + +The `val` is the value of the data that you want to write to EEPROM. And the `eeconfig_read_*` function return a 32 bit (DWORD) value from the EEPROM. diff --git a/keyboards/ergodox_ez/keymaps/rgb_layer/config.h b/keyboards/ergodox_ez/keymaps/rgb_layer/config.h new file mode 100644 index 000000000000..59302b8003c4 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/rgb_layer/config.h @@ -0,0 +1,24 @@ +#ifndef KEYMAP_CONFIG_H +#define KEYMAP_CONFIG_H + + + #define RGBLIGHT_SLEEP + + +#ifndef QMK_KEYS_PER_SCAN +#define QMK_KEYS_PER_SCAN 4 +#endif // !QMK_KEYS_PER_SCAN + +#define IGNORE_MOD_TAP_INTERRUPT +#undef PERMISSIVE_HOLD +#undef PREVENT_STUCK_MODIFIERS + + +#define FORCE_NKRO + +#ifndef TAPPING_TOGGLE +#define TAPPING_TOGGLE 1 +#endif + +#endif // !USERSPACE_CONFIG_H + diff --git a/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c b/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c new file mode 100644 index 000000000000..384d7d0945f8 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/rgb_layer/keymap.c @@ -0,0 +1,271 @@ +#include QMK_KEYBOARD_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, + RGB_LYR +}; + +typedef union { + uint32_t raw; + struct { + bool rgb_layer_change :1; + }; +} user_config_t; + +user_config_t user_config; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap 0: Basic layer + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | = | 1 | 2 | 3 | 4 | 5 | LEFT | | RIGHT| 6 | 7 | 8 | 9 | 0 | - | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | Del | Q | W | E | R | T | L1 | | L1 | Y | U | I | O | P | \ | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | BkSp | A | S | D | F | G |------| |------| H | J | K | L |; / L2|' / Cmd | + * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| + * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | App | LGui | | Alt |Ctrl/Esc| + * ,------|------|------| |------+--------+------. + * | | | Home | | PgUp | | | + * | Space|Backsp|------| |------| Tab |Enter | + * | |ace | End | | PgDn | | | + * `--------------------' `----------------------' + */ +// If it accepts an argument (i.e, is a function), it doesn't need KC_. +// Otherwise, it needs KC_* +[BASE] = LAYOUT_ergodox( // layer 0 : default + // left hand + KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, + KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), + KC_BSPC, 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), + LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT,KC_RGHT, + ALT_T(KC_APP), KC_LGUI, + KC_HOME, + KC_SPC,KC_BSPC,KC_END, + // right hand + KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN),GUI_T(KC_QUOT), + MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT, + KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, TT(SYMB), + KC_LALT, CTL_T(KC_ESC), + KC_PGUP, + KC_PGDN,KC_TAB, KC_ENT + ), +/* Keymap 1: Symbol Layer + * + * ,---------------------------------------------------. ,--------------------------------------------------. + * |Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | + * |---------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| + * | | ! | @ | { | } | | | | | | Up | 7 | 8 | 9 | * | F12 | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | # | $ | ( | ) | ` |------| |------| Down | 4 | 5 | 6 | + | | + * |---------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | % | ^ | [ | ] | ~ | | | | & | 1 | 2 | 3 | \ | | + * `---------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | EPRM | | | | | | | . | 0 | = | | + * `-----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * |Animat| LYR | |Toggle|Solid | + * ,------|------|------| |------+------+------. + * |Bright|Bright| | | |Hue- |Hue+ | + * |ness- |ness+ |------| |------| | | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// SYMBOLS +[SYMB] = LAYOUT_ergodox( + // left hand + VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + RESET, KC_EXLM,KC_AT, KC_LCBR,KC_RCBR,KC_PIPE,KC_TRNS, + KC_TRNS,KC_HASH,KC_DLR, KC_LPRN,KC_RPRN,KC_GRV, + EPRM,KC_PERC,KC_CIRC,KC_LBRC,KC_RBRC,KC_TILD,KC_TRNS, + KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, + RGB_MOD,RGB_LYR, + KC_TRNS, + RGB_VAD,RGB_VAI,KC_TRNS, + // right hand + KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12, + KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS, + KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS, + KC_TRNS,KC_DOT, KC_0, KC_EQL, KC_TRNS, + RGB_TOG, RGB_SLD, + KC_TRNS, + KC_TRNS, RGB_HUD, RGB_HUI +), +/* Keymap 2: Media and mouse keys + * + * ,--------------------------------------------------. ,--------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------| + * | | | | MsUp | | | | | | | | | | | | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | |MsLeft|MsDown|MsRght| |------| |------| | | | | | Play | + * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| + * | | | | | | | | | | | | Prev | Next | | | + * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' + * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | | + * `----------------------------------' `----------------------------------' + * ,-------------. ,-------------. + * | | | | | | + * ,------|------|------| |------+------+------. + * | | | | | | |Brwser| + * | | |------| |------| |Back | + * | | | | | | | | + * `--------------------' `--------------------' + */ +// MEDIA AND MOUSE +[MDIA] = LAYOUT_ergodox( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, + // right hand + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, + KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS, + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, + KC_TRNS, + KC_TRNS, KC_TRNS, KC_WBAK +), +}; + +void eeconfig_init_user(void) { + rgblight_enable(); + rgblight_sethsv_cyan(); + rgblight_mode(1); + user_config.rgb_layer_change = true; + eeconfig_update_user(user_config.raw); +} + + +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; + case RGB_LYR: // This allows me to use underglow as layer indication, or as normal + if (record->event.pressed) { + user_config.rgb_layer_change ^= 1; // Toggles the status + eeconfig_update_user(user_config.raw); // Writes the new status to EEPROM + if (user_config.rgb_layer_change) { // if layer state indication is enabled, + layer_state_set(layer_state); // then immediately update the layer color + } + } + return false; break; + case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // For any of the RGB codes (see quantum_keycodes.h, L400 for reference) + if (record->event.pressed) { //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled + if (user_config.rgb_layer_change) { // only if this is enabled + user_config.rgb_layer_change = false; // disable it, and + eeconfig_update_user(user_config.raw); // write the setings to EEPROM + } + } + return true; break; + } + return true; +} + +void matrix_init_user(void) { + // Call the keymap level matrix init. + + // Read the user config from EEPROM + user_config.raw = eeconfig_read_user(); + + // Set default layer, if enabled + if (user_config.rgb_layer_change) { + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom_cyan(); + rgblight_mode_noeeprom(1); + } +} + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { + +}; + +uint32_t layer_state_set_user(uint32_t state) { + ergodox_board_led_off(); + ergodox_right_led_1_off(); + ergodox_right_led_2_off(); + ergodox_right_led_3_off(); + switch (biton32(state)) { + case SYMB: + ergodox_right_led_1_on(); + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_red(); rgblight_mode_noeeprom(1); } + break; + case MDIA: + ergodox_right_led_2_on(); + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_green(); rgblight_mode_noeeprom(1); } + break; + case 3: + ergodox_right_led_3_on(); + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_blue(); rgblight_mode_noeeprom(1); } + break; + case 4: + ergodox_right_led_1_on(); + ergodox_right_led_2_on(); + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_orange(); rgblight_mode_noeeprom(1); } + break; + case 5: + ergodox_right_led_1_on(); + ergodox_right_led_3_on(); + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_yellow(); rgblight_mode_noeeprom(1); } + break; + case 6: + ergodox_right_led_2_on(); + ergodox_right_led_3_on(); + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_pink(); rgblight_mode_noeeprom(1); } + break; + case 7: + ergodox_right_led_1_on(); + ergodox_right_led_2_on(); + ergodox_right_led_3_on(); + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_white(); rgblight_mode_noeeprom(1); } + break; + default: // for any other layers, or the default layer + if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_cyan(); rgblight_mode_noeeprom(1); } + break; + } + return state; +} + diff --git a/quantum/quantum.c b/quantum/quantum.c index 84ccbdeabadd..eed59f811e8b 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -945,6 +945,9 @@ void tap_random_base64(void) { } void matrix_init_quantum() { + if (!eeconfig_is_enabled() && !eeconfig_is_disabled()) { + eeconfig_init(); + } #ifdef BACKLIGHT_ENABLE backlight_init_ports(); #endif diff --git a/tmk_core/common/eeconfig.c b/tmk_core/common/eeconfig.c index 35de574a9647..0fec410a9ca2 100644 --- a/tmk_core/common/eeconfig.c +++ b/tmk_core/common/eeconfig.c @@ -8,32 +8,54 @@ #include "eeprom_stm32.h" #endif -/** \brief eeconfig initialization +extern uint32_t default_layer_state; +/** \brief eeconfig enable * * FIXME: needs doc */ -void eeconfig_init(void) -{ +__attribute__ ((weak)) +void eeconfig_init_user(void) { + // Reset user EEPROM value to blank, rather than to a set value + eeconfig_update_user(0); +} + +__attribute__ ((weak)) +void eeconfig_init_kb(void) { + // Reset Keyboard EEPROM value to blank, rather than to a set value + eeconfig_update_kb(0); + + eeconfig_init_user(); +} + + +/* + * FIXME: needs doc + */ +void eeconfig_init_quantum(void) { #ifdef STM32F303xC EEPROM_format(); #endif - eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); - eeprom_update_byte(EECONFIG_DEBUG, 0); - eeprom_update_byte(EECONFIG_DEFAULT_LAYER, 0); - eeprom_update_byte(EECONFIG_KEYMAP, 0); - eeprom_update_byte(EECONFIG_MOUSEKEY_ACCEL, 0); -#ifdef BACKLIGHT_ENABLE - eeprom_update_byte(EECONFIG_BACKLIGHT, 0); -#endif -#ifdef AUDIO_ENABLE - eeprom_update_byte(EECONFIG_AUDIO, 0xFF); // On by default -#endif -#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) - eeprom_update_dword(EECONFIG_RGBLIGHT, 0); -#endif -#ifdef STENO_ENABLE - eeprom_update_byte(EECONFIG_STENOMODE, 0); -#endif + eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); + eeprom_update_byte(EECONFIG_DEBUG, 0); + eeprom_update_byte(EECONFIG_DEFAULT_LAYER, 0); + default_layer_state = 0; + eeprom_update_byte(EECONFIG_KEYMAP, 0); + eeprom_update_byte(EECONFIG_MOUSEKEY_ACCEL, 0); + eeprom_update_byte(EECONFIG_BACKLIGHT, 0); + eeprom_update_byte(EECONFIG_AUDIO, 0xFF); // On by default + eeprom_update_dword(EECONFIG_RGBLIGHT, 0); + eeprom_update_byte(EECONFIG_STENOMODE, 0); + + eeconfig_init_kb(); +} + +/** \brief eeconfig initialization + * + * FIXME: needs doc + */ +void eeconfig_init(void) { + + eeconfig_init_quantum(); } /** \brief eeconfig enable @@ -54,7 +76,7 @@ void eeconfig_disable(void) #ifdef STM32F303xC EEPROM_format(); #endif - eeprom_update_word(EECONFIG_MAGIC, 0xFFFF); + eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER_OFF); } /** \brief eeconfig is enabled @@ -66,6 +88,15 @@ bool eeconfig_is_enabled(void) return (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER); } +/** \brief eeconfig is disabled + * + * FIXME: needs doc + */ +bool eeconfig_is_disabled(void) +{ + return (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER_OFF); +} + /** \brief eeconfig read debug * * FIXME: needs doc @@ -99,7 +130,6 @@ uint8_t eeconfig_read_keymap(void) { return eeprom_read_byte(EECONFIG_KEYMA */ void eeconfig_update_keymap(uint8_t val) { eeprom_update_byte(EECONFIG_KEYMAP, val); } -#ifdef BACKLIGHT_ENABLE /** \brief eeconfig read backlight * * FIXME: needs doc @@ -110,9 +140,8 @@ uint8_t eeconfig_read_backlight(void) { return eeprom_read_byte(EECONFIG_BA * FIXME: needs doc */ void eeconfig_update_backlight(uint8_t val) { eeprom_update_byte(EECONFIG_BACKLIGHT, val); } -#endif -#ifdef AUDIO_ENABLE + /** \brief eeconfig read audio * * FIXME: needs doc @@ -123,4 +152,28 @@ uint8_t eeconfig_read_audio(void) { return eeprom_read_byte(EECONFIG_AUDIO) * FIXME: needs doc */ void eeconfig_update_audio(uint8_t val) { eeprom_update_byte(EECONFIG_AUDIO, val); } -#endif + + +/** \brief eeconfig read kb + * + * FIXME: needs doc + */ +uint32_t eeconfig_read_kb(void) { return eeprom_read_dword(EECONFIG_KEYBOARD); } +/** \brief eeconfig update kb + * + * FIXME: needs doc + */ + +void eeconfig_update_kb(uint32_t val) { eeprom_update_dword(EECONFIG_KEYBOARD, val); } +/** \brief eeconfig read user + * + * FIXME: needs doc + */ +uint32_t eeconfig_read_user(void) { return eeprom_read_dword(EECONFIG_USER); } +/** \brief eeconfig update user + * + * FIXME: needs doc + */ +void eeconfig_update_user(uint32_t val) { eeprom_update_dword(EECONFIG_USER, val); } + + diff --git a/tmk_core/common/eeconfig.h b/tmk_core/common/eeconfig.h index fa498df48c5c..a45cb8b12d3c 100644 --- a/tmk_core/common/eeconfig.h +++ b/tmk_core/common/eeconfig.h @@ -23,36 +23,41 @@ along with this program. If not, see . #define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEED +#define EECONFIG_MAGIC_NUMBER_OFF (uint16_t)0xFFFF /* eeprom parameteter address */ #if !defined(STM32F303xC) #define EECONFIG_MAGIC (uint16_t *)0 -#define EECONFIG_DEBUG (uint8_t *)2 -#define EECONFIG_DEFAULT_LAYER (uint8_t *)3 -#define EECONFIG_KEYMAP (uint8_t *)4 -#define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)5 -#define EECONFIG_BACKLIGHT (uint8_t *)6 -#define EECONFIG_AUDIO (uint8_t *)7 +#define EECONFIG_DEBUG (uint8_t *)2 +#define EECONFIG_DEFAULT_LAYER (uint8_t *)3 +#define EECONFIG_KEYMAP (uint8_t *)4 +#define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)5 +#define EECONFIG_BACKLIGHT (uint8_t *)6 +#define EECONFIG_AUDIO (uint8_t *)7 #define EECONFIG_RGBLIGHT (uint32_t *)8 #define EECONFIG_UNICODEMODE (uint8_t *)12 #define EECONFIG_STENOMODE (uint8_t *)13 // EEHANDS for two handed boards -#define EECONFIG_HANDEDNESS (uint8_t *)14 +#define EECONFIG_HANDEDNESS (uint8_t *)14 +#define EECONFIG_KEYBOARD (uint32_t *)15 +#define EECONFIG_USER (uint32_t *)19 #else /* STM32F3 uses 16byte block. Reconfigure memory map */ #define EECONFIG_MAGIC (uint16_t *)0 -#define EECONFIG_DEBUG (uint8_t *)1 -#define EECONFIG_DEFAULT_LAYER (uint8_t *)2 -#define EECONFIG_KEYMAP (uint8_t *)3 -#define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)4 -#define EECONFIG_BACKLIGHT (uint8_t *)5 -#define EECONFIG_AUDIO (uint8_t *)6 +#define EECONFIG_DEBUG (uint8_t *)1 +#define EECONFIG_DEFAULT_LAYER (uint8_t *)2 +#define EECONFIG_KEYMAP (uint8_t *)3 +#define EECONFIG_MOUSEKEY_ACCEL (uint8_t *)4 +#define EECONFIG_BACKLIGHT (uint8_t *)5 +#define EECONFIG_AUDIO (uint8_t *)6 #define EECONFIG_RGBLIGHT (uint32_t *)7 -#define EECONFIG_UNICODEMODE (uint8_t *)9 +#define EECONFIG_UNICODEMODE (uint8_t *)9 #define EECONFIG_STENOMODE (uint8_t *)10 // EEHANDS for two handed boards -#define EECONFIG_HANDEDNESS (uint8_t *)11 +#define EECONFIG_HANDEDNESS (uint8_t *)11 +#define EECONFIG_KEYBOARD (uint32_t *)12 +#define EECONFIG_USER (uint32_t *)14 #endif /* debug bit */ @@ -73,8 +78,12 @@ along with this program. If not, see . bool eeconfig_is_enabled(void); +bool eeconfig_is_disabled(void); void eeconfig_init(void); +void eeconfig_init_quantum(void); +void eeconfig_init_kb(void); +void eeconfig_init_user(void); void eeconfig_enable(void); @@ -99,4 +108,9 @@ uint8_t eeconfig_read_audio(void); void eeconfig_update_audio(uint8_t val); #endif +uint32_t eeconfig_read_kb(void); +void eeconfig_update_kb(uint32_t val); +uint32_t eeconfig_read_user(void); +void eeconfig_update_user(uint32_t val); + #endif From 26f4e7031a643ce2760ae7b6df3bd2c79710451a Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 1 Oct 2018 17:53:47 -0700 Subject: [PATCH 104/505] Add tap_code function (#3784) * Add tap_code * formatting * Doc clarification * Rename variable to make more consistent --- docs/feature_macros.md | 4 ++++ tmk_core/common/action.h | 1 + 2 files changed, 5 insertions(+) diff --git a/docs/feature_macros.md b/docs/feature_macros.md index 67315308127f..ba5d91882fb7 100644 --- a/docs/feature_macros.md +++ b/docs/feature_macros.md @@ -228,6 +228,10 @@ This sends the `` keydown event to the computer. Some examples would be `KC_ Parallel to `register_code` function, this sends the `` keyup event to the computer. If you don't use this, the key will be held down until it's sent. +### `tap_code();` + +This will send `register_code()` and then `unregister_code()`. This is useful if you want to send both the press and release events ("tap" the key, rather than hold it). + ### `clear_keyboard();` This will clear all mods and keys currently pressed. diff --git a/tmk_core/common/action.h b/tmk_core/common/action.h index 0322c73ed1e3..833febe9ce9b 100644 --- a/tmk_core/common/action.h +++ b/tmk_core/common/action.h @@ -88,6 +88,7 @@ void process_record(keyrecord_t *record); void process_action(keyrecord_t *record, action_t action); void register_code(uint8_t code); void unregister_code(uint8_t code); +inline void tap_code(uint8_t code) { register_code(code); unregister_code(code); } void register_mods(uint8_t mods); void unregister_mods(uint8_t mods); //void set_mods(uint8_t mods); From f5ae3760c6be7e927fba74aca4a0cf21a44113af Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 1 Oct 2018 17:56:04 -0700 Subject: [PATCH 105/505] Add send_unicode_hex_string function (#3828) * Add send_string_unicode function Co-authored-by: kdb424 Co-authored-by: Konstantin * Clean up code based on feedback * Fix includes --- docs/feature_unicode.md | 7 ++++- .../process_keycode/process_unicode_common.c | 28 +++++++++++++++++++ .../process_keycode/process_unicode_common.h | 1 + 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/docs/feature_unicode.md b/docs/feature_unicode.md index ecad6c60c7f4..278b93ad7996 100644 --- a/docs/feature_unicode.md +++ b/docs/feature_unicode.md @@ -19,7 +19,7 @@ table. TBD Unicode input in QMK works by inputing a sequence of characters to the OS, -sort of like macro. Unfortunately, each OS has different ideas on how Unicode is inputted. +sort of like macro. Unfortunately, each OS has different ideas on how Unicode is input. This is the current list of Unicode input method in QMK: @@ -29,6 +29,11 @@ This is the current list of Unicode input method in QMK: * UC_WIN: (not recommended) Windows built-in Unicode input. To enable: create registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad`, set its value to 1, and reboot. This method is not recommended because of reliability and compatibility issue, use WinCompose method below instead. * UC_WINC: Windows Unicode input using WinCompose. Requires [WinCompose](https://github.com/samhocevar/wincompose). Works reliably under many (all?) variations of Windows. +To type multiple characters for things like (ノಠ痊ಠ)ノ彡┻━┻, you can use `send_unicode_hex_string()` much like `SEND_STRING()` except you would use hex values seperated by spaces. +For example, the table flip seen above would be `send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B")` + +There are many ways to get a hex code, but an easy one is [this site](https://r12a.github.io/app-conversion/). Just make sure to convert to hexadecimal, and that is your string. + # Additional Language Support In `quantum/keymap_extras/`, you'll see various language files - these work the same way as the alternative layout ones do. Most are defined by their two letter country/language code followed by an underscore and a 4-letter abbreviation of its name. `FR_UGRV` which will result in a `ù` when using a software-implemented AZERTY layout. It's currently difficult to send such characters in just the firmware. diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c index 7f34ad57cfda..e6620b7ea9f9 100644 --- a/quantum/process_keycode/process_unicode_common.c +++ b/quantum/process_keycode/process_unicode_common.c @@ -16,6 +16,8 @@ #include "process_unicode_common.h" #include "eeprom.h" +#include +#include static uint8_t input_mode; uint8_t mods; @@ -120,3 +122,29 @@ void register_hex(uint16_t hex) { unregister_code(hex_to_keycode(digit)); } } + +void send_unicode_hex_string(const char *str) +{ + if (!str) { return; } // Safety net + + while (*str) { + // Find the next code point (token) in the string + for (; *str == ' '; str++); + size_t n = strcspn(str, " "); // Length of the current token + char code_point[n+1]; + strncpy(code_point, str, n); + code_point[n] = '\0'; // Make sure it's null-terminated + + // Normalize the code point: make all hex digits lowercase + for (char *p = code_point; *p; p++) { + *p = tolower((unsigned char)*p); + } + + // Send the code point as a Unicode input string + unicode_input_start(); + send_string(code_point); + unicode_input_finish(); + + str += n; // Move to the first ' ' (or '\0') after the current token + } +} diff --git a/quantum/process_keycode/process_unicode_common.h b/quantum/process_keycode/process_unicode_common.h index 4d2b04fb392d..814b60c573e4 100644 --- a/quantum/process_keycode/process_unicode_common.h +++ b/quantum/process_keycode/process_unicode_common.h @@ -31,6 +31,7 @@ uint8_t get_unicode_input_mode(void); void unicode_input_start(void); void unicode_input_finish(void); void register_hex(uint16_t hex); +void send_unicode_hex_string(const char *str); #define UC_OSX 0 // Mac OS X #define UC_LNX 1 // Linux From 1512a6bfd48fb75619a1f77394d41bdca7ea28b1 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 1 Oct 2018 18:00:14 -0700 Subject: [PATCH 106/505] Keymap: Update to drashna keymaps and userspace (#3992) * Enabled unicode support and send_unicode function * Unicode cleanup * More unicode tweaking * Update EEPROM stuff * Account for keyboard macros * Switch Equal to Plus on Ergodox * more tweaks * Minor Unicode tweaks * Correct matrix printing for keylogger * Fix unicode functions * Fix unicode mode set since it actually uses EEPROM * Re-add DISABLE_LEADER * Ergodox is easier to hit the tapping term, fix that * Fix stupid type on unicode mode check * Preliminary CRKBD/HeliDox support * Fixes to Helidox * Cleanup userspace from old merge stuff * Remove CCCV sounds * Make Mode NOEEPROM Again --- keyboards/crkbd/keymaps/drashna/config.h | 43 +++ keyboards/crkbd/keymaps/drashna/glcdfont.c | 244 ++++++++++++++++++ keyboards/crkbd/keymaps/drashna/keymap.c | 173 +++++++++++++ keyboards/crkbd/keymaps/drashna/rules.mk | 30 +++ layouts/community/ergodox/drashna/keymap.c | 18 +- layouts/community/ergodox/drashna/rules.mk | 4 +- users/drashna/config.h | 10 +- users/drashna/drashna.c | 75 +++--- users/drashna/drashna.h | 28 +- users/drashna/rgb_stuff.c | 5 +- users/drashna/rules.mk | 7 +- users/drashna/send_unicode.c | 58 +++++ .../{drashna_unicode.h => send_unicode.h} | 10 +- 13 files changed, 639 insertions(+), 66 deletions(-) create mode 100644 keyboards/crkbd/keymaps/drashna/config.h create mode 100644 keyboards/crkbd/keymaps/drashna/glcdfont.c create mode 100644 keyboards/crkbd/keymaps/drashna/keymap.c create mode 100644 keyboards/crkbd/keymaps/drashna/rules.mk create mode 100644 users/drashna/send_unicode.c rename users/drashna/{drashna_unicode.h => send_unicode.h} (90%) diff --git a/keyboards/crkbd/keymaps/drashna/config.h b/keyboards/crkbd/keymaps/drashna/config.h new file mode 100644 index 000000000000..366f013dcaf7 --- /dev/null +++ b/keyboards/crkbd/keymaps/drashna/config.h @@ -0,0 +1,43 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +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 . +*/ + +#pragma once + + +/* Select hand configuration */ + +// #define MASTER_LEFT +// #define MASTER_RIGHT +#define EE_HANDS + +#define SSD1306OLED + +#define USE_SERIAL_PD2 + +// #define TAPPING_FORCE_HOLD +// #define TAPPING_TERM 100 + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 27 +#define RGBLIGHT_LIMIT_VAL 120 +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 diff --git a/keyboards/crkbd/keymaps/drashna/glcdfont.c b/keyboards/crkbd/keymaps/drashna/glcdfont.c new file mode 100644 index 000000000000..4e7b27bc0c93 --- /dev/null +++ b/keyboards/crkbd/keymaps/drashna/glcdfont.c @@ -0,0 +1,244 @@ +// 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, 0x00, +0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, +0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, +0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, +0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00, +0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00, +0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, +0x00, 0x18, 0x3C, 0x18, 0x00, 0x00, +0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, +0x00, 0x18, 0x24, 0x18, 0x00, 0x00, +0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00, +0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00, +0x26, 0x29, 0x79, 0x29, 0x26, 0x00, +0x40, 0x7F, 0x05, 0x05, 0x07, 0x00, +0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00, +0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00, +0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00, +0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00, +0x14, 0x22, 0x7F, 0x22, 0x14, 0x00, +0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00, +0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, +0x00, 0x66, 0x89, 0x95, 0x6A, 0x00, +0x60, 0x60, 0x60, 0x60, 0x60, 0x00, +0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00, +0x08, 0x04, 0x7E, 0x04, 0x08, 0x00, +0x10, 0x20, 0x7E, 0x20, 0x10, 0x00, +0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, +0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, +0x1E, 0x10, 0x10, 0x10, 0x10, 0x00, +0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00, +0x30, 0x38, 0x3E, 0x38, 0x30, 0x00, +0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, +0x00, 0x07, 0x00, 0x07, 0x00, 0x00, +0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, +0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, +0x23, 0x13, 0x08, 0x64, 0x62, 0x00, +0x36, 0x49, 0x56, 0x20, 0x50, 0x00, +0x00, 0x08, 0x07, 0x03, 0x00, 0x00, +0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, +0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, +0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00, +0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, +0x00, 0x80, 0x70, 0x30, 0x00, 0x00, +0x08, 0x08, 0x08, 0x08, 0x08, 0x00, +0x00, 0x00, 0x60, 0x60, 0x00, 0x00, +0x20, 0x10, 0x08, 0x04, 0x02, 0x00, +0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, +0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, +0x72, 0x49, 0x49, 0x49, 0x46, 0x00, +0x21, 0x41, 0x49, 0x4D, 0x33, 0x00, +0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, +0x27, 0x45, 0x45, 0x45, 0x39, 0x00, +0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00, +0x41, 0x21, 0x11, 0x09, 0x07, 0x00, +0x36, 0x49, 0x49, 0x49, 0x36, 0x00, +0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, +0x00, 0x00, 0x14, 0x00, 0x00, 0x00, +0x00, 0x40, 0x34, 0x00, 0x00, 0x00, +0x00, 0x08, 0x14, 0x22, 0x41, 0x00, +0x14, 0x14, 0x14, 0x14, 0x14, 0x00, +0x00, 0x41, 0x22, 0x14, 0x08, 0x00, +0x02, 0x01, 0x59, 0x09, 0x06, 0x00, +0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00, +0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00, +0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, +0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, +0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, +0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, +0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, +0x3E, 0x41, 0x41, 0x51, 0x73, 0x00, +0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, +0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, +0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, +0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, +0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, +0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00, +0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, +0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, +0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, +0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, +0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, +0x26, 0x49, 0x49, 0x49, 0x32, 0x00, +0x03, 0x01, 0x7F, 0x01, 0x03, 0x00, +0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, +0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, +0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, +0x63, 0x14, 0x08, 0x14, 0x63, 0x00, +0x03, 0x04, 0x78, 0x04, 0x03, 0x00, +0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, +0x00, 0x7F, 0x41, 0x41, 0x41, 0x00, +0x02, 0x04, 0x08, 0x10, 0x20, 0x00, +0x00, 0x41, 0x41, 0x41, 0x7F, 0x00, +0x04, 0x02, 0x01, 0x02, 0x04, 0x00, +0x40, 0x40, 0x40, 0x40, 0x40, 0x00, +0x00, 0x03, 0x07, 0x08, 0x00, 0x00, +0x20, 0x54, 0x54, 0x78, 0x40, 0x00, +0x7F, 0x28, 0x44, 0x44, 0x38, 0x00, +0x38, 0x44, 0x44, 0x44, 0x28, 0x00, +0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, +0x38, 0x54, 0x54, 0x54, 0x18, 0x00, +0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, +0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00, +0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, +0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, +0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, +0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, +0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, +0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, +0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, +0x38, 0x44, 0x44, 0x44, 0x38, 0x00, +0xFC, 0x18, 0x24, 0x24, 0x18, 0x00, +0x18, 0x24, 0x24, 0x18, 0xFC, 0x00, +0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, +0x48, 0x54, 0x54, 0x54, 0x24, 0x00, +0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, +0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, +0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, +0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, +0x44, 0x28, 0x10, 0x28, 0x44, 0x00, +0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00, +0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, +0x00, 0x08, 0x36, 0x41, 0x00, 0x00, +0x00, 0x00, 0x77, 0x00, 0x00, 0x00, +0x00, 0x41, 0x36, 0x08, 0x00, 0x00, +0x02, 0x01, 0x02, 0x04, 0x02, 0x00, +0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0E, 0x3F, 0xFF, 0xFF, +0xFF, 0xFF, 0xFE, 0xE0, 0x80, 0x00, +0x00, 0x00, 0x00, 0x00, 0x1E, 0xBE, +0x7F, 0xFF, 0xFF, 0xFE, 0xFE, 0xF0, +0xE0, 0xC0, 0x80, 0x00, 0x0E, 0xEF, +0xDF, 0xDE, 0xBE, 0x3C, 0x38, 0x70, +0xE0, 0xDD, 0xBB, 0x7B, 0x07, 0x0E, +0x0E, 0x0C, 0x98, 0xF0, 0xE0, 0xF0, +0xF0, 0xF8, 0x78, 0x3C, 0x1C, 0x1E, +0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, +0x1F, 0xFE, 0xFE, 0xF8, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC, +0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00, +0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E, +0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00, +0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B, +0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00, +0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE, +0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x03, +0x0F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFE, +0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x7F, +0xFF, 0xFE, 0xFD, 0xFB, 0x1B, 0x07, +0x07, 0x0F, 0x1F, 0x1F, 0x1E, 0x1D, +0x0B, 0x07, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, +0xF8, 0xFE, 0xFF, 0xFF, 0x1F, 0x07, +0x01, 0x01, 0x01, 0x03, 0x06, 0x06, +0x0C, 0x0C, 0x08, 0x0C, 0x0C, 0x0E, +0x07, 0x83, 0xC1, 0xE0, 0x70, 0x30, +0x18, 0x1C, 0x7C, 0xCC, 0x8C, 0xDC, +0xF8, 0xC0, 0xE0, 0xE0, 0x70, 0xB8, +0xF0, 0x60, 0x00, 0x00, 0x80, 0xC0, +0xE0, 0xF0, 0x70, 0xF8, 0xFC, 0xFC, +0x3C, 0x30, 0x38, 0xF8, 0xF8, 0xF8, +0x78, 0x00, 0x80, 0x80, 0xC0, 0xE0, +0x70, 0x38, 0x38, 0x9C, 0xDC, 0xFC, +0x7C, 0x38, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F, +0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00, +0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F, +0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00, +0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20, +0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00, +0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F, +0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x03, 0x07, +0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, +0x7E, 0x7D, 0x3B, 0x17, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x07, +0x0F, 0x1F, 0x3F, 0x3F, 0x7E, 0x7C, +0x78, 0x70, 0x70, 0x70, 0x70, 0x70, +0x70, 0x78, 0x38, 0x18, 0x1C, 0x0E, +0x07, 0x0F, 0x1F, 0x3F, 0x3C, 0x38, +0x38, 0x18, 0x0C, 0x06, 0x03, 0x01, +0x01, 0x01, 0x01, 0x0E, 0x1F, 0x1F, +0x1C, 0x1C, 0x1E, 0x0F, 0x0F, 0x03, +0x1D, 0x0E, 0x07, 0x03, 0x01, 0x00, +0x00, 0x0E, 0x1F, 0x1F, 0x1D, 0x1E, +0x0F, 0x07, 0x03, 0x03, 0x0F, 0x1F, +0x1F, 0x19, 0x19, 0x19, 0x19, 0x0C, +0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; +#endif // FONT5X7_H diff --git a/keyboards/crkbd/keymaps/drashna/keymap.c b/keyboards/crkbd/keymaps/drashna/keymap.c new file mode 100644 index 000000000000..7bced8de3399 --- /dev/null +++ b/keyboards/crkbd/keymaps/drashna/keymap.c @@ -0,0 +1,173 @@ +#include QMK_KEYBOARD_H +#include "drashna.h" +#ifdef PROTOCOL_LUFA + #include "lufa.h" + #include "split_util.h" +#endif +#ifdef SSD1306OLED + #include "ssd1306.h" +#endif + +extern keymap_config_t keymap_config; +extern uint8_t is_master; + +#ifdef RGBLIGHT_ENABLE +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; +#endif + +enum crkbd_keycodes { + RGBRST = NEW_SAFE_RANGE +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = LAYOUT_wrapper( + KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, + KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, + KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_MRSF, + LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + ), + [_COLEMAK] = LAYOUT_wrapper( + KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, + KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, + KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_MRSF, + LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + ), + [_DVORAK] = LAYOUT_wrapper( + KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, + KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, + KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_MRSF, + LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + ), + [_WORKMAN] = LAYOUT_wrapper( + KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, + KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, + KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_MRSF, + LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + ), + + [_MODS] = LAYOUT_wrapper( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RSFT, + _______, _______, _______, _______, _______, _______ + ), + + [_LOWER] = LAYOUT_wrapper( + KC_TILD, _________________LOWER_L1__________________, _________________LOWER_R1__________________, KC_BSPC, + KC_F11, _________________LOWER_L2__________________, _________________LOWER_R2__________________, KC_PIPE, + KC_F12, _________________LOWER_L3__________________, _________________LOWER_R3__________________, _______, + _______, _______, _______, _______, _______, _______ + ), + + [_RAISE] = LAYOUT_wrapper( \ + KC_GRV, _________________RAISE_L1__________________, _________________RAISE_R1__________________, KC_BSPC, + _______, _________________RAISE_L2__________________, _________________RAISE_R2__________________, KC_BSLS, + _______, _________________RAISE_L3__________________, _________________RAISE_R3__________________, _______, + _______, _______, _______, _______, _______, _______ //`--------------------' `--------------------' + ), + + [_ADJUST] = LAYOUT_wrapper( \ + KC_MAKE, _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, KC_RESET, + VRSN, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, EPRM, + TG_MODS, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, KC_MPLY, + _______, _______, _______, _______, _______, _______ + ) +}; + +int RGB_current_mode; + +void matrix_init_keymap(void) { + #ifdef RGBLIGHT_ENABLE + RGB_current_mode = rgblight_config.mode; + #endif + //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h + #ifdef SSD1306OLED + iota_gfx_init(!has_usb()); // turns on the display + #endif + + DDRD &= ~(1<<5); + PORTD &= ~(1<<5); + + DDRB &= ~(1<<0); + PORTB &= ~(1<<0);} + +//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h +#ifdef SSD1306OLED + +// When add source files to SRC in rules.mk, you can use functions. +const char *read_layer_state(void); +const char *read_logo(void); +void set_keylog(uint16_t keycode, keyrecord_t *record); +const char *read_keylog(void); +const char *read_keylogs(void); + +// const char *read_mode_icon(bool swap); +// const char *read_host_led_state(void); +// void set_timelog(void); +// const char *read_timelog(void); + +void matrix_scan_keymap(void) { + iota_gfx_task(); +} + +void matrix_render_user(struct CharacterMatrix *matrix) { + if (is_master) { + // If you want to change the display of OLED, you need to change here + matrix_write_ln(matrix, read_layer_state()); + matrix_write_ln(matrix, read_keylog()); + matrix_write_ln(matrix, read_keylogs()); + //matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui)); + //matrix_write_ln(matrix, read_host_led_state()); + //matrix_write_ln(matrix, read_timelog()); + } else { + matrix_write(matrix, read_logo()); + } +} + +void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) { + if (memcmp(dest->display, source->display, sizeof(dest->display))) { + memcpy(dest->display, source->display, sizeof(dest->display)); + dest->dirty = true; + } +} + +void iota_gfx_task_user(void) { + struct CharacterMatrix matrix; + matrix_clear(&matrix); + matrix_render_user(&matrix); + matrix_update(&display, &matrix); +} + +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + set_keylog(keycode, record); + // set_timelog(); + } + + switch (keycode) { + case RGB_MOD: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + rgblight_mode_noeeprom(RGB_current_mode); + rgblight_step(); + RGB_current_mode = rgblight_config.mode; + } + #endif + return false; + break; + case RGBRST: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + eeconfig_update_rgblight_default(); + rgblight_enable(); + RGB_current_mode = rgblight_config.mode; + } + #endif + break; + } + return true; +} + +#endif diff --git a/keyboards/crkbd/keymaps/drashna/rules.mk b/keyboards/crkbd/keymaps/drashna/rules.mk new file mode 100644 index 000000000000..f490aa2ea84f --- /dev/null +++ b/keyboards/crkbd/keymaps/drashna/rules.mk @@ -0,0 +1,30 @@ + +# 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 +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. +SWAP_HANDS_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 + +# If you want to change the display of OLED, you need to change here +SRC += ./lib/rgb_state_reader.c \ + ./lib/layer_state_reader.c \ + ./lib/logo_reader.c \ + ./lib/keylogger.c \ + # ./lib/mode_icon_reader.c \ + # ./lib/host_led_state_reader.c \ + # ./lib/timelogger.c \ diff --git a/layouts/community/ergodox/drashna/keymap.c b/layouts/community/ergodox/drashna/keymap.c index 4d7700f1997f..15153c46927e 100644 --- a/layouts/community/ergodox/drashna/keymap.c +++ b/layouts/community/ergodox/drashna/keymap.c @@ -57,11 +57,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_QWERTY] = LAYOUT_ergodox_pretty_wrapper( // left hand // right hand - KC_EQL, ________________NUMBER_LEFT________________, _______, _______, ________________NUMBER_RIGHT_______________, KC_MINS, + KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, KC_TAB, _________________QWERTY_L1_________________, TG(_DIABLO), TG(_DIABLO), _________________QWERTY_R1_________________, KC_BSLS, KC_C1R3, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, KC_MLSF, _________________QWERTY_L3_________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________QWERTY_R3_________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, KC_NO, + KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, UC_IRNY, __________________ERGODOX_THUMB_CLUSTER_____________________ ), /* Keymap 0: COLEMAK layer @@ -89,11 +89,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Otherwise, it needs KC_* [_COLEMAK] = LAYOUT_ergodox_pretty_wrapper( // left hand // right hand - KC_EQL, ________________NUMBER_LEFT________________, _______, _______, ________________NUMBER_RIGHT_______________, KC_MINS, + KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, KC_TAB, _________________COLEMAK_L1________________, TG(_DIABLO), TG(_DIABLO), _________________COLEMAK_R1________________, KC_BSLS, KC_C1R3, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_QUOT, KC_MLSF, _________________COLEMAK_L3________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________COLEMAK_R3________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, KC_NO, + KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, UC_IRNY, __________________ERGODOX_THUMB_CLUSTER_____________________ ), /* Keymap 0: DVORAK Layout @@ -121,11 +121,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Otherwise, it needs KC_* [_DVORAK] = LAYOUT_ergodox_pretty_wrapper( // left hand // right hand - KC_EQL, ________________NUMBER_LEFT________________, _______, _______, ________________NUMBER_RIGHT_______________, KC_BSLS, + KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_BSLS, KC_TAB, _________________DVORAK_L1_________________, TG(_DIABLO), TG(_DIABLO), _________________DVORAK_R1_________________, KC_SLSH, KC_C1R3, _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, KC_MINS, KC_MLSF, _________________DVORAK_L3_________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________DVORAK_R3_________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, KC_NO, + KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, UC_IRNY, __________________ERGODOX_THUMB_CLUSTER_____________________ ), /* Keymap 0: WORKMAN layer @@ -153,11 +153,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Otherwise, it needs KC_* [_WORKMAN] = LAYOUT_ergodox_pretty_wrapper( // left hand - KC_EQL, ________________NUMBER_LEFT________________, _______, _______, ________________NUMBER_RIGHT_______________, KC_MINS, + KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, KC_TAB, _________________WORKMAN_L1________________, TG(_DIABLO), TG(_DIABLO), _________________WORKMAN_R1________________, KC_BSLS, KC_C1R3, _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, KC_QUOT, KC_MLSF, _________________WORKMAN_L3________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________WORKMAN_R3________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, KC_NO, + KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, UC_IRNY, __________________ERGODOX_THUMB_CLUSTER_____________________ ), @@ -197,7 +197,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_GAMEPAD] = LAYOUT_ergodox_pretty_wrapper( KC_ESC, KC_NO, KC_1, KC_2, KC_3, HYPR(KC_Q), HYPR(KC_GRV), KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO, - KC_F1, KC_K, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_F1, KC_K, KC_Q, KC_W, KC_E, KC_R, KC_T, UC_SHRG, UC_DISA, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TAB, KC_G, KC_A, KC_S, KC_D, KC_F, KC_I, KC_O, KC_NO, KC_NO, KC_NO, KC_NO, KC_LCTL, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_TRNS, TG(_GAMEPAD), KC_N, KC_M, KC_NO, KC_NO, KC_NO, KC_NO, KC_GRV, KC_U, KC_I, KC_Y, KC_T, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO, diff --git a/layouts/community/ergodox/drashna/rules.mk b/layouts/community/ergodox/drashna/rules.mk index 30d513c911cb..8bf53950e479 100644 --- a/layouts/community/ergodox/drashna/rules.mk +++ b/layouts/community/ergodox/drashna/rules.mk @@ -8,8 +8,8 @@ endif CONSOLE_ENABLE = no BOOTMAGIC_ENABLE = yes -UNICODE_ENABLE = no -UNICDOEMAP_ENABLE = yes +UNICODE_ENABLE = yes +UNICDOEMAP_ENABLE = no MACROS_ENABLED = no RGBLIGHT_TWINKLE = no diff --git a/users/drashna/config.h b/users/drashna/config.h index 92efcc5c741f..3ddec93b13c7 100644 --- a/users/drashna/config.h +++ b/users/drashna/config.h @@ -55,7 +55,11 @@ #ifdef TAPPING_TERM #undef TAPPING_TERM #endif // TAPPING_TERM -#define TAPPING_TERM 175 +#ifdef KEYBOARD_ergodox_ez + #define TAPPING_TERM 185 +#else + #define TAPPING_TERM 175 +#endif // Disable action_get_macro and fn_actions, since we don't use these @@ -63,4 +67,8 @@ #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION +#define DISABLE_LEADER + #define MACRO_TIMER 5 + + diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 9489fb456776..aad9fab611bc 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -21,6 +21,7 @@ along with this program. If not, see . userspace_config_t userspace_config; +uint16_t copy_paste_timer; // Helper Functions @@ -131,7 +132,7 @@ void led_set_keymap(uint8_t usb_led) {} // Call user matrix init, set default RGB colors and then // call the keymap's init function void matrix_init_user(void) { - userspace_config.raw = eeprom_read_byte(EECONFIG_USERSPACE); + userspace_config.raw = eeprom_read_dword(EECONFIG_USERSPACE); #ifdef BOOTLOADER_CATERINA @@ -143,7 +144,9 @@ void matrix_init_user(void) { #endif #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) - set_unicode_input_mode(UC_WINC); + if (eeprom_read_byte(EECONFIG_UNICODEMODE) != UC_WIN) { + set_unicode_input_mode(UC_WIN); + } #endif //UNICODE_ENABLE matrix_init_keymap(); } @@ -173,17 +176,12 @@ void shutdown_user (void) { shutdown_keymap(); } -void suspend_power_down_user(void) -{ +void suspend_power_down_user(void) { suspend_power_down_keymap(); } -void suspend_wakeup_init_user(void) -{ +void suspend_wakeup_init_user(void) { suspend_wakeup_init_keymap(); - #ifdef KEYBOARD_ergodox_ez - wait_ms(10); - #endif } @@ -216,7 +214,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { // If console is enabled, it will print the matrix position and status of each key pressed #ifdef KEYLOGGER_ENABLE - xprintf("KL: row: %u, column: %u, pressed: %u\n", record->event.key.col, record->event.key.row, record->event.pressed); + #if defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_iris_rev2) + xprintf("KL: col: %u, row: %u, pressed: %u\n", record->event.key.row, record->event.key.col, record->event.pressed); + #else + xprintf("KL: col: %u, row: %u, pressed: %u\n", record->event.key.col, record->event.key.row, record->event.pressed); + #endif #endif //KEYLOGGER_ENABLE switch (keycode) { @@ -249,7 +251,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader if (!record->event.pressed) { send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP -#if (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU)) +#if defined(__ARM__) + ":dfu-util" +#elif defined(BOOTLOADER_DFU) ":dfu" #elif defined(BOOTLOADER_HALFKAY) ":teensy" @@ -291,7 +295,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { // to save on firmware space, since it's limited. #ifdef MACROS_ENABLED case KC_OVERWATCH: // Toggle's if we hit "ENTER" or "BACKSPACE" to input macros - if (record->event.pressed) { userspace_config.is_overwatch ^= 1; eeprom_update_byte(EECONFIG_USERSPACE, userspace_config.raw); } + if (record->event.pressed) { userspace_config.is_overwatch ^= 1; eeprom_update_dword(EECONFIG_USERSPACE, userspace_config.raw); } #ifdef RGBLIGHT_ENABLE userspace_config.is_overwatch ? rgblight_mode_noeeprom(17) : rgblight_mode_noeeprom(18); #endif //RGBLIGHT_ENABLE @@ -342,45 +346,40 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_LCTL); tap(KC_C); unregister_code(KC_LCTL); -#ifdef AUDIO_ENABLE - PLAY_SONG(tone_copy); -#endif } else { // Tap, paste register_code(KC_LCTL); tap(KC_V); unregister_code(KC_LCTL); -#ifdef AUDIO_ENABLE - PLAY_SONG(tone_paste); -#endif } } return false; break; #ifdef UNICODE_ENABLE - case UC_FLIP: // (╯°□°)╯ ︵ ┻━┻ + case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻ 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 + send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B"); } return false; break; -#endif // UNICODE_ENABLE - + case UC_TABL: // ┬─┬ノ( º _ ºノ) + if (record->event.pressed) { + send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029"); + } + return false; + break; + case UC_SHRG: // ¯\_(ツ)_/¯ + if (record->event.pressed) { + send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); + } + return false; + break; + case UC_DISA: // ಠ_ಠ + if (record->event.pressed) { + send_unicode_hex_string("0CA0 005F 0CA0"); + } + return false; + break; +#endif } return process_record_keymap(keycode, record) && #ifdef RGBLIGHT_ENABLE diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h index de8c3ba9470a..49e3fc870bfe 100644 --- a/users/drashna/drashna.h +++ b/users/drashna/drashna.h @@ -19,9 +19,13 @@ along with this program. If not, see . #include "quantum.h" #include "version.h" #include "eeprom.h" +#include "send_unicode.h" + #ifdef RGB_MATRIX_ENABLE #include "rgb_matrix.h" #endif + + // Define layer names enum userspace_layers { _QWERTY = 0, @@ -59,19 +63,26 @@ inline void tap(uint16_t keycode){ register_code(keycode); unregister_code(keyco bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed); bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer); -#define EECONFIG_USERSPACE (uint8_t *)19 +#define EECONFIG_USERSPACE (uint32_t *)19 typedef union { - uint8_t raw; + uint32_t raw; struct { bool rgb_layer_change :1; bool is_overwatch :1; bool nuke_switch :1; + uint8_t unicode_mod :4; }; } userspace_config_t; +#if defined(KEYMAP_SAFE_RANGE) + #define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE +#else + #define PLACEHOLDER_SAFE_RANGE SAFE_RANGE +#endif + enum userspace_custom_keycodes { - EPRM = SAFE_RANGE, // Resets EEPROM do defaults (as in eeconfig_init) + EPRM = PLACEHOLDER_SAFE_RANGE, // Resets EEPROM do defaults (as in eeconfig_init) VRSN, // Prints QMK Firmware and board info KC_QWERTY, // Sets default layer to QWERTY KC_COLEMAK, // Sets default layer to COLEMAK @@ -99,13 +110,14 @@ enum userspace_custom_keycodes { KC_SECRET_5, // test5 KC_CCCV, // Hold to copy, tap to paste KC_NUKE, // NUCLEAR LAUNCH DETECTED!!! - -#ifdef UNICODE_ENABLE - UC_FLIP, // Table flip (not working?) -#endif //UNICODE_ENABLE + UC_FLIP, // (ಠ痊ಠ)┻━┻ + UC_TABL, // ┬─┬ノ( º _ ºノ) + UC_SHRG, // ¯\_(ツ)_/¯ + UC_DISA, // ಠ_ಠ NEW_SAFE_RANGE //use "NEWPLACEHOLDER for keymap specific codes }; + #define LOWER MO(_LOWER) #define RAISE MO(_RAISE) #define ADJUST MO(_ADJUST) @@ -153,6 +165,8 @@ enum userspace_custom_keycodes { #define MG_NKRO MAGIC_TOGGLE_NKRO +#define UC_IRNY UC(0x2E2E) +#define UC_CLUE UC(0x203D) #ifdef TAP_DANCE_ENABLE enum { diff --git a/users/drashna/rgb_stuff.c b/users/drashna/rgb_stuff.c index 03c55b132366..4a1a8de69293 100644 --- a/users/drashna/rgb_stuff.c +++ b/users/drashna/rgb_stuff.c @@ -230,7 +230,7 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { userspace_config.rgb_layer_change ^= 1; xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); - eeprom_update_byte(EECONFIG_USERSPACE, userspace_config.raw); + eeprom_update_dword(EECONFIG_USERSPACE, userspace_config.raw); if (userspace_config.rgb_layer_change) { layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better) } @@ -243,7 +243,7 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { if (userspace_config.rgb_layer_change) { userspace_config.rgb_layer_change = false; xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); - eeprom_update_byte(EECONFIG_USERSPACE, userspace_config.raw); + eeprom_update_dword(EECONFIG_USERSPACE, userspace_config.raw); } } return true; break; @@ -273,6 +273,7 @@ void matrix_init_rgb(void) { default: rgblight_sethsv_noeeprom_cyan(); break; } + rgblight_mode_noeeprom(1); } } diff --git a/users/drashna/rules.mk b/users/drashna/rules.mk index e299f24a1ed8..3d6213eff256 100644 --- a/users/drashna/rules.mk +++ b/users/drashna/rules.mk @@ -1,4 +1,3 @@ - SRC += drashna.c ifneq ("$(wildcard $(USER_PATH)/secrets.c)","") @@ -9,7 +8,7 @@ ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) SRC += tap_dances.c endif -EXTRAFLAGS += -flto +EXTRAFLAGS += -flto ifeq ($(strip $(NO_SECRETS)), yes) OPT_DEFS += -DNO_SECRETS @@ -37,3 +36,7 @@ ifdef CONSOLE_ENABLE OPT_DEFS += -DKEYLOGGER_ENABLE endif endif + +ifeq ($(strip $(UNICODE_ENABLE)), yes) + SRC += send_unicode.c +endif diff --git a/users/drashna/send_unicode.c b/users/drashna/send_unicode.c new file mode 100644 index 000000000000..cacfe1dc8524 --- /dev/null +++ b/users/drashna/send_unicode.c @@ -0,0 +1,58 @@ +// Written by konstantin: vomindoraan +#include "send_unicode.h" +#include +#include + +__attribute__((weak)) +void send_unicode_hex_string(const char* str) { + if (!str) { return; } // Safety net + + while (*str) { + // Find the next code point (token) in the string + for (; *str == ' '; str++); + size_t n = strcspn(str, " "); // Length of the current token + char code_point[n+1]; + strncpy(code_point, str, n); + code_point[n] = '\0'; // Make sure it's null-terminated + + // Normalize the code point: make all hex digits lowercase + for (char *p = code_point; *p; p++) { + *p = tolower((unsigned char)*p); + } + + // Send the code point as a Unicode input string + unicode_input_start(); + send_string(code_point); + unicode_input_finish(); + + str += n; // Move to the first ' ' (or '\0') after the current token + } +} + +// (ノಠ痊ಠ)ノ彡┻━┻ +// send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B"); + +//Old code +// (╯°□°)╯ ︵ ┻━┻ + #if 0 + 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 + #endif + + +// If you need a good converter: https://r12a.github.io/app-conversion/ diff --git a/users/drashna/drashna_unicode.h b/users/drashna/send_unicode.h similarity index 90% rename from users/drashna/drashna_unicode.h rename to users/drashna/send_unicode.h index 3d1bc03f9b60..818b6e571b21 100644 --- a/users/drashna/drashna_unicode.h +++ b/users/drashna/send_unicode.h @@ -1,10 +1,11 @@ -#ifndef UNICODE_USERSPACE_H -#define UNICODE_USERSPACE_H +#pragma once +#include "quantum.h" +void send_unicode_hex_string(const char* str); /* use X(n) to call the */ - +#ifdef UNICODEMAP_ENABLE enum unicode_name { THINK, // thinking face 🤔 GRIN, // grinning face 😊 @@ -67,5 +68,4 @@ const uint32_t PROGMEM unicode_map[] = { [IRONY] = 0x02E2E, [DEGREE] = 0x000B0 }; - - #endif +#endif // UNICODEMAP_ENABLE From 713ec91147aa56849f9e2ff93ee98ef1eb6eebc0 Mon Sep 17 00:00:00 2001 From: Yan-Fa Li Date: Mon, 1 Oct 2018 19:50:14 -0700 Subject: [PATCH 107/505] Add C hint to inline code --- docs/custom_quantum_functions.md | 38 ++++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/custom_quantum_functions.md b/docs/custom_quantum_functions.md index f8b84cd6b360..b077e4b78d8d 100644 --- a/docs/custom_quantum_functions.md +++ b/docs/custom_quantum_functions.md @@ -27,7 +27,7 @@ The first step to creating your own custom keycode(s) is to enumerate them. This Here is an example of enumerating 2 keycodes. After adding this block to your `keymap.c` you will be able to use `FOO` and `BAR` inside your keymap. -``` +```c enum my_keycodes { FOO = SAFE_RANGE, BAR @@ -44,7 +44,7 @@ These function are called every time a key is pressed or released. This example does two things. It defines the behavior for a custom keycode called `FOO`, and it supplements our Enter key by playing a tone whenever it is pressed. -``` +```c bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case FOO: @@ -75,16 +75,16 @@ The `keycode` argument is whatever is defined in your keymap, eg `MO(1)`, `KC_L` The `record` argument contains information about the actual press: -``` +```c keyrecord_t record { -+-keyevent_t event { -| +-keypos_t key { -| | +-uint8_t col -| | +-uint8_t row -| | } -| +-bool pressed -| +-uint16_t time -| } + keyevent_t event { + keypos_t key { + uint8_t col + uint8_t row + } + bool pressed + uint16_t time + } } ``` @@ -100,7 +100,7 @@ This allows you to control the 5 LED's defined as part of the USB Keyboard spec. ### Example `led_set_user()` Implementation -``` +```c void led_set_user(uint8_t usb_led) { if (usb_led & (1< Date: Mon, 1 Oct 2018 20:35:09 -0700 Subject: [PATCH 108/505] Keyboard: DZ60 cleanup (#3994) * DZ60: Deleted K214 from LAYOUT_all * DZ60: Delete matrix LAYOUT_2_shifts; replace with LAYOUT_all After the deletion of K214 from LAYOUT_all, LAYOUT_all and LAYOUT_2_shifts are identical. Deprecated LAYOUT_2_shifts in favor of LAYOUT_all. * DZ60: refactor 256k_HHKB and itsaferbie keymaps to use LAYOUT_60_hhkb macro Both keymaps previously used the LAYOUT_hhkb macro. After comparing the macros, the only difference between them was that LAYOUT_hhkb included the place of the ISO Backslash key. Neither keymap used this key, so both were refactored to use LAYOUT_60_hhkb instead. LAYOUT_hhkb is now essentially unused by any keymaps in the repo. (More on that in a moment.) * DZ60: bugfix for dbroqua keymap This keymap had two layers that used the LAYOUT_true_hhkb macro and a third that used LAYOUT_hhkb. These macros have the same number of keys, but represent different physical layouts. As the "main" layers used LAYOUT_true_hhkb, switched the third layer to LAYOUT_true_hhkb as well. The LAYOUT_hhkb macro is now unused by any DZ60 keymaps in the repo, and can be safely deleted. * DZ60: bugfix for 60_ansi_arrow_fkeys, 60_plus_arrows, and stephengrier keymaps All three keymaps had one layer in LAYOUT_all and one in LAYOUT_directional. Only difference between these macros is LAYOUT_all excludes the ISO Backslash position. As none of the keymaps used this position, all layers were switched to use LAYOUT_directional. * DZ60: added layout mock-ups to dz60.h Documenting the physical layouts that go with each matrix. * DZ60: replace TMK SHIFT_ESC with QMK Grave Escape Replaced all instances of keycodes that called TMK's ACTION_FUNCTION(SHIFT_ESC) with QMK's KC_GESC, and added config.h files so KC_GESC behaves as the deprecated TMK function did, except for the default keymap, which I thought should have the QMK standard behavior. * DZ60: delete SHIFT_ESC code blocks Deleted ACTION_FUNCTION(SHIFT_ESC) code blocks from keymaps that didn't use the functionality it provided. * DZ60: deleted unused MODS_CTRL_MASk definitions Was used in the now-deleted SHIFT_ESC code blocks. Interestingly named MODS_CTRL_MASK when it was actually checking the Shift keys. *shrug* * DZ60: refactor jkbone keymap to use process_record_user Replaced TMK action_function keycodes with QMK process_record_user equivalents. * DZ60: delete unused layout macros The macros LAYOUT_hhkb, LAYOUT_directional_625_space, and LAYOUT_60_ansi_split_bs_rshift_5x1u were unused by any keymaps in the repo, and have thus been deleted. * DZ60: refactor iso_6u_space and iso_7u_space keymaps Both keymaps refactored to use the LAYOUT_60_iso macro. * DZ60: refactor dz60.h Updated the notation of the switch arguments. Format is now: `k` where `` is `[0-4]` and `` is `[0-9a-e]`. * DZ60: refactor LAYOUT_60_iso_5x1u matrix Updated matrix so `KC_ENT` belongs on the home row, which is consistent with LAYOUT_60_iso for the DZ60 as well as the ISO community layouts. * DZ60: fix white space in dz60.h I hate when indentation is inconsistent within a file. --- keyboards/dz60/dz60.h | 320 ++++++++++-------- keyboards/dz60/info.json | 22 +- keyboards/dz60/keymaps/256k_HHKB/keymap.c | 20 +- .../dz60/keymaps/60_ansi_arrow_fkeys/config.h | 1 + .../dz60/keymaps/60_ansi_arrow_fkeys/keymap.c | 42 +-- .../dz60/keymaps/60_plus_arrows/keymap.c | 40 +-- .../dz60/keymaps/Ansi_plus_fn_arrows/config.h | 1 + .../dz60/keymaps/Ansi_plus_fn_arrows/keymap.c | 38 +-- keyboards/dz60/keymaps/dbroqua/keymap.c | 2 +- keyboards/dz60/keymaps/default/keymap.c | 38 +-- keyboards/dz60/keymaps/eric/keymap.c | 36 -- keyboards/dz60/keymaps/f3d3/keymap.c | 40 +-- keyboards/dz60/keymaps/frogger/keymap.c | 8 +- keyboards/dz60/keymaps/hailbreno/keymap.c | 16 +- keyboards/dz60/keymaps/iso_6u_space/keymap.c | 106 +++--- keyboards/dz60/keymaps/iso_7u_space/keymap.c | 109 +++--- keyboards/dz60/keymaps/iso_uk/keymap.c | 36 -- keyboards/dz60/keymaps/iso_vim_arrow/keymap.c | 44 +-- keyboards/dz60/keymaps/itsaferbie/keymap.c | 12 +- keyboards/dz60/keymaps/jkbone/keymap.c | 53 ++- keyboards/dz60/keymaps/krusli/keymap.c | 1 - keyboards/dz60/keymaps/macos_arrow/keymap.c | 8 +- keyboards/dz60/keymaps/stephengrier/config.h | 1 + keyboards/dz60/keymaps/stephengrier/keymap.c | 42 +-- keyboards/dz60/keymaps/weeheavy/keymap.c | 6 +- 25 files changed, 343 insertions(+), 699 deletions(-) create mode 100644 keyboards/dz60/keymaps/60_ansi_arrow_fkeys/config.h create mode 100644 keyboards/dz60/keymaps/Ansi_plus_fn_arrows/config.h create mode 100644 keyboards/dz60/keymaps/stephengrier/config.h diff --git a/keyboards/dz60/dz60.h b/keyboards/dz60/dz60.h index 3d0b0dd527da..6d80b2c7cb98 100644 --- a/keyboards/dz60/dz60.h +++ b/keyboards/dz60/dz60.h @@ -7,173 +7,221 @@ // 标准配列 +/* Standard arrangement / LAYOUT + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ + * │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │3e │ + * ├────┼───┴┬──┴─┬─┴───┴──┬┴───┼───┴───┴──┬┴──┬┴──┬┴──┬───┼───┤ + * │40 │41 │43 │44 │46 │48 │4a │4b │4c │4d │4e │ + * └────┴────┴────┴────────┴────┴──────────┴───┴───┴───┴───┴───┘ +*/ #define LAYOUT( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \ - K400, K401, K403, K404, K406, K408, K410, K411, K412, K413, K414 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, k3e, \ + k40, k41, k43, k44, k46, k48, k4a, k4b, k4c, k4d, k4e \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \ - { K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, K412, K413, K414 } \ -} - -#define LAYOUT_hhkb( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \ - K401, K403, K406, K411, K413 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \ - { KC_NO, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, KC_NO, K411, KC_NO, K413, KC_NO } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, k3e }, \ + { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \ } +/* LAYOUT_true_hhkb + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ + * │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │3e │ + * ├────┴┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴──┬┴───┴┬──┴┬─────┴───┤ + * │▓▓▓▓▓│41 │43 │46 (6u) │4a │4b │▓▓▓▓▓▓▓▓▓│ + * └─────┴───┴─────┴───────────────────────┴─────┴───┴─────────┘ +*/ #define LAYOUT_true_hhkb( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \ - K401, K403, K406, K410, K411 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, k3e, \ + k41, k43, k46, k4a, k4b \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \ - { KC_NO, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, K410, K411, KC_NO, KC_NO, KC_NO } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, k3e }, \ + { KC_NO, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, KC_NO, KC_NO, KC_NO } \ } +/* LAYOUT_60_hhkb + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ + * │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │3e │ + * ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴──────┬┴───┴┬───┬─┴───┤ + * │▓▓▓▓▓│41 │43 │46 (7u) │4b │4d │▓▓▓▓▓│ + * └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ +*/ #define LAYOUT_60_hhkb( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \ - K401, K403, K406, K411, K413 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \ - { KC_NO, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, KC_NO, K411, KC_NO, K413, KC_NO } \ -} - -#define LAYOUT_2_shifts( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \ - K400, K401, K403, K404, K406, K408, K410, K411, K412, K413, K414 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, k3e, \ + k41, k43, k46, k4b, k4d \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \ - { K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, K412, K413, K414 } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, k3e }, \ + { KC_NO, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, KC_NO, k4b, KC_NO, k4d, KC_NO } \ } // 带方向配列 +/* Directional arrangement | LAYOUT_directional + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├──────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬───┬───┤ + * │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3c │3d │3e │ + * ├────┬──┴─┬─┴──┬┴───┴───┼───┴┬──┴───┴───┼───┼───┼───┼───┼───┤ + * │40 │41 │43 │44 │46 │48 │4a │4b │4c │4d │4e │ + * └────┴────┴────┴────────┴────┴──────────┴───┴───┴───┴───┴───┘ +*/ #define LAYOUT_directional( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \ - K400, K401, K403, K404, K406, K408, K410, K411, K412, K413, K414 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \ + k40, k41, k43, k44, k46, k48, k4a, k4b, k4c, k4d, k4e \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \ - { K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, K412, K413, K414 } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e }, \ + { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \ } +/* LAYOUT_all + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├───┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬───┬───┤ + * │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3c │3d │3e │ + * ├───┴┬──┴─┬─┴──┬┴───┴───┼───┴┬──┴───┴───┼───┼───┼───┼───┼───┤ + * │40 │41 │43 │44 │46 │48 │4a │4b │4c │4d │4e │ + * └────┴────┴────┴────────┴────┴──────────┴───┴───┴───┴───┴───┘ +*/ #define LAYOUT_all( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \ - K400, K401, K403, K404, K406, K408, K410, K411, K412, K413, K414 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, 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, k3e, \ + k40, k41, k43, k44, k46, k48, k4a, k4b, k4c, k4d, k4e \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214 }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \ - { K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, K412, K413, K414 } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e }, \ + { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \ } +/* LAYOUT_60_ansi + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ + * │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │40 │41 │43 │46 │4a │4b │4d │4e │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ +*/ #define LAYOUT_60_ansi( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ - K400, K401, K403, K406, K410, K411, K413, K414 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, \ + k40, k41, k43, k46, k4a, k4b, k4d, k4e \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, KC_NO, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, KC_NO }, \ - { K400, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, K410, K411, KC_NO, K413, K414 } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, KC_NO, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \ + { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \ } +/* LAYOUT_60_iso + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐2d │ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │1e │ │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ + * │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │ + * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │40 │41 │43 │46 │4a │4b │4d │4e │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ +*/ #define LAYOUT_60_iso( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ - K400, K401, K403, K406, K410, K411, K413, K414 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k1e, k2d, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, \ + k40, k41, k43, k46, k4a, k4b, k4d, k4e \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, KC_NO, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, KC_NO }, \ - { K400, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, K410, K411, KC_NO, K413, K414 } \ -} - -#define LAYOUT_directional_625_space( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, \ - K400, K401, K403, K406, K410, K411, K412, K413, K414 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314 }, \ - { K400, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, K410, K411, K412, K413, K414 } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, KC_NO, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \ + { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \ } +/* LAYOUT_60_iso_5x1u + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐2d │ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │1e │ │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ + * │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │ + * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴──┬┴──┬┴──┬───┬───┤ + * │40 │41 │43 │46 │4a │4b │4c │4d │4e │ + * └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘ +*/ #define LAYOUT_60_iso_5x1u( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K213, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ - K400, K401, K403, K406, K410, K411, K412, K413, K414 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, KC_NO, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, KC_NO }, \ - { K400, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, K410, K411, K412, K413, K414 } \ -} - -#define LAYOUT_60_ansi_split_bs_rshift_5x1u( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, \ - K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \ - K400, K401, K403, K406, K410, K411, K412, K413, K414 \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k1e, k2d, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, \ + k40, k41, k43, k46, k4a, k4b, k4c, k4d, k4e \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \ - { K400, K401, KC_NO, K403, KC_NO, KC_NO, K406, KC_NO, KC_NO, KC_NO, K410, K411, K412, K413, K414 } \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, KC_NO, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \ + { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, k4c, k4d, k4e } \ } #endif diff --git a/keyboards/dz60/info.json b/keyboards/dz60/info.json index 54d6753757f2..4855c3b81aac 100644 --- a/keyboards/dz60/info.json +++ b/keyboards/dz60/info.json @@ -9,25 +9,17 @@ "key_count": 67, "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"~", "x":13, "y":0}, {"label":"Del", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}] }, - "LAYOUT_hhkb": { - "key_count": 61, - "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"~", "x":13, "y":0}, {"label":"Del", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Ctrl", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Alt", "x":1.5, "y":4}, {"x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":6}, {"x":10, "y":4, "w":1.5}, {"label":"Alt", "x":11.5, "y":4}] - }, "LAYOUT_true_hhkb": { "key_count": 61, "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"~", "x":13, "y":0}, {"label":"Del", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Ctrl", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Alt", "x":1.5, "y":4}, {"x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":6}, {"x":10, "y":4, "w":1.5}, {"label":"Alt", "x":11.5, "y":4}] }, - "LAYOUT_2_shifts": { - "key_count": 68, - "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"~", "x":13, "y":0}, {"label":"Del", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3}, {"x":1, "y":3}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"label":"Shift", "x":12, "y":3}, {"x":13, "y":3}, {"label":"Fn", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}] - }, "LAYOUT_directional": { "key_count": 67, "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"~", "x":13, "y":0}, {"label":"Del", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"label":"Shift", "x":12, "y":3}, {"x":13, "y":3}, {"label":"Fn", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}] }, "LAYOUT_all": { - "key_count": 69, - "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":2, "w":1.25}, {"label":"Shift", "x":0, "y":3}, {"x":1, "y":3}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"label":"Shift", "x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}] + "key_count": 68, + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3}, {"x":1, "y":3}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"label":"Shift", "x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}] }, "LAYOUT_60_ansi": { "key_count": 61, @@ -41,17 +33,9 @@ "key_count": 60, "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, {"label":"2", "x":2, "y":0}, {"label":"3", "x":3, "y":0}, {"label":"4", "x":4, "y":0}, {"label":"5", "x":5, "y":0}, {"label":"6", "x":6, "y":0}, {"label":"7", "x":7, "y":0}, {"label":"8", "x":8, "y":0}, {"label":"9", "x":9, "y":0}, {"label":"0", "x":10, "y":0}, {"label":"-", "x":11, "y":0}, {"label":"=", "x":12, "y":0}, {"label":"\\", "x":13, "y":0}, {"label":"`", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"[", "x":11.5, "y":1}, {"label":"]", "x":12.5, "y":1}, {"label":"Backspace", "x":13.5, "y":1, "w":1.5}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":";", "x":10.75, "y":2}, {"label":"'", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":",", "x":9.25, "y":3}, {"label":".", "x":10.25, "y":3}, {"label":"/", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Os", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Os", "x":12.5, "y":4}] }, - "LAYOUT_directional_625_space": { - "key_count": 65, - "layout": [{"label":"K000", "x":0, "y":0}, {"label":"K001", "x":1, "y":0}, {"label":"K002", "x":2, "y":0}, {"label":"K003", "x":3, "y":0}, {"label":"K004", "x":4, "y":0}, {"label":"K005", "x":5, "y":0}, {"label":"K006", "x":6, "y":0}, {"label":"K007", "x":7, "y":0}, {"label":"K008", "x":8, "y":0}, {"label":"K009", "x":9, "y":0}, {"label":"K010", "x":10, "y":0}, {"label":"K011", "x":11, "y":0}, {"label":"K012", "x":12, "y":0}, {"label":"K013", "x":13, "y":0}, {"label":"K014", "x":14, "y":0}, {"label":"K100", "x":0, "y":1, "w":1.5}, {"label":"K102", "x":1.5, "y":1}, {"label":"K103", "x":2.5, "y":1}, {"label":"K104", "x":3.5, "y":1}, {"label":"K105", "x":4.5, "y":1}, {"label":"K106", "x":5.5, "y":1}, {"label":"K107", "x":6.5, "y":1}, {"label":"K108", "x":7.5, "y":1}, {"label":"K109", "x":8.5, "y":1}, {"label":"K110", "x":9.5, "y":1}, {"label":"K111", "x":10.5, "y":1}, {"label":"K112", "x":11.5, "y":1}, {"label":"K113", "x":12.5, "y":1}, {"label":"K114", "x":13.5, "y":1, "w":1.5}, {"label":"K200", "x":0, "y":2, "w":1.75}, {"label":"K202", "x":1.75, "y":2}, {"label":"K203", "x":2.75, "y":2}, {"label":"K204", "x":3.75, "y":2}, {"label":"K205", "x":4.75, "y":2}, {"label":"K206", "x":5.75, "y":2}, {"label":"K207", "x":6.75, "y":2}, {"label":"K208", "x":7.75, "y":2}, {"label":"K209", "x":8.75, "y":2}, {"label":"K210", "x":9.75, "y":2}, {"label":"K211", "x":10.75, "y":2}, {"label":"K212", "x":11.75, "y":2}, {"label":"K213", "x":12.75, "y":2, "w":2.25}, {"label":"K300", "x":0, "y":3, "w":2}, {"label":"K301", "x":2, "y":3}, {"label":"K302", "x":3, "y":3}, {"label":"K303", "x":4, "y":3}, {"label":"K304", "x":5, "y":3}, {"label":"K305", "x":6, "y":3}, {"label":"K306", "x":7, "y":3}, {"label":"K307", "x":8, "y":3}, {"label":"K308", "x":9, "y":3}, {"label":"K309", "x":10, "y":3}, {"label":"K310", "x":11, "y":3}, {"label":"K312", "x":12, "y":3}, {"label":"K313", "x":13, "y":3}, {"label":"K314", "x":14, "y":3}, {"label":"K400", "x":0, "y":4, "w":1.25}, {"label":"K401", "x":1.25, "y":4, "w":1.25}, {"label":"K403", "x":2.5, "y":4, "w":1.25}, {"label":"K406", "x":3.75, "y":4, "w":6.25}, {"label":"K410", "x":10, "y":4}, {"label":"K411", "x":11, "y":4}, {"label":"K412", "x":12, "y":4}, {"label":"K413", "x":13, "y":4}, {"label":"K414", "x":14, "y":4}] - }, "LAYOUT_60_iso_5x1u": { "key_count": 63, - "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"|", "x":12.75, "y":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"~", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"/", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Fn", "x":10, "y":4}, {"label":"←", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"↑", "x":13, "y":4}, {"label":"→", "x":14, "y":4}] - }, - "LAYOUT_60_ansi_split_bs_rshift_5x1u": { - "key_count": 64, - "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, {"label":"2", "x":2, "y":0}, {"label":"3", "x":3, "y":0}, {"label":"4", "x":4, "y":0}, {"label":"5", "x":5, "y":0}, {"label":"6", "x":6, "y":0}, {"label":"7", "x":7, "y":0}, {"label":"8", "x":8, "y":0}, {"label":"9", "x":9, "y":0}, {"label":"0", "x":10, "y":0}, {"label":"-", "x":11, "y":0}, {"label":"=", "x":12, "y":0}, {"label":"\\", "x":13, "y":0}, {"label":"`", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"[", "x":11.5, "y":1}, {"label":"]", "x":12.5, "y":1}, {"label":"Backspace", "x":13.5, "y":1, "w":1.5}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":";", "x":10.75, "y":2}, {"label":"'", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":",", "x":9.25, "y":3}, {"label":".", "x":10.25, "y":3}, {"label":"/", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4}, {"label":"←", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"↑", "x":13, "y":4}, {"label":"→", "x":14, "y":4}] + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"|", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"~", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"/", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Fn", "x":10, "y":4}, {"label":"←", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"↑", "x":13, "y":4}, {"label":"→", "x":14, "y":4}] } } } diff --git a/keyboards/dz60/keymaps/256k_HHKB/keymap.c b/keyboards/dz60/keymaps/256k_HHKB/keymap.c index f426e3d1fb03..1448e4ddce1b 100644 --- a/keyboards/dz60/keymaps/256k_HHKB/keymap.c +++ b/keyboards/dz60/keymaps/256k_HHKB/keymap.c @@ -29,11 +29,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ - [_DEFAULT] = LAYOUT_hhkb( + [_DEFAULT] = LAYOUT_60_hhkb( 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_NO, 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_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, MO(_ALTFN), MO(_LIGHTS)), @@ -55,12 +55,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `---------------------------------------------------------------------------------------------------------------------' */ - [_ALTFN] = LAYOUT_hhkb( + [_ALTFN] = LAYOUT_60_hhkb( MO(_MOUSEFN), 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_CAPS, ______, ______, ______, ______, ______, ______, ______, ______, ______, KC_UP, KC_VOLD, KC_VOLU, KC_DEL, ______, ______, ______, ______, ______, ______, ______, KC_HOME, KC_END, KC_LEFT, KC_DOWN, KC_RIGHT, ______, - ______, ______, ______, ______, ______, ______, ______, ______, ______, KC_MPRV, KC_MNXT, KC_MPLY, ______, ______, + ______, ______, ______, ______, ______, ______, ______, ______, KC_MPRV, KC_MNXT, KC_MPLY, ______, ______, ______, ______, ______, ______, ______), @@ -85,12 +85,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ - [_MOUSEFN] = LAYOUT_hhkb( + [_MOUSEFN] = LAYOUT_60_hhkb( ______, KC_ACL0, KC_ACL1, KC_ACL2, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, KC_MS_UP, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, ______, - ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, + ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______), @@ -116,11 +116,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_FN] = LAYOUT_hhkb( + [_FN] = LAYOUT_60_hhkb( ______, 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_CAPS, ______, ______, ______, ______, ______, ______, ______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, ______, KC_DEL, ______, KC_VOLD, KC_VOLU, KC_MUTE, ______, ______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, ______, - ______, ______, KC_MPRV, KC_MPLY, KC_MNXT, ______, ______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, ______, ______, + ______, KC_MPRV, KC_MPLY, KC_MNXT, ______, ______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, ______, ______, ______, ______, ______, ______, ______), @@ -146,11 +146,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_LIGHTS] = LAYOUT_hhkb( + [_LIGHTS] = LAYOUT_60_hhkb( RGB_TOG, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, ______, ______, ______, ______, ______, ______, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, RGB_HUD, RGB_SAD, RGB_VAD, ______, ______, ______, ______, ______, ______, ______, ______, ______, - ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, + ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______), }; diff --git a/keyboards/dz60/keymaps/60_ansi_arrow_fkeys/config.h b/keyboards/dz60/keymaps/60_ansi_arrow_fkeys/config.h new file mode 100644 index 000000000000..9560d51a6f94 --- /dev/null +++ b/keyboards/dz60/keymaps/60_ansi_arrow_fkeys/config.h @@ -0,0 +1 @@ +#define GRAVE_ESC_GUI_OVERRIDE # Always send Escape if GUI is pressed diff --git a/keyboards/dz60/keymaps/60_ansi_arrow_fkeys/keymap.c b/keyboards/dz60/keymaps/60_ansi_arrow_fkeys/keymap.c index 76804670c879..0d3b653638ed 100644 --- a/keyboards/dz60/keymaps/60_ansi_arrow_fkeys/keymap.c +++ b/keyboards/dz60/keymaps/60_ansi_arrow_fkeys/keymap.c @@ -1,7 +1,5 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - #define ______ KC_TRNS const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -20,11 +18,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------------' */ - LAYOUT_2_shifts( - 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, + LAYOUT_directional( + KC_GESC, 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_UP, KC_DEL, + 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_DEL, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT ), @@ -50,37 +48,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______ ), }; - -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/dz60/keymaps/60_plus_arrows/keymap.c b/keyboards/dz60/keymaps/60_plus_arrows/keymap.c index a4b2dc29e18b..f38cdb285344 100644 --- a/keyboards/dz60/keymaps/60_plus_arrows/keymap.c +++ b/keyboards/dz60/keymaps/60_plus_arrows/keymap.c @@ -1,7 +1,5 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - #define ______ KC_TRNS const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -20,11 +18,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------------' */ - LAYOUT_2_shifts( + LAYOUT_directional( 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_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_UP, MO(1), + 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, MO(1), KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, KC_RALT, KC_LEFT, KC_DOWN, KC_RIGHT ), @@ -50,37 +48,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______ ), }; - -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/dz60/keymaps/Ansi_plus_fn_arrows/config.h b/keyboards/dz60/keymaps/Ansi_plus_fn_arrows/config.h new file mode 100644 index 000000000000..9560d51a6f94 --- /dev/null +++ b/keyboards/dz60/keymaps/Ansi_plus_fn_arrows/config.h @@ -0,0 +1 @@ +#define GRAVE_ESC_GUI_OVERRIDE # Always send Escape if GUI is pressed diff --git a/keyboards/dz60/keymaps/Ansi_plus_fn_arrows/keymap.c b/keyboards/dz60/keymaps/Ansi_plus_fn_arrows/keymap.c index 778a5ac038a2..4c6552675a2b 100644 --- a/keyboards/dz60/keymaps/Ansi_plus_fn_arrows/keymap.c +++ b/keyboards/dz60/keymaps/Ansi_plus_fn_arrows/keymap.c @@ -1,11 +1,9 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT( - 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_NO, KC_BSPC, + KC_GESC, 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_NO, 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_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO, @@ -25,37 +23,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), }; - -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/dz60/keymaps/dbroqua/keymap.c b/keyboards/dz60/keymaps/dbroqua/keymap.c index c6c77210d8cd..0b4deae51e6d 100644 --- a/keyboards/dz60/keymaps/dbroqua/keymap.c +++ b/keyboards/dz60/keymaps/dbroqua/keymap.c @@ -64,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | * `-----------------------------------------------------------------' */ - [_SFX] = LAYOUT_hhkb( + [_SFX] = LAYOUT_true_hhkb( ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \ ______, BL_TOGG,BL_STEP,BL_DEC, BL_INC, ______, ______, ______, ______, ______, ______, ______, ______, ______, \ ______, RGB_TOG,RGB_MOD,______, ______, ______, ______, ______, ______, ______, ______, ______, ______, \ diff --git a/keyboards/dz60/keymaps/default/keymap.c b/keyboards/dz60/keymaps/default/keymap.c index 426b10989d23..1d375a3c63b4 100644 --- a/keyboards/dz60/keymaps/default/keymap.c +++ b/keyboards/dz60/keymaps/default/keymap.c @@ -1,11 +1,9 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT( - 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_NO, KC_BSPC, + KC_GESC, 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_NO, 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_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO, @@ -25,37 +23,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), }; - -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/dz60/keymaps/eric/keymap.c b/keyboards/dz60/keymaps/eric/keymap.c index d2cabebe74bc..a384de480c25 100644 --- a/keyboards/dz60/keymaps/eric/keymap.c +++ b/keyboards/dz60/keymaps/eric/keymap.c @@ -1,7 +1,5 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 0 @@ -56,37 +54,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), }; - -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/dz60/keymaps/f3d3/keymap.c b/keyboards/dz60/keymaps/f3d3/keymap.c index 85bb05a1d438..1e92aabc187c 100644 --- a/keyboards/dz60/keymaps/f3d3/keymap.c +++ b/keyboards/dz60/keymaps/f3d3/keymap.c @@ -1,7 +1,5 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Layer 0 @@ -18,7 +16,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------------' */ - LAYOUT_2_shifts( + LAYOUT_all( 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_GRV, 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, @@ -42,44 +40,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ - LAYOUT_2_shifts( + LAYOUT_all( 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_TRNS, KC_DEL, 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, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BL_TOGG, BL_DEC, BL_INC, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MSTP, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT), }; - -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/dz60/keymaps/frogger/keymap.c b/keyboards/dz60/keymaps/frogger/keymap.c index 86a4687913ed..75e805cd9144 100644 --- a/keyboards/dz60/keymaps/frogger/keymap.c +++ b/keyboards/dz60/keymaps/frogger/keymap.c @@ -1,7 +1,5 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - #define ______ KC_TRNS #define LAYER_1 1 @@ -24,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------------' */ - LAYOUT_2_shifts( + LAYOUT_all( KC_GRAVE, 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, @@ -52,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_MPRV, KC_MPLY, KC_MNXT, */ - LAYOUT_2_shifts( + LAYOUT_all( 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_DEL, ______, KC_MPRV, KC_MPLY, KC_MNXT, ______, ______, ______, ______, KC_UP, ______, ______, ______, ______, ______, @@ -78,7 +76,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------------' */ - LAYOUT_2_shifts( + LAYOUT_all( RESET, 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, ______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, ______, ______, ______, ______, ______, diff --git a/keyboards/dz60/keymaps/hailbreno/keymap.c b/keyboards/dz60/keymaps/hailbreno/keymap.c index cc718c3935c0..edc22a5a2454 100644 --- a/keyboards/dz60/keymaps/hailbreno/keymap.c +++ b/keyboards/dz60/keymaps/hailbreno/keymap.c @@ -44,7 +44,7 @@ enum keycodes { * | | | | | | | | | | | | * `-----------------------------------------------------------------------------------------' - [LAYOUT] = LAYOUT_2_shifts( + [LAYOUT] = LAYOUT_all( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -67,7 +67,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | Alt | Gui | Backspace | Fn2 | Space | Alt | App | Left| Down|Right| * `-----------------------------------------------------------------------------------------' */ -[_QWERTY] = LAYOUT_2_shifts( +[_QWERTY] = LAYOUT_all( 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_DEL, LT(_FUNC,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, @@ -87,7 +87,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | Alt | Gui | Backspace | Fn2 | Space | Alt | App | Left| Down|Right| * `-----------------------------------------------------------------------------------------' */ -[_COLEMAK] = LAYOUT_2_shifts( +[_COLEMAK] = LAYOUT_all( 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_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_DEL, LT(_FUNC,KC_CAPS), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, @@ -107,7 +107,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | Alt | Gui | Backspace | Fn2 | Space | Alt | App | Left| Down|Right| * `-----------------------------------------------------------------------------------------' */ -[_DVORAK] = LAYOUT_2_shifts( +[_DVORAK] = LAYOUT_all( KC_ESC, 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_BSLS, KC_GRV, KC_TAB, KC_QUOTE, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_DEL, LT(_FUNC,KC_CAPS), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, @@ -127,7 +127,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | Home| PgDn| End | * `-----------------------------------------------------------------------------------------' */ -[_FUNC] = LAYOUT_2_shifts( +[_FUNC] = LAYOUT_all( _______, 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_INS, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_UP, KC_PGDN, KC_CIRC, _______, _______, KC_BSPC, _______, _______, _______, _______, _______, _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, _______, KC_TILD, _______, @@ -147,7 +147,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | * `-----------------------------------------------------------------------------------------' */ -[_FUNC2] = LAYOUT_2_shifts( +[_FUNC2] = LAYOUT_all( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -167,7 +167,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | * `-----------------------------------------------------------------------------------------' */ -[_RGB] = LAYOUT_2_shifts( +[_RGB] = LAYOUT_all( _______, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_VAD, RGB_HUI, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -187,7 +187,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | |Qwerty|Colemk|Dvorak| * `-----------------------------------------------------------------------------------------' */ -[_ADJUST] = LAYOUT_2_shifts( +[_ADJUST] = LAYOUT_all( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/dz60/keymaps/iso_6u_space/keymap.c b/keyboards/dz60/keymaps/iso_6u_space/keymap.c index 15ad72f3e426..e0085b490402 100644 --- a/keyboards/dz60/keymaps/iso_6u_space/keymap.c +++ b/keyboards/dz60/keymaps/iso_6u_space/keymap.c @@ -1,74 +1,44 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * _______ can be used in place of KC_TRNS (transparent) * + * XXXXXXX can be used in place of KC_NO (No Operation) * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* ISO 6u layout layer 0 -* ,-----------------------------------------------------------------------------------------. -* | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ß | ´ | BSPC | -* |-----------------------------------------------------------------------------------------+ -* | Tab | Q | W | E | R | T | Z | U | I | O | P | P | Ü | * | | -* |-------------------------------------------------------------------------------------| + -* | Layer_1 | A | S | D | F | G | H | J | K | L | Ö | Ä | # |Enter | -* |-----------------------------------------------------------------------------------------+ -* | Shift| < | Y | X | C | V | B | N | M | , | . | . | - | RShift | -* |-----------------------------------------------------------------------------------------+ -* | LCtrl | LGUI | LAlt | Space | RAlt | RGUI | Layer_2 | RCtrl | -* `-----------------------------------------------------------------------------------------' -*/ - LAYOUT( - 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_NO, 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(1), 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_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT,KC_RGUI, KC_NO, MO(2), KC_RCTL), + /* ISO 6u layout layer 0 (UK Layout shown) + * ,-----------------------------------------------------------. + * |Esc|1 !|2 "|3 £|4 $|5 %|6 ^|7 &|8 *|9 (|0 )|- _|= +| Bksp | + * |-----------------------------------------------------------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P |[ {|] }|Enter| + * |------------------------------------------------------. | + * | Fn1 | A | S | D | F | G | H | J | K | L |; :|' @|# ~| | + * |-----------------------------------------------------------| + * |Sft |\ || Z | X | C | V | B | N | M |, <|. >|/ ?| Shift | + * |-----------------------------------------------------------| + * |Ctrl |GUI|Alt | Space |Alt |GUI|Fn2|Ctrl | + * `-----------------------------------------------------------' + */ + [0] = LAYOUT_60_iso( + 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, + MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, + 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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(2), KC_RCTL), + + + [1] = LAYOUT_60_iso( + 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, + XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, BL_DEC, BL_TOGG, BL_INC, BL_STEP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LCTL, KC_LGUI, KC_LGUI, XXXXXXX, KC_RALT, KC_RGUI, _______, KC_RCTL), + + [2] = LAYOUT_60_iso( + KC_GRV, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DEL, + XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LCTL, KC_LGUI, KC_LALT, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX), - - LAYOUT( - 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_NO, KC_DEL, - KC_NO, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_LSFT, KC_NO, KC_NO, KC_NO, BL_DEC, BL_TOGG, BL_INC, BL_STEP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_LCTL, KC_LGUI, KC_LGUI, KC_NO, KC_NO, KC_NO, KC_RALT, KC_RGUI, KC_NO, KC_NO, KC_RCTL), - - LAYOUT( - KC_GRV, KC_MPRV, KC_MPLY, KC_MNXT, M(4), M(5), M(6), M(7), M(8), M(9), M(10), M(11), M(12), KC_NO, KC_DEL, - KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_LCTL, KC_LGUI, KC_LALT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), -}; - -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/dz60/keymaps/iso_7u_space/keymap.c b/keyboards/dz60/keymaps/iso_7u_space/keymap.c index 2de2445987c9..016fe9a6a5de 100644 --- a/keyboards/dz60/keymaps/iso_7u_space/keymap.c +++ b/keyboards/dz60/keymaps/iso_7u_space/keymap.c @@ -1,76 +1,47 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * _______ can be used in place of KC_TRNS (transparent) * + * XXXXXXX can be used in place of KC_NO (No Operation) * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* ISO 7u layout layer 0 -* ,-----------------------------------------------------------------------------------------. -* | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ß | ´ | BSPC | -* |-----------------------------------------------------------------------------------------+ -* | Tab | Q | W | E | R | T | Z | U | I | O | P | P | Ü | * | | -* |-------------------------------------------------------------------------------------| + -* | Layer_1 | A | S | D | F | G | H | J | K | L | Ö | Ä | # |Enter | -* |-----------------------------------------------------------------------------------------+ -* | Shift| < | Y | X | C | V | B | N | M | , | . | . | - | RShift | -* |-----------------------------------------------------------------------------------------+ -* | LCtrl | LGUI | LAlt | Space | RAlt | Layer_2 | RCtrl | -* `-----------------------------------------------------------------------------------------' -*/ + /* ISO 7u layout layer 0 + * ,-----------------------------------------------------------. + * |Esc|1 !|2 "|3 £|4 $|5 %|6 ^|7 &|8 *|9 (|0 )|- _|= +| Bksp | + * |-----------------------------------------------------------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P |[ {|] }|Enter| + * |------------------------------------------------------. | + * | Fn1 | A | S | D | F | G | H | J | K | L |; :|' @|# ~| | + * |-----------------------------------------------------------| + * |Sft |\ || Z | X | C | V | B | N | M |, <|. >|/ ?| Shift | + * |-----------------------------------------------------------| + * |Ctrl |GUI|Alt | Space |Alt |Fn2|Ctrl | + * `-----------------------------------------------------------' + */ + [0] = LAYOUT_60_iso( + 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, + MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, + 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_LCTL, KC_LGUI, KC_LALT, KC_SPC, XXXXXXX, KC_RALT, MO(2), KC_RCTL + ), + + [1] = LAYOUT_60_iso( + 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, + XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_PGUP, XXXXXXX, XXXXXXX, XXXXXXX, BL_DEC, BL_TOGG, BL_INC, BL_STEP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_PGDN, KC_LGUI, KC_LGUI, XXXXXXX, XXXXXXX, KC_RGUI, _______, KC_RCTL + ), + + [2] = LAYOUT_60_iso( + KC_GRV, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DEL, + XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LCTL, KC_LGUI, KC_LALT, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX + ), - LAYOUT( - 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_NO, 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(1), 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_NUBS, 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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_NO, KC_RALT, KC_NO, MO(2), KC_RCTL), - - - LAYOUT( - 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_NO, KC_DEL, - KC_NO, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_PGUP, KC_NO, KC_NO, KC_NO, BL_DEC, BL_TOGG, BL_INC, BL_STEP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_PGDOWN, KC_LGUI, KC_LGUI, KC_NO, KC_NO, KC_NO, KC_RALT, KC_RGUI, KC_NO, KC_NO, KC_RCTL), - - LAYOUT( - KC_GRV, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_DEL, - KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_LCTL, KC_LGUI, KC_LALT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO), -}; - -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/dz60/keymaps/iso_uk/keymap.c b/keyboards/dz60/keymaps/iso_uk/keymap.c index 1c15a59df8cc..13e6e185947f 100644 --- a/keyboards/dz60/keymaps/iso_uk/keymap.c +++ b/keyboards/dz60/keymaps/iso_uk/keymap.c @@ -18,8 +18,6 @@ #define MO_FN MO(1) #define MO_FN MO(1) -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = LAYOUT_60_iso( @@ -50,37 +48,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; - -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/dz60/keymaps/iso_vim_arrow/keymap.c b/keyboards/dz60/keymaps/iso_vim_arrow/keymap.c index 9e85a89eeea5..4dad9e19f514 100644 --- a/keyboards/dz60/keymaps/iso_vim_arrow/keymap.c +++ b/keyboards/dz60/keymaps/iso_vim_arrow/keymap.c @@ -1,7 +1,5 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* ISO 5x1u layout (ISO German keyboard layout shown) @@ -23,8 +21,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ LAYOUT_60_iso_5x1u( 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_ENT, - MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, + 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, + MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, 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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), @@ -32,44 +30,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT_60_iso_5x1u( 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_NO, KC_NO, KC_NO, KC_NO, RESET, KC_NO, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_PSCR, KC_NO, KC_NO, KC_NO, - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_END, KC_DEL, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, RESET, KC_NO, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_PSCR, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_END, KC_DEL, KC_NO, KC_NO, KC_LSFT, BL_TOGG, KC_APP, KC_PAUS, KC_INS, KC_NO, KC_MPLY, KC_MSTP, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_RSFT, KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, KC_DEL, KC_HOME, KC_PGDN, KC_PGUP, KC_END ), }; - -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/dz60/keymaps/itsaferbie/keymap.c b/keyboards/dz60/keymaps/itsaferbie/keymap.c index ecc99cc751ba..de30e0538236 100644 --- a/keyboards/dz60/keymaps/itsaferbie/keymap.c +++ b/keyboards/dz60/keymaps/itsaferbie/keymap.c @@ -9,25 +9,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_DEFAULT] = LAYOUT_hhkb( + [_DEFAULT] = LAYOUT_60_hhkb( 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_NO, 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_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(_LIGHTS)), - [_FN] = LAYOUT_hhkb( + [_FN] = LAYOUT_60_hhkb( ______, 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_PSCR, KC_SLCK, KC_PAUS, KC_UP, ______, RESET, ______, KC_VOLD, KC_VOLU, KC_MUTE, ______, ______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, ______, - ______, ______, KC_MPRV, KC_MPLY, KC_MNXT, ______, ______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, ______, ______, + ______, KC_MPRV, KC_MPLY, KC_MNXT, ______, ______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, ______, ______, ______, ______, ______, ______, ______), - [_LIGHTS] = LAYOUT_hhkb( + [_LIGHTS] = LAYOUT_60_hhkb( RGB_TOG, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, ______, ______, ______, ______, ______, ______, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, RGB_HUD, RGB_SAD, RGB_VAD, ______, ______, ______, ______, ______, ______, ______, ______, ______, - ______, ______, ______, ______, BL_DEC, BL_TOGG, BL_INC, ______, ______, ______, ______, ______, ______, ______, + ______, ______, ______, BL_DEC, BL_TOGG, BL_INC, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______), }; diff --git a/keyboards/dz60/keymaps/jkbone/keymap.c b/keyboards/dz60/keymaps/jkbone/keymap.c index ecc391785f26..1efcbe38f475 100644 --- a/keyboards/dz60/keymaps/jkbone/keymap.c +++ b/keyboards/dz60/keymaps/jkbone/keymap.c @@ -1,7 +1,6 @@ #include QMK_KEYBOARD_H #define ____ KC_TRNS -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) #define FL_ESC LT(_FL, KC_ESC) #define FL MO(_FL) @@ -11,60 +10,56 @@ enum layers_idx { _FL // Functions }; +enum custom_keycodes { + RGB_VAZ = SAFE_RANGE, + RGB_OAZ, + RGB_WAN, + RGB_000 +}; + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BL] = LAYOUT_60_iso_5x1u( 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_ENT, - FL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, + 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, + FL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS,KC_ENT, KC_LSFT, KC_GRV, 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, FL, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT ), [_ML] = LAYOUT_60_iso_5x1u( ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, - ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, - ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, + ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, KC_LGUI, KC_LALT, KC_LCTL, ____, ____, ____, ____, ____, ____ ), [_FL] = LAYOUT_60_iso_5x1u( RESET, 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, - ____, ____, DF(_BL), DF(_ML), ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, - ____, ____, ____, ____, ____, ____, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, ____, ____, ____, - ____, F(3), F(2), F(1), F(0), ____, ____, ____, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, ____, + ____, ____, DF(_BL), DF(_ML), ____, ____, ____, ____, ____, ____, ____, ____, ____, + ____, ____, ____, ____, ____, ____, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, ____, ____, ____, ____, + ____, RGB_000, RGB_WAN, RGB_OAZ, RGB_VAZ, ____, ____, ____, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ ) }; -enum function_id { - RGB_VAZ, - RGB_OAZ, - RGB_WAN, - RGB_000 -}; - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_FUNCTION(RGB_VAZ), - [1] = ACTION_FUNCTION(RGB_OAZ), - [2] = ACTION_FUNCTION(RGB_WAN), - [3] = ACTION_FUNCTION(RGB_000) -}; - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch (id) { - case RGB_VAZ: +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch(keycode) { + case RGB_VAZ: rgblight_enable(); rgblight_setrgb(0, 204, 33); break; - case RGB_OAZ: + case RGB_OAZ: rgblight_enable(); rgblight_setrgb(229, 65, 0); break; - case RGB_WAN: + case RGB_WAN: rgblight_enable(); rgblight_setrgb(255, 255, 255); break; - case RGB_000: + case RGB_000: rgblight_disable(); break; + } } -} + return true; +}; diff --git a/keyboards/dz60/keymaps/krusli/keymap.c b/keyboards/dz60/keymaps/krusli/keymap.c index 36e7b801a390..0ad6f1b2b540 100644 --- a/keyboards/dz60/keymaps/krusli/keymap.c +++ b/keyboards/dz60/keymaps/krusli/keymap.c @@ -1,6 +1,5 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) #define _______ KC_TRNS const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { diff --git a/keyboards/dz60/keymaps/macos_arrow/keymap.c b/keyboards/dz60/keymaps/macos_arrow/keymap.c index 7106092a47ae..81d61a59aec3 100644 --- a/keyboards/dz60/keymaps/macos_arrow/keymap.c +++ b/keyboards/dz60/keymaps/macos_arrow/keymap.c @@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | Alt | Gui | Space / _NL |Gui/_ML| Alt | Left| Down|Right| * `-----------------------------------------------------------------------------------------' */ - [_BL] = LAYOUT_2_shifts( + [_BL] = LAYOUT_all( 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_NO, 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(_FL, 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_ENT, @@ -44,7 +44,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | * `-----------------------------------------------------------------------------------------' */ - [_FL] = LAYOUT_2_shifts( + [_FL] = LAYOUT_all( _______, 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_NO, KC_DEL, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, _______, @@ -63,7 +63,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | * `-----------------------------------------------------------------------------------------' */ - [_ML] = LAYOUT_2_shifts( + [_ML] = LAYOUT_all( KC_MEDIA_EJECT, BR_DOWN, BR_UP, _______, _______, _______, _______, KC_MEDIA_PREV_TRACK, KC_MEDIA_PLAY_PAUSE, KC_MEDIA_NEXT_TRACK, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_NO, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -82,7 +82,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | * `-----------------------------------------------------------------------------------------' */ - [_NL] = LAYOUT_2_shifts( + [_NL] = LAYOUT_all( _______, _______, _______, _______, _______, _______, _______, _______, KC_PERCENT, KC_LEFT_PAREN, KC_RIGHT_PAREN, KC_LEFT_ANGLE_BRACKET, KC_RIGHT_ANGLE_BRACKET, KC_NO, _______, _______, _______, _______, _______, _______, _______, _______, KC_ASTERISK, KC_0, KC_1, KC_2, KC_3, _______, RESET, _______, _______, _______, _______, _______, _______, _______, KC_DOT, KC_MINS, KC_4, KC_5, KC_6, _______, diff --git a/keyboards/dz60/keymaps/stephengrier/config.h b/keyboards/dz60/keymaps/stephengrier/config.h new file mode 100644 index 000000000000..9560d51a6f94 --- /dev/null +++ b/keyboards/dz60/keymaps/stephengrier/config.h @@ -0,0 +1 @@ +#define GRAVE_ESC_GUI_OVERRIDE # Always send Escape if GUI is pressed diff --git a/keyboards/dz60/keymaps/stephengrier/keymap.c b/keyboards/dz60/keymaps/stephengrier/keymap.c index d9403f59e2e7..f6bbe789327e 100644 --- a/keyboards/dz60/keymaps/stephengrier/keymap.c +++ b/keyboards/dz60/keymaps/stephengrier/keymap.c @@ -1,7 +1,5 @@ #include QMK_KEYBOARD_H -#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) - #define ______ KC_TRNS const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -20,11 +18,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------------' */ - LAYOUT_2_shifts( - 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, + LAYOUT_directional( + KC_GESC, 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, MO(1), 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_UP, MO(1), + 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, MO(1), KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, KC_RALT, KC_LEFT, KC_DOWN, KC_RIGHT ), @@ -50,37 +48,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______ ), }; - -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/dz60/keymaps/weeheavy/keymap.c b/keyboards/dz60/keymaps/weeheavy/keymap.c index a98e3eeb2051..cb9697e1071d 100644 --- a/keyboards/dz60/keymaps/weeheavy/keymap.c +++ b/keyboards/dz60/keymaps/weeheavy/keymap.c @@ -12,7 +12,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Base layer - ANSI QWERTY -[L0] = LAYOUT_2_shifts( +[L0] = LAYOUT_all( KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, XXXX, 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, @@ -20,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(L1), KC_SPC, KC_RALT, MO(L2), KC_LEFT, KC_DOWN, KC_RIGHT), // Utility layer - RGB and multimedia control -[L1] = LAYOUT_2_shifts( +[L1] = LAYOUT_all( ____, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, ____, ____, ____, RGB_TOG, RGB_MOD, RGB_M_K, RGB_M_R, ____, ____, KC_PSCR, ____, KC_PAUS, ____, ____, ____, ____, ____, RGB_HUI, RGB_HUD, ____, ____, ____, ____, KC_INS, KC_HOME, KC_PGUP, ____, ____, ____, @@ -28,7 +28,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ____, RGB_VAI, RGB_VAD, ____, ____, ____, ____, ____, KC_MPRV, KC_VOLD, KC_MNXT), // Setup layer - Reset an additional "b" button -[L2] = LAYOUT_2_shifts( +[L2] = LAYOUT_all( RESET, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, KC_B, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, RESET, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, From 9f2e39732f2458b1bfe5d546581da508c2be577e Mon Sep 17 00:00:00 2001 From: Rebecca Le <543859+sevenseacat@users.noreply.github.com> Date: Tue, 2 Oct 2018 11:43:43 +0800 Subject: [PATCH 109/505] Keyboard: Add support for the KBD4x (#4036) * Generate a new project for the KBD4x * Specify the possible layouts for the KBD4x - MIT and grid * Fill out the readme for the KBD4x * Configure the default keymap and wiring configuration as specified on http://qmkeyboard.cn/ * Add info.json for QMK Configurator * Enable backlight support for the KBD4x * Standardise on LAYOUT_planck_mit/LAYOUT_ortho_4x12 layout names * Add whitespace so the Readme will render correctly * Disable mouse keys support for the KBD4x to make the firmware small enough --- keyboards/kbd4x/config.h | 223 ++++++++++++++++++++++ keyboards/kbd4x/info.json | 112 +++++++++++ keyboards/kbd4x/kbd4x.c | 43 +++++ keyboards/kbd4x/kbd4x.h | 48 +++++ keyboards/kbd4x/keymaps/default/config.h | 19 ++ keyboards/kbd4x/keymaps/default/keymap.c | 52 +++++ keyboards/kbd4x/keymaps/default/readme.md | 1 + keyboards/kbd4x/readme.md | 15 ++ keyboards/kbd4x/rules.mk | 81 ++++++++ 9 files changed, 594 insertions(+) create mode 100644 keyboards/kbd4x/config.h create mode 100644 keyboards/kbd4x/info.json create mode 100644 keyboards/kbd4x/kbd4x.c create mode 100644 keyboards/kbd4x/kbd4x.h create mode 100644 keyboards/kbd4x/keymaps/default/config.h create mode 100644 keyboards/kbd4x/keymaps/default/keymap.c create mode 100644 keyboards/kbd4x/keymaps/default/readme.md create mode 100644 keyboards/kbd4x/readme.md create mode 100644 keyboards/kbd4x/rules.mk diff --git a/keyboards/kbd4x/config.h b/keyboards/kbd4x/config.h new file mode 100644 index 000000000000..b967ab8f7566 --- /dev/null +++ b/keyboards/kbd4x/config.h @@ -0,0 +1,223 @@ +/* +Copyright 2018 sevenseacat + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER KBDFans +#define PRODUCT KBD4x +#define DESCRIPTION A compact 40% (12x4) ortholinear keyboard kit. + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 12 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { D0, D1, D2, D3 } +#define MATRIX_COL_PINS { F0, F1, F4, F5, F6, F7, B3, B1, B0, D5, B7, C7 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B6 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 + +#define RGB_DI_PIN E2 +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 16 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ diff --git a/keyboards/kbd4x/info.json b/keyboards/kbd4x/info.json new file mode 100644 index 000000000000..78d011e2c7b9 --- /dev/null +++ b/keyboards/kbd4x/info.json @@ -0,0 +1,112 @@ +{ + "keyboard_name": "kbd4x", + "url": "", + "maintainer": "qmk", + "width": 14, + "height": 4, + "layouts": { + "LAYOUT_planck_mit": { + "layout": [ + {"label":"ESC", "x":0, "y":0}, + {"label":"Q", "x":1, "y":0}, + {"label":"W", "x":2, "y":0}, + {"label":"E", "x":3, "y":0}, + {"label":"R", "x":4, "y":0}, + {"label":"T", "x":5, "y":0}, + {"label":"Y", "x":6, "y":0}, + {"label":"U", "x":7, "y":0}, + {"label":"I", "x":8, "y":0}, + {"label":"O", "x":9, "y":0}, + {"label":"P", "x":10, "y":0}, + {"label":"BKSP", "x":11, "y":0}, + {"label":"TAB", "x":0, "y":1}, + {"label":"A", "x":1, "y":1}, + {"label":"S", "x":2, "y":1}, + {"label":"D", "x":3, "y":1}, + {"label":"F", "x":4, "y":1}, + {"label":"G", "x":5, "y":1}, + {"label":"H", "x":6, "y":1}, + {"label":"J", "x":7, "y":1}, + {"label":"K", "x":8, "y":1}, + {"label":"L", "x":9, "y":1}, + {"label":";", "x":10, "y":1}, + {"label":"'", "x":11, "y":1}, + {"label":"SHIFT", "x":0, "y":2}, + {"label":"Z", "x":1, "y":2}, + {"label":"X", "x":2, "y":2}, + {"label":"C", "x":3, "y":2}, + {"label":"V", "x":4, "y":2}, + {"label":"B", "x":5, "y":2}, + {"label":"N", "x":6, "y":2}, + {"label":"M", "x":7, "y":2}, + {"label":",", "x":8, "y":2}, + {"label":".", "x":9, "y":2}, + {"label":"UP", "x":10, "y":2}, + {"label":"ENTER", "x":11, "y":2}, + {"label":"LCTRL", "x":0, "y":3}, + {"label":"LGUI", "x":1, "y":3}, + {"label":"1", "x":2, "y":3}, + {"label":"2", "x":3, "y":3}, + {"label":"3", "x":4, "y":3}, + {"label":"SPACE", "x":5, "y":3, "w":2}, + {"label":"MO(1)", "x":7, "y":3}, + {"label":"/", "x":8, "y":3}, + {"label":"LEFT", "x":9, "y":3}, + {"label":"DOWN", "x":10, "y":3}, + {"label":"RIGHT", "x":11, "y":3}, + ] + }, + "LAYOUT_ortho_4x12": { + "layout": [ + {"label":"ESC", "x":0, "y":0}, + {"label":"Q", "x":1, "y":0}, + {"label":"W", "x":2, "y":0}, + {"label":"E", "x":3, "y":0}, + {"label":"R", "x":4, "y":0}, + {"label":"T", "x":5, "y":0}, + {"label":"Y", "x":6, "y":0}, + {"label":"U", "x":7, "y":0}, + {"label":"I", "x":8, "y":0}, + {"label":"O", "x":9, "y":0}, + {"label":"P", "x":10, "y":0}, + {"label":"BKSP", "x":11, "y":0}, + {"label":"TAB", "x":0, "y":1}, + {"label":"A", "x":1, "y":1}, + {"label":"S", "x":2, "y":1}, + {"label":"D", "x":3, "y":1}, + {"label":"F", "x":4, "y":1}, + {"label":"G", "x":5, "y":1}, + {"label":"H", "x":6, "y":1}, + {"label":"J", "x":7, "y":1}, + {"label":"K", "x":8, "y":1}, + {"label":"L", "x":9, "y":1}, + {"label":";", "x":10, "y":1}, + {"label":"'", "x":11, "y":1}, + {"label":"SHIFT", "x":0, "y":2}, + {"label":"Z", "x":1, "y":2}, + {"label":"X", "x":2, "y":2}, + {"label":"C", "x":3, "y":2}, + {"label":"V", "x":4, "y":2}, + {"label":"B", "x":5, "y":2}, + {"label":"N", "x":6, "y":2}, + {"label":"M", "x":7, "y":2}, + {"label":",", "x":8, "y":2}, + {"label":".", "x":9, "y":2}, + {"label":"UP", "x":10, "y":2}, + {"label":"ENTER", "x":11, "y":2}, + {"label":"LCTRL", "x":0, "y":3}, + {"label":"LGUI", "x":1, "y":3}, + {"label":"1", "x":2, "y":3}, + {"label":"2", "x":3, "y":3}, + {"label":"3", "x":4, "y":3}, + {"label":"SPACE", "x":5, "y":3}, + {"label":"MO(2)", "x":6, "y":3}, + {"label":"MO(1)", "x":7, "y":3}, + {"label":"/", "x":8, "y":3}, + {"label":"LEFT", "x":9, "y":3}, + {"label":"DOWN", "x":10, "y":3}, + {"label":"RIGHT", "x":11, "y":3}, + ] + } + } +} diff --git a/keyboards/kbd4x/kbd4x.c b/keyboards/kbd4x/kbd4x.c new file mode 100644 index 000000000000..84ada250d7cd --- /dev/null +++ b/keyboards/kbd4x/kbd4x.c @@ -0,0 +1,43 @@ +/* Copyright 2018 sevenseacat + * + * 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 "kbd4x.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/kbd4x/kbd4x.h b/keyboards/kbd4x/kbd4x.h new file mode 100644 index 000000000000..d7a851e3ebd0 --- /dev/null +++ b/keyboards/kbd4x/kbd4x.h @@ -0,0 +1,48 @@ +/* Copyright 2018 sevenseacat + * + * 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 KBD4X_H +#define KBD4X_H + +#include "quantum.h" + +#define LAYOUT_planck_mit( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k35, k37, k38, k39, k3a, k3b \ +) \ +{ \ + { k00, k01, k02, 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, KC_NO, k37, k38, k39, k3a, k3b } \ +} + +// The PCB does support a grid layout, but the case does not. +#define LAYOUT_ortho_4x12( \ + 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 \ +) \ +{ \ + { 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 } \ +} + +#endif diff --git a/keyboards/kbd4x/keymaps/default/config.h b/keyboards/kbd4x/keymaps/default/config.h new file mode 100644 index 000000000000..7f3bd7dd527d --- /dev/null +++ b/keyboards/kbd4x/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 sevenseacat + * + * 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 + +// place overrides here diff --git a/keyboards/kbd4x/keymaps/default/keymap.c b/keyboards/kbd4x/keymaps/default/keymap.c new file mode 100644 index 000000000000..ad49b379989a --- /dev/null +++ b/keyboards/kbd4x/keymaps/default/keymap.c @@ -0,0 +1,52 @@ +/* Copyright 2018 sevenseacat + * + * 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 QMK_KEYBOARD_H + +#define ___ KC_TRNS + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + KBD4X = SAFE_RANGE, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_planck_mit( + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_ENTER, + KC_LCTL, KC_LGUI, KC_1, KC_2, KC_3, KC_SPACE, MO(1), KC_SLSH, KC_LEFT, KC_DOWN, KC_RIGHT + ), + + [1] = LAYOUT_planck_mit( + KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, ___, + ___, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, ___, ___, ___, ___, ___, ___, RESET, + ___, BL_TOGG, BL_STEP, ___, ___, ___, ___, ___, ___, ___, ___, ___, + ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +void led_set_user(uint8_t usb_led) { +} diff --git a/keyboards/kbd4x/keymaps/default/readme.md b/keyboards/kbd4x/keymaps/default/readme.md new file mode 100644 index 000000000000..a950a25ace7c --- /dev/null +++ b/keyboards/kbd4x/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for kbd4x diff --git a/keyboards/kbd4x/readme.md b/keyboards/kbd4x/readme.md new file mode 100644 index 000000000000..42dc450248c1 --- /dev/null +++ b/keyboards/kbd4x/readme.md @@ -0,0 +1,15 @@ +# KBD4x + +![KBD4x](https://cdn.shopify.com/s/files/1/1473/3902/products/1_ef8d3ad0-fc70-4d4f-9e36-8438c781a581_1800x1800.jpg) + +A compact 40% (12x4) ortholinear keyboard kit sold by KBDFans. + +Keyboard Maintainer: ![sevenseacat](https://github.com/sevenseacat) +Hardware Supported: KBD4x PCB +Hardware Availability: https://kbdfans.cn/collections/diy-kit/products/kbd4x-custom-mechanical-keyboard-hot-swap-diy-kit + +Make example for this keyboard (after setting up your build environment): + + make kbd4x:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/kbd4x/rules.mk b/keyboards/kbd4x/rules.mk new file mode 100644 index 000000000000..6cfd92bc63b1 --- /dev/null +++ b/keyboards/kbd4x/rules.mk @@ -0,0 +1,81 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = 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 = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From 1a33054a3586fa69812a249762e24ecc08a40423 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 2 Oct 2018 07:54:18 -0700 Subject: [PATCH 110/505] Reduce firmware size of KBD8x to fix Travis Compile issues --- keyboards/kbd8x/config.h | 5 ++--- keyboards/kbd8x/kbd8x.h | 8 +++----- keyboards/kbd8x/keymaps/default/config.h | 9 +-------- keyboards/kbd8x/keymaps/default_backlighting/config.h | 9 +-------- keyboards/kbd8x/keymaps/default_backlighting/rules.mk | 2 +- keyboards/kbd8x/rules.mk | 3 +-- 6 files changed, 9 insertions(+), 27 deletions(-) diff --git a/keyboards/kbd8x/config.h b/keyboards/kbd8x/config.h index c021fb40b507..7749e04724b3 100644 --- a/keyboards/kbd8x/config.h +++ b/keyboards/kbd8x/config.h @@ -15,8 +15,7 @@ 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 +#pragma once #include "config_common.h" @@ -196,4 +195,4 @@ along with this program. If not, see . /* 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/keyboards/kbd8x/kbd8x.h b/keyboards/kbd8x/kbd8x.h index 02a7436446af..f28b8ca7a133 100644 --- a/keyboards/kbd8x/kbd8x.h +++ b/keyboards/kbd8x/kbd8x.h @@ -13,8 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef KBD8X_H -#define KBD8X_H +#pragma once #include "quantum.h" #include "led.h" @@ -31,7 +30,7 @@ inline void scroll_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); } // LAYOUT depicting all possible switch positions. -// LAYOUT_all supports ISO, split backspace and split left/right shift. +// LAYOUT_all supports ISO, split backspace and split left/right shift. #define LAYOUT_all( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K3D, \ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K5B, K5C, K3E, \ @@ -49,7 +48,7 @@ inline void scroll_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); } { K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, K5A, K5B, K5C, K5D, K5E } \ } -// LAYOUT depicting only switch positions for a standard TKL ANSI keyboard. +// LAYOUT depicting only switch positions for a standard TKL ANSI keyboard. // TODO: Double check location of backspace key for 2u layout (It's either K1D or K1C). #define LAYOUT_tkl_ansi( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K3D, \ @@ -68,4 +67,3 @@ inline void scroll_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); } { K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, K5A, K5B, K5C, K5D, K5E } \ } -#endif diff --git a/keyboards/kbd8x/keymaps/default/config.h b/keyboards/kbd8x/keymaps/default/config.h index 63bef2a735bb..fa7db0bc10c9 100644 --- a/keyboards/kbd8x/keymaps/default/config.h +++ b/keyboards/kbd8x/keymaps/default/config.h @@ -14,11 +14,4 @@ * along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" - -// place overrides here - -#endif +#pragma once diff --git a/keyboards/kbd8x/keymaps/default_backlighting/config.h b/keyboards/kbd8x/keymaps/default_backlighting/config.h index 63bef2a735bb..fa7db0bc10c9 100644 --- a/keyboards/kbd8x/keymaps/default_backlighting/config.h +++ b/keyboards/kbd8x/keymaps/default_backlighting/config.h @@ -14,11 +14,4 @@ * along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" - -// place overrides here - -#endif +#pragma once diff --git a/keyboards/kbd8x/keymaps/default_backlighting/rules.mk b/keyboards/kbd8x/keymaps/default_backlighting/rules.mk index e806a1ca59cf..07b9f81fd058 100644 --- a/keyboards/kbd8x/keymaps/default_backlighting/rules.mk +++ b/keyboards/kbd8x/keymaps/default_backlighting/rules.mk @@ -1,7 +1,7 @@ #Build Options 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 = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration diff --git a/keyboards/kbd8x/rules.mk b/keyboards/kbd8x/rules.mk index 46e9732ea770..e5925463ec5c 100644 --- a/keyboards/kbd8x/rules.mk +++ b/keyboards/kbd8x/rules.mk @@ -45,7 +45,6 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Atmel DFU loader 4096 # LUFA bootloader 4096 # USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 BOOTLOADER = atmel-dfu @@ -53,7 +52,7 @@ BOOTLOADER = atmel-dfu # change yes to no to disable # 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 = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration From 5c2ac733afe9f6d68d2ad42c9d58fbff466a7874 Mon Sep 17 00:00:00 2001 From: Jarred Steenvoorden Date: Wed, 3 Oct 2018 01:14:37 +1000 Subject: [PATCH 111/505] Keymap: Adding my DZ60, Satan, XD75 kemaps and updates to userspace (#4039) * Update userspace with common config.h * Add my dz60, satan and xd75 keyboard keymaps * Fixing executable bits changed during last upstream merge * Cleanup unnecessary files and defines * Remove unnecessary defines from userspace config --- keyboards/dz60/keymaps/jarred/keymap.c | 21 ++++++++++ keyboards/planck/keymaps/jarred/rules.mk | 4 -- keyboards/satan/keymaps/jarred/keymap.c | 22 ++++++++++ keyboards/satan/keymaps/jarred/readme.md | 1 + keyboards/xd75/keymaps/daniel/keymap.c | 29 +++++++++++++ keyboards/xd75/keymaps/daniel/readme.md | 1 + keyboards/xd75/keymaps/jarred/keymap.c | 37 +++++++++++++++++ keyboards/xd75/keymaps/jarred/readme.md | 1 + .../planck/keymaps => users}/jarred/config.h | 41 ++++++++++++------- users/jarred/jarred.c | 15 +++++++ users/jarred/jarred.h | 8 ++-- users/jarred/rules.mk | 15 +++++++ 12 files changed, 173 insertions(+), 22 deletions(-) create mode 100644 keyboards/dz60/keymaps/jarred/keymap.c delete mode 100644 keyboards/planck/keymaps/jarred/rules.mk create mode 100644 keyboards/satan/keymaps/jarred/keymap.c create mode 100644 keyboards/satan/keymaps/jarred/readme.md create mode 100644 keyboards/xd75/keymaps/daniel/keymap.c create mode 100644 keyboards/xd75/keymaps/daniel/readme.md create mode 100644 keyboards/xd75/keymaps/jarred/keymap.c create mode 100644 keyboards/xd75/keymaps/jarred/readme.md rename {keyboards/planck/keymaps => users}/jarred/config.h (54%) diff --git a/keyboards/dz60/keymaps/jarred/keymap.c b/keyboards/dz60/keymaps/jarred/keymap.c new file mode 100644 index 000000000000..9e6850683177 --- /dev/null +++ b/keyboards/dz60/keymaps/jarred/keymap.c @@ -0,0 +1,21 @@ +#include QMK_KEYBOARD_H + +#define _QW 0 +#define _NV 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QW] = LAYOUT( + 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, XXXXXXX, 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(_NV), 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, XXXXXXX,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT,XXXXXXX, + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT,KC_RGUI, XXXXXXX,KC_APP, KC_RCTL), + + [_NV] = LAYOUT( + 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_BSPC,_______,KC_HOME,KC_UP ,KC_END ,KC_INS ,_______,_______,_______, + _______,_______,_______,KC_LSFT,KC_LCTL,KC_ENT ,_______,KC_LEFT,KC_DOWN,KC_RGHT,KC_DEL ,KC_DEL , _______, + _______,_______,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_PGDN,_______,_______,_______,_______, + _______,_______,_______, _______,_______,_______, _______,_______,_______, RESET, _______) +}; diff --git a/keyboards/planck/keymaps/jarred/rules.mk b/keyboards/planck/keymaps/jarred/rules.mk deleted file mode 100644 index cd14c41e116e..000000000000 --- a/keyboards/planck/keymaps/jarred/rules.mk +++ /dev/null @@ -1,4 +0,0 @@ -# Build options - -BACKLIGHT_ENABLE = no # Switch LEDs -MOUSEKEY_ENABLE = no # Emulates mouse key using keypresses diff --git a/keyboards/satan/keymaps/jarred/keymap.c b/keyboards/satan/keymaps/jarred/keymap.c new file mode 100644 index 000000000000..c6852e4eb53a --- /dev/null +++ b/keyboards/satan/keymaps/jarred/keymap.c @@ -0,0 +1,22 @@ +#include QMK_KEYBOARD_H + +#define _QW 0 +#define _NV 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[_QW] = LAYOUT_60_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, \ + MO(_NV), 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, KC_APP, KC_RCTL), + +[_NV] = LAYOUT_60_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_BSPC,_______,KC_HOME,KC_UP ,KC_END ,KC_INS ,_______,_______,_______, \ + _______,_______,_______,KC_LSFT,KC_LCTL,KC_ENT ,_______,KC_LEFT,KC_DOWN,KC_RGHT,KC_DEL ,KC_DEL , _______, \ + _______,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_PGDN,_______,_______,_______, \ + _______,_______,_______, _______, _______,_______, RESET, _______), + +}; diff --git a/keyboards/satan/keymaps/jarred/readme.md b/keyboards/satan/keymaps/jarred/readme.md new file mode 100644 index 000000000000..522cb19b651a --- /dev/null +++ b/keyboards/satan/keymaps/jarred/readme.md @@ -0,0 +1 @@ +# Jarred's Satan GH60 layout diff --git a/keyboards/xd75/keymaps/daniel/keymap.c b/keyboards/xd75/keymaps/daniel/keymap.c new file mode 100644 index 000000000000..2804a6cd0daf --- /dev/null +++ b/keyboards/xd75/keymaps/daniel/keymap.c @@ -0,0 +1,29 @@ +#include QMK_KEYBOARD_H + +#define _QW 0 +#define _NV 1 +#define _NM 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QW] = { + { 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_GRV , 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_DEL }, + { MO(_NV), KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, KC_ENT , MO(_NM), 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_SPC , KC_SPC , KC_SPC , KC_SPC , KC_SPC , KC_SPC , KC_RALT, KC_RGUI, KC_APP , KC_LEFT, KC_DOWN, KC_RGHT }, + }, + [_NV] = { + { 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_BSPC, _______, KC_HOME, KC_UP , KC_END , KC_INS , _______, _______, _______, _______ }, + { _______, _______, _______, KC_LSFT, KC_LCTL, KC_ENT , _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL , _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + }, + [_NM] = { + { _______, RGB_TOG, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, RGB_HUD, RGB_HUI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, RGB_SAD, RGB_SAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, RGB_VAD, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { RESET , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + } +}; diff --git a/keyboards/xd75/keymaps/daniel/readme.md b/keyboards/xd75/keymaps/daniel/readme.md new file mode 100644 index 000000000000..3305d0f30bdc --- /dev/null +++ b/keyboards/xd75/keymaps/daniel/readme.md @@ -0,0 +1 @@ +# Daniels xd75 keymap diff --git a/keyboards/xd75/keymaps/jarred/keymap.c b/keyboards/xd75/keymaps/jarred/keymap.c new file mode 100644 index 000000000000..f85178711859 --- /dev/null +++ b/keyboards/xd75/keymaps/jarred/keymap.c @@ -0,0 +1,37 @@ +#include QMK_KEYBOARD_H + +#define _QW 0 +#define _LW 1 +#define _NV 2 +#define _NM 3 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QW] = { + { KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_MUTE, KC_VOLD, KC_VOLU, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_BSPC }, + { KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_INS , KC_HOME, KC_PGUP, KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSPC }, + { MO(_NV), KC_A , KC_S , KC_D , KC_F , KC_G , KC_DEL , KC_END , KC_PGDN, 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_UP , _______, KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_RSFT }, + { KC_LCTL, KC_LGUI, MO(_NM), KC_LALT, MO(_LW), KC_SPC , KC_LEFT, KC_DOWN, KC_RGHT, KC_ENT , MO(_LW), KC_RALT, KC_RGUI, KC_APP , KC_RCTL }, + }, + [_LW] = { + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { KC_ESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , _______, _______, _______, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , _______ }, + { _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , _______, _______, _______, KC_F11 , KC_MINS, KC_EQL , KC_LBRC, KC_RBRC, KC_BSLS }, + { _______, KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , _______, _______, _______, KC_F12 , KC_GRV , _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + }, + [_NV] = { + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, KC_DEL , KC_BSPC, _______, _______, _______, _______, KC_HOME, KC_UP , KC_END , KC_INS , _______ }, + { _______, _______, _______, KC_LSFT, KC_LCTL, KC_ENT , _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL , _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + }, + [_NM] = { + { _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_MOD, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_HUI, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_SAI, _______, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, RGB_VAD, RGB_VAI, _______, _______, _______, _______, _______, _______, _______ }, + { RESET , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, + } +}; diff --git a/keyboards/xd75/keymaps/jarred/readme.md b/keyboards/xd75/keymaps/jarred/readme.md new file mode 100644 index 000000000000..4070bb3eed75 --- /dev/null +++ b/keyboards/xd75/keymaps/jarred/readme.md @@ -0,0 +1 @@ +# Jarreds xd75 keymap diff --git a/keyboards/planck/keymaps/jarred/config.h b/users/jarred/config.h similarity index 54% rename from keyboards/planck/keymaps/jarred/config.h rename to users/jarred/config.h index 9e8f404c15b1..f282088144d8 100644 --- a/keyboards/planck/keymaps/jarred/config.h +++ b/users/jarred/config.h @@ -14,24 +14,37 @@ * along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once -#include "config_common.h" +// Sets good default for the speed of the mouse. +#undef MOUSEKEY_INTERVAL +#undef MOUSEKEY_DELAY +#undef MOUSEKEY_TIME_TO_MAX +#undef MOUSEKEY_MAX_SPEED -#ifdef AUDIO_ENABLE - #define STARTUP_SONG SONG(PLANCK_SOUND) -#endif +#define MOUSEKEY_INTERVAL 16 +#define MOUSEKEY_DELAY 0 +#define MOUSEKEY_TIME_TO_MAX 40 +#define MOUSEKEY_MAX_SPEED 5 -#define TAPPING_TERM 200 +#undef MOUSEKEY_WHEEL_MAX_SPEED +#undef MOUSEKEY_WHEEL_TIME_TO_MAX +#undef MOUSEKEY_WHEEL_DELAY -#define MOUSEKEY_DELAY 0 -#define MOUSEKEY_INTERVAL 16 -#define MOUSEKEY_TIME_TO_MAX 40 -#define MOUSEKEY_MAX_SPEED 5 +#define MOUSEKEY_WHEEL_MAX_SPEED 4 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 255 +#define MOUSEKEY_WHEEL_DELAY 0 -#define MOUSEKEY_WHEEL_DELAY 0 -#define MOUSEKEY_WHEEL_MAX_SPEED 4 -#define MOUSEKEY_WHEEL_TIME_TO_MAX 255 +#undef TAPPING_TOGGLE +#undef TAPPING_TERM +#undef IGNORE_MOD_TAP_INTERRUPT +#define TAPPING_TOGGLE 1 +#define TAPPING_TERM 200 +#define IGNORE_MOD_TAP_INTERRUPT + +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(PLANCK_SOUND) #endif + +#define MACRO_TIMER 5 diff --git a/users/jarred/jarred.c b/users/jarred/jarred.c index f8413ca3b3b6..33162b6891a4 100644 --- a/users/jarred/jarred.c +++ b/users/jarred/jarred.c @@ -15,3 +15,18 @@ */ #include "jarred.h" +#include "version.h" + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + switch (keycode) { + case VRSN: // Prints firmware version + if (record->event.pressed) { + send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), MACRO_TIMER); + } + return false; + break; + } + + return true; +} diff --git a/users/jarred/jarred.h b/users/jarred/jarred.h index b1253f76a7b2..a6774ce264e7 100644 --- a/users/jarred/jarred.h +++ b/users/jarred/jarred.h @@ -19,9 +19,9 @@ #include "quantum.h" -// Use 7 wide characters for keymaps -#define _______ KC_TRNS -#define XXXXXXX KC_NO +enum userspace_custom_keycodes { + VRSN = SAFE_RANGE // Prints QMK Firmware and board info +}; // Layers #define _QW 0 @@ -72,7 +72,7 @@ #define NUMPAD_L1 RGB_TOG, RGB_MOD, _______, _______, RGB_HUD, RGB_HUI #define NUMPAD_L2 BL_TOGG, BL_STEP, BL_BRTG, _______, RGB_SAD, RGB_SAI #define NUMPAD_L3 _______, _______, _______, _______, RGB_VAD, RGB_VAI -#define NUMPAD_L4 RESET, _______, _______, _______, RGB_SPD, RGB_SPI +#define NUMPAD_L4 RESET, VRSN, _______, _______, RGB_SPD, RGB_SPI #define NUMPAD_R1 _______, KC_P7, KC_P8, KC_P9, KC_PMNS, _______ #define NUMPAD_R2 _______, KC_P4, KC_P5, KC_P6, KC_PPLS, _______ diff --git a/users/jarred/rules.mk b/users/jarred/rules.mk index 3c15cd0f9ac7..9a00cbf72b73 100644 --- a/users/jarred/rules.mk +++ b/users/jarred/rules.mk @@ -1 +1,16 @@ SRC += jarred.c + +ifneq (,$(findstring planck,$(KEYBOARD))) + # Enable backlight for rev4 planck only + ifneq (,$(findstring rev4,$(KEYBOARD))) + BACKLIGHT_ENABLE = yes + BACKLIGHT_BREATHING = yes + else + BACKLIGHT_ENABLE = no + BACKLIGHT_BREATHING = no + endif + + AUDIO_ENABLE = yes +endif + +MOUSEKEY_ENABLE = no From 66b793730ead28e409cbc152606a769e1c7b6a0b Mon Sep 17 00:00:00 2001 From: Bramver Date: Tue, 2 Oct 2018 22:06:31 +0200 Subject: [PATCH 112/505] Keymap: Personal XD75 keymap added. (#4045) * Personal XD75 keymap added. Nothing fancy, has emojisupport. * Converted to spaces to follow guidelines * Fixed requested changes. Replacing include guards with pragma once. Omitting unnecessary lines. PR #4045 --- keyboards/xd75/keymaps/bramver/README.md | 43 +++++++++ keyboards/xd75/keymaps/bramver/config.h | 25 +++++ keyboards/xd75/keymaps/bramver/keymap.c | 115 +++++++++++++++++++++++ keyboards/xd75/keymaps/bramver/rules.mk | 7 ++ 4 files changed, 190 insertions(+) create mode 100644 keyboards/xd75/keymaps/bramver/README.md create mode 100644 keyboards/xd75/keymaps/bramver/config.h create mode 100644 keyboards/xd75/keymaps/bramver/keymap.c create mode 100644 keyboards/xd75/keymaps/bramver/rules.mk diff --git a/keyboards/xd75/keymaps/bramver/README.md b/keyboards/xd75/keymaps/bramver/README.md new file mode 100644 index 000000000000..2dcac5f0e330 --- /dev/null +++ b/keyboards/xd75/keymaps/bramver/README.md @@ -0,0 +1,43 @@ +# XD75 Layout + +Standard qwerty layout. +Limited emoji support and proper mouse settings. + +## Keymap + +``` +_BASE + | GESC | 1 | 2 | 3 | 4 | 5 | MPRV | MPLY | MNXT | 6 | 7 | 8 | 9 | 0 | BSPC | + | TAB | Q | W | E | R | T | MINS | EQL | BSLS | Y | U | I | O | P | ENT | + | MO(3) | A | S | D | F | G | LBRC | MUTE | RBRC | H | J | K | L | SCLN | QUOT | + | LSFT | Z | X | C | V | B | HOME | SLEP | END | N | M | COMM | DOT | SLSH | RSFT | + | LCTL | MO(4) | LALT | LGUI | SPC | SPC | MO(1) | DEL | MO(2) | SPC | LEFT | DOWN | UP | RGHT | RGUI | + +_LOWER + | _______ | _______ | _______ | _______ | _______ | _______ | BL_TOGG | BL_DEC | BL_INC | _______ | _______ | _______ | _______ | _______ | _______ | + | _______ | WH_L | BTN1 | MS_U | BTN2 | WH_U | BL_STEP | RGB_TOG | RGB_MOD | _______ | _______ | _______ | _______ | _______ | _______ | + | _______ | WH_R | MS_L | MS_D | MS_R | WH_D | RGB_HUI | RGB_HUD | RGB_SAI | _______ | LEFT | DOWN | UP | RGHT | _______ | + | _______ | _______ | _______ | _______ | _______ | _______ | RGB_SAD | RGB_VAI | RGB_VAD | _______ | _______ | _______ | _______ | _______ | _______ | + | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | + +_LINVERT + | _______ | _______ | _______ | _______ | _______ | _______ | BL_TOGG | BL_DEC | BL_INC | _______ | _______ | _______ | _______ | _______ | _______ | + | _______ | _______ | _______ | _______ | _______ | _______ | BL_STEP | RGB_TOG | RGB_MOD | WH_U | BTN1 | MS_U | BTN2 | WH_L | _______ | + | _______ | LEFT | DOWN | UP | RGHT | _______ | RGB_SAI | RGB_HUI | RGB_HUD | WH_D | MS_L | MS_D | MS_R | WH_R | _______ | + | _______ | _______ | _______ | _______ | _______ | _______ | RGB_SAD | RGB_VAI | RGB_VAD | _______ | _______ | _______ | _______ | _______ | _______ | + | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | + +_RAISE + | F1 | F2 | F3 | F4 | F5 | F6 | _______ | _______ | _______ | F7 | F8 | F9 | F10 | F11 | F12 | + | _______ | _______ | 7 | 8 | 9 | _______ | _______ | _______ | _______ | _______ | MUTE | VOLD | VOLU | _______ | _______ | + | _______ | _______ | 4 | 5 | 6 | _______ | _______ | _______ | _______ | _______ | MPRV | MPLY | MNXT | _______ | _______ | + | _______ | _______ | 1 | 2 | 3 | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | + | _______ | _______ | _______ | 0 | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | + +_EMOJIFY + | TO(0) | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | RESET | + | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | + | _______ | X(CELE) | X(PRAY) | X(NAIL) | X(OK) | X(THNK) | _______ | _______ | _______ | X(UNAM) | X(HEYE) | X(COOL) | X(EYES) | X(SMIR) | _______ | + | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | + | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | _______ | +``` \ No newline at end of file diff --git a/keyboards/xd75/keymaps/bramver/config.h b/keyboards/xd75/keymaps/bramver/config.h new file mode 100644 index 000000000000..2264af74c278 --- /dev/null +++ b/keyboards/xd75/keymaps/bramver/config.h @@ -0,0 +1,25 @@ +/* Copyright 2018 darm + * + * 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 + +#define MOUSEKEY_DELAY 0 +#define MOUSEKEY_INTERVAL 16 +#define MOUSEKEY_MAX_SPEED 7 +#define MOUSEKEY_TIME_TO_MAX 60 +#define MOUSEKEY_WHEEL_MAX_SPEED 8 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 40 +#define MOUSEKEY_WHEEL_DELAY 0 diff --git a/keyboards/xd75/keymaps/bramver/keymap.c b/keyboards/xd75/keymaps/bramver/keymap.c new file mode 100644 index 000000000000..831278d001b3 --- /dev/null +++ b/keyboards/xd75/keymaps/bramver/keymap.c @@ -0,0 +1,115 @@ +/* Copyright 2018 darm + * + * 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 QMK_KEYBOARD_H + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// Layer shorthand +#define _BASE 0 +#define _LOWER 1 +#define _LINVERT 2 +#define _RAISE 3 +#define _EMOJIFY 4 + +enum emoji_map { + UNAM, // unamused 😒 + HEYE, // smiling face with heart shaped eyes 😍 + OK, // ok hand sign 👌 + SMIR, // smirk 😏 + PRAY, // pray 🙏 + CELE, // celebration 🙌 + COOL, // smile with sunglasses 😎 + EYES, // eyes + THNK, // BIG THONK + NAIL, // Nailcare 💅 +}; + +const uint32_t PROGMEM unicode_map[] = { + [UNAM] = 0x1F612, + [HEYE] = 0x1f60d, + [OK] = 0x1F44C, + [SMIR] = 0x1F60F, + [PRAY] = 0x1F64F, + [CELE] = 0x1F64C, + [COOL] = 0x1F60E, + [EYES] = 0x1F440, + [THNK] = 0x1F914, + [NAIL] = 0x1F485, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_BASE] = { + { KC_GESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_MPRV , KC_MPLY , KC_MNXT , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_BSPC }, + { KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_MINS , KC_EQL , KC_BSLS , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_ENT }, + { MO(3) , KC_A , KC_S , KC_D , KC_F , KC_G , KC_LBRC , KC_MUTE , KC_RBRC , 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_HOME , KC_SLEP , KC_END , KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_RSFT }, + { KC_LCTL , MO(4) , KC_LALT , KC_LGUI , KC_SPC , KC_SPC , MO(1) , KC_DEL , MO(2) , KC_SPC , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , KC_RGUI }, + }, + + [_LOWER] = { + { _______ , _______ , _______ , _______ , _______ , _______ , BL_TOGG , BL_DEC , BL_INC , _______ , _______ , _______ , _______ , _______ , _______ }, + { _______ , KC_WH_L , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_U , BL_STEP , RGB_TOG , RGB_MOD , _______ , _______ , _______ , _______ , _______ , _______ }, + { _______ , KC_WH_R , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_D , RGB_HUI , RGB_HUD , RGB_SAI , _______ , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , RGB_SAD , RGB_VAI , RGB_VAD , _______ , _______ , _______ , _______ , _______ , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + }, + + [_LINVERT] = { + { _______ , _______ , _______ , _______ , _______ , _______ , BL_TOGG , BL_DEC , BL_INC , _______ , _______ , _______ , _______ , _______ , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , BL_STEP , RGB_TOG , RGB_MOD , KC_WH_U , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_L , _______ }, + { _______ , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , _______ , RGB_SAI , RGB_HUI , RGB_HUD , KC_WH_D , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_R , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , RGB_SAD , RGB_VAI , RGB_VAD , _______ , _______ , _______ , _______ , _______ , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + }, + + [_RAISE] = { + { KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , _______ , _______ , _______ , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 }, + { _______ , _______ , KC_7 , KC_8 , KC_9 , _______ , _______ , _______ , _______ , _______ , KC_MUTE , KC_VOLD , KC_VOLU , _______ , _______ }, + { _______ , _______ , KC_4 , KC_5 , KC_6 , _______ , _______ , _______ , _______ , _______ , KC_MPRV , KC_MPLY , KC_MNXT , _______ , _______ }, + { _______ , _______ , KC_1 , KC_2 , KC_3 , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + { _______ , _______ , _______ , KC_0 , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + }, + + [_EMOJIFY] = { + { TO(0) , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , RESET }, + { _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + { _______ , X(CELE) , X(PRAY) , X(NAIL) , X(OK) , X(THNK) , _______ , _______ , _______ , X(UNAM) , X(HEYE) , X(COOL) , X(EYES) , X(SMIR) , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + }, + +}; + +const uint16_t PROGMEM fn_actions[] = {}; + +void matrix_init_user(void) { + _delay_ms(20); // Gets rid of tick + set_unicode_input_mode(UC_LNX); +} + +/* Template for future layers + [_LAYER_NAME] = { + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + } +}; +*/ diff --git a/keyboards/xd75/keymaps/bramver/rules.mk b/keyboards/xd75/keymaps/bramver/rules.mk new file mode 100644 index 000000000000..1c3d4d8cd088 --- /dev/null +++ b/keyboards/xd75/keymaps/bramver/rules.mk @@ -0,0 +1,7 @@ +# Build options +BACKLIGHT_ENABLE = yes # Switch LEDs +MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses +RGBLIGHT_ENABLE = yes # LED strips +EXTRAKEY_ENABLE = yes # Use system and audio control key codes +TAP_DANCE_ENABLE = no # Use multi-tap features +UNICODEMAP_ENABLE = yes # Emojify me pls From 9aecf4ccfdbef6123bbf0a1e6670f85f4763ee89 Mon Sep 17 00:00:00 2001 From: Florian Didron Date: Tue, 2 Oct 2018 08:41:19 +0900 Subject: [PATCH 113/505] Adds a method allowing to set custom colors to the rgb matrix --- quantum/rgb_matrix.c | 7 +++++++ quantum/rgb_matrix.h | 1 + 2 files changed, 8 insertions(+) diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index f0c2ddfdfbba..1f00e9d99b47 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -903,3 +903,10 @@ void rgblight_mode(uint8_t mode) { uint32_t rgblight_get_mode(void) { return rgb_matrix_config.mode; } + +void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val) { + rgb_matrix_config.hue = hue; + rgb_matrix_config.sat = sat; + rgb_matrix_config.val = val; + eeconfig_update_rgb_matrix(rgb_matrix_config.raw); +} diff --git a/quantum/rgb_matrix.h b/quantum/rgb_matrix.h index 45caaac423d2..d2450a7d999b 100644 --- a/quantum/rgb_matrix.h +++ b/quantum/rgb_matrix.h @@ -128,6 +128,7 @@ uint32_t rgb_matrix_get_tick(void); void rgblight_toggle(void); void rgblight_step(void); +void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val); void rgblight_step_reverse(void); void rgblight_increase_hue(void); void rgblight_decrease_hue(void); From 1741e39e3463ac3cc6164656b0cc7afa8c33cc00 Mon Sep 17 00:00:00 2001 From: yiancar Date: Wed, 3 Oct 2018 00:03:50 +0100 Subject: [PATCH 114/505] New keyboard: Baguette (#4047) * Bagette Addition of Baguette a close group buy custom * Add json --- keyboards/baguette/baguette.c | 71 ++++++ keyboards/baguette/baguette.h | 59 +++++ keyboards/baguette/config.h | 224 +++++++++++++++++++ keyboards/baguette/info.json | 16 ++ keyboards/baguette/keymaps/default/keymap.c | 50 +++++ keyboards/baguette/keymaps/default/readme.md | 9 + keyboards/baguette/keymaps/iso/keymap.c | 50 +++++ keyboards/baguette/keymaps/iso/readme.md | 10 + keyboards/baguette/readme.md | 16 ++ keyboards/baguette/rules.mk | 81 +++++++ 10 files changed, 586 insertions(+) create mode 100644 keyboards/baguette/baguette.c create mode 100644 keyboards/baguette/baguette.h create mode 100644 keyboards/baguette/config.h create mode 100644 keyboards/baguette/info.json create mode 100644 keyboards/baguette/keymaps/default/keymap.c create mode 100644 keyboards/baguette/keymaps/default/readme.md create mode 100644 keyboards/baguette/keymaps/iso/keymap.c create mode 100644 keyboards/baguette/keymaps/iso/readme.md create mode 100644 keyboards/baguette/readme.md create mode 100644 keyboards/baguette/rules.mk diff --git a/keyboards/baguette/baguette.c b/keyboards/baguette/baguette.c new file mode 100644 index 000000000000..6a8df873ab23 --- /dev/null +++ b/keyboards/baguette/baguette.c @@ -0,0 +1,71 @@ +/* Copyright 2018 Yiancar + * + * 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 "baguette.h" + +void bootmagic_lite(void) +{ + // The lite version of TMK's bootmagic made by Wilba. + // 100% less potential for accidentally making the + // keyboard do stupid things. + + // We need multiple scans because debouncing can't be turned off. + matrix_scan(); + wait_ms(DEBOUNCING_DELAY); + matrix_scan(); + + // If the Esc and space bar are held down on power up, + // reset the EEPROM valid state and jump to bootloader. + // Assumes Esc is at [0,0] and spacebar is at [4,7]. + // This isn't very generalized, but we need something that doesn't + // rely on user's keymaps in firmware or EEPROM. + if ( ( matrix_get_row(0) & (1<<0) ) && + ( matrix_get_row(4) & (1<<7) ) ) + { + // Set the TMK/QMK EEPROM state as invalid. + eeconfig_disable(); + //eeprom_set_valid(false); + // Jump to bootloader. + bootloader_jump(); + } +} + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + bootmagic_lite(); + + 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/baguette/baguette.h b/keyboards/baguette/baguette.h new file mode 100644 index 000000000000..e3945bea7ee6 --- /dev/null +++ b/keyboards/baguette/baguette.h @@ -0,0 +1,59 @@ +/* Copyright 2018 Yiancar + * + * 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 BAGUETTE_H +#define BAGUETTE_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1F, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \ + K42, K43, K47, K4B, K4C, K4D, K4E, K4F \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO, KC_NO }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, KC_NO }, \ + { KC_NO, KC_NO, K42, K43, KC_NO, KC_NO, KC_NO, K47, KC_NO, KC_NO, KC_NO, K4B, K4C, K4D, K4E, K4F } \ +} + +#define LAYOUT_iso( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1F, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K1D, K2D, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \ + K42, K43, K47, K4B, K4C, K4D, K4E, K4F \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, KC_NO, KC_NO, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K1D, K2D, KC_NO, KC_NO }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, KC_NO }, \ + { KC_NO, KC_NO, K42, K43, KC_NO, KC_NO, KC_NO, K47, KC_NO, KC_NO, KC_NO, K4B, K4C, K4D, K4E, K4F } \ +} + +#endif diff --git a/keyboards/baguette/config.h b/keyboards/baguette/config.h new file mode 100644 index 000000000000..806f9fb4f69d --- /dev/null +++ b/keyboards/baguette/config.h @@ -0,0 +1,224 @@ +/* +Copyright 2018 Yiancar + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x5050 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Yiancar +#define PRODUCT Baguette +#define DESCRIPTION A French Custom + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +/* + * 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 { B3, B2, B1, E6, D6 } +#define MATRIX_COL_PINS { B6, C6, C7, F7, F6, F5, F4, F1, F0, B0, D0, D1, D2, D3, D5, D4 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B7 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 5 + +// #define RGB_DI_PIN E2 +// #ifdef RGB_DI_PIN +// #define RGBLIGHT_ANIMATIONS +// #define RGBLED_NUM 16 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 +// #endif + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + diff --git a/keyboards/baguette/info.json b/keyboards/baguette/info.json new file mode 100644 index 000000000000..777899a60015 --- /dev/null +++ b/keyboards/baguette/info.json @@ -0,0 +1,16 @@ +{ + "keyboard_name": "Baguette", + "url": "", + "maintainer": "qmk", + "bootloader": "atmel-dfu", + "width": 19.75, + "height": 6.5, + "layouts": { + "LAYOUT_ansi": { + "layout": [{"label":"~", "x":3.25, "y":1.5}, {"label":"!", "x":4.25, "y":1.5}, {"label":"@", "x":5.25, "y":1.5}, {"label":"#", "x":6.25, "y":1.5}, {"label":"$", "x":7.25, "y":1.5}, {"label":"%", "x":8.25, "y":1.5}, {"label":"^", "x":9.25, "y":1.5}, {"label":"&", "x":10.25, "y":1.5}, {"label":"*", "x":11.25, "y":1.5}, {"label":"(", "x":12.25, "y":1.5}, {"label":")", "x":13.25, "y":1.5}, {"label":"_", "x":14.25, "y":1.5}, {"label":"+", "x":15.25, "y":1.5}, {"label":"|", "x":16.25, "y":1.5}, {"label":"Del", "x":17.25, "y":1.5}, {"label":"Insert", "x":18.75, "y":1.5}, {"label":"Tab", "x":3.25, "y":2.5, "w":1.5}, {"label":"Q", "x":4.75, "y":2.5}, {"label":"W", "x":5.75, "y":2.5}, {"label":"E", "x":6.75, "y":2.5}, {"label":"R", "x":7.75, "y":2.5}, {"label":"T", "x":8.75, "y":2.5}, {"label":"Y", "x":9.75, "y":2.5}, {"label":"U", "x":10.75, "y":2.5}, {"label":"I", "x":11.75, "y":2.5}, {"label":"O", "x":12.75, "y":2.5}, {"label":"P", "x":13.75, "y":2.5}, {"label":"{", "x":14.75, "y":2.5}, {"label":"}", "x":15.75, "y":2.5}, {"label":"|", "x":16.75, "y":2.5, "w":1.5}, {"label":"Delete", "x":18.75, "y":2.5}, {"label":"Control", "x":3.25, "y":3.5, "w":1.75}, {"label":"A", "x":5, "y":3.5}, {"label":"S", "x":6, "y":3.5}, {"label":"D", "x":7, "y":3.5}, {"label":"F", "x":8, "y":3.5}, {"label":"G", "x":9, "y":3.5}, {"label":"H", "x":10, "y":3.5}, {"label":"J", "x":11, "y":3.5}, {"label":"K", "x":12, "y":3.5}, {"label":"L", "x":13, "y":3.5}, {"label":":", "x":14, "y":3.5}, {"label":"\"", "x":15, "y":3.5}, {"label":"Enter", "x":16, "y":3.5, "w":2.25}, {"x":3.25, "y":4.5, "w":1.25}, {"x":4.5, "y":4.5}, {"label":"Z", "x":5.5, "y":4.5}, {"label":"X", "x":6.5, "y":4.5}, {"label":"C", "x":7.5, "y":4.5}, {"label":"V", "x":8.5, "y":4.5}, {"label":"B", "x":9.5, "y":4.5}, {"label":"N", "x":10.5, "y":4.5}, {"label":"M", "x":11.5, "y":4.5}, {"label":"<", "x":12.5, "y":4.5}, {"label":">", "x":13.5, "y":4.5}, {"label":"?", "x":14.5, "y":4.5}, {"x":15.5, "y":4.5}, {"label":"Shift", "x":16.5, "y":4.5, "w":1.25}, {"label":"\u2191", "x":17.75, "y":4.5}, {"label":"Win", "x":4.5, "y":5.5}, {"label":"Alt", "x":5.5, "y":5.5, "w":1.25}, {"x":6.75, "y":5.5, "w":6.25}, {"label":"Ctrl", "x":13, "y":5.5, "w":1.25}, {"label":"Fn", "x":14.25, "y":5.5}, {"label":"\u2190", "x":16.75, "y":5.5}, {"label":"\u2193", "x":17.75, "y":5.5}, {"label":"\u2192", "x":18.75, "y":5.5}] + }, + "LAYOUT_iso": { + "layout": [{"label":"~", "x":3.25, "y":1.5}, {"label":"!", "x":4.25, "y":1.5}, {"label":"@", "x":5.25, "y":1.5}, {"label":"#", "x":6.25, "y":1.5}, {"label":"$", "x":7.25, "y":1.5}, {"label":"%", "x":8.25, "y":1.5}, {"label":"^", "x":9.25, "y":1.5}, {"label":"&", "x":10.25, "y":1.5}, {"label":"*", "x":11.25, "y":1.5}, {"label":"(", "x":12.25, "y":1.5}, {"label":")", "x":13.25, "y":1.5}, {"label":"_", "x":14.25, "y":1.5}, {"label":"+", "x":15.25, "y":1.5}, {"label":"|", "x":16.25, "y":1.5}, {"label":"Del", "x":17.25, "y":1.5}, {"label":"Insert", "x":18.75, "y":1.5}, {"label":"Tab", "x":3.25, "y":2.5, "w":1.5}, {"label":"Q", "x":4.75, "y":2.5}, {"label":"W", "x":5.75, "y":2.5}, {"label":"E", "x":6.75, "y":2.5}, {"label":"R", "x":7.75, "y":2.5}, {"label":"T", "x":8.75, "y":2.5}, {"label":"Y", "x":9.75, "y":2.5}, {"label":"U", "x":10.75, "y":2.5}, {"label":"I", "x":11.75, "y":2.5}, {"label":"O", "x":12.75, "y":2.5}, {"label":"P", "x":13.75, "y":2.5}, {"label":"{", "x":14.75, "y":2.5}, {"label":"}", "x":15.75, "y":2.5}, {"label":"Enter", "x":17, "y":2.5, "w":1.25, "h":2}, {"label":"Delete", "x":18.75, "y":2.5}, {"label":"Control", "x":3.25, "y":3.5, "w":1.75}, {"label":"A", "x":5, "y":3.5}, {"label":"S", "x":6, "y":3.5}, {"label":"D", "x":7, "y":3.5}, {"label":"F", "x":8, "y":3.5}, {"label":"G", "x":9, "y":3.5}, {"label":"H", "x":10, "y":3.5}, {"label":"J", "x":11, "y":3.5}, {"label":"K", "x":12, "y":3.5}, {"label":"L", "x":13, "y":3.5}, {"label":":", "x":14, "y":3.5}, {"label":"\"", "x":15, "y":3.5}, {"x":16, "y":3.5}, {"x":3.25, "y":4.5, "w":1.25}, {"x":4.5, "y":4.5}, {"label":"Z", "x":5.5, "y":4.5}, {"label":"X", "x":6.5, "y":4.5}, {"label":"C", "x":7.5, "y":4.5}, {"label":"V", "x":8.5, "y":4.5}, {"label":"B", "x":9.5, "y":4.5}, {"label":"N", "x":10.5, "y":4.5}, {"label":"M", "x":11.5, "y":4.5}, {"label":"<", "x":12.5, "y":4.5}, {"label":">", "x":13.5, "y":4.5}, {"label":"?", "x":14.5, "y":4.5}, {"x":15.5, "y":4.5}, {"label":"Shift", "x":16.5, "y":4.5, "w":1.25}, {"label":"\u2191", "x":17.75, "y":4.5}, {"label":"Win", "x":4.5, "y":5.5}, {"label":"Alt", "x":5.5, "y":5.5, "w":1.25}, {"x":6.75, "y":5.5, "w":6.25}, {"label":"Ctrl", "x":13, "y":5.5, "w":1.25}, {"label":"Fn", "x":14.25, "y":5.5}, {"label":"\u2190", "x":16.75, "y":5.5}, {"label":"\u2193", "x":17.75, "y":5.5}, {"label":"\u2192", "x":18.75, "y":5.5}] + } + } +} diff --git a/keyboards/baguette/keymaps/default/keymap.c b/keyboards/baguette/keymaps/default/keymap.c new file mode 100644 index 000000000000..4dfcb837a55a --- /dev/null +++ b/keyboards/baguette/keymaps/default/keymap.c @@ -0,0 +1,50 @@ +/* Copyright 2018 Yiancar + * + * 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 QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT_ansi( /* Base */ + KC_GESC, 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_TRNS, KC_INS,\ + 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_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_TRNS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_TRNS, KC_RSFT, KC_UP, \ + KC_LGUI, KC_LALT, KC_SPC, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RGHT), + +[1] = LAYOUT_ansi( /* FN */ + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS,\ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS,\ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, BL_TOGG, BL_STEP, BL_BRTG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_RCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/baguette/keymaps/default/readme.md b/keyboards/baguette/keymaps/default/readme.md new file mode 100644 index 000000000000..1e74a02cd6a0 --- /dev/null +++ b/keyboards/baguette/keymaps/default/readme.md @@ -0,0 +1,9 @@ +# The default ANSI keymap for baguette + +Typical ANSI keymap. Please note: +- Left key from split backspace is connected to 2u key. +- Left key from split left Shift is connected to 2u key. +- Right key from split right Shift is connected to 2u key. +- Backlight control is on the Z, X and C keys of the FN layer. +- Reset key combination is FN + ]. +- Holding ESC and Space while plugging in the USB erases the EEPROM. diff --git a/keyboards/baguette/keymaps/iso/keymap.c b/keyboards/baguette/keymaps/iso/keymap.c new file mode 100644 index 000000000000..ea8baf08ee5f --- /dev/null +++ b/keyboards/baguette/keymaps/iso/keymap.c @@ -0,0 +1,50 @@ +/* Copyright 2018 Yiancar + * + * 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 QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT_iso( /* Base */ + KC_GESC, 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_TRNS, KC_INS,\ + 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_DEL,\ + 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_QUOT, KC_ENT, \ + KC_LSFT, KC_TRNS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_TRNS, KC_RSFT, KC_UP, \ + KC_LGUI, KC_LALT, KC_SPC, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RGHT), + +[0] = LAYOUT_iso( /* FN */ + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS,\ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS,\ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, BL_TOGG, BL_STEP, BL_BRTG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_RCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/baguette/keymaps/iso/readme.md b/keyboards/baguette/keymaps/iso/readme.md new file mode 100644 index 000000000000..9256820a5c50 --- /dev/null +++ b/keyboards/baguette/keymaps/iso/readme.md @@ -0,0 +1,10 @@ +# The default ISO keymap for baguette + +Typical ISO keymap. Please note: +- Left key from split backspace is connected to 2u key. +- Left key from split left Shift is connected to 2u key. +- Right key from split right Shift is connected to 2u key. +- Backlight control is on the Z, X and C keys of the FN layer. +- Reset key combination is FN + ]. +- Holding ESC and Space while plugging in the USB erases the EEPROM. + diff --git a/keyboards/baguette/readme.md b/keyboards/baguette/readme.md new file mode 100644 index 000000000000..d211af16a546 --- /dev/null +++ b/keyboards/baguette/readme.md @@ -0,0 +1,16 @@ +Baguette +======== + +![Baguette](https://cdn.discordapp.com/attachments/426880953143525384/479788409263489035/scecre2.png) + +This is a custom keyboard with backlight inspired by France. + +Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [github](https://github.com/yiancar) +Hardware Supported: ATMEGA 32u4 MCU with backlight support. +Hardware Availability: Closed group-buy please contact the runners (Tesletron and Enjoy) + +Make example for this keyboard (after setting up your build environment): + + make baguette:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/baguette/rules.mk b/keyboards/baguette/rules.mk new file mode 100644 index 000000000000..062ff1b22c68 --- /dev/null +++ b/keyboards/baguette/rules.mk @@ -0,0 +1,81 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From 37cfd2c5009b932cfddec815c63c6846a5ef3854 Mon Sep 17 00:00:00 2001 From: takashiski Date: Wed, 3 Oct 2018 09:51:43 +0900 Subject: [PATCH 115/505] add JP keycode for MacOSX (#4033) --- quantum/keymap_extras/keymap_jp.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/quantum/keymap_extras/keymap_jp.h b/quantum/keymap_extras/keymap_jp.h index fb74bce8d48c..b0235f1120ee 100644 --- a/quantum/keymap_extras/keymap_jp.h +++ b/quantum/keymap_extras/keymap_jp.h @@ -40,6 +40,9 @@ #define JP_HENK KC_INT4 // henkan #define JP_KANA KC_INT2 // katakana/hiragana|ro-mazi +#define JP_MKANA KC_LANG1 //kana on MacOSX +#define JP_MEISU KC_LANG2 //eisu on MacOSX + //Aliases for shifted symbols #define JP_DQT LSFT(KC_2) // " From 2d671a7e1a75bb9d03a40c0e440f897c7e52a15e Mon Sep 17 00:00:00 2001 From: Chris Johnston Date: Tue, 2 Oct 2018 22:16:49 -0700 Subject: [PATCH 116/505] Enable support for Linux Mint 18 with linux_install.sh (#4042) Enable support for ubuntu-derived linux-es in installer Checks /etc/os-release for mention of ubuntu and debian. Linux Mint uses ID_LIKE=ubuntu, not ID_LIKE=debian (as seen in Ubuntu 16.04, unsure about others) --- util/linux_install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/linux_install.sh b/util/linux_install.sh index 9b8b92d08762..0e4e26fd96a7 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -4,7 +4,7 @@ if grep ID /etc/os-release | grep -qE "rhel|fedora"; then sudo dnf install gcc unzip wget zip dfu-util dfu-programmer avr-gcc \ avr-libc binutils-avr32-linux-gnu arm-none-eabi-gcc-cs \ arm-none-eabi-binutils-cs arm-none-eabi-newlib -elif grep ID /etc/os-release | grep -q debian; then +elif grep ID /etc/os-release | grep -qE 'debian|ubuntu'; then sudo apt-get update sudo apt-get install gcc unzip wget zip gcc-avr binutils-avr avr-libc \ dfu-programmer dfu-util gcc-arm-none-eabi binutils-arm-none-eabi \ @@ -38,5 +38,5 @@ fi else echo "Sorry, we don't recognize your OS. Help us by contributing support!" echo - echo "https://docs.qmk.fm/contributing.html" + echo "https://docs.qmk.fm/#/contributing" fi From 76f0b3cc70d8d1173f9145abc4d2725fd8f47302 Mon Sep 17 00:00:00 2001 From: "James D. Marble" Date: Tue, 2 Oct 2018 20:13:04 -0700 Subject: [PATCH 117/505] Add missing F-keys to ergodox_infinity input_club F11 and F12 were in the ascii art, but not the actual mapping. This corrects the error. --- keyboards/ergodox_infinity/keymaps/input_club/keymap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/ergodox_infinity/keymaps/input_club/keymap.c b/keyboards/ergodox_infinity/keymaps/input_club/keymap.c index e77319d2c8fe..45ad1f51f702 100644 --- a/keyboards/ergodox_infinity/keymaps/input_club/keymap.c +++ b/keyboards/ergodox_infinity/keymaps/input_club/keymap.c @@ -93,7 +93,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | * +-----+-----+-----+ */ - KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, @@ -120,7 +120,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | * +-----+-----+-----+ */ - KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, From d435dabefb6b6870de2e1d2a660c0e9be8fa25e5 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 3 Oct 2018 08:29:29 -0700 Subject: [PATCH 118/505] Keyboard: Mint60: Configurator support and readme cleanup (#4057) * Mint60: add Configurator support * Mint60: readme cleanup Fixed the imgur url so the photo shows up, and updated the links to the docs. --- keyboards/mint60/info.json | 78 ++++++++++++++++++++++++++++++++++++++ keyboards/mint60/readme.md | 4 +- 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/keyboards/mint60/info.json b/keyboards/mint60/info.json index e69de29bb2d1..f03e6371b129 100644 --- a/keyboards/mint60/info.json +++ b/keyboards/mint60/info.json @@ -0,0 +1,78 @@ +{ + "keyboard_name": "Mint60", + "url": "", + "maintainer": "eucalyn", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"~", "x":0, "y":0}, + {"label":"!", "x":1, "y":0}, + {"label":"@", "x":2, "y":0}, + {"label":"#", "x":3, "y":0}, + {"label":"$", "x":4, "y":0}, + {"label":"%", "x":5, "y":0}, + {"label":"^", "x":7, "y":0}, + {"label":"&", "x":8, "y":0}, + {"label":"*", "x":9, "y":0}, + {"label":"(", "x":10, "y":0}, + {"label":")", "x":11, "y":0}, + {"label":"_", "x":12, "y":0}, + {"label":"+", "x":13, "y":0}, + {"label":"Backspace", "x":14, "y":0, "w":2}, + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":7.5, "y":1}, + {"label":"U", "x":8.5, "y":1}, + {"label":"I", "x":9.5, "y":1}, + {"label":"O", "x":10.5, "y":1}, + {"label":"P", "x":11.5, "y":1}, + {"label":"{", "x":12.5, "y":1}, + {"label":"}", "x":13.5, "y":1}, + {"label":"|", "x":14.5, "y":1, "w":1.5}, + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":7.75, "y":2}, + {"label":"J", "x":8.75, "y":2}, + {"label":"K", "x":9.75, "y":2}, + {"label":"L", "x":10.75, "y":2}, + {"label":":", "x":11.75, "y":2}, + {"label":"\"", "x":12.75, "y":2}, + {"label":"Enter", "x":13.75, "y":2, "w":2.25}, + {"label":"Shift", "x":0, "y":3, "w":2}, + {"label":"Z", "x":2, "y":3}, + {"label":"X", "x":3, "y":3}, + {"label":"C", "x":4, "y":3}, + {"label":"V", "x":5, "y":3}, + {"label":"B", "x":6, "y":3}, + {"label":"N", "x":8, "y":3}, + {"label":"M", "x":9, "y":3}, + {"label":"<", "x":10, "y":3}, + {"label":">", "x":11, "y":3}, + {"label":"?", "x":12, "y":3}, + {"label":"Shift", "x":13, "y":3}, + {"label":"Up", "x":14, "y":3}, + {"label":"Fn", "x":15, "y":3}, + {"label":"Esc", "x":0, "y":4}, + {"label":"Ctrl", "x":1, "y":4, "w":1.25}, + {"label":"Win", "x":2.25, "y":4, "w":1.25}, + {"label":"Alt", "x":3.5, "y":4, "w":1.25}, + {"label":"Space", "x":4.75, "y":4, "w":2.25}, + {"label":"Space", "x":7.75, "y":4, "w":2.75}, + {"label":"Win", "x":10.5, "y":4, "w":1.25}, + {"label":"Ctrl", "x":11.75, "y":4, "w":1.25}, + {"label":"Left", "x":13, "y":4}, + {"label":"Down", "x":14, "y":4}, + {"label":"Right", "x":15, "y":4}] + } + } +} diff --git a/keyboards/mint60/readme.md b/keyboards/mint60/readme.md index b8ae720f5b52..1824c682f862 100644 --- a/keyboards/mint60/readme.md +++ b/keyboards/mint60/readme.md @@ -1,6 +1,6 @@ # Mint60 -![Mint60](https://imgur.com/a/8xnTS4U) +![Mint60](https://i.imgur.com/suOE8HN.jpg) A short description of the keyboard/project @@ -12,4 +12,4 @@ Make example for this keyboard (after setting up your build environment): make mint60:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). From b9c503085191ea1fb0f9d80c7d083e316e9f0f7c Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 3 Oct 2018 08:30:13 -0700 Subject: [PATCH 119/505] Keyboard: KBD4x: corrected info.json file (#4056) The `info.json` file for the KBD4x was invalid due to a couple of extra commas. --- keyboards/kbd4x/info.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/kbd4x/info.json b/keyboards/kbd4x/info.json index 78d011e2c7b9..f9952e790311 100644 --- a/keyboards/kbd4x/info.json +++ b/keyboards/kbd4x/info.json @@ -53,7 +53,7 @@ {"label":"/", "x":8, "y":3}, {"label":"LEFT", "x":9, "y":3}, {"label":"DOWN", "x":10, "y":3}, - {"label":"RIGHT", "x":11, "y":3}, + {"label":"RIGHT", "x":11, "y":3} ] }, "LAYOUT_ortho_4x12": { @@ -105,7 +105,7 @@ {"label":"/", "x":8, "y":3}, {"label":"LEFT", "x":9, "y":3}, {"label":"DOWN", "x":10, "y":3}, - {"label":"RIGHT", "x":11, "y":3}, + {"label":"RIGHT", "x":11, "y":3} ] } } From b1c2849500df4d8fedeaf3a4d01bec1a15cf4cd0 Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Wed, 3 Oct 2018 16:30:44 +0100 Subject: [PATCH 120/505] Keymap: Add RGB matrix keypress effects and reduce firmware size. (#4055) --- keyboards/model01/keymaps/dshields/config.h | 1 + keyboards/model01/keymaps/dshields/rules.mk | 2 ++ keyboards/planck/keymaps/dshields/config.h | 1 + keyboards/planck/keymaps/dshields/rules.mk | 1 + 4 files changed, 5 insertions(+) diff --git a/keyboards/model01/keymaps/dshields/config.h b/keyboards/model01/keymaps/dshields/config.h index 4de2d3cbb303..1c78217f2fa0 100644 --- a/keyboards/model01/keymaps/dshields/config.h +++ b/keyboards/model01/keymaps/dshields/config.h @@ -1,5 +1,6 @@ #pragma once +#define RGB_MATRIX_KEYPRESSES #define RGB_DIGITAL_RAIN_DROPS 18 #define USB_MAX_POWER_CONSUMPTION 100 #define ONESHOT_TAP_TOGGLE 2 diff --git a/keyboards/model01/keymaps/dshields/rules.mk b/keyboards/model01/keymaps/dshields/rules.mk index 6c605daecf53..d3754cc1fc82 100644 --- a/keyboards/model01/keymaps/dshields/rules.mk +++ b/keyboards/model01/keymaps/dshields/rules.mk @@ -1 +1,3 @@ MOUSEKEY_ENABLE = yes +EXTRAKEY_ENABLE = no +CONSOLE_ENABLE = no diff --git a/keyboards/planck/keymaps/dshields/config.h b/keyboards/planck/keymaps/dshields/config.h index 512e2fbc6484..63434f60ca62 100644 --- a/keyboards/planck/keymaps/dshields/config.h +++ b/keyboards/planck/keymaps/dshields/config.h @@ -1,5 +1,6 @@ #pragma once +#define RGB_MATRIX_KEYPRESSES #define RGB_DIGITAL_RAIN_DROPS 24 #define USB_MAX_POWER_CONSUMPTION 100 #define ONESHOT_TAP_TOGGLE 2 diff --git a/keyboards/planck/keymaps/dshields/rules.mk b/keyboards/planck/keymaps/dshields/rules.mk index 8799c78f06c4..033e3c9c4e62 100644 --- a/keyboards/planck/keymaps/dshields/rules.mk +++ b/keyboards/planck/keymaps/dshields/rules.mk @@ -5,6 +5,7 @@ endif MOUSEKEY_ENABLE = yes # Mouse keys(+4700) COMMAND_ENABLE = no # Commands for debug and configuration CONSOLE_ENABLE = no # Console for debug(+400) +EXTRAKEY_ENABLE = no SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend API_SYSEX_ENABLE = no From 4d1d1b7196e4aec3f91cc17856aa15c9a92d6ace Mon Sep 17 00:00:00 2001 From: Jumail Mundekkat Date: Thu, 4 Oct 2018 01:32:56 +1000 Subject: [PATCH 121/505] Keyboard: Added JN68M keyboard to handwired (#4053) --- keyboards/handwired/jn68m/config.h | 54 +++++++++++++ keyboards/handwired/jn68m/info.json | 16 ++++ keyboards/handwired/jn68m/jn68m.c | 37 +++++++++ keyboards/handwired/jn68m/jn68m.h | 49 +++++++++++ .../handwired/jn68m/keymaps/default/config.h | 19 +++++ .../handwired/jn68m/keymaps/default/keymap.c | 75 +++++++++++++++++ keyboards/handwired/jn68m/readme.md | 14 ++++ keyboards/handwired/jn68m/rules.mk | 81 +++++++++++++++++++ 8 files changed, 345 insertions(+) create mode 100644 keyboards/handwired/jn68m/config.h create mode 100644 keyboards/handwired/jn68m/info.json create mode 100644 keyboards/handwired/jn68m/jn68m.c create mode 100644 keyboards/handwired/jn68m/jn68m.h create mode 100644 keyboards/handwired/jn68m/keymaps/default/config.h create mode 100644 keyboards/handwired/jn68m/keymaps/default/keymap.c create mode 100644 keyboards/handwired/jn68m/readme.md create mode 100644 keyboards/handwired/jn68m/rules.mk diff --git a/keyboards/handwired/jn68m/config.h b/keyboards/handwired/jn68m/config.h new file mode 100644 index 000000000000..22ab1158d7fd --- /dev/null +++ b/keyboards/handwired/jn68m/config.h @@ -0,0 +1,54 @@ +/* +Copyright 2018 Jumail Mundekkat / MxBlue + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xC714 +#define PRODUCT_ID 0x1010 +#define DEVICE_VER 0x0001 +#define MANUFACTURER MxBlue +#define PRODUCT JN68M +#define DESCRIPTION Custom PCB for VA68M + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { B0, B1, D5, D3, D2 } +#define MATRIX_COL_PINS { F0, F1, F4, F5, F6, F7, C7, C6, B6, B5, B4, D7, D6, D4, E6, D1 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not 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 magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) diff --git a/keyboards/handwired/jn68m/info.json b/keyboards/handwired/jn68m/info.json new file mode 100644 index 000000000000..ce95563e9691 --- /dev/null +++ b/keyboards/handwired/jn68m/info.json @@ -0,0 +1,16 @@ +{ + "keyboard_name": "JN68M", + "url": "", + "maintainer": "qmk", + "bootloader": "atmel-dfu", + "width": 17.25, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15.25, "y":1}, {"x":16.25, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":2.75}, {"x":15.25, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":14.25, "y":4}, {"x":15.25, "y":4}, {"x":16.25, "y":4}] + }, + "LAYOUT_splitbs": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15.25, "y":1}, {"x":16.25, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":2.75}, {"x":15.25, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":14.25, "y":4}, {"x":15.25, "y":4}, {"x":16.25, "y":4}] + } + } +} diff --git a/keyboards/handwired/jn68m/jn68m.c b/keyboards/handwired/jn68m/jn68m.c new file mode 100644 index 000000000000..b61b17aa9b36 --- /dev/null +++ b/keyboards/handwired/jn68m/jn68m.c @@ -0,0 +1,37 @@ +/* Copyright 2018 Jumail Mundekkat / MxBlue + * + * 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 "jn68m.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); +} diff --git a/keyboards/handwired/jn68m/jn68m.h b/keyboards/handwired/jn68m/jn68m.h new file mode 100644 index 000000000000..d47f9f6c9c5a --- /dev/null +++ b/keyboards/handwired/jn68m/jn68m.h @@ -0,0 +1,49 @@ +/* Copyright 2018 Jumail Mundekkat / MxBlue + * + * 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 JN68M_H +#define JN68M_H + +#include "quantum.h" + +#define LAYOUT( \ + K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10, K11, K12, K13, K14, K67, K68,\ + K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K69, K70,\ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42, \ + K43, K44, K45, K46, K47, K48, K49, K50, K51, K52, K53, K54, K55, \ + K56, K57, K58, K59, K60, K61, K63, K64, K65, K66 \ +) { \ + { K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10, K11, K12, K13, K14, K67, K68 }, \ + { K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K69, K70 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42,KC_NO,KC_NO,KC_NO}, \ + { K43, K44, K45, K46, K47, K48, K49, K50, K51, K52,KC_NO,K53, K54,KC_NO,K55,KC_NO}, \ + { K56, K57, K58,KC_NO,KC_NO,K59,KC_NO,KC_NO,KC_NO,K60,KC_NO,K61, K63, K64, K65, K66} \ +} + +#define LAYOUT_splitbs( \ + K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10, K11, K12, K13, K14, K15, K67, K68,\ + K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K69, K70,\ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42, \ + K43, K44, K45, K46, K47, K48, K49, K50, K51, K52, K53, K54, K55, \ + K56, K57, K58, K59, K60, K61, K63, K64, K65, K66 \ +) { \ + { K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10, K11, K12, K13, K14, K67, K68 }, \ + { K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K69, K70 }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42, K15,KC_NO,KC_NO}, \ + { K43, K44, K45, K46, K47, K48, K49, K50, K51, K52,KC_NO,K53, K54,KC_NO,K55,KC_NO}, \ + { K56, K57, K58,KC_NO,KC_NO,K59,KC_NO,KC_NO,KC_NO,K60,KC_NO,K61, K63, K64, K65, K66} \ +} + +#endif diff --git a/keyboards/handwired/jn68m/keymaps/default/config.h b/keyboards/handwired/jn68m/keymaps/default/config.h new file mode 100644 index 000000000000..4496c5910061 --- /dev/null +++ b/keyboards/handwired/jn68m/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 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 . + */ + +#pragma once + +// place overrides here diff --git a/keyboards/handwired/jn68m/keymaps/default/keymap.c b/keyboards/handwired/jn68m/keymaps/default/keymap.c new file mode 100644 index 000000000000..98eede94cb69 --- /dev/null +++ b/keyboards/handwired/jn68m/keymaps/default/keymap.c @@ -0,0 +1,75 @@ +/* Copyright 2018 Jumail Mundekkat / MxBlue + * + * 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 QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + KC_GESC, 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_PGUP, + 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_PGDN, + 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_UP, + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ), + + [1] = LAYOUT( + 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_PSCR, KC_HOME, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, + RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_APP, KC_TRNS, KC_TRNS, KC_TRNS + ), + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/handwired/jn68m/readme.md b/keyboards/handwired/jn68m/readme.md new file mode 100644 index 000000000000..f219564cae14 --- /dev/null +++ b/keyboards/handwired/jn68m/readme.md @@ -0,0 +1,14 @@ +# JN68M + +A custom replacement PCB for the VA68M and a birthday present for a mate. +PCB designed by /u/Xelus22 + +Keyboard Maintainer: [MxBlue](https://github.com/mxblu) +Hardware Supported: ATMega32u4 +Hardware Availability: Unavailable unless you happen to be Justin ;) + +Make example for this keyboard (after setting up your build environment): + + make handwired/jn68m:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/handwired/jn68m/rules.mk b/keyboards/handwired/jn68m/rules.mk new file mode 100644 index 000000000000..42d85ada17b9 --- /dev/null +++ b/keyboards/handwired/jn68m/rules.mk @@ -0,0 +1,81 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From 404db1d06fa9c0dd25fff3bfa1b2ebed7273a8fc Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 3 Oct 2018 08:33:14 -0700 Subject: [PATCH 122/505] handwired/ibm122m: refactor and Configurator support (#4054) * handwired/ibm122m: refactor Refactored layout macro and keymaps to more closely resemble the keyboard's physical layout. * handwired/ibm122m: add Configurator support --- keyboards/handwired/ibm122m/ibm122m.h | 15 +- keyboards/handwired/ibm122m/info.json | 136 ++++++++ .../ibm122m/keymaps/default/keymap.c | 22 +- .../handwired/ibm122m/keymaps/lukaus/keymap.c | 309 +++++++++--------- 4 files changed, 308 insertions(+), 174 deletions(-) diff --git a/keyboards/handwired/ibm122m/ibm122m.h b/keyboards/handwired/ibm122m/ibm122m.h index 93e18b4e60b6..a52bf4bc44db 100644 --- a/keyboards/handwired/ibm122m/ibm122m.h +++ b/keyboards/handwired/ibm122m/ibm122m.h @@ -21,14 +21,13 @@ // The first section contains all of the arguments // The second converts the arguments into a two-dimensional array #define LAYOUT( \ - k09, k19, k1A, k29, k39, k3A, k49, k59, k5A, k69, k79, k7A, k3G, k3H, k2G, \ - k0A, k0B, k1B, k2A, k2B, k3B, k4A, k4B, k5B, k6A, k6B, k7B, k1G, k5G, k4G, \ -k31, k32, k34, k24, k25, k26, k27, k37, k38, k28, k2C, k2D, k2E, k3E, k3C, k3F, k2F, k2H, k2I, k20, \ -k21, k41, k42, k44, k45, k46, k47, k57, k58, k48, k4C, k4D, k4E, k5E, k5C, k6F, k4F, k4H, k4I, k40, \ -k51, k52, k62, k14, k15, k16, k17, k07, k08, k18, k1C, k1D, k1E, k0E, k6E, k1F, k1H, k1I, k10, \ -k11, k12, k73, k74, k64, k65, k66, k67, k77, k78, k68, k6C, k6D, k7E, k63, k0G, k61, k6H, k6I, k7J, \ -k02, k01, k00, k70, k71, k03, k72, k60, k0J, k1J, k7H, k7I, \ - k0F \ + k09, k19, k1A, k29, k39, k3A, k49, k59, k5A, k69, k79, k7A, \ + k0A, k0B, k1B, k2A, k2B, k3B, k4A, k4B, k5B, k6A, k6B, k7B, \ + k31, k32, k34, k24, k25, k26, k27, k37, k38, k28, k2C, k2D, k2E, k3E, k3C, k3F, k3G, k3H, k2G, k2F, k2H, k2I, k20, \ + k21, k41, k42, k44, k45, k46, k47, k57, k58, k48, k4C, k4D, k4E, k5E, k5C, k6F, k1G, k5G, k4G, k4F, k4H, k4I, k40, \ + k51, k52, k62, k14, k15, k16, k17, k07, k08, k18, k1C, k1D, k1E, k0E, k6E, k0G, k1F, k1H, k1I, k10, \ + k11, k12, k73, k74, k64, k65, k66, k67, k77, k78, k68, k6C, k6D, k7E, k63, k60, k0J, k1J, k61, k6H, k6I, k7J, \ + k02, k01, k00, k70, k71, k03, k72, k0F, k7H, k7I \ ) \ { \ { k00, k01, k02, k03, KC_NO, KC_NO, KC_NO, k07, k08, k09, k0A, k0B, KC_NO, KC_NO, k0E, k0F, k0G, KC_NO, KC_NO, k0J }, \ diff --git a/keyboards/handwired/ibm122m/info.json b/keyboards/handwired/ibm122m/info.json index e69de29bb2d1..b9ce9e8f83e9 100644 --- a/keyboards/handwired/ibm122m/info.json +++ b/keyboards/handwired/ibm122m/info.json @@ -0,0 +1,136 @@ +{ + "keyboard_name": "IBM Model M 122-key", + "url": "", + "maintainer": "qmk", + "bootloader": "", + "width": 24.75, + "height": 8, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"F13", "x":3.25, "y":0}, + {"label":"F14", "x":4.25, "y":0}, + {"label":"F15", "x":5.25, "y":0}, + {"label":"F16", "x":6.25, "y":0}, + {"label":"F17", "x":7.25, "y":0}, + {"label":"F18", "x":8.25, "y":0}, + {"label":"F19", "x":9.25, "y":0}, + {"label":"F20", "x":10.25, "y":0}, + {"label":"F21", "x":11.25, "y":0}, + {"label":"F22", "x":12.25, "y":0}, + {"label":"F23", "x":13.25, "y":0}, + {"label":"F24", "x":14.25, "y":0}, + {"label":"F1", "x":3.25, "y":1}, + {"label":"F2", "x":4.25, "y":1}, + {"label":"F3", "x":5.25, "y":1}, + {"label":"F4", "x":6.25, "y":1}, + {"label":"F5", "x":7.25, "y":1}, + {"label":"F6", "x":8.25, "y":1}, + {"label":"F7", "x":9.25, "y":1}, + {"label":"F8", "x":10.25, "y":1}, + {"label":"F9", "x":11.25, "y":1}, + {"label":"F10", "x":12.25, "y":1}, + {"label":"F11", "x":13.25, "y":1}, + {"label":"F12", "x":14.25, "y":1}, + {"label":"Esc", "x":0, "y":3}, + {"x":1, "y":3}, + {"label":"`", "x":2.25, "y":3}, + {"label":"1", "x":3.25, "y":3}, + {"label":"2", "x":4.25, "y":3}, + {"label":"3", "x":5.25, "y":3}, + {"label":"4", "x":6.25, "y":3}, + {"label":"5", "x":7.25, "y":3}, + {"label":"6", "x":8.25, "y":3}, + {"label":"7", "x":9.25, "y":3}, + {"label":"8", "x":10.25, "y":3}, + {"label":"9", "x":11.25, "y":3}, + {"label":"0", "x":12.25, "y":3}, + {"label":"-", "x":13.25, "y":3}, + {"label":"=", "x":14.25, "y":3}, + {"label":"Backspace", "x":15.25, "y":3, "w":2}, + {"label":"Insert", "x":17.5, "y":3}, + {"label":"Home", "x":18.5, "y":3}, + {"label":"Page Up", "x":19.5, "y":3}, + {"label":"Num Lock", "x":20.75, "y":3}, + {"label":"/", "x":21.75, "y":3}, + {"label":"*", "x":22.75, "y":3}, + {"label":"-", "x":23.75, "y":3}, + {"x":0, "y":4}, + {"x":1, "y":4}, + {"label":"Tab", "x":2.25, "y":4, "w":1.5}, + {"label":"Q", "x":3.75, "y":4}, + {"label":"W", "x":4.75, "y":4}, + {"label":"E", "x":5.75, "y":4}, + {"label":"R", "x":6.75, "y":4}, + {"label":"T", "x":7.75, "y":4}, + {"label":"Y", "x":8.75, "y":4}, + {"label":"U", "x":9.75, "y":4}, + {"label":"I", "x":10.75, "y":4}, + {"label":"O", "x":11.75, "y":4}, + {"label":"P", "x":12.75, "y":4}, + {"label":"[", "x":13.75, "y":4}, + {"label":"]", "x":14.75, "y":4}, + {"label":"Enter", "x":16, "y":4, "w":1.25, "h":2}, + {"label":"Delete", "x":17.5, "y":4}, + {"label":"End", "x":18.5, "y":4}, + {"label":"Page Down", "x":19.5, "y":4}, + {"label":"7", "x":20.75, "y":4}, + {"label":"8", "x":21.75, "y":4}, + {"label":"9", "x":22.75, "y":4}, + {"label":"+", "x":23.75, "y":4}, + {"x":0, "y":5}, + {"x":1, "y":5}, + {"label":"Caps Lock", "x":2.25, "y":5, "w":1.75}, + {"label":"A", "x":4, "y":5}, + {"label":"S", "x":5, "y":5}, + {"label":"D", "x":6, "y":5}, + {"label":"F", "x":7, "y":5}, + {"label":"G", "x":8, "y":5}, + {"label":"H", "x":9, "y":5}, + {"label":"J", "x":10, "y":5}, + {"label":"K", "x":11, "y":5}, + {"label":"L", "x":12, "y":5}, + {"label":";", "x":13, "y":5}, + {"label":"'", "x":14, "y":5}, + {"label":"#", "x":15, "y":5}, + {"label":"Up", "x":18.5, "y":5}, + {"label":"4", "x":20.75, "y":5}, + {"label":"5", "x":21.75, "y":5}, + {"label":"6", "x":22.75, "y":5}, + {"x":23.75, "y":5}, + {"x":0, "y":6}, + {"x":1, "y":6}, + {"label":"Shift", "x":2.25, "y":6, "w":1.25}, + {"label":"\\", "x":3.5, "y":6}, + {"label":"Z", "x":4.5, "y":6}, + {"label":"X", "x":5.5, "y":6}, + {"label":"C", "x":6.5, "y":6}, + {"label":"V", "x":7.5, "y":6}, + {"label":"B", "x":8.5, "y":6}, + {"label":"N", "x":9.5, "y":6}, + {"label":"M", "x":10.5, "y":6}, + {"label":",", "x":11.5, "y":6}, + {"label":".", "x":12.5, "y":6}, + {"label":"/", "x":13.5, "y":6}, + {"label":"Shift", "x":14.5, "y":6, "w":2.75}, + {"label":"Left", "x":17.5, "y":6}, + {"x":18.5, "y":6}, + {"label":"Right", "x":19.5, "y":6}, + {"label":"1", "x":20.75, "y":6}, + {"label":"2", "x":21.75, "y":6}, + {"label":"3", "x":22.75, "y":6}, + {"label":"Enter", "x":23.75, "y":6, "h":2}, + {"x":0, "y":7}, + {"x":1, "y":7}, + {"label":"Ctrl", "x":2.25, "y":7, "w":1.5}, + {"label":"Alt", "x":4.75, "y":7, "w":1.5}, + {"x":6.25, "y":7, "w":7}, + {"label":"AltGr", "x":13.25, "y":7, "w":1.5}, + {"label":"Ctrl", "x":15.75, "y":7, "w":1.5}, + {"label":"Down", "x":18.5, "y":7}, + {"label":"0", "x":20.75, "y":7, "w":2}, + {"label":".", "x":22.75, "y":7} + ] + } + } +} diff --git a/keyboards/handwired/ibm122m/keymaps/default/keymap.c b/keyboards/handwired/ibm122m/keymaps/default/keymap.c index 633df106e941..fc383498a145 100644 --- a/keyboards/handwired/ibm122m/keymaps/default/keymap.c +++ b/keyboards/handwired/ibm122m/keymaps/default/keymap.c @@ -16,16 +16,16 @@ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -// Original Layer -[0] = LAYOUT( - KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, - 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_END, KC_PGDN, -KC_ESC, KC_NO, KC_GRV, 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_NLCK, KC_PSLS, KC_PAST, KC_PMNS, -KC_NO, KC_NO, 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_ENTER, KC_P7, KC_P8, KC_P9, KC_PPLS, -KC_NO, KC_NO, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_BSLS, KC_P4, KC_P5, KC_P6, KC_BSPC, -KC_NO, KC_NO, KC_LSHIFT,KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, -KC_NO, KC_NO, KC_LCTRL, KC_LALT, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_NO, KC_RIGHT,KC_P0, KC_PDOT, - KC_DOWN), + // Original Layer + [0] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, + 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_ESC, KC_NO, 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_NO, KC_NO, 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_ENT, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_NO, KC_NO, 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_BSLS, KC_UP, KC_P4, KC_P5, KC_P6, KC_BSPC, + KC_NO, KC_NO, KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_LEFT, KC_NO, KC_RIGHT, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_NO, KC_NO, KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_DOWN, KC_P0, KC_PDOT + ), }; void matrix_init_user(void) { @@ -37,7 +37,7 @@ void matrix_scan_user(void) { } bool process_record_user(uint16_t keycode, keyrecord_t *record) { - + return true; } diff --git a/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c b/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c index 02b69bacf079..9cd58c0ec9a9 100644 --- a/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c +++ b/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c @@ -16,7 +16,7 @@ #include QMK_KEYBOARD_H enum custom_keycodes { - PLACEHOLDER = SAFE_RANGE, + PLACEHOLDER = SAFE_RANGE, DVP_ESC, // Grave escape basically i think DVP_AMPR, @@ -37,105 +37,104 @@ enum custom_keycodes { }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -// Programmer's Dvorak -[0] = LAYOUT( - KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, - 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_END, KC_PGDN, -KC_ESC, TO(1), DVP_ESC, DVP_AMPR, DVP_LBRACKET, DVP_LCBR, DVP_RCBR, DVP_LPRN, DVP_EQUAL,DVP_ASTERISK, DVP_RPRN, DVP_PLUS, DVP_RBRACKET, DVP_EXLM, DVP_HASH, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, -KC_NO, TO(2), KC_TAB, KC_SCOLON,KC_COMMA, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, DVP_AT, KC_ENTER, KC_P7, KC_P8, KC_P9, KC_PPLS, -KC_NO, KC_NO, MO(3), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINUS, KC_BSLS, KC_P4, KC_P5, KC_P6, MO(4), -LCTL(KC_F), KC_LALT, KC_LSHIFT,KC_ESC, KC_QUOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, -LCTL(KC_C), LCTL(KC_V), KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_BTN3, KC_RIGHT, KC_P0, KC_PDOT, - KC_DOWN -), - -// Qwerty layer + function -[1] = LAYOUT( - KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, - 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_END, KC_PGDN, -KC_ESC, TO(0), KC_GRV, 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_NLCK, KC_PSLS, KC_PAST, KC_PMNS, -KC_NO, KC_NO, 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_ENTER, KC_P7, KC_P8, KC_P9, KC_PPLS, -KC_NO, KC_NO, MO(3), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_BSLS, KC_P4, KC_P5, KC_P6, KC_BSPC, -KC_NO, KC_NO, KC_LSHIFT,KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, -KC_NO, KC_LALT,KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_WH_D, KC_RIGHT,KC_P0, KC_PDOT, - KC_DOWN -), -// Orirginal Layer -[2] = LAYOUT( - KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, - 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_END, KC_PGDN, -KC_ESC, TO(1), KC_GRV, 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_NLCK, KC_PSLS, KC_PAST, KC_PMNS, -KC_NO, TO(0), 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_ENTER, KC_P7, KC_P8, KC_P9, KC_PPLS, -KC_NO, KC_NO, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_BSLS, KC_P4, KC_P5, KC_P6, KC_BSPC, -KC_NO, KC_NO, KC_LSHIFT,KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, -KC_NO, KC_LALT,KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_WH_D, KC_RIGHT,KC_P0, KC_PDOT, - KC_DOWN -), - -// Function Layer -[3] = LAYOUT( - 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_HOME, KC_PGUP, - KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_DEL, KC_END, KC_PGDN, -MU_TOG, KC_NO, 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_NLCK, KC_PSLS, KC_PAST, KC_PMNS, -MU_MOD, KC_NO, KC_TAB, KC_NO, KC_MEDIA_PREV_TRACK, KC_MEDIA_PLAY_PAUSE, KC_MEDIA_NEXT_TRACK, KC_NO, KC_NO, KC_PGUP, KC_DEL, KC_NO, KC_NO, KC_LBRC, KC_RBRC,KC_ENTER, KC_NO, KC_NO, KC_NO, KC_PPLS, -KC_NO, KC_NO, KC_TRNS, KC_NO, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_AUDIO_MUTE, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_SCOLON, KC_QUOT, KC_BSLS, LSFT(KC_E), LSFT(KC_F), KC_NO, KC_BSPC, -KC_NO, KC_LALT, KC_LSHIFT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGDN, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, LSFT(KC_B), LSFT(KC_C), LSFT(KC_D), KC_PENT, -KC_NO, KC_NO, KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_CAPS, KC_LEFT, KC_WH_D, KC_RIGHT,LSFT(KC_A), KC_PDOT, - KC_DOWN -), -// Literally just the numpad is different -[4] = LAYOUT( - KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, - 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_END, KC_PGDN, -KC_ESC, TO(1), DVP_ESC, DVP_AMPR, DVP_LBRACKET, DVP_LCBR, DVP_RCBR, DVP_LPRN, DVP_EQUAL,DVP_ASTERISK, DVP_RPRN, DVP_PLUS, DVP_RBRACKET, DVP_EXLM, DVP_HASH, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, -KC_NO, TO(2), KC_TAB, KC_SCOLON,KC_COMMA, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, DVP_AT, KC_ENTER, KC_BTN1, KC_MS_U, KC_BTN2, KC_NO, -KC_NO, KC_NO, TO(0), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINUS, KC_BSLS, KC_MS_L, KC_NO, KC_MS_R, KC_TRNS, -LCTL(KC_F), KC_LALT, KC_LSHIFT,KC_NO, KC_QUOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_UP, KC_GT, KC_MS_D, KC_GT, KC_PENT, -LCTL(KC_C), LCTL(KC_V), KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_BTN3, KC_RIGHT, KC_BTN1, KC_PDOT, - KC_DOWN -), -/* -[4] = LAYOUT( - KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_INS, KC_HOME, KC_PGUP, - 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_END, KC_PGDN, -MU_TOG, TO(0), KC_DLR, 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_NLCK, KC_PSLS, KC_PAST, KC_PMNS, -MU_MOD, KC_NO, KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LBRC, KC_RBRC,KC_ENTER, KC_NO, KC_NO, KC_NO, KC_PPLS, -KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_QUOT, KC_BSLS, LSFT(KC_E), LSFT(KC_F), KC_NO, KC_BSPC, -KC_NO, KC_LALT, KC_LSHIFT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, LSFT(KC_B), LSFT(KC_C), LSFT(KC_D), KC_PENT, -KC_NO, KC_LGUI, KC_LCTRL, KC_LALT, KC_SPC, KC_RALT, KC_RCTRL, KC_LEFT, KC_WH_D, KC_RIGHT, LSFT(KC_A), KC_PDOT, - KC_DOWN -),*/ -/*[0] = LAYOUT( - KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_NO,TO(1),KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, - KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, TO(2),KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, - KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, - KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_BSPC,KC_4,KC_4,KC_4, KC_4, - KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, - KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, - KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, - KC_8, KC_SPC,KC_8,KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, TO(1) - -), -[1] = LAYOUT( - KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, TO(0),KC_NO,KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, - KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, TO(2),KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, - KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, - KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_BSPC,KC_Q,KC_R,KC_S, KC_T, - KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, - KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, - KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, - KC_A, KC_SPC,KC_C,KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, TO(0) -), -[2] = LAYOUT( - KC_LCTRL, KC_LALT, KC_C, KC_RALT, KC_E, KC_F, KC_G, KC_G, KC_H, KC_J, TO(0), TO(1), KC_M, KC_N, KC_QUOT, KC_DOWN, KC_UP, KC_R, KC_S, KC_ENTER, - KC_PPLS, KC_B, KC_C, KC_D, KC_A, KC_S, KC_D, KC_F, KC_J, KC_J, KC_K, KC_NO, KC_K, KC_L, KC_SCOLON, KC_P4, KC_DEL, KC_P5, KC_P6, KC_RIGHT, - KC_PMNS, KC_1, KC_C, KC_D, KC_1, KC_2, KC_3, KC_4, KC_7, KC_J, KC_K, KC_L, KC_8, KC_9, KC_0, KC_NLCK, KC_PGUP,KC_PSLS, KC_PAST, KC_T, - KC_A, KC_ESC, TO(0),KC_D, KC_GRV, KC_F, KC_G, KC_5, KC_6, KC_J, KC_K, KC_L, KC_EQL, KC_N, KC_MINUS, KC_BSPC, KC_INS, KC_HOME, KC_S, KC_T, - KC_PPLS, KC_NO, KC_TAB, KC_D, KC_Q, KC_W, KC_E, KC_R, KC_U, KC_J, KC_K, KC_L, KC_I, KC_O, KC_P, KC_P7, KC_PGDN,KC_P8, KC_P9, KC_T, - KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_T, KC_Y, KC_J, KC_K, KC_L, KC_RBRC, KC_N, KC_LBRC, KC_P, KC_END, KC_R, KC_S, KC_T, - KC_LEFT, KC_P1, KC_CAPS, KC_RSFT, KC_Z, KC_X, KC_C, KC_V, KC_M, KC_J, KC_K, KC_L, KC_COMMA, KC_DOT, KC_BSLS, KC_PENT, KC_Q, KC_P2, KC_P3, KC_T, - KC_LGUI, KC_SPACE, KC_RCTRL, KC_LSHIFT, KC_E, KC_F, KC_G, KC_B, KC_N, KC_J, KC_K, KC_L, KC_M, KC_N, KC_SLSH, KC_P, KC_Q, KC_P0, KC_PDOT, KC_KP_ENTER + // Programmer's Dvorak + [0] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, + 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_ESC, TO(1), DVP_ESC, DVP_AMPR, DVP_LBRACKET, DVP_LCBR, DVP_RCBR, DVP_LPRN, DVP_EQUAL,DVP_ASTERISK, DVP_RPRN, DVP_PLUS, DVP_RBRACKET, DVP_EXLM, DVP_HASH, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_NO, TO(2), KC_TAB, KC_SCOLON,KC_COMMA, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, DVP_AT, KC_ENTER, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_NO, KC_NO, MO(3), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINUS, KC_BSLS, KC_UP, KC_P4, KC_P5, KC_P6, MO(4), + LCTL(KC_F), KC_LALT, KC_LSHIFT,KC_ESC, KC_QUOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_LEFT, KC_BTN3, KC_RIGHT, KC_P1, KC_P2, KC_P3, KC_PENT, + LCTL(KC_C), LCTL(KC_V), KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_DOWN, KC_P0, KC_PDOT + ), + + // Qwerty layer + function + [1] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, + 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_ESC, TO(0), KC_GRV, 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_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_NO, KC_NO, 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_ENTER, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_NO, KC_NO, MO(3), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_BSLS, KC_UP, KC_P4, KC_P5, KC_P6, KC_BSPC, + KC_NO, KC_NO, KC_LSHIFT,KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_LEFT, KC_WH_D, KC_RIGHT, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_NO, KC_LALT,KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_DOWN, KC_P0, KC_PDOT + ), + + // Orirginal Layer + [2] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, + 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_ESC, TO(1), KC_GRV, 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_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_NO, TO(0), 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_ENTER, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_NO, KC_NO, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_BSLS, KC_UP, KC_P4, KC_P5, KC_P6, KC_BSPC, + KC_NO, KC_NO, KC_LSHIFT,KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_LEFT, KC_WH_D, KC_RIGHT, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_NO, KC_LALT,KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_DOWN, KC_P0, KC_PDOT + ), + + // Function Layer + [3] = LAYOUT( + 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_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, + MU_TOG, KC_NO, 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_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + MU_MOD, KC_NO, KC_TAB, KC_NO, KC_MEDIA_PREV_TRACK, KC_MEDIA_PLAY_PAUSE, KC_MEDIA_NEXT_TRACK, KC_NO, KC_NO, KC_PGUP, KC_DEL, KC_NO, KC_NO, KC_LBRC, KC_RBRC,KC_ENTER, KC_DEL, KC_END, KC_PGDN, KC_NO, KC_NO, KC_NO, KC_PPLS, + KC_NO, KC_NO, KC_TRNS, KC_NO, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_AUDIO_MUTE, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_SCOLON, KC_QUOT, KC_BSLS, KC_UP, LSFT(KC_E), LSFT(KC_F), KC_NO, KC_BSPC, + KC_NO, KC_LALT, KC_LSHIFT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGDN, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_LEFT, KC_WH_D, KC_RIGHT, LSFT(KC_B), LSFT(KC_C), LSFT(KC_D), KC_PENT, + KC_NO, KC_NO, KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_CAPS, KC_DOWN, LSFT(KC_A), KC_PDOT + ), + + // Literally just the numpad is different + [4] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, + 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_ESC, TO(1), DVP_ESC, DVP_AMPR, DVP_LBRACKET, DVP_LCBR, DVP_RCBR, DVP_LPRN, DVP_EQUAL,DVP_ASTERISK, DVP_RPRN, DVP_PLUS, DVP_RBRACKET, DVP_EXLM, DVP_HASH, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, TO(2), KC_TAB, KC_SCOLON,KC_COMMA, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, DVP_AT, KC_ENTER, KC_DEL, KC_END, KC_PGDN, KC_BTN1, KC_MS_U, KC_BTN2, KC_NO, + KC_NO, KC_NO, TO(0), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINUS, KC_BSLS, KC_UP, KC_MS_L, KC_NO, KC_MS_R, KC_TRNS, + LCTL(KC_F), KC_LALT, KC_LSHIFT,KC_NO, KC_QUOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_LEFT, KC_BTN3, KC_RIGHT, KC_GT, KC_MS_D, KC_GT, KC_PENT, + LCTL(KC_C), LCTL(KC_V), KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_DOWN, KC_BTN1, KC_PDOT + + ), + + /* + [4] = LAYOUT( + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, + MU_TOG, TO(0), KC_DLR, 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_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + MU_MOD, KC_NO, KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LBRC, KC_RBRC,KC_ENTER, KC_DEL, KC_END, KC_PGDN, KC_NO, KC_NO, KC_NO, KC_PPLS, + KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_QUOT, KC_BSLS, KC_UP, LSFT(KC_E), LSFT(KC_F), KC_NO, KC_BSPC, + KC_NO, KC_LALT, KC_LSHIFT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_LEFT, KC_WH_D, KC_RIGHT, LSFT(KC_B), LSFT(KC_C), LSFT(KC_D), KC_PENT, + KC_NO, KC_LGUI, KC_LCTRL, KC_LALT, KC_SPC, KC_RALT, KC_RCTRL, KC_DOWN, LSFT(KC_A), KC_PDOT + ),*/ + /*[0] = LAYOUT( + KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_NO,TO(1),KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, + KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, TO(2),KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, + KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, + KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_BSPC,KC_4,KC_4,KC_4, KC_4, + KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, + KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, + KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, + KC_8, KC_SPC,KC_8,KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, TO(1) + + ), + [1] = LAYOUT( + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, TO(0),KC_NO,KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, TO(2),KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_BSPC,KC_Q,KC_R,KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T, + KC_A, KC_SPC,KC_C,KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, TO(0) + ), + [2] = LAYOUT( + KC_LCTRL, KC_LALT, KC_C, KC_RALT, KC_E, KC_F, KC_G, KC_G, KC_H, KC_J, TO(0), TO(1), KC_M, KC_N, KC_QUOT, KC_DOWN, KC_UP, KC_R, KC_S, KC_ENTER, + KC_PPLS, KC_B, KC_C, KC_D, KC_A, KC_S, KC_D, KC_F, KC_J, KC_J, KC_K, KC_NO, KC_K, KC_L, KC_SCOLON, KC_P4, KC_DEL, KC_P5, KC_P6, KC_RIGHT, + KC_PMNS, KC_1, KC_C, KC_D, KC_1, KC_2, KC_3, KC_4, KC_7, KC_J, KC_K, KC_L, KC_8, KC_9, KC_0, KC_NLCK, KC_PGUP,KC_PSLS, KC_PAST, KC_T, + KC_A, KC_ESC, TO(0),KC_D, KC_GRV, KC_F, KC_G, KC_5, KC_6, KC_J, KC_K, KC_L, KC_EQL, KC_N, KC_MINUS, KC_BSPC, KC_INS, KC_HOME, KC_S, KC_T, + KC_PPLS, KC_NO, KC_TAB, KC_D, KC_Q, KC_W, KC_E, KC_R, KC_U, KC_J, KC_K, KC_L, KC_I, KC_O, KC_P, KC_P7, KC_PGDN,KC_P8, KC_P9, KC_T, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_T, KC_Y, KC_J, KC_K, KC_L, KC_RBRC, KC_N, KC_LBRC, KC_P, KC_END, KC_R, KC_S, KC_T, + KC_LEFT, KC_P1, KC_CAPS, KC_RSFT, KC_Z, KC_X, KC_C, KC_V, KC_M, KC_J, KC_K, KC_L, KC_COMMA, KC_DOT, KC_BSLS, KC_PENT, KC_Q, KC_P2, KC_P3, KC_T, + KC_LGUI, KC_SPACE, KC_RCTRL, KC_LSHIFT, KC_E, KC_F, KC_G, KC_B, KC_N, KC_J, KC_K, KC_L, KC_M, KC_N, KC_SLSH, KC_P, KC_Q, KC_P0, KC_PDOT, KC_KP_ENTER + ),*/ }; const uint16_t PROGMEM fn_actions[] = { @@ -166,7 +165,7 @@ void matrix_scan_user(void) { } -bool left_shift_down = false; +bool left_shift_down = false; bool right_shift_down = false; bool process_record_user(uint16_t keycode, keyrecord_t *record) { @@ -196,11 +195,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; } break; - - + + case DVP_ESC: if (left_shift_down || right_shift_down) - { + { if(record->event.pressed) SEND_STRING("~"); return false; @@ -214,7 +213,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { break; case DVP_AMPR: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -228,10 +227,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("&"); return false; } - break; - + break; + case DVP_LBRACKET: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -256,13 +255,13 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("["); return false; } - break; - + break; + case DVP_LCBR: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) - { + { if(left_shift_down) unregister_code(KC_LSHIFT); if(right_shift_down) @@ -270,7 +269,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_5); unregister_code(KC_5); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -284,10 +283,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("{"); return false; } - break; - + break; + case DVP_RCBR: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -298,7 +297,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_3); unregister_code(KC_3); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -312,11 +311,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("}"); return false; } - break; + break; case DVP_LPRN: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -327,7 +326,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_1); unregister_code(KC_1); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -341,10 +340,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("("); return false; } - break; -// + break; +// case DVP_AT: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -357,7 +356,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_6); unregister_code(KC_6); unregister_code(KC_LSHIFT); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -371,11 +370,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("@"); return false; } - break; + break; + - case DVP_EQUAL: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -386,7 +385,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_9); unregister_code(KC_9); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -400,10 +399,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("="); return false; } - break; - + break; + case DVP_ASTERISK: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -414,7 +413,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_0); unregister_code(KC_0); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -428,10 +427,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("*"); return false; } - break; - + break; + case DVP_RPRN: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -442,7 +441,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_2); unregister_code(KC_2); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -456,10 +455,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING(")"); return false; } - break; + break; case DVP_PLUS: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -470,7 +469,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_4); unregister_code(KC_4); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -483,10 +482,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("+"); } return false; - break; - + break; + case DVP_RBRACKET: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -497,7 +496,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_6); unregister_code(KC_6); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -510,10 +509,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("]"); } return false; - break; - + break; + case DVP_EXLM: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -524,7 +523,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_8); unregister_code(KC_8); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -537,10 +536,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("!"); } return false; - break; - + break; + case DVP_HASH: - if (left_shift_down || right_shift_down) + if (left_shift_down || right_shift_down) { if(record->event.pressed) { @@ -551,7 +550,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { register_code(KC_GRAVE); unregister_code(KC_GRAVE); - + if(left_shift_down) register_code(KC_LSHIFT); if(right_shift_down) @@ -564,7 +563,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("#"); } return false; - break; + break; case SHFT_DOT: if(record->event.pressed) SEND_STRING(">"); @@ -575,10 +574,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { SEND_STRING("<"); break; - } - - - + } + + + return true; } From 5368235f223d0537c7456cd8d36d5430f4b58312 Mon Sep 17 00:00:00 2001 From: takashiski Date: Thu, 4 Oct 2018 00:34:43 +0900 Subject: [PATCH 123/505] Keyboard: Add namecard keyboard (#4044) * create namecard2x4 * create default keymaps * Update README * fixed typo and func remove dont need. * update infomation on readme * update missed point * remove explicit initialize * update default keymap's readme * add my name to copyright * change keymap style to LAYOUT macro and fixed typo LAYOUT macro --- keyboards/namecard2x4/config.h | 223 ++++++++++++++++++ keyboards/namecard2x4/info.json | 0 .../namecard2x4/keymaps/default/config.h | 19 ++ .../namecard2x4/keymaps/default/keymap.c | 60 +++++ .../namecard2x4/keymaps/default/readme.md | 9 + keyboards/namecard2x4/namecard2x4.c | 43 ++++ keyboards/namecard2x4/namecard2x4.h | 33 +++ keyboards/namecard2x4/readme.md | 24 ++ keyboards/namecard2x4/rules.mk | 81 +++++++ 9 files changed, 492 insertions(+) create mode 100644 keyboards/namecard2x4/config.h create mode 100644 keyboards/namecard2x4/info.json create mode 100644 keyboards/namecard2x4/keymaps/default/config.h create mode 100644 keyboards/namecard2x4/keymaps/default/keymap.c create mode 100644 keyboards/namecard2x4/keymaps/default/readme.md create mode 100644 keyboards/namecard2x4/namecard2x4.c create mode 100644 keyboards/namecard2x4/namecard2x4.h create mode 100644 keyboards/namecard2x4/readme.md create mode 100644 keyboards/namecard2x4/rules.mk diff --git a/keyboards/namecard2x4/config.h b/keyboards/namecard2x4/config.h new file mode 100644 index 000000000000..d0c26193c4b4 --- /dev/null +++ b/keyboards/namecard2x4/config.h @@ -0,0 +1,223 @@ +/* +Copyright 2018 takashiski + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER takashiski +#define PRODUCT namecard2x4 +#define DESCRIPTION A custom keyboard + +/* key matrix size */ +#define MATRIX_ROWS 2 +#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 { B4,B5 } +#define MATRIX_COL_PINS { E6,D7,C6,D4 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define RGB_DI_PIN F4 +#define RGBLED_NUM 4 +#define RGBLIGHT_ANIMATIONS +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 10 +#define RGBLIGHT_VAL_STEP 10 + +//#define BACKLIGHT_PIN F4 +//#define BACKLIGHT_BREATHING +//#define BACKLIGHT_LEVELS 1 + + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + diff --git a/keyboards/namecard2x4/info.json b/keyboards/namecard2x4/info.json new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/keyboards/namecard2x4/keymaps/default/config.h b/keyboards/namecard2x4/keymaps/default/config.h new file mode 100644 index 000000000000..dbacdcce5803 --- /dev/null +++ b/keyboards/namecard2x4/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 takashiski + * + * 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 + +// place overrides here diff --git a/keyboards/namecard2x4/keymaps/default/keymap.c b/keyboards/namecard2x4/keymaps/default/keymap.c new file mode 100644 index 000000000000..1a0a727fc051 --- /dev/null +++ b/keyboards/namecard2x4/keymaps/default/keymap.c @@ -0,0 +1,60 @@ +/* Copyright 2018 takashiski + * + * 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 QMK_KEYBOARD_H + +enum Layer +{ + DF, + LW, + RS +}; + + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[DF] = LAYOUT( + KC_1,KC_2,KC_3,LT(LW,KC_4), + KC_5,KC_6,KC_7,LT(RS,KC_8) + ), +[LW]= LAYOUT( + + RGB_VAD,RGB_VAI,RGB_HUI,RGB_HUD, + KC_TRNS,RGB_MOD,RGB_RMOD,KC_TRNS + ), +[RS]= LAYOUT( + + KC_MYCM,KC_MAIL,KC_VOLU,KC_MUTE, + KC_WSCH,KC_CALC,KC_VOLD,KC_TRNS + ) + +}; + + +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/namecard2x4/keymaps/default/readme.md b/keyboards/namecard2x4/keymaps/default/readme.md new file mode 100644 index 000000000000..83601c9cf556 --- /dev/null +++ b/keyboards/namecard2x4/keymaps/default/readme.md @@ -0,0 +1,9 @@ +# The default keymap for namecard2x4 + +this is test keymap. + +| 1 | 2 | 3 | 4 | +| 5 | 6 | 7 | 8 | + +if hold 4, change to Backlight settings Layer. +if hold 8, change to Windows action Layer(Open my computer, Open calculater and others). diff --git a/keyboards/namecard2x4/namecard2x4.c b/keyboards/namecard2x4/namecard2x4.c new file mode 100644 index 000000000000..349923daf866 --- /dev/null +++ b/keyboards/namecard2x4/namecard2x4.c @@ -0,0 +1,43 @@ +/* Copyright 2018 takashiski + * + * 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 "namecard2x4.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/namecard2x4/namecard2x4.h b/keyboards/namecard2x4/namecard2x4.h new file mode 100644 index 000000000000..f2e27a010279 --- /dev/null +++ b/keyboards/namecard2x4/namecard2x4.h @@ -0,0 +1,33 @@ +/* Copyright 2018 takashiski + * + * 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 NAMECARD2X4_H +#define NAMECARD2X4_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 arguments +// The second converts the arguments into a two-dimensional array +#define LAYOUT( \ + k00, k01, k02, k03, \ + k10, k11, k12, k13 \ +) { \ + { k00, k01, k02, k03 }, \ + { k10, k11, k12, k13 }, \ +} + +#endif diff --git a/keyboards/namecard2x4/readme.md b/keyboards/namecard2x4/readme.md new file mode 100644 index 000000000000..ec98bc6736c7 --- /dev/null +++ b/keyboards/namecard2x4/readme.md @@ -0,0 +1,24 @@ +# namecard2x4 + +日本式名刺サイズのキーボードです(55x91mm)。 +Kailh PCB SocketとWS2812/SK6812に対応しています。 + +This keyboard is Japanese namecard size(55x91mm) keyboard. + +namecard2x4 has 8 switch and kailh PCB socket. + +![namecard2x4](https://i.imgur.com/Bi9SV9A.jpg) + +![namecard2x4 with case](https://i.imgur.com/yTv1vSz.jpg) + + + +Keyboard Maintainer: [takashiski](https://github.com/takashiski) + + +Make example for this keyboard (after setting up your build environment): + + make namecard2x4:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + diff --git a/keyboards/namecard2x4/rules.mk b/keyboards/namecard2x4/rules.mk new file mode 100644 index 000000000000..51d2cbcb2e86 --- /dev/null +++ b/keyboards/namecard2x4/rules.mk @@ -0,0 +1,81 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# 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 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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +#UNICODEMAP_ENABLE = yes # for emoji user +#RGBLIGHT_ENABLE = yes # uncomment if you want addressable led strips From e58ea882e40eff146b9cebf9e1c99e89f25260ac Mon Sep 17 00:00:00 2001 From: Jumail Mundekkat Date: Thu, 4 Oct 2018 01:36:40 +1000 Subject: [PATCH 124/505] Keyboard: Added split backspace layout for the b.mini (#4051) --- keyboards/bmini/bmini.h | 18 ++++++++++++++++++ keyboards/bmini/info.json | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/keyboards/bmini/bmini.h b/keyboards/bmini/bmini.h index 9a70f9204609..7bdf66fd250a 100644 --- a/keyboards/bmini/bmini.h +++ b/keyboards/bmini/bmini.h @@ -38,6 +38,24 @@ along with this program. If not, see . { K07, K17, K27, K37, K47, K57, K67, K77, KC_NO, KC_NO, KA7, KB7, KC7, KD7, KE7 } \ } +#define LAYOUT_splitbs( \ + K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, \ + K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD4, KD0, \ + K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC3, KD3, K67, \ + K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KB2, KD2, KE0, \ + K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KB1, K86, K77, \ + K00, K10, K20, K56, K57, KB0, KC0, K66, K76, K96 \ +){ \ + { K00, K10, K20, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KB0, KC0, KD0, KE0 }, \ + { K01, K11, K21, K31, K41, K51, KC_NO, KC_NO, KC_NO, KC_NO, KA1, KB1, KC_NO, KD1, KE1 }, \ + { K02, K12, K22, K32, K42, K52, KC_NO, KC_NO, KC_NO, KC_NO, KA2, KB2, KC_NO, KD2, KE2 }, \ + { K03, K13, K23, K33, K43, K53, KC_NO, KC_NO, KC_NO, KC_NO, KA3, KB3, KC3, KD3, KC_NO }, \ + { K04, K14, K24, K34, K44, K54, KC_NO, KC_NO, KC_NO, KC_NO, KA4, KB4, KC4, KD4, KE4 }, \ + { K05, KC_NO, K25, K35, K45, K55, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KB5, KC5, KD5, KE5 }, \ + { K06, K16, K26, K36, K46, K56, K66, K76, K86, K96, KA6, KB6, KC6, KD6, KE6 }, \ + { K07, K17, K27, K37, K47, K57, K67, K77, KC_NO, KC_NO, KA7, KB7, KC7, KD7, KE7 } \ +} + #define LAYOUT_kc( \ K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, \ K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD0, \ diff --git a/keyboards/bmini/info.json b/keyboards/bmini/info.json index a047a3ef582c..ab4d01c02308 100644 --- a/keyboards/bmini/info.json +++ b/keyboards/bmini/info.json @@ -8,6 +8,10 @@ "LAYOUT": { "key_count": 84, "layout": [{"label":"K05", "x":0, "y":0}, {"label":"K25", "x":1, "y":0}, {"label":"K35", "x":2, "y":0}, {"label":"K45", "x":3, "y":0}, {"label":"K55", "x":4, "y":0}, {"label":"K06", "x":5, "y":0}, {"label":"KA6", "x":6, "y":0}, {"label":"KA7", "x":7, "y":0}, {"label":"K07", "x":8, "y":0}, {"label":"KB5", "x":9, "y":0}, {"label":"KC5", "x":10, "y":0}, {"label":"KD5", "x":11, "y":0}, {"label":"KE5", "x":12, "y":0}, {"label":"KD1", "x":13, "y":0}, {"label":"KE1", "x":14, "y":0}, {"label":"KE2", "x":15, "y":0}, {"label":"K04", "x":0, "y":1}, {"label":"K14", "x":1, "y":1}, {"label":"K24", "x":2, "y":1}, {"label":"K34", "x":3, "y":1}, {"label":"K44", "x":4, "y":1}, {"label":"K54", "x":5, "y":1}, {"label":"K16", "x":6, "y":1}, {"label":"KB6", "x":7, "y":1}, {"label":"KB7", "x":8, "y":1}, {"label":"K17", "x":9, "y":1}, {"label":"KA4", "x":10, "y":1}, {"label":"KB4", "x":11, "y":1}, {"label":"KC4", "x":12, "y":1}, {"label":"KE4", "x":13, "y":1, "w":2}, {"label":"KD0", "x":15, "y":1}, {"label":"K03", "x":0, "y":2, "w":1.5}, {"label":"K13", "x":1.5, "y":2}, {"label":"K23", "x":2.5, "y":2}, {"label":"K33", "x":3.5, "y":2}, {"label":"K43", "x":4.5, "y":2}, {"label":"K53", "x":5.5, "y":2}, {"label":"K26", "x":6.5, "y":2}, {"label":"KC6", "x":7.5, "y":2}, {"label":"KC7", "x":8.5, "y":2}, {"label":"K27", "x":9.5, "y":2}, {"label":"KA3", "x":10.5, "y":2}, {"label":"KB3", "x":11.5, "y":2}, {"label":"KC3", "x":12.5, "y":2}, {"label":"KD3", "x":13.5, "y":2, "w":1.5}, {"label":"K67", "x":15, "y":2}, {"label":"K02", "x":0, "y":3, "w":1.75}, {"label":"K12", "x":1.75, "y":3}, {"label":"K22", "x":2.75, "y":3}, {"label":"K32", "x":3.75, "y":3}, {"label":"K42", "x":4.75, "y":3}, {"label":"K52", "x":5.75, "y":3}, {"label":"K36", "x":6.75, "y":3}, {"label":"KD6", "x":7.75, "y":3}, {"label":"KD7", "x":8.75, "y":3}, {"label":"K37", "x":9.75, "y":3}, {"label":"KA2", "x":10.75, "y":3}, {"label":"KB2", "x":11.75, "y":3}, {"label":"KD2", "x":12.75, "y":3, "w":2.25}, {"label":"KE0", "x":15, "y":3}, {"label":"K01", "x":0, "y":4, "w":2.25}, {"label":"K11", "x":2.25, "y":4}, {"label":"K21", "x":3.25, "y":4}, {"label":"K31", "x":4.25, "y":4}, {"label":"K41", "x":5.25, "y":4}, {"label":"K51", "x":6.25, "y":4}, {"label":"K46", "x":7.25, "y":4}, {"label":"KE6", "x":8.25, "y":4}, {"label":"KE7", "x":9.25, "y":4}, {"label":"K47", "x":10.25, "y":4}, {"label":"KA1", "x":11.25, "y":4}, {"label":"KB1", "x":12.25, "y":4, "w":1.75}, {"label":"K86", "x":14, "y":4}, {"label":"K77", "x":15, "y":4}, {"label":"K00", "x":0, "y":5, "w":1.25}, {"label":"K10", "x":1.25, "y":5, "w":1.25}, {"label":"K20", "x":2.5, "y":5, "w":1.25}, {"label":"K56", "x":3.75, "y":5, "w":6.25}, {"label":"K57", "x":10, "y":5}, {"label":"KB0", "x":11, "y":5}, {"label":"KC0", "x":12, "y":5}, {"label":"K66", "x":13, "y":5}, {"label":"K76", "x":14, "y":5}, {"label":"K96", "x":15, "y":5}] + }, + "LAYOUT_splitbs": { + "key_count": 85, + "layout": [{"label":"K05", "x":0, "y":0}, {"label":"K25", "x":1, "y":0}, {"label":"K35", "x":2, "y":0}, {"label":"K45", "x":3, "y":0}, {"label":"K55", "x":4, "y":0}, {"label":"K06", "x":5, "y":0}, {"label":"KA6", "x":6, "y":0}, {"label":"KA7", "x":7, "y":0}, {"label":"K07", "x":8, "y":0}, {"label":"KB5", "x":9, "y":0}, {"label":"KC5", "x":10, "y":0}, {"label":"KD5", "x":11, "y":0}, {"label":"KE5", "x":12, "y":0}, {"label":"KD1", "x":13, "y":0}, {"label":"KE1", "x":14, "y":0}, {"label":"KE2", "x":15, "y":0}, {"label":"K04", "x":0, "y":1}, {"label":"K14", "x":1, "y":1}, {"label":"K24", "x":2, "y":1}, {"label":"K34", "x":3, "y":1}, {"label":"K44", "x":4, "y":1}, {"label":"K54", "x":5, "y":1}, {"label":"K16", "x":6, "y":1}, {"label":"KB6", "x":7, "y":1}, {"label":"KB7", "x":8, "y":1}, {"label":"K17", "x":9, "y":1}, {"label":"KA4", "x":10, "y":1}, {"label":"KB4", "x":11, "y":1}, {"label":"KC4", "x":12, "y":1}, {"label":"KE4", "x":13, "y":1}, {"label":"KD4", "x":14, "y":1}, {"label":"KD0", "x":15, "y":1}, {"label":"K03", "x":0, "y":2, "w":1.5}, {"label":"K13", "x":1.5, "y":2}, {"label":"K23", "x":2.5, "y":2}, {"label":"K33", "x":3.5, "y":2}, {"label":"K43", "x":4.5, "y":2}, {"label":"K53", "x":5.5, "y":2}, {"label":"K26", "x":6.5, "y":2}, {"label":"KC6", "x":7.5, "y":2}, {"label":"KC7", "x":8.5, "y":2}, {"label":"K27", "x":9.5, "y":2}, {"label":"KA3", "x":10.5, "y":2}, {"label":"KB3", "x":11.5, "y":2}, {"label":"KC3", "x":12.5, "y":2}, {"label":"KD3", "x":13.5, "y":2, "w":1.5}, {"label":"K67", "x":15, "y":2}, {"label":"K02", "x":0, "y":3, "w":1.75}, {"label":"K12", "x":1.75, "y":3}, {"label":"K22", "x":2.75, "y":3}, {"label":"K32", "x":3.75, "y":3}, {"label":"K42", "x":4.75, "y":3}, {"label":"K52", "x":5.75, "y":3}, {"label":"K36", "x":6.75, "y":3}, {"label":"KD6", "x":7.75, "y":3}, {"label":"KD7", "x":8.75, "y":3}, {"label":"K37", "x":9.75, "y":3}, {"label":"KA2", "x":10.75, "y":3}, {"label":"KB2", "x":11.75, "y":3}, {"label":"KD2", "x":12.75, "y":3, "w":2.25}, {"label":"KE0", "x":15, "y":3}, {"label":"K01", "x":0, "y":4, "w":2.25}, {"label":"K11", "x":2.25, "y":4}, {"label":"K21", "x":3.25, "y":4}, {"label":"K31", "x":4.25, "y":4}, {"label":"K41", "x":5.25, "y":4}, {"label":"K51", "x":6.25, "y":4}, {"label":"K46", "x":7.25, "y":4}, {"label":"KE6", "x":8.25, "y":4}, {"label":"KE7", "x":9.25, "y":4}, {"label":"K47", "x":10.25, "y":4}, {"label":"KA1", "x":11.25, "y":4}, {"label":"KB1", "x":12.25, "y":4, "w":1.75}, {"label":"K86", "x":14, "y":4}, {"label":"K77", "x":15, "y":4}, {"label":"K00", "x":0, "y":5, "w":1.25}, {"label":"K10", "x":1.25, "y":5, "w":1.25}, {"label":"K20", "x":2.5, "y":5, "w":1.25}, {"label":"K56", "x":3.75, "y":5, "w":6.25}, {"label":"K57", "x":10, "y":5}, {"label":"KB0", "x":11, "y":5}, {"label":"KC0", "x":12, "y":5}, {"label":"K66", "x":13, "y":5}, {"label":"K76", "x":14, "y":5}, {"label":"K96", "x":15, "y":5}] } } } From f01133d08918b3d1dd7b349309b02ffd37273f5c Mon Sep 17 00:00:00 2001 From: Filip Sund Date: Wed, 3 Oct 2018 19:12:27 +0200 Subject: [PATCH 125/505] Keyboard: Add handwired/pteron config and keymaps (#4060) * Added pteron files made via from kbfirmware.com. * Added readme. * Made some progress on Pteron keymap. * More keymap. * Updated bootloader, added some keymap illustrations. * Moved default keymap to FSund, made default keymap from default preonic keymap. * Fixed typo in default pteron keymap. * Made changes recommended by drashna. --- keyboards/handwired/pteron/config.h | 34 +++++ .../handwired/pteron/keymaps/FSund/keymap.c | 118 ++++++++++++++++++ .../handwired/pteron/keymaps/default/keymap.c | 104 +++++++++++++++ keyboards/handwired/pteron/pteron.c | 1 + keyboards/handwired/pteron/pteron.h | 17 +++ keyboards/handwired/pteron/readme.md | 15 +++ keyboards/handwired/pteron/rules.mk | 58 +++++++++ 7 files changed, 347 insertions(+) create mode 100644 keyboards/handwired/pteron/config.h create mode 100644 keyboards/handwired/pteron/keymaps/FSund/keymap.c create mode 100644 keyboards/handwired/pteron/keymaps/default/keymap.c create mode 100644 keyboards/handwired/pteron/pteron.c create mode 100644 keyboards/handwired/pteron/pteron.h create mode 100644 keyboards/handwired/pteron/readme.md create mode 100644 keyboards/handwired/pteron/rules.mk diff --git a/keyboards/handwired/pteron/config.h b/keyboards/handwired/pteron/config.h new file mode 100644 index 000000000000..9650839e304d --- /dev/null +++ b/keyboards/handwired/pteron/config.h @@ -0,0 +1,34 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER QMK Community +#define PRODUCT Pteron Keyboard +#define DESCRIPTION Pteron Keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 12 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { D7, E6, B4, B5, B6 } +#define MATRIX_COL_PINS { F4, F6, F5, F7, B1, B3, C6, D4, D0, D1, D2, D3 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION ROW2COL + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCING_DELAY 5 // 5 is default + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* prevent stuck modifiers */ +#define PREVENT_STUCK_MODIFIERS diff --git a/keyboards/handwired/pteron/keymaps/FSund/keymap.c b/keyboards/handwired/pteron/keymaps/FSund/keymap.c new file mode 100644 index 000000000000..f34beae0637d --- /dev/null +++ b/keyboards/handwired/pteron/keymaps/FSund/keymap.c @@ -0,0 +1,118 @@ +#include QMK_KEYBOARD_H + +enum pteron_layers { + _QWERTY, + _LOWER, + _RAISE, + _ADJUST +}; + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +// use S() to produce shifted versions of keys +// #define S(kc) LSFT(kc) // defined by default + +// alt gr +#define G(kc) RALT(kc) + +// custom keycodes +// use F_ prefix to avoid problems + +// NB! I use Norwegian keyboard layout on my machines, so the keymap probably +// doesn't make much sense for US/ANSI users + +#define F_FSLH S(KC_7) // forward slash +#define F_BSLH KC_EQL // backward slash +#define F_EQL S(KC_0) // equals sign +#define F_APOS KC_BSLS // ' +#define F_TIMES S(KC_BSLS) // * +#define F_PLUS KC_MINS // + +#define F_QUEST S(KC_MINS) // ? +#define F_HAT S(KC_RBRC) // ^ +#define F_TILD G(KC_RBRC) // ~ +#define F_UML KC_RBRC // ¨ (umlaut) +#define F_SECT S(KC_GRV) // section sign ("law sign") (shifted key below esc) +#define F_GRAVE S(KC_EQL) +#define F_ACUTE G(KC_EQL) + +#define KC_AA KC_LBRC +#define KC_OE KC_SCLN +#define KC_AE KC_QUOT + +// brackets +#define F_SBRL G(KC_8) // square bracket left +#define F_SBRR G(KC_9) // square bracket right +#define F_CBRL G(KC_7) // curly bracket left +#define F_CBRR G(KC_0) // curly bracket right +#define F_RBRL S(KC_8) // round bracket left +#define F_RBRR S(KC_9) // round bracket right +#define F_ABRL KC_NUBS // angle bracket left +#define F_ABRR S(KC_NUBS) // angle bracket right + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* QWERTY + * +-----------------------------------------+ +-----------------------------------------+ + * | Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Å | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | S | D | F | G | | H | J | K | L | Ø | Æ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | Z | X | C | V | B | | N | M | , | . | - | Shft | + * +---------------------------+------+------+-------------+ +-------------+------+------+---------------------------+ + * | LOWR | Spc | Alt | Win | | Win | Alt | Spc | RISE | + * +---------------------------+ +---------------------------+ + */ + +[_QWERTY] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_AA, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_OE, KC_AE, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSHIFT, + LOWER, KC_SPC, KC_LALT, KC_LGUI, KC_RGUI, KC_RALT, KC_ENT, RAISE + ), + +/* LOWER + * +-----------------------------------------+ +-----------------------------------------+ + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | \ | / | [ | ] | = | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | | < | > | ( | ) | * | ~ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F6 | F7 | F8 | F9 | F10 | | F11 | F12 | { | } | + | | + * +---------------------------+------+------+-------------+ +-------------+------+------+---------------------------+ + * | | | | | | | | | | + * +---------------------------+ +---------------------------+ + */ + +[_LOWER] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, F_BSLH, F_FSLH, F_SBRL, F_SBRR, F_EQL, KC_DEL, + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, F_ABRL, F_ABRR, F_RBRL, F_RBRR, F_TIMES, F_TILD, + _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, F_CBRL, F_CBRR, F_PLUS, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), + +[_RAISE] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_AA, + F_SECT, S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), F_QUEST, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, F_APOS, + _______, S(KC_6), G(KC_2), G(KC_3), G(KC_4), G(KC_5), F_HAT, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), + +[_ADJUST] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, F_UML, F_GRAVE, F_ACUTE, _______, RESET, _______, _______, _______, _______, KC_PSCR, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} diff --git a/keyboards/handwired/pteron/keymaps/default/keymap.c b/keyboards/handwired/pteron/keymaps/default/keymap.c new file mode 100644 index 000000000000..3079cc7afd7a --- /dev/null +++ b/keyboards/handwired/pteron/keymaps/default/keymap.c @@ -0,0 +1,104 @@ +#include QMK_KEYBOARD_H + +enum pteron_layers { + _QWERTY, + _LOWER, + _RAISE, + _ADJUST +}; + + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * +-----------------------------------------+ +-----------------------------------------+ + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | A | S | D | F | G | | H | J | K | L | ; | " | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + * +-------------+------+------+------+------| |------+------+------+------+-------------+ + * |Lower | SPC | Alt | GUI | | Alt | GUI | SPC |Raise | + * +---------------------------+ +---------------------------+ + */ +[_QWERTY] = LAYOUT( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, \ + LOWER, KC_SPC, KC_LALT, KC_LGUI, KC_RALT, KC_RGUI, KC_SPC, RAISE \ +), + +/* Lower + * +-----------------------------------------+ +-----------------------------------------+ + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | F12 |ISO ~ |ISO | | | | | + * +-------------+------+------+------+------| |------+------+------+------+-------------+ + * | | | | | | Next | Vol- | Vol+ | Play | + * +---------------------------+ +---------------------------+ + */ +[_LOWER] = LAYOUT( \ + 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_HOME, KC_END, _______, \ + _______, _______, _______, _______, 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 / | | | | + * +-------------+------+------+------+------| |------+------+------+------+-------------+ + * | | | | | | Next | Vol- | Vol+ | Play | + * +---------------------------+ +---------------------------+ + */ +[_RAISE] = LAYOUT( \ + 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_PGUP, KC_PGDN, _______, \ + _______, _______, _______, _______, 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 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | |Aud on|AudOff|AGnorm| |AGswap|Qwerty|Colemk|Dvorak| | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|MusOff|MidiOn| |MidOff| | | | | | + * +-------------+------+------+------+------| |------+------+------+------+-------------+ + * | | | | | | | | | | + * +---------------------------+ +---------------------------+ + */ +[_ADJUST] = LAYOUT( \ + 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, DEBUG, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______ \ +) + +}; + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} diff --git a/keyboards/handwired/pteron/pteron.c b/keyboards/handwired/pteron/pteron.c new file mode 100644 index 000000000000..972b45aa20a9 --- /dev/null +++ b/keyboards/handwired/pteron/pteron.c @@ -0,0 +1 @@ +#include "pteron.h" diff --git a/keyboards/handwired/pteron/pteron.h b/keyboards/handwired/pteron/pteron.h new file mode 100644 index 000000000000..f29c2619af01 --- /dev/null +++ b/keyboards/handwired/pteron/pteron.h @@ -0,0 +1,17 @@ +#pragma once + +#include "quantum.h" + +#define LAYOUT( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, \ + K402, K403, K404, K405, K406, K407, K408, K409 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311 }, \ + { KC_NO, KC_NO, K402, K403, K404, K405, K406, K407, K408, K409, KC_NO, KC_NO } \ +} diff --git a/keyboards/handwired/pteron/readme.md b/keyboards/handwired/pteron/readme.md new file mode 100644 index 000000000000..a66d41edbb15 --- /dev/null +++ b/keyboards/handwired/pteron/readme.md @@ -0,0 +1,15 @@ +# Pteron + +![Pteron](https://i.imgur.com/9QhPlVD.jpg) + +An ergonomic keyboard heavily inspired by the [Atreus](https://github.com/technomancy/atreus), [Iris](https://github.com/keebio/iris-case) and [Atreis](https://github.com/dekonnection/atreis) keyboards. More info and files for laser cutting plates and case are in the [Pteron repository](https://github.com/FSund/pteron-keyboard). + +Keyboard Maintainer: [Filip Sund](https://github.com/FSund) +Hardware Supported: Pro Micro +Hardware Availability: Handwired, no PCB's available (for now) + +Make example for this keyboard (after setting up your build environment): + + make handwired/pteron:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). \ No newline at end of file diff --git a/keyboards/handwired/pteron/rules.mk b/keyboards/handwired/pteron/rules.mk new file mode 100644 index 000000000000..10218020e6e2 --- /dev/null +++ b/keyboards/handwired/pteron/rules.mk @@ -0,0 +1,58 @@ +# 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 + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = caterina + +# Build Options +# comment out to disable the options. +# +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 +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no +UNICODE_ENABLE = no +UNICODEMAP_ENABLE = no \ No newline at end of file From d55468c18d666870cfe095d32153e5e503e50649 Mon Sep 17 00:00:00 2001 From: Filip Sund Date: Wed, 3 Oct 2018 21:04:01 +0200 Subject: [PATCH 126/505] Keyboard: Added dactyl-manuform 4x6 and keymap. (#4058) * Added dactyl-manuform 4x6 and keymap. * Did changes recommended by drashna. --- .../4x5/keymaps/default/config.h | 5 +- .../4x5/keymaps/dvorak/config.h | 5 +- keyboards/handwired/dactyl_manuform/4x6/4x6.c | 14 +++ keyboards/handwired/dactyl_manuform/4x6/4x6.h | 36 ++++++++ .../handwired/dactyl_manuform/4x6/config.h | 40 +++++++++ .../4x6/keymaps/default/config.h | 31 +++++++ .../4x6/keymaps/default/keymap.c | 87 +++++++++++++++++++ .../handwired/dactyl_manuform/4x6/rules.mk | 21 +++++ .../dactyl_manuform/dactyl_manuform.h | 10 ++- 9 files changed, 237 insertions(+), 12 deletions(-) create mode 100644 keyboards/handwired/dactyl_manuform/4x6/4x6.c create mode 100644 keyboards/handwired/dactyl_manuform/4x6/4x6.h create mode 100644 keyboards/handwired/dactyl_manuform/4x6/config.h create mode 100644 keyboards/handwired/dactyl_manuform/4x6/keymaps/default/config.h create mode 100644 keyboards/handwired/dactyl_manuform/4x6/keymaps/default/keymap.c create mode 100644 keyboards/handwired/dactyl_manuform/4x6/rules.mk diff --git a/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/config.h b/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/config.h index 216917ed7136..682c7a868b07 100644 --- a/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/config.h +++ b/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/config.h @@ -18,8 +18,7 @@ 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 +#pragma once #include "../../config.h" @@ -33,5 +32,3 @@ along with this program. If not, see . // #define MASTER_LEFT // #define MASTER_RIGHT #define EE_HANDS - -#endif diff --git a/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/config.h b/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/config.h index 216917ed7136..682c7a868b07 100644 --- a/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/config.h +++ b/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/config.h @@ -18,8 +18,7 @@ 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 +#pragma once #include "../../config.h" @@ -33,5 +32,3 @@ along with this program. If not, see . // #define MASTER_LEFT // #define MASTER_RIGHT #define EE_HANDS - -#endif diff --git a/keyboards/handwired/dactyl_manuform/4x6/4x6.c b/keyboards/handwired/dactyl_manuform/4x6/4x6.c new file mode 100644 index 000000000000..1d305c85414c --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/4x6/4x6.c @@ -0,0 +1,14 @@ +#include "4x6.h" + + +#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) { + matrix_init_user(); +}; + diff --git a/keyboards/handwired/dactyl_manuform/4x6/4x6.h b/keyboards/handwired/dactyl_manuform/4x6/4x6.h new file mode 100644 index 000000000000..25741be57b5f --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/4x6/4x6.h @@ -0,0 +1,36 @@ +#pragma once + +#include "dactyl_manuform.h" +#include "quantum.h" + +#ifdef USE_I2C +#include +#ifdef __AVR__ + #include + #include +#endif +#endif + +#define LAYOUT(\ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L32, L33, R32, R33, \ + L34, L35, R30, R31, \ + L44, L45, R40, R41, \ + L42, L43, R42, R43 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05 }, \ + { L10, L11, L12, L13, L14, L15 }, \ + { L20, L21, L22, L23, L24, L25 }, \ + { KC_NO, KC_NO, L32, L33, L34, L35 }, \ + { KC_NO, KC_NO, L42, L43, L44, L45 }, \ +\ + { R00, R01, R02, R03, R04, R05 }, \ + { R10, R11, R12, R13, R14, R15 }, \ + { R20, R21, R22, R23, R24, R25 }, \ + { R30, R31, R32, R33, KC_NO, KC_NO }, \ + { R40, R41, R42, R43, KC_NO, KC_NO } \ +\ + } diff --git a/keyboards/handwired/dactyl_manuform/4x6/config.h b/keyboards/handwired/dactyl_manuform/4x6/config.h new file mode 100644 index 000000000000..d4a1922876ad --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/4x6/config.h @@ -0,0 +1,40 @@ +/* +Copyright 2012 Jun Wako +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 . +*/ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x3060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER tshort +#define DESCRIPTION A split keyboard for the cheap makers + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 10 +#define MATRIX_COLS 6 + +// row-driven +#define MATRIX_ROW_PINS { F7, B1, B3, B2, B6 } +#define MATRIX_COL_PINS { D4, C6, D7, E6, B4, B5 } + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW diff --git a/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/config.h b/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/config.h new file mode 100644 index 000000000000..1fc2c617f606 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/config.h @@ -0,0 +1,31 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +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 . +*/ + +#pragma once + +/* Use I2C or Serial, not both */ +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +// #define MASTER_LEFT +// #define MASTER_RIGHT +#define EE_HANDS diff --git a/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/keymap.c b/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/keymap.c new file mode 100644 index 000000000000..ad23beef5c28 --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/keymap.c @@ -0,0 +1,87 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#define _BASE 0 +#define _RAISE 1 +#define _LOWER 2 + +// Fillers to make layering more clear + +#define ____ KC_TRNS + +#define SFT_ESC SFT_T(KC_ESC) +#define CTL_BSPC CTL_T(KC_BSPC) +#define ALT_SPC ALT_T(KC_SPC) +#define SFT_ENT SFT_T(KC_ENT) + +#define KC_ML KC_MS_LEFT +#define KC_MR KC_MS_RIGHT +#define KC_MU KC_MS_UP +#define KC_MD KC_MS_DOWN +#define KC_MB1 KC_MS_BTN1 +#define KC_MB2 KC_MS_BTN1 + +#define RAISE MO(_RAISE) +#define LOWER MO(_LOWER) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Base (qwerty) + * +-----------------------------------------+ +-----------------------------------------+ + * | ESC | q | w | e | r | t | | y | u | i | o | p | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | TAB | a | s | d | f | g | | h | j | k | l | ; | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | SHFT | z | x | c | v | b | | n | m | , | . | / | | + * +------+------+------+------+-------------+ +-------------+------+------+------+------+ + * | [ | ] | | | | + * +-------------+-------------+ +-------------+-------------+ + * | | | | | | + * |------+------| |------+------| + * | | | | | | + * +-------------+ +-------------+ + * +-------------+ +-------------+ + * | | | | | | + * |------+------| |------+------| + * | | | | | | + * +-------------+ +-------------+ + */ + +[_BASE] = LAYOUT( \ + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, \ + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_BSLASH, \ + KC_LBRC,KC_RBRC, KC_PLUS,KC_EQL, \ + RAISE, KC_SPC, KC_ENT, LOWER, \ + KC_TAB, KC_HOME, KC_END, KC_DEL, \ + KC_BSPC,KC_GRV, KC_LGUI,KC_LALT \ +), + +[_LOWER] = LAYOUT( + _______,_______,_______,_______,_______,KC_LBRC, KC_RBRC, KC_P7, KC_P8, KC_P9, RESET, KC_PLUS, \ + _______,KC_HOME,KC_PGUP,KC_PGDN,KC_END ,KC_LPRN, KC_RPRN, KC_P4, KC_P5, KC_P6, KC_MINS,KC_PIPE, \ + _______,_______,_______,_______,_______,_______, _______, KC_P1, KC_P2, KC_P3, KC_EQL, KC_UNDS, \ + _______,KC_PSCR, _______, KC_P0, \ + _______,_______, _______,_______, \ + _______,_______, _______,_______, \ + _______,_______, _______,_______ \ +), + +[_RAISE] = LAYOUT( + _______,RESET, _______,_______,_______,KC_LBRC, KC_RBRC,_______,KC_NLCK,KC_INS, KC_SLCK,KC_MUTE, \ + _______,KC_LEFT,KC_UP ,KC_DOWN,KC_RGHT,KC_LPRN, KC_RPRN,KC_MPRV,KC_MPLY,KC_MNXT,_______,KC_VOLU, \ + _______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,KC_VOLD, \ + _______,_______, KC_EQL, _______, \ + _______,_______, _______,_______, \ + _______,_______, _______,_______, \ + _______,_______, _______,_______ \ +) +}; + + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + diff --git a/keyboards/handwired/dactyl_manuform/4x6/rules.mk b/keyboards/handwired/dactyl_manuform/4x6/rules.mk new file mode 100644 index 000000000000..14b6e1e4e31b --- /dev/null +++ b/keyboards/handwired/dactyl_manuform/4x6/rules.mk @@ -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 = 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 + diff --git a/keyboards/handwired/dactyl_manuform/dactyl_manuform.h b/keyboards/handwired/dactyl_manuform/dactyl_manuform.h index 8b60097bc2c6..eea0757d59d0 100644 --- a/keyboards/handwired/dactyl_manuform/dactyl_manuform.h +++ b/keyboards/handwired/dactyl_manuform/dactyl_manuform.h @@ -1,13 +1,15 @@ #pragma once -#ifdef KEYBOARD_handwired_dactyl_manuform_6x6 - #include "6x6.h" +#ifdef KEYBOARD_handwired_dactyl_manuform_4x5 + #include "4x5.h" +#elif KEYBOARD_handwired_dactyl_manuform_4x6 + #include "4x6.h" #elif KEYBOARD_handwired_dactyl_manuform_5x6 #include "5x6.h" -#elif KEYBOARD_handwired_dactyl_manuform_4x5 - #include "4x5.h" #elif KEYBOARD_handwired_dactyl_manuform_5x7 #include "5x7.h" +#elif KEYBOARD_handwired_dactyl_manuform_6x6 + #include "6x6.h" #endif //void promicro_bootloader_jmp(bool program); From 9c4b6d21003290abd92644d882165a95ffee4470 Mon Sep 17 00:00:00 2001 From: Pittyolo Date: Wed, 3 Oct 2018 21:14:36 +0200 Subject: [PATCH 127/505] Keyboard: Adding Split Space support for Mechmini 1 (#4052) * Adding Split Space support * Adding my keymap * update * Made the requested updates * Made the requested update --- keyboards/mechmini/v1/keymaps/pitty/keymap.c | 54 ++++++++++++++++++++ keyboards/mechmini/v1/v1.h | 17 ++++++ 2 files changed, 71 insertions(+) create mode 100644 keyboards/mechmini/v1/keymaps/pitty/keymap.c diff --git a/keyboards/mechmini/v1/keymaps/pitty/keymap.c b/keyboards/mechmini/v1/keymaps/pitty/keymap.c new file mode 100644 index 000000000000..7db2dc1836a1 --- /dev/null +++ b/keyboards/mechmini/v1/keymaps/pitty/keymap.c @@ -0,0 +1,54 @@ +/* +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 QMK_KEYBOARD_H + +#define _QWERTY 0 +#define _NMBR 1 +#define _NAV 2 +#define _MOUSE 3 +#define _FUNCT 4 + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = LAYOUT_split_space( + 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, LT(_FUNCT, 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_LCTL, KC_LGUI, KC_LALT, LT(_NAV, KC_SPC), KC_BSPC, KC_RALT, TT(_MOUSE), TT(_NMBR) + ), + [_NAV] = LAYOUT_split_space( + _______, _______, KC_UP, _______, KC_LPRN, KC_RPRN, _______, KC_7, KC_8, KC_9, KC_KP_SLASH, KC_DEL, + _______, KC_LEFT, KC_DOWN, KC_RIGHT, KC_LCBR, KC_RCBR, _______, KC_4, KC_5, KC_6, KC_KP_ASTERISK, + _______, _______, _______, _______, KC_LABK, KC_RABK, KC_GRV, KC_1, KC_2, KC_3, KC_KP_MINUS, + _______, _______, _______, _______, _______, _______, KC_KP_DOT, KC_KP_PLUS + ), + [_NMBR] = LAYOUT_split_space( + 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_4, KC_5, KC_6, _______, _______, _______, _______, _______, _______, _______, + _______, KC_7, KC_8, KC_9, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, TO(_QWERTY), _______, _______, _______ + ), + [_MOUSE] = LAYOUT_split_space( + _______, KC_BTN1, KC_MS_U, KC_BTN2, _______, _______, _______, _______, KC_WH_U, _______, _______, _______, + _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, KC_WH_L, KC_WH_D, KC_WH_R, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, TO(_QWERTY), _______, _______, _______ + ), + [_FUNCT] = LAYOUT_split_space( + 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_HOME, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, + _______, KC_DEL, KC_END, KC_PGDN, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, RGB_TOG, RGB_MOD, _______, _______, RESET + ) +}; diff --git a/keyboards/mechmini/v1/v1.h b/keyboards/mechmini/v1/v1.h index 501bd89c5957..1e392b353092 100644 --- a/keyboards/mechmini/v1/v1.h +++ b/keyboards/mechmini/v1/v1.h @@ -40,4 +40,21 @@ along with this program. If not, see . { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ } +#define LAYOUT_split_space( \ + K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, \ + K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, \ + K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, \ + K00, K10, K20, K56, K57, KB0, KC0, K66 \ +) \ +{ \ + { K00, K10, K20, K56, KC_NO, KC_NO, K57, KC_NO, KB0, KC0, K66, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ +} + #endif From ac27b62fa17859b61a5b5f6c26b1e3113f219b39 Mon Sep 17 00:00:00 2001 From: takashiski Date: Thu, 4 Oct 2018 04:22:18 +0900 Subject: [PATCH 128/505] Keyboard: add info.json for qmk configurator (#4063) --- keyboards/namecard2x4/info.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/keyboards/namecard2x4/info.json b/keyboards/namecard2x4/info.json index e69de29bb2d1..3d6c332154f5 100644 --- a/keyboards/namecard2x4/info.json +++ b/keyboards/namecard2x4/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "namecard2x4", + "url": "https://skyhigh-works.hatenablog.com/", + "maintainer": "takashiski", + "bootloader": "atmel-dfu", + "width": 4, + "height": 2, + "layouts": { + "LAYOUT": { + "layout": [{"label":"1", "x":0, "y":0}, {"label":"2", "x":1, "y":0}, {"label":"3", "x":2, "y":0}, {"label":"4", "x":3, "y":0}, {"label":"5", "x":0, "y":1}, {"label":"6", "x":1, "y":1}, {"label":"7", "x":2, "y":1}, {"label":"8", "x":3, "y":1}] + } + } +} From 0d61e612f063b91568bf8098878051c4ea405ab3 Mon Sep 17 00:00:00 2001 From: martinakcsilla Date: Wed, 3 Oct 2018 23:38:02 +0200 Subject: [PATCH 129/505] process_ucis: Add a callback for success (#4067) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There is `qk_ucis_symbol_fallback` for the case where symbol lookup fails, but there wasn't one for the success case. This adds `qk_ucis_success`, called after successfully finishing the UCIS symbol input. Thanks to @drashna for the idea! Signed-off-by: Csilla Nagyné Martinák --- quantum/process_keycode/process_ucis.c | 8 ++++++++ quantum/process_keycode/process_ucis.h | 1 + 2 files changed, 9 insertions(+) diff --git a/quantum/process_keycode/process_ucis.c b/quantum/process_keycode/process_ucis.c index 86c0937f5e33..5de2e41fc305 100644 --- a/quantum/process_keycode/process_ucis.c +++ b/quantum/process_keycode/process_ucis.c @@ -32,6 +32,10 @@ void qk_ucis_start_user(void) { unicode_input_finish(); } +__attribute__((weak)) +void qk_ucis_success(uint8_t symbol_index) { +} + static bool is_uni_seq(char *seq) { uint8_t i; @@ -142,6 +146,10 @@ bool process_ucis (uint16_t keycode, keyrecord_t *record) { } unicode_input_finish(); + if (symbol_found) { + qk_ucis_success(i); + } + qk_ucis_state.in_progress = false; return false; } diff --git a/quantum/process_keycode/process_ucis.h b/quantum/process_keycode/process_ucis.h index 3f736a709fa2..d4aa34cde73a 100644 --- a/quantum/process_keycode/process_ucis.h +++ b/quantum/process_keycode/process_ucis.h @@ -45,6 +45,7 @@ extern const qk_ucis_symbol_t ucis_symbol_table[]; void qk_ucis_start(void); void qk_ucis_start_user(void); void qk_ucis_symbol_fallback (void); +void qk_ucis_success(uint8_t symbol_index); void register_ucis(const char *hex); bool process_ucis (uint16_t keycode, keyrecord_t *record); From f13ca593618b9f5ed6c175496a0d84633f541a94 Mon Sep 17 00:00:00 2001 From: Enochen Date: Wed, 3 Oct 2018 18:02:24 -0400 Subject: [PATCH 130/505] rn42 compilation error fix (#4050) * rn42 compile fix Fixes a compilation error * simpler rn42 compile fix good idea drashna :) --- keyboards/hhkb/rn42/rn42.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/hhkb/rn42/rn42.c b/keyboards/hhkb/rn42/rn42.c index 859e4014903c..154da4e10103 100644 --- a/keyboards/hhkb/rn42/rn42.c +++ b/keyboards/hhkb/rn42/rn42.c @@ -1,7 +1,7 @@ #include #include "host.h" #include "host_driver.h" -#include "serial.h" +#include "../serial.h" #include "rn42.h" #include "print.h" #include "timer.h" From dad579c8f81bdde08e598f9d99249893d5d779a8 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 3 Oct 2018 22:33:06 -0700 Subject: [PATCH 131/505] Add mousekey_send to (un)register_code --- tmk_core/common/action.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c index 76d02bc9dff8..8bdcd54e32cf 100644 --- a/tmk_core/common/action.c +++ b/tmk_core/common/action.c @@ -777,6 +777,7 @@ void register_code(uint8_t code) #ifdef MOUSEKEY_ENABLE else if IS_MOUSEKEY(code) { mousekey_on(code); + mousekey_send(); } #endif } @@ -841,6 +842,7 @@ void unregister_code(uint8_t code) #ifdef MOUSEKEY_ENABLE else if IS_MOUSEKEY(code) { mousekey_off(code); + mousekey_send(); } #endif } From 26adf3706a7822e05977c0eadb6963c0db2e1c3b Mon Sep 17 00:00:00 2001 From: SpacebarRacecar <42380065+SpacebarRacecar@users.noreply.github.com> Date: Fri, 5 Oct 2018 00:00:33 +0200 Subject: [PATCH 132/505] Keymap: Added personal userspace and keymaps. (#4073) * added personal userspace, niu mini, planck and fc660c keymaps * removed unnecessary include and some other minor corrections --- .../fc660c/keymaps/spacebarracecar/README.md | 4 + .../fc660c/keymaps/spacebarracecar/config.h | 9 + .../fc660c/keymaps/spacebarracecar/keymap.c | 38 +++ .../fc660c/keymaps/spacebarracecar/rules.mk | 6 + .../niu_mini/keymaps/spacebarracecar/config.h | 0 .../niu_mini/keymaps/spacebarracecar/keymap.c | 126 ++++++++ .../keymaps/spacebarracecar/readme.md | 3 + .../niu_mini/keymaps/spacebarracecar/rules.mk | 22 ++ .../planck/keymaps/spacebarracecar/config.h | 3 + .../planck/keymaps/spacebarracecar/keymap.c | 148 +++++++++ .../planck/keymaps/spacebarracecar/readme.md | 4 + .../planck/keymaps/spacebarracecar/rules.mk | 23 ++ users/spacebarracecar/config.h | 0 users/spacebarracecar/rules.mk | 5 + users/spacebarracecar/spacebarracecar.c | 305 ++++++++++++++++++ users/spacebarracecar/spacebarracecar.h | 242 ++++++++++++++ 16 files changed, 938 insertions(+) create mode 100644 keyboards/fc660c/keymaps/spacebarracecar/README.md create mode 100644 keyboards/fc660c/keymaps/spacebarracecar/config.h create mode 100644 keyboards/fc660c/keymaps/spacebarracecar/keymap.c create mode 100644 keyboards/fc660c/keymaps/spacebarracecar/rules.mk create mode 100644 keyboards/niu_mini/keymaps/spacebarracecar/config.h create mode 100644 keyboards/niu_mini/keymaps/spacebarracecar/keymap.c create mode 100644 keyboards/niu_mini/keymaps/spacebarracecar/readme.md create mode 100644 keyboards/niu_mini/keymaps/spacebarracecar/rules.mk create mode 100644 keyboards/planck/keymaps/spacebarracecar/config.h create mode 100644 keyboards/planck/keymaps/spacebarracecar/keymap.c create mode 100644 keyboards/planck/keymaps/spacebarracecar/readme.md create mode 100644 keyboards/planck/keymaps/spacebarracecar/rules.mk create mode 100644 users/spacebarracecar/config.h create mode 100644 users/spacebarracecar/rules.mk create mode 100644 users/spacebarracecar/spacebarracecar.c create mode 100644 users/spacebarracecar/spacebarracecar.h diff --git a/keyboards/fc660c/keymaps/spacebarracecar/README.md b/keyboards/fc660c/keymaps/spacebarracecar/README.md new file mode 100644 index 000000000000..7d87ef8cf628 --- /dev/null +++ b/keyboards/fc660c/keymaps/spacebarracecar/README.md @@ -0,0 +1,4 @@ +# US International keymap for PCs with German set as input language + +This keymap emulates a US International layout including a deadkey layer on PCs that have German set as the input language. +This allows the use of the keyboard on any PC in Germany without the need of changing the input language. diff --git a/keyboards/fc660c/keymaps/spacebarracecar/config.h b/keyboards/fc660c/keymaps/spacebarracecar/config.h new file mode 100644 index 000000000000..9c9b00656bd5 --- /dev/null +++ b/keyboards/fc660c/keymaps/spacebarracecar/config.h @@ -0,0 +1,9 @@ +#pragma once + +// higher value means deeper actuation point, less sensitive +// be careful and only make small adjustments (steps of 1 or 2). +// too high and keys will fail to actuate. too low and keys will actuate spontaneously. +// test all keys before further adjustment. +// this should probably stay in the range +/-5. +#undef ACTUATION_DEPTH_ADJUSTMENT +#define ACTUATION_DEPTH_ADJUSTMENT +2 diff --git a/keyboards/fc660c/keymaps/spacebarracecar/keymap.c b/keyboards/fc660c/keymaps/spacebarracecar/keymap.c new file mode 100644 index 000000000000..2cbef10bbff9 --- /dev/null +++ b/keyboards/fc660c/keymaps/spacebarracecar/keymap.c @@ -0,0 +1,38 @@ +#include QMK_KEYBOARD_H +#include "spacebarracecar.h" + +enum layers { + _BASE +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_BASE] = LAYOUT( + KC_ESC, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, DE_MINS,CU_EQL, KC_BSPC, KC_INS, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, CU_Z, KC_U, KC_I, KC_O, KC_P, CU_LBRC,CU_RBRC,CU_BSLS, KC_DEL, + CU_NAV, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, CU_SCLN,CU_QUOT, KC_ENT, + CU_LSFT,CU_Y, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, CU_COMM,CU_DOT, CU_SLSH,CU_RSFT, KC_UP, + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT + ), + + [_DEADKEY] = LAYOUT( + CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, CU_ED, + _______,CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, + _______,CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, CU_DDQ , + _______,CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, + _______,_______,_______, CU_DDQ, _______,_______,_______, _______,_______,_______ + ), + + [_NAV] = LAYOUT( + CU_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, CU_GAME, + _______,KC_PGDN,KC_UP, KC_PGUP,KC_HOME,XXXXXXX,XXXXXXX,XXXXXXX,GUIU, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, CU_ESCT, + _______,KC_LEFT,KC_DOWN,KC_RGHT,KC_END, XXXXXXX,XXXXXXX,GUIL, GUID, GUIR, XXXXXXX,XXXXXXX, KC_ENT, + _______,KC_MPRV,KC_MPLY,KC_MNXT,KC_VOLD,KC_VOLU,KC_MUTE,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,_______, KC_PGUP, + RESET, _______,_______, _______, _______,_______,_______, KC_HOME,KC_PGDN,KC_END + ) + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return process_record_userspace(keycode, record); +} diff --git a/keyboards/fc660c/keymaps/spacebarracecar/rules.mk b/keyboards/fc660c/keymaps/spacebarracecar/rules.mk new file mode 100644 index 000000000000..8ee642a4a734 --- /dev/null +++ b/keyboards/fc660c/keymaps/spacebarracecar/rules.mk @@ -0,0 +1,6 @@ +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work + +# Userspace defines +GERMAN_ENABLE = yes # Enable Custom US Ansi Keycodes for PC with German set as input language diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/config.h b/keyboards/niu_mini/keymaps/spacebarracecar/config.h new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c b/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c new file mode 100644 index 000000000000..b850e5fda755 --- /dev/null +++ b/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c @@ -0,0 +1,126 @@ +#include QMK_KEYBOARD_H +#include "spacebarracecar.h" + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +enum layers { + _BASE, + _LOWER, + _RAISE +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Base Layer +,-----------------------------------------------------------------------------------------------------------------------. +|Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace| +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Esc/Nav |A |S |D |F |G |H |J |K |L |; |' | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Shift |Y |X |C |V |B |N |M |, |. |/ |Shift | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|LCtrl | |Win |Alt |Lower |Space |Enter |Raise |AltGr |Win |Menu |RCtrl | +`-----------------------------------------------------------------------------------------------------------------------' +*/ + +[_BASE] = LAYOUT_ortho_4x12( + KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, + CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, + CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, + KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL +), + +/* Lower +,-----------------------------------------------------------------------------------------------------------------------. +|~ |! |" |# |$ |% |^ |& |* |( |) | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |@ |Strg+X |Strg+C |Strg+V | | |_ |+ |{ |} || | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |? | | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | | +`-----------------------------------------------------------------------------------------------------------------------' +*/ +[_LOWER] = LAYOUT_ortho_4x12( + DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, + _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, + _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Raise +,-----------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F1 |F2 |F3 |F4 |F5 |F6 |- |= |[ |] |\ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F7 |F8 |F9 |F10 |F11 |F12 | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | | +`-----------------------------------------------------------------------------------------------------------------------' +*/ + +[_RAISE] = LAYOUT_ortho_4x12( + CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Dead-Key +,-----------------------------------------------------------------------------------------------------------------------. +| | | | | | | |Ü | |Ö | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Ä |ß | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | |" |" | | | | | | +`-----------------------------------------------------------------------------------------------------------------------' +*/ + +[_DEADKEY] = LAYOUT_ortho_4x12( + KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, _______, + _______, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, + _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, + _______, _______, _______, _______, _______, CU_DDQ, CU_DDQ, _______, _______, _______, _______, _______ +), + +/* Nav +,-----------------------------------------------------------------------------------------------------------------------. +|Caps Lock|PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | |RESET | | +`-----------------------------------------------------------------------------------------------------------------------' +*/ + +[_NAV] = LAYOUT_ortho_4x12( + CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, + _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, RGB_M_P, KC_ENT, + _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, RGB_TOG, RGB_MOD, RGB_HUI, CU_RGBV, _______, + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CU_GAME +) + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { +switch (keycode) { + case MO(_LOWER): + if (game){ + if(record->event.pressed) { + register_code(KC_SPC); + } else { + unregister_code(KC_SPC); + } + return false; + } else { + return true; + } + } + return process_record_userspace(keycode, record); +} diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/readme.md b/keyboards/niu_mini/keymaps/spacebarracecar/readme.md new file mode 100644 index 000000000000..88d72218696a --- /dev/null +++ b/keyboards/niu_mini/keymaps/spacebarracecar/readme.md @@ -0,0 +1,3 @@ +# US-International like Niu Mini layout for PCs with German set as input language + +This layout aims to provide a US-International like layout for PCs that have German set as Input Language. This is useful for users living in germany, because it enables the use of the Niu Mini on any pc without having to switch the input language. It's mostly based on the Planck default layout, but adds essential features for german input, like a dead key layer to access ä, ö, ü. diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/rules.mk b/keyboards/niu_mini/keymaps/spacebarracecar/rules.mk new file mode 100644 index 000000000000..b1d7055da7ce --- /dev/null +++ b/keyboards/niu_mini/keymaps/spacebarracecar/rules.mk @@ -0,0 +1,22 @@ +# 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 +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 = yes # 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 + +# Userspace defines +GERMAN_ENABLE = yes # Enable Custom US Ansi Keycodes for PC with German set as input language diff --git a/keyboards/planck/keymaps/spacebarracecar/config.h b/keyboards/planck/keymaps/spacebarracecar/config.h new file mode 100644 index 000000000000..9b55fa93aaa3 --- /dev/null +++ b/keyboards/planck/keymaps/spacebarracecar/config.h @@ -0,0 +1,3 @@ +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(NO_SOUND) +#endif diff --git a/keyboards/planck/keymaps/spacebarracecar/keymap.c b/keyboards/planck/keymaps/spacebarracecar/keymap.c new file mode 100644 index 000000000000..705f78f8eaa6 --- /dev/null +++ b/keyboards/planck/keymaps/spacebarracecar/keymap.c @@ -0,0 +1,148 @@ +#include QMK_KEYBOARD_H +#include "spacebarracecar.h" + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +enum layers { + _BASE, + _LOWER, + _RAISE, + _MUSICMODE +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Base Layer +,-----------------------------------------------------------------------------------------------------------------------. +|Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace| +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Esc/Nav |A |S |D |F |G |H |J |K |L |; |' | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Shift |Y |X |C |V |B |N |M |, |. |/ |Shift | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|LCtrl | |Win |Alt |Lower |Space |Enter |Raise |AltGr |Win |Menu |RCtrl | +`-----------------------------------------------------------------------------------------------------------------------' +*/ + +[_BASE] = LAYOUT_ortho_4x12( + KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, + CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, + CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, + KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL +), + +/* Lower +,-----------------------------------------------------------------------------------------------------------------------. +|~ |! |" |# |$ |% |^ |& |* |( |) | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |@ |Strg+X |Strg+C |Strg+V | | |_ |+ |{ |} || | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |? | | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | | +`-----------------------------------------------------------------------------------------------------------------------' +*/ +[_LOWER] = LAYOUT_ortho_4x12( + DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, + _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, + _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Raise +,-----------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F1 |F2 |F3 |F4 |F5 |F6 |- |= |[ |] |\ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F7 |F8 |F9 |F10 |F11 |F12 | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | | +`-----------------------------------------------------------------------------------------------------------------------' +*/ + +[_RAISE] = LAYOUT_ortho_4x12( + CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +[_MUSICMODE] = LAYOUT_ortho_4x12( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + KC_LCTL, KC_LALT, KC_LGUI, KC_DOWN, KC_UP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MU_MOD, MU_OFF +), + +/* Dead-Key +,-----------------------------------------------------------------------------------------------------------------------. +| | | | | | | |Ü | |Ö | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Ä |ß | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | |" |" | | | | | | +`-----------------------------------------------------------------------------------------------------------------------' +*/ + +[_DEADKEY] = LAYOUT_ortho_4x12( + KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, KC_BSPC, + CU_NAV, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, + CU_LSFT, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_RSFT, + KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL +), + +/* Nav +,-----------------------------------------------------------------------------------------------------------------------. +|Caps Lock|PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | |RESET | | +`-----------------------------------------------------------------------------------------------------------------------' +*/ + +[_NAV] = LAYOUT_ortho_4x12( + CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, + _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, + _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, MU_ON, XXXXXXX, XXXXXXX, XXXXXXX, _______, + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CU_GAME +) + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { +switch (keycode) { + case MO(_LOWER): + if (game){ + if(record->event.pressed) { + register_code(KC_SPC); + } else { + unregister_code(KC_SPC); + } + return false; + } else { + return true; + } + case MU_ON: + if(record->event.pressed) { + layer_off(_LOWER); + layer_off(_RAISE); + layer_off(_NAV); + layer_off(_DEADKEY); + layer_on(_MUSICMODE); + } + return true; + case MU_OFF: + if(record->event.pressed) { + layer_off(_MUSICMODE); + } + return true; + } + return process_record_userspace(keycode, record); +} diff --git a/keyboards/planck/keymaps/spacebarracecar/readme.md b/keyboards/planck/keymaps/spacebarracecar/readme.md new file mode 100644 index 000000000000..daa9c4ad2b04 --- /dev/null +++ b/keyboards/planck/keymaps/spacebarracecar/readme.md @@ -0,0 +1,4 @@ +# US-International like Planck layout for PCs with German set as input language + +This layout aims to provide a US-International like layout for PCs that have German set as Input Language. This is useful for users living in germany, because it enables the use of the planck on any pc without having to switch the input language. It's mostly based on the Planck default layout, but adds essential features for german input, like a dead key layer to access ä, ö, ü. + diff --git a/keyboards/planck/keymaps/spacebarracecar/rules.mk b/keyboards/planck/keymaps/spacebarracecar/rules.mk new file mode 100644 index 000000000000..fbdd1217c058 --- /dev/null +++ b/keyboards/planck/keymaps/spacebarracecar/rules.mk @@ -0,0 +1,23 @@ +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = 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 +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 = yes # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +# Userspace defines +GERMAN_ENABLE = yes # Enable Custom US Ansi Keycodes for PC with German set as input language + diff --git a/users/spacebarracecar/config.h b/users/spacebarracecar/config.h new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/users/spacebarracecar/rules.mk b/users/spacebarracecar/rules.mk new file mode 100644 index 000000000000..319e887ae39b --- /dev/null +++ b/users/spacebarracecar/rules.mk @@ -0,0 +1,5 @@ +SRC += spacebarracecar.c + +ifeq ($(strip $(GERMAN_ENABLE)), yes) + OPT_DEFS += -DGERMAN_ENABLE +endif diff --git a/users/spacebarracecar/spacebarracecar.c b/users/spacebarracecar/spacebarracecar.c new file mode 100644 index 000000000000..404331f8dfee --- /dev/null +++ b/users/spacebarracecar/spacebarracecar.c @@ -0,0 +1,305 @@ +#include "spacebarracecar.h" + +#ifdef GERMAN_ENABLE +bool lshift = false; +bool rshift = false; +bool lshiftp = false; +bool rshiftp = false; +uint16_t lshift_timer = 0; +uint16_t rshift_timer = 0; + +uint8_t prev_indx = 0; +uint16_t prev_kcs[6] = {0, 0, 0, 0, 0, 0}; + +bool esct = false; + +void add_to_prev(uint16_t kc){ + for (int i=0; i0; i--){ + prev_kcs[i] = prev_kcs[i-1]; + } + prev_kcs[0] = kc; + } else { + prev_kcs[prev_indx] = kc; + prev_indx++; + } +} + +void unreg_prev(void){ + if (prev_indx == 0) + return; + for (int i=0; ievent.pressed) { + game = !game; + } + return false; + case KC_LGUI: + case KC_RGUI: + if (game) + return false; + else + return true; + case CU_NAV: + if(record->event.pressed) { + navesc = true; + navesc_timer = timer_read(); + layer_on(_NAV); + } else { + if (timer_elapsed(navesc_timer) < 200 && navesc) { + register_code(KC_ESC); + unregister_code(KC_ESC); + } + layer_off(_NAV); + } + return false; + + #ifdef RGBLIGHT_ENABLE + case CU_RGBV: + if(record->event.pressed) { + if (rgblight_get_val()+32>255) + rgblight_sethsv(rgblight_get_hue(), rgblight_get_sat(), 31); + else + rgblight_sethsv(rgblight_get_hue(), rgblight_get_sat(), rgblight_get_val()+32); + } + return false; + #endif + + #ifdef GERMAN_ENABLE + case CU_LSFT: + if(record->event.pressed) { + lshiftp = true; + lshift_timer = timer_read(); + unregister_code(KC_LSFT); + register_code(KC_LSFT); + lshift = true; + } else { + if (timer_elapsed(lshift_timer) < 200 && lshiftp && !game) { + register_code(KC_LSFT); + register_code(KC_8); + unregister_code(KC_8); + unregister_code(KC_LSFT); + } + unreg_prev(); + if (!rshift) + unregister_code(KC_LSFT); + lshift = false; + } + return false; + case CU_RSFT: + if(record->event.pressed) { + rshiftp = true; + rshift_timer = timer_read(); + unregister_code(KC_LSFT); + register_code(KC_LSFT); + rshift = true; + } else { + if (timer_elapsed(rshift_timer) < 200 && rshiftp && !game) { + register_code(KC_LSFT); + register_code(KC_9); + unregister_code(KC_9); + unregister_code(KC_LSFT); + } + unreg_prev(); + if (!lshift) + unregister_code(KC_LSFT); + rshift = false; + } + return false; + case CU_ESCT: + if(record->event.pressed) { + esct = !esct; + } + return false; + case CU_AE: + UML(DE_AE) + case CU_OE: + UML(DE_OE) + case CU_UE: + UML(DE_UE) + case CU_SS: + if(record->event.pressed) { + timer_timeout(); + unregister_code(KC_LSFT); + register_code(DE_SS); + unregister_code(DE_SS); + if (lshift || rshift) + register_code(KC_LSFT); + layer_off(_DEADKEY); + } + return false; + case CU_DDQ: + if(record->event.pressed) { + timer_timeout(); + register_code(KC_LSFT); + register_code(KC_2); + unregister_code(KC_2); + if (!lshift && !rshift) + unregister_code(KC_LSFT); + layer_off(_DEADKEY); + } + return false; + case CU_ED: + if(record->event.pressed) { + timer_timeout(); + layer_off(_DEADKEY); + } + return false; + case CU_GRV: + if(record->event.pressed) { + timer_timeout(); + if (lshift || rshift){ + unregister_code(KC_LSFT); + register_code(DE_ALGR); + unregister_code(DE_PLUS); + register_code(DE_PLUS); + unregister_code(DE_PLUS); + unregister_code(DE_ALGR); + register_code(KC_LSFT); + } else { + register_code(KC_LSFT); + unregister_code(DE_ACUT); + register_code(DE_ACUT); + unregister_code(DE_ACUT); + unregister_code(KC_LSFT); + if (!esct) { + register_code(KC_SPC); + unregister_code(KC_SPC); + } + } + } + return false; + case CU_CIRC: + if(record->event.pressed) { + timer_timeout(); + unregister_code(KC_LSFT); + unregister_code(DE_CIRC); + register_code(DE_CIRC); + unregister_code(DE_CIRC); + if (!esct) { + register_code(KC_SPC); + unregister_code(KC_SPC); + } + if (lshift || rshift) + register_code(KC_LSFT); + } + return false; + case CU_QUOT: + if(record->event.pressed){ + timer_timeout(); + register_code(KC_LSFT); + if (lshift || rshift){ + layer_on(_DEADKEY); + } else { + unregister_code(DE_HASH); + register_code(DE_HASH); + add_to_prev(DE_HASH); + } + } else { + unregister_code(DE_HASH); + unreg_prev(); + if (lshift || rshift) + register_code(KC_LSFT); + else + unregister_code(KC_LSFT); + } + return false; + case CU_6: + if(record->event.pressed){ + timer_timeout(); + unregister_code(KC_LSFT); + if (lshift || rshift){ + unregister_code(DE_CIRC); + register_code(DE_CIRC); + unregister_code(DE_CIRC); + if (!esct) { + register_code(KC_SPC); + unregister_code(KC_SPC); + } + register_code(KC_LSFT); + } else { + register_code(DE_6); + } + } else { + unregister_code(DE_6); + } + return false; + case CU_COMM: + SHIFT_NO(DE_COMM, DE_LESS) + case CU_DOT: + SHIFT_NORM(DE_DOT, DE_LESS) + case CU_SLSH: + SHIFT_ALL(DE_7, DE_SS) + case CU_SCLN: + SHIFT_ALL(DE_COMM, DE_DOT) + case CU_3: + SHIFT_NO(DE_3, DE_HASH) + case CU_7: + SHIFT_NORM(DE_7, DE_6) + case CU_8: + SHIFT_NORM(DE_8, DE_PLUS) + case CU_9: + SHIFT_NORM(DE_9, DE_8) + case CU_0: + SHIFT_NORM(DE_0, DE_9) + case CU_EQL: + SHIFT_SWITCH(DE_0, DE_PLUS) + case CU_LBRC: + SHIFT_ALGR(DE_8, DE_7) + case CU_RBRC: + SHIFT_ALGR(DE_9, DE_0) + case CU_BSLS: + SHIFT_ALGR(DE_SS, DE_LESS) + case CU_Z: + CTRL(DE_Z, KC_Z) + case CU_Y: + CTRL(DE_Y, KC_Y) + case KC_LCTL: + case KC_RCTL: + if(!record->event.pressed) { + unregister_code(KC_Z); + unregister_code(KC_Y); + } + return true; + #endif + + default: + if(record->event.pressed) { + timer_timeout(); + + #ifdef GERMAN_ENABLE + if (lshift || rshift) + register_code(KC_LSFT); + else + unregister_code(KC_LSFT); + #endif + + } + return true; + } +} diff --git a/users/spacebarracecar/spacebarracecar.h b/users/spacebarracecar/spacebarracecar.h new file mode 100644 index 000000000000..42879d2efb24 --- /dev/null +++ b/users/spacebarracecar/spacebarracecar.h @@ -0,0 +1,242 @@ +#pragma once + +#include "quantum.h" +#include "keymap_german.h" + +enum userspace_layers { + _DEADKEY = 14, //change if more than 16 layers are required + _NAV +}; + +enum userspace_custom_keycodes { + CU_GAME = SAFE_RANGE, // Toggle game mode on/off + CU_NAV, // NAV | ESC + + #ifdef GERMAN_ENABLE + CU_LSFT, // LSFT | ( + CU_RSFT, // LSFT | ) + CU_COMM, // , | < + CU_DOT, // . | > + CU_SLSH, // / | ? + CU_SCLN, // ; | : + CU_QUOT, // ' | Enable deadkey layer + CU_GRV, // ` | ~ + CU_CIRC, // ^ + CU_3, // 3 | # + CU_6, // 6 | ^ + CU_7, // 7 | & + CU_8, // 8 | * + CU_9, // 9 | ( + CU_0, // 0 | ) + CU_EQL, // = | + + CU_LBRC, // [ | { + CU_RBRC, // ] | } + CU_BSLS, // \ | | + CU_Z, // Z | Y in conjunction with ctrl + CU_Y, // Y | Z in conjunction wiht ctrl + CU_ESCT, // Toggle escape of grv and circ on/off + // Deadkey Layer + CU_AE, // Ä + CU_OE, // Ö + CU_UE, // Ü + CU_SS, // ß + CU_DDQ, // " + CU_ED, // Escape deadkey layer + #endif + + #ifdef RGBLIGHT_ENABLE + CU_RGBV, // Cycle through RGB brightness + #endif + + NEW_SAFE_RANGE // Use for keymap specific keycodes +}; + +#ifdef GERMAN_ENABLE +// these save the current shift status +extern bool lshift; +extern bool rshift; +// stuff for custom space cadet shift +extern bool lshiftp; +extern bool rshiftp; +extern uint16_t lshift_timer; +extern uint16_t rshift_timer; + +extern uint8_t prev_indx; +extern uint16_t prev_kcs[6]; + +void add_to_prev(uint16_t kc); +void unreg_prev(void); + +extern bool esct; +#endif + +// stuff for nav esc +extern bool navesc; +extern uint16_t navesc_timer; + +extern bool game; + +void timer_timeout(void); + +bool process_record_userspace(uint16_t keycode, keyrecord_t *record); + +#define CTRLX LCTL(KC_X) +#define CTRLC LCTL(KC_C) +#define CTRLV LCTL(KC_V) + +#define GUIU LGUI(KC_UP) +#define GUID LGUI(KC_DOWN) +#define GUIL LGUI(KC_LEFT) +#define GUIR RGUI(KC_RIGHT) + +// +// Templates for Keys, with custom shifted and non shifted Characters +// + +// Normal shift status +#define SHIFT_NORM(kc1, kc2) \ +if (record->event.pressed) { \ + timer_timeout(); \ + if (lshift || rshift) { \ + register_code(KC_LSFT); \ + unregister_code(kc2); \ + register_code(kc2); \ + add_to_prev(kc2); \ + } else { \ + unregister_code(KC_LSFT); \ + unregister_code(kc1); \ + register_code(kc1); \ + } \ +} else { \ + unregister_code(kc1); \ + unregister_code(kc2); \ +} \ +return false; + +// Inverted shift status +#define SHIFT_SWITCH(kc1, kc2) \ +if (record->event.pressed) { \ + timer_timeout(); \ + if (lshift || rshift) { \ + unregister_code(KC_LSFT); \ + unregister_code(kc2); \ + register_code(kc2); \ + add_to_prev(kc2); \ + } else { \ + register_code(KC_LSFT); \ + unregister_code(kc1); \ + register_code(kc1); \ + add_to_prev(kc1); \ + } \ +} else { \ + unregister_code(kc1); \ + unregister_code(kc2); \ + unreg_prev(); \ + if (lshift || rshift) \ + register_code(KC_LSFT); \ + else \ + unregister_code(KC_LSFT); \ +} \ +return false; + +// All shift +#define SHIFT_ALL(kc1, kc2) \ +if (record->event.pressed) { \ + timer_timeout(); \ + register_code(KC_LSFT); \ + if (lshift || rshift) { \ + unregister_code(kc2); \ + register_code(kc2); \ + add_to_prev(kc2); \ + } else { \ + unregister_code(kc1); \ + register_code(kc1); \ + add_to_prev(kc1); \ + } \ +} else { \ + unregister_code(kc1); \ + unregister_code(kc2); \ + unreg_prev(); \ + if (lshift || rshift) \ + register_code(KC_LSFT); \ + else \ + unregister_code(KC_LSFT); \ +} \ +return false; + +// All no shift +#define SHIFT_NO(kc1, kc2) \ +if (record->event.pressed) { \ + timer_timeout(); \ + unregister_code(KC_LSFT); \ + if (lshift || rshift) { \ + unregister_code(kc2); \ + register_code(kc2); \ + add_to_prev(kc2); \ + } else { \ + unregister_code(kc1); \ + register_code(kc1); \ + } \ +} else { \ + unregister_code(kc1); \ + unregister_code(kc2); \ + unreg_prev(); \ + if (lshift || rshift) \ + register_code(KC_LSFT); \ + else \ + unregister_code(KC_LSFT); \ +} \ +return false; + +// All algr +#define SHIFT_ALGR(kc1, kc2) \ +if (record->event.pressed) { \ + timer_timeout(); \ + unregister_code(KC_LSFT); \ + register_code(DE_ALGR); \ + if (lshift || rshift) { \ + unregister_code(kc2); \ + register_code(kc2); \ + unregister_code(kc2); \ + register_code(KC_LSFT); \ + } else { \ + unregister_code(kc1); \ + register_code(kc1); \ + unregister_code(kc1); \ + } \ + unregister_code(DE_ALGR); \ +} \ +return false; + +// Different keycode for ctrl +#define CTRL(kc1, kc2) \ +if(record->event.pressed) { \ + timer_timeout(); \ + if (lshift || rshift) \ + register_code(KC_LSFT); \ + else \ + unregister_code(KC_LSFT); \ + if (keyboard_report->mods & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))){ \ + register_code(kc2); \ + } else { \ + register_code(kc1); \ + } \ +} else { \ + unregister_code(kc1); \ + unregister_code(kc2); \ +} \ +return false; + +// Umlaute for deadkey layer +#define UML(kc) \ +if(record->event.pressed) { \ + timer_timeout(); \ + if (lshift || rshift) \ + register_code(KC_LSFT); \ + else \ + unregister_code(KC_LSFT); \ + register_code(kc); \ + unregister_code(kc); \ + layer_off(_DEADKEY); \ +} \ +return false; From 0c3137d8ff0b84ee6b39ea8b85aeb4f82fcd7a9c Mon Sep 17 00:00:00 2001 From: James Laird-Wah Date: Sat, 15 Sep 2018 22:28:25 +1000 Subject: [PATCH 133/505] rgb_matrix: continue calling rgb_matrix_indicators() when toggled off This allows user code to continue to use the matrix for indication, even when the RGB toggle is off, using rgb_matrix_set_color(). Without this change, it's impossible for user code to use the matrix when the toggle is off, as any changes get overwritten with black on the next task cycle, and the indicator code is not called at all. --- quantum/rgb_matrix.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index 1f00e9d99b47..26ee57f5c2c4 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -620,7 +620,8 @@ void rgb_matrix_custom(void) { void rgb_matrix_task(void) { static uint8_t toggle_enable_last = 255; if (!rgb_matrix_config.enable) { - rgb_matrix_all_off(); + rgb_matrix_all_off(); + rgb_matrix_indicators(); toggle_enable_last = rgb_matrix_config.enable; return; } From b4f26a46164996f5bce58fbf958145ae64e8ae59 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Thu, 4 Oct 2018 20:34:47 -0700 Subject: [PATCH 134/505] Keyboard: DZ60: add Plate B layouts (#4076) Adds maximized DZ60 Plate B layout macros in ANSI and ISO, featuring 2.25u Left Shift (1.25u/1u split for ISO) and 1.75u Right Shift with Inverted-T arrow keys. Also supports Split Spacebar and Split Backspace. --- keyboards/dz60/dz60.h | 56 +++++++++++++++++++++++++++++++++++++++- keyboards/dz60/info.json | 8 ++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/keyboards/dz60/dz60.h b/keyboards/dz60/dz60.h index 6d80b2c7cb98..fac5fa32ffc5 100644 --- a/keyboards/dz60/dz60.h +++ b/keyboards/dz60/dz60.h @@ -70,7 +70,7 @@ * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ * │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │3e │ - * ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴──────┬┴───┴┬───┬─┴───┤ + * ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬───┬─┴───┤ * │▓▓▓▓▓│41 │43 │46 (7u) │4b │4d │▓▓▓▓▓│ * └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ */ @@ -224,4 +224,58 @@ { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, k4c, k4d, k4e } \ } +/* LAYOUT_60_b_ansi (maximized DZ60 Plate B layout for ANSI) + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬───┬───┤ + * │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3c │3d │3e │ + * ├────┬───┴┬──┴─┬─┴───┴──┬┴───┼───┴───┴──┬┴──┬┴──┬───┼───┼───┤ + * │40 │41 │43 │44 │46 │48 │4a │4b │4c │4d │4e │ + * └────┴────┴────┴────────┴────┴──────────┴───┴───┴───┴───┴───┘ +*/ +#define LAYOUT_60_b_ansi( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3c, k3d, k3e, \ + k40, k41, k43, k44, k46, k48, k4a, k4b, k4c, k4d, k4e \ +) { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, KC_NO, k3c, k3d, k3e }, \ + { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \ +} + +/* LAYOUT_60_b_iso (maximized DZ60 Plate B layout for ISO) + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐2d │ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │1e │ │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴┬──┴────┤ + * │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3c │3d │3e │ + * ├────┼───┴┬──┴─┬─┴───┴──┬┴───┼───┴───┴──┬┴──┬┴──┬───┼───┼───┤ + * │40 │41 │43 │44 │46 │48 │4a │4b │4c │4d │4e │ + * └────┴────┴────┴────────┴────┴──────────┴───┴───┴───┴───┴───┘ +*/ +#define LAYOUT_60_b_iso( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k1e, k2d, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3c, k3d, k3e, \ + k40, k41, k43, k44, k46, k48, k4a, k4b, k4c, k4d, k4e \ +) { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, KC_NO, k3c, k3d, k3e }, \ + { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \ +} + #endif diff --git a/keyboards/dz60/info.json b/keyboards/dz60/info.json index 4855c3b81aac..56e3677b7af3 100644 --- a/keyboards/dz60/info.json +++ b/keyboards/dz60/info.json @@ -36,6 +36,14 @@ "LAYOUT_60_iso_5x1u": { "key_count": 63, "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"|", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"~", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"/", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Fn", "x":10, "y":4}, {"label":"←", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"↑", "x":13, "y":4}, {"label":"→", "x":14, "y":4}] + }, + "LAYOUT_60_b_ansi": { + "key_count": 66, + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, {"label":"2", "x":2, "y":0}, {"label":"3", "x":3, "y":0}, {"label":"4", "x":4, "y":0}, {"label":"5", "x":5, "y":0}, {"label":"6", "x":6, "y":0}, {"label":"7", "x":7, "y":0}, {"label":"8", "x":8, "y":0}, {"label":"9", "x":9, "y":0}, {"label":"0", "x":10, "y":0}, {"label":"-", "x":11, "y":0}, {"label":"=", "x":12, "y":0}, {"x":13, "y":0}, {"label":"Back Space", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"[", "x":11.5, "y":1}, {"label":"]", "x":12.5, "y":1}, {"label":"\\", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":";", "x":10.75, "y":2}, {"label":"'", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":",", "x":9.25, "y":3}, {"label":".", "x":10.25, "y":3}, {"label":"Shift", "x":11.25, "y":3, "w":1.75}, {"label":"Up", "x":13, "y":3}, {"label":"Del", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"GUI", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"label":"Space", "x":3.75, "y":4, "w":2.25}, {"label":"Space", "x":6, "y":4, "w":1.25}, {"label":"Space", "x":7.25, "y":4, "w":2.75}, {"label":"Alt", "x":10, "y":4}, {"label":"Fn", "x":11, "y":4}, {"label":"Left", "x":12, "y":4}, {"label":"Down", "x":13, "y":4}, {"label":"Right", "x":14, "y":4}] + }, + "LAYOUT_60_b_iso": { + "key_count": 67, + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, {"label":"2", "x":2, "y":0}, {"label":"3", "x":3, "y":0}, {"label":"4", "x":4, "y":0}, {"label":"5", "x":5, "y":0}, {"label":"6", "x":6, "y":0}, {"label":"7", "x":7, "y":0}, {"label":"8", "x":8, "y":0}, {"label":"9", "x":9, "y":0}, {"label":"0", "x":10, "y":0}, {"label":"-", "x":11, "y":0}, {"label":"=", "x":12, "y":0}, {"x":13, "y":0}, {"label":"Back Space", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"[", "x":11.5, "y":1}, {"label":"]", "x":12.5, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":";", "x":10.75, "y":2}, {"label":"'", "x":11.75, "y":2}, {"label":"#", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"\\", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":",", "x":9.25, "y":3}, {"label":".", "x":10.25, "y":3}, {"label":"Shift", "x":11.25, "y":3, "w":1.75}, {"label":"Up", "x":13, "y":3}, {"label":"Del", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"GUI", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"label":"Space", "x":3.75, "y":4, "w":2.25}, {"label":"Space", "x":6, "y":4, "w":1.25}, {"label":"Space", "x":7.25, "y":4, "w":2.75}, {"label":"AltGr", "x":10, "y":4}, {"label":"Fn", "x":11, "y":4}, {"label":"Left", "x":12, "y":4}, {"label":"Down", "x":13, "y":4}, {"label":"Right", "x":14, "y":4}] } } } From 13d67200df2337a2b4dbe86574e77f0e1732aef6 Mon Sep 17 00:00:00 2001 From: eucalyn Date: Sat, 6 Oct 2018 00:43:04 +0900 Subject: [PATCH 135/505] Keyboard: set SAFE_RANGE (#4078) --- keyboards/mint60/keymaps/default/keymap.c | 2 +- keyboards/mint60/keymaps/eucalyn/keymap.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/mint60/keymaps/default/keymap.c b/keyboards/mint60/keymaps/default/keymap.c index 42c61ffaad4e..36895cb47417 100644 --- a/keyboards/mint60/keymaps/default/keymap.c +++ b/keyboards/mint60/keymaps/default/keymap.c @@ -31,7 +31,7 @@ extern rgblight_config_t rgblight_config; #define XXXXXXX KC_NO enum custom_keycodes { - RGBRST + RGBRST = SAFE_RANGE }; diff --git a/keyboards/mint60/keymaps/eucalyn/keymap.c b/keyboards/mint60/keymaps/eucalyn/keymap.c index 09b30730ad71..566d734a5238 100644 --- a/keyboards/mint60/keymaps/eucalyn/keymap.c +++ b/keyboards/mint60/keymaps/eucalyn/keymap.c @@ -31,7 +31,7 @@ extern rgblight_config_t rgblight_config; #define XXXXXXX KC_NO enum custom_keycodes { - RGBRST + RGBRST = SAFE_RANGE }; From ac7b2d92bf1254803ec97c075e6d0c833dfd4146 Mon Sep 17 00:00:00 2001 From: yiancar Date: Thu, 4 Oct 2018 22:37:26 +0100 Subject: [PATCH 136/505] ARM SWD guide - Added a detailed (but saddly long) debugging guide. - Modified sidebar and summary to include the links. --- docs/_sidebar.md | 1 + docs/_summary.md | 1 + docs/arm_debugging.md | 87 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 docs/arm_debugging.md diff --git a/docs/_sidebar.md b/docs/_sidebar.md index a35014dd8c71..973428c9e0d2 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -74,6 +74,7 @@ * For Makers and Modders * [Hand Wiring Guide](hand_wire.md) * [ISP Flashing Guide](isp_flashing_guide.md) + * [ARM Debugging Guide](arm_debugging.md) * For a Deeper Understanding * [How Keyboards Work](how_keyboards_work.md) diff --git a/docs/_summary.md b/docs/_summary.md index a35014dd8c71..973428c9e0d2 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -74,6 +74,7 @@ * For Makers and Modders * [Hand Wiring Guide](hand_wire.md) * [ISP Flashing Guide](isp_flashing_guide.md) + * [ARM Debugging Guide](arm_debugging.md) * For a Deeper Understanding * [How Keyboards Work](how_keyboards_work.md) diff --git a/docs/arm_debugging.md b/docs/arm_debugging.md new file mode 100644 index 000000000000..491dfe8ad70b --- /dev/null +++ b/docs/arm_debugging.md @@ -0,0 +1,87 @@ +# ARM Debugging usign Eclipse + +This page describes how to setup debugging for ARM MCUs using an SWD adapter and open-source/free tools. In this guide we will install GNU MCU Eclipse IDE for C/C++ Developers and OpenOCD together with all the necessary dependencies. + +This guide is catered towards advance users and assumes you can compile an ARM compatible keyboard on your machine using the MAKE flow. + +## Installing the software + +The main objective here is to get the MCU Eclipse IDE correcly installed on our machine. The necesarry instructions are derived from [this](https://gnu-mcu-eclipse.github.io/install/) install guide. + +### The xPack Manager + +This tool is a software package manager and it is used to help us get the necesarry depencencies. + +XPM runs using Node.js so grab that form [here](https://nodejs.org/en/). After installation, open a terminal and type `npm -v`. A reply with the version number means that the instalation was successful. + +XPM instalation instructions can be found [here](https://www.npmjs.com/package/xpm) and are OS specific. Entering `xpm --version` to your terminal should return the software version. + +### The ARM Toolchain + +Using XPM it is very easy to install the ARM toolchain. Enter the command `xpm install --global @gnu-mcu-eclipse/arm-none-eabi-gcc`. + +### Windows build tools + +If you are using windows you need to install this! + +`xpm install --global @gnu-mcu-eclipse/windows-build-tools` + +### Programer/Debugger Drivers + +Now its the time to install your programer's drivers. This tutorial was made using an ST-Link v2 which you can get from almost anywhere. +If you have an ST-Link the drivers can be found [here](https://www.st.com/en/development-tools/stsw-link009.html) otherwise consult the manufuturer of your tool. + +### OpenOCD + +This dependency allows SWD access from GDB and it is essential for debugging. Run `xpm install --global @gnu-mcu-eclipse/openocd`. + +### Java + +Java is needed by Eclipse so please download it from [here](https://www.oracle.com/technetwork/java/javase/downloads/index.html). + +### GNU MCU Eclipse IDE + +Now its finally time to install the IDE. Use the Release page [here](https://github.com/gnu-mcu-eclipse/org.eclipse.epp.packages/releases/) to get the latest version. + +## Configuring Eclipse + +Open up the Eclipse IDE we just downloaded. To import our QMK directory select File -> Import -> C/C++ -> Existing code as Makefile Project. Select next and use Browse to select your QMK folder. In the tool-chain list select ARM Cross GCC and select Finish. + +Now you can see the QMK folder on the left hand side. Right click it and select Properties. On the left hand side, expand MCU and select ARM Toolchain Paths. Press xPack and OK. Repeat for OpenOCD Path and if you are on windows for Build Tool Path. Select Apply and Close. + +Now its time to install the necessary MCU packages. Go to Packs perspective by selecting Window -> Open Perspective -> Others -> Packs. Now select the yellow refresh symbol next to the Packs tab. This will take a long time as it is requesting the MCU definitions from various places. If some of the links fail you can probably select Ignore. + +When this finishes you must find the MCU which we will be building/debugging for. In this example I will be using the STM32F3 series MCUs. On the left, select STMicroelectonics -> STM32F3 Series. On the middle window we can see the pack. Right click and select Install. Once that is done we can go back to the default perspective, Window -> Open Perspective -> Others -> C/C++. + +We need to let eclipse know the device we intent to build QMK on. Right click on the QMK folder -> Properties -> C/C++ Build -> Settings. Select the Devices tab and under devices select the appropriate variant of your MCU. For my example it is STM32F303CC + +While we are here let's setup the build command as well. Select C/C++ Build and then the Behavior tab. On the build command, replace `all` with your necessary make command. For example for a rev6 Planck with the default keymap this would be `planck/rev6:default`. Select Apply and Close. + +## Building + +If you have setup everything correctly pressing the hammer button should build the firmware for you and a .bin file should appear. + +## Debugging + +### Connecting the Debugger + +ARM MCUs use the Single Wire Debug (SWD) protocol which comprises of the clock (SWCLK) signal and the data (SWDIO) signal. Connecting this two wires and ground should be enough to allow full manipulation of the MCU. Here we assume that the keyboard will be powered though USB. The RESET signal is not necessary as we can manually assert it using the reset button. For a more advance setup, the SWO signal can be used which pipes printf and scanf asynchronously to the host but for our setup we will ignore it. + +NOTE: Make sure the SWCLK and SWDIO pins are not used in the matrix of your keyboard. If they are you can temporarily switch them for some other pins. + +### Configuring the Debugger + +Right click on your QMK folder, select Debug As -> Debug Configuration. Here double click on GDB OpenOCD Debugging. Select the debugger tab and enter the configuration necessary for your MCU. This might take some fiddling and googleing to find out. The default script for the STM32F3 is called stm32f3discovery.cfg. To let OpenOCD know, in the Config options enter `-f board/stm32f3discovery.cfg`. + +NOTE: In my case this configuration script requires editing to disable the reset assertion. The locations of the scripts can be found in the actual executable field usually under the path `openocd/version/.content/scripts/board`. Here I edited `reset_config srst_only` to `reset_config none`. + +Select Apply and Close. + +### Running the Debugger. + +Reset your keyboard. + +Press the bug icon and if all goes well you should soon find yourself in the debug perspective. Here the program counter will pause at the beginning of the main function and way for you to press Play. Most of the features of all debuggers work on ARM MCUs but for exact details google is your friend! + + +Happy debugging! \ No newline at end of file From 27e216fc1a481bb3e65832458bd2b199cb499e0b Mon Sep 17 00:00:00 2001 From: thomasviaud Date: Fri, 5 Oct 2018 21:00:24 +0200 Subject: [PATCH 137/505] Keymap: Add french iso layout for dz60 (thomasviaud) (#4080) --- keyboards/dz60/keymaps/thomasviaud/README.md | 4 ++++ keyboards/dz60/keymaps/thomasviaud/keymap.c | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 keyboards/dz60/keymaps/thomasviaud/README.md create mode 100644 keyboards/dz60/keymaps/thomasviaud/keymap.c diff --git a/keyboards/dz60/keymaps/thomasviaud/README.md b/keyboards/dz60/keymaps/thomasviaud/README.md new file mode 100644 index 000000000000..f5bf221a229f --- /dev/null +++ b/keyboards/dz60/keymaps/thomasviaud/README.md @@ -0,0 +1,4 @@ +## French ISO Layout + +Here is a very simple version of a French ISO Layout (handled by OS). +Feel free to take this as base for your own layout. diff --git a/keyboards/dz60/keymaps/thomasviaud/keymap.c b/keyboards/dz60/keymaps/thomasviaud/keymap.c new file mode 100644 index 000000000000..02fdb5a4a0a3 --- /dev/null +++ b/keyboards/dz60/keymaps/thomasviaud/keymap.c @@ -0,0 +1,18 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + LAYOUT_60_iso( + 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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS , KC_ENT, + 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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL), + + LAYOUT_60_iso( + 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_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, + _______, _______, _______, RESET, _______, _______, _______, _______), +}; \ No newline at end of file From 54b61b508be7f0b0d85ecd7c45bc8b6bd51d2140 Mon Sep 17 00:00:00 2001 From: Johannes Huber Date: Fri, 5 Oct 2018 23:49:30 +0200 Subject: [PATCH 138/505] E6V2 LE HHKB love (#4079) * Keyboard: E6V2 LE HHKB layout support * Keymap: Add johu's E6V2 LE HHKB layout --- keyboards/e6v2/le/info.json | 7 +- keyboards/e6v2/le/keymaps/johu/keymap.c | 98 ++++++++++++++++++++++++ keyboards/e6v2/le/keymaps/johu/readme.md | 40 ++++++++++ keyboards/e6v2/le/le.h | 28 +++++++ keyboards/e6v2/readme.md | 2 +- 5 files changed, 172 insertions(+), 3 deletions(-) create mode 100644 keyboards/e6v2/le/keymaps/johu/keymap.c create mode 100644 keyboards/e6v2/le/keymaps/johu/readme.md diff --git a/keyboards/e6v2/le/info.json b/keyboards/e6v2/le/info.json index 9016f413e840..5a44eab18c67 100644 --- a/keyboards/e6v2/le/info.json +++ b/keyboards/e6v2/le/info.json @@ -8,9 +8,12 @@ "LAYOUT": { "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"x":0, "y":3}, {"x":1, "y":3}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.75}, {"label":"Ctrl", "x":1.75, "y":4, "w":1.25}, {"label":"Win", "x":3, "y":4, "w":1.25}, {"label":"Alt", "x":4.25, "y":4, "w":1.25}, {"x":5.5, "y":4, "w":2.75}, {"x":8.25, "y":4, "w":1.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}] }, - "LAYOUT_60_ansi": { "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + }, + "LAYOUT_60_hhkb": { + "key_count": 60, + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, {"label":"2", "x":2, "y":0}, {"label":"3", "x":3, "y":0}, {"label":"4", "x":4, "y":0}, {"label":"5", "x":5, "y":0}, {"label":"6", "x":6, "y":0}, {"label":"7", "x":7, "y":0}, {"label":"8", "x":8, "y":0}, {"label":"9", "x":9, "y":0}, {"label":"0", "x":10, "y":0}, {"label":"-", "x":11, "y":0}, {"label":"=", "x":12, "y":0}, {"label":"\\", "x":13, "y":0}, {"label":"`", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"[", "x":11.5, "y":1}, {"label":"]", "x":12.5, "y":1}, {"label":"Backspace", "x":13.5, "y":1, "w":1.5}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":";", "x":10.75, "y":2}, {"label":"'", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":",", "x":9.25, "y":3}, {"label":".", "x":10.25, "y":3}, {"label":"/", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Os", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Os", "x":12.5, "y":4}] } } -} \ No newline at end of file +} diff --git a/keyboards/e6v2/le/keymaps/johu/keymap.c b/keyboards/e6v2/le/keymaps/johu/keymap.c new file mode 100644 index 000000000000..691f0e73cd6c --- /dev/null +++ b/keyboards/e6v2/le/keymaps/johu/keymap.c @@ -0,0 +1,98 @@ +#include QMK_KEYBOARD_H + +#define _BL 0 +#define _FL 1 +#define _SL 2 +#define _CL 3 + +// Tap dance defines +#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 KC_SPFN LT(_SL, KC_SPC) // Tap for space, hold for function layer (aka SpaceFN) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Layer 0: Base layer (Default layer) + * ,-----------------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` | + * |-----------------------------------------------------------------------------------------+ + * |Tab/Hyper| Q | W | E | R | T | Y | U | I | O | P | [ | ] | Bksp | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl/Esc | A | S | D | F | G | H | J | K | L | ; | ' | Enter | + * |-----------------------------------------------------------------------------------------+ + * | Shift | Z | X | C | V | B | N | M | , | . | / | Shift/Ent | FN | + * |-----------------------------------------------------------------------------------------+ + * |LGUI | LAlt | Space | RAlt |RGUI | + * `--------------------------------------------------------------------' + */ + [_BL] = LAYOUT_60_hhkb( + KC_GESC, 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, + 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_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_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, MO(_FL), + KC_LGUI, KC_LALT, KC_SPFN, KC_RALT, KC_RGUI + ), + +/* Layer 1: FN Layer + * ,-----------------------------------------------------------------------------------------. + * | CL | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | | Psc | Slck| Paus| Up | | Del | + * |-----------------------------------------------------------------------------------------+ + * | | Vol-| Vol+| Mute| | | * | / | Home| PgUp| Left|Right| | + * |-----------------------------------------------------------------------------------------+ + * | | Prev| Play| Next| | | + | - | End |PgDn| Down| | | + * |-----------------------------------------------------------------------------------------+ + * | | | | Stop | CL | + * `--------------------------------------------------------------------' + */ + [_FL] = LAYOUT_60_hhkb( + TG(_CL), 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_PSCR, KC_SLCK, KC_PAUS, KC_UP, _______, KC_DEL, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, _______, + _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, _______, _______, + _______, _______, _______, KC_MSTP, MO(_CL) + ), + +/* Layer 2: Space FN Layer +* ,-----------------------------------------------------------------------------------------. +* | CL | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del | +* |-----------------------------------------------------------------------------------------+ +* | | | | | | | | PgUp| | PgDn| | | | Del | +* |-----------------------------------------------------------------------------------------+ +* | | Vol-| Vol+| Mute| | | Left| Down| Up |Right| | | | +* |-----------------------------------------------------------------------------------------+ +* | | Prev| Play| Next| | | Home| End | | | | | | +* |-----------------------------------------------------------------------------------------+ +* | | | | | CL | +* `--------------------------------------------------------------------' +*/ + [_SL] = LAYOUT_60_hhkb( + TG(_CL), 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_PGUP, _______, KC_PGDN, _______, _______, _______, KC_DEL, + _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______, + _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, KC_HOME, KC_END, _______, _______, _______, _______, _______, + _______, _______, _______, _______, MO(_CL) + ), + +/* Layer 3: Control Layer + * ,-----------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | BL- | BL+ | BL | | | | | | | | | | RESET | + * |-----------------------------------------------------------------------------------------+ + * | | RGBT| RGBM| | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | CAPS | Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | + * `--------------------------------------------------------------------' + */ + [_CL] = LAYOUT_60_hhkb( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, BL_TOGG, BL_STEP, BL_DEC, BL_INC, _______, _______, _______, _______, _______, _______, _______, _______, RESET, + _______, RGB_TOG, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_CAPS, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/e6v2/le/keymaps/johu/readme.md b/keyboards/e6v2/le/keymaps/johu/readme.md new file mode 100644 index 000000000000..605a14a1c3f5 --- /dev/null +++ b/keyboards/e6v2/le/keymaps/johu/readme.md @@ -0,0 +1,40 @@ +# johu's E6-V2 Last Edition (LE) HHKB +Make example for this keyboard (after setting up your build environment): +```bash +$ make e6v2/le:johu +``` + +Or to make and flash: +```bash +$ make e6v2/le:johu:dfu +``` + +See the [build environment setup] and the [make instructions] for more +information. Brand new to QMK? Start with our [Complete Newbs Guide]. + +## Layer 0: Base Layer +* HHKB Qwerty layout plus some specials: + * The Space key sends `Space` when tapped, toggles to *Space FN Layer* when held + * [Grave Escape] + * The Ctrl key sends `Esc` when tapped, `Ctrl` when held + * The Tab key sends `Tab` when tapped, [Hyper] (`Super+Ctrl+Alt+Shift`) when held + * The right Shift key sends `Enter` when tapped, `Shift` when held + +## Layer 1: Function Layer +* Default HHKB function layer includig the iconic diamond arrow cluster +* Multimedia controls + +## Layer 2: Space FN Layer +* VIM style arrow cluster +* Multimedia controls + +## Layer 3: Control Layer +* Reset button +* RGB controls +* Caps Lock + +[build environment setup]: https://docs.qmk.fm/#/getting_started_build_tools +[make instructions]: https://docs.qmk.fm/#/getting_started_make_guide +[Complete Newbs Guide]: https://docs.qmk.fm/#/newbs +[Grave Escape]: https://beta.docs.qmk.fm/features/feature_grave_esc +[Hyper]: http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key diff --git a/keyboards/e6v2/le/le.h b/keyboards/e6v2/le/le.h index 380efd2a7af4..d52560dfbe8d 100644 --- a/keyboards/e6v2/le/le.h +++ b/keyboards/e6v2/le/le.h @@ -33,4 +33,32 @@ { K40, KC_NO, K42, K43, KC_NO, KC_NO, KC_NO, K47, KC_NO, KC_NO, K4A, K4B, KC_NO, K4D, K4E }, \ } +/* LAYOUT_60_hhkb + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0e │0d │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ + * │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3c │3e │ + * ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴──────┬┴───┴┬───┬─┴───┤ + * │▓▓▓▓▓│42 │43 │47 (7u) │4b │4d │▓▓▓▓▓│ + * └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘ +*/ +#define LAYOUT_60_hhkb( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0E, K0D, \ + K10, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \ + K20, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3E, \ + K42, K43, K47, K4B, K4D \ +)\ +{\ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \ + { K10, KC_NO, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \ + { K20, KC_NO, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, KC_NO }, \ + { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, KC_NO, K3E }, \ + { KC_NO, KC_NO, K42, K43, KC_NO, KC_NO, KC_NO, K47, KC_NO, KC_NO, KC_NO, K4B, KC_NO, K4D, KC_NO }, \ +} + #endif diff --git a/keyboards/e6v2/readme.md b/keyboards/e6v2/readme.md index 9ebfac4a78cd..c09d1ccf1b56 100644 --- a/keyboards/e6v2/readme.md +++ b/keyboards/e6v2/readme.md @@ -17,4 +17,4 @@ The E6V2 has been available with either a bootmapper client or QMK powered PCB. Please use the appropriate version when making your firmware. Flashing one in place of the other, can brick your PCB. Please be certain whether you have a OE or LE PCB. -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). From f1003aaccfdd4210103e796206e6ac40285dab5b Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Sat, 6 Oct 2018 06:51:34 +0900 Subject: [PATCH 139/505] Keyboard: Helix five_rows keymap reduced size (#4082) * add PERMISSIVE_HOLD in helix:five_rows/config.h * add Eucalyn char layout into helix:five_rows * Helix five_rows keymap: make rgblight modes selectable. No change in build result. * fix keymap.c map comment, add console compile option No change in build result. * Helix five_rows keymap: reduced the size. --- keyboards/helix/config.h | 13 --- .../helix/rev2/keymaps/five_rows/config.h | 23 ++++- .../helix/rev2/keymaps/five_rows/keymap.c | 96 +++++++++++++------ .../helix/rev2/keymaps/five_rows/rules.mk | 15 ++- .../helix/rev2/keymaps/led_test/config.h | 20 ++-- .../helix/rev2/keymaps/led_test/rules.mk | 2 +- 6 files changed, 112 insertions(+), 57 deletions(-) diff --git a/keyboards/helix/config.h b/keyboards/helix/config.h index b79093d871d6..fbfbd3280434 100644 --- a/keyboards/helix/config.h +++ b/keyboards/helix/config.h @@ -48,17 +48,4 @@ along with this program. If not, see . #define DISABLE_LEADER #endif // USE_Link_Time_Optimization -#if defined(LED_ANIMATIONS) || defined(RGBLIGHT_ANIMATIONS) - #undef RGBLIGHT_ANIMATIONS - #define RGBLIGHT_EFFECT_BREATHING - #define RGBLIGHT_EFFECT_RAINBOW_MOOD - #define RGBLIGHT_EFFECT_RAINBOW_SWIRL - #define RGBLIGHT_EFFECT_SNAKE - #define RGBLIGHT_EFFECT_KNIGHT - #define RGBLIGHT_EFFECT_CHRISTMAS - #define RGBLIGHT_EFFECT_STATIC_GRADIENT - #define RGBLIGHT_EFFECT_RGB_TEST - #define RGBLIGHT_EFFECT_ALTERNATING -#endif - #endif /* CONFIG_H */ diff --git a/keyboards/helix/rev2/keymaps/five_rows/config.h b/keyboards/helix/rev2/keymaps/five_rows/config.h index 8372194604b4..538859bc3c5d 100644 --- a/keyboards/helix/rev2/keymaps/five_rows/config.h +++ b/keyboards/helix/rev2/keymaps/five_rows/config.h @@ -21,12 +21,27 @@ along with this program. If not, see . #ifndef CONFIG_USER_H #define CONFIG_USER_H -// if you need more program area, try uncomment follow line -//#include "serial_config_simpleapi.h" - #undef TAPPING_TERM -#define TAPPING_TERM 140 +#define TAPPING_TERM 300 +#define PERMISSIVE_HOLD +/* when TAPPING_TERM >= 500 same effect PERMISSIVE_HOLD. + see tmk_core/common/action_tapping.c */ // place overrides here +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + //#define RGBLIGHT_EFFECT_SNAKE + //#define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif + #endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/rev2/keymaps/five_rows/keymap.c b/keyboards/helix/rev2/keymaps/five_rows/keymap.c index 548caf822088..983bbe93786a 100644 --- a/keyboards/helix/rev2/keymaps/five_rows/keymap.c +++ b/keyboards/helix/rev2/keymaps/five_rows/keymap.c @@ -10,6 +10,9 @@ #ifdef SSD1306OLED #include "ssd1306.h" #endif +#ifdef CONSOLE_ENABLE + #include +#endif extern keymap_config_t keymap_config; @@ -28,6 +31,7 @@ enum layer_number { _QWERTY = 0, _COLEMAK, _DVORAK, + _EUCALYN, _KEYPAD, _AUX, _KAUX, @@ -41,6 +45,7 @@ enum custom_keycodes { QWERTY = SAFE_RANGE, COLEMAK, DVORAK, + EUCALYN, KEYPAD, EISU, KANA, @@ -72,7 +77,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| * | Shift| Z | X | C | V | B | ` | ' | N | M | , | . | / | Shift| * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Lower | Lower| Caps | GUI | Alt | Space| BS | Enter| Space| Alt | GUI | Menu |Lower |Lower | + * |Lower | Lower| Caps | Alt | GUI | Space| BS | Enter| Space| GUI | Alt | Menu |Lower |Lower | * `-------------------------------------------------------------------------------------------------' */ [_QWERTY] = LAYOUT( \ @@ -94,7 +99,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| * | Shift| Z | X | C | V | B | ` | ' | K | M | , | . | / | Shift| * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Lower | Lower| Caps | GUI | Alt | Space| BS | Enter| Space| Alt | GUI | Menu |Lower |Lower | + * |Lower | Lower| Caps | Alt | GUI | Space| BS | Enter| Space| GUI | Alt | Menu |Lower |Lower | * `-------------------------------------------------------------------------------------------------' */ [_COLEMAK] = LAYOUT( \ @@ -116,7 +121,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| * | Shift| ; | Q | J | K | X | ` | / | B | M | W | V | Z | Shift| * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| - * |Lower | Lower| Caps | GUI | Alt | Space| BS | Enter| Space| Alt | GUI | Menu |Lower |Lower | + * |Lower | Lower| Caps | Alt | GUI | Space| BS | Enter| Space| GUI | Alt | Menu |Lower |Lower | * `-------------------------------------------------------------------------------------------------' */ [_DVORAK] = LAYOUT( \ @@ -128,6 +133,28 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LT(_RAISE,KC_ENT), KC_SPC, KC_RGUI, KC_RALT, KC_APP,MO(_LOWER),MO(_LOWER) \ ), + /* Eucalyn (http://eucalyn.hatenadiary.jp/entry/about-eucalyn-layout) + * ,-----------------------------------------. ,-----------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | Q | W | , | . | ; | | M | R | D | Y | P | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | O | E | I | U | | G | T | K | S | N | Ctrl | + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * | Shift| Z | X | C | V | F | ` | ' | B | H | J | L | / | Shift| + * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| + * |Lower | Lower| Caps | Alt | GUI | Space| BS | Enter| Space| GUI | Alt | Menu |Lower |Lower | + * `-------------------------------------------------------------------------------------------------' + */ + [_EUCALYN] = LAYOUT( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_COMM, KC_DOT, KC_SCLN, KC_M, KC_R, KC_D, KC_Y, KC_P, KC_BSLS, \ + KC_LCTL, KC_A, KC_O, KC_E, KC_I, KC_U, KC_G, KC_T, KC_K, KC_S, KC_N, KC_RCTL, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_F, KC_GRV, KC_QUOT, KC_B, KC_H, KC_J, KC_L, KC_SLSH, KC_RSFT, \ + MO(_LOWER),MO(_LOWER), KC_CAPS, KC_LALT, KC_LGUI, KC_SPC, LT(_RAISE,KC_BSPC), \ + LT(_RAISE,KC_ENT), KC_SPC, KC_RGUI, KC_RALT, KC_APP,MO(_LOWER),MO(_LOWER) \ + ), + /* Keypad * ,-----------------------------------------. ,-----------------------------------------. * | Tab | / | * | Del | F1 | F6 | | F1 | F6 | Del | Tab | / | * | @@ -239,7 +266,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Adjust (Lower + Raise) * ,-----------------------------------------. ,-----------------------------------------. - * | | |Keypad|Dvorak|Colemk|Qwerty| |Qwerty|Colemk|Dvorak|Keypad| | | + * | |Keypad|Dvorak|Colemk|Euclyn|Qwerty| |Qwerty|Euclyn|Colemk|Dvorak|Keypad| | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | | Reset|RGBRST|RGB ON|Aud on| Win | | Win |Aud on|RGB ON|RGBRST| | | * |------+------+------+------+------+------| |------+------+------+------+------+------| @@ -251,7 +278,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------------------------------------------------------------------------------------------------' */ [_ADJUST] = LAYOUT( \ - XXXXXXX, XXXXXXX, KEYPAD, DVORAK, COLEMAK, QWERTY, QWERTY, COLEMAK, DVORAK, KEYPAD, XXXXXXX, XXXXXXX, \ + XXXXXXX, KEYPAD, DVORAK, COLEMAK, EUCALYN, QWERTY, QWERTY, EUCALYN, COLEMAK, DVORAK, KEYPAD, XXXXXXX, \ XXXXXXX, RESET, RGBRST, RGB_TOG, AU_ON, AG_SWAP, AG_SWAP, AU_ON, RGB_TOG, RGBRST, XXXXXXX, XXXXXXX, \ RGB_HUI, RGB_SAI, RGB_VAI,RGB_SMOD, AU_OFF, AG_NORM, AG_NORM, AU_OFF,RGB_SMOD, RGB_VAI, RGB_SAI, RGB_HUI, \ RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, RGB_VAD, RGB_SAD, RGB_HUD, \ @@ -304,23 +331,25 @@ uint32_t default_layer_state_set_kb(uint32_t state) { current_default_layer = state - 1; // 1<<_DVORAK - 2 == 4 - 2 == _DVORAK (=2) if ( current_default_layer == 3 ) current_default_layer -= 1; - // 1<<_KEYPAD - 5 == 8 - 5 == _KEYPAD (=3) + // 1<<_EUCALYN - 5 == 8 - 5 == _EUCALYN (=3) if ( current_default_layer == 7 ) current_default_layer -= 4; + // 1<<_KEYPAD - 12 == 16 - 12 == _KEYPAD (=4) + if ( current_default_layer == 15 ) current_default_layer -= 11; return state; } void update_base_layer(int base) { if( current_default_layer != base ) { - eeconfig_update_default_layer(1UL<event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_dvorak); + #endif + update_base_layer(_EUCALYN); } return false; break; @@ -358,7 +396,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #ifdef AUDIO_ENABLE PLAY_SONG(tone_dvorak); #endif - update_base_layer(_KEYPAD); + update_base_layer(_KEYPAD); } return false; break; @@ -468,10 +506,10 @@ static void render_logo(struct CharacterMatrix *matrix) { char buf[30]; if(rgblight_config.enable) { snprintf(buf, sizeof(buf), " LED %2d: %d,%d,%d ", - rgblight_config.mode, - rgblight_config.hue/RGBLIGHT_HUE_STEP, - rgblight_config.sat/RGBLIGHT_SAT_STEP, - rgblight_config.val/RGBLIGHT_VAL_STEP); + rgblight_config.mode, + rgblight_config.hue/RGBLIGHT_HUE_STEP, + rgblight_config.sat/RGBLIGHT_SAT_STEP, + rgblight_config.val/RGBLIGHT_VAL_STEP); matrix_write(matrix, buf); } #endif @@ -481,6 +519,7 @@ static void render_logo(struct CharacterMatrix *matrix) { static const char Qwerty_name[] PROGMEM = " Qwerty"; static const char Colemak_name[] PROGMEM = " Colemak"; static const char Dvorak_name[] PROGMEM = " Dvorak"; +static const char Eucalyn_name[] PROGMEM = " Eucalyn"; static const char Keypad_name[] PROGMEM = " Keypad"; static const char AUX_name[] PROGMEM = ":AUX"; @@ -494,6 +533,7 @@ static const char *layer_names[] = { [_QWERTY] = Qwerty_name, [_COLEMAK] = Colemak_name, [_DVORAK] = Dvorak_name, + [_EUCALYN]= Eucalyn_name, [_KEYPAD] = Keypad_name, [_AUX] = AUX_name, [_KAUX] = KAUX_name, @@ -526,18 +566,18 @@ void render_status(struct CharacterMatrix *matrix) { lstate && name_num < sizeof(layer_names)/sizeof(char *); lstate >>=1, name_num++ ) { if( (lstate & 1) != 0 ) { - if( layer_names[name_num] ) { - matrix_write_P(matrix, layer_names[name_num]); - } + if( layer_names[name_num] ) { + matrix_write_P(matrix, layer_names[name_num]); + } } } // Host Keyboard LED Status char led[40]; snprintf(led, sizeof(led), "\n%s %s %s", - (host_keyboard_leds() & (1<. // If you need more program area, try select and reduce rgblight modes to use. // Selection of RGBLIGHT MODE to use. -#undef RGBLIGHT_EFFECT_BREATHING -#undef RGBLIGHT_EFFECT_RAINBOW_MOOD -#undef RGBLIGHT_EFFECT_RAINBOW_SWIRL -#undef RGBLIGHT_EFFECT_SNAKE -#undef RGBLIGHT_EFFECT_KNIGHT -#undef RGBLIGHT_EFFECT_CHRISTMAS -#undef RGBLIGHT_EFFECT_STATIC_GRADIENT -//#undef RGBLIGHT_EFFECT_RGB_TEST // led_test keymap need only this. -#undef RGBLIGHT_EFFECT_ALTERNATING +#if defined(LED_ANIMATIONS) + //#define RGBLIGHT_EFFECT_BREATHING + //#define RGBLIGHT_EFFECT_RAINBOW_MOOD + //#define RGBLIGHT_EFFECT_RAINBOW_SWIRL + //#define RGBLIGHT_EFFECT_SNAKE + //#define RGBLIGHT_EFFECT_KNIGHT + //#define RGBLIGHT_EFFECT_CHRISTMAS + //#define RGBLIGHT_EFFECT_STATIC_GRADIENT + #define RGBLIGHT_EFFECT_RGB_TEST // led_test keymap need only this. + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif #endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/rev2/keymaps/led_test/rules.mk b/keyboards/helix/rev2/keymaps/led_test/rules.mk index c7ee75c36bae..f599cd4f387c 100644 --- a/keyboards/helix/rev2/keymaps/led_test/rules.mk +++ b/keyboards/helix/rev2/keymaps/led_test/rules.mk @@ -100,7 +100,7 @@ ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) endif ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS endif ifeq ($(strip $(OLED_ENABLE)), yes) From 2c1402aa3208d450a7724790b0eb9f2d352a1d9d Mon Sep 17 00:00:00 2001 From: Jereme Corrado Date: Fri, 5 Oct 2018 17:52:46 -0400 Subject: [PATCH 140/505] Keymap: Added Planck keymap: jcorrado (#4083) --- keyboards/planck/keymaps/jcorrado/keymap.c | 115 ++++++++++++++++++++ keyboards/planck/keymaps/jcorrado/readme.md | 9 ++ 2 files changed, 124 insertions(+) create mode 100644 keyboards/planck/keymaps/jcorrado/keymap.c create mode 100644 keyboards/planck/keymaps/jcorrado/readme.md diff --git a/keyboards/planck/keymaps/jcorrado/keymap.c b/keyboards/planck/keymaps/jcorrado/keymap.c new file mode 100644 index 000000000000..35ca76d5176e --- /dev/null +++ b/keyboards/planck/keymaps/jcorrado/keymap.c @@ -0,0 +1,115 @@ +/* Copyright 2015-2017 Jack Humbert + * Copyright 2018 Jereme Corrado + * + * 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 QMK_KEYBOARD_H + +enum { + _QWERTY = 0, + _NUM, + _SYM_L, + _SYM_R +}; + +#define LMOD_0 LT(_SYM_L, KC_TAB) /* Tab, hold: Sym layer */ +#define LMOD_1 LT(_NUM, KC_ESC) /* Esc, hold: Num layer */ +#define LMOD_2 LSFT_T(KC_CAPS) /* Caps Lock, hold: Left Shift */ + +#define RMOD_0 LT(_SYM_R, KC_BSPC) /* Backspace, hold: Sym layer */ +#define RMOD_1 LT(_NUM, KC_QUOT) /* Quote, hold: Nu layer */ +#define RMOD_2 RSFT_T(KC_ENT) /* Enter, hold: Right Shift */ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | Tab/ | Q | W | E | R | T | Y | U | I | O | P | BacSp/ | + * | Sym | | | | | | | | | | | Sym | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | Esc/ | A | S | D | F | G | H | J | K | L | : | " | + * | Num | | | | | | | | | | ; | '/Num | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | CapLk/ | Z | X | C | V | B | N | M | < | > | ? | Shift/ | + * | Shift | | | | | | | | , | . | / | Enter | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | Toggle | ~ | {pipe} | Alt | Ctrl | Space | Space | Ctrl | Alt | { | } | | + * | Num | ` | \ | | | | | | | [ | ] | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + */ + +[_QWERTY] = LAYOUT_planck_grid( + LMOD_0, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, RMOD_0, + LMOD_1, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, RMOD_1, + LMOD_2, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RMOD_2, + _______, KC_GRV, KC_BSLS, KC_LALT, KC_LCTL, KC_SPC, KC_SPC, KC_RCTL, KC_RALT, KC_LBRC, KC_RBRC, _______ +), + + +/* + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | = | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | + * | | | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | Left | Down | Up | Right | | | + * | | | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | Home | PgDown | PgUp | End | | | + * | | | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | | | | | | | + * | | | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + */ + +[_NUM] = LAYOUT_planck_grid( + KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, + _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + + +/* + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | + | ! | @ | # | $ | % | ^ | & | * | ( | ) | _ | + * | | | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | | | | | | + * | | | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | | | + * | | | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | | | | | | | + * | | | | | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + */ + +[_SYM_L] = LAYOUT_planck_grid( + _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_UNDS, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, _______, _______, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +[_SYM_R] = LAYOUT_planck_grid( + KC_PLUS, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, _______, _______, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + +}; diff --git a/keyboards/planck/keymaps/jcorrado/readme.md b/keyboards/planck/keymaps/jcorrado/readme.md new file mode 100644 index 000000000000..3a600dea1688 --- /dev/null +++ b/keyboards/planck/keymaps/jcorrado/readme.md @@ -0,0 +1,9 @@ +# jcorrado Planck keymap + +A keymap for the Planck modeled after the way I remap my Kinesis +Advantage keyboards. + +The layout is designed to minimize awkward contortions: all modifier and +layer-activation combinations can be performed with either hand's thumb +and pinky. This leaves the other hand free to complete commands +comfortably. From 60f5ce8890453751a00ab63b150dded25c39db42 Mon Sep 17 00:00:00 2001 From: Wojciech Siewierski Date: Sat, 6 Oct 2018 16:49:04 +0200 Subject: [PATCH 141/505] Keymap: Update keyboards/planck/keymaps/vifon (#4084) * Implement macro recording * Remove off-by-one from the macro recorder * Holding both modifiers enables the third layer * Exit the 3rd layer into one of the secondary ones * Regular Enter and Escape on the secondary layers Useful for the macro recording because the "tap" modifiers always act as modifiers there. * Remove the buffer overflow from the macro recorder When the limit is reached, the backlight blinks with each keypress. * More robust macro recording implementation * Macro record refactoring and improvement - support for a second macro (saved using the end of the macro buffer) - improved reliability * Add comments to my macros * Macro recording: remove a redundant code * Separate the raise+lower layer from the special layer * Add back/forward keys * Bind mouse movement * More readable KC_TRNS * Improve the mouse bindings * Use a convenience macro instead of the low-level ACTION macro * Add mouse to the Dual layer; make most of the layer transparent * New "mouse" layer; clean up the "special" layer * CapsLock, NumLock and ScrollLock on the Special layer * Enable my fix for the stuck modifiers and adjust the dual layer to it * Fix the macro recording after enabling the stuck mods fix * Click with Lower/Raise+Space * Reduce the memory used by the macro recording Previously the auxiliary layers were numbered 30 and 31 which resulted in all 32 array elements being allocated regardless of the actually used layers in the user code. * Optimize source_layers_cache for the cache memory Swapping the array indices should increase the locality of the memory access. * Remove the mouse layer * Use update_tri_layer to simplify the code * Add some custom per-keymap build options * Add ShiftLock * Secure the reset button * Add numeric layer * Remove explicit layer keys on LW and RS layers * Replace Alt+left/right with Back/Forward keys * Sleep/delay key (for macro recording) * App/menu key * Fix stuff after merging to master * Local per-keymap config.h; minor cleanup * Remove the old macro_record.h Replaced with dynamic_macro.h * Adjust my keymap to the current API * Pure Pro Gaming layer Accessible by double tapping the Pure Pro layer. It features switched Lower and Raise layers, for one-handed access to numbers. * Pure Pro Gaming layer: no Mod4, persistent number layer under RShift * Pure Pro Gaming layer activated with long press, not double press * Reduce the size of the vifon keymap See: issue #930 * Increase the dynamic macro buffer The default was actually decreased. The actual used value didn't change. * Add the context menu key * No more strange ideas in the gaming layer * Reduce the firmware size by disabling API_SYSEX_ENABLE * Make slash available on the PP layer (replaces the RESET key) * Add a generic "hold this key" macro * Add a missing undef * Turn LGUI in the gaming layer into LW instead of disabling it It's not as disruptive as LGUI and it makes the LW/RS order kind of more consistent (LW on the left, RS on the right). * Refactor the Pure Pro Gaming layer * Try out the 1st party qmk KC_LOCK (vs my own KM_HOLD) * Alternative way to switch keyboard layouts with the left hand * Add dot & slash to the Pure Pro layer (but not to the Gaming layer) * Now that there is a second KM_LW, we can simplify the layout a bit It was confusing to have the modifiers completely swapped. Just moving them is much more natural. * Disable the console now that qmk got bigger * Update the keymap for the modern qmk standards --- keyboards/planck/keymaps/vifon/keymap.c | 179 ++++++++++++++---------- keyboards/planck/keymaps/vifon/rules.mk | 2 + 2 files changed, 105 insertions(+), 76 deletions(-) diff --git a/keyboards/planck/keymaps/vifon/keymap.c b/keyboards/planck/keymaps/vifon/keymap.c index 0fa8d9066ff1..6398accc2150 100644 --- a/keyboards/planck/keymaps/vifon/keymap.c +++ b/keyboards/planck/keymaps/vifon/keymap.c @@ -1,11 +1,5 @@ -#pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example" -#include "planck.h" -#ifdef BACKLIGHT_ENABLE -# include "backlight.h" -#endif -#include "timer.h" -#include +#include QMK_KEYBOARD_H // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. @@ -27,90 +21,98 @@ enum planck_keycodes { KM_LW = SAFE_RANGE, KM_RS, KM_SHLK, /* ShiftLock */ + KM_HOLD, /* Any-key Lock */ KM_RST, /* Reset */ KM_NUM, /* Numeric layer */ KM_SLP, /* Sleep 250 ms */ - KM_PPLR, /* Pure Pro layer */ + KM_PP_GAME, /* Pure Pro Gaming layer */ + KM_PP_HOLD, /* Pure Pro / PP Gaming layer */ DYNAMIC_MACRO_RANGE, }; #include "dynamic_macro.h" -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[_QW] = { /* Qwerty */ - {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC}, - {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}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_FN0 }, - {KC_LCTL, MO(_DYN),KC_LGUI, KC_LALT, KM_LW, KC_SPC, KC_SPC, KM_RS, KC_RALT, KC_DOWN, KC_UP, KC_RCTL} -}, -[_CM] = { /* Colemak */ - {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC}, - {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}, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_FN0 }, - {KC_LCTL, MO(_DYN),KC_LGUI, KC_LALT, KM_LW, KC_SPC, KC_SPC, KM_RS, KC_RALT, KC_DOWN, KC_UP, KC_RCTL} -}, -[_PP] = { /* Pure Pro */ - {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_ENT }, - {KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_RSFT, KC_UP, KC_RCTL}, - {KC_LCTL, MO(_DYN),KC_LGUI, KC_LALT, KM_LW, KC_SPC, KC_SPC, KM_RS, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT} -}, -[_PPG] = { /* Pure Pro: Gaming */ - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, XXXXXXX, _______, KM_RS , _______, _______, KM_LW , _______, _______, _______, _______}, -}, -[_NM] = { /* Numeric */ - {KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {KC_LSFT, _______, _______, _______, _______, _______, _______, _______, KC_COMM, KC_DOT, _______, KC_FN0 }, - {_______, _______, _______, _______, _______, KC_SPC, KC_SPC, _______, _______, _______, _______, _______} -}, -[_LW]= { /* LOWER */ - {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC}, - {KC_ESC, LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), LGUI(KC_4), LGUI(KC_5), KM_NUM, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE}, - {_______, LGUI(KC_6), LGUI(KC_7), LGUI(KC_8), LGUI(KC_9), LGUI(KC_0), KM_SLP, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_ENT }, - {_______, BL_TOGG, _______, _______, _______, KC_BTN1, KC_BTN1, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT} -}, -[_RS]= { /* RAISE */ - {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL }, - {KC_ESC, 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, DF(_QW), DF(_CM), KM_PPLR, KM_RST, KC_ENT }, - {_______, BL_STEP, _______, _______, _______, KC_BTN2, KC_BTN2, _______, KC_MPLY, KC_VOLD, KC_VOLU, _______} -}, -[_DL]= { /* DUAL */ - {_______, _______, KC_WH_U, KC_MS_U, KC_WH_D, _______, _______, KC_APP, KC_INS, _______, KC_PSCR, _______}, - {_______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_ACL0, KC_ACL2}, - {_______, _______, KC_BTN2, KC_BTN3, KC_BTN1, KC_WWW_BACK, KC_WWW_FORWARD, KC_MUTE, _______, _______, _______, _______}, - {_______, _______, KC_LGUI, KC_LALT, _______, _______, _______, _______, _______, _______, _______, _______} -}, -[_DYN]= { /* special */ - {_______, DYN_REC_START1, DYN_MACRO_PLAY1, _______, _______, _______, _______, KC_APP, KC_INS, _______, KC_PSCR, KC_PAUS}, - {_______, DYN_REC_START2, DYN_MACRO_PLAY2, _______, _______, _______, _______, _______, _______, KC_CAPS, KC_SLCK, KC_NLCK}, - {KM_SHLK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -}, -}; - -#undef _______ - -const uint16_t PROGMEM fn_actions[] = { - ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT), + [_QW] = LAYOUT_planck_mit( /* 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, + 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, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MT(MOD_RSFT, KC_ENT), + KC_LCTL, MO(_DYN), KC_LGUI, KC_LALT, KM_LW, KC_SPC, KM_RS, KC_RALT, KC_DOWN, KC_UP, KC_RCTL + ), + [_CM] = LAYOUT_planck_mit( /* 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, + 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, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, MT(MOD_RSFT, KC_ENT), + KC_LCTL, MO(_DYN), KC_LGUI, KC_LALT, KM_LW, KC_SPC, KM_RS, KC_RALT, KC_DOWN, KC_UP, KC_RCTL + ), + [_PP] = LAYOUT_planck_mit( /* Pure Pro */ + 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_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, MT(MOD_RSFT, KC_DOT), KC_UP, MT(MOD_RCTL, KC_SLSH), + KC_LCTL, MO(_DYN), KC_LGUI, KC_LALT, KM_LW, KC_SPC, KM_RS, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT + ), + [_PPG] = LAYOUT_planck_mit( /* Pure Pro: Gaming */ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RSFT, _______, KC_RCTL, + _______, _______, KM_LW, _______, KM_RS, _______, KM_RS , _______, _______, _______, _______ + ), + [_NM] = LAYOUT_planck_mit( /* Numeric */ + KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_LSFT, _______, _______, _______, _______, _______, _______, _______, KC_COMM, KC_DOT, _______, MT(MOD_RSFT, KC_ENT), + _______, _______, _______, _______, _______, KC_SPC, _______, _______, _______, _______, _______ + ), + [_LW] = LAYOUT_planck_mit( /* 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_ESC, LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), LGUI(KC_4), LGUI(KC_5), KM_NUM, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + _______, LGUI(KC_6), LGUI(KC_7), LGUI(KC_8), LGUI(KC_9), LGUI(KC_0), KM_SLP, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_ENT, + _______, BL_TOGG, _______, _______, _______, KC_BTN1, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + ), + [_RS] = LAYOUT_planck_mit( /* RAISE */ + 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_ESC, 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, DF(_QW), DF(_CM), KM_PP_HOLD, KM_RST, KC_ENT, + _______, BL_STEP, _______, _______, _______, KC_BTN2, _______, KC_MPLY, KC_VOLD, KC_VOLU, _______ + ), + [_DL] = LAYOUT_planck_mit( /* DUAL */ + _______, _______, KC_WH_U, KC_MS_U, KC_WH_D, _______, _______, KC_APP, KC_INS, _______, KC_PSCR, _______, + _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_ACL0, KC_ACL2, + _______, _______, KC_BTN2, KC_BTN3, KC_BTN1, KC_WWW_BACK, KC_WWW_FORWARD, KC_MUTE, _______, _______, _______, _______, + _______, _______, KC_LGUI, KC_LALT, _______, _______, _______, _______, _______, _______, _______ + ), + [_DYN] = LAYOUT_planck_mit( /* special */ + KM_HOLD, DYN_REC_START1, DYN_MACRO_PLAY1, _______, _______, _______, _______, KC_APP, KC_INS, _______, KC_PSCR, KC_PAUS, + KC_LOCK, DYN_REC_START2, DYN_MACRO_PLAY2, _______, _______, _______, _______, _______, _______, KC_CAPS, KC_SLCK, KC_NLCK, + KM_SHLK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, KM_PP_GAME, DF(_QW), DF(_PP), _______, _______, _______, _______ + ), }; +/* It's a pseudo-layer composed of two real layers, we need a function for this. */ +void enable_gaming_layer(void) { + default_layer_set((1UL << _PP) | (1UL << _PPG)); +#ifdef BACKLIGHT_ENABLE + backlight_toggle(); + _delay_ms(100); + backlight_toggle(); +#endif +} bool process_record_user(uint16_t keycode, keyrecord_t *record) { static uint16_t key_timer; + static uint8_t ignore_up_events = 0; uint16_t macro_kc = (keycode == MO(_DYN) ? DYN_REC_STOP : keycode); if (!process_record_dynamic_macro(macro_kc, record)) { return false; } + if (ignore_up_events > 0 && keycode != MO(_DYN) && keycode != KM_HOLD && !record->event.pressed) { + ignore_up_events -= 1; + return false; + } + switch (keycode) { case KM_LW: if (record->event.pressed) { @@ -133,7 +135,30 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case KM_SHLK: register_code(KC_LSFT); break; + case KM_HOLD: + if (!record->event.pressed) { + ignore_up_events += 1; + } + break; case KM_RST: + { + /* Make slash available on the PP layer. */ + if ((1UL << _PP) & default_layer_state) { + int32_t old_default_layer_state = default_layer_state; + int32_t old_layer_state = layer_state; + + layer_state = 0; + default_layer_state = (1UL << _QW); + + process_record(record); + + layer_state = old_layer_state; + default_layer_state = old_default_layer_state; + + return false; + } + } + if (record->event.pressed) { key_timer = timer_read(); } else { @@ -146,15 +171,17 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } } break; - case KM_PPLR: + case KM_PP_GAME: + if (!record->event.pressed) { + enable_gaming_layer(); + } + break; + case KM_PP_HOLD: if (record->event.pressed) { key_timer = timer_read(); } else { if (timer_elapsed(key_timer) >= 250) { - default_layer_set((1UL << _PP) | (1UL << _PPG)); - backlight_toggle(); - _delay_ms(100); - backlight_toggle(); + enable_gaming_layer(); } else { default_layer_set(1UL << _PP); } diff --git a/keyboards/planck/keymaps/vifon/rules.mk b/keyboards/planck/keymaps/vifon/rules.mk index 15a7b736fd02..da83096d6b41 100644 --- a/keyboards/planck/keymaps/vifon/rules.mk +++ b/keyboards/planck/keymaps/vifon/rules.mk @@ -16,6 +16,8 @@ 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. +API_SYSEX_ENABLE = no # https://www.reddit.com/r/olkb/comments/5swhij/_/ddie6zq/ +KEY_LOCK_ENABLE = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend From cfa9f6ba6da7e6d3435610d6d3b4b7971d3dd547 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 4 Oct 2018 10:17:41 -0700 Subject: [PATCH 142/505] Add non-US Hash and Backslash to AutoShift handling --- quantum/process_keycode/process_auto_shift.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/quantum/process_keycode/process_auto_shift.c b/quantum/process_keycode/process_auto_shift.c index 01d99445b00b..0d0930ee6775 100644 --- a/quantum/process_keycode/process_auto_shift.c +++ b/quantum/process_keycode/process_auto_shift.c @@ -173,6 +173,8 @@ bool process_auto_shift(uint16_t keycode, keyrecord_t *record) { case KC_DOT: case KC_SLSH: case KC_GRAVE: + case KC_NONUS_BSLASH: + case KC_NONUS_HASH: #endif autoshift_flush(); From 7458ac94897afa7f67d98bc40aa1e090c11c235d Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 6 Oct 2018 17:43:37 -0700 Subject: [PATCH 143/505] Update Contrib doc (#4068) * Add link for style * ignore java * Add example and update link? * Minor fixes * Change 1TBS text * comments --- docs/contributing.md | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/docs/contributing.md b/docs/contributing.md index 7ed7cd06a56c..bcedcaf974e5 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -57,14 +57,14 @@ Never made an open source contribution before? Wondering how contributions work Most of our style is pretty easy to pick up on, but right now it's not entirely consistent. You should match the style of the code surrounding your change, but if that code is inconsistent or unclear use the following guidelines: * We indent using two spaces (soft tabs) -* We use One True Brace Style +* We use a modified One True Brace Style * Opening Brace: At the end of the same line as the statement that opens the block * Closing Brace: Lined up with the first character of the statement that opens the block * Else If: Place the closing brace at the beginning of the line and the next opening brace at the end of the same line. * Optional Braces: Always include optional braces. * Good: if (condition) { return false; } * Bad: if (condition) return false; -* We use C style comments: `/* */` +* We encourage use of C style comments: `/* */` * Think of them as a story describing the feature * Use them liberally to explain why particular decisions were made. * Do not write obvious comments @@ -72,6 +72,25 @@ Most of our style is pretty easy to pick up on, but right now it's not entirely * In general we don't wrap lines, they can be as long as needed. If you do choose to wrap lines please do not wrap any wider than 76 columns. * We use `#pragma once` at the start of header files rather than old-style include guards (`#ifndef THIS_FILE_H`, `#define THIS_FILE_H`, ..., `#endif`) +Here is an example for easy reference: + +```c +/* Enums for foo */ +enum foo_state { + FOO_BAR, + FOO_BAZ, +}; + +/* Returns a value */ +int foo(void) { + if (some_condition) { + return FOO_BAR; + } else { + return -1; + } +} +``` + # General Guidelines We have a few different types of changes in QMK, each requiring a different level of rigor. We'd like you to keep the following guidelines in mind no matter what type of change you're making. From f86c0c2643a665dd09bc7a9a2beaaf37f97b9b61 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 6 Oct 2018 17:44:33 -0700 Subject: [PATCH 144/505] Update and clarify Unicode documentation (#4065) * Update and clarify Unicode documentation * Fixed UCIS info based on feedback from algernon * Further clarifications and cleanup * Formatting * Add an example for unicode map * fix AutoHotKey title --- docs/feature_unicode.md | 107 +++++++++++++++++++++++++++++++++------- 1 file changed, 89 insertions(+), 18 deletions(-) diff --git a/docs/feature_unicode.md b/docs/feature_unicode.md index 278b93ad7996..f13eed05b802 100644 --- a/docs/feature_unicode.md +++ b/docs/feature_unicode.md @@ -4,45 +4,108 @@ There are three Unicode keymap definition method available in QMK: ## UNICODE_ENABLE -Supports Unicode input up to 0xFFFF. The keycode function is `UC(n)` in -keymap file, where *n* is a 4 digit hexadecimal. +Supports Unicode input up to 0xFFFF. The keycode function is `UC(n)` in keymap file, where *n* is a 4 digit hexadecimal. ## UNICODEMAP_ENABLE -Supports Unicode up to 0xFFFFFFFF. You need to maintain a separate mapping -table `const uint32_t PROGMEM unicode_map[] = {...}` in your keymap file. -The keycode function is `X(n)` where *n* is the array index of the mapping -table. +Supports Unicode up to 0xFFFFFFFF. You need to maintain a separate mapping table `const uint32_t PROGMEM unicode_map[] = {...}` in your keymap file. The keycode function is `X(n)` where *n* is the array index of the mapping table. + +And you may want to have an enum to make reference easier. So you'd want to add something like this to your keymap: + +```c +enum unicode_name { + BANG, // ‽ + IRONY, // ⸮ + SNEK // snke 🐍 +}; + +const uint32_t PROGMEM unicode_map[] = { + [BANG] = 0x0203D, // ‽ + [IRONY] = 0x02E2E, // ⸮ + [SNEK] = 0x1F40D // snke 🐍 +}: +``` + +Make sure that the order for both matches. ## UCIS_ENABLE -TBD +Supports Unicode up to 0xFFFFFFFF. As with `UNICODE_MAP`, you may want to main a mapping table in your keymap file. However, there is no keycodes for this feature, you will have to add a keycode or function to call `qk_ucis_start()`. Once you've run that, you can just type the text for your unicode, and then hit space or enter to complete it, or ESC to cancel it. And if it matches an entry in your table, it will automatically "backspace" the trigger word (from your table) and then will input the unicode sequence. + +For instance, you would need to have a table like this in your keymap: + +```c +const qk_ucis_symbol_t ucis_symbol_table[] = UCIS_TABLE +( + UCIS_SYM("poop", 0x1f4a9), + UCIS_SYM("rofl", 0x1f923), + UCIS_SYM("kiss", 0x1f619) +); +``` + +You run the function, and then type "rofl" and hit enter, it should backspace remove "rofl" and input the `0x1f923` unicode. + +### Customization + +There are several functions that you can add to your keymap to customize the functionality of this feature. + +* `void qk_ucis_start_user(void)` - This runs when you run the "start" function, and can be used to provide feedback. By default, it types out a keyboard emoji. +* `void qk_ucis_success(uint8_t symbol_index)` - This runs when the unicode input has matched something, and has completed. Default doesn't do anything. +* `void qk_ucis_symbol_fallback (void)` - This runs if the input text doesn't match anything. The default function falls back to trying that input as a unicode code. + +The default code for these are: -Unicode input in QMK works by inputing a sequence of characters to the OS, +```c +void qk_ucis_start_user(void) { // outputs keyboard emoji + unicode_input_start(); + register_hex(0x2328); + unicode_input_finish(); +} + +void qk_ucis_success(uint8_t symbol_index) { +} + +void qk_ucis_symbol_fallback (void) { // falls back to manual unicode entry + for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) { + uint8_t code = qk_ucis_state.codes[i]; + register_code(code); + unregister_code(code); + wait_ms(UNICODE_TYPE_DELAY); + } +} +``` + +## Unicode Input methods + +Unicode input in QMK works by inputting a sequence of characters to the OS, sort of like macro. Unfortunately, each OS has different ideas on how Unicode is input. This is the current list of Unicode input method in QMK: -* UC_OSX: MacOS Unicode Hex Input support. Works only up to 0xFFFF. Disabled by default. To enable: go to System Preferences -> Keyboard -> Input Sources, and enable Unicode Hex. -* UC_OSX_RALT: Same as UC_OSX, but sends the Right Alt key for unicode input -* UC_LNX: Unicode input method under Linux. Works up to 0xFFFFF. Should work almost anywhere on ibus enabled distros. Without ibus, this works under GTK apps, but rarely anywhere else. -* UC_WIN: (not recommended) Windows built-in Unicode input. To enable: create registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad`, set its value to 1, and reboot. This method is not recommended because of reliability and compatibility issue, use WinCompose method below instead. -* UC_WINC: Windows Unicode input using WinCompose. Requires [WinCompose](https://github.com/samhocevar/wincompose). Works reliably under many (all?) variations of Windows. +* _UC_OSX_: MacOS Unicode Hex Input support. Works only up to 0xFFFF. Disabled by default. To enable: go to System Preferences -> Keyboard -> Input Sources, and enable Unicode Hex. +* _UC_OSX_RALT_: Same as UC_OSX, but sends the Right Alt key for unicode input +* _UC_LNX_: Unicode input method under Linux. Works up to 0xFFFFF. Should work almost anywhere on ibus enabled distros. Without ibus, this works under GTK apps, but rarely anywhere else. +* _UC_WIN_: (not recommended) Windows built-in Unicode input. To enable: create registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad`, set its value to 1, and reboot. This method is not recommended because of reliability and compatibility issue, use WinCompose method below instead. +* _UC_WINC_: Windows Unicode input using WinCompose. Requires [WinCompose](https://github.com/samhocevar/wincompose). Works reliably under many (all?) variations of Windows. + +At some point, you need to call `set_unicode_input_mode(x)` to set the correct unicode method. This sets the method that is used to send the unicode, and stores it in EEPROM, so you only need to call this once. -To type multiple characters for things like (ノಠ痊ಠ)ノ彡┻━┻, you can use `send_unicode_hex_string()` much like `SEND_STRING()` except you would use hex values seperated by spaces. +## `send_unicode_hex_string` + +To type multiple characters for things like (ノಠ痊ಠ)ノ彡┻━┻, you can use `send_unicode_hex_string()` much like `SEND_STRING()` except you would use hex values separate by spaces. For example, the table flip seen above would be `send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B")` There are many ways to get a hex code, but an easy one is [this site](https://r12a.github.io/app-conversion/). Just make sure to convert to hexadecimal, and that is your string. -# Additional Language Support +## Additional Language Support In `quantum/keymap_extras/`, you'll see various language files - these work the same way as the alternative layout ones do. Most are defined by their two letter country/language code followed by an underscore and a 4-letter abbreviation of its name. `FR_UGRV` which will result in a `ù` when using a software-implemented AZERTY layout. It's currently difficult to send such characters in just the firmware. -# International Characters on Windows +## International Characters on Windows -[AutoHotkey](https://autohotkey.com) allows Windows users to create custom hotkeys among others. +### AutoHotkey allows Windows users to create custom hotkeys among others. -The method does not require Unicode support in the keyboard itself but depends instead of AutoHotkey running in the background. +The method does not require Unicode support in the keyboard itself but depends instead of [AutoHotkey](https://autohotkey.com) running in the background. First you need to select a modifier combination that is not in use by any of your programs. CtrlAltWin is not used very widely and should therefore be perfect for this. @@ -57,3 +120,11 @@ In the default script of AutoHotkey you can define custom hotkeys. The hotkeys above are for the combination CtrlAltGui and CtrlAltGuiShift plus the letter a. AutoHotkey inserts the Text right of `Send, ` when this combination is pressed. + +### US International + +If you enable the US International layout on the system, it will use punctuation to accent the characters. + +For instance, typing "`a" will result in à. + +You can find details on how to enable this [here](https://support.microsoft.com/en-us/help/17424/windows-change-keyboard-layout). From 370fdb89c2b63dafcbbe7deae40189dad26a820f Mon Sep 17 00:00:00 2001 From: Brian Mock Date: Sat, 6 Oct 2018 20:55:48 -0700 Subject: [PATCH 145/505] Keymap: Adds TheVan RoadKit Gamepad Layout (#4090) * adds prototype firmware for wavebeem-gamepad * adds installer script * updates readme * updates title * adds prototype firmware for wavebeem-gamepad * adds installer script * updates readme * updates title * removes unused code * removes more code * simplify code --- .../roadkit/keymaps/wavebeem-gamepad/keymap.c | 10 ++++++ .../keymaps/wavebeem-gamepad/readme.md | 35 +++++++++++++++++++ .../roadkit/keymaps/wavebeem-gamepad/rules.mk | 17 +++++++++ 3 files changed, 62 insertions(+) create mode 100644 keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/keymap.c create mode 100644 keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/readme.md create mode 100644 keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/rules.mk diff --git a/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/keymap.c b/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/keymap.c new file mode 100644 index 000000000000..dfdded8e7b6b --- /dev/null +++ b/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/keymap.c @@ -0,0 +1,10 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ortho_4x4( + KC_TAB, KC_Q, KC_W, KC_E, + KC_ESC, KC_A, KC_S, KC_D, + KC_LSFT, KC_Z, KC_X, KC_C, + KC_F, KC_LALT, KC_LCTL, KC_SPC + ), +}; diff --git a/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/readme.md b/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/readme.md new file mode 100644 index 000000000000..7eeb07ede149 --- /dev/null +++ b/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/readme.md @@ -0,0 +1,35 @@ +![Keymap Diagram](https://i.imgur.com/hRjbhEn.png) + +# Gamepad Layout by @wavebeem + +The concept behind this layout is the left side of a computer keyboard, +optimized with essential keys for playing FPS games. It was designed for TheVan +RoadKit, but it should work for any 4x4 ortholinear keyboard. + +I play with my pinky on `Shift`, thumb on `Space`, and the rest of my fingers on +`W A S D`. I use my thumb for `Control`, `X`, and sometimes `C`. I usually use +`Z` with my ring finger. It also helps to angle my fingers more perpendicular to +the board in order to allow my thumb to more easily access the `Z X C` row. + +The number keys `1 2 3` are missing for weapon switching, but you can usually +switch with the mouse wheel or rebind those to `Z X C` or something else. + +The key `R` for reloading is missing, but I prefer to use my extra mouse buttons +for that. + +I don't really use `Alt` for games, but I kept it around for `Alt-Tab` in +Windows. + +# Keymap Text Diagram + +``` ++-------+-------+-------+-------+ +| Tab | Q | W | E | ++-------+-------+-------+-------+ +| Esc | A | S | D | ++-------+-------+-------+-------+ +| Shift | Z | X | C | ++-------+-------+-------+-------+ +| F | Alt | Ctrl | Space | ++-------+-------+-------+-------+ +``` diff --git a/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/rules.mk new file mode 100644 index 000000000000..72fd3d30ba35 --- /dev/null +++ b/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/rules.mk @@ -0,0 +1,17 @@ +# 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 From aa707c6b9e1e60592e8d7434214eb1549ce9053b Mon Sep 17 00:00:00 2001 From: Bramver Date: Sun, 7 Oct 2018 16:36:01 +0200 Subject: [PATCH 146/505] Keymap: Personal Nyquist keymap added. (#4059) * Personal Nyquist keymap added. * Responded to comments for PR. Removed unnecessary imports. Updated way of macros. Removed tick from unicode inputs. * formatting in keymap --- keyboards/nyquist/keymaps/bramver/README.md | 100 +++++++ keyboards/nyquist/keymaps/bramver/config.h | 31 +++ keyboards/nyquist/keymaps/bramver/keymap.c | 281 ++++++++++++++++++++ keyboards/nyquist/keymaps/bramver/rules.mk | 6 + 4 files changed, 418 insertions(+) create mode 100644 keyboards/nyquist/keymaps/bramver/README.md create mode 100644 keyboards/nyquist/keymaps/bramver/config.h create mode 100644 keyboards/nyquist/keymaps/bramver/keymap.c create mode 100644 keyboards/nyquist/keymaps/bramver/rules.mk diff --git a/keyboards/nyquist/keymaps/bramver/README.md b/keyboards/nyquist/keymaps/bramver/README.md new file mode 100644 index 000000000000..2768acdf7d79 --- /dev/null +++ b/keyboards/nyquist/keymaps/bramver/README.md @@ -0,0 +1,100 @@ +# Nyquist Layout - rev 02 + +Standard qwerty layout. +Limited emoji support and proper mouse settings. + +Mostly based off of my XD75 layout. + +## Keymap + +``` + +/* Base + * ,-----------------------------------------. ,-----------------------------------------. + * | GEsc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | LOW | A | S | D | F | G | | H | J | K | L | ; | " | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | Z | X | C | V | B | | N | M | , | . | / | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | EMO | Alt | GUI | SPCE |SP_LMS| |SP_RMS|SP_RMS| GUI | Alt | RAI | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + + /* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | GESC | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | \ | - | = | [ | ] | | [ | ] | - | = | \ | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | ^Z | ^X | ^C | ^V | | | Play | Vol+ | Vol- | Mute | Next | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + +/* Raise + * ,-----------------------------------------. .-----------------------------------------. + * | GESC | | | | | | | | = | / | * | - | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | F9 | F10 | F11 | F12 | | | | 7 | 8 | 9 | + | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F5 | F6 | F7 | F8 | | | | 4 | 5 | 6 | , | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | F1 | F2 | F3 | F4 | | | | 1 | 2 | 3 | . | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | 0 | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + +/* LMOUSE (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | GESC | | Home | End | PGUP | PGDN | | | | | | | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | WH_L | BTN1 | MS_U | BTN2 | WH_U | | | | | | | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | WH_R | MS_L | MS_D | MS_R | WH_D | | | | | | | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | LEFT | DOWN | UP |RIGHT | | | | | | | | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + +/* RMOUSE (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | GESC | | | | | | | PGUP | PGDN | Home | End | | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | | | | | | | WH_U | BTN1 | MS_U | BTN2 | WH_L | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | WH_D | MS_L | MS_D | MS_R | WH_R | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | | | | | | | | LEFT | DOWN | UP |RIGHT | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + +/* Emojis + * ,-----------------------------------------. ,-----------------------------------------. + * | GESC | | | | | | | RSET | | | | | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | CLAP | CUM | BNIS | BUTT | CAR | | FIRE | REDB | MONY | 100 | SOS | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | CELE | PRAY | NAIL | OK | THNK | | UNAM | HEYE | COOL | EYES | SMIR | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | TRIU | SCRM | VOMI | DTIV | EXPL | | HAIR | DANC | STRN | LEFT | RGHT | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ +``` \ No newline at end of file diff --git a/keyboards/nyquist/keymaps/bramver/config.h b/keyboards/nyquist/keymaps/bramver/config.h new file mode 100644 index 000000000000..c908386e282d --- /dev/null +++ b/keyboards/nyquist/keymaps/bramver/config.h @@ -0,0 +1,31 @@ +/* Copyright 2018 darm + * + * 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 + +#define USE_SERIAL +#define MASTER_LEFT + +#define TAPPING_TERM 200 +#define TAPPING_TOGGLE 2 + +#define MOUSEKEY_DELAY 0 +#define MOUSEKEY_INTERVAL 16 +#define MOUSEKEY_MAX_SPEED 7 +#define MOUSEKEY_TIME_TO_MAX 60 +#define MOUSEKEY_WHEEL_MAX_SPEED 8 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 40 +#define MOUSEKEY_WHEEL_DELAY 0 diff --git a/keyboards/nyquist/keymaps/bramver/keymap.c b/keyboards/nyquist/keymaps/bramver/keymap.c new file mode 100644 index 000000000000..c5eac853ccf2 --- /dev/null +++ b/keyboards/nyquist/keymaps/bramver/keymap.c @@ -0,0 +1,281 @@ +/* Copyright 2018 darm + * + * 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 QMK_KEYBOARD_H + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +// 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 _BASE 0 +#define _LOWER 1 +#define _RAISE 2 +#define _LMOUSE 3 +#define _RMOUSE 4 +#define _EMOJI 5 + +enum emoji_map { + UNAM, // unamused 😒 + HEYE, // smiling face with heart shaped eyes 😍 + OK, // ok hand sign 👌 + SMIR, // smirk 😏 + PRAY, // pray 🙏 + CELE, // celebration 🙌 + COOL, // smile with sunglasses 😎 + EYES, // eyes + THNK, // BIG THONK + NAIL, // Nailcare + SOS, // Vuile sos + REDB, // Red B + HNDR, // 100 + MONY, + FIRE, + CAR, + BUTT, + BNIS, + CUM, + CLAP, + TRIU, // Fart from nose + SCRM, + VOMI, + DTIV, // Detective + EXPL, // Brainsplosion + HAIR, // Haircut + DANC, // Salsa dancer + STRN, // Stronk + LEFT, // Point Left + RGHT, // Point Right +}; + +const uint32_t PROGMEM unicode_map[] = { + [UNAM] = 0x1F612, + [HEYE] = 0x1f60d, + [OK] = 0x1F44C, + [SMIR] = 0x1F60F, + [PRAY] = 0x1F64F, + [CELE] = 0x1F64C, + [COOL] = 0x1F60E, + [EYES] = 0x1F440, + [THNK] = 0x1F914, + [NAIL] = 0x1F485, + [SOS] = 0x1F198, + [REDB] = 0x1F171, + [HNDR] = 0x1F4AF, + [MONY] = 0x1F480, + [FIRE] = 0x1F525, + [CAR] = 0x1F697, + [BUTT] = 0x1F351, + [BNIS] = 0x1F346, + [CUM] = 0x1F4A6, + [CLAP] = 0x1F44F, + [TRIU] = 0x1F624, + [SCRM] = 0x1F631, + [VOMI] = 0x1F92E, + [DTIV] = 0x1F575, + [EXPL] = 0x1F92F, + [HAIR] = 0x2640, + [DANC] = 0x1F483, + [STRN] = 0x1F4AA, + [LEFT] = 0x1F448, + [RGHT] = 0x1F449, +}; + +enum custom_keycodes { + CTRL_Z = SAFE_RANGE, + CTRL_X, + CTRL_C, + CTRL_V +}; + +// Enable these functions using FUNC(n) macro. +// const uint16_t PROGMEM fn_actions[] = { //ACTION_LAYER_TAP_TOGGLE requires that number of taps be defined in *config.h* - default set to 5 +// [0] = , //Hold for momentary LMouse layer, Tap for Space, +// [1] = , //Hold for momentary RMouse layer, Tap for Space, +// [2] = , //Hold for momentary Lower +// [3] = , //Hold for momentary Raise +// [4] = , //Hold for momentary Emoji +// }; + +#define SP_LMS LT(_LMOUSE, KC_SPC) +#define SP_RMS LT(_RMOUSE, KC_SPC) +#define LOW TT(_LOWER) +#define RAI TT(_RAISE) +#define EMO TT(_EMOJI) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Base + * ,-----------------------------------------. ,-----------------------------------------. + * | GEsc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | LOW | A | S | D | F | G | | H | J | K | L | ; | " | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | Z | X | C | V | B | | N | M | , | . | / | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | EMO | Alt | GUI | SPCE |SP_LMS| |SP_RMS|SP_RMS| GUI | Alt | RAI | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + [_BASE] = LAYOUT( \ + KC_GESC , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , /**/ KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_BSPC , \ + KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , /**/ KC_Y , KC_U , KC_I , KC_O , KC_P , KC_ENT , \ + LOW , KC_A , KC_S , KC_D , KC_F , KC_G , /**/ KC_H , KC_J , KC_K , KC_L , KC_SCLN , KC_QUOT , \ + KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , /**/ KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_RSFT , \ + KC_LCTL , EMO , KC_LALT , KC_LGUI , KC_SPC , SP_LMS , /**/ SP_RMS , KC_SPC , KC_RGUI , KC_RALT , RAI , KC_RCTL \ + ), + + + /* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | GESC | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | \ | - | = | [ | ] | | [ | ] | - | = | \ | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | ^Z | ^X | ^C | ^V | | | Play | Vol+ | Vol- | Mute | Next | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + [_LOWER] = LAYOUT( \ + TO(0) , KC_EXLM , KC_AT , KC_HASH , KC_DLR , KC_PERC , /**/ KC_CIRC , KC_AMPR , KC_ASTR , KC_LPRN , KC_RPRN , _______ , \ + _______ , KC_EXLM , KC_AT , KC_HASH , KC_DLR , KC_PERC , /**/ KC_CIRC , KC_AMPR , KC_ASTR , KC_LPRN , KC_RPRN , _______ , \ + _______ , KC_RCBR , KC_MINS , KC_EQL , KC_LBRC , KC_RBRC , /**/ KC_LBRC , KC_RBRC , KC_MINS , KC_EQL , KC_BSLS , KC_DEL , \ + _______ , CTRL_Z , CTRL_X , CTRL_C , CTRL_V , XXXXXXX , /**/ KC_MPLY , KC_VOLU , KC_VOLD , KC_MUTE , KC_MNXT , _______ , \ + _______ , XXXXXXX , _______ , _______ , _______ , XXXXXXX , /**/ XXXXXXX , _______ , _______ , _______ , XXXXXXX , _______ \ + ), + + /* Raise + * ,-----------------------------------------. .-----------------------------------------. + * | GESC | | | | | | | | = | / | * | - | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | F9 | F10 | F11 | F12 | | | | 7 | 8 | 9 | + | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F5 | F6 | F7 | F8 | | | | 4 | 5 | 6 | , | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | F1 | F2 | F3 | F4 | | | | 1 | 2 | 3 | . | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | 0 | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + [_RAISE] = LAYOUT( \ + TO(0) , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , /**/ XXXXXXX , KC_EQL , KC_SLSH , KC_ASTR , KC_MINS , _______ , \ + _______ , KC_F9 , KC_F10 , KC_F11 , KC_F12 , XXXXXXX , /**/ XXXXXXX , KC_7 , KC_8 , KC_9 , KC_PLUS , _______ , \ + XXXXXXX , KC_F5 , KC_F6 , KC_F7 , KC_F8 , XXXXXXX , /**/ XXXXXXX , KC_4 , KC_5 , KC_6 , KC_COMM , KC_DEL , \ + _______ , KC_F1 , KC_F2 , KC_F3 , KC_F4 , XXXXXXX , /**/ XXXXXXX , KC_1 , KC_2 , KC_3 , KC_DOT , _______ , \ + _______ , XXXXXXX , _______ , _______ , _______ , XXXXXXX , /**/ XXXXXXX , KC_0 , _______ , _______ , _______ , _______ \ + ), + + /* LMOUSE (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | GESC | | Home | End | PGUP | PGDN | | | | | | | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | WH_L | BTN1 | MS_U | BTN2 | WH_U | | | | | | | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | WH_R | MS_L | MS_D | MS_R | WH_D | | | | | | | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | LEFT | DOWN | UP |RIGHT | | | | | | | | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + [_LMOUSE] = LAYOUT( \ + TO(0) , XXXXXXX , KC_HOME , KC_END , KC_PGUP , KC_PGDN , /**/ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , _______ , \ + _______ , KC_WH_L , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_U , /**/ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , _______ , \ + XXXXXXX , KC_WH_R , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_D , /**/ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , KC_DEL , \ + _______ , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , XXXXXXX , /**/ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , _______ , \ + _______ , XXXXXXX , _______ , _______ , _______ , _______ , /**/ XXXXXXX , _______ , _______ , _______ , XXXXXXX , _______ \ + ), + + /* RMOUSE (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | GESC | | | | | | | PGUP | PGDN | Home | End | | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | | | | | | | WH_U | BTN1 | MS_U | BTN2 | WH_L | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | WH_D | MS_L | MS_D | MS_R | WH_R | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | | | | | | | | LEFT | DOWN | UP |RIGHT | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + [_RMOUSE] = LAYOUT( \ + TO(0) , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , /**/ KC_PGUP , KC_PGDN , KC_HOME , KC_END , XXXXXXX , _______ , \ + _______ , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , /**/ KC_WH_U , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_L , _______ , \ + XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , /**/ KC_WH_D , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_R , KC_DEL , \ + _______ , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , /**/ XXXXXXX , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , _______ , \ + _______ , XXXXXXX , _______ , _______ , _______ , XXXXXXX , /**/ _______ , _______ , _______ , _______ , XXXXXXX , _______ \ + ), + + /* Emojis + * ,-----------------------------------------. ,-----------------------------------------. + * | GESC | | | | | | | RSET | | | | | Bksp | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | CLAP | CUM | BNIS | BUTT | CAR | | FIRE | REDB | MONY | 100 | SOS | Entr | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | CELE | PRAY | NAIL | OK | THNK | | UNAM | HEYE | COOL | EYES | SMIR | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shft | TRIU | SCRM | VOMI | DTIV | EXPL | | HAIR | DANC | STRN | LEFT | RGHT | Shft | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | Alt | GUI | | | | | | GUI | Alt | | Ctrl | + * `-----------------------------------------' `-----------------------------------------' + */ + + [_EMOJI] = LAYOUT( \ + TO(0) , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , /**/ RESET , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , _______ , \ + _______ , X(CLAP) , X(CUM) , X(BNIS) , X(BUTT) , X(CAR) , /**/ X(FIRE) , X(REDB) , X(MONY) , X(HNDR) , X(SOS) , _______ , \ + XXXXXXX , X(CELE) , X(PRAY) , X(NAIL) , X(OK) , X(THNK) , /**/ X(UNAM) , X(HEYE) , X(COOL) , X(EYES) , X(SMIR) , KC_DEL , \ + _______ , X(TRIU) , X(SCRM) , X(VOMI) , X(DTIV) , X(EXPL) , /**/ X(HAIR) , X(DANC) , X(STRN) , X(LEFT) , X(RGHT) , _______ , \ + _______ , _______ , _______ , _______ , _______ , XXXXXXX , /**/ XXXXXXX , _______ , _______ , _______ , XXXXXXX , _______ \ + ), + +}; + +void matrix_init_user(void) { + set_unicode_input_mode(UC_LNX); +}; + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + if (record->event.pressed) { + switch(keycode) { + case CTRL_Z: + SEND_STRING(SS_LCTRL("z")); + return false; + case CTRL_X: + SEND_STRING(SS_LCTRL("x")); + return false; + case CTRL_C: + SEND_STRING(SS_LCTRL("c")); + return false; + case CTRL_V: + SEND_STRING(SS_LCTRL("v")); + return false; + } + } + + return true; +} diff --git a/keyboards/nyquist/keymaps/bramver/rules.mk b/keyboards/nyquist/keymaps/bramver/rules.mk new file mode 100644 index 000000000000..d211d7b4cfb0 --- /dev/null +++ b/keyboards/nyquist/keymaps/bramver/rules.mk @@ -0,0 +1,6 @@ +# Build options +MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses +EXTRAKEY_ENABLE = yes # Use system and audio control key codes +TAP_DANCE_ENABLE = no # Use multi-tap features +UNICODEMAP_ENABLE = yes # Emojify me pls +NKRO_ENABLE = yes From be2610b6da8e7466107678a4782ddafac7002b1d Mon Sep 17 00:00:00 2001 From: sbstjn Date: Fri, 5 Oct 2018 23:59:05 +0200 Subject: [PATCH 147/505] feat: Add 68Keys.io --- keyboards/68keys/68keys.c | 6 ++ keyboards/68keys/68keys.h | 20 ++++++ keyboards/68keys/README.md | 23 +++++++ keyboards/68keys/config.h | 42 ++++++++++++ keyboards/68keys/info.json | 81 +++++++++++++++++++++++ keyboards/68keys/keymaps/default/keymap.c | 10 +++ keyboards/68keys/rules.mk | 22 ++++++ 7 files changed, 204 insertions(+) create mode 100644 keyboards/68keys/68keys.c create mode 100644 keyboards/68keys/68keys.h create mode 100644 keyboards/68keys/README.md create mode 100644 keyboards/68keys/config.h create mode 100644 keyboards/68keys/info.json create mode 100644 keyboards/68keys/keymaps/default/keymap.c create mode 100644 keyboards/68keys/rules.mk diff --git a/keyboards/68keys/68keys.c b/keyboards/68keys/68keys.c new file mode 100644 index 000000000000..dcf04e6a3dd5 --- /dev/null +++ b/keyboards/68keys/68keys.c @@ -0,0 +1,6 @@ +#include "68keys.h" + +void matrix_init_kb(void) +{ + matrix_init_user(); +} diff --git a/keyboards/68keys/68keys.h b/keyboards/68keys/68keys.h new file mode 100644 index 000000000000..e8a2c4aeedd3 --- /dev/null +++ b/keyboards/68keys/68keys.h @@ -0,0 +1,20 @@ +#include "quantum.h" + +#define LAYOUT_68_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K10, K11, K12, K13, K14, K15, K16, \ + K17, K18, K20, K21, K22, K23, K24, K25, K26, K27, K28, K30, K31, K32, K33, K34, \ + K35, K36, K37, K38, K40, K41, K42, K43, K44, K45, K46, K47, K48, \ + K50, K51, K52, K53, K54, K55, K56, K57, K58, K60, K61, K62, K63, \ + K64, K65, K66, K67, K68, K70, K71, K72, K73, K74) \ + { \ + {K00, K01, K02, K03, K04, K05, K06, K07, K08}, \ + {K10, K11, K12, K13, K14, K15, K16, K17, K18}, \ + {K20, K21, K22, K23, K24, K25, K26, K27, K28}, \ + {K30, K31, K32, K33, K34, K35, K36, K37, K38}, \ + {K40, K41, K42, K43, K44, K45, K46, K47, K48}, \ + {K50, K51, K52, K53, K54, K55, K56, K57, K58}, \ + {K60, K61, K62, K63, K64, K65, K66, K67, K68}, \ + { \ + K70, K71, K72, K73, K74 \ + } \ + } diff --git a/keyboards/68keys/README.md b/keyboards/68keys/README.md new file mode 100644 index 000000000000..082a47a75596 --- /dev/null +++ b/keyboards/68keys/README.md @@ -0,0 +1,23 @@ +# 68Keys.io + +Custom [68Keys.io](https://68keys.io) DIY keyboard. + +Keyboard Maintainer: [sbstjn](https://sbstjn.com) +Hardware Supported: Pro Micro +Hardware Availability: [DIY Guide](https://68keys.io) + +Make example for this keyboard (after setting up your build environment): + +```bash +$ > cd qmk_firmware/ +$ > make 68keys:default +``` + +Example of flashing this keyboard: + +```bash +$ > cd qmk_firmware/ +$ > make 68keys:default:avrdude +``` + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/68keys/config.h b/keyboards/68keys/config.h new file mode 100644 index 000000000000..07c87563d3ee --- /dev/null +++ b/keyboards/68keys/config.h @@ -0,0 +1,42 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0A0C +#define DEVICE_VER 0x0068 +#define MANUFACTURER 68Keys.io +#define PRODUCT The 68Keys.io Keyboard +#define DESCRIPTION A 68 keys mechanical keyboard + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 9 + +#define MATRIX_ROW_PINS \ + { \ + B6, B2, B3, B1, F7, F6, F5, F4 \ + } +#define MATRIX_COL_PINS \ + { \ + D3, D2, D1, D0, D4, C6, D7, E6, B4 \ + } +#define UNUSED_PINS + +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B5 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 + +#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 magic key command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) diff --git a/keyboards/68keys/info.json b/keyboards/68keys/info.json new file mode 100644 index 000000000000..b24e22b0a1e8 --- /dev/null +++ b/keyboards/68keys/info.json @@ -0,0 +1,81 @@ +{ + "keyboard_name": "68Keys.io", + "url": "https://68keys.io", + "maintainer": "qmk", + "width": 17.25, + "height": 5, + "layouts": { + "LAYOUT_68_ansi": { + "layout": [ + { "label": "~", "x": 0, "y": 0 }, + { "label": "!", "x": 1, "y": 0 }, + { "label": "@", "x": 2, "y": 0 }, + { "label": "#", "x": 3, "y": 0 }, + { "label": "$", "x": 4, "y": 0 }, + { "label": "%", "x": 5, "y": 0 }, + { "label": "^", "x": 6, "y": 0 }, + { "label": "&", "x": 7, "y": 0 }, + { "label": "*", "x": 8, "y": 0 }, + { "label": "(", "x": 9, "y": 0 }, + { "label": ")", "x": 10, "y": 0 }, + { "label": "_", "x": 11, "y": 0 }, + { "label": "+", "x": 12, "y": 0 }, + { "label": "Backspace", "x": 13, "y": 0, "w": 2 }, + { "label": "ESC", "x": 15.25, "y": 0 }, + { "label": "PGUP", "x": 16.25, "y": 0 }, + { "label": "Tab", "x": 0, "y": 1, "w": 1.5 }, + { "label": "Q", "x": 1.5, "y": 1 }, + { "label": "W", "x": 2.5, "y": 1 }, + { "label": "E", "x": 3.5, "y": 1 }, + { "label": "R", "x": 4.5, "y": 1 }, + { "label": "T", "x": 5.5, "y": 1 }, + { "label": "Y", "x": 6.5, "y": 1 }, + { "label": "U", "x": 7.5, "y": 1 }, + { "label": "I", "x": 8.5, "y": 1 }, + { "label": "O", "x": 9.5, "y": 1 }, + { "label": "P", "x": 10.5, "y": 1 }, + { "label": "{", "x": 11.5, "y": 1 }, + { "label": "}", "x": 12.5, "y": 1 }, + { "label": "|", "x": 13.5, "y": 1, "w": 1.5 }, + { "label": "DEL", "x": 15.25, "y": 1 }, + { "label": "PGDN", "x": 16.25, "y": 1 }, + { "label": "Caps Lock", "x": 0, "y": 2, "w": 1.75 }, + { "label": "A", "x": 1.75, "y": 2 }, + { "label": "S", "x": 2.75, "y": 2 }, + { "label": "D", "x": 3.75, "y": 2 }, + { "label": "F", "x": 4.75, "y": 2 }, + { "label": "G", "x": 5.75, "y": 2 }, + { "label": "H", "x": 6.75, "y": 2 }, + { "label": "J", "x": 7.75, "y": 2 }, + { "label": "K", "x": 8.75, "y": 2 }, + { "label": "L", "x": 9.75, "y": 2 }, + { "label": ":", "x": 10.75, "y": 2 }, + { "label": "\"", "x": 11.75, "y": 2 }, + { "label": "Enter", "x": 12.75, "y": 2, "w": 2.25 }, + { "label": "Shift", "x": 0, "y": 3, "w": 2.25 }, + { "label": "Z", "x": 2.25, "y": 3 }, + { "label": "X", "x": 3.25, "y": 3 }, + { "label": "C", "x": 4.25, "y": 3 }, + { "label": "V", "x": 5.25, "y": 3 }, + { "label": "B", "x": 6.25, "y": 3 }, + { "label": "N", "x": 7.25, "y": 3 }, + { "label": "M", "x": 8.25, "y": 3 }, + { "label": "<", "x": 9.25, "y": 3 }, + { "label": ">", "x": 10.25, "y": 3 }, + { "label": "?", "x": 11.25, "y": 3 }, + { "label": "Shift", "x": 12.25, "y": 3, "w": 2.75 }, + { "x": 15.25, "y": 3 }, + { "label": "CTRL", "x": 0, "y": 4, "w": 1.25 }, + { "label": "ALT", "x": 1.25, "y": 4, "w": 1.25 }, + { "label": "GUI", "x": 2.5, "y": 4, "w": 1.25 }, + { "x": 3.75, "y": 4, "w": 6.25 }, + { "label": "GUI", "x": 10, "y": 4, "w": 1.25 }, + { "label": "ALT", "x": 11.25, "y": 4, "w": 1.25 }, + { "label": "CTRL", "x": 12.5, "y": 4, "w": 1.25 }, + { "x": 14.25, "y": 4 }, + { "x": 15.25, "y": 4 }, + { "x": 16.25, "y": 4 } + ] + } + } +} diff --git a/keyboards/68keys/keymaps/default/keymap.c b/keyboards/68keys/keymaps/default/keymap.c new file mode 100644 index 000000000000..8f23d2246266 --- /dev/null +++ b/keyboards/68keys/keymaps/default/keymap.c @@ -0,0 +1,10 @@ +#include QMK_KEYBOARD_H +#include "68keys.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_68_ansi( + 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_ESC, KC_PGUP, + 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_PGDN, + KC_CAPSLOCK, 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_UP, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT)}; diff --git a/keyboards/68keys/rules.mk b/keyboards/68keys/rules.mk new file mode 100644 index 000000000000..f1a56d496d87 --- /dev/null +++ b/keyboards/68keys/rules.mk @@ -0,0 +1,22 @@ +LAYOUTS = 68_ansi + +MCU = atmega32u4 +F_CPU = 16000000 +ARCH = AVR8 +F_USB = $(F_CPU) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT +BOOTLOADER = atmel-dfu + +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 # Breathing sleep LED during USB suspend +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 + From 914d42acd01cae9fa03d9368f9316a1e1017fb17 Mon Sep 17 00:00:00 2001 From: chipperdoodles Date: Sun, 7 Oct 2018 11:23:41 -0700 Subject: [PATCH 148/505] Update Bluetooth docs (#4062) * syncing upstream * Bluetooth Doc update More Description in bluetooth section, Addition to Config options rules.mk section. * merge upstream chibios * lib/chibios checkout * Additional EZ key Section added back EZ-Key diy link, Cleaned up some errors --- docs/config_options.md | 4 +++- docs/feature_bluetooth.md | 32 +++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/docs/config_options.md b/docs/config_options.md index 072857727bd2..4678a7146c75 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -245,7 +245,9 @@ Use these to enable or disable building certain features. The more you have enab * `UNICODE_ENABLE` * Unicode * `BLUETOOTH_ENABLE` - * Enable Bluetooth with the Adafruit EZ-Key HID + * Legacy option to Enable Bluetooth with the Adafruit EZ-Key HID. See BLUETOOTH +* `BLUETOOTH` + * Current options are AdafruitEzKey, AdafruitBLE, RN42 * `SPLIT_KEYBOARD` * Enables split keyboard support (dual MCU like the let's split and bakingpy's boards) and includes all necessary files located at quantum/split_common * `WAIT_FOR_USB` diff --git a/docs/feature_bluetooth.md b/docs/feature_bluetooth.md index f647adc727a7..3ffbfa068043 100644 --- a/docs/feature_bluetooth.md +++ b/docs/feature_bluetooth.md @@ -1,10 +1,40 @@ # Bluetooth -## Bluetooth Functionality +## Bluetooth Known Supported Hardware +Currently Bluetooth support is limited to AVR based chips. For Bluetooth 2.1 Qmk has support for RN-42 HID Firmware and Bluefruit EZ Key the later of which is not produced anymore. For more recent BLE protocols currently only the Adafruit Bluefruit SPI friend is directly supported. BLE is needed to connect to iOS devices. Note iOS does not support Mouse Input. + +|Board |Bluetooth Protocol |Connection Type |Rules.mk |Bluetooth Chip| +|----------------------------------------------------------------|----------------------------|----------------|---------------------------|--------------| +|[Adafruit EzKey HID]("https://www.adafruit.com/product/1535") |Bluetooth Classic | UART | BLUETOOTH = AdafruitEZKey | | +|Rover Networks RN-42 (Sparkfun Bluesmirf) |Bluetooth Classic | UART | BLUETOOTH = RN42 | RN-42 | +|[Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633)|Bluetooth Low Energy | SPI | BLUETOOTH = AdafruitBLE | nRF5182 | + +Not Supported Yet but possible: +* [Bluefruit LE UART Friend](https://www.adafruit.com/product/2479). [Possible tmk implementation found in](https://github.com/tmk/tmk_keyboard/issues/514) +* HC-05 boards flashed with RN-42 firmware. They apparently both use the CSR BC417 Chip. Flashing it with RN-42 firmware gives it HID capability. +* [Sparkfun Bluetooth mate](https://www.sparkfun.com/products/14839) +* HM-13 based boards + +### Adafruit BLE SPI Friend +Currently The only bluetooth chipset supported by QMK is the Adafruit Bluefruit SPI Friend. It's a Nordic nRF5182 based chip running Adafruit's custom firmware. Data is transmitted via Adafruit's SDEP over Hardware SPI. The [Feather 32u4 Bluefruit LE](https://www.adafruit.com/product/2829) is supported as it's an AVR mcu connected via SPI to the Nordic BLE chip with Adafruit firmware. If Building a custom board with the SPI friend it would be easiest to just use the pin selection that the 32u4 feather uses but you can change the pins in the config.h options with the following defines: +* #define AdafruitBleResetPin D4 +* #define AdafruitBleCSPin B4 +* #define AdafruitBleIRQPin E6 + +A Bluefruit UART friend can be converted to an SPI friend, however this [requires](https://github.com/qmk/qmk_firmware/issues/2274) some reflashing and soldering directly to the MDBT40 chip. + +## Adafruit EZ-Key hid This requires [some hardware changes](https://www.reddit.com/r/MechanicalKeyboards/comments/3psx0q/the_planck_keyboard_with_bluetooth_guide_and/?ref=search_posts), but can be enabled via the Makefile. The firmware will still output characters via USB, so be aware of this when charging via a computer. It would make sense to have a switch on the Bluefruit to turn it off at will. + +## Bluetooth Rules.mk Options +Use only one of these +* BLUETOOTH_ENABLE = yes (Legacy Option) +* BLUETOOTH = RN42 +* BLUETOOTH = AdafruitEZKey +* BLUETOOTH = AdafruitBLE ## Bluetooth Keycodes From 98a63d8d6e91fcd0de4e8496d21ceef17b81d5d1 Mon Sep 17 00:00:00 2001 From: yiancar Date: Mon, 8 Oct 2018 23:27:04 +0100 Subject: [PATCH 149/505] DC01 updates and I2C avr speed overwrite (#4088) * DC01 updates and I2C avr speed overwrite - General updating of DC01 - Made F_SCL define in AVR I2C driver overwritable from config.h * Update drivers/avr/i2c_master.c --- drivers/avr/i2c_master.c | 2 ++ keyboards/dc01/left/config.h | 2 ++ keyboards/dc01/left/matrix.c | 41 ++++++++++++------------------------ 3 files changed, 17 insertions(+), 28 deletions(-) diff --git a/drivers/avr/i2c_master.c b/drivers/avr/i2c_master.c index 47c6f8e6c64a..a04e6570d764 100755 --- a/drivers/avr/i2c_master.c +++ b/drivers/avr/i2c_master.c @@ -8,7 +8,9 @@ #include "i2c_master.h" #include "timer.h" +#ifndef F_SCL #define F_SCL 400000UL // SCL frequency +#endif #define Prescaler 1 #define TWBR_val ((((F_CPU / F_SCL) / Prescaler) - 16 ) / 2) diff --git a/keyboards/dc01/left/config.h b/keyboards/dc01/left/config.h index 68484d8355cc..e3d49404ea53 100644 --- a/keyboards/dc01/left/config.h +++ b/keyboards/dc01/left/config.h @@ -46,6 +46,8 @@ along with this program. If not, see . #define MATRIX_COL_PINS { F4, F1, F0, F7, F6, F5 } #define UNUSED_PINS +#define F_SCL 300000UL + /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #define DIODE_DIRECTION COL2ROW diff --git a/keyboards/dc01/left/matrix.c b/keyboards/dc01/left/matrix.c index 792376635963..806583580d7f 100644 --- a/keyboards/dc01/left/matrix.c +++ b/keyboards/dc01/left/matrix.c @@ -43,7 +43,7 @@ static uint8_t error_count_arrow = 0; /* Set 0 if debouncing isn't needed */ #ifndef DEBOUNCING_DELAY -# define DEBOUNCING_DELAY 5 +# define DEBOUNCING_DELAY 5 #endif #if (DEBOUNCING_DELAY > 0) @@ -135,10 +135,7 @@ uint8_t matrix_cols(void) { return MATRIX_COLS; } - i2c_status_t i2c_transaction(uint8_t address, uint32_t mask, uint8_t col_offset); -//uint8_t i2c_transaction_numpad(void); -//uint8_t i2c_transaction_arrow(void); //this replases tmk code void matrix_setup(void){ @@ -220,7 +217,7 @@ uint8_t matrix_scan(void) matrix[i] &= 0x3F; //mask bits to keep } } - }else{ //no error + }else{ //no error error_count_right = 0; } @@ -440,40 +437,28 @@ static void unselect_cols(void) // Complete rows from other modules over i2c i2c_status_t i2c_transaction(uint8_t address, uint32_t mask, uint8_t col_offset) { i2c_status_t err = i2c_start((address << 1) | I2C_WRITE, 10); - if (err) return err; - i2c_write(0x01, 10); - if (err) return err; + i2c_write(0x01, 10); //request data in address 1 - i2c_start((address << 1) | I2C_READ, 10); - if (err) return err; + i2c_start((address << 1) | I2C_READ, 5); err = i2c_read_ack(10); if (err == 0x55) { //synchronization byte - for (uint8_t i = 0; i < MATRIX_ROWS-1 ; i++) { //assemble slave matrix in main matrix - matrix[i] &= mask; //mask bits to keep - err = i2c_read_ack(10); - if (err >= 0) { - matrix[i] |= ((uint32_t)err << (MATRIX_COLS_SCANNED + col_offset)); //add new bits at the end - } else { - return err; - } - } - //last read request must be followed by a NACK - matrix[MATRIX_ROWS - 1] &= mask; //mask bits to keep - err = i2c_read_nack(10); - if (err >= 0) { + for (uint8_t i = 0; i < MATRIX_ROWS-1 ; i++) { //assemble slave matrix in main matrix + matrix[i] &= mask; //mask bits to keep + err = i2c_read_ack(10); + matrix[i] |= ((uint32_t)err << (MATRIX_COLS_SCANNED + col_offset)); //add new bits at the end + } + //last read request must be followed by a NACK + matrix[MATRIX_ROWS - 1] &= mask; //mask bits to keep + err = i2c_read_nack(10); matrix[MATRIX_ROWS - 1] |= ((uint32_t)err << (MATRIX_COLS_SCANNED + col_offset)); //add new bits at the end - } else { - return err; - } + } else { i2c_stop(10); return 1; } i2c_stop(10); - if (err) return err; - return 0; } \ No newline at end of file From be227b43174f6ec9effbbfc25eb9a853b42cbf2f Mon Sep 17 00:00:00 2001 From: captsis <34025500+captsis@users.noreply.github.com> Date: Mon, 8 Oct 2018 15:20:31 -1000 Subject: [PATCH 150/505] Keyboard: add orange75 (#4093) * New Keyboard: orange75 Co-Authored-By: fox-lab * Update keyboards/orange75/info.json corrected * #4093 corrections * added del to layout again * clarified supported hardware * directives... * Update keyboards/orange75/config.h * Update keyboards/orange75/readme.md --- keyboards/orange75/config.h | 35 ++++++++++ keyboards/orange75/info.json | 12 ++++ keyboards/orange75/keymaps/default/keymap.c | 53 +++++++++++++++ keyboards/orange75/orange75.c | 1 + keyboards/orange75/orange75.h | 29 ++++++++ keyboards/orange75/readme.md | 16 +++++ keyboards/orange75/rules.mk | 73 +++++++++++++++++++++ 7 files changed, 219 insertions(+) create mode 100644 keyboards/orange75/config.h create mode 100644 keyboards/orange75/info.json create mode 100644 keyboards/orange75/keymaps/default/keymap.c create mode 100644 keyboards/orange75/orange75.c create mode 100644 keyboards/orange75/orange75.h create mode 100644 keyboards/orange75/readme.md create mode 100644 keyboards/orange75/rules.mk diff --git a/keyboards/orange75/config.h b/keyboards/orange75/config.h new file mode 100644 index 000000000000..7d1b497be0fc --- /dev/null +++ b/keyboards/orange75/config.h @@ -0,0 +1,35 @@ +#pragma once + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEEB +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Fox-Lab +#define PRODUCT Orange75 +#define DESCRIPTION Keyboard + +/* key matrix size */ +#define MATRIX_ROWS 15 +#define MATRIX_COLS 6 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { E6,F0, F1, F4, F5, F6, F7, C7, C6, B6, B4, D7, D4, D5, D6 } +#define MATRIX_COL_PINS { D3, D2, D1, D0, B7, B3 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* number of backlight levels */ +#define BACKLIGHT_PIN B5 +#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 diff --git a/keyboards/orange75/info.json b/keyboards/orange75/info.json new file mode 100644 index 000000000000..093b4cd4ec40 --- /dev/null +++ b/keyboards/orange75/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Orange75", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 6.25, + "layouts": { + "LAYOUT": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":2, "y":0}, {"label":"F2", "x":3, "y":0}, {"label":"F3", "x":4, "y":0}, {"label":"F4", "x":5, "y":0}, {"label":"F5", "x":6.5, "y":0}, {"label":"F6", "x":7.5, "y":0}, {"label":"F7", "x":8.5, "y":0}, {"label":"F8", "x":9.5, "y":0}, {"label":"F9", "x":11, "y":0}, {"label":"F10", "x":12, "y":0}, {"label":"F11", "x":13, "y":0}, {"label":"F12", "x":14, "y":0}, {"label":"~", "x":0, "y":1.25}, {"label":"!", "x":1, "y":1.25}, {"label":"@", "x":2, "y":1.25}, {"label":"#", "x":3, "y":1.25}, {"label":"$", "x":4, "y":1.25}, {"label":"%", "x":5, "y":1.25}, {"label":"^", "x":6, "y":1.25}, {"label":"&", "x":7, "y":1.25}, {"label":"*", "x":8, "y":1.25}, {"label":"(", "x":9, "y":1.25}, {"label":")", "x":10, "y":1.25}, {"label":"_", "x":11, "y":1.25}, {"label":"+", "x":12, "y":1.25}, {"label":"Backspace", "x":13, "y":1.25, "w":2}, {"label":"Home", "x":15, "y":1.25}, {"label":"Tab", "x":0, "y":2.25, "w":1.5}, {"label":"Q", "x":1.5, "y":2.25}, {"label":"W", "x":2.5, "y":2.25}, {"label":"E", "x":3.5, "y":2.25}, {"label":"R", "x":4.5, "y":2.25}, {"label":"T", "x":5.5, "y":2.25}, {"label":"Y", "x":6.5, "y":2.25}, {"label":"U", "x":7.5, "y":2.25}, {"label":"I", "x":8.5, "y":2.25}, {"label":"O", "x":9.5, "y":2.25}, {"label":"P", "x":10.5, "y":2.25}, {"label":"{", "x":11.5, "y":2.25}, {"label":"}", "x":12.5, "y":2.25}, {"label":"|", "x":13.5, "y":2.25, "w":1.5}, {"label":"End", "x":15, "y":2.25}, {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, {"label":"A", "x":1.75, "y":3.25}, {"label":"S", "x":2.75, "y":3.25}, {"label":"D", "x":3.75, "y":3.25}, {"label":"F", "x":4.75, "y":3.25}, {"label":"G", "x":5.75, "y":3.25}, {"label":"H", "x":6.75, "y":3.25}, {"label":"J", "x":7.75, "y":3.25}, {"label":"K", "x":8.75, "y":3.25}, {"label":"L", "x":9.75, "y":3.25}, {"label":":", "x":10.75, "y":3.25}, {"label":"\"", "x":11.75, "y":3.25}, {"label":"Enter", "x":12.75, "y":3.25, "w":2.25}, {"label":"Page Up", "x":15, "y":3.25}, {"label":"Shift", "x":0, "y":4.25, "w":2.25}, {"label":"Z", "x":2.25, "y":4.25}, {"label":"X", "x":3.25, "y":4.25}, {"label":"C", "x":4.25, "y":4.25}, {"label":"V", "x":5.25, "y":4.25}, {"label":"B", "x":6.25, "y":4.25}, {"label":"N", "x":7.25, "y":4.25}, {"label":"M", "x":8.25, "y":4.25}, {"label":"<", "x":9.25, "y":4.25}, {"label":">", "x":10.25, "y":4.25}, {"label":"?", "x":11.25, "y":4.25}, {"label":"Shift", "x":12.25, "y":4.25, "w":1.75}, {"label":"Up", "x":14, "y":4.25}, {"label":"Page Down", "x":15, "y":4.25}, {"label":"Ctrl", "x":0, "y":5.25, "w":1.25}, {"label":"Win", "x":1.25, "y":5.25, "w":1.25}, {"label":"Alt", "x":2.5, "y":5.25, "w":1.25}, {"x":3.75, "y":5.25, "w":6.25}, {"label":"Alt", "x":10, "y":5.25, "w":1.25}, {"label":"Fn", "x":11.25, "y":5.25, "w":1.25}, {"label":"Left", "x":13, "y":5.25}, {"label":"Down", "x":14, "y":5.25}, {"label":"Right", "x":15, "y":5.25}] + } + } +} \ No newline at end of file diff --git a/keyboards/orange75/keymaps/default/keymap.c b/keyboards/orange75/keymaps/default/keymap.c new file mode 100644 index 000000000000..50aaf718eccc --- /dev/null +++ b/keyboards/orange75/keymaps/default/keymap.c @@ -0,0 +1,53 @@ + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + LAYOUT( + 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_DEL, + 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_HOME, + 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_END, + 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, LT(1, KC_NO), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_PGDN, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, LT(1, KC_NO), KC_LEFT, KC_DOWN, KC_RGHT), + + LAYOUT( + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_TOGG, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_STEP, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_INC, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, + _______, _______, _______, _______, _______, _______, _______, _______, _______) +}; + + +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) { + + if (usb_led & (1 << USB_LED_NUM_LOCK)) { + DDRB |= (1 << 0); PORTB &= ~(1 << 0); + } else { + DDRB &= ~(1 << 0); PORTB &= ~(1 << 0); + } + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRB |= (1 << 1); PORTB &= ~(1 << 1); + } else { + DDRB &= ~(1 << 1); PORTB &= ~(1 << 1); + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + DDRB |= (1 << 2); PORTB &= ~(1 << 2); + } else { + DDRB &= ~(1 << 2); PORTB &= ~(1 << 2); + } +} \ No newline at end of file diff --git a/keyboards/orange75/orange75.c b/keyboards/orange75/orange75.c new file mode 100644 index 000000000000..2d5f73048a72 --- /dev/null +++ b/keyboards/orange75/orange75.c @@ -0,0 +1 @@ +#include "orange75.h" \ No newline at end of file diff --git a/keyboards/orange75/orange75.h b/keyboards/orange75/orange75.h new file mode 100644 index 000000000000..1b351a595cc3 --- /dev/null +++ b/keyboards/orange75/orange75.h @@ -0,0 +1,29 @@ +#pragma once + +#include "quantum.h" + +#define LAYOUT( \ + K000, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K314, \ + K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, \ + K500, K501, K502, K506, K510, K511, K512, K513, K514 \ +) { \ + { K000, K100, K200, K300, K400, K500 }, \ + { KC_NO, K101, K201, K301, K401, K501 }, \ + { K002, K102, K202, K302, K402, K502 }, \ + { K003, K103, K203, K303, K403, KC_NO}, \ + { K004, K104, K204, K304, K404, KC_NO}, \ + { K005, K105, K205, K305, K405, KC_NO}, \ + { K006, K106, K206, K306, K406, K506 }, \ + { K007, K107, K207, K307, K407, KC_NO}, \ + { K008, K108, K208, K308, K408, KC_NO}, \ + { K009, K109, K209, K309, K409, KC_NO}, \ + { K010, K110, K210, K310, K410, K510 }, \ + { K011, K111, K211, K311, K411, K511 }, \ + { K012, K112, K212, K312, K412, K512 }, \ + { K013, K113, K213, KC_NO,K413, K513 }, \ + { K014, K114, K214, K314, K414, K514 } \ +} + diff --git a/keyboards/orange75/readme.md b/keyboards/orange75/readme.md new file mode 100644 index 000000000000..910674406297 --- /dev/null +++ b/keyboards/orange75/readme.md @@ -0,0 +1,16 @@ +# Orange75 + +![Orange75](https://i.imgur.com/eAfiwwM.jpg) + +A 75% made by Fox Lab. + +Keyboard Maintainer: [captsis](https://github.com/captsis), [fox-lab](https://github.com/fox-lab) +Hardware Supported: Orange75 powered by the ATmega32U4 +Hardware Availability: [zFrontier](https://en.zfrontier.com/collections/keyboards/products/foxlab-orange75), [Geekhack GB](https://geekhack.org/index.php?topic=95080.0) + + +Make example for this keyboard (after setting up your build environment): + + make orange75:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). \ No newline at end of file diff --git a/keyboards/orange75/rules.mk b/keyboards/orange75/rules.mk new file mode 100644 index 000000000000..0f9672a51c81 --- /dev/null +++ b/keyboards/orange75/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 + + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = no \ No newline at end of file From 42add5450d453d734833a7b978e4ab6907ab1fe1 Mon Sep 17 00:00:00 2001 From: Grady Sigler Date: Mon, 8 Oct 2018 20:50:42 -0600 Subject: [PATCH 151/505] Keymap: Iris Keymap (#4100) * IRIS Keyboard Keymap I wanted a keymap that really changed things up. I also found that as a programmer I need as many symbols as I can get. * Make cmd-option-escape work on a mac * Add more prettyfication. * Add other types of hold * More work on the layer keys * tweaks * More tweaks. * more tweaks * Remove OSL/OSM they didnt seem to work very well --- keyboards/iris/keymaps/gsigler/config.h | 33 +++++++++++ keyboards/iris/keymaps/gsigler/keymap.c | 74 +++++++++++++++++++++++++ keyboards/iris/keymaps/gsigler/rules.mk | 3 + 3 files changed, 110 insertions(+) create mode 100644 keyboards/iris/keymaps/gsigler/config.h create mode 100644 keyboards/iris/keymaps/gsigler/keymap.c create mode 100644 keyboards/iris/keymaps/gsigler/rules.mk diff --git a/keyboards/iris/keymaps/gsigler/config.h b/keyboards/iris/keymaps/gsigler/config.h new file mode 100644 index 000000000000..e1793fb1b85d --- /dev/null +++ b/keyboards/iris/keymaps/gsigler/config.h @@ -0,0 +1,33 @@ +/* +Copyright 2018 Grady Sigler + +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 + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#define AUTO_SHIFT_TIMEOUT 95 +#define ONESHOT_TAP_TOGGLE 5 /* Tapping this number of times holds the key until tapped this number of times again. */ +#define ONESHOT_TIMEOUT 5000 /* Time (in ms) before the one shot key is released */ diff --git a/keyboards/iris/keymaps/gsigler/keymap.c b/keyboards/iris/keymaps/gsigler/keymap.c new file mode 100644 index 000000000000..f8753cbdccdf --- /dev/null +++ b/keyboards/iris/keymaps/gsigler/keymap.c @@ -0,0 +1,74 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +enum iris_layers { + _QWERTY, + _LOWER, + _RAISE +}; + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + //| `/~ | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | _/- | + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + //| TAB | Q | W | E | R | T | | Y | U | I | O | P | +/= | + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_EQL, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + //| RAISE | A | S | D | F | G | | H | J | K | L | :/; | "/' | + RAISE, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + //| LOWER | Z | X | C | V | B | ESC | | ALT | N | M | /. | ?-/ | |-\ | + LOWER, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ESC, KC_LALT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_BSLS, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + // | CTRL | COMMAND| BKSPACE| | SPACE | ENTER | SHIFT | + KC_LCTL, KC_LGUI, KC_BSPC, KC_SPC, KC_ENT, KC_LSFT + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), +//KC_LALT ALT + [_RAISE] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + //| `/~ | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + //| TAB | ! | @ | { | } | | | | | | ↑ | | | F12 | + KC_TRNS, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, KC_F12, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + //| RAISE | # | $ | ( | ) | ` | | ? | ← | ↓ | → | | VOLUP | + KC_TRNS, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV, KC_QUES, KC_LEFT,KC_DOWN, KC_RGHT, XXXXXXX, KC__VOLUP, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + //| | % | ^ | [ | ] | ~ | ESC | ALT | & | | | | MUTE | VOLDN | + XXXXXXX, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_TRNS, KC_TRNS, KC_AMPR, XXXXXXX, XXXXXXX,XXXXXXX, KC__MUTE,KC__VOLDOWN, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + // | CTRL | COMMAND| BKSPACE| | SPACE | ENTER | SHIFT| + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_LOWER] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + //| | | | | | | | | 7 | 8 | 9 | * | / | + KC_ASUP, KC_ASON, KC_ASRP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_P7, KC_P8, KC_P9, KC_PAST, KC_PSLS, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + //| | | | | | | | | 4 | 5 | 6 | + | - | + KC_ASDN, KC_ASOFF, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_PMNS, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + //| | | | | | | | | 1 | 2 | 3 | | | + XXXXXXX, KC_ASTG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_P1, KC_P2, KC_P3, XXXXXXX, XXXXXXX, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + //| LOWER | | | | | | ESC | | ALT | | 0 | . | ENTER | = | | + KC_TRNS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_TRNS, KC_TRNS, XXXXXXX, KC_P0, KC_PDOT, KC_PENT, KC_PEQL, XXXXXXX, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + // | CTRL | COMMAND| BKSPACE | | SPACE | ENTER | SHIFT | + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + +}; diff --git a/keyboards/iris/keymaps/gsigler/rules.mk b/keyboards/iris/keymaps/gsigler/rules.mk new file mode 100644 index 000000000000..0abc28fc5955 --- /dev/null +++ b/keyboards/iris/keymaps/gsigler/rules.mk @@ -0,0 +1,3 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes +AUTO_SHIFT_ENABLE = yes From 04e28470bcf22b05ca2bd52746c2254cae281836 Mon Sep 17 00:00:00 2001 From: Brian Choromanski Date: Mon, 8 Oct 2018 09:48:44 -0400 Subject: [PATCH 152/505] Added OSL to list of layer toggles --- docs/feature_advanced_keycodes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index 5f30359e0d17..0f5b8618a8c3 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -27,6 +27,7 @@ These functions allow you to activate layers in various ways. Note that layers a * `MO(layer)` - momentarily activates *layer*. As soon as you let go of the key, the layer is deactivated. * `LM(layer, mod)` - Momentarily activates *layer* (like `MO`), but with modifier(s) *mod* active. Only supports layers 0-15 and the left modifiers. * `LT(layer, kc)` - momentarily activates *layer* when held, and sends *kc* when tapped. +* `OSL(layer)` - momentarily activates *layer* until the next key is pressed. * `TG(layer)` - toggles *layer*, activating it if it's inactive and vice versa * `TO(layer)` - activates *layer* and de-activates all other layers (except your default layer). This function is special, because instead of just adding/removing one layer to your active layer stack, it will completely replace your current active layers, uniquely allowing you to replace higher layers with a lower one. This is activated on keydown (as soon as the key is pressed). * `TT(layer)` - Layer Tap-Toggle. If you hold the key down, *layer* is activated, and then is de-activated when you let go (like `MO`). If you repeatedly tap it, the layer will be toggled on or off (like `TG`). It needs 5 taps by default, but you can change this by defining `TAPPING_TOGGLE` -- for example, `#define TAPPING_TOGGLE 2` to toggle on just two taps. From 7f6bb82b9daf51fb79972871e9f85696f783aa7a Mon Sep 17 00:00:00 2001 From: Brian Choromanski Date: Tue, 9 Oct 2018 13:20:09 -0400 Subject: [PATCH 153/505] Added link to One Shot Keys --- docs/feature_advanced_keycodes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index 0f5b8618a8c3..2ca533a2825e 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -27,7 +27,7 @@ These functions allow you to activate layers in various ways. Note that layers a * `MO(layer)` - momentarily activates *layer*. As soon as you let go of the key, the layer is deactivated. * `LM(layer, mod)` - Momentarily activates *layer* (like `MO`), but with modifier(s) *mod* active. Only supports layers 0-15 and the left modifiers. * `LT(layer, kc)` - momentarily activates *layer* when held, and sends *kc* when tapped. -* `OSL(layer)` - momentarily activates *layer* until the next key is pressed. +* `OSL(layer)` - momentarily activates *layer* until the next key is pressed. See [One Shot Keys.](#one-shot-keys) * `TG(layer)` - toggles *layer*, activating it if it's inactive and vice versa * `TO(layer)` - activates *layer* and de-activates all other layers (except your default layer). This function is special, because instead of just adding/removing one layer to your active layer stack, it will completely replace your current active layers, uniquely allowing you to replace higher layers with a lower one. This is activated on keydown (as soon as the key is pressed). * `TT(layer)` - Layer Tap-Toggle. If you hold the key down, *layer* is activated, and then is de-activated when you let go (like `MO`). If you repeatedly tap it, the layer will be toggled on or off (like `TG`). It needs 5 taps by default, but you can change this by defining `TAPPING_TOGGLE` -- for example, `#define TAPPING_TOGGLE 2` to toggle on just two taps. From 5a127293e7dfb348102afcb47d0e21b6fefad50a Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 6 Oct 2018 18:02:02 -0700 Subject: [PATCH 154/505] Fix formatting in Unicode text --- docs/feature_unicode.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/feature_unicode.md b/docs/feature_unicode.md index f13eed05b802..b1527b848ae5 100644 --- a/docs/feature_unicode.md +++ b/docs/feature_unicode.md @@ -82,11 +82,11 @@ sort of like macro. Unfortunately, each OS has different ideas on how Unicode is This is the current list of Unicode input method in QMK: -* _UC_OSX_: MacOS Unicode Hex Input support. Works only up to 0xFFFF. Disabled by default. To enable: go to System Preferences -> Keyboard -> Input Sources, and enable Unicode Hex. -* _UC_OSX_RALT_: Same as UC_OSX, but sends the Right Alt key for unicode input -* _UC_LNX_: Unicode input method under Linux. Works up to 0xFFFFF. Should work almost anywhere on ibus enabled distros. Without ibus, this works under GTK apps, but rarely anywhere else. -* _UC_WIN_: (not recommended) Windows built-in Unicode input. To enable: create registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad`, set its value to 1, and reboot. This method is not recommended because of reliability and compatibility issue, use WinCompose method below instead. -* _UC_WINC_: Windows Unicode input using WinCompose. Requires [WinCompose](https://github.com/samhocevar/wincompose). Works reliably under many (all?) variations of Windows. +* __UC_OSX__: MacOS Unicode Hex Input support. Works only up to 0xFFFF. Disabled by default. To enable: go to System Preferences -> Keyboard -> Input Sources, and enable Unicode Hex. +* __UC_OSX_RALT__: Same as UC_OSX, but sends the Right Alt key for unicode input +* __UC_LNX__: Unicode input method under Linux. Works up to 0xFFFFF. Should work almost anywhere on ibus enabled distros. Without ibus, this works under GTK apps, but rarely anywhere else. +* __UC_WIN__: (not recommended) Windows built-in Unicode input. To enable: create registry key under `HKEY_CURRENT_USER\Control Panel\Input Method\EnableHexNumpad` of type `REG_SZ` called `EnableHexNumpad`, set its value to 1, and reboot. This method is not recommended because of reliability and compatibility issue, use WinCompose method below instead. +* __UC_WINC__: Windows Unicode input using WinCompose. Requires [WinCompose](https://github.com/samhocevar/wincompose). Works reliably under many (all?) variations of Windows. At some point, you need to call `set_unicode_input_mode(x)` to set the correct unicode method. This sets the method that is used to send the unicode, and stores it in EEPROM, so you only need to call this once. From 1df10ae3bfc146805c75b06dc0c126cd1ef3a60a Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 6 Oct 2018 07:57:55 -0700 Subject: [PATCH 155/505] Update default Planck layout to be more in line with standard conventions --- keyboards/planck/keymaps/default/config.h | 6 +----- keyboards/planck/keymaps/default/keymap.c | 21 +++++++++++++++------ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/keyboards/planck/keymaps/default/config.h b/keyboards/planck/keymaps/default/config.h index fbd2fdb27203..6fa31cc8a76f 100644 --- a/keyboards/planck/keymaps/default/config.h +++ b/keyboards/planck/keymaps/default/config.h @@ -1,7 +1,4 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" +#pragma once #ifdef AUDIO_ENABLE #define STARTUP_SONG SONG(PLANCK_SOUND) @@ -40,4 +37,3 @@ // Most tactile encoders have detents every 4 stages #define ENCODER_RESOLUTION 4 -#endif diff --git a/keyboards/planck/keymaps/default/keymap.c b/keyboards/planck/keymaps/default/keymap.c index cffa5a5df515..0b787cd122c6 100644 --- a/keyboards/planck/keymaps/default/keymap.c +++ b/keyboards/planck/keymaps/default/keymap.c @@ -14,8 +14,7 @@ * along with this program. If not, see . */ -#include "planck.h" -#include "action_layer.h" +#include QMK_KEYBOARD_H #include "muse.h" extern keymap_config_t keymap_config; @@ -276,11 +275,21 @@ void encoder_update(bool clockwise) { } } else { if (clockwise) { - register_code(KC_PGDN); - unregister_code(KC_PGDN); + #ifdef MOUSEKEY_ENABLE + register_code(KC_MS_WH_DOWN); + unregister_code(KC_MS_WH_DOWN); + #else + register_code(KC_PGDN); + unregister_code(KC_PGDN); + #endif } else { - register_code(KC_PGUP); - unregister_code(KC_PGUP); + #ifdef MOUSEKEY_ENABLE + register_code(KC_MS_WH_UP); + unregister_code(KC_MS_WH_UP); + #else + register_code(KC_PGUP); + unregister_code(KC_PGUP); + #endif } } } From f2965e1eeaf1769e106145a9d19f102fcd8fe4d4 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 10 Oct 2018 08:00:41 -0700 Subject: [PATCH 156/505] Specify max layers supported in layer keycodes --- docs/feature_advanced_keycodes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index 2ca533a2825e..15109e545993 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -26,8 +26,8 @@ These functions allow you to activate layers in various ways. Note that layers a * `DF(layer)` - switches the default layer. The default layer is the always-active base layer that other layers stack on top of. See below for more about the default layer. This might be used to switch from QWERTY to Dvorak layout. (Note that this is a temporary switch that only persists until the keyboard loses power. To modify the default layer in a persistent way requires deeper customization, such as calling the `set_single_persistent_default_layer` function inside of [process_record_user](custom_quantum_functions.md#programming-the-behavior-of-any-keycode).) * `MO(layer)` - momentarily activates *layer*. As soon as you let go of the key, the layer is deactivated. * `LM(layer, mod)` - Momentarily activates *layer* (like `MO`), but with modifier(s) *mod* active. Only supports layers 0-15 and the left modifiers. -* `LT(layer, kc)` - momentarily activates *layer* when held, and sends *kc* when tapped. -* `OSL(layer)` - momentarily activates *layer* until the next key is pressed. See [One Shot Keys.](#one-shot-keys) +* `LT(layer, kc)` - momentarily activates *layer* when held, and sends *kc* when tapped. Only supports layers 0-15. +* `OSL(layer)` - momentarily activates *layer* until the next key is pressed. See [One Shot Keys](#one-shot-keys) for details and additional functionality. * `TG(layer)` - toggles *layer*, activating it if it's inactive and vice versa * `TO(layer)` - activates *layer* and de-activates all other layers (except your default layer). This function is special, because instead of just adding/removing one layer to your active layer stack, it will completely replace your current active layers, uniquely allowing you to replace higher layers with a lower one. This is activated on keydown (as soon as the key is pressed). * `TT(layer)` - Layer Tap-Toggle. If you hold the key down, *layer* is activated, and then is de-activated when you let go (like `MO`). If you repeatedly tap it, the layer will be toggled on or off (like `TG`). It needs 5 taps by default, but you can change this by defining `TAPPING_TOGGLE` -- for example, `#define TAPPING_TOGGLE 2` to toggle on just two taps. From ab91e07753720f8114d6c427139a1436e6efa3ce Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Tue, 9 Oct 2018 15:14:13 -0400 Subject: [PATCH 157/505] Massdrop keyboards console device support for hid_listen Added hid_listen USB device for arm_atsam USB protocol. Debug printing is now done through the console device (CONSOLE_ENABLE = yes) rather than the virtser device, for viewing in hid_listen. Function dpf(...) renamed to CDC_printf(...) and should now be called directly if intending to print to the virtual serial device. --- tmk_core/common.mk | 1 + tmk_core/common/arm_atsam/printf.c | 66 ++++++++ tmk_core/common/arm_atsam/printf.h | 7 +- tmk_core/protocol/arm_atsam/main_arm_atsam.c | 12 +- tmk_core/protocol/arm_atsam/usb/conf_usb.h | 5 + tmk_core/protocol/arm_atsam/usb/main_usb.c | 14 ++ tmk_core/protocol/arm_atsam/usb/udi_cdc.c | 4 +- tmk_core/protocol/arm_atsam/usb/udi_cdc.h | 1 + .../protocol/arm_atsam/usb/udi_device_conf.h | 88 +++++++++-- tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c | 146 ++++++++++++++++++ tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h | 11 ++ .../protocol/arm_atsam/usb/udi_hid_kbd_desc.c | 6 + tmk_core/protocol/arm_atsam/usb/usb_main.h | 6 + 13 files changed, 347 insertions(+), 20 deletions(-) create mode 100644 tmk_core/common/arm_atsam/printf.c diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 319d196aec0d..4a0f7dcf9a1f 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -43,6 +43,7 @@ endif endif ifeq ($(PLATFORM),ARM_ATSAM) + TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/printf.c TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom.c endif diff --git a/tmk_core/common/arm_atsam/printf.c b/tmk_core/common/arm_atsam/printf.c new file mode 100644 index 000000000000..d49d234de20f --- /dev/null +++ b/tmk_core/common/arm_atsam/printf.c @@ -0,0 +1,66 @@ +/* +Copyright 2018 Massdrop Inc. + +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 . +*/ + +#ifdef CONSOLE_PRINT + +#include "samd51j18a.h" +#include "arm_atsam_protocol.h" +#include "printf.h" +#include +#include + +void console_printf(char *fmt, ...) { + while (udi_hid_con_b_report_trans_ongoing) {} //Wait for any previous transfers to complete + + static char console_printbuf[CONSOLE_PRINTBUF_SIZE]; //Print and send buffer + va_list va; + int result; + + va_start(va, fmt); + result = vsnprintf(console_printbuf, CONSOLE_PRINTBUF_SIZE, fmt, va); + va_end(va); + + uint32_t irqflags; + char *pconbuf = console_printbuf; //Pointer to start send from + int send_out = CONSOLE_EPSIZE; //Bytes to send per transfer + + while (result > 0) { //While not error and bytes remain + while (udi_hid_con_b_report_trans_ongoing) {} //Wait for any previous transfers to complete + + irqflags = __get_PRIMASK(); + __disable_irq(); + __DMB(); + + if (result < CONSOLE_EPSIZE) { //If remaining bytes are less than console epsize + memset(udi_hid_con_report, 0, CONSOLE_EPSIZE); //Clear the buffer + send_out = result; //Send remaining size + } + + memcpy(udi_hid_con_report, pconbuf, send_out); //Copy data into the send buffer + + udi_hid_con_b_report_valid = 1; //Set report valid + udi_hid_con_send_report(); //Send report + + __DMB(); + __set_PRIMASK(irqflags); + + result -= send_out; //Decrement result by bytes sent + pconbuf += send_out; //Increment buffer point by bytes sent + } +} + +#endif //CONSOLE_PRINT diff --git a/tmk_core/common/arm_atsam/printf.h b/tmk_core/common/arm_atsam/printf.h index 3206b40bdbc7..1f1c2280b5c0 100644 --- a/tmk_core/common/arm_atsam/printf.h +++ b/tmk_core/common/arm_atsam/printf.h @@ -1,8 +1,11 @@ #ifndef _PRINTF_H_ #define _PRINTF_H_ -int dpf(const char *_Format, ...); -#define __xprintf dpf +#define CONSOLE_PRINTBUF_SIZE 512 + +void console_printf(char *fmt, ...); + +#define __xprintf console_printf #endif //_PRINTF_H_ diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c index 676dac4ea3bd..54d056a14ea1 100644 --- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c +++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c @@ -276,9 +276,9 @@ int main(void) host_set_driver(&arm_atsam_driver); -#ifdef VIRTSER_ENABLE +#ifdef CONSOLE_ENABLE uint64_t next_print = 0; -#endif //VIRTSER_ENABLE +#endif //CONSOLE_ENABLE v_5v_avg = adc_get(ADC_5V); @@ -290,15 +290,17 @@ int main(void) main_subtasks(); //Note these tasks will also be run while waiting for USB keyboard polling intervals -#ifdef VIRTSER_ENABLE +#ifdef CONSOLE_ENABLE if (CLK_get_ms() > next_print) { next_print = CLK_get_ms() + 250; - dprintf("5v=%u 5vu=%u dlow=%u dhi=%u gca=%u gcd=%u\r\n",v_5v,v_5v_avg,v_5v_avg-V5_LOW,v_5v_avg-V5_HIGH,gcr_actual,gcr_desired); + //Add any debug information here that you want to see very often + //dprintf("5v=%u 5vu=%u dlow=%u dhi=%u gca=%u gcd=%u\r\n", v_5v, v_5v_avg, v_5v_avg - V5_LOW, v_5v_avg - V5_HIGH, gcr_actual, gcr_desired); } -#endif //VIRTSER_ENABLE +#endif //CONSOLE_ENABLE } + return 1; } diff --git a/tmk_core/protocol/arm_atsam/usb/conf_usb.h b/tmk_core/protocol/arm_atsam/usb/conf_usb.h index 8f0f47268707..c91caffe02fe 100644 --- a/tmk_core/protocol/arm_atsam/usb/conf_usb.h +++ b/tmk_core/protocol/arm_atsam/usb/conf_usb.h @@ -134,6 +134,11 @@ #define UDI_HID_EXK_DISABLE_EXT() main_exk_disable() #endif +#ifdef CON +#define UDI_HID_CON_ENABLE_EXT() main_con_enable() +#define UDI_HID_CON_DISABLE_EXT() main_con_disable() +#endif + #ifdef MOU #define UDI_HID_MOU_ENABLE_EXT() main_mou_enable() #define UDI_HID_MOU_DISABLE_EXT() main_mou_disable() diff --git a/tmk_core/protocol/arm_atsam/usb/main_usb.c b/tmk_core/protocol/arm_atsam/usb/main_usb.c index e943cbcdcda5..0f676ab639d9 100644 --- a/tmk_core/protocol/arm_atsam/usb/main_usb.c +++ b/tmk_core/protocol/arm_atsam/usb/main_usb.c @@ -88,6 +88,20 @@ void main_exk_disable(void) } #endif +#ifdef CON +volatile bool main_b_con_enable = false; +bool main_con_enable(void) +{ + main_b_con_enable = true; + return true; +} + +void main_con_disable(void) +{ + main_b_con_enable = false; +} +#endif + #ifdef MOU volatile bool main_b_mou_enable = false; bool main_mou_enable(void) diff --git a/tmk_core/protocol/arm_atsam/usb/udi_cdc.c b/tmk_core/protocol/arm_atsam/usb/udi_cdc.c index 15f0f760cc35..5f3c289e812e 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_cdc.c +++ b/tmk_core/protocol/arm_atsam/usb/udi_cdc.c @@ -1260,7 +1260,7 @@ uint32_t CDC_print(char *printbuf) char printbuf[CDC_PRINTBUF_SIZE]; -int dpf(const char *_Format, ...) +int CDC_printf(const char *_Format, ...) { va_list va; //Variable argument list variable int result; @@ -1356,7 +1356,7 @@ uint32_t CDC_print(char *printbuf) return 0; } -int dpf(const char *_Format, ...) +int CDC_printf(const char *_Format, ...) { return 0; } diff --git a/tmk_core/protocol/arm_atsam/usb/udi_cdc.h b/tmk_core/protocol/arm_atsam/usb/udi_cdc.h index e134cf236089..86077ce53bd6 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_cdc.h +++ b/tmk_core/protocol/arm_atsam/usb/udi_cdc.h @@ -365,6 +365,7 @@ extern inbuf_t inbuf; #endif //CDC uint32_t CDC_print(char *printbuf); +int CDC_printf(const char *_Format, ...); uint32_t CDC_input(void); void CDC_init(void); diff --git a/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h b/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h index c7872623408c..1e82b9eccbb0 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h +++ b/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h @@ -44,10 +44,10 @@ along with this program. If not, see . #define RAW #endif -//#define CONSOLE_ENABLE //deferred implementation -//#ifdef CONSOLE_ENABLE -//#define CON -//#endif +//#define CONSOLE_ENABLE //rules.mk +#ifdef CONSOLE_ENABLE +#define CON +#endif //#define NKRO_ENABLE //rules.mk #ifdef NKRO_ENABLE @@ -110,8 +110,9 @@ along with this program. If not, see . #endif #ifdef CON -#define CONSOLE_INTERFACE NEXT_INTERFACE_4 -#define NEXT_INTERFACE_5 (CONSOLE_INTERFACE + 1) +#define CON_INTERFACE NEXT_INTERFACE_4 +#define NEXT_INTERFACE_5 (CON_INTERFACE + 1) +#define UDI_HID_CON_IFACE_NUMBER CON_INTERFACE #else #define NEXT_INTERFACE_5 NEXT_INTERFACE_4 #endif @@ -211,11 +212,16 @@ along with this program. If not, see . #endif #ifdef CON -#define CONSOLE_IN_EPNUM NEXT_IN_EPNUM_4 -#define NEXT_IN_EPNUM_5 (CONSOLE_IN_EPNUM + 1) -#define CONSOLE_OUT_EPNUM NEXT_OUT_EPNUM_1 -#define NEXT_OUT_EPNUM_2 (CONSOLE_OUT_EPNUM + 1) -#define CONSOLE_POLLING_INTERVAL 1 +#define CON_IN_EPNUM NEXT_IN_EPNUM_4 +#define UDI_HID_CON_EP_IN CON_IN_EPNUM +#define NEXT_IN_EPNUM_5 (CON_IN_EPNUM + 1) +#define CON_OUT_EPNUM NEXT_OUT_EPNUM_1 +#define UDI_HID_CON_EP_OUT CON_OUT_EPNUM +#define NEXT_OUT_EPNUM_2 (CON_OUT_EPNUM + 1) +#define CON_POLLING_INTERVAL 1 +#ifndef UDI_HID_CON_STRING_ID +#define UDI_HID_CON_STRING_ID 0 +#endif #else #define NEXT_IN_EPNUM_5 NEXT_IN_EPNUM_4 #define NEXT_OUT_EPNUM_2 NEXT_OUT_EPNUM_1 @@ -558,6 +564,66 @@ COMPILER_PACK_RESET() #endif //RAW +// ********************************************************************** +// CON Descriptor structure and content +// ********************************************************************** +#ifdef CON + +COMPILER_PACK_SET(1) + +typedef struct { + usb_iface_desc_t iface; + usb_hid_descriptor_t hid; + usb_ep_desc_t ep_out; + usb_ep_desc_t ep_in; +} udi_hid_con_desc_t; + +typedef struct { + uint8_t array[34]; +} udi_hid_con_report_desc_t; + +#define UDI_HID_CON_DESC {\ + .iface.bLength = sizeof(usb_iface_desc_t),\ + .iface.bDescriptorType = USB_DT_INTERFACE,\ + .iface.bInterfaceNumber = UDI_HID_CON_IFACE_NUMBER,\ + .iface.bAlternateSetting = 0,\ + .iface.bNumEndpoints = 2,\ + .iface.bInterfaceClass = HID_CLASS,\ + .iface.bInterfaceSubClass = HID_SUB_CLASS_NOBOOT,\ + .iface.bInterfaceProtocol = HID_SUB_CLASS_NOBOOT,\ + .iface.iInterface = UDI_HID_CON_STRING_ID,\ + .hid.bLength = sizeof(usb_hid_descriptor_t),\ + .hid.bDescriptorType = USB_DT_HID,\ + .hid.bcdHID = LE16(USB_HID_BDC_V1_11),\ + .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE,\ + .hid.bNumDescriptors = USB_HID_NUM_DESC,\ + .hid.bRDescriptorType = USB_DT_HID_REPORT,\ + .hid.wDescriptorLength = LE16(sizeof(udi_hid_con_report_desc_t)),\ + .ep_out.bLength = sizeof(usb_ep_desc_t),\ + .ep_out.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_out.bEndpointAddress = UDI_HID_CON_EP_OUT | USB_EP_DIR_OUT,\ + .ep_out.bmAttributes = USB_EP_TYPE_INTERRUPT,\ + .ep_out.wMaxPacketSize = LE16(CONSOLE_EPSIZE),\ + .ep_out.bInterval = CON_POLLING_INTERVAL,\ + .ep_in.bLength = sizeof(usb_ep_desc_t),\ + .ep_in.bDescriptorType = USB_DT_ENDPOINT,\ + .ep_in.bEndpointAddress = UDI_HID_CON_EP_IN | USB_EP_DIR_IN,\ + .ep_in.bmAttributes = USB_EP_TYPE_INTERRUPT,\ + .ep_in.wMaxPacketSize = LE16(CONSOLE_EPSIZE),\ + .ep_in.bInterval = CON_POLLING_INTERVAL,\ +} + +#define UDI_HID_CON_REPORT_SIZE CONSOLE_EPSIZE + +extern uint8_t udi_hid_con_report_set[UDI_HID_CON_REPORT_SIZE]; + +//report buffer +extern uint8_t udi_hid_con_report[UDI_HID_CON_REPORT_SIZE]; + +COMPILER_PACK_RESET() + +#endif //CON + // ********************************************************************** // CDC Descriptor structure and content // ********************************************************************** diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c index 1a6f7905e683..18f9784ae68f 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c @@ -843,3 +843,149 @@ static void udi_hid_raw_setreport_valid(void) } #endif //RAW + +//******************************************************************************************** +// CON +//******************************************************************************************** +#ifdef CON + +bool udi_hid_con_enable(void); +void udi_hid_con_disable(void); +bool udi_hid_con_setup(void); +uint8_t udi_hid_con_getsetting(void); + +UDC_DESC_STORAGE udi_api_t udi_api_hid_con = { + .enable = (bool(*)(void))udi_hid_con_enable, + .disable = (void (*)(void))udi_hid_con_disable, + .setup = (bool(*)(void))udi_hid_con_setup, + .getsetting = (uint8_t(*)(void))udi_hid_con_getsetting, + .sof_notify = NULL, +}; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_con_rate; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_con_protocol; + +COMPILER_WORD_ALIGNED +uint8_t udi_hid_con_report_set[UDI_HID_CON_REPORT_SIZE]; + +bool udi_hid_con_b_report_valid; + +COMPILER_WORD_ALIGNED +uint8_t udi_hid_con_report[UDI_HID_CON_REPORT_SIZE]; + +volatile bool udi_hid_con_b_report_trans_ongoing; + +COMPILER_WORD_ALIGNED +static uint8_t udi_hid_con_report_trans[UDI_HID_CON_REPORT_SIZE]; + +COMPILER_WORD_ALIGNED +UDC_DESC_STORAGE udi_hid_con_report_desc_t udi_hid_con_report_desc = { + { + 0x06, 0x31, 0xFF, // Vendor Page (PJRC Teensy compatible) + 0x09, 0x74, // Vendor Usage (PJRC Teensy compatible) + 0xA1, 0x01, // Collection (Application) + 0x09, 0x75, // Usage (Vendor) + 0x15, 0x00, // Logical Minimum (0x00) + 0x26, 0xFF, 0x00, // Logical Maximum (0x00FF) + 0x95, CONSOLE_EPSIZE, // Report Count + 0x75, 0x08, // Report Size (8) + 0x81, 0x02, // Input (Data) + 0x09, 0x76, // Usage (Vendor) + 0x15, 0x00, // Logical Minimum (0x00) + 0x26, 0xFF, 0x00, // Logical Maximum (0x00FF) + 0x95, CONSOLE_EPSIZE, // Report Count + 0x75, 0x08, // Report Size (8) + 0x91, 0x02, // Output (Data) + 0xC0, // End Collection + } +}; + +static bool udi_hid_con_setreport(void); +static void udi_hid_con_setreport_valid(void); + +static void udi_hid_con_report_sent(udd_ep_status_t status, iram_size_t nb_sent, udd_ep_id_t ep); + +bool udi_hid_con_enable(void) +{ + // Initialize internal values + udi_hid_con_rate = 0; + udi_hid_con_protocol = 0; + udi_hid_con_b_report_trans_ongoing = false; + memset(udi_hid_con_report, 0, UDI_HID_CON_REPORT_SIZE); + udi_hid_con_b_report_valid = false; + return UDI_HID_CON_ENABLE_EXT(); +} + +void udi_hid_con_disable(void) +{ + UDI_HID_CON_DISABLE_EXT(); +} + +bool udi_hid_con_setup(void) +{ + return udi_hid_setup(&udi_hid_con_rate, + &udi_hid_con_protocol, + (uint8_t *) &udi_hid_con_report_desc, + udi_hid_con_setreport); +} + +uint8_t udi_hid_con_getsetting(void) +{ + return 0; +} + +static bool udi_hid_con_setreport(void) +{ + if ((USB_HID_REPORT_TYPE_OUTPUT == (udd_g_ctrlreq.req.wValue >> 8)) + && (0 == (0xFF & udd_g_ctrlreq.req.wValue)) + && (UDI_HID_CON_REPORT_SIZE == udd_g_ctrlreq.req.wLength)) { + udd_g_ctrlreq.payload = udi_hid_con_report_set; + udd_g_ctrlreq.callback = udi_hid_con_setreport_valid; + udd_g_ctrlreq.payload_size = UDI_HID_CON_REPORT_SIZE; + return true; + } + return false; +} + +bool udi_hid_con_send_report(void) +{ + if (!main_b_con_enable) { + return false; + } + + if (udi_hid_con_b_report_trans_ongoing) { + return false; + } + + memcpy(udi_hid_con_report_trans, udi_hid_con_report,UDI_HID_CON_REPORT_SIZE); + udi_hid_con_b_report_valid = false; + udi_hid_con_b_report_trans_ongoing = + udd_ep_run(UDI_HID_CON_EP_IN | USB_EP_DIR_IN, + false, + udi_hid_con_report_trans, + UDI_HID_CON_REPORT_SIZE, + udi_hid_con_report_sent); + + return udi_hid_con_b_report_trans_ongoing; +} + +static void udi_hid_con_report_sent(udd_ep_status_t status, iram_size_t nb_sent, udd_ep_id_t ep) +{ + UNUSED(status); + UNUSED(nb_sent); + UNUSED(ep); + udi_hid_con_b_report_trans_ongoing = false; + if (udi_hid_con_b_report_valid) { + udi_hid_con_send_report(); + } +} + +static void udi_hid_con_setreport_valid(void) +{ + +} + +#endif //CON diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h index babfdb7a78da..e442919a9b6d 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h @@ -85,6 +85,17 @@ extern uint8_t udi_hid_exk_report_set; bool udi_hid_exk_send_report(void); #endif //EXK +//******************************************************************************************** +// CON Console +//******************************************************************************************** +#ifdef CON +extern UDC_DESC_STORAGE udi_api_t udi_api_hid_con; +extern bool udi_hid_con_b_report_valid; +extern uint8_t udi_hid_con_report_set[UDI_HID_CON_REPORT_SIZE]; +extern volatile bool udi_hid_con_b_report_trans_ongoing; +bool udi_hid_con_send_report(void); +#endif //CON + //******************************************************************************************** // MOU Mouse //******************************************************************************************** diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_desc.c b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_desc.c index 16bd4e514cc1..2d6e35e254e2 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_desc.c +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_desc.c @@ -134,6 +134,9 @@ UDC_DESC_STORAGE udc_desc_t udc_desc = { #ifdef EXK .hid_exk = UDI_HID_EXK_DESC, #endif +#ifdef CON + .hid_con = UDI_HID_CON_DESC, +#endif #ifdef NKRO .hid_nkro = UDI_HID_NKRO_DESC, #endif @@ -155,6 +158,9 @@ UDC_DESC_STORAGE udi_api_t *udi_apis[USB_DEVICE_NB_INTERFACE] = { #ifdef EXK &udi_api_hid_exk, #endif + #ifdef CON + &udi_api_hid_con, + #endif #ifdef NKRO &udi_api_hid_nkro, #endif diff --git a/tmk_core/protocol/arm_atsam/usb/usb_main.h b/tmk_core/protocol/arm_atsam/usb/usb_main.h index b7adaa1a7269..76ced474dc22 100644 --- a/tmk_core/protocol/arm_atsam/usb/usb_main.h +++ b/tmk_core/protocol/arm_atsam/usb/usb_main.h @@ -82,6 +82,12 @@ bool main_exk_enable(void); void main_exk_disable(void); #endif //EXK +#ifdef CON +extern volatile bool main_b_con_enable; +bool main_con_enable(void); +void main_con_disable(void); +#endif //CON + #ifdef MOU extern volatile bool main_b_mou_enable; bool main_mou_enable(void); From 79bff502471d8fd534e9266954a184aa0f7d55c3 Mon Sep 17 00:00:00 2001 From: MakotoKurauchi Date: Thu, 11 Oct 2018 04:53:18 +0900 Subject: [PATCH 158/505] Keymaps: Helix rgblight mode update (#4091) * Helix each keymap's using rgblight mode symbol instead magic number No change in build result. * Helix pico keymaps: make rgblight modes selectable. No change in build result. * Helix rev2 keymaps: make rgblight modes selectable. No change in build result. * fixed Helix froggy/keymap.c: invalid rgblight mode value 0 to 1 (=RGBLIGHT_MODE_STATIC_LIGHT) * Deselect RGB_TEST and ALTERNATING in Helix rev2,pico keymaps config.h. --- keyboards/helix/pico/keymaps/biacco/config.h | 14 ++++++++++++++ keyboards/helix/pico/keymaps/biacco/rules.mk | 2 +- keyboards/helix/pico/keymaps/default/config.h | 15 +++++++++++++++ keyboards/helix/pico/keymaps/default/keymap.c | 4 ++-- keyboards/helix/pico/keymaps/default/rules.mk | 2 +- .../helix/rev1/keymaps/OLED_sample/keymap.c | 4 ++-- keyboards/helix/rev2/keymaps/default/config.h | 18 +++++++++++++++--- keyboards/helix/rev2/keymaps/default/keymap.c | 4 ++-- keyboards/helix/rev2/keymaps/default/rules.mk | 2 +- .../helix/rev2/keymaps/edvorakjp/config.h | 18 +++++++++++++++--- .../helix/rev2/keymaps/edvorakjp/keymap.c | 4 ++-- .../helix/rev2/keymaps/edvorakjp/rules.mk | 2 +- .../helix/rev2/keymaps/five_rows_jis/config.h | 18 +++++++++++++++--- .../helix/rev2/keymaps/five_rows_jis/rules.mk | 2 +- keyboards/helix/rev2/keymaps/froggy/config.h | 18 +++++++++++++++--- keyboards/helix/rev2/keymaps/froggy/keymap.c | 8 ++++---- keyboards/helix/rev2/keymaps/froggy/rules.mk | 2 +- keyboards/helix/rev2/keymaps/yshrsmz/config.h | 15 +++++++++++++++ keyboards/helix/rev2/keymaps/yshrsmz/keymap.c | 6 +++--- keyboards/helix/rev2/keymaps/yshrsmz/rules.mk | 2 +- 20 files changed, 126 insertions(+), 34 deletions(-) diff --git a/keyboards/helix/pico/keymaps/biacco/config.h b/keyboards/helix/pico/keymaps/biacco/config.h index 776eecfb646b..7653185198bc 100644 --- a/keyboards/helix/pico/keymaps/biacco/config.h +++ b/keyboards/helix/pico/keymaps/biacco/config.h @@ -27,3 +27,17 @@ along with this program. If not, see . #define AUDIO_CLICKY #endif +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif diff --git a/keyboards/helix/pico/keymaps/biacco/rules.mk b/keyboards/helix/pico/keymaps/biacco/rules.mk index 0a720002d78b..4f264fa952dc 100644 --- a/keyboards/helix/pico/keymaps/biacco/rules.mk +++ b/keyboards/helix/pico/keymaps/biacco/rules.mk @@ -92,7 +92,7 @@ ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) endif ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS endif ifeq ($(strip $(OLED_ENABLE)), yes) diff --git a/keyboards/helix/pico/keymaps/default/config.h b/keyboards/helix/pico/keymaps/default/config.h index 6084b0970bd5..20dfc9f9858c 100644 --- a/keyboards/helix/pico/keymaps/default/config.h +++ b/keyboards/helix/pico/keymaps/default/config.h @@ -28,4 +28,19 @@ along with this program. If not, see . #define AUDIO_CLICKY #endif +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif + #endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/pico/keymaps/default/keymap.c b/keyboards/helix/pico/keymaps/default/keymap.c index 75221d485a9c..4c5878517926 100644 --- a/keyboards/helix/pico/keymaps/default/keymap.c +++ b/keyboards/helix/pico/keymaps/default/keymap.c @@ -238,7 +238,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } else { TOG_STATUS = !TOG_STATUS; #ifdef RGBLIGHT_ENABLE - //rgblight_mode(16); + //rgblight_mode(RGBLIGHT_MODE_SNAKE + 1); #endif } layer_on(_LOWER); @@ -261,7 +261,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } else { TOG_STATUS = !TOG_STATUS; #ifdef RGBLIGHT_ENABLE - //rgblight_mode(15); + //rgblight_mode(RGBLIGHT_MODE_SNAKE); #endif } layer_on(_RAISE); diff --git a/keyboards/helix/pico/keymaps/default/rules.mk b/keyboards/helix/pico/keymaps/default/rules.mk index afb1240685d4..b1e219537f4a 100644 --- a/keyboards/helix/pico/keymaps/default/rules.mk +++ b/keyboards/helix/pico/keymaps/default/rules.mk @@ -92,7 +92,7 @@ ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) endif ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS endif ifeq ($(strip $(OLED_ENABLE)), yes) diff --git a/keyboards/helix/rev1/keymaps/OLED_sample/keymap.c b/keyboards/helix/rev1/keymaps/OLED_sample/keymap.c index fa51501e6297..9b81979ff426 100644 --- a/keyboards/helix/rev1/keymaps/OLED_sample/keymap.c +++ b/keyboards/helix/rev1/keymaps/OLED_sample/keymap.c @@ -368,7 +368,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { 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); + rgblight_mode(RGBLIGHT_MODE_SNAKE + 1); } layer_on(_LOWER); update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); @@ -387,7 +387,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { 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); + rgblight_mode(RGBLIGHT_MODE_SNAKE); } layer_on(_RAISE); update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); diff --git a/keyboards/helix/rev2/keymaps/default/config.h b/keyboards/helix/rev2/keymaps/default/config.h index 185e6783856e..ed376757942f 100644 --- a/keyboards/helix/rev2/keymaps/default/config.h +++ b/keyboards/helix/rev2/keymaps/default/config.h @@ -21,9 +21,21 @@ along with this program. If not, see . #ifndef CONFIG_USER_H #define CONFIG_USER_H -// if you need more program area, try uncomment follow line -//#include "serial_config_simpleapi.h" - // place overrides here +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif + #endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/rev2/keymaps/default/keymap.c b/keyboards/helix/rev2/keymaps/default/keymap.c index 087bd8e517ff..92393208ce60 100644 --- a/keyboards/helix/rev2/keymaps/default/keymap.c +++ b/keyboards/helix/rev2/keymaps/default/keymap.c @@ -373,7 +373,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } else { TOG_STATUS = !TOG_STATUS; #ifdef RGBLIGHT_ENABLE - //rgblight_mode(16); + //rgblight_mode(RGBLIGHT_MODE_SNAKE + 1); #endif } layer_on(_LOWER); @@ -396,7 +396,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } else { TOG_STATUS = !TOG_STATUS; #ifdef RGBLIGHT_ENABLE - //rgblight_mode(15); + //rgblight_mode(RGBLIGHT_MODE_SNAKE); #endif } layer_on(_RAISE); diff --git a/keyboards/helix/rev2/keymaps/default/rules.mk b/keyboards/helix/rev2/keymaps/default/rules.mk index 5340a74ba2d0..14c353d507f1 100644 --- a/keyboards/helix/rev2/keymaps/default/rules.mk +++ b/keyboards/helix/rev2/keymaps/default/rules.mk @@ -100,7 +100,7 @@ ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) endif ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS endif ifeq ($(strip $(OLED_ENABLE)), yes) diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/config.h b/keyboards/helix/rev2/keymaps/edvorakjp/config.h index ead31605b248..643220383c5a 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/config.h +++ b/keyboards/helix/rev2/keymaps/edvorakjp/config.h @@ -1,11 +1,23 @@ #ifndef CONFIG_USER_H #define CONFIG_USER_H -// if you need more program area, try uncomment follow line -//#include "serial_config_simpleapi.h" - #undef TAPPING_FORCE_HOLD #undef TAPPING_TERM #define TAPPING_TERM 120 +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif + #endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/keymap.c b/keyboards/helix/rev2/keymaps/edvorakjp/keymap.c index 650a39115a36..22940f7cbe51 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/keymap.c +++ b/keyboards/helix/rev2/keymaps/edvorakjp/keymap.c @@ -35,7 +35,7 @@ void matrix_scan_user(void) { #ifdef RGBLIGHT_ENABLE uint32_t layer_state_set_keymap(uint32_t state) { - rgblight_mode_noeeprom(1); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); switch (biton32(state)) { case _EDVORAKJ1: case _EDVORAKJ2: @@ -52,7 +52,7 @@ uint32_t layer_state_set_keymap(uint32_t state) { rgblight_sethsv_noeeprom_green(); break; default: // for any other layers, or the default layer - rgblight_mode_noeeprom(28); + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT + 3); rgblight_sethsv_noeeprom_red(); break; } diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/rules.mk b/keyboards/helix/rev2/keymaps/edvorakjp/rules.mk index 67da9c370b93..9bd46fabcfc2 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/rules.mk +++ b/keyboards/helix/rev2/keymaps/edvorakjp/rules.mk @@ -102,7 +102,7 @@ ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) endif ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS endif ifeq ($(strip $(OLED_ENABLE)), yes) diff --git a/keyboards/helix/rev2/keymaps/five_rows_jis/config.h b/keyboards/helix/rev2/keymaps/five_rows_jis/config.h index c380b7db4e26..97494c937f00 100644 --- a/keyboards/helix/rev2/keymaps/five_rows_jis/config.h +++ b/keyboards/helix/rev2/keymaps/five_rows_jis/config.h @@ -23,9 +23,6 @@ along with this program. If not, see . // place overrides here -// if you need more program area, try uncomment follow line -//#include "serial_config_simpleapi.h" - #ifdef MOUSEKEY_ENABLE #undef MOUSEKEY_INTERVAL #define MOUSEKEY_INTERVAL 0 @@ -43,4 +40,19 @@ along with this program. If not, see . #define MOUSEKEY_DELAY 0 #endif +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif + #endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk b/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk index 5340a74ba2d0..14c353d507f1 100644 --- a/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk +++ b/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk @@ -100,7 +100,7 @@ ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) endif ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS endif ifeq ($(strip $(OLED_ENABLE)), yes) diff --git a/keyboards/helix/rev2/keymaps/froggy/config.h b/keyboards/helix/rev2/keymaps/froggy/config.h index dad248303471..517368ae941d 100644 --- a/keyboards/helix/rev2/keymaps/froggy/config.h +++ b/keyboards/helix/rev2/keymaps/froggy/config.h @@ -21,12 +21,24 @@ along with this program. If not, see . #ifndef CONFIG_USER_H #define CONFIG_USER_H -// if you need more program area, try uncomment follow line -//#include "serial_config_simpleapi.h" - #undef TAPPING_TERM #define TAPPING_TERM 200 #define ONESHOT_TAP_TOGGLE 5 /* Tapping this number of times holds the key until tapped this number of times again. */ #define ONESHOT_TIMEOUT 5000 /* Time (in ms) before the one shot key is released */ +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif + #endif /* CONFIG_USER_H */ diff --git a/keyboards/helix/rev2/keymaps/froggy/keymap.c b/keyboards/helix/rev2/keymaps/froggy/keymap.c index 81a28dfa5d85..75c6f0811427 100644 --- a/keyboards/helix/rev2/keymaps/froggy/keymap.c +++ b/keyboards/helix/rev2/keymaps/froggy/keymap.c @@ -399,7 +399,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #ifdef RGBLIGHT_ENABLE if (record->event.pressed) { RGBAnimation = true; - rgblight_mode(6); + rgblight_mode(RGBLIGHT_MODE_RAINBOW_MOOD); RGB_current_mode = rgblight_config.mode; } #endif @@ -408,7 +408,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #ifdef RGBLIGHT_ENABLE if (record->event.pressed) { RGBAnimation = true; - rgblight_mode(10); + rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 1); RGB_current_mode = rgblight_config.mode; } #endif @@ -417,7 +417,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #ifdef RGBLIGHT_ENABLE if (record->event.pressed) { RGBAnimation = true; - rgblight_mode(21); + rgblight_mode(RGBLIGHT_MODE_KNIGHT); RGB_current_mode = rgblight_config.mode; } #endif @@ -508,7 +508,7 @@ void led_ripple_effect(char r, char g, char b) { if (scan_count == -1) { rgblight_enable_noeeprom(); - rgblight_mode(0); + rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); } else if (scan_count >= 0 && scan_count < 5) { for (unsigned char c=keybuf_begin; c!=keybuf_end; c++) { int i = c; diff --git a/keyboards/helix/rev2/keymaps/froggy/rules.mk b/keyboards/helix/rev2/keymaps/froggy/rules.mk index aa979641347d..e52e4a37362e 100644 --- a/keyboards/helix/rev2/keymaps/froggy/rules.mk +++ b/keyboards/helix/rev2/keymaps/froggy/rules.mk @@ -100,7 +100,7 @@ ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) endif ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS endif ifeq ($(strip $(OLED_ENABLE)), yes) diff --git a/keyboards/helix/rev2/keymaps/yshrsmz/config.h b/keyboards/helix/rev2/keymaps/yshrsmz/config.h index a1cd126eef55..d70f23c3e314 100644 --- a/keyboards/helix/rev2/keymaps/yshrsmz/config.h +++ b/keyboards/helix/rev2/keymaps/yshrsmz/config.h @@ -21,3 +21,18 @@ along with this program. If not, see . /* auto shift config */ #define AUTO_SHIFT_TIMEOUT 150 + +// If you need more program area, try select and reduce rgblight modes to use. + +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif diff --git a/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c b/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c index cce28796e672..049a864c1ad0 100644 --- a/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c +++ b/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c @@ -312,7 +312,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } else { TOG_STATUS = !TOG_STATUS; #ifdef RGBLIGHT_ENABLE - //rgblight_mode(16); + //rgblight_mode(RGBLIGHT_MODE_SNAKE + 1); #endif } layer_on(_LOWER); @@ -335,7 +335,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } else { TOG_STATUS = !TOG_STATUS; #ifdef RGBLIGHT_ENABLE - //rgblight_mode(15); + //rgblight_mode(RGBLIGHT_MODE_SNAKE); #endif } layer_on(_RAISE); @@ -450,7 +450,7 @@ void music_scale_user(void) // hook point for 'led_test' keymap // 'default' keymap's led_test_init() is empty function, do nothing -// 'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(35); +// 'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(RGBLIGHT_MODE_RGB_TEST); __attribute__ ((weak)) void led_test_init(void) {} diff --git a/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk b/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk index da439dc9b521..8331a2e1d8cb 100644 --- a/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk +++ b/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk @@ -99,7 +99,7 @@ ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) endif ifeq ($(strip $(LED_ANIMATIONS)), yes) - OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS endif ifeq ($(strip $(OLED_ENABLE)), yes) From 7d156263ab81ff960adab6b80134f5202df67048 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 10 Oct 2018 12:56:45 -0700 Subject: [PATCH 159/505] Orange75: cleanup and Configurator support update (#4101) * Orange75: cleanup and Configurator support update `orange75.h`: Moved `K014` to the second (number row) as the left half of a split Backspace (guessing at its true location; will need to be checked/tested after merge). `info.json`: Updated to match new `LAYOUT` macro. `keymaps/default/keymap.c`: - Updated to match new `LAYOUT` macro. - Added layer mock-ups as block comments. - Formatted to be a bit more readable. * Orange75: deleted an extra comma from keymap.c --- keyboards/orange75/info.json | 98 +++++++++++++++++++-- keyboards/orange75/keymaps/default/keymap.c | 56 +++++++++--- keyboards/orange75/orange75.h | 12 +-- 3 files changed, 141 insertions(+), 25 deletions(-) diff --git a/keyboards/orange75/info.json b/keyboards/orange75/info.json index 093b4cd4ec40..e6a70c102185 100644 --- a/keyboards/orange75/info.json +++ b/keyboards/orange75/info.json @@ -1,12 +1,96 @@ { - "keyboard_name": "Orange75", - "url": "", - "maintainer": "qmk", - "width": 16, - "height": 6.25, + "keyboard_name": "Orange75", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 6.25, "layouts": { "LAYOUT": { - "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":2, "y":0}, {"label":"F2", "x":3, "y":0}, {"label":"F3", "x":4, "y":0}, {"label":"F4", "x":5, "y":0}, {"label":"F5", "x":6.5, "y":0}, {"label":"F6", "x":7.5, "y":0}, {"label":"F7", "x":8.5, "y":0}, {"label":"F8", "x":9.5, "y":0}, {"label":"F9", "x":11, "y":0}, {"label":"F10", "x":12, "y":0}, {"label":"F11", "x":13, "y":0}, {"label":"F12", "x":14, "y":0}, {"label":"~", "x":0, "y":1.25}, {"label":"!", "x":1, "y":1.25}, {"label":"@", "x":2, "y":1.25}, {"label":"#", "x":3, "y":1.25}, {"label":"$", "x":4, "y":1.25}, {"label":"%", "x":5, "y":1.25}, {"label":"^", "x":6, "y":1.25}, {"label":"&", "x":7, "y":1.25}, {"label":"*", "x":8, "y":1.25}, {"label":"(", "x":9, "y":1.25}, {"label":")", "x":10, "y":1.25}, {"label":"_", "x":11, "y":1.25}, {"label":"+", "x":12, "y":1.25}, {"label":"Backspace", "x":13, "y":1.25, "w":2}, {"label":"Home", "x":15, "y":1.25}, {"label":"Tab", "x":0, "y":2.25, "w":1.5}, {"label":"Q", "x":1.5, "y":2.25}, {"label":"W", "x":2.5, "y":2.25}, {"label":"E", "x":3.5, "y":2.25}, {"label":"R", "x":4.5, "y":2.25}, {"label":"T", "x":5.5, "y":2.25}, {"label":"Y", "x":6.5, "y":2.25}, {"label":"U", "x":7.5, "y":2.25}, {"label":"I", "x":8.5, "y":2.25}, {"label":"O", "x":9.5, "y":2.25}, {"label":"P", "x":10.5, "y":2.25}, {"label":"{", "x":11.5, "y":2.25}, {"label":"}", "x":12.5, "y":2.25}, {"label":"|", "x":13.5, "y":2.25, "w":1.5}, {"label":"End", "x":15, "y":2.25}, {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, {"label":"A", "x":1.75, "y":3.25}, {"label":"S", "x":2.75, "y":3.25}, {"label":"D", "x":3.75, "y":3.25}, {"label":"F", "x":4.75, "y":3.25}, {"label":"G", "x":5.75, "y":3.25}, {"label":"H", "x":6.75, "y":3.25}, {"label":"J", "x":7.75, "y":3.25}, {"label":"K", "x":8.75, "y":3.25}, {"label":"L", "x":9.75, "y":3.25}, {"label":":", "x":10.75, "y":3.25}, {"label":"\"", "x":11.75, "y":3.25}, {"label":"Enter", "x":12.75, "y":3.25, "w":2.25}, {"label":"Page Up", "x":15, "y":3.25}, {"label":"Shift", "x":0, "y":4.25, "w":2.25}, {"label":"Z", "x":2.25, "y":4.25}, {"label":"X", "x":3.25, "y":4.25}, {"label":"C", "x":4.25, "y":4.25}, {"label":"V", "x":5.25, "y":4.25}, {"label":"B", "x":6.25, "y":4.25}, {"label":"N", "x":7.25, "y":4.25}, {"label":"M", "x":8.25, "y":4.25}, {"label":"<", "x":9.25, "y":4.25}, {"label":">", "x":10.25, "y":4.25}, {"label":"?", "x":11.25, "y":4.25}, {"label":"Shift", "x":12.25, "y":4.25, "w":1.75}, {"label":"Up", "x":14, "y":4.25}, {"label":"Page Down", "x":15, "y":4.25}, {"label":"Ctrl", "x":0, "y":5.25, "w":1.25}, {"label":"Win", "x":1.25, "y":5.25, "w":1.25}, {"label":"Alt", "x":2.5, "y":5.25, "w":1.25}, {"x":3.75, "y":5.25, "w":6.25}, {"label":"Alt", "x":10, "y":5.25, "w":1.25}, {"label":"Fn", "x":11.25, "y":5.25, "w":1.25}, {"label":"Left", "x":13, "y":5.25}, {"label":"Down", "x":14, "y":5.25}, {"label":"Right", "x":15, "y":5.25}] + "key_count": 82, + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"`", "x":0, "y":1.25}, + {"label":"1", "x":1, "y":1.25}, + {"label":"2", "x":2, "y":1.25}, + {"label":"3", "x":3, "y":1.25}, + {"label":"4", "x":4, "y":1.25}, + {"label":"5", "x":5, "y":1.25}, + {"label":"6", "x":6, "y":1.25}, + {"label":"7", "x":7, "y":1.25}, + {"label":"8", "x":8, "y":1.25}, + {"label":"9", "x":9, "y":1.25}, + {"label":"0", "x":10, "y":1.25}, + {"label":"-", "x":11, "y":1.25}, + {"label":"=", "x":12, "y":1.25}, + {"label":"Delete", "x":13, "y":1.25}, + {"label":"Back Space", "x":14, "y":1.25}, + {"label":"Home", "x":15, "y":1.25}, + {"label":"Tab", "x":0, "y":2.25, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.25}, + {"label":"W", "x":2.5, "y":2.25}, + {"label":"E", "x":3.5, "y":2.25}, + {"label":"R", "x":4.5, "y":2.25}, + {"label":"T", "x":5.5, "y":2.25}, + {"label":"Y", "x":6.5, "y":2.25}, + {"label":"U", "x":7.5, "y":2.25}, + {"label":"I", "x":8.5, "y":2.25}, + {"label":"O", "x":9.5, "y":2.25}, + {"label":"P", "x":10.5, "y":2.25}, + {"label":"[", "x":11.5, "y":2.25}, + {"label":"]", "x":12.5, "y":2.25}, + {"label":"\\", "x":13.5, "y":2.25, "w":1.5}, + {"label":"End", "x":15, "y":2.25}, + {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, + {"label":"A", "x":1.75, "y":3.25}, + {"label":"S", "x":2.75, "y":3.25}, + {"label":"D", "x":3.75, "y":3.25}, + {"label":"F", "x":4.75, "y":3.25}, + {"label":"G", "x":5.75, "y":3.25}, + {"label":"H", "x":6.75, "y":3.25}, + {"label":"J", "x":7.75, "y":3.25}, + {"label":"K", "x":8.75, "y":3.25}, + {"label":"L", "x":9.75, "y":3.25}, + {"label":";", "x":10.75, "y":3.25}, + {"label":"'", "x":11.75, "y":3.25}, + {"label":"Enter", "x":12.75, "y":3.25, "w":2.25}, + {"label":"PgUp", "x":15, "y":3.25}, + {"label":"Shift", "x":0, "y":4.25, "w":1.25}, + {"label":"ISO\\", "x":1.25, "y":4.25}, + {"label":"Z", "x":2.25, "y":4.25}, + {"label":"X", "x":3.25, "y":4.25}, + {"label":"C", "x":4.25, "y":4.25}, + {"label":"V", "x":5.25, "y":4.25}, + {"label":"B", "x":6.25, "y":4.25}, + {"label":"N", "x":7.25, "y":4.25}, + {"label":"M", "x":8.25, "y":4.25}, + {"label":",", "x":9.25, "y":4.25}, + {"label":".", "x":10.25, "y":4.25}, + {"label":"/", "x":11.25, "y":4.25}, + {"label":"Shift", "x":12.25, "y":4.25, "w":1.75}, + {"label":"Up", "x":14, "y":4.25}, + {"label":"PgDn", "x":15, "y":4.25}, + {"label":"Ctrl", "x":0, "y":5.25, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5.25, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.25, "w":1.25}, + {"label":"Space", "x":3.75, "y":5.25, "w":6.25}, + {"label":"Alt", "x":10, "y":5.25, "w":1.25}, + {"label":"Fn", "x":11.25, "y":5.25, "w":1.25}, + {"label":"Left", "x":13, "y":5.25}, + {"label":"Down", "x":14, "y":5.25}, + {"label":"Right", "x":15, "y":5.25} + ] } } -} \ No newline at end of file +} diff --git a/keyboards/orange75/keymaps/default/keymap.c b/keyboards/orange75/keymaps/default/keymap.c index 50aaf718eccc..37e198f99c2d 100644 --- a/keyboards/orange75/keymaps/default/keymap.c +++ b/keyboards/orange75/keymaps/default/keymap.c @@ -3,21 +3,53 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * ,---------------------------------------------------------------. + * |Esc|▓▓▓|F1 |F2 |F3 |F4 |▓|F5 |F6 |F7 |F8 |▓|F9 |F10|F11|F12|▓▓▓| + * |---------------------------------------------------------------| + * |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= |Del|Bsp|Hm | + * |---------------------------------------------------------------| + * |Tab |Q |W |E |R |T |Y |U |I |O |P |[ |] |\ |End| + * |---------------------------------------------------------------| + * |Caps |A |S |D |F |G |H |J |K |L |; |' |Enter |PgU| + * |---------------------------------------------------------------| + * |Shft|\ |Z |X |C |V |B |N |M |, |. |/ |Shift |Up |PgD| + * |---------------------------------------------------------------| + * |Ctrl|GUI |Alt |Space |Alt |Fn |▓|Lt |Dn |Rt | + * `---------------------------------------------------------------' + */ LAYOUT( - 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_DEL, - 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_HOME, - 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_END, - 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, LT(1, KC_NO), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_PGDN, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, LT(1, KC_NO), KC_LEFT, KC_DOWN, KC_RGHT), + 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_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_DEL, KC_BSPC, KC_HOME, + 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_END, + 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, LT(1, KC_NO), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_PGDN, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, LT(1, KC_NO), KC_LEFT, KC_DOWN, KC_RGHT + ), + /* + * ,---------------------------------------------------------------. + * |RST|▓▓▓| | | | |▓| | | | |▓| | | | |▓▓▓| + * |---------------------------------------------------------------| + * |` | | | | | | | | | | | | | | |Tog| + * |---------------------------------------------------------------| + * | | | | | | | | | | | | | | |Stp| + * |---------------------------------------------------------------| + * | | | | | | | | | | | | | |BL+| + * |---------------------------------------------------------------| + * | | | | | | | | | | | | | | |BL-| + * |---------------------------------------------------------------| + * | | | | | | |▓| | | | + * `---------------------------------------------------------------' + */ LAYOUT( - RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_TOGG, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_STEP, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_INC, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, - _______, _______, _______, _______, _______, _______, _______, _______, _______) + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_TOGG, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_STEP, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_INC, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, + _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) }; diff --git a/keyboards/orange75/orange75.h b/keyboards/orange75/orange75.h index 1b351a595cc3..a7ddd5a06df4 100644 --- a/keyboards/orange75/orange75.h +++ b/keyboards/orange75/orange75.h @@ -3,12 +3,12 @@ #include "quantum.h" #define LAYOUT( \ - K000, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, \ - K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, \ - K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K314, \ - K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, \ - K500, K501, K502, K506, K510, K511, K512, K513, K514 \ + K000, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K014, K113, K114, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K314, \ + K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, \ + K500, K501, K502, K506, K510, K511, K512, K513, K514 \ ) { \ { K000, K100, K200, K300, K400, K500 }, \ { KC_NO, K101, K201, K301, K401, K501 }, \ From d17421d074402765204c0e7b09007906e91af7dc Mon Sep 17 00:00:00 2001 From: pgillan145 Date: Wed, 10 Oct 2018 15:58:11 -0400 Subject: [PATCH 160/505] Added cheese keymap to tada68. (#4105) * Added cheese keymap to tada68. * Removed extraneous definitions. --- keyboards/tada68/keymaps/cheese/keymap.c | 107 ++++++++++++++++++++++ keyboards/tada68/keymaps/cheese/readme.md | 20 ++++ keyboards/tada68/keymaps/cheese/rules.mk | 18 ++++ 3 files changed, 145 insertions(+) create mode 100755 keyboards/tada68/keymaps/cheese/keymap.c create mode 100755 keyboards/tada68/keymaps/cheese/readme.md create mode 100644 keyboards/tada68/keymaps/cheese/rules.mk diff --git a/keyboards/tada68/keymaps/cheese/keymap.c b/keyboards/tada68/keymaps/cheese/keymap.c new file mode 100755 index 000000000000..b2395282c307 --- /dev/null +++ b/keyboards/tada68/keymaps/cheese/keymap.c @@ -0,0 +1,107 @@ +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _CL 2 +#define _AL 3 + +enum custom_keycodes { + SPX4 = SAFE_RANGE +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch(keycode) { + case SPX4: + SEND_STRING(" "); + return false; + } + } + return true; +}; + +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| [| ]| \ |PgUp| + * |----------------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return |PgDn| + * |----------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|Del | + * |----------------------------------------------------------------| + * |Ctrl|Win |Win | Space |Win| FN|Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + */ +[_BL] = LAYOUT_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_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_PGUP, \ + MO(_CL), 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_PGDN, \ + 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_DEL, \ + KC_LCTL, KC_LALT,LM(_AL,0x08), KC_SPC, LM(_AL,0x18),MO(_FL),KC_RCTRL, KC_LEFT,KC_DOWN,KC_RGHT), + + /* Keymap _FL: Function Layer + * ,----------------------------------------------------------------. + * | | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |` ~ | + * |----------------------------------------------------------------| + * | | |Up | | | | | | | | | | | |Hme | + * |----------------------------------------------------------------| + * | |<- |Dn | ->| | | | | | | | | |End | + * |----------------------------------------------------------------| + * | | | |Bl-|BL |BL+| |MUT|VU-|VU+| | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | + * `----------------------------------------------------------------' + */ +[_FL] = LAYOUT_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_GRV, \ + SPX4,_______, KC_UP,_______,_______, _______,_______,_______,_______,_______,_______,_______,_______, _______,KC_HOME, \ + _______,KC_LEFT,KC_DOWN,KC_RIGHT,_______,_______,_______,_______,_______,_______,_______,_______, _______,KC_END, \ + _______,_______,_______,BL_DEC, BL_TOGG,BL_INC, _______,KC_MUTE,KC_VOLD,KC_VOLU,_______,_______, _______, _______, \ + _______,_______,_______, _______, _______,_______,_______,_______,_______, _______), + + /* Keymap _CL: Caps Layer + * ,----------------------------------------------------------------. + * | | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |` ~ | + * |----------------------------------------------------------------| + * | | |Up | | | | | | | | | | | |Hme | + * |----------------------------------------------------------------| + * | |<- |Dn | ->| | | | | | | | | |End | + * |----------------------------------------------------------------| + * | | | |Bl-|BL |BL+| |MUT|VU-|VU+| | McL|MsU|McR | + * |----------------------------------------------------------------| + * | | | | | | | |MsL|MsD|MsR | + * `----------------------------------------------------------------' + */ +[_CL] = LAYOUT_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_GRV , \ + _______,_______, KC_UP,_______,_______, _______,_______,_______,_______,_______,_______,_______,_______, _______,KC_HOME, \ + _______,KC_LEFT,KC_DOWN,KC_RIGHT,_______,_______,_______,_______,_______,_______,_______,_______, _______,KC_END, \ + _______,_______,_______,BL_DEC, BL_TOGG,BL_INC, _______,KC_MUTE,KC_VOLD,KC_VOLU,_______,KC_BTN1, KC_MS_U, KC_BTN2, \ + _______,_______,_______, _______, _______,_______,_______,KC_MS_L,KC_MS_D, KC_MS_R), + + /* Keymap _AL: ALT Layer + * ,----------------------------------------------------------------. + * |` ~| | | | | | | | | | | | | | ` ~| + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | + * `----------------------------------------------------------------' + */ +[_AL] = LAYOUT_ansi( + KC_GRV, _______ ,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_GRV , \ + _______,_______, _______, _______,_______, _______,_______,_______,_______,_______,_______,_______,_______, _______,_______, \ + _______,_______, _______, _______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______, \ + _______,_______,_______, _______, _______, _______, _______, _______, _______, _______,_______, _______, _______, _______, \ + _______,_______,_______, _______, _______,_______,_______, _______, _______, _______), +}; diff --git a/keyboards/tada68/keymaps/cheese/readme.md b/keyboards/tada68/keymaps/cheese/readme.md new file mode 100755 index 000000000000..8374e469b9c8 --- /dev/null +++ b/keyboards/tada68/keymaps/cheese/readme.md @@ -0,0 +1,20 @@ +# pgillan's Cheese TADA68 layout + +A collection of tweaks to make the keyboard more mac friendly and increase personal usability, +based on the default keymap. + +* Turned the caps-lock into an additional function key so I didn't have to try to hit the + the keys on the right with one hand. +* Moved the arrow/mouse controls to the caps-lock layer from the function layer. +* Swapped the Windows key and Alt keys, I didn't have to do it in OS X. +* Made the escape key work as a backtick when "Alt" is depressed, so I can 1) reverse + direction when I Alt-Tab through current applications, and Alt-Backtick through + open windows. +* Turned the backtick/tilde key into another backspace key, so I can just go all the way + up to the corner without overshooting. +* Adjusted the volume controles so M is "mute", the "," ( or "<") is "down", and "." (or ">") + is "up". It just makes a ton more sense, I have no idea why it would have been done any + differently. +* Moved PageUp/PageDown up above the delete key, and made the Home and End on the capslock + and function layers. +* Made the tab key on the function layer output 4 spaces instead of a tab character. diff --git a/keyboards/tada68/keymaps/cheese/rules.mk b/keyboards/tada68/keymaps/cheese/rules.mk new file mode 100644 index 000000000000..fdbd25ea80fe --- /dev/null +++ b/keyboards/tada68/keymaps/cheese/rules.mk @@ -0,0 +1,18 @@ +# 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 + From 0e142138aa5c4daa3f113f5a402060cde3efdea9 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Tue, 9 Oct 2018 01:21:38 -0700 Subject: [PATCH 161/505] evil80: Add readme.md file --- keyboards/evil80/readme.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 keyboards/evil80/readme.md diff --git a/keyboards/evil80/readme.md b/keyboards/evil80/readme.md new file mode 100644 index 000000000000..bc21855eba2c --- /dev/null +++ b/keyboards/evil80/readme.md @@ -0,0 +1,15 @@ +# Evil 80 + +![Evil 80](https://i.imgur.com/f5dKuML.jpg) + +Also known as the Odyssey, the Evil 80 is a QMK-powered aluminum TKL keyboard featuring an Aviator connector cable. Sold via a Geekhack group buy in January of 2018. + +Keyboard Maintainer: [The QMK Community](https://github.com/qmk) +Hardware Supported: Evil 80-Odyssey QMK version +Hardware Availability: [Geekhack](https://geekhack.org/index.php?topic=93434.0) + +Make example for this keyboard (after setting up your build environment): + + make evil80:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). From 6c55e8cab5a1cc43c0c024344727ceb243d98f5a Mon Sep 17 00:00:00 2001 From: Boris Burger Date: Wed, 10 Oct 2018 23:17:42 +0200 Subject: [PATCH 162/505] Keymap: DZ60 layout based on stephengrier's with PgUp/PgDn/Home/End, Insert, etc. (#4110) * DZ60 layout based on stephengrier's with customisations. * CapsLock is used as Fn key. * Del is available as Fn+Backspace & Shift+Backspace (using a macro) * PgUp / PgDn / Home / End = Fn+Arrows (as on macOS, Microsoft Surface) * Tilde = Shift+Esc * Backtick = Fn+Esc * Underglow toggle and mode selection are available as Fn+Q and Fn+W * Reset (bootloader mode) = Fn+B * Standardised layout formatting and Ctrl+Del & Shift+Del support. Using 7 underscores for KC_TRNS in layouts and aligning the keycodes according to LAYOUT_directional. Del is now only Fn+Del, Ctrl+Backspace translates to Ctrl+Del, Shift+Backspace translates to Shift+Del. * Documented new Backspace/Del related macros. Del is now just Fn+Backspace, pressing Ctrl+Backspace sends Ctrl+Del, pressing Shift+Backspace sends Shift+Del --- keyboards/dz60/keymaps/boris_burger/README.md | 52 +++++++++++ keyboards/dz60/keymaps/boris_burger/config.h | 1 + keyboards/dz60/keymaps/boris_burger/keymap.c | 87 +++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 keyboards/dz60/keymaps/boris_burger/README.md create mode 100644 keyboards/dz60/keymaps/boris_burger/config.h create mode 100644 keyboards/dz60/keymaps/boris_burger/keymap.c diff --git a/keyboards/dz60/keymaps/boris_burger/README.md b/keyboards/dz60/keymaps/boris_burger/README.md new file mode 100644 index 000000000000..64062f823a05 --- /dev/null +++ b/keyboards/dz60/keymaps/boris_burger/README.md @@ -0,0 +1,52 @@ +### boris_burger's DZ60 layout + +This layout is for a DZ60 with a 2U left shift, 1U right shift and an arrow cluster in +the bottom right. + +It is based off stephengrier's layout adding support for Home/End/PgUp/PgDn using Fn+arrows +as used on macOS and Microsoft Surface. It has Insert instead of Fn near the arrow cluster +and other smaller tweaks: +- CapsLock is the only Fn key (CapsLock by itself is not available) +- Del is available as Fn+Backspace +- Ctrl+Del is available as Ctrl+Backspace (e.g. deleting word to the right of the cursor) +- Shift+Del is available as Shift+Backspace (e.g. permanently deleting file or e-mail) +- PgUp = Fn+Up +- PgDn = Fn+Down +- Home = Fn+Left +- End = Fn+Right +- Tilde = Shift+Esc +- Backtick = Fn+Esc +- Underglow toggle and mode selection are available as Fn+Q and Fn+W +- Reset (bootloader mode) = Fn+B + +### 0 Qwerty +``` +,-----------------------------------------------------------------------------------------. +| Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc | +|-----------------------------------------------------------------------------------------+ +| Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | +|-----------------------------------------------------------------------------------------+ +| Fn | A | S | D | F | G | H | J | K | L | ; | ' | Enter | +|-----------------------------------------------------------------------------------------+ +| Shift | Z | X | C | V | B | N | M | , | . | / | RSh | U | Ins | +|-----------------------------------------------------------------------------------------+ +| Ctrl | Win | Alt | Space | Alt | Menu | L | D | R | +`-----------------------------------------------------------------------------------------' +``` + +### 1 Fn Layer +``` +FN Layer +,-----------------------------------------------------------------------------------------. +| ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | +|-----------------------------------------------------------------------------------------+ +| |RBB T|RGB M| Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | +|-----------------------------------------------------------------------------------------+ +| | BL T| BL M| BL+ | BL- | | | | | | | | | +|-----------------------------------------------------------------------------------------+ +| | | | | |RESET| | | | | | | PgUp| | +|-----------------------------------------------------------------------------------------+ +| | | | | | | Home| PgDn| End | +`-----------------------------------------------------------------------------------------' +``` + diff --git a/keyboards/dz60/keymaps/boris_burger/config.h b/keyboards/dz60/keymaps/boris_burger/config.h new file mode 100644 index 000000000000..9560d51a6f94 --- /dev/null +++ b/keyboards/dz60/keymaps/boris_burger/config.h @@ -0,0 +1 @@ +#define GRAVE_ESC_GUI_OVERRIDE # Always send Escape if GUI is pressed diff --git a/keyboards/dz60/keymaps/boris_burger/keymap.c b/keyboards/dz60/keymaps/boris_burger/keymap.c new file mode 100644 index 000000000000..5dcadf34c158 --- /dev/null +++ b/keyboards/dz60/keymaps/boris_burger/keymap.c @@ -0,0 +1,87 @@ +#include QMK_KEYBOARD_H + +/* Holds state of modifiers when Backspace was pressed. + * Used to ensure that the correct keycode is unregistered when Backspace is released. + */ +static uint8_t bspc_mods = 0; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Qwerty + * ,-----------------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc | + * |-----------------------------------------------------------------------------------------+ + * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + * |-----------------------------------------------------------------------------------------+ + * | Fn | A | S | D | F | G | H | J | K | L | ; | ' | Enter | + * |-----------------------------------------------------------------------------------------+ + * | Shift | Z | X | C | V | B | N | M | , | . | / | RSh | U | Ins | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl | Win | Alt | Space | Alt | Menu | L | D | R | + * `-----------------------------------------------------------------------------------------' + */ + LAYOUT_directional( + KC_GESC, 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, + MO(1) , 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_UP , KC_INS , + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC , KC_SPC , KC_SPC , KC_RALT, KC_RGUI, KC_LEFT, KC_DOWN, KC_RIGHT + ), + + /* FN Layer + * ,-----------------------------------------------------------------------------------------. + * | ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL | + * |-----------------------------------------------------------------------------------------+ + * | |RBB T|RGB M| Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | BL T| BL M| BL+ | BL- | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | |RESET| | | | | | | PgUp| | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | Home| PgDn| End | + * `-----------------------------------------------------------------------------------------' + */ + LAYOUT_directional( + 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 , + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, + _______, BL_TOGG, BL_STEP, BL_INC , BL_DEC , _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, RESET , _______, _______, _______, _______, _______, _______, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END + ), +}; + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch(keycode) { + case KC_BSPC: { + if (record->event.pressed) { + const uint8_t current_mods = get_mods(); + const uint8_t shift = current_mods & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)); + const uint8_t ctrl = current_mods & (MOD_BIT(KC_LCTL)|MOD_BIT(KC_RCTL)); + bspc_mods = current_mods; + if(shift || ctrl) { + add_key(KC_DEL); + add_mods(current_mods); + send_keyboard_report(); + } else { + return true; + } + } + else { + if(bspc_mods & (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)|MOD_BIT(KC_LCTL)|MOD_BIT(KC_RCTL))) { + // if Shift or Ctrl was pressed with Backspace, than that was intepreted as Del, so we need + // to unregister the Del key + del_key(KC_DEL); + } else { + // Either Backspace was pressed without mods, or with a modifier other than Shift or Ctrl + // so it is simply taken as Backspace + del_key(KC_BSPC); + } + send_keyboard_report(); + } + return false; + } + default: + return true; + } +} From 0e4374042c5aef32762637f6fefd4662106bd5af Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 10 Oct 2018 16:32:38 -0700 Subject: [PATCH 163/505] Update and cleanup AVR Hardware docs --- docs/hardware_avr.md | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/docs/hardware_avr.md b/docs/hardware_avr.md index be6932406204..4d81a23d7d88 100644 --- a/docs/hardware_avr.md +++ b/docs/hardware_avr.md @@ -8,7 +8,7 @@ If you have not yet you should read the [Keyboard Guidelines](hardware_keyboard_ QMK has a number of features to simplify working with AVR keyboards. For most keyboards you don't have to write a single line of code. To get started run the `util/new_project.sh` script: -``` +```bash $ util/new_project.sh my_awesome_keyboard ###################################################### # /keyboards/my_awesome_keyboard project created. To start @@ -30,7 +30,7 @@ This is where all the custom logic for your keyboard goes. Many keyboards do not This is the file you define your [Layout Macro(s)](feature_layouts.md) in. At minimum you should have a `#define LAYOUT` for your keyboard that looks something like this: -``` +```c #define LAYOUT( \ k00, k01, k02, \ k10, k11 \ @@ -57,7 +57,7 @@ At the top of the `config.h` you'll find USB related settings. These control how Do change the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` lines to accurately reflect your keyboard. -``` +```c #define VENDOR_ID 0xFEED #define PRODUCT_ID 0x6060 #define DEVICE_VER 0x0001 @@ -72,14 +72,14 @@ Do change the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` lines to accurately r The next section of the `config.h` file deals with your keyboard's matrix. The first thing you should set is the matrix's size. This is usually, but not always, the same number of rows and columns as the physical key arrangement. -``` +```c #define MATRIX_ROWS 2 #define MATRIX_COLS 3 ``` Once you've defined the size of your matrix you need to define which pins on your MCU are connected to rows and columns. To do so simply specify the names of those pins: -``` +```c #define MATRIX_ROW_PINS { D0, D5 } #define MATRIX_COL_PINS { F1, F0, B0 } #define UNUSED_PINS @@ -89,7 +89,7 @@ The number of `MATRIX_ROW_PINS` entries must be the same as the number you assig Finally, you can specify the direction your diodes point. This can be `COL2ROW`, `ROW2COL`, or `CUSTOM_MATRIX`. -``` +```c #define DIODE_DIRECTION COL2ROW ``` @@ -97,16 +97,14 @@ Finally, you can specify the direction your diodes point. This can be `COL2ROW`, By default QMK supports backlighting on pins `B5`, `B6`, and `B7`. If you are using one of those you can simply enable it here. For more details see the [Backlight Documentation](feature_backlight.md). -``` +```c #define BACKLIGHT_PIN B7 #define BACKLIGHT_LEVELS 3 #define BACKLIGHT_BREATHING #define BREATHING_PERIOD 6 ``` -{% hint style='info' %} -You can use backlighting on any pin you like, but you will have to do more work to support that. See the [Backlight Documentation](feature_backlight.md) for more details. -{% endhint %} +?> You can use backlighting on any pin you like, but you will have to do more work to support that. See the [Backlight Documentation](feature_backlight.md) for more details. ### Other Configuration Options @@ -120,7 +118,7 @@ You use the `rules.mk` file to tell QMK what files to build and what features to These options tell the build system what CPU to build for. Be very careful if you change any of these settings, you can render your keyboard inoperable. -``` +```make MCU = atmega32u4 F_CPU = 16000000 ARCH = AVR8 @@ -128,26 +126,26 @@ F_USB = $(F_CPU) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT ``` -### Bootloader Size +### Bootloaders -The bootloader is a special section of your MCU that allows you to upgrade the code stored on the MCU. Think of it like a Rescue Partition for your keyboard. If you are using a teensy 2.0, or a device like the Ergodox EZ that uses the teensy bootloader you should set this to `512`. Most other bootloaders should be set to `4096`, but `1024` and `2048` are other possible values you may encounter. +The bootloader is a special section of your MCU that allows you to upgrade the code stored on the MCU. Think of it like a Rescue Partition for your keyboard. -#### Teensy 2.0 Bootloader Example +#### Teensy Bootloader Example -``` -OPT_DEFS += -DBOOTLOADER_SIZE=512 +```make +BOOTLOADER = halfkay ``` -#### Teensy 2.0++ Bootloader Example +#### Atmel DFU Loader Example -``` -OPT_DEFS += -DBOOTLOADER_SIZE=1024 +```make +BOOTLOADER = atmel-dfu ``` -#### Atmel DFU Loader Example +#### Pro Micro Bootloader Example -``` -OPT_DEFS += -DBOOTLOADER_SIZE=4096 +```make +BOOTLOADER = caterina ``` ### Build Options From 43757cd985153ba4f620336003c20b3554c03678 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 10 Oct 2018 16:10:30 -0700 Subject: [PATCH 164/505] Cleanup learning newb links --- docs/_sidebar.md | 1 + docs/newbs.md | 3 +-- docs/newbs_learn_more_resources.md | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 973428c9e0d2..32e3c7eca078 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -3,6 +3,7 @@ * [Building Your First Firmware](newbs_building_firmware.md) * [Flashing Firmware](newbs_flashing.md) * [Testing and Debugging](newbs_testing_debugging.md) + * [Learning Resources](newbs_learn_more_resources.md) * [QMK Basics](README.md) * [QMK Introduction](getting_started_introduction.md) diff --git a/docs/newbs.md b/docs/newbs.md index 87933b018cef..38a9607d4486 100644 --- a/docs/newbs.md +++ b/docs/newbs.md @@ -6,7 +6,7 @@ Not sure if your keyboard can run QMK? If it's a mechanical keyboard you built y ## Overview -There are 4 main sections to this guide: +There are 5 main sections to this guide: * [Getting Started](newbs_getting_started.md) * [Building Your First Firmware](newbs_building_firmware.md) @@ -15,4 +15,3 @@ There are 4 main sections to this guide: * [Learn More with these Resources](newbs_learn_more_resources.md) This guide is focused on helping someone who has never compiled software before. It makes choices and recommendations based on that viewpoint. There are alternative methods for many of these procedures, and we support most of those alternatives. If you have any doubt about how to accomplish a task you can [ask us for guidance](getting_started_getting_help.md). - diff --git a/docs/newbs_learn_more_resources.md b/docs/newbs_learn_more_resources.md index 69d165c2bb7b..23b99f470fe6 100644 --- a/docs/newbs_learn_more_resources.md +++ b/docs/newbs_learn_more_resources.md @@ -2,12 +2,12 @@ These resources are aimed at giving new members in the qmk community more understanding to the information provided in the newbs docs. Git resources: -* -*[Great General Tutorial](https://www.codecademy.com/learn/learn-git) -*[Git Game To Learn From Examples](https://learngitbranching.js.org/) -*[Git Resources to Learn More About Github](getting_started_github.md) -*[Git Resources Aimed Specificly toward QMK](contributing.md) + +* [Great General Tutorial](https://www.codecademy.com/learn/learn-git) +* [Git Game To Learn From Examples](https://learngitbranching.js.org/) +* [Git Resources to Learn More About Github](getting_started_github.md) +* [Git Resources Aimed Specificly toward QMK](contributing.md) Command Line resources: -*[Good General Tutorial on Command Line](https://www.codecademy.com/learn/learn-the-command-line) \ No newline at end of file +* [Good General Tutorial on Command Line](https://www.codecademy.com/learn/learn-the-command-line) From a7d05820a6258178b7ea440ee2781edf074d8f41 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 10 Oct 2018 12:38:10 -0700 Subject: [PATCH 165/505] Add documentation for Combo feature --- docs/_sidebar.md | 1 + docs/_summary.md | 1 + docs/config_options.md | 6 +++ docs/feature_combo.md | 88 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+) create mode 100644 docs/feature_combo.md diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 32e3c7eca078..56a6463918c0 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -48,6 +48,7 @@ * [Backlight](feature_backlight.md) * [Bluetooth](feature_bluetooth.md) * [Bootmagic](feature_bootmagic.md) + * [Combos](feature_combo) * [Command](feature_command.md) * [Dynamic Macros](feature_dynamic_macros.md) * [Grave Escape](feature_grave_esc.md) diff --git a/docs/_summary.md b/docs/_summary.md index 973428c9e0d2..11aeb7cd36f5 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -47,6 +47,7 @@ * [Backlight](feature_backlight.md) * [Bluetooth](feature_bluetooth.md) * [Bootmagic](feature_bootmagic.md) + * [Combos](feature_combo) * [Command](feature_command.md) * [Dynamic Macros](feature_dynamic_macros.md) * [Grave Escape](feature_grave_esc.md) diff --git a/docs/config_options.md b/docs/config_options.md index 4678a7146c75..19861c9d23c2 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -155,6 +155,10 @@ If you define these options you will enable the associated feature, which may in going to produce the 500 keystrokes a second needed to actually get more than a few ms of delay from this. But if you're doing chording on something with 3-4ms scan times? You probably want this. +* `#define COMBO_COUNT 2` + * Set this to the number of combos that you're using in the [Combo](feature_combo.md) feature. +* `#define COMBO_TERM 200` + * how long for the Combo keys to be detected. Defaults to `TAPPING_TERM` if not defined. ## RGB Light Configuration @@ -234,6 +238,8 @@ Use these to enable or disable building certain features. The more you have enab * Console for debug(+400) * `COMMAND_ENABLE` * Commands for debug and configuration +* `COMBO_ENABLE` + * Key combo feature * `NKRO_ENABLE` * USB N-Key Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work * `AUDIO_ENABLE` diff --git a/docs/feature_combo.md b/docs/feature_combo.md new file mode 100644 index 000000000000..f509e9f33f2b --- /dev/null +++ b/docs/feature_combo.md @@ -0,0 +1,88 @@ +# Combos + +The Combo feature is a chording type solution for adding custom actions. It lets you hit multiple keys at once and produce a different effect. For instance, hitting `A` and `S` within the tapping term would hit `ESC` instead, or have it perform even more complex tasks. + +To enable this feature, yu need to add `COMBO_ENABLE = yes` to your `rules.mk`. + +Additionally, in your `config.h`, you'll need to specify the number of combos that you'll be using, by adding `#define COMBO_COUNT 1` (replacing 1 with the number that you're using). + + +Also, by default, the tapping term for the Combos is set to the same value as `TAPPING_TERM` (200 by default on most boards). But you can specify a different value by defining it in your `config.h`. For instance: `#define COMBO_TERM 300` would set the time out period for combos to 300ms. + +Then, your `keymap.c` file, you'll need to define a sequence of keys, terminated with `COMBO_END`, and a structure to list the combination of keys, and it's resulting action. + +```c +const uint16_t PROGMEM test_combo[] = {KC_A, KC_B, COMBO_END}; +combo_t key_combos[COMBO_COUNT] = {COMBO(test_combo, KC_ESC)}; +``` + +This will send "Escape" if you hit the A and B keys. + +!> This method only supports [basic keycodes](keycodes_basic.md). See the examples for more control. + +## Examples + +If you want to add a list, then you'd use something like this: + +```c +enum combos { + AB_ESC, + JK_TAB +} +const uint16_t PROGMEM ab_combo[] = {KC_A, KC_B, COMBO_END}; +const uint16_t PROGMEM jk_combo[] = {KC_J, KC_K, COMBO_END}; + +combo_t key_combos[COMBO_COUNT] = { + [AB_ESC] = COMBO(ab_combo, KC_ESC), + [JK_TAB] = COMBO(jk_combo, KC_TAB) +}; +``` + +For a more complicated implementation, you can use the `process_combo_event` function to add custom handling. + +```c +enum combo_events { + ZC_COPY, + ZV_PASTE + }; + +const uint16_t PROGMEM copy_combo[] = {KC_Z, KC_C, COMBO_END}; +const uint16_t PROGMEM paste_combo[] = {KC_Z, KC_V, COMBO_END}; + +combo_t key_combos[COMBO_COUNT] = { + [ZC_COPY] = COMBO_ACTION(copy_combo), + [ZV_PASTE] = COMBO_ACTION(paste_combo), +}; + +void process_combo_event(uint8_t combo_index, bool pressed) { + switch(combo_index) { + case ZC_COPY: + if (pressed) { + register_code(KC_LCTL); + register_code(KC_C); + unregister_code(KC_C); + unregister_code(KC_LCTL); + } + break; + + case ZV_PASTE: + if (pressed) { + register_code(KC_LCTL); + register_code(KC_V); + unregister_code(KC_V); + unregister_code(KC_LCTL); + } + break; + } +} +``` + +This will send Ctrl+C if you hit Z and C, and Ctrl+V if you hit Z and V. But you could change this to do stuff like change layers, play sounds, or change settings. + +## Additional Configuration + +If you're using long combos, or even longer combos, you may run into issues with this, as the structure may not be large enough to accommodate what you're doing. + +In this case, you can add either `#define EXTRA_LONG_COMBOS` or `#define EXTRA_EXTRA_LONG_COMBOS` in your `config.h` file. + +You may also be able to enable action keys by defining `COMBO_ALLOW_ACTION_KEYS`. From 8a778d656dc42289b4cc344c8ef0abae2de73eff Mon Sep 17 00:00:00 2001 From: Oscillope Date: Thu, 11 Oct 2018 20:00:17 -0400 Subject: [PATCH 166/505] Keymap: Undo my backlight workaround (#4122) * Update jj40 keymap for easier pgup/pgdn * Backlight problem fixed by a previous commit --- keyboards/jj40/keymaps/oscillope/backlight.c | 60 -------------------- keyboards/jj40/keymaps/oscillope/keymap.c | 4 +- 2 files changed, 2 insertions(+), 62 deletions(-) delete mode 100644 keyboards/jj40/keymaps/oscillope/backlight.c diff --git a/keyboards/jj40/keymaps/oscillope/backlight.c b/keyboards/jj40/keymaps/oscillope/backlight.c deleted file mode 100644 index 14c677cd6cc3..000000000000 --- a/keyboards/jj40/keymaps/oscillope/backlight.c +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Backlighting code for PS2AVRGB boards (ATMEGA32A) - * Kenneth A. (github.com/krusli | krusli.me) - */ - -#include "quantum.h" - -#include -#include - -// Port D: digital pins of the AVR chipset -#define NUMLOCK_PORT (1 << 0) // D0 -#define CAPSLOCK_PORT (1 << 1) // D1 -#define BACKLIGHT_PORT (1 << 4) // D4 -#define SCROLLLOCK_PORT (1 << 6) // D6 - -/** - * References - * Port Registers: https://www.arduino.cc/en/Reference/PortManipulation - * TCCR1A: https://electronics.stackexchange.com/questions/92350/what-is-the-difference-between-tccr1a-and-tccr1b - * Timers: http://www.avrbeginners.net/architecture/timers/timers.html - * 16-bit timer setup: http://sculland.com/ATmega168/Interrupts-And-Timers/16-Bit-Timer-Setup/ - * PS2AVRGB firmware: https://github.com/showjean/ps2avrU/tree/master/firmware - */ - -// @Override -// turn LEDs on and off depending on USB caps/num/scroll lock states. -__attribute__ ((weak)) -void led_set_user(uint8_t usb_led) { -/* It appears that these cause the v1 JJ40 PCB to hang. - * I haven't looked into why, but I don't have any LEDs on my board anyway. */ -#if 0 - if (usb_led & (1 << USB_LED_NUM_LOCK)) { - // turn on - DDRD |= NUMLOCK_PORT; - PORTD |= NUMLOCK_PORT; - } else { - // turn off - DDRD &= ~NUMLOCK_PORT; - PORTD &= ~NUMLOCK_PORT; - } - - if (usb_led & (1 << USB_LED_CAPS_LOCK)) { - DDRD |= CAPSLOCK_PORT; - PORTD |= CAPSLOCK_PORT; - } else { - DDRD &= ~CAPSLOCK_PORT; - PORTD &= ~CAPSLOCK_PORT; - } - - if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { - DDRD |= SCROLLLOCK_PORT; - PORTD |= SCROLLLOCK_PORT; - } else { - DDRD &= ~SCROLLLOCK_PORT; - PORTD &= ~SCROLLLOCK_PORT; - } -#endif -} - diff --git a/keyboards/jj40/keymaps/oscillope/keymap.c b/keyboards/jj40/keymaps/oscillope/keymap.c index 49ceff864c0d..8b30f52c8b70 100644 --- a/keyboards/jj40/keymaps/oscillope/keymap.c +++ b/keyboards/jj40/keymaps/oscillope/keymap.c @@ -62,7 +62,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------------------------------------------------. * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Ins | | | () | [] | {} | Left | Down | Up |Right | | | + * | Ins | | | () | [] | {} | Home | PgDn | PgUp | End | | | * |------+------+------+------+------+------|------+------+------+------+------+------| * |RESET | Back | Fwd | | | | | | Mute | Vol- | Vol+ | | * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -71,7 +71,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_LOWER] = KEYMAP( \ 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, _______, _______, CC_PRN, CC_BRC, CC_CBR, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, \ + KC_INS, _______, _______, CC_PRN, CC_BRC, CC_CBR, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, _______, \ RESET, KC_WBAK, KC_WFWD, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, \ _______, _______, _______, _______, KC_LOCK, _______, _______, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT \ ), From ae489efee4512790e38f173bcd2e2f1e2547da07 Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Thu, 11 Oct 2018 17:00:53 -0700 Subject: [PATCH 167/505] Keymap: Add crd's simple layout (#4117) * Add crd's simple layout * Fix transparent mapping in crd's config * Add secondary navigation to fn layer --- keyboards/dz60/keymaps/crd/keymap.c | 48 +++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 keyboards/dz60/keymaps/crd/keymap.c diff --git a/keyboards/dz60/keymaps/crd/keymap.c b/keyboards/dz60/keymaps/crd/keymap.c new file mode 100644 index 000000000000..5e9242c9d976 --- /dev/null +++ b/keyboards/dz60/keymaps/crd/keymap.c @@ -0,0 +1,48 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Qwerty + * ,-----------------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc | + * |-----------------------------------------------------------------------------------------+ + * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl/Esc| A | S | D | F | G | H | J | K | L | ; | ' | Enter | + * |-----------------------------------------------------------------------------------------+ + * | Shift | Z | X | C | V | B | N | M | , | . | / | RSh | U | DEL | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl | Alt | Cmd | Space | Cmd | FN | L | D | R | + * `-----------------------------------------------------------------------------------------' + */ + + LAYOUT_directional( + KC_GESC, 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, + 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, 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_UP, KC_DEL, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT + ), + + /* FN Layer + * ,-----------------------------------------------------------------------------------------. + * | ` ~ | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | RESET | + * |-----------------------------------------------------------------------------------------+ + * | |RBB T|RGB M| Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | BL T| BL M| BL+ | BL- | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | | | | | |PgUp | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | |Home |PgDn | End | + * `-----------------------------------------------------------------------------------------' + */ + + LAYOUT_directional( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, RESET, + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, + _______, BL_TOGG, BL_STEP, BL_INC, BL_DEC, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDOWN, KC_END + ), +}; From 661e304033d704084a85930a4ff2c91e13c270af Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Sat, 29 Sep 2018 23:45:22 +0900 Subject: [PATCH 168/505] Add a temporary comment to quantum/rgblight.h to aid migration. Add a temporary comment. The content is a contrast table of old magic number and new symbol. --- quantum/rgblight.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/quantum/rgblight.h b/quantum/rgblight.h index d1e00eef31e3..50567b5b2022 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -18,6 +18,52 @@ #include "rgblight_reconfig.h" +/***** rgblight_mode(mode)/rgblight_mode_noeeprom(mode) **** + + old mode number (before 0.6.117) to new mode name table + +|-----------------|-----------------------------------| +| old mode number | new mode name | +|-----------------|-----------------------------------| +| 1 | RGBLIGHT_MODE_STATIC_LIGHT | +| 2 | RGBLIGHT_MODE_BREATHING | +| 3 | RGBLIGHT_MODE_BREATHING + 1 | +| 4 | RGBLIGHT_MODE_BREATHING + 2 | +| 5 | RGBLIGHT_MODE_BREATHING + 3 | +| 6 | RGBLIGHT_MODE_RAINBOW_MOOD | +| 7 | RGBLIGHT_MODE_RAINBOW_MOOD + 1 | +| 8 | RGBLIGHT_MODE_RAINBOW_MOOD + 2 | +| 9 | RGBLIGHT_MODE_RAINBOW_SWIRL | +| 10 | RGBLIGHT_MODE_RAINBOW_SWIRL + 1 | +| 11 | RGBLIGHT_MODE_RAINBOW_SWIRL + 2 | +| 12 | RGBLIGHT_MODE_RAINBOW_SWIRL + 3 | +| 13 | RGBLIGHT_MODE_RAINBOW_SWIRL + 4 | +| 14 | RGBLIGHT_MODE_RAINBOW_SWIRL + 5 | +| 15 | RGBLIGHT_MODE_SNAKE | +| 16 | RGBLIGHT_MODE_SNAKE + 1 | +| 17 | RGBLIGHT_MODE_SNAKE + 2 | +| 18 | RGBLIGHT_MODE_SNAKE + 3 | +| 19 | RGBLIGHT_MODE_SNAKE + 4 | +| 20 | RGBLIGHT_MODE_SNAKE + 5 | +| 21 | RGBLIGHT_MODE_KNIGHT | +| 22 | RGBLIGHT_MODE_KNIGHT + 1 | +| 23 | RGBLIGHT_MODE_KNIGHT + 2 | +| 24 | RGBLIGHT_MODE_CHRISTMAS | +| 25 | RGBLIGHT_MODE_STATIC_GRADIENT | +| 26 | RGBLIGHT_MODE_STATIC_GRADIENT + 1 | +| 27 | RGBLIGHT_MODE_STATIC_GRADIENT + 2 | +| 28 | RGBLIGHT_MODE_STATIC_GRADIENT + 3 | +| 29 | RGBLIGHT_MODE_STATIC_GRADIENT + 4 | +| 30 | RGBLIGHT_MODE_STATIC_GRADIENT + 5 | +| 31 | RGBLIGHT_MODE_STATIC_GRADIENT + 6 | +| 32 | RGBLIGHT_MODE_STATIC_GRADIENT + 7 | +| 33 | RGBLIGHT_MODE_STATIC_GRADIENT + 8 | +| 34 | RGBLIGHT_MODE_STATIC_GRADIENT + 9 | +| 35 | RGBLIGHT_MODE_RGB_TEST | +| 36 | RGBLIGHT_MODE_ALTERNATING | +|-----------------|-----------------------------------| + *****/ + #define _RGBM_SINGLE_STATIC(sym) RGBLIGHT_MODE_ ## sym, #define _RGBM_SINGLE_DYNAMIC(sym) RGBLIGHT_MODE_ ## sym, #define _RGBM_MULTI_STATIC(sym) RGBLIGHT_MODE_ ## sym, From ec59556cd7896e359340feb961f10f3f12a48b95 Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Wed, 10 Oct 2018 06:50:11 +0900 Subject: [PATCH 169/505] add a notice into docs/feature_rgblight.md --- docs/feature_rgblight.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md index 925dca724b5f..a2820347deb7 100644 --- a/docs/feature_rgblight.md +++ b/docs/feature_rgblight.md @@ -96,9 +96,10 @@ if `RGBLIGHT_EFFECT_xxxx` or `RGBLIGHT_ANIMATIONS` is defined, you also have a n |`RGBLIGHT_MODE_RGB_TEST` | *None* |RGB Test | |`RGBLIGHT_MODE_ALTERNATING` | *None* |Alternating | - Check out [this video](https://youtube.com/watch?v=VKrpPAHlisY) for a demonstration. +Note: For versions older than 0.6.117, The mode numbers were written directly. In `quantum/rgblight.h` there is a contrast table between the old mode number and the current symbol. + The following options can be used to tweak the various animations: |Define |Default |Description | From 4bb0fb2ffc2d3fd136f5803b92f1a55792645a28 Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Thu, 11 Oct 2018 22:15:31 +0900 Subject: [PATCH 170/505] A comment indicating the insertion location of the new mode was added. --- quantum/rgblight.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/quantum/rgblight.h b/quantum/rgblight.h index 50567b5b2022..33b279f08cff 100644 --- a/quantum/rgblight.h +++ b/quantum/rgblight.h @@ -284,6 +284,10 @@ void rgblight_effect_alternating(void); #ifdef RGBLIGHT_EFFECT_ALTERNATING _RGBM_SINGLE_DYNAMIC( ALTERNATING ) #endif + //// Add a new mode here. + // #ifdef RGBLIGHT_EFFECT_ + // _RGBM__( ) + // #endif #endif #undef _RGBM_SINGLE_STATIC From 52ecc76e28bbcde9e35d35eb48a4d5b78aa204e2 Mon Sep 17 00:00:00 2001 From: Yann Hodique Date: Thu, 11 Oct 2018 15:26:56 -0700 Subject: [PATCH 171/505] port sun_usb converter from tmk initial import --- keyboards/converter/sun_usb/command_extra.c | 64 ++++++ keyboards/converter/sun_usb/config.h | 88 ++++++++ keyboards/converter/sun_usb/led.c | 32 +++ keyboards/converter/sun_usb/matrix.c | 197 ++++++++++++++++++ keyboards/converter/sun_usb/readme.md | 89 ++++++++ keyboards/converter/sun_usb/rules.mk | 42 ++++ .../sun_usb/type3/keymaps/default/keymap.c | 29 +++ keyboards/converter/sun_usb/type3/rules.mk | 0 keyboards/converter/sun_usb/type3/type3.h | 66 ++++++ .../sun_usb/type5/keymaps/default/keymap.c | 30 +++ keyboards/converter/sun_usb/type5/rules.mk | 0 keyboards/converter/sun_usb/type5/type5.h | 148 +++++++++++++ 12 files changed, 785 insertions(+) create mode 100644 keyboards/converter/sun_usb/command_extra.c create mode 100644 keyboards/converter/sun_usb/config.h create mode 100644 keyboards/converter/sun_usb/led.c create mode 100644 keyboards/converter/sun_usb/matrix.c create mode 100644 keyboards/converter/sun_usb/readme.md create mode 100644 keyboards/converter/sun_usb/rules.mk create mode 100644 keyboards/converter/sun_usb/type3/keymaps/default/keymap.c create mode 100644 keyboards/converter/sun_usb/type3/rules.mk create mode 100644 keyboards/converter/sun_usb/type3/type3.h create mode 100644 keyboards/converter/sun_usb/type5/keymaps/default/keymap.c create mode 100644 keyboards/converter/sun_usb/type5/rules.mk create mode 100644 keyboards/converter/sun_usb/type5/type5.h diff --git a/keyboards/converter/sun_usb/command_extra.c b/keyboards/converter/sun_usb/command_extra.c new file mode 100644 index 000000000000..756a9160bb1f --- /dev/null +++ b/keyboards/converter/sun_usb/command_extra.c @@ -0,0 +1,64 @@ +#include QMK_KEYBOARD_H +#include "protocol/serial.h" + +bool sun_bell = false; +bool sun_click = false; + + +bool command_extra(uint8_t code) +{ + switch (code) { + case KC_H: + case KC_SLASH: /* ? */ + print("\n\n----- Sun converter Help -----\n"); + print("Home: Toggle Bell\n"); + print("End: Toggle Click\n"); + print("PgUp: LED all On\n"); + print("PgDown: LED all Off\n"); + print("Insert: Layout\n"); + print("Delete: Reset\n"); + return false; + case KC_DEL: + print("Reset\n"); + serial_send(0x01); + break; + case KC_HOME: + sun_bell = !sun_bell; + if (sun_bell) { + print("Bell On\n"); + serial_send(0x02); + } else { + print("Bell Off\n"); + serial_send(0x03); + } + break; + case KC_END: + sun_click = !sun_click; + if (sun_click) { + print("Click On\n"); + serial_send(0x0A); + } else { + print("Click Off\n"); + serial_send(0x0B); + } + break; + case KC_PGUP: + print("LED all on\n"); + serial_send(0x0E); + serial_send(0xFF); + break; + case KC_PGDOWN: + print("LED all off\n"); + serial_send(0x0E); + serial_send(0x00); + break; + case KC_INSERT: + print("layout\n"); + serial_send(0x0F); + break; + default: + xprintf("Unknown extra command: %02X\n", code); + return false; + } + return true; +} diff --git a/keyboards/converter/sun_usb/config.h b/keyboards/converter/sun_usb/config.h new file mode 100644 index 000000000000..f7ad41639392 --- /dev/null +++ b/keyboards/converter/sun_usb/config.h @@ -0,0 +1,88 @@ +/* +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 + +#define CUSTOM_MATRIX 2 + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x3333 +#define DEVICE_VER 0x0100 +#define MANUFACTURER QMK +#define PRODUCT Sun keyboard converter +#define DESCRIPTION USB converter for Sun type 5 keyboard + +/* matrix size */ +#define MATRIX_ROWS 16 +#define MATRIX_COLS 8 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT)) || \ + keyboard_report->mods == (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) || \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + + +/* Serial(USART) configuration + * asynchronous, negative logic, 1200baud, no flow control + * 1-start bit, 8-data bit, non parity, 1-stop bit + */ +#define SERIAL_SOFT_BAUD 1200 +#define SERIAL_SOFT_PARITY_NONE +#define SERIAL_SOFT_BIT_ORDER_LSB +#define SERIAL_SOFT_LOGIC_NEGATIVE +/* RXD Port */ +#define SERIAL_SOFT_RXD_ENABLE +#define SERIAL_SOFT_RXD_DDR DDRD +#define SERIAL_SOFT_RXD_PORT PORTD +#define SERIAL_SOFT_RXD_PIN PIND +#define SERIAL_SOFT_RXD_BIT 2 +#define SERIAL_SOFT_RXD_VECT INT2_vect +/* RXD Interupt */ +#define SERIAL_SOFT_RXD_INIT() do { \ + /* pin configuration: input with pull-up */ \ + SERIAL_SOFT_RXD_DDR &= ~(1< + +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 QMK_KEYBOARD_H +#include "protocol/serial.h" + +void led_set(uint8_t usb_led) +{ + uint8_t sun_led = 0; + if (usb_led & (1< + +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 QMK_KEYBOARD_H +#include "protocol/serial.h" + +/* + * Matrix Array usage: + * + * ROW: 16(4bits) + * COL: 8(3bits) + * + * 8bit wide + * +---------+ + * 0|00 ... 07| + * 1|08 ... 0F| + * :| ... | + * :| ... | + * E|70 ... 77| + * F|78 ... 7F| + * +---------+ + */ +static uint8_t matrix[MATRIX_ROWS]; +#define ROW(code) ((code>>3)&0xF) +#define COL(code) (code&0x07) + +static bool is_modified = false; + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + /* DDRD |= (1<<6); */ + /* PORTD |= (1<<6); */ + debug_enable = true; + + serial_init(); + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; + + /* // wait for keyboard coming up */ + /* // otherwise LED status update fails */ + /* print("Reseting "); */ + /* while (1) { */ + /* print("."); */ + /* while (serial_recv()); */ + /* serial_send(0x01); */ + /* _delay_ms(500); */ + /* if (serial_recv() == 0xFF) { */ + /* _delay_ms(500); */ + /* if (serial_recv() == 0x04) */ + /* break; */ + /* } */ + /* } */ + /* print(" Done\n"); */ + + /* PORTD &= ~(1<<6); */ + + matrix_init_quantum(); + return; +} + +uint8_t matrix_scan(void) +{ + uint8_t code; + code = serial_recv(); + if (!code) return 0; + + debug_hex(code); debug(" "); + + switch (code) { + case 0xFF: // reset success: FF 04 + print("reset: "); + _delay_ms(500); + code = serial_recv(); + xprintf("%02X\n", code); + if (code == 0x04) { + // LED status + led_set(host_keyboard_leds()); + } + return 0; + case 0xFE: // layout: FE + print("layout: "); + _delay_ms(500); + xprintf("%02X\n", serial_recv()); + return 0; + case 0x7E: // reset fail: 7E 01 + print("reset fail: "); + _delay_ms(500); + xprintf("%02X\n", serial_recv()); + return 0; + case 0x7F: + // all keys up + for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; + return 0; + } + + if (code&0x80) { + // break code + if (matrix_is_on(ROW(code), COL(code))) { + matrix[ROW(code)] &= ~(1< + + 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 QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + LAYOUT( + KC_F10,KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_BSPC, KC_VOLD, KC_MUTE, KC_VOLU, + KC_F12,KC_F13, 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_MPRV, KC_MPLY, KC_MNXT, + KC_F14,KC_F15, 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_DEL, KC_HOME, KC_UP, KC_PGUP, + KC_F16,KC_F17, 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_LEFT,KC_INSERT,KC_RIGHT, + KC_F18,KC_F19, 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_RCTL, KC_END, KC_DOWN,KC_PGDOWN, + KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI + ), +}; diff --git a/keyboards/converter/sun_usb/type3/rules.mk b/keyboards/converter/sun_usb/type3/rules.mk new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/keyboards/converter/sun_usb/type3/type3.h b/keyboards/converter/sun_usb/type3/type3.h new file mode 100644 index 000000000000..f6f14f4effd9 --- /dev/null +++ b/keyboards/converter/sun_usb/type3/type3.h @@ -0,0 +1,66 @@ +/* +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 TYPE3_H +#define TYPE3_H + +#include "quantum.h" + +/* Sun type 3 keyboard +,-------. ,-----------------------------------------------------------. ,-----------. +| 01| 03| | 05| 06| 08| 0A| 0C| 0E| 10| 11| 12| 2B| | 15| 16| 17| +|-------| |-----------------------------------------------------------| |-----------| +| 19| 1A| | 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 58| 2A| | 2D| 2E| 2F| +|-------| |-----------------------------------------------------------| |-----------| +| 31| 33| | 35 | 36| 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 42 | | 44| 45| 46| +|-------| |-----------------------------------------------------------| |-----------| +| 48| 49| | 4C | 4D| 4E| 4F| 50| 51| 52| 53| 54| 55| 56| 57| 59 | | 5B| 5C| 5D| +|-------| |-----------------------------------------------------------| |-----------| +| 5F| 61| | 63 | 64| 65| 66| 67| 68| 69| 6A| 6B| 6C| 6D| 6E| 6F| | 70| 71| 72| +`-------' |-----------------------------------------------------------| `-----------' + | 77 | 78 | 79 | 7A | 13 | + `-----------------------------------------------------------' +*/ + + +#define LAYOUT( \ + K01,K03, K05,K06, K08, K0A, K0C, K0E, K10,K11,K12,K2B, K15,K16,K17, \ + K19,K1A, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2D,K2E,K2F, \ + K31,K33, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K42, K44,K45,K46, \ + K48,K49, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, K5B,K5C,K5D, \ + K5F,K61, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E,K6F, K70,K71,K72, \ + K77,K78, K79, K7A,K13 \ +) { \ + { KC_NO, K01 , KC_NO, K03 , KC_NO, K05 , K06 , KC_NO }, \ + { K08 , KC_NO, K0A , KC_NO, K0C , KC_NO, K0E , KC_NO }, \ + { K10 , K11 , K12 , K13 , KC_NO, K15 , K16 , K17 }, \ + { KC_NO, K19 , K1A , KC_NO, KC_NO, K1D , K1E , K1F }, \ + { K20 , K21 , K22 , K23 , K24 , K25 , K26 , K27 }, \ + { K28 , K29 , K2A , K2B , KC_NO, K2D , K2E , K2F }, \ + { KC_NO, K31 , KC_NO, K33 , KC_NO, K35 , K36 , K37 }, \ + { K38 , K39 , K3A , K3B , K3C , K3D , K3E , K3F }, \ + { K40 , K41 , K42 , KC_NO, K44 , K45 , K46 , KC_NO }, \ + { K48 , K49 , KC_NO, KC_NO, K4C , K4D , K4E , K4F }, \ + { K50 , K51 , K52 , K53 , K54 , K55 , K56 , K57 }, \ + { K58 , K59 , KC_NO, K5B , K5C , K5D , KC_NO, K5F }, \ + { KC_NO, K61 , KC_NO, K63 , K64 , K65 , K66 , K67 }, \ + { K68 , K69 , K6A , K6B , K6C , K6D , K6E , K6F }, \ + { K70 , K71 , K72 , KC_NO, KC_NO, KC_NO, KC_NO, K77 }, \ + { K78 , K79 , K7A , KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ +} + +#endif diff --git a/keyboards/converter/sun_usb/type5/keymaps/default/keymap.c b/keyboards/converter/sun_usb/type5/keymaps/default/keymap.c new file mode 100644 index 000000000000..5e04ff4b3b8a --- /dev/null +++ b/keyboards/converter/sun_usb/type5/keymaps/default/keymap.c @@ -0,0 +1,30 @@ +/* +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 . +*/ + +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* LAYOUT_jp_unix is a superset of the other layouts, hence the default */ + LAYOUT_jp_unix( + KC_HELP, KC_NO, 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_MUTE,KC_VOLD,KC_VOLU,KC_PWR, + KC_STOP, KC_AGAIN, 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_INS, KC_HOME,KC_PGUP, KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, + KC_MENU, KC_UNDO, 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_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_SELECT, KC_COPY, 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_P4, KC_P5, KC_P6, + KC_EXECUTE,KC_PASTE, 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_P1, KC_P2, KC_P3, KC_PENT, + KC_FIND, KC_CUT, KC_CAPS,KC_LALT,KC_LGUI,KC_HENK, KC_SPC, KC_MHEN,KC_KANA,KC_RGUI,KC_APP,KC_RALT, KC_LEFT,KC_DOWN,KC_RGHT, KC_P0, KC_PDOT + ), +}; diff --git a/keyboards/converter/sun_usb/type5/rules.mk b/keyboards/converter/sun_usb/type5/rules.mk new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/keyboards/converter/sun_usb/type5/type5.h b/keyboards/converter/sun_usb/type5/type5.h new file mode 100644 index 000000000000..da66d80abc82 --- /dev/null +++ b/keyboards/converter/sun_usb/type5/type5.h @@ -0,0 +1,148 @@ +/* + 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 TYPE5_H +#define TYPE5_H + +#include "quantum.h" + +/* sun type 5 keyboard, JP Unix-style +,-------. ,---, ,---------------. ,---------------. ,---------------. ,-----------. ,---------------. +| 76 | | 0F| | 05| 06| 08| 0A| | 0C| 0E| 10| 11| | 12| 07| 09| 0B| | 16| 17| 15| | 2D| 02| 04| 30| +`-------' `---' `---------------' `---------------' `---------------' `-----------' `---------------' +,-------. ,-----------------------------------------------------------. ,-----------. ,---------------. +| 01| 03| | 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 58| 2A| | 2C| 34| 60| | 62| 2E| 2F| 47| +|-------| |-----------------------------------------------------------| |------------ |---------------| +| 19| 1A| | 35 | 36| 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 2B | | 42| 4A| 7B| | 44| 45| 46| | +|-------| |-----------------------------------------------------------| `-----------' |-----------| 7D| +| 31| 33| | 4C | 4D| 4E| 4F| 50| 51| 52| 53| 54| 55| 56| 57| 59 | | 5B| 5C| 5D| | +|-------| |-----------------------------------------------------------| ,---. |-----------|---| +| 48| 49| | 63 | 64| 65| 66| 67| 68| 69| 6A| 6B| 6C| 6D| 6E | | 14| | 70| 71| 72| | +|-------| |-----------------------------------------------------------| .-----------. |-----------| 5A| +| 5F| 61| | 77 | 13| 78 |*73 | 79 |*74 |*75| 7A | 43| 0D| | 18| 1B| 1C| | 5E | 32| | +`-------' `-----------------------------------------------------------' `-----------' `---------------' +*/ +#define LAYOUT_jp_unix( \ + K76, K0F, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, K16,K17,K15, K2D,K02,K04,K30, \ + K01,K03, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2C,K34,K60, K62,K2E,K2F,K47, \ + K19,K1A, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42,K4A,K7B, K44,K45,K46,K7D, \ + K31,K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, K5B,K5C,K5D, \ + K48,K49, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, K70,K71,K72,K5A, \ + K5F,K61, K77,K13, K78, K73, K79, K74, K75, K7A, K43, K0D, K18,K1B,K1C, K5E, K32 \ +) { \ + { KC_NO, K01 , K02 , K03 , K04 , K05 , K06 , K07 }, \ + { K08 , K09 , K0A , K0B , K0C , K0D , K0E , K0F ,}, \ + { K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 }, \ + { K18 , K19 , K1A , K1B , K1C , K1D , K1E , K1F }, \ + { K20 , K21 , K22 , K23 , K24 , K25 , K26 , K27 }, \ + { K28 , K29 , K2A , K2B , K2C , K2D , K2E , K2F }, \ + { K30 , K31 , K32 , K33 , K34 , K35 , K36 , K37 }, \ + { K38 , K39 , K3A , K3B , K3C , K3D , K3E , K3F }, \ + { K40 , K41 , K42 , K43 , K44 , K45 , K46 , K47 }, \ + { K48 , K49 , K4A , KC_NO, K4C , K4D , K4E , K4F }, \ + { K50 , K51 , K52 , K53 , K54 , K55 , K56 , K57 }, \ + { K58 , K59 , K5A , K5B , K5C , K5D , K5E , K5F }, \ + { K60 , K61 , K62 , K63 , K64 , K65 , K66 , K67 }, \ + { K68 , K69 , K6A , K6B , K6C , K6D , K6E , KC_NO }, \ + { K70 , K71 , K72 , K73 , K74 , K75 , K76 , K77 }, \ + { K78 , K79 , K7A , K7B , KC_NO, K7D , KC_NO, KC_NO } \ +} + +/* Sun type 5 keyboard, US Unix-style +,-------. ,---, ,---------------. ,---------------. ,---------------. ,-----------. ,---------------. +| 76 | | 0F| | 05| 06| 08| 0A| | 0C| 0E| 10| 11| | 12| 07| 09| 0B| | 16| 17| 15| | 2D| 02| 04| 30| +`-------' `---' `---------------' `---------------' `---------------' `-----------' `---------------' +,-------. ,-----------------------------------------------------------. ,-----------. ,---------------. +| 01| 03| | 1D| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 58| 2A| | 2C| 34| 60| | 62| 2E| 2F| 47| +|-------| |-----------------------------------------------------------| |------------ |---------------| +| 19| 1A| | 35 | 36| 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 2B | | 42| 4A| 7B| | 44| 45| 46| | +|-------| |-----------------------------------------------------------| `-----------' |-----------| 7D| +| 31| 33| | 4C | 4D| 4E| 4F| 50| 51| 52| 53| 54| 55| 56| 57| 59 | | 5B| 5C| 5D| | +|-------| |-----------------------------------------------------------| ,---. |-----------|---| +| 48| 49| | 63 | 64| 65| 66| 67| 68| 69| 6A| 6B| 6C| 6D| 6E | | 14| | 70| 71| 72| | +|-------| |-----------------------------------------------------------| .-----------. |-----------| 5A| +| 5F| 61| | 77 | 13| 78 | 79 | 7A | 43| 0D| | 18| 1B| 1C| | 5E | 32| | +`-------' `-----------------------------------------------------------' `-----------' `---------------' +*/ +#define LAYOUT_us_unix( \ + K76, K0F, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, K16,K17,K15, K2D,K02,K04,K30, \ + K01,K03, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K58,K2A, K2C,K34,K60, K62,K2E,K2F,K47, \ + K19,K1A, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K2B, K42,K4A,K7B, K44,K45,K46,K7D, \ + K31,K33, K4C, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, K5B,K5C,K5D, \ + K48,K49, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, K70,K71,K72,K5A, \ + K5F,K61, K77,K13, K78, K79, K7A, K43, K0D, K18,K1B,K1C, K5E, K32 \ +) { \ + { KC_NO, K01 , K02 , K03 , K04 , K05 , K06 , K07 }, \ + { K08 , K09 , K0A , K0B , K0C , K0D , K0E , K0F ,}, \ + { K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 }, \ + { K18 , K19 , K1A , K1B , K1C , K1D , K1E , K1F }, \ + { K20 , K21 , K22 , K23 , K24 , K25 , K26 , K27 }, \ + { K28 , K29 , K2A , K2B , K2C , K2D , K2E , K2F }, \ + { K30 , K31 , K32 , K33 , K34 , K35 , K36 , K37 }, \ + { K38 , K39 , K3A , K3B , K3C , K3D , K3E , K3F }, \ + { K40 , K41 , K42 , K43 , K44 , K45 , K46 , K47 }, \ + { K48 , K49 , K4A , KC_NO, K4C , K4D , K4E , K4F }, \ + { K50 , K51 , K52 , K53 , K54 , K55 , K56 , K57 }, \ + { K58 , K59 , K5A , K5B , K5C , K5D , K5E , K5F }, \ + { K60 , K61 , K62 , K63 , K64 , K65 , K66 , K67 }, \ + { K68 , K69 , K6A , K6B , K6C , K6D , K6E , KC_NO }, \ + { K70 , K71 , K72 , KC_NO, KC_NO, KC_NO, K76 , K77 }, \ + { K78 , K79 , K7A , K7B , KC_NO, K7D , KC_NO, KC_NO } \ +} + +/* Sun type 5 keyboard, US ANSI-style + ,-------. ,---, ,---------------. ,---------------. ,---------------. ,-----------. ,---------------. + | 76 | | 1D| | 05| 06| 08| 0A| | 0C| 0E| 10| 11| | 12| 07| 09| 0B| | 16| 17| 15| | 2D| 02| 04| 30| + `-------' `---' `---------------' `---------------' `---------------' `-----------' `---------------' + ,-------. ,-----------------------------------------------------------. ,-----------. ,---------------. + | 01| 03| | 2A| 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 2B | | 2C| 34| 60| | 62| 2E| 2F| 47| + |-------| |-----------------------------------------------------------| |------------ |---------------| + | 19| 1A| | 35 | 36| 37| 38| 39| 3A| 3B| 3C| 3D| 3E| 3F| 40| 41| 58 | | 42| 4A| 7B| | 44| 45| 46| | + |-------| |-----------------------------------------------------------| `-----------' |-----------| 7D| + | 31| 33| | 77 | 4D| 4E| 4F| 50| 51| 52| 53| 54| 55| 56| 57| 59 | | 5B| 5C| 5D| | + |-------| |-----------------------------------------------------------| ,---. |-----------|---| + | 48| 49| | 63 | 64| 65| 66| 67| 68| 69| 6A| 6B| 6C| 6D| 6E | | 14| | 70| 71| 72| | + |-------| |-----------------------------------------------------------| .-----------. |-----------| 5A| + | 5F| 61| | 4C | 13| 78 | 79 | 7A | 43| 0D| | 18| 1B| 1C| | 5E | 32| | + `-------' `-----------------------------------------------------------' `-----------' `---------------' +*/ +#define LAYOUT_ansi( \ + K76, K1D, K05,K06,K08,K0A, K0C,K0E,K10,K11, K12,K07,K09,K0B, K16,K17,K15, K2D,K02,K04,K30, \ + K01,K03, K2A,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29, K2B, K2C,K34,K60, K62,K2E,K2F,K47, \ + K19,K1A, K35, K36,K37,K38,K39,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41, K58, K42,K4A,K7B, K44,K45,K46,K7D, \ + K31,K33, K77, K4D,K4E,K4F,K50,K51,K52,K53,K54,K55,K56,K57, K59, K5B,K5C,K5D, \ + K48,K49, K63, K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D, K6E, K14, K70,K71,K72,K5A, \ + K5F,K61, K4C,K13, K78, K79, K7A, K43, K0D, K18,K1B,K1C, K5E, K32 \ +) { \ + { KC_NO, K01 , K02 , K03 , K04 , K05 , K06 , K07 }, \ + { K08 , K09 , K0A , K0B , K0C , K0D , K0E , KC_NO,}, \ + { K10 , K11 , K12 , K13 , K14 , K15 , K16 , K17 }, \ + { K18 , K19 , K1A , K1B , K1C , K1D , K1E , K1F }, \ + { K20 , K21 , K22 , K23 , K24 , K25 , K26 , K27 }, \ + { K28 , K29 , K2A , K2B , K2C , K2D , K2E , K2F }, \ + { K30 , K31 , K32 , K33 , K34 , K35 , K36 , K37 }, \ + { K38 , K39 , K3A , K3B , K3C , K3D , K3E , K3F }, \ + { K40 , K41 , K42 , K43 , K44 , K45 , K46 , K47 }, \ + { K48 , K49 , K4A , KC_NO, K4C , K4D , K4E , K4F }, \ + { K50 , K51 , K52 , K53 , K54 , K55 , K56 , K57 }, \ + { K58 , K59 , K5A , K5B , K5C , K5D , K5E , K5F }, \ + { K60 , K61 , K62 , K63 , K64 , K65 , K66 , K67 }, \ + { K68 , K69 , K6A , K6B , K6C , K6D , K6E , KC_NO }, \ + { K70 , K71 , K72 , KC_NO, KC_NO, KC_NO, K76 , K77 }, \ + { K78 , K79 , K7A , K7B , KC_NO, K7D , KC_NO, KC_NO } \ +} +#endif From 0793abfd19d994e68f4b449eb2fed7ea51aa3e2f Mon Sep 17 00:00:00 2001 From: Patrick Hener Date: Fri, 12 Oct 2018 19:31:08 +0200 Subject: [PATCH 172/505] Add sendstring_german.h (#4124) * added sweet16 test keymap and touched sendstring_german.h * added sendstring_german.h * Delete keymap.c As suggested deleted the keymap file. --- quantum/keymap_extras/sendstring_german.h | 81 +++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 quantum/keymap_extras/sendstring_german.h diff --git a/quantum/keymap_extras/sendstring_german.h b/quantum/keymap_extras/sendstring_german.h new file mode 100644 index 000000000000..1eaafee31737 --- /dev/null +++ b/quantum/keymap_extras/sendstring_german.h @@ -0,0 +1,81 @@ +/* Copyright 2018 Patrick Hener + * + * 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 . + */ +/* Sendstring definitions for the German layout */ +#ifndef SENDSTRING_GERMAN +#define SENDSTRING_GERMAN + +#include "keymap_german.h" + +const bool ascii_to_shift_lut[0x80] PROGMEM = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 0 +}; + +/* Until an ALT table/functionality is added, the following symbols will not work: +* § @ [ ] { } \ ~ äA öÖ ß ´ +* Following characters can be printed using other characters like so: +* [ in makro will be ü +* { in makro will be Ü +* ~ in makro will be ° +*/ +const uint8_t ascii_to_keycode_lut[0x80] PROGMEM = { + 0, 0, 0, 0, 0, 0, 0, 0, + KC_BSPC, KC_TAB, KC_ENT, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, KC_ESC, 0, 0, 0, 0, + + /* SPACE ! " # $ % & ' */ + KC_SPC, KC_1, KC_2, DE_HASH, KC_4, KC_5, KC_6, DE_HASH, + /* ( ) * + , - . / */ + KC_8, KC_9, DE_PLUS, DE_PLUS, KC_COMM, DE_MINS, KC_DOT, KC_7, + /* 0 1 2 3 4 5 6 7 */ + KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, + /* 8 9 : ; < = > ? */ + KC_8, KC_9, KC_DOT, KC_COMM, DE_LESS, KC_0, DE_LESS, KC_MINS, + /* @ A B C D E F G */ + KC_2, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, + /* H I J K L M N O */ + KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, + /* P Q R S T U V W */ + KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W, + /* X Y Z [ \ ] ^ _ */ + KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, DE_CIRC, DE_MINS, + /* ` a b c d e f g */ + DE_ACUT, KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, + /* h i j k l m n o */ + KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, + /* p q r s t u v w */ + KC_P, KC_Q, KC_R, KC_S, KC_T, KC_U, KC_V, KC_W, + /* x y z { | } ~ DELETE */ + KC_X, KC_Y, KC_Z, KC_LBRC, KC_BSLS, KC_RBRC, KC_GRV, KC_DEL +}; + +#endif From e5c315f961a55ba31b44b70e4554a3969a788a99 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Fri, 12 Oct 2018 10:34:52 -0700 Subject: [PATCH 173/505] Treasure Type9 Fix: change diode direction to ROW2COL (#4125) --- keyboards/treasure/type9/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/treasure/type9/config.h b/keyboards/treasure/type9/config.h index 55f0a8595694..367c53cb978f 100644 --- a/keyboards/treasure/type9/config.h +++ b/keyboards/treasure/type9/config.h @@ -46,7 +46,7 @@ along with this program. If not, see . #define UNUSED_PINS /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ -#define DIODE_DIRECTION COL2ROW +#define DIODE_DIRECTION ROW2COL #define BACKLIGHT_PIN B5 // #define BACKLIGHT_BREATHING From d81d216d72fe4e50da22259558e86c70a4f14a8d Mon Sep 17 00:00:00 2001 From: asakuno Date: Sat, 13 Oct 2018 16:40:42 +0900 Subject: [PATCH 174/505] Fix Typo in Custom Quantum functions document (led_state) (#4129) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit *_LOCK   ↓ DEL --- docs/custom_quantum_functions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/custom_quantum_functions.md b/docs/custom_quantum_functions.md index b077e4b78d8d..5b95450f2670 100644 --- a/docs/custom_quantum_functions.md +++ b/docs/custom_quantum_functions.md @@ -117,12 +117,12 @@ void led_set_user(uint8_t usb_led) { } else { PORTB &= ~(1<<2); } - if (usb_led & (1< Date: Sat, 13 Oct 2018 21:46:46 +0100 Subject: [PATCH 175/505] Keymap: Move navigation buttons closer to the middle on XD75:skewwhiffy (#4118) * RGB toggle button * Remove custom lighting effects * Fix small bug in Symbols layer * Ignore mod tap interrupt in XD75 for skewwhiffy, and split layers into two for more flexibility and fix persistent layer issue * Replace shift in nav layer with IntelliJ omnibox shortcut to avoid a sticky shift * Remove custom setting in config, because it were annoying, it were. * Move navigation buttons in one key * Some review markups * Use enums for layers * Use LAYOUT_ortho_5x15 * Revert some capitalization changes made by accident --- keyboards/xd75/keymaps/skewwhiffy/config.h | 24 -- keyboards/xd75/keymaps/skewwhiffy/keymap.c | 281 +++++++++------------ 2 files changed, 113 insertions(+), 192 deletions(-) delete mode 100644 keyboards/xd75/keymaps/skewwhiffy/config.h diff --git a/keyboards/xd75/keymaps/skewwhiffy/config.h b/keyboards/xd75/keymaps/skewwhiffy/config.h deleted file mode 100644 index f52a97bbc865..000000000000 --- a/keyboards/xd75/keymaps/skewwhiffy/config.h +++ /dev/null @@ -1,24 +0,0 @@ -/* 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 - -#include "../../config.h" - -// place overrides here - -#endif diff --git a/keyboards/xd75/keymaps/skewwhiffy/keymap.c b/keyboards/xd75/keymaps/skewwhiffy/keymap.c index 11fa2f0e64f8..33f3868084f7 100644 --- a/keyboards/xd75/keymaps/skewwhiffy/keymap.c +++ b/keyboards/xd75/keymaps/skewwhiffy/keymap.c @@ -13,41 +13,49 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "xd75.h" +#include QMK_KEYBOARD_H #include "keymap_uk.h" -// Fillers to make layering more clear -#define _______ KC_TRNS // Layer shorthand -#define _CM 0 // Colemak -#define _DV 1 // Dvorak -#define _QW 2 // QWERTY -#define _NB 3 // Numbers -#define _SY 4 // Symbols -#define _NAV 5 // Navigation +enum Layers { + cm, // colemak + dv, // dvorak + qw, // qwerty + nbl, // numbers left + nbr, // numbers right + syl, // symbols left + syr, // symbols right + nal, // navigation left + nar // navigation right +}; // Layer buttons #define _Z_SFT SFT_T(UK_Z) #define _SCLSH SFT_T(UK_SCLN) #define _SLSH SFT_T(UK_SLSH) -#define _X_NB LT(_NB, UK_X) -#define _Q_NB LT(_NB, UK_Q) -#define _DOT_NB LT(_NB, UK_DOT) -#define _V_NB LT(_NB, UK_V) -#define _C_SY LT(_SY, UK_C) -#define _J_SY LT(_SY, UK_J) -#define _W_SY LT(_SY, UK_W) -#define _COM_SY LT(_SY, UK_COMM) -#define _AST_SY LT(_SY, UK_PAST) -#define _B_NAV LT(_NAV, UK_B) -#define _X_NAV LT(_NAV, UK_X) -#define _K_NAV LT(_NAV, UK_K) -#define _N_NAV LT(_NAV, UK_N) -#define _F1_NB LT(_NB, UK_F1) -#define _3_NB LT(_NB, UK_3) + +#define _X_NB LT(nbl, UK_X) +#define _Q_NB LT(nbl, UK_Q) +#define _DOT_NB LT(nbr, UK_DOT) +#define _V_NB LT(nbr, UK_V) +#define __NBL LT(nbl, _______) +#define __NBR LT(nbr, _______) + +#define _C_SY LT(syl, UK_C) +#define _J_SY LT(syl, UK_J) +#define _W_SY LT(syr, UK_W) +#define _COM_SY LT(syr, UK_COMM) +#define __SYL LT(syl, _______) +#define __SYR LT(syr, _______) + +#define _V_NAL LT(nal, UK_V) +#define _K_NAL LT(nal, UK_K) +#define _M_NAR LT(nar, UK_M) +#define __NAL LT(nal, _______) +#define __NAR LT(nar, _______) // Custom hotkeys -#define _TERM LCTL(UK_QUOT) // Hotkey for Cmder or iTerm +#define _TERM LCTL(UK_QUOT) // Hotkey for terminal #define _S_TAB S(UK_TAB) #define _C_LEFT LCTL(UK_LEFT) #define _C_RGHT LCTL(UK_RGHT) @@ -55,35 +63,34 @@ #define _A_RGHT LALT(UK_RGHT) enum custom_keycodes { - L_NEXT = SAFE_RANGE, - L_SB + IJ_OMN = SAFE_RANGE // IntelliJ Omnibox }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Colemak _CM +/* Colemak * .--------------------------------------------------------------------------------------------------------------------------------------. - * | | | | | | | | | | | | | | L_NEXT | L_SB | + * | | | | | | | | | | | | | | | | * |--------------------------------------------------------------------------------------------------------------------------------------| * | Q | W | F | P | G | | | | | | J | L | U | Y | ; | * |--------------------------------------------------------------------------------------------------------------------------------------| * | A | R | S | T | D | | | | | | H | N | E | I | O | * |--------------------------------------------------------------------------------------------------------------------------------------| * | Z | X | C | V | B | | | | | | K | M | , | . | / | - * | SHIFT | NUMBER | SYMBOL | | NAV | | | | | | NAV | | SYMBOL | FUNC | SHIFT | + * | SHIFT | NUMBER | SYMBOL | NAV | | | | | | | | NAV | SYMBOL | FUNC | SHIFT | * |--------------------------------------------------------------------------------------------------------------------------------------| * | LSHIFT | LCTRL | LALT | LGUI | SPACE | ENT | | | | DEL | BKSPC | RGUI | RALT | RCTRL | RSHIFT | * .--------------------------------------------------------------------------------------------------------------------------------------. */ - [_CM] = { - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, L_NEXT, L_SB }, - { UK_Q, UK_W, UK_F, UK_P, UK_G, _______, _______, _______, _______, _______, UK_J, UK_L, UK_U, UK_Y, UK_SCLN }, - { UK_A, UK_R, UK_S, UK_T, UK_D, _______, _______, _______, _______, _______, UK_H, UK_N, UK_E, UK_I, UK_O }, - { _Z_SFT, _X_NB, _C_SY, UK_V, _B_NAV, _______, _______, _______, _______, _______, _K_NAV, UK_M, _COM_SY, _DOT_NB, _SLSH }, - { UK_LSFT, UK_LCTL, UK_LALT, UK_LGUI, UK_SPC, UK_ENT, _______, _______, _______, UK_DEL, UK_BSPC, UK_RGUI, UK_RALT, UK_RCTL, UK_RSFT } - }, - -/* DVORAK _DV + [cm] = LAYOUT_ortho_5x15( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + UK_Q, UK_W, UK_F, UK_P, UK_G, _______, _______, _______, _______, _______, UK_J, UK_L, UK_U, UK_Y, UK_SCLN, \ + UK_A, UK_R, UK_S, UK_T, UK_D, _______, _______, _______, _______, _______, UK_H, UK_N, UK_E, UK_I, UK_O , \ + _Z_SFT, _X_NB, _C_SY, _V_NAL, UK_B, _______, _______, _______, _______, _______, UK_K, _M_NAR, _COM_SY, _DOT_NB, _SLSH , \ + UK_LSFT, UK_LCTL, UK_LALT, UK_LGUI, UK_SPC, UK_ENT, _______, _______, _______, UK_DEL, UK_BSPC, UK_RGUI, UK_RALT, UK_RCTL, UK_RSFT \ + ), + +/* Dvorak * .--------------------------------------------------------------------------------------------------------------------------------------. * | | | | | | | | | | | | | | | | * |--------------------------------------------------------------------------------------------------------------------------------------| @@ -92,18 +99,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | A | O | E | U | I | | | | | | D | H | T | N | S | * |--------------------------------------------------------------------------------------------------------------------------------------| * | ; | Q | J | K | X | | | | | | B | M | W | V | Z | - * | SHIFT | NUMBER | SYMBOL | | NAV | | | | | | NAV | | SYMBOL | FUNC | SHIFT | + * | SHIFT | NUMBER | SYMBOL | NAV | | | | | | | | NAV | SYMBOL | FUNC | SHIFT | * |--------------------------------------------------------------------------------------------------------------------------------------| * | | | | | | | | | | | | | | | | * |--------------------------------------------------------------------------------------------------------------------------------------| */ - [_DV] = { - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { UK_QUOT, UK_COMM, UK_DOT, UK_P, UK_Y, _______, _______, _______, _______, _______, UK_F, UK_G, UK_C, UK_R, UK_L }, - { UK_A, UK_O, UK_E, UK_U, UK_I, _______, _______, _______, _______, _______, UK_D, UK_H, UK_T, UK_N, UK_S }, - { _SCLSH, _Q_NB, _J_SY, UK_K, _X_NAV, _______, _______, _______, _______, _______, _B_NAV, UK_M, _W_SY, _V_NB, _Z_SFT }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } - }, + [dv] = LAYOUT_ortho_5x15( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + UK_QUOT, UK_COMM, UK_DOT, UK_P, UK_Y, _______, _______, _______, _______, _______, UK_F, UK_G, UK_C, UK_R, UK_L , \ + UK_A, UK_O, UK_E, UK_U, UK_I, _______, _______, _______, _______, _______, UK_D, UK_H, UK_T, UK_N, UK_S , \ + _SCLSH, _Q_NB, _J_SY, _K_NAL, UK_X, _______, _______, _______, _______, _______, UK_B, _M_NAR, _W_SY, _V_NB, _Z_SFT , \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), /* QWERTY _QW * .--------------------------------------------------------------------------------------------------------------------------------------. @@ -114,20 +121,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | A | S | D | F | G | | | | | | H | J | K | L | ; | * |--------------------------------------------------------------------------------------------------------------------------------------| * | Z | X | C | V | B | | | | | | N | M | , | . | / | - * | SHIFT | NUMBER | SYMBOL | | NAV | | | | | | NAV | | SYMBOL | FUNC | SHIFT | + * | SHIFT | NUMBER | SYMBOL | NAV | | | | | | | | NAV | SYMBOL | FUNC | SHIFT | * |--------------------------------------------------------------------------------------------------------------------------------------| * | | | | | | | | | | | | | | | | * |--------------------------------------------------------------------------------------------------------------------------------------| * | LSHIFT | LCTRL | LALT | LGUI | SPACE | ENT | | | | DEL | BKSPC | RGUI | RALT | RCTRL | RSHIFT | * .--------------------------------------------------------------------------------------------------------------------------------------. */ - [_QW] = { - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { UK_Q, UK_W, UK_E, UK_R, UK_T, _______, _______, _______, _______, _______, UK_Y, UK_U, UK_I, UK_O, UK_P }, - { UK_A, UK_S, UK_D, UK_F, UK_G, _______, _______, _______, _______, _______, UK_H, UK_J, UK_K, UK_L, UK_SCLN }, - { _Z_SFT, _X_NB, _C_SY, UK_V, _B_NAV, _______, _______, _______, _______, _______, _N_NAV, UK_M, _COM_SY, _DOT_NB, _SLSH }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } - }, + [qw] = LAYOUT_ortho_5x15( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + UK_Q, UK_W, UK_E, UK_R, UK_T, _______, _______, _______, _______, _______, UK_Y, UK_U, UK_I, UK_O, UK_P , \ + UK_A, UK_S, UK_D, UK_F, UK_G, _______, _______, _______, _______, _______, UK_H, UK_J, UK_K, UK_L, UK_SCLN, \ + _Z_SFT, _X_NB, _C_SY, _V_NAL, UK_B, _______, _______, _______, _______, _______, UK_N, _M_NAR, _COM_SY, _DOT_NB, _SLSH , \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), /* Numbers _NB * .--------------------------------------------------------------------------------------------------------------------------------------. @@ -142,15 +149,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | | | | * '--------------------------------------------------------------------------------------------------------------------------------------' */ - [_NB] = { - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { _______, UK_F7, UK_F8, UK_F9, UK_F10, _______, _______, _______, _______, _______, _______, UK_7, UK_8, UK_9, _______ }, - { _______, UK_F4, UK_F5, UK_F6, UK_F11, _______, _______, _______, _______, _______, _______, UK_4, UK_5, UK_6, _______ }, - { _______, _F1_NB, UK_F2, UK_F3, UK_F12, _______, _______, _______, _______, _______, UK_0, UK_1, UK_2, _3_NB, UK_DOT }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } - }, - -/* Symbols _SY + [nbl] = LAYOUT_ortho_5x15( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, UK_F7, UK_F8, UK_F9, UK_F10, _______, _______, _______, _______, _______, _______, UK_7, UK_8, UK_9, _______, \ + _______, UK_F4, UK_F5, UK_F6, UK_F11, _______, _______, _______, _______, _______, _______, UK_4, UK_5, UK_6, _______, \ + _______, __NBL, UK_F2, UK_F3, UK_F12, _______, _______, _______, _______, _______, UK_0, UK_1, UK_2, UK_3, UK_DOT, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + [nbr] = LAYOUT_ortho_5x15( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, UK_F7, UK_F8, UK_F9, UK_F10, _______, _______, _______, _______, _______, _______, UK_7, UK_8, UK_9, _______, \ + _______, UK_F4, UK_F5, UK_F6, UK_F11, _______, _______, _______, _______, _______, _______, UK_4, UK_5, UK_6, _______, \ + _______, UK_F1, UK_F2, UK_F3, UK_F12, _______, _______, _______, _______, _______, UK_0, UK_1, UK_2, __NBR, UK_DOT , \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + + /* Symbols _SY * .--------------------------------------------------------------------------------------------------------------------------------------. * | | | | | | | | | | | | | | | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| @@ -163,17 +177,24 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | | | | * '--------------------------------------------------------------------------------------------------------------------------------------' */ - [_SY] = { - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { UK_EXLM, UK_PND, UK_UNDS, UK_MINS, UK_TILD, _______, _______, _______, _______, _______, UK_BSLS, UK_LCBR, UK_RCBR, UK_SLSH, UK_HASH }, - { UK_DLR, UK_PERC, UK_PLUS, UK_EQL, _______, _______, _______, _______, _______, _______, UK_DQUO, UK_LPRN, UK_RPRN, UK_QUOT, UK_AT }, - { UK_CIRC, UK_AMPR, _AST_SY, UK_PIPE, _______, _______, _______, _______, _______, _______, UK_LABK, UK_LBRC, _COM_SY, UK_RABK, UK_GRV }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ } - }, + [syl] = LAYOUT_ortho_5x15( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + UK_EXLM, UK_PND, UK_UNDS, UK_MINS, UK_TILD, _______, _______, _______, _______, _______, UK_BSLS, UK_LCBR, UK_RCBR, UK_SLSH, UK_HASH, \ + UK_DLR, UK_PERC, UK_PLUS, UK_EQL, _______, _______, _______, _______, _______, _______, UK_DQUO, UK_LPRN, UK_RPRN, UK_QUOT, UK_AT , \ + UK_CIRC, UK_AMPR, __SYL, UK_PIPE, _______, _______, _______, _______, _______, _______, UK_LABK, UK_LBRC, UK_RBRC, UK_RABK, UK_GRV , \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + [syr] = LAYOUT_ortho_5x15( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + UK_EXLM, UK_PND, UK_UNDS, UK_MINS, UK_TILD, _______, _______, _______, _______, _______, UK_BSLS, UK_LCBR, UK_RCBR, UK_SLSH, UK_HASH, \ + UK_DLR, UK_PERC, UK_PLUS, UK_EQL, _______, _______, _______, _______, _______, _______, UK_DQUO, UK_LPRN, UK_RPRN, UK_QUOT, UK_AT , \ + UK_CIRC, UK_AMPR, UK_ASTR, UK_PIPE, _______, _______, _______, _______, _______, _______, UK_LABK, UK_LBRC, __SYR, UK_RABK, UK_GRV , \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), /* - * Navigation + * Navigation _NA * .--------------------------------------------------------------------------------------------------------------------------------------. - * | RESET | COLEMA | DVORAK | QWERTY | | | | | | | | | | | | + * | RESET | COLEMA | DVORAK | QWERTY | | RGB_TG | | | | | | | | | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | Esc | Ctrl L | Up | Ctrl R | | RGB HD | RGB HI | | | | | PtSn | ScLk | Pause | | * +--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| @@ -184,105 +205,29 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | RGB RMD| RGB MD | | | | | | | | | * '--------------------------------------------------------------------------------------------------------------------------------------' */ - [_NAV] = { - { RESET, DF(_CM), DF(_DV), DF(_QW), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { UK_ESC, _C_LEFT, UK_UP , _C_RGHT, _______, RGB_HUD, RGB_HUI, _______, _______, _______, _______, UK_PSCR, UK_SLCK, UK_PAUS, _______ }, - { UK_TAB, UK_LEFT, UK_DOWN, UK_RGHT, _______, RGB_SAD, RGB_SAI, _______, _______, _______, _______, UK_INS, UK_HOME, UK_PGUP, _TERM }, - { _S_TAB, _A_LEFT, UK_LSFT, _A_RGHT, _B_NAV, RGB_VAD, RGB_VAI, _______, _______, _______, _K_NAV, UK_SLCK, UK_END, UK_PGDN, _______ }, - { _______, _______, _______, _______, _______, RGB_RMOD,RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______ } - }, -}; - -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); - #ifdef BACKLIGHT_ENABLE - backlight_step(); - #endif - } else { - unregister_code(KC_RSFT); - } - break; - } - return MACRO_NONE; + [nal] = LAYOUT_ortho_5x15( \ + RESET, DF(cm), DF(dv), DF(qw), _______, RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + UK_ESC, _C_LEFT, UK_UP , _C_RGHT, _______, RGB_HUD, RGB_HUI, _______, _______, _______, _______, UK_PSCR, UK_SLCK, UK_PAUS, _______, \ + UK_TAB, UK_LEFT, UK_DOWN, UK_RGHT, _______, RGB_SAD, RGB_SAI, _______, _______, _______, _______, UK_INS, UK_HOME, UK_PGUP, _TERM , \ + _S_TAB, _A_LEFT, IJ_OMN, __NAL, _______, RGB_VAD, RGB_VAI, _______, _______, _______, _______, UK_SLCK, UK_END, UK_PGDN, _______, \ + _______, _______, _______, _______, _______, RGB_RMOD,RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + [nar] = LAYOUT_ortho_5x15( \ + RESET, DF(cm), DF(dv), DF(qw), _______, RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + UK_ESC, _C_LEFT, UK_UP , _C_RGHT, _______, RGB_HUD, RGB_HUI, _______, _______, _______, _______, UK_PSCR, UK_SLCK, UK_PAUS, _______, \ + UK_TAB, UK_LEFT, UK_DOWN, UK_RGHT, _______, RGB_SAD, RGB_SAI, _______, _______, _______, _______, UK_INS, UK_HOME, UK_PGUP, _TERM , \ + _S_TAB, _A_LEFT, IJ_OMN, _A_RGHT, _______, RGB_VAD, RGB_VAI, _______, _______, _______, _______, __NAR, UK_END, UK_PGDN, _______, \ + _______, _______, _______, _______, _______, RGB_RMOD,RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______ \ + ) }; -bool lightsOn = true; -int keyPresses = 0; -int effect = 0; -uint32_t key_timer; - -void resetCounts(void) { - effect++; - keyPresses = 0; - key_timer = timer_read32(); -} - -void matrix_scan_user(void) { - if (!lightsOn) { - rgblight_setrgb(0, 0, 0); - return; - } - if (timer_elapsed32(key_timer) > 60000) { - resetCounts(); - } - switch (effect) { - case 0: - rgblight_effect_breathing(3); - break; - case 1: - rgblight_effect_knight(3); - break; - case 2: - rgblight_effect_rainbow_swirl(128); - break; - case 3: - rgblight_effect_snake(30); - break; - case 4: - rgblight_effect_rainbow_swirl(128); - break; - case 5: - rgblight_effect_rainbow_mood(128); - break; - case 6: - rgblight_effect_christmas(); - break; - case 7: - rgblight_effect_rgbtest(); - break; - default: - effect = 0; - break; - } -} - bool process_record_user(uint16_t keycode, keyrecord_t *record) { - if (!record->event.pressed) return true; - if (keycode == L_SB) { - lightsOn = !lightsOn; - if (!lightsOn) { - keyPresses = 0; - } else { - resetCounts(); + if (record->event.pressed) { + switch(keycode) { + case IJ_OMN: + SEND_STRING(SS_TAP(X_LSHIFT)SS_TAP(X_LSHIFT)); + return false; } - return true; - } - if (keycode == L_NEXT) { - resetCounts(); - return true; - } - keyPresses++; - if (keyPresses > 100) { - resetCounts(); } return true; } From d7dea0e6d9a6e9a8ed7e760a996aac8f89560a5b Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 15 Oct 2018 08:31:26 -0700 Subject: [PATCH 176/505] Fix ErgoTravel Board It was not properly including the "config_common" files, and was causing it to break on the configurator. Additionally, updated this to use the split common code. --- keyboards/ergotravel/config.h | 73 +-- keyboards/ergotravel/ergotravel.h | 4 +- keyboards/ergotravel/i2c.c | 162 ------ keyboards/ergotravel/i2c.h | 49 -- keyboards/ergotravel/keymaps/ckofy/config.h | 6 +- keyboards/ergotravel/keymaps/ckofy/keymap.c | 12 +- keyboards/ergotravel/keymaps/ckofy/rules.mk | 3 - keyboards/ergotravel/keymaps/default/config.h | 7 +- keyboards/ergotravel/keymaps/default/rules.mk | 3 - keyboards/ergotravel/keymaps/ian/config.h | 7 +- keyboards/ergotravel/keymaps/ian/rules.mk | 3 - .../keymaps/jpconstantineau/config.h | 7 +- .../keymaps/jpconstantineau/rules.mk | 3 - keyboards/ergotravel/keymaps/viet/config.h | 6 +- keyboards/ergotravel/keymaps/viet/rules.mk | 3 - keyboards/ergotravel/matrix.c | 482 ------------------ keyboards/ergotravel/rev1/config.h | 6 +- keyboards/ergotravel/rules.mk | 10 +- keyboards/ergotravel/serial.c | 228 --------- keyboards/ergotravel/serial.h | 26 - keyboards/ergotravel/split_util.c | 86 ---- keyboards/ergotravel/split_util.h | 20 - 22 files changed, 20 insertions(+), 1186 deletions(-) delete mode 100644 keyboards/ergotravel/i2c.c delete mode 100644 keyboards/ergotravel/i2c.h delete mode 100644 keyboards/ergotravel/matrix.c delete mode 100644 keyboards/ergotravel/serial.c delete mode 100644 keyboards/ergotravel/serial.h delete mode 100644 keyboards/ergotravel/split_util.c delete mode 100644 keyboards/ergotravel/split_util.h diff --git a/keyboards/ergotravel/config.h b/keyboards/ergotravel/config.h index beda546a046a..21308018190b 100644 --- a/keyboards/ergotravel/config.h +++ b/keyboards/ergotravel/config.h @@ -15,76 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef REV1_CONFIG_H -#define REV1_CONFIG_H +#pragma once -#include QMK_KEYBOARD_CONFIG_H +#include "config_common.h" -/* USB Device descriptor parameter */ -#define VENDOR_ID 0xCEEB -#define PRODUCT_ID 0x1256 -#define DEVICE_VER 0x0100 -#define MANUFACTURER JPConstantineau.com -#define PRODUCT ErgoTravel Keyboard -#define DESCRIPTION Split 45 percent ergonomic keyboard - -/* key matrix size */ -// Rows are doubled-up -#define MATRIX_ROWS 8 -#define MATRIX_COLS 7 - -// wiring of each half -#define MATRIX_ROW_PINS { C6, D7, E6, B4 } -#define MATRIX_COL_PINS { F5, F6, F7, B1, B3, B2, B6 } - -/* 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)) \ -) - -#define BACKLIGHT_PIN B5 -#define BACKLIGHT_LEVELS 5 - -/* 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 diff --git a/keyboards/ergotravel/ergotravel.h b/keyboards/ergotravel/ergotravel.h index 10bc4e2bb9cd..7201db788dbe 100644 --- a/keyboards/ergotravel/ergotravel.h +++ b/keyboards/ergotravel/ergotravel.h @@ -1,5 +1,4 @@ -#ifndef ERGOTRAVEL_H -#define ERGOTRAVEL_H +#pragma once #ifdef KEYBOARD_ergotravel_rev1 #include "rev1.h" @@ -21,4 +20,3 @@ KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##L34, KC_##L35, KC_##R30, KC_##R31, KC_##R32, KC_##R33, KC_##R34, KC_##R35 \ ) -#endif \ No newline at end of file diff --git a/keyboards/ergotravel/i2c.c b/keyboards/ergotravel/i2c.c deleted file mode 100644 index 084c890c405f..000000000000 --- a/keyboards/ergotravel/i2c.c +++ /dev/null @@ -1,162 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "i2c.h" - -#ifdef USE_I2C - -// Limits the amount of we wait for any one i2c transaction. -// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is -// 9 bits, a single transaction will take around 90μs to complete. -// -// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit -// poll loop takes at least 8 clock cycles to execute -#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8 - -#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE) - -volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; - -static volatile uint8_t slave_buffer_pos; -static volatile bool slave_has_register_set = false; - -// Wait for an i2c operation to finish -inline static -void i2c_delay(void) { - uint16_t lim = 0; - while(!(TWCR & (1<10. - // Check datasheets for more info. - TWBR = ((F_CPU/SCL_CLOCK)-16)/2; -} - -// Start a transaction with the given i2c slave address. The direction of the -// transfer is set with I2C_READ and I2C_WRITE. -// returns: 0 => success -// 1 => error -uint8_t i2c_master_start(uint8_t address) { - TWCR = (1< slave ACK -// 1 => slave NACK -uint8_t i2c_master_write(uint8_t data) { - TWDR = data; - TWCR = (1<= SLAVE_BUFFER_SIZE ) { - ack = 0; - slave_buffer_pos = 0; - } - slave_has_register_set = true; - } else { - i2c_slave_buffer[slave_buffer_pos] = TWDR; - BUFFER_POS_INC(); - } - break; - - case TW_ST_SLA_ACK: - case TW_ST_DATA_ACK: - // master has addressed this device as a slave transmitter and is - // requesting data. - TWDR = i2c_slave_buffer[slave_buffer_pos]; - BUFFER_POS_INC(); - break; - - case TW_BUS_ERROR: // something went wrong, reset twi state - TWCR = 0; - default: - break; - } - // Reset everything, so we are ready for the next TWI interrupt - TWCR |= (1< - -#ifndef F_CPU -#define F_CPU 16000000UL -#endif - -#define I2C_READ 1 -#define I2C_WRITE 0 - -#define I2C_ACK 1 -#define I2C_NACK 0 - -#define SLAVE_BUFFER_SIZE 0x10 - -// i2c SCL clock frequency -#define SCL_CLOCK 100000L - -extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; - -void i2c_master_init(void); -uint8_t i2c_master_start(uint8_t address); -void i2c_master_stop(void); -uint8_t i2c_master_write(uint8_t data); -uint8_t i2c_master_read(int); -void i2c_reset_state(void); -void i2c_slave_init(uint8_t address); - - -static inline unsigned char i2c_start_read(unsigned char addr) { - return i2c_master_start((addr << 1) | I2C_READ); -} - -static inline unsigned char i2c_start_write(unsigned char addr) { - return i2c_master_start((addr << 1) | I2C_WRITE); -} - -// from SSD1306 scrips -extern unsigned char i2c_rep_start(unsigned char addr); -extern void i2c_start_wait(unsigned char addr); -extern unsigned char i2c_readAck(void); -extern unsigned char i2c_readNak(void); -extern unsigned char i2c_read(unsigned char ack); - -#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); - -#endif diff --git a/keyboards/ergotravel/keymaps/ckofy/config.h b/keyboards/ergotravel/keymaps/ckofy/config.h index 41ec06657e91..7c99c093c984 100644 --- a/keyboards/ergotravel/keymaps/ckofy/config.h +++ b/keyboards/ergotravel/keymaps/ckofy/config.h @@ -15,10 +15,7 @@ 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 - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -40,4 +37,3 @@ along with this program. If not, see . #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 -#endif diff --git a/keyboards/ergotravel/keymaps/ckofy/keymap.c b/keyboards/ergotravel/keymaps/ckofy/keymap.c index cc2c33cca36b..9de5fa2b8451 100644 --- a/keyboards/ergotravel/keymaps/ckofy/keymap.c +++ b/keyboards/ergotravel/keymaps/ckofy/keymap.c @@ -100,7 +100,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| , , , , , , , ,COMM, P1 , P2 , P3 ,PLUS, , //|----+----+----+----+----+----+----. .----+----+----+----+----+----+----| - , , , , , , , P0 ,NLCK, , , + , , , , , , , P0 ,NLCK, , , //`----+----+----+--+-+----/----/ \----\----+----+----+----+----' ), @@ -112,7 +112,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| ,UDO ,CUT ,CPY ,PST ,XXXX, , ,XXXX,XXXX,COMM,DOT ,SLSH, , //|----+----+----+----+----+----+----. .----+----+----+----+----+----+----| - , , , , , , , , , , , + , , , , , , , , , , , //`----+----+----+--+-+----/----/ \----\----+----+----+----+----' ), @@ -124,7 +124,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| , GRV,TILD,XXXX,EQL ,PLUS, , ,UNDS,MINS,COMM,DOT ,SLSH,ENT , //|----+----+----+----+----+----+----. .----+----+----+----+----+----+----| - , , , , , , , , , , , + , , , , , , , , , , , //`----+----+----+--+-+----/----/ \----\----+----+----+----+----' ), @@ -139,7 +139,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|----+----+----+----+----+----+----. .----+----+----+----+----+----+----| , , , , , , , , ,VOLD,VOLU,MUTE //`----+----+----+--+-+----/----/ \----\----+----+----+----+----' - ) + ) }; @@ -148,9 +148,9 @@ const uint16_t PROGMEM fn_actions[] = { ,[F_ALT] = ACTION_MODS_ONESHOT (MOD_LALT) ,[F_CTRL] = ACTION_MODS_ONESHOT (MOD_LCTL) ,[F_NUMPAD] = ACTION_LAYER_TAP_TOGGLE(_NUMPAD) -// ,[F_LOWER] = ACTION_LAYER_TAP_TOGGLE(LOWER) // FN1 - Momentary Layer 1 (Lower) +// ,[F_LOWER] = ACTION_LAYER_TAP_TOGGLE(LOWER) // FN1 - Momentary Layer 1 (Lower) // ,[F_RAISE] = ACTION_LAYER_TAP_TOGGLE(RAISE) // FN2 - Momentary Layer 2 (Raise) -}; +}; diff --git a/keyboards/ergotravel/keymaps/ckofy/rules.mk b/keyboards/ergotravel/keymaps/ckofy/rules.mk index 457a3d01d4a4..e69de29bb2d1 100644 --- a/keyboards/ergotravel/keymaps/ckofy/rules.mk +++ b/keyboards/ergotravel/keymaps/ckofy/rules.mk @@ -1,3 +0,0 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/ergotravel/keymaps/default/config.h b/keyboards/ergotravel/keymaps/default/config.h index abb8cfa8e6c3..eeca26ce1dbb 100644 --- a/keyboards/ergotravel/keymaps/default/config.h +++ b/keyboards/ergotravel/keymaps/default/config.h @@ -15,10 +15,7 @@ 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 - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -38,4 +35,4 @@ along with this program. If not, see . #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 -#endif + diff --git a/keyboards/ergotravel/keymaps/default/rules.mk b/keyboards/ergotravel/keymaps/default/rules.mk index 457a3d01d4a4..e69de29bb2d1 100644 --- a/keyboards/ergotravel/keymaps/default/rules.mk +++ b/keyboards/ergotravel/keymaps/default/rules.mk @@ -1,3 +0,0 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/ergotravel/keymaps/ian/config.h b/keyboards/ergotravel/keymaps/ian/config.h index b2e8ca9b5dfb..dea5b121ea9c 100644 --- a/keyboards/ergotravel/keymaps/ian/config.h +++ b/keyboards/ergotravel/keymaps/ian/config.h @@ -15,10 +15,7 @@ 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 - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -38,4 +35,4 @@ along with this program. If not, see . #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 -#endif + diff --git a/keyboards/ergotravel/keymaps/ian/rules.mk b/keyboards/ergotravel/keymaps/ian/rules.mk index 457a3d01d4a4..e69de29bb2d1 100644 --- a/keyboards/ergotravel/keymaps/ian/rules.mk +++ b/keyboards/ergotravel/keymaps/ian/rules.mk @@ -1,3 +0,0 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/ergotravel/keymaps/jpconstantineau/config.h b/keyboards/ergotravel/keymaps/jpconstantineau/config.h index abb8cfa8e6c3..eeca26ce1dbb 100644 --- a/keyboards/ergotravel/keymaps/jpconstantineau/config.h +++ b/keyboards/ergotravel/keymaps/jpconstantineau/config.h @@ -15,10 +15,7 @@ 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 - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -38,4 +35,4 @@ along with this program. If not, see . #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 -#endif + diff --git a/keyboards/ergotravel/keymaps/jpconstantineau/rules.mk b/keyboards/ergotravel/keymaps/jpconstantineau/rules.mk index 457a3d01d4a4..e69de29bb2d1 100644 --- a/keyboards/ergotravel/keymaps/jpconstantineau/rules.mk +++ b/keyboards/ergotravel/keymaps/jpconstantineau/rules.mk @@ -1,3 +0,0 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/ergotravel/keymaps/viet/config.h b/keyboards/ergotravel/keymaps/viet/config.h index 24e95b2b96f0..1c6c400b4505 100644 --- a/keyboards/ergotravel/keymaps/viet/config.h +++ b/keyboards/ergotravel/keymaps/viet/config.h @@ -15,10 +15,7 @@ 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 - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -39,4 +36,3 @@ along with this program. If not, see . #define RGBLIGHT_VAL_STEP 20 #define RGBLIGHT_LIMIT_VAL 220 -#endif diff --git a/keyboards/ergotravel/keymaps/viet/rules.mk b/keyboards/ergotravel/keymaps/viet/rules.mk index da4752731bb8..24963d46b686 100644 --- a/keyboards/ergotravel/keymaps/viet/rules.mk +++ b/keyboards/ergotravel/keymaps/viet/rules.mk @@ -2,6 +2,3 @@ RGBLIGHT_ENABLE = yes BACKLIGHT_ENABLE = no UNICODE_ENABLE = yes -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/ergotravel/matrix.c b/keyboards/ergotravel/matrix.c deleted file mode 100644 index 4061924dc22e..000000000000 --- a/keyboards/ergotravel/matrix.c +++ /dev/null @@ -1,482 +0,0 @@ -/* -Copyright 2018 Pierre Constantineau - -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 . -*/ - -/* - * scan matrix - */ -#include -#include -#include -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "split_util.h" -#include "pro_micro.h" -#include "config.h" -#include "timer.h" -#include "backlight.h" - -#ifdef USE_I2C -# include "i2c.h" -#else // USE_SERIAL -# include "serial.h" -#endif - -#ifndef DEBOUNCING_DELAY -# define DEBOUNCING_DELAY 5 -#endif - -#if (DEBOUNCING_DELAY > 0) - static uint16_t debouncing_time; - static bool debouncing = false; -#endif - -#if (MATRIX_COLS <= 8) -# define print_matrix_header() print("\nr/c 01234567\n") -# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) -# define matrix_bitpop(i) bitpop(matrix[i]) -# define ROW_SHIFTER ((uint8_t)1) -#else -# error "Currently only supports 8 COLS" -#endif -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -#define ERROR_DISCONNECT_COUNT 5 - -#define SERIAL_LED_ADDR 0x00 - -#define ROWS_PER_HAND (MATRIX_ROWS/2) - -static uint8_t error_count = 0; - -static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; -static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -#if (DIODE_DIRECTION == COL2ROW) - static void init_cols(void); - static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row); - static void unselect_rows(void); - static void select_row(uint8_t row); - static void unselect_row(uint8_t row); -#elif (DIODE_DIRECTION == ROW2COL) - static void init_rows(void); - static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); - static void unselect_cols(void); - static void unselect_col(uint8_t col); - static void select_col(uint8_t col); -#endif - - -__attribute__ ((weak)) -void matrix_init_kb(void) { - matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { - matrix_scan_user(); -} - -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ - debug_enable = true; - debug_matrix = true; - debug_mouse = true; - // initialize row and col - unselect_rows(); - init_cols(); - - TX_RX_LED_INIT; - - // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) { - matrix[i] = 0; - matrix_debouncing[i] = 0; - } - - matrix_init_quantum(); - -} - -uint8_t _matrix_scan(void) -{ - int offset = isLeftHand ? 0 : (ROWS_PER_HAND); -#if (DIODE_DIRECTION == COL2ROW) - // Set row, read cols - for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) { -# if (DEBOUNCING_DELAY > 0) - bool matrix_changed = read_cols_on_row(matrix_debouncing+offset, current_row); - - if (matrix_changed) { - debouncing = true; - debouncing_time = timer_read(); - PORTD ^= (1 << 2); - } - -# else - read_cols_on_row(matrix+offset, current_row); -# endif - - } - -#elif (DIODE_DIRECTION == ROW2COL) - // Set col, read rows - for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { -# if (DEBOUNCING_DELAY > 0) - bool matrix_changed = read_rows_on_col(matrix_debouncing+offset, current_col); - if (matrix_changed) { - debouncing = true; - debouncing_time = timer_read(); - } -# else - read_rows_on_col(matrix+offset, current_col); -# endif - - } -#endif - -# if (DEBOUNCING_DELAY > 0) - if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { - for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { - matrix[i+offset] = matrix_debouncing[i+offset]; - } - debouncing = false; - } -# endif - - return 1; -} - -#ifdef USE_I2C - -// Get rows from other half over i2c -int i2c_transaction(void) { - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - - int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); - if (err) goto i2c_error; - - // start of matrix stored at 0x00 - err = i2c_master_write(0x00); - if (err) goto i2c_error; - -#ifdef BACKLIGHT_ENABLE - // Write backlight level for slave to read - err = i2c_master_write(get_backlight_level()); -#else - // Write zero, so our byte index is the same - err = i2c_master_write(0x00); -#endif - if (err) goto i2c_error; - - // Start read - err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); - if (err) goto i2c_error; - - if (!err) { - int i; - for (i = 0; i < ROWS_PER_HAND-1; ++i) { - matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); - } - matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); - i2c_master_stop(); - } else { -i2c_error: // the cable is disconnceted, or something else went wrong - i2c_reset_state(); - return err; - } - - return 0; -} - -#else // USE_SERIAL - -int serial_transaction(void) { - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - - if (serial_update_buffers()) { - return 1; - } - - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = serial_slave_buffer[i]; - } - -#ifdef BACKLIGHT_ENABLE - // Write backlight level for slave to read - serial_master_buffer[SERIAL_LED_ADDR] = get_backlight_level(); -#endif - return 0; -} -#endif - -uint8_t matrix_scan(void) -{ - uint8_t ret = _matrix_scan(); - -#ifdef USE_I2C - if( i2c_transaction() ) { -#else // USE_SERIAL - if( serial_transaction() ) { -#endif - // turn on the indicator led when halves are disconnected - TXLED1; - - error_count++; - - if (error_count > ERROR_DISCONNECT_COUNT) { - // reset other half if disconnected - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = 0; - } - } - } else { - // turn off the indicator led on no error - TXLED0; - error_count = 0; - } - matrix_scan_quantum(); - return ret; -} - -void matrix_slave_scan(void) { - _matrix_scan(); - - int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; - -#ifdef USE_I2C -#ifdef BACKLIGHT_ENABLE - // Read backlight level sent from master and update level on slave - backlight_set(i2c_slave_buffer[0]); -#endif - for (int i = 0; i < ROWS_PER_HAND; ++i) { - i2c_slave_buffer[i+1] = matrix[offset+i]; - } -#else // USE_SERIAL - for (int i = 0; i < ROWS_PER_HAND; ++i) { - serial_slave_buffer[i] = matrix[offset+i]; - } - -#ifdef BACKLIGHT_ENABLE - // Read backlight level sent from master and update level on slave - backlight_set(serial_master_buffer[SERIAL_LED_ADDR]); -#endif -#endif -} - -bool matrix_is_modified(void) -{ - if (debouncing) return false; - return true; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & ((matrix_row_t)1<> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) -{ - // Store last value of row prior to reading - matrix_row_t last_row_value = current_matrix[current_row]; - - // Clear data in matrix row - current_matrix[current_row] = 0; - - // Select row and wait for row selecton to stabilize - select_row(current_row); - wait_us(30); - - // For each col... - for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { - - // Select the col pin to read (active low) - uint8_t pin = col_pins[col_index]; - uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); - - // Populate the matrix row with the state of the col pin - current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); - } - - // Unselect row - unselect_row(current_row); - - return (last_row_value != current_matrix[current_row]); -} - -static void select_row(uint8_t row) -{ - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW -} - -static void unselect_row(uint8_t row) -{ - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI -} - -static void unselect_rows(void) -{ - for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -#elif (DIODE_DIRECTION == ROW2COL) - -static void init_rows(void) -{ - for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) -{ - bool matrix_changed = false; - - // Select col and wait for col selecton to stabilize - select_col(current_col); - wait_us(30); - - // For each row... - for(uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) - { - - // Store last value of row prior to reading - matrix_row_t last_row_value = current_matrix[row_index]; - - // Check row pin state - if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) - { - // Pin LO, set col bit - current_matrix[row_index] |= (ROW_SHIFTER << current_col); - } - else - { - // Pin HI, clear col bit - current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); - } - - // Determine if the matrix changed state - if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) - { - matrix_changed = true; - } - } - - // Unselect col - unselect_col(current_col); - - return matrix_changed; -} - -static void select_col(uint8_t col) -{ - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW -} - -static void unselect_col(uint8_t col) -{ - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI -} - -static void unselect_cols(void) -{ - for(uint8_t x = 0; x < MATRIX_COLS; x++) { - uint8_t pin = col_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -#endif diff --git a/keyboards/ergotravel/rev1/config.h b/keyboards/ergotravel/rev1/config.h index beda546a046a..5fa447da746f 100644 --- a/keyboards/ergotravel/rev1/config.h +++ b/keyboards/ergotravel/rev1/config.h @@ -15,10 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef REV1_CONFIG_H -#define REV1_CONFIG_H - -#include QMK_KEYBOARD_CONFIG_H +#pragma once /* USB Device descriptor parameter */ #define VENDOR_ID 0xCEEB @@ -87,4 +84,3 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION -#endif diff --git a/keyboards/ergotravel/rules.mk b/keyboards/ergotravel/rules.mk index fceb56edf8b0..d2da788067b4 100644 --- a/keyboards/ergotravel/rules.mk +++ b/keyboards/ergotravel/rules.mk @@ -1,7 +1,3 @@ -SRC += matrix.c \ - i2c.c \ - split_util.c \ - serial.c # MCU name #MCU = at90usb1287 @@ -41,7 +37,7 @@ F_USB = $(F_CPU) # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = caterina @@ -64,11 +60,9 @@ 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. -SUBPROJECT_rev1 = yes -USE_I2C = yes # I2C is used between the sides # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -CUSTOM_MATRIX = yes +SPLIT_KEYBOARD = yes DEFAULT_FOLDER = ergotravel/rev1 diff --git a/keyboards/ergotravel/serial.c b/keyboards/ergotravel/serial.c deleted file mode 100644 index 74bcbb6bf6e2..000000000000 --- a/keyboards/ergotravel/serial.c +++ /dev/null @@ -1,228 +0,0 @@ -/* - * WARNING: be careful changing this code, it is very timing dependent - */ - -#ifndef F_CPU -#define F_CPU 16000000 -#endif - -#include -#include -#include -#include -#include "serial.h" - -#ifndef USE_I2C - -// Serial pulse period in microseconds. Its probably a bad idea to lower this -// value. -#define SERIAL_DELAY 24 - -uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; -uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; - -#define SLAVE_DATA_CORRUPT (1<<0) -volatile uint8_t status = 0; - -inline static -void serial_delay(void) { - _delay_us(SERIAL_DELAY); -} - -inline static -void serial_output(void) { - SERIAL_PIN_DDR |= SERIAL_PIN_MASK; -} - -// make the serial pin an input with pull-up resistor -inline static -void serial_input(void) { - SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK; - SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -inline static -uint8_t serial_read_pin(void) { - return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); -} - -inline static -void serial_low(void) { - SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; -} - -inline static -void serial_high(void) { - SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -void serial_master_init(void) { - serial_output(); - serial_high(); -} - -void serial_slave_init(void) { - serial_input(); - - // Enable INT0 - EIMSK |= _BV(INT0); - // Trigger on falling edge of INT0 - EICRA &= ~(_BV(ISC00) | _BV(ISC01)); -} - -// Used by the master to synchronize timing with the slave. -static -void sync_recv(void) { - serial_input(); - // This shouldn't hang if the slave disconnects because the - // serial line will float to high if the slave does disconnect. - while (!serial_read_pin()); - serial_delay(); -} - -// Used by the slave to send a synchronization signal to the master. -static -void sync_send(void) { - serial_output(); - - serial_low(); - serial_delay(); - - serial_high(); -} - -// Reads a byte from the serial line -static -uint8_t serial_read_byte(void) { - uint8_t byte = 0; - serial_input(); - for ( uint8_t i = 0; i < 8; ++i) { - byte = (byte << 1) | serial_read_pin(); - serial_delay(); - _delay_us(1); - } - - return byte; -} - -// Sends a byte with MSB ordering -static -void serial_write_byte(uint8_t data) { - uint8_t b = 8; - serial_output(); - while( b-- ) { - if(data & (1 << b)) { - serial_high(); - } else { - serial_low(); - } - serial_delay(); - } -} - -// interrupt handle to be used by the slave device -ISR(SERIAL_PIN_INTERRUPT) { - sync_send(); - - uint8_t checksum = 0; - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_slave_buffer[i]); - sync_send(); - checksum += serial_slave_buffer[i]; - } - serial_write_byte(checksum); - sync_send(); - - // wait for the sync to finish sending - serial_delay(); - - // read the middle of pulses - _delay_us(SERIAL_DELAY/2); - - uint8_t checksum_computed = 0; - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_master_buffer[i] = serial_read_byte(); - sync_send(); - checksum_computed += serial_master_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_send(); - - serial_input(); // end transaction - - if ( checksum_computed != checksum_received ) { - status |= SLAVE_DATA_CORRUPT; - } else { - status &= ~SLAVE_DATA_CORRUPT; - } -} - -inline -bool serial_slave_DATA_CORRUPT(void) { - return status & SLAVE_DATA_CORRUPT; -} - -// Copies the serial_slave_buffer to the master and sends the -// serial_master_buffer to the slave. -// -// Returns: -// 0 => no error -// 1 => slave did not respond -int serial_update_buffers(void) { - // this code is very time dependent, so we need to disable interrupts - cli(); - - // signal to the slave that we want to start a transaction - serial_output(); - serial_low(); - _delay_us(1); - - // wait for the slaves response - serial_input(); - serial_high(); - _delay_us(SERIAL_DELAY); - - // check if the slave is present - if (serial_read_pin()) { - // slave failed to pull the line low, assume not present - sei(); - return 1; - } - - // if the slave is present syncronize with it - sync_recv(); - - uint8_t checksum_computed = 0; - // receive data from the slave - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_slave_buffer[i] = serial_read_byte(); - sync_recv(); - checksum_computed += serial_slave_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_recv(); - - if (checksum_computed != checksum_received) { - sei(); - return 1; - } - - uint8_t checksum = 0; - // send data to the slave - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_master_buffer[i]); - sync_recv(); - checksum += serial_master_buffer[i]; - } - serial_write_byte(checksum); - sync_recv(); - - // always, release the line when not in use - serial_output(); - serial_high(); - - sei(); - return 0; -} - -#endif diff --git a/keyboards/ergotravel/serial.h b/keyboards/ergotravel/serial.h deleted file mode 100644 index 15fe4db7b4c6..000000000000 --- a/keyboards/ergotravel/serial.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef MY_SERIAL_H -#define MY_SERIAL_H - -#include "config.h" -#include - -/* TODO: some defines for interrupt setup */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD0) -#define SERIAL_PIN_INTERRUPT INT0_vect - -#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -#define SERIAL_MASTER_BUFFER_LENGTH 1 - -// Buffers for master - slave communication -extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; -extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; - -void serial_master_init(void); -void serial_slave_init(void); -int serial_update_buffers(void); -bool serial_slave_data_corrupt(void); - -#endif diff --git a/keyboards/ergotravel/split_util.c b/keyboards/ergotravel/split_util.c deleted file mode 100644 index 346cbc908949..000000000000 --- a/keyboards/ergotravel/split_util.c +++ /dev/null @@ -1,86 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "split_util.h" -#include "matrix.h" -#include "keyboard.h" -#include "config.h" -#include "timer.h" - -#ifdef USE_I2C -# include "i2c.h" -#else -# include "serial.h" -#endif - -volatile bool isLeftHand = true; - -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) - isLeftHand = !has_usb(); - #else - isLeftHand = has_usb(); - #endif - #endif -} - -static void keyboard_master_setup(void) { -#ifdef USE_I2C - i2c_master_init(); -#ifdef SSD1306OLED - matrix_master_OLED_init (); -#endif -#else - serial_master_init(); -#endif -} - -static void keyboard_slave_setup(void) { - timer_init(); -#ifdef USE_I2C - i2c_slave_init(SLAVE_I2C_ADDRESS); -#else - serial_slave_init(); -#endif -} - -bool has_usb(void) { - USBCON |= (1 << OTGPADE); //enables VBUS pad - _delay_us(5); - return (USBSTA & (1< -#include "eeconfig.h" - -#define SLAVE_I2C_ADDRESS 0x32 - -extern volatile bool isLeftHand; - -// slave version of matix scan, defined in matrix.c -void matrix_slave_scan(void); - -void split_keyboard_setup(void); -bool has_usb(void); -void keyboard_slave_loop(void); - -void matrix_master_OLED_init (void); - -#endif From 9fbd7eb7a58ff5a39ffcaa3fcc50320e63c8ec08 Mon Sep 17 00:00:00 2001 From: QMK Bot Date: Mon, 15 Oct 2018 16:24:29 +0000 Subject: [PATCH 177/505] convert to unix line-endings [skip ci] --- keyboards/ergotravel/keymaps/ckofy/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/ergotravel/keymaps/ckofy/keymap.c b/keyboards/ergotravel/keymaps/ckofy/keymap.c index 9de5fa2b8451..7b3b333a5d87 100644 --- a/keyboards/ergotravel/keymaps/ckofy/keymap.c +++ b/keyboards/ergotravel/keymaps/ckofy/keymap.c @@ -1,4 +1,4 @@ -#include QMK_KEYBOARD_H +#include QMK_KEYBOARD_H extern keymap_config_t keymap_config; From f0f9283d02cf4a61f185ed0bf5fc83ee8247f41d Mon Sep 17 00:00:00 2001 From: Vyolle <44031868+Vyolle@users.noreply.github.com> Date: Mon, 15 Oct 2018 12:21:14 -0500 Subject: [PATCH 178/505] Keymap: add new keymap for Iris (#4119) * Add files via upload * Delete config.h * Delete keymap.c * Delete rules.mk * Keymap w/mirror mode and steno support. Keymap w/mirror mode and steno support. Can be used entirely one handed. * Fixed some niggling issues. --- keyboards/iris/keymaps/vyolle_steno/config.h | 34 +++++ keyboards/iris/keymaps/vyolle_steno/keymap.c | 149 +++++++++++++++++++ keyboards/iris/keymaps/vyolle_steno/rules.mk | 7 + 3 files changed, 190 insertions(+) create mode 100644 keyboards/iris/keymaps/vyolle_steno/config.h create mode 100644 keyboards/iris/keymaps/vyolle_steno/keymap.c create mode 100644 keyboards/iris/keymaps/vyolle_steno/rules.mk diff --git a/keyboards/iris/keymaps/vyolle_steno/config.h b/keyboards/iris/keymaps/vyolle_steno/config.h new file mode 100644 index 000000000000..9cbc148e425b --- /dev/null +++ b/keyboards/iris/keymaps/vyolle_steno/config.h @@ -0,0 +1,34 @@ +/* +Copyright 2017 Danny Nguyen + +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 + +/* Use I2C or Serial, not both */ + +#define USE_I2C +// #define USE_SERIAL + + +#define FORCE_NKRO //For Steno. + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + + diff --git a/keyboards/iris/keymaps/vyolle_steno/keymap.c b/keyboards/iris/keymaps/vyolle_steno/keymap.c new file mode 100644 index 000000000000..3ad117655ae1 --- /dev/null +++ b/keyboards/iris/keymaps/vyolle_steno/keymap.c @@ -0,0 +1,149 @@ +#include QMK_KEYBOARD_H +#include "keymap_steno.h" + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _PLOVER 3 +#define _ADJUST 4 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, + PLOVER, + EXT_PLV, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, PLOVER, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + RAISE, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_RBRC, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_BSPC, KC_RSFT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LGUI, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + KC_LCTL, LOWER, KC_SPC, KC_BSPC, KC_ENT, KC_LALT + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_LOWER] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_DEL, KC_0, KC_9, KC_8, KC_7, KC_6, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_SCLN, KC_P, KC_O, KC_I, KC_U, KC_Y, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, KC_QUOT, KC_L, KC_K, KC_J, KC_H, _______, KC_LEFT, KC_UP, KC_RGHT, KC_SCLN, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_ENT, KC_SLSH, KC_DOT, KC_COMM, KC_M, KC_N, KC_LALT, _______, _______, _______, KC_DOWN, _______, _______, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, KC_LGUI, _______, _______, _______ + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_RAISE] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + 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_VOLU, KC_LEFT, KC_UP, KC_RGHT, KC_INS, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_MUTE, KC_VOLD, KC_PGUP, KC_DOWN, KC_PGDN, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, KC_LALT, _______, _______, _______ + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_ADJUST] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_GRV, KC_HOME, KC_LBRC, KC_RBRC, KC_PIPE, KC_APP, KC_SLCK, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_PSCR, KC_END, KC_LCBR, KC_RCBR, KC_PLUS, KC_EQL, KC_PAUS, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, KC_BSLS, KC_MINS, KC_UNDS, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, _______, _______, _______, _______ + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_PLOVER] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + STN_PWR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EXT_PLV, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + STN_N1, STN_N2, STN_N3, STN_N4, STN_N5, STN_N6, STN_N7, STN_N8, STN_N9, STN_NA, STN_NB, STN_NC, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + STN_FN, STN_S1, STN_TL, STN_PL, STN_HL, STN_ST1, STN_ST3, STN_FR, STN_PR, STN_LR, STN_TR, STN_DR, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX, STN_S2, STN_KL, STN_WL, STN_RL, STN_ST2, STN_RE1, STN_RE2, STN_ST4, STN_RR, STN_BR, STN_GR, STN_SR, STN_ZR, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + XXXXXXX, STN_A, STN_O, STN_E, STN_U, XXXXXXX + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ) +}; + + +void matrix_init_user() { + steno_set_mode(STENO_MODE_GEMINI); // or STENO_MODE_BOLT +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + 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; + case PLOVER: + if (!record->event.pressed) { + layer_on(_PLOVER); + } + return false; + break; + case EXT_PLV: + if (record->event.pressed) { + layer_off(_PLOVER); + } + return false; + break; + } + return true; +} diff --git a/keyboards/iris/keymaps/vyolle_steno/rules.mk b/keyboards/iris/keymaps/vyolle_steno/rules.mk new file mode 100644 index 000000000000..e41231683370 --- /dev/null +++ b/keyboards/iris/keymaps/vyolle_steno/rules.mk @@ -0,0 +1,7 @@ +EXTRAKEY_ENABLE = no +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +STENO_ENABLE = yes # Additional protocols for Stenography(+1700), requires VIRTSER +AUDIO_ENABLE = no # Audio output on port C6 +MIDI_ENABLE = no # MIDI controls +NKRO_ENABLE = yes +BOOTMAGIC_ENABLE = yes \ No newline at end of file From ec86141a4a558fc51b9ebfdcb14106b8a8d051d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=BDan=20Pevec?= Date: Mon, 15 Oct 2018 19:39:58 +0200 Subject: [PATCH 179/505] Basic Slovenian keymap added (#4128) * Basic Slovenian keymap added * Author fixed --- quantum/keymap_extras/keymap_slovenian.h | 106 +++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 quantum/keymap_extras/keymap_slovenian.h diff --git a/quantum/keymap_extras/keymap_slovenian.h b/quantum/keymap_extras/keymap_slovenian.h new file mode 100644 index 000000000000..8b197e6c5b20 --- /dev/null +++ b/quantum/keymap_extras/keymap_slovenian.h @@ -0,0 +1,106 @@ +/* Copyright 2018 Žan Pevec + * + * 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_SLOVENIAN +#define KEYMAP_SLOVENIAN +#include "keymap.h" + + +//Swapped Z and Y +#define SI_Z KC_Y +#define SI_Y KC_Z + +//Special characters +#define SI_CV KC_SCLN +#define SI_SV KC_LBRC +#define SI_ZV KC_BSLS + +#define SI_A KC_A +#define SI_B KC_B +#define SI_C KC_C +#define SI_D KC_D +#define SI_E KC_E +#define SI_F KC_F +#define SI_G KC_G +#define SI_H KC_H +#define SI_I KC_I +#define SI_J KC_J +#define SI_K KC_K +#define SI_L KC_L +#define SI_M KC_M +#define SI_N KC_N +#define SI_O KC_O +#define SI_P KC_P +#define SI_Q KC_Q +#define SI_R KC_R +#define SI_S KC_S +#define SI_T KC_T +#define SI_U KC_U +#define SI_V KC_V +#define SI_W KC_W +#define SI_X KC_X + +#define SI_0 KC_0 +#define SI_1 KC_1 +#define SI_2 KC_2 +#define SI_3 KC_3 +#define SI_4 KC_4 +#define SI_5 KC_5 +#define SI_6 KC_6 +#define SI_7 KC_7 +#define SI_8 KC_8 +#define SI_9 KC_9 + +#define SI_DOT KC_DOT +#define SI_COMM KC_COMM + +#define SI_PLUS KC_EQL // + and * and ~ +#define SI_QOT KC_MINS // Single quote +#define SI_MINS KC_SLSH // - and _ + +// shifted characters +#define SI_EXLM LSFT(KC_1) // ! +#define SO_DQOT LSFT(KC_2) // " +#define SI_HASH LSFT(KC_3) // # +#define SI_DLR LSFT(KC_4) // $ +#define SI_PERC LSFT(KC_5) // % +#define SI_AMPR LSFT(KC_6) // & +#define SI_SLSH LSFT(KC_7) // / +#define SI_LPRN LSFT(KC_8) // ( +#define SI_RPRN LSFT(KC_9) // ) +#define SI_EQL LSFT(KC_0) // = +#define SI_QST LSFT(SI_QOT) // ? +#define SI_ASTR LSFT(SI_PLUS) // * +#define SI_COLN LSFT(KC_DOT) // : +#define SI_SCLN LSFT(KC_COMM) // ; +#define SI_UNDS LSFT(SI_MINS) // _ + +// Alt Gr-ed characters +#define SI_CIRC ALGR(KC_3) // ^ +#define SI_DEG ALGR(KC_5) // ° +#define SI_GRV ALGR(KC_7) // ` +#define SI_ACCU ALGR(KC_9) // ´ +#define SI_LCBR ALGR(KC_B) // { +#define SI_RCBR ALGR(KC_N) // } +#define SI_LBRC ALGR(KC_F) // [ +#define SI_RBRC ALGR(KC_G) // ] +#define SI_BSLS ALGR(KC_Q) // backslash +#define SI_AT ALGR(KC_V) // @ +#define SI_EURO ALGR(KC_E) // € +#define SI_TILD ALGR(KC_1) // ~ +#define SI_PIPE ALGR(KC_W) // | + +#endif From 47e29754c215d02af39f3ee6158d4d6b76a7bffc Mon Sep 17 00:00:00 2001 From: Chris <38164944+ChrisUC@users.noreply.github.com> Date: Mon, 15 Oct 2018 12:41:43 -0500 Subject: [PATCH 180/505] Keymap: added default layout to the kbd6x for the tofu hhkb (#4132) * added layouts * fixed * might aswell fix the default layout aswell --- keyboards/kbd6x/keymaps/default/keymap.c | 19 ------- .../keymaps/hhkb-default-improved/keymap.c | 50 ++++++++++++++++++ .../keymaps/hhkb-default-improved/readme.md | 1 + keyboards/kbd6x/keymaps/hhkb-default/keymap.c | 51 +++++++++++++++++++ .../kbd6x/keymaps/hhkb-default/readme.md | 1 + 5 files changed, 103 insertions(+), 19 deletions(-) create mode 100644 keyboards/kbd6x/keymaps/hhkb-default-improved/keymap.c create mode 100644 keyboards/kbd6x/keymaps/hhkb-default-improved/readme.md create mode 100644 keyboards/kbd6x/keymaps/hhkb-default/keymap.c create mode 100644 keyboards/kbd6x/keymaps/hhkb-default/readme.md diff --git a/keyboards/kbd6x/keymaps/default/keymap.c b/keyboards/kbd6x/keymaps/default/keymap.c index fd73b1445f0e..00adbf8873b3 100644 --- a/keyboards/kbd6x/keymaps/default/keymap.c +++ b/keyboards/kbd6x/keymaps/default/keymap.c @@ -33,25 +33,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -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) { diff --git a/keyboards/kbd6x/keymaps/hhkb-default-improved/keymap.c b/keyboards/kbd6x/keymaps/hhkb-default-improved/keymap.c new file mode 100644 index 000000000000..80c22e5d9023 --- /dev/null +++ b/keyboards/kbd6x/keymaps/hhkb-default-improved/keymap.c @@ -0,0 +1,50 @@ +/* Copyright 2018 MechMerlin + * + * 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 QMK_KEYBOARD_H + +// iproved hhkb layout with more functionality + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + 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(1), + KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, KC_RCTL + ), + + [1] = LAYOUT( + 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_INS, RESET, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_DEL, + KC_RCTL, KC_VOLU, KC_VOLD, KC_MUTE, KC_MPLY, KC_MSTP, KC_ASTR, KC_SLSH, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PLUS, KC_UNDS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + diff --git a/keyboards/kbd6x/keymaps/hhkb-default-improved/readme.md b/keyboards/kbd6x/keymaps/hhkb-default-improved/readme.md new file mode 100644 index 000000000000..be22dd16c0b2 --- /dev/null +++ b/keyboards/kbd6x/keymaps/hhkb-default-improved/readme.md @@ -0,0 +1 @@ +# this is the default hhkb layout in a more useable normalized form (aka the way i use mine) \ No newline at end of file diff --git a/keyboards/kbd6x/keymaps/hhkb-default/keymap.c b/keyboards/kbd6x/keymaps/hhkb-default/keymap.c new file mode 100644 index 000000000000..03153b67ac11 --- /dev/null +++ b/keyboards/kbd6x/keymaps/hhkb-default/keymap.c @@ -0,0 +1,51 @@ +/* Copyright 2018 MechMerlin + * + * 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 QMK_KEYBOARD_H + +// stock hhkb as referenced by https://i.imgur.com/QoBTDHf.png + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + 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(1), + KC_TRNS, KC_LALT, KC_LGUI, KC_SPACE, KC_RGUI, KC_RALT, KC_TRNS + ), + + [1] = LAYOUT( + 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_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, RESET, + KC_TRNS, KC_VOLU, KC_VOLD, KC_MUTE, KC_MSTP, KC_TRNS, KC_ASTR, KC_SLSH, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PLUS, KC_UNDS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), +}; + + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + diff --git a/keyboards/kbd6x/keymaps/hhkb-default/readme.md b/keyboards/kbd6x/keymaps/hhkb-default/readme.md new file mode 100644 index 000000000000..cf93c3553a21 --- /dev/null +++ b/keyboards/kbd6x/keymaps/hhkb-default/readme.md @@ -0,0 +1 @@ +# default hhkb layout adapted to the 6x (for tofu hhkb) \ No newline at end of file From 64459fedbff54d8e8c3943e75624377a6b70464c Mon Sep 17 00:00:00 2001 From: Christoffer Holmberg Date: Mon, 15 Oct 2018 20:42:38 +0300 Subject: [PATCH 181/505] Keymap: Reworked layout (#4133) * Reworked layout * Remove redundant defines https://github.com/qmk/qmk_firmware/pull/4133#discussion_r224977420 * fix typo --- keyboards/planck/keymaps/skug/config.h | 13 +- keyboards/planck/keymaps/skug/keymap.c | 256 ++++++++++++------------ keyboards/planck/keymaps/skug/readme.md | 7 +- keyboards/planck/keymaps/skug/rules.mk | 2 + 4 files changed, 148 insertions(+), 130 deletions(-) diff --git a/keyboards/planck/keymaps/skug/config.h b/keyboards/planck/keymaps/skug/config.h index 0a1d8d2892c8..79f77786adee 100644 --- a/keyboards/planck/keymaps/skug/config.h +++ b/keyboards/planck/keymaps/skug/config.h @@ -1,13 +1,20 @@ #pragma once +// Override SpaceCadet Settings +#undef LSPO_KEY +#undef RSPC_KEY +#define LSPO_KEY KC_8 // Nordic Left SpaceCadet +#define RSPC_KEY KC_9 // Nordic Right SpaceCadet + +// Audio #ifdef AUDIO_ENABLE - #define STARTUP_SONG SONG(PLANCK_SOUND) - // #define STARTUP_SONG SONG(NO_SOUND) + #define STARTUP_SONG SONG(COIN_SOUND) #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ SONG(COLEMAK_SOUND), \ SONG(DVORAK_SOUND) \ } +#endif /* * MIDI options @@ -35,5 +42,3 @@ // Most tactile encoders have detents every 4 stages #define ENCODER_RESOLUTION 4 - -#endif diff --git a/keyboards/planck/keymaps/skug/keymap.c b/keyboards/planck/keymaps/skug/keymap.c index 00b2ab21ce09..29324a09e499 100644 --- a/keyboards/planck/keymaps/skug/keymap.c +++ b/keyboards/planck/keymaps/skug/keymap.c @@ -1,4 +1,4 @@ -/* Copyright 2015-2017 Jack Humbert +/* Copyright 2015-2017 Jack Humbert, Christoffer Holmberg * * 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 @@ -15,158 +15,124 @@ */ #include QMK_KEYBOARD_H +#include "keymap_swedish.h" #include "muse.h" extern keymap_config_t keymap_config; enum planck_layers { - _QWERTY, - _COLEMAK, - _DVORAK, + _DEFAULT, _LOWER, _RAISE, - _PLOVER, + _UTILITY, _ADJUST }; enum planck_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - PLOVER, + DEFAULT = SAFE_RANGE, + RAISE, + LOWER, + UTILITY, BACKLIT, - EXT_PLV + S1, S2, S3, S4, S5, S6, S7, S8, S9 }; -#define LOWER MO(_LOWER) -#define RAISE MO(_RAISE) +#define ESC_LOW LT(_LOWER, KC_ESC) +#define BSP_RAI LT(_RAISE, KC_BSPC) +#define LFT_CTR CTL_T(NO_APOS) +#define RGT_CTR CTL_T(KC_TILD) +#define UTILITY MO(_UTILITY) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Qwerty * ,-----------------------------------------------------------------------------------. - * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Å | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Esc | A | S | D | F | G | H | J | K | L | ; | " | + * | Fn | A | S | D | F | G | H | J | K | L | Ö | Ä | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | + * | Shift| Z | X | C | V | B | N | M | , | . | - |Shift | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * | Ctrl | Super| Alt | |L/Esc | Ret | Space|R/Bspc| |AltGr | * | ¨ | * `-----------------------------------------------------------------------------------' */ -[_QWERTY] = LAYOUT_planck_grid( - 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 +[_DEFAULT] = LAYOUT_planck_grid( + KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , NO_AA , + UTILITY, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , NO_OSLH, NO_AE , + KC_LSPO, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , NO_MINS, KC_RSPC, + LFT_CTR, KC_LALT, KC_LGUI, NO_AT , ESC_LOW, KC_ENT , KC_SPC , BSP_RAI, _______, NO_ALGR, NO_ASTR, RGT_CTR ), -/* 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] = LAYOUT_planck_grid( - 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 +/* Raise * ,-----------------------------------------------------------------------------------. - * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp | + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | + | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | 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] = LAYOUT_planck_grid( - 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 +[_RAISE] = LAYOUT_planck_grid( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_PLUS, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, NO_GRTR, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), /* Lower * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * | | | | | | | | | | | | | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * | | | | | | | | | | | | | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | + * | | | | | | | | | | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | + * | | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ [_LOWER] = LAYOUT_planck_grid( - 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_HOME, KC_END, _______, - _______, _______, _______, _______, _______, _______, _______, _______, 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 / |Pg Up |Pg Dn | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | Next | Vol- | Vol+ | Play | - * `-----------------------------------------------------------------------------------' - */ -[_RAISE] = LAYOUT_planck_grid( - 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_PGUP, KC_PGDN, _______, - _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY + NO_HALF, LSFT(KC_1), NO_QUO2, LSFT(KC_3), NO_BULT, LSFT(KC_5), NO_AMPR, NO_SLSH, NO_LPRN, NO_RPRN, NO_EQL , NO_QUES, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, NO_LESS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -/* Plover layer (http://opensteno.org) +/* Utility layer * ,-----------------------------------------------------------------------------------. - * | # | # | # | # | # | # | # | # | # | # | # | # | + * | | | up | | | | | | S1 | S2 | S3 | | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | S | T | P | H | * | * | F | P | L | T | D | + * | | left | down | right| | | | | S4 | S5 | S6 | | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | S | K | W | R | * | * | R | B | G | S | Z | + * | | | | | | | | | S7 | S8 | S9 | | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Exit | | | A | O | | E | U | | | | + * | | | | | | | | Del | | | | | * `-----------------------------------------------------------------------------------' */ -[_PLOVER] = LAYOUT_planck_grid( - 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 +[_UTILITY] = LAYOUT_planck_grid( + _______, _______, KC_UP , _______, _______, _______, _______, _______, S1 , S2 , S3 , _______, + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, S4 , S5 , S6 , _______, + _______, _______, _______, _______, _______, _______, _______, _______, S7 , S8 , S9 , _______, + _______, _______, _______, _______, _______, _______, _______, KC_DEL , _______, _______, _______, _______ ), /* Adjust (Lower + Raise) * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | + * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| | + * | |Reset | |Aud on|Audoff|AGnorm|AGswap|Qwerty| | |Utilit| | * |------+------+------+------+------+------|------+------+------+------+------+------| - * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * | | | | | | | | | | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | + * | | | | | | | | | | | | | * `-----------------------------------------------------------------------------------' */ [_ADJUST] = LAYOUT_planck_grid( - _______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL , - _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______, - _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, _______, + 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 , MU_MOD , AU_ON , AU_OFF , AG_NORM, AG_SWAP, DEFAULT, XXXXXXX , XXXXXXX, UTILITY, _______, + _______, NO_PIPE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) @@ -176,6 +142,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { #ifdef AUDIO_ENABLE float plover_song[][2] = SONG(PLOVER_SOUND); float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND); + float s1[][2] = SONG(NUMBER_ONE); + float s2[][2] = SONG(ZELDA_PUZZLE); + float s3[][2] = SONG(ZELDA_TREASURE); + float s4[][2] = SONG(OVERWATCH_THEME); + float s5[][2] = SONG(IMPERIAL_MARCH); + float s6[][2] = SONG(E1M1_DOOM); + float s7[][2] = SONG(COIN_SOUND); + float s8[][2] = SONG(ONE_UP_SOUND); + float s9[][2] = SONG(SONIC_RING); #endif uint32_t layer_state_set_user(uint32_t state) { @@ -184,22 +159,9 @@ uint32_t layer_state_set_user(uint32_t state) { bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { - case QWERTY: - if (record->event.pressed) { - print("mode just switched to qwerty and this is a huge string\n"); - set_single_persistent_default_layer(_QWERTY); - } - return false; - break; - case COLEMAK: - if (record->event.pressed) { - set_single_persistent_default_layer(_COLEMAK); - } - return false; - break; - case DVORAK: + case DEFAULT: if (record->event.pressed) { - set_single_persistent_default_layer(_DVORAK); + set_single_persistent_default_layer(_DEFAULT); } return false; break; @@ -220,31 +182,75 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; - case PLOVER: + case S1: if (record->event.pressed) { #ifdef AUDIO_ENABLE - stop_all_notes(); - PLAY_SONG(plover_song); - #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); + PLAY_SONG(s1); + #endif //AUDIO_ENABLE } return false; break; - case EXT_PLV: + case S2: if (record->event.pressed) { #ifdef AUDIO_ENABLE - PLAY_SONG(plover_gb_song); - #endif - layer_off(_PLOVER); + PLAY_SONG(s2); + #endif //AUDIO_ENABLE + } + return false; + break; + case S3: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(s3); + #endif //AUDIO_ENABLE + } + return false; + break; + case S4: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(s4); + #endif //AUDIO_ENABLE + } + return false; + break; + case S5: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(s5); + #endif //AUDIO_ENABLE + } + return false; + break; + case S6: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(s6); + #endif //AUDIO_ENABLE + } + return false; + break; + case S7: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(s7); + #endif //AUDIO_ENABLE + } + return false; + break; + case S8: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(s8); + #endif //AUDIO_ENABLE + } + return false; + break; + case S9: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(s9); + #endif //AUDIO_ENABLE } return false; break; diff --git a/keyboards/planck/keymaps/skug/readme.md b/keyboards/planck/keymaps/skug/readme.md index 259b52f86f45..aa3e6cda0063 100644 --- a/keyboards/planck/keymaps/skug/readme.md +++ b/keyboards/planck/keymaps/skug/readme.md @@ -1,3 +1,8 @@ +![Nordic Planck](https://i.imgur.com/0ZOLnx2.png) + # Nordic Planck -TODO: Add layout image +This is my attempt at making a Nordic layout for the planck with all nordic +characters available in the default layer, things to note are the bottom row +with Esc, Enter, Space and Backspace in the middle for easy thumb access and +an arrow cluster on the left. diff --git a/keyboards/planck/keymaps/skug/rules.mk b/keyboards/planck/keymaps/skug/rules.mk index dcf16bef3994..9721fcd747e2 100644 --- a/keyboards/planck/keymaps/skug/rules.mk +++ b/keyboards/planck/keymaps/skug/rules.mk @@ -1 +1,3 @@ SRC += muse.c +EXTRAKEY_ENABLE = no +CONSOLE_ENABLE = no From bf0bb1a4db98864fe04d40ca68fe6bc5a0184395 Mon Sep 17 00:00:00 2001 From: Christoffer Holmberg Date: Mon, 15 Oct 2018 20:43:11 +0300 Subject: [PATCH 182/505] Keymap: Update to ergodox layout (#4134) * Disable KB mouse & cleanup * fix ascii-layout * _______ is now defined by qmk and apparently has been for a year already ;) --- keyboards/ergodox_ez/keymaps/skug/config.h | 2 ++ keyboards/ergodox_ez/keymaps/skug/keymap.c | 30 ++++++++++------------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/keyboards/ergodox_ez/keymaps/skug/config.h b/keyboards/ergodox_ez/keymaps/skug/config.h index d972813920d5..abf1c635f10d 100644 --- a/keyboards/ergodox_ez/keymaps/skug/config.h +++ b/keyboards/ergodox_ez/keymaps/skug/config.h @@ -1,5 +1,7 @@ #pragma once +#define FORCE_NKRO + #undef LSPO_KEY #undef RSPC_KEY #define LSPO_KEY KC_8 // Nordic Left SpaceCadet diff --git a/keyboards/ergodox_ez/keymaps/skug/keymap.c b/keyboards/ergodox_ez/keymaps/skug/keymap.c index 0d2ec1dd9f20..d17990481e55 100644 --- a/keyboards/ergodox_ez/keymaps/skug/keymap.c +++ b/keyboards/ergodox_ez/keymaps/skug/keymap.c @@ -22,8 +22,6 @@ #include "version.h" #include "keymap_swedish.h" -#define _______ KC_TRNS - #define BASE 0 // default layer #define SYMB 1 // symbols #define MDIA 2 // media keys @@ -47,8 +45,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | L4 | A | S | D | F | G |------| |------| H | J | K | L |Ö / L3| Ä/L2 | - * | | | | | | | Hypr/| | Meh/ | | | | | | | - * |--------+------+------+------+------+------| Esc | | Ent |------+------+------+------+------+--------| + * | | | | | | | | | | | | | | | | + * |--------+------+------+------+------+------| Back | |Forwd |------+------+------+------+------+--------| * | LShift/| Z | X | C | V | B | | | | N | M | ; | : | _ | RShift/| * | ( | | | | | | | | | | | , | . | - | ) | * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' @@ -71,8 +69,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { NO_HALF, KC_1, KC_2, KC_3, KC_4, KC_5, KC_INS, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), MO(ARRW), KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSPO, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_ESC), - CTL_T(NO_APOS), NO_ACUT, KC_LALT, KC_BSPC, KC_SPC, + KC_LSPO, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_WBAK, + CTL_T(NO_APOS), NO_ACUT, KC_LALT, KC_BSPC, KC_SPC, NO_LESS, KC_END, KC_LEFT, KC_RIGHT, KC_PGDN, CTL_T(KC_ENT), ALT_T(KC_ESC), KC_LGUI, @@ -81,7 +79,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TO(ARRW), KC_6, KC_7, KC_8, KC_9, KC_0, NO_PLUS, TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, NO_AA, KC_H, KC_J, KC_K, KC_L, LT(MDIA, NO_OSLH), LT(SYMB, NO_AE), - MEH_T(KC_ENT), KC_N, KC_M, KC_COMM, KC_DOT, NO_MINS, KC_RSPC, + KC_WFWD, KC_N, KC_M, KC_COMM, KC_DOT, NO_MINS, KC_RSPC, KC_SPC, KC_BSPC, NO_ALGR, NO_ASTR, CTL_T(NO_TILD), KC_HOME, NO_CIRC, KC_PGUP, KC_UP, KC_DOWN, @@ -101,11 +99,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | . | 0 | = | | * `----------------------------------' `----------------------------------' * ,-------------. ,-------------. - * |Animat| | |Toggle|Solid | + * | | | | | | * ,------|------|------| |------+------+------. * | | | | | | | | * |------|------|------| |------|------|------| - * |BNess-|Bness+| | | |Hue- |Hue+ | + * | | | | | | | | * `--------------------' `--------------------' */ // SYMBOLS @@ -116,18 +114,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______,KC_HASH,NO_DLR, NO_LPRN,NO_RPRN,NO_GRV, _______,KC_PERC,NO_CIRC,NO_LBRC,NO_RBRC,NO_TILD,_______, EPRM,_______,_______,_______,_______, - RGB_MOD,_______, + _______,_______, + _______,_______,_______, _______,_______,_______, - RGB_VAD,RGB_VAI,_______, // right hand _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, KC_UP, KC_7, KC_8, KC_9, NO_ASTR, KC_F12, KC_DOWN, KC_4, KC_5, KC_6, NO_PLUS, _______, _______, NO_AMPR, KC_1, KC_2, KC_3, NO_MINS, _______, _______,KC_DOT, KC_0, NO_EQL, _______, - RGB_TOG, RGB_SLD, + _______, _______, _______, _______, _______, - _______, RGB_HUD, RGB_HUI + _______, _______, _______ ), /* Keymap: Media and mouse keys @@ -183,10 +181,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, // right hand TO(BASE), _______, _______, _______, _______, _______, _______, - _______, _______, KC_BTN4, KC_MS_U, KC_BTN5, _______, _______, - _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_BTN1, KC_BTN3, KC_BTN2, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ From 0beb945554e043172f344eb4a48aaede28a529a0 Mon Sep 17 00:00:00 2001 From: Kenny Hung Date: Mon, 15 Oct 2018 18:44:19 +0100 Subject: [PATCH 183/505] Keymap: add JJ40 Skewwhiffy layout (#4135) --- keyboards/jj40/keymaps/skewwhiffy/keymap.c | 219 +++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 keyboards/jj40/keymaps/skewwhiffy/keymap.c diff --git a/keyboards/jj40/keymaps/skewwhiffy/keymap.c b/keyboards/jj40/keymaps/skewwhiffy/keymap.c new file mode 100644 index 000000000000..6b193a15cb98 --- /dev/null +++ b/keyboards/jj40/keymaps/skewwhiffy/keymap.c @@ -0,0 +1,219 @@ +/* Copyright 2017 Kenny Hung + * + * 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 QMK_KEYBOARD_H +#include "keymap_uk.h" + +// Layer shorthand +enum Layers { + cm, // colemak + dv, // dvorak + qw, // qwerty + nbl, // numbers left + nbr, // numbers right + syl, // symbols left + syr, // symbols right + nal, // navigation left + nar // navigation right +}; + +// Layer buttons +#define _Z_SFT SFT_T(UK_Z) +#define _SCLSH SFT_T(UK_SCLN) +#define _SLSH SFT_T(UK_SLSH) + +#define _X_NB LT(nbl, UK_X) +#define _Q_NB LT(nbl, UK_Q) +#define _DOT_NB LT(nbr, UK_DOT) +#define _V_NB LT(nbr, UK_V) +#define __NBL LT(nbl, _______) +#define __NBR LT(nbr, _______) + +#define _C_SY LT(syl, UK_C) +#define _J_SY LT(syl, UK_J) +#define _W_SY LT(syr, UK_W) +#define _COM_SY LT(syr, UK_COMM) +#define __SYL LT(syl, _______) +#define __SYR LT(syr, _______) + +#define _V_NAL LT(nal, UK_V) +#define _K_NAL LT(nal, UK_K) +#define _M_NAR LT(nar, UK_M) +#define __NAL LT(nal, _______) +#define __NAR LT(nar, _______) + +// Custom hotkeys +#define _TERM LCTL(UK_QUOT) // Hotkey for terminal +#define _S_TAB S(UK_TAB) +#define _C_LEFT LCTL(UK_LEFT) +#define _C_RGHT LCTL(UK_RGHT) +#define _A_LEFT LALT(UK_LEFT) +#define _A_RGHT LALT(UK_RGHT) + +// Custom hotkeys +#define _TERM LCTL(UK_QUOT) // Hotkey for terminal +#define _S_TAB S(UK_TAB) +#define _C_LEFT LCTL(UK_LEFT) +#define _C_RGHT LCTL(UK_RGHT) +#define _A_LEFT LALT(UK_LEFT) +#define _A_RGHT LALT(UK_RGHT) + +enum custom_keycodes { + IJ_OMN = SAFE_RANGE // IntelliJ Omnibox +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Colemak + * .-----------------------------------------------------------------------------------------------------------. + * | Q | W | F | P | G | | | J | L | U | Y | ; | + * |-----------------------------------------------------------------------------------------------------------| + * | A | R | S | T | D | | | H | N | E | I | O | + * |-----------------------------------------------------------------------------------------------------------| + * | Z | X | C | V | B | | | K | M | , | . | / | + * | SHIFT | NUMBER | SYMBOL | NAV | | | | | NAV | SYMBOL | FUNC | SHIFT | + * |-----------------------------------------------------------------------------------------------------------| + * | LSHIFT | LCTRL | LALT | LGUI | SPACE | ENT | DEL | BKSPC | RGUI | RALT | RCTRL | RSHIFT | + * .-----------------------------------------------------------------------------------------------------------. + */ + [cm] = LAYOUT_ortho_4x12( \ + UK_Q, UK_W, UK_F, UK_P, UK_G, _______, _______, UK_J, UK_L, UK_U, UK_Y, UK_SCLN, \ + UK_A, UK_R, UK_S, UK_T, UK_D, _______, _______, UK_H, UK_N, UK_E, UK_I, UK_O, \ + _Z_SFT, _X_NB, _C_SY, _V_NAL, UK_B, _______, _______, UK_K, _M_NAR, _COM_SY, _DOT_NB, _SLSH, \ + UK_LSFT, UK_LCTL, UK_LALT, UK_LGUI, UK_SPC, UK_ENT, UK_DEL, UK_BSPC, UK_RGUI, UK_RALT, UK_RCTL, UK_RSFT \ + ), + +/* Dvorak + * .-----------------------------------------------------------------------------------------------------------. + * | ' | , | . | P | Y | | | F | G | C | R | L | + * |-----------------------------------------------------------------------------------------------------------| + * | A | O | E | U | I | | | D | H | T | N | S | + * |-----------------------------------------------------------------------------------------------------------| + * | ; | Q | J | K | X | | | B | M | W | V | Z | + * | SHIFT | NUMBER | SYMBOL | NAV | | | | | NAV | SYMBOL | FUNC | SHIFT | + * |-----------------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * |-----------------------------------------------------------------------------------------------------------| + */ + [dv] = LAYOUT_ortho_4x12( \ + UK_QUOT, UK_COMM, UK_DOT, UK_P, UK_Y, _______, _______, UK_F, UK_G, UK_C, UK_R, UK_L, \ + UK_A, UK_O, UK_E, UK_U, UK_I, _______, _______, UK_D, UK_H, UK_T, UK_N, UK_S, \ + _SCLSH, _Q_NB, _J_SY, _K_NAL, UK_X, _______, _______, UK_B, _M_NAR, _W_SY, _V_NB, _Z_SFT, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + +/* QWERTY + * .-----------------------------------------------------------------------------------------------------------. + * | Q | W | E | R | T | | | Y | U | I | O | P | + * |-----------------------------------------------------------------------------------------------------------| + * | A | S | D | F | G | | | H | J | K | L | ; | + * |-----------------------------------------------------------------------------------------------------------| + * | Z | X | C | V | B | | | N | M | , | . | / | + * | SHIFT | NUMBER | SYMBOL | NAV | | | | | NAV | SYMBOL | FUNC | SHIFT | + * |-----------------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * .-----------------------------------------------------------------------------------------------------------. + */ + [qw] = LAYOUT_ortho_4x12( \ + UK_Q, UK_W, UK_E, UK_R, UK_T, _______, _______, UK_Y, UK_U, UK_I, UK_O, UK_P, \ + UK_A, UK_S, UK_D, UK_F, UK_G, _______, _______, UK_H, UK_J, UK_K, UK_L, UK_SCLN, \ + _Z_SFT, _X_NB, _C_SY, _V_NAL, UK_B, _______, _______, UK_N, _M_NAR, _COM_SY, _DOT_NB, _SLSH, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + +/* Numbers _NB + * .-----------------------------------------------------------------------------------------------------------. + * | | F7 | F8 | F9 | F10 | | | | 7 | 8 | 9 | | + * |-----------------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | F4 | F5 | F6 | F11 | | | | 4 | 5 | 6 | | + * |-----------------+--------+--------+--------+--------+--------+--------+--------------------------+--------| + * | | F1 | F2 | F3 | F12 | | | 0 | 1 | 2 | 3 | . | + * |-----------------+--------+--------+--------+--------+--------+--------+-----------------+--------+--------| + * | | | | | | | | | | | | | + * '-----------------------------------------------------------------------------------------------------------' + */ + [nbl] = LAYOUT_ortho_4x12( \ + _______, UK_F7, UK_F8, UK_F9, UK_F10, _______, _______, _______, UK_7, UK_8, UK_9, _______, \ + _______, UK_F4, UK_F5, UK_F6, UK_F11, _______, _______, _______, UK_4, UK_5, UK_6, _______, \ + _______, __NBL, UK_F2, UK_F3, UK_F12, _______, _______, UK_0, UK_1, UK_2, UK_3, UK_DOT, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + [nbr] = LAYOUT_ortho_4x12( \ + _______, UK_F7, UK_F8, UK_F9, UK_F10, _______, _______, _______, UK_7, UK_8, UK_9, _______, \ + _______, UK_F4, UK_F5, UK_F6, UK_F11, _______, _______, _______, UK_4, UK_5, UK_6, _______, \ + _______, UK_F1, UK_F2, UK_F3, UK_F12, _______, _______, UK_0, UK_1, UK_2, __NBR, UK_DOT, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + +/* Symbols _SY + * .-----------------------------------------------------------------------------------------------------------. + * | ! | £ | _ | - | ~ | | | \ | { | } | / | # | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | $ | % | + | = | | | | " | ( | ) | ' | @ | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | ^ | & | * | | | | | | < | [ | ] | > | ` | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | | | | | | | + * '-----------------------------------------------------------------------------------------------------------' + */ + [syl] = LAYOUT_ortho_4x12( \ + UK_EXLM, UK_PND, UK_UNDS, UK_MINS, UK_TILD, _______, _______, UK_BSLS, UK_LCBR, UK_RCBR, UK_SLSH, UK_HASH, \ + UK_DLR, UK_PERC, UK_PLUS, UK_EQL, _______, _______, _______, UK_DQUO, UK_LPRN, UK_RPRN, UK_QUOT, UK_AT, \ + UK_CIRC, UK_AMPR, __SYL, UK_PIPE, _______, _______, _______, UK_LABK, UK_LBRC, UK_RBRC, UK_RABK, UK_GRV, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + [syr] = LAYOUT_ortho_4x12( \ + UK_EXLM, UK_PND, UK_UNDS, UK_MINS, UK_TILD, _______, _______, UK_BSLS, UK_LCBR, UK_RCBR, UK_SLSH, UK_HASH, \ + UK_DLR, UK_PERC, UK_PLUS, UK_EQL, _______, _______, _______, UK_DQUO, UK_LPRN, UK_RPRN, UK_QUOT, UK_AT, \ + UK_CIRC, UK_AMPR, UK_ASTR, UK_PIPE, _______, _______, _______, UK_LABK, UK_LBRC, __SYR, UK_RABK, UK_GRV, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + +/* + * Navigation + * .-----------------------------------------------------------------------------------------------------------. + * | Esc | Ctrl L | Up | Ctrl R | RGB RMD| RGB HD | RGB HI | RGB_TG | PtSn | ScLk | Pause | DVORAK | + * +--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | Tab | Left | Down | Right | RGB MD | RGB SD | RGB SI | COLEMAK| Insert | Home | PgUp | Term | + * +--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | ShTab | Alt L | IJ Omni| Alt R | | RGB VD | RGB VI | | ScLk | End | PgDn | QWERTY | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | | | | | | | + * '-----------------------------------------------------------------------------------------------------------' + */ + [nal] = LAYOUT_ortho_4x12( \ + UK_ESC, _C_LEFT, UK_UP, _C_RGHT, RGB_RMOD,RGB_HUD, RGB_HUI, RGB_TOG, UK_PSCR, UK_SLCK, UK_PAUS, DF(dv), \ + UK_TAB, UK_LEFT, UK_DOWN, UK_RGHT, RGB_MOD, RGB_SAD, RGB_SAI, DF(cm), UK_INS, UK_HOME, UK_PGUP, _TERM, \ + _S_TAB, _A_LEFT, IJ_OMN, __NAL, _______, RGB_VAD, RGB_VAI, _______, UK_SLCK, UK_END, UK_PGDN, DF(qw), \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + [nar] = LAYOUT_ortho_4x12( \ + UK_ESC, _C_LEFT, UK_UP, _C_RGHT, RGB_RMOD,RGB_HUD, RGB_HUI, RGB_TOG, UK_PSCR, UK_SLCK, UK_PAUS, DF(dv), \ + UK_TAB, UK_LEFT, UK_DOWN, UK_RGHT, RGB_MOD, RGB_SAD, RGB_SAI, DF(cm), UK_INS, UK_HOME, UK_PGUP, _TERM, \ + _S_TAB, _A_LEFT, IJ_OMN, _A_RGHT, _______, RGB_VAD, RGB_VAI, _______, __NAR, UK_END, UK_PGDN, DF(qw), \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch(keycode) { + case IJ_OMN: + SEND_STRING(SS_TAP(X_LSHIFT)SS_TAP(X_LSHIFT)); + return false; + } + } + return true; +} From 4930e22dda408420332831781c4fde002a89915e Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Mon, 15 Oct 2018 10:44:55 -0700 Subject: [PATCH 184/505] Keymap: Move multimedia events to dedicated layer and format config (#4136) --- keyboards/dz60/keymaps/crd/keymap.c | 48 +++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/keyboards/dz60/keymaps/crd/keymap.c b/keyboards/dz60/keymaps/crd/keymap.c index 5e9242c9d976..a17d32caaf55 100644 --- a/keyboards/dz60/keymaps/crd/keymap.c +++ b/keyboards/dz60/keymaps/crd/keymap.c @@ -12,25 +12,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----------------------------------------------------------------------------------------+ * | Shift | Z | X | C | V | B | N | M | , | . | / | RSh | U | DEL | * |-----------------------------------------------------------------------------------------+ - * | Ctrl | Alt | Cmd | Space | Cmd | FN | L | D | R | + * | FN2 | Alt | Cmd | Space | Cmd | FN1 | L | D | R | * `-----------------------------------------------------------------------------------------' */ LAYOUT_directional( - KC_GESC, 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, - 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, 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_UP, KC_DEL, - KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT + KC_GESC, 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, + 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, 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_UP, KC_DEL, + MO(2), KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT ), - /* FN Layer + /* FN1 Layer * ,-----------------------------------------------------------------------------------------. - * | ` ~ | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | RESET | + * | ` ~ | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | * |-----------------------------------------------------------------------------------------+ - * | |RBB T|RGB M| Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | + * | | | | | | | | | | | | | | | * |-----------------------------------------------------------------------------------------+ - * | | BL T| BL M| BL+ | BL- | | | | | | | | | + * | | | | | | | | | | | | | | * |-----------------------------------------------------------------------------------------+ * | | | | | | | | | | | | |PgUp | | * |-----------------------------------------------------------------------------------------+ @@ -39,10 +39,32 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ LAYOUT_directional( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, RESET, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, - _______, BL_TOGG, BL_STEP, BL_INC, BL_DEC, _______, _______, _______, _______, _______, _______, _______, + 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_PGUP, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDOWN, KC_END ), + + /* FN2 Layer (Media) + * ,-----------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | RESET | + * |-----------------------------------------------------------------------------------------+ + * | |RBB T|RGB M| Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | | | | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | | | | |Pl/Ps|Vol+ |Mute | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | |Prev |Vol- |Next | + * `-----------------------------------------------------------------------------------------' + */ + + LAYOUT_directional( + KC_SLEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_VOLU, KC_MUTE, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT + ), }; From 4c9372a0819b3fa062105803668d3b277222dc1a Mon Sep 17 00:00:00 2001 From: Yann Hodique Date: Mon, 15 Oct 2018 10:45:30 -0700 Subject: [PATCH 185/505] Keyboard: Make type 5 the default sun keyboard. (#4137) Type 5 is better polished, and probably more common as the last non-USB Sun keyboard. --- keyboards/converter/sun_usb/rules.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keyboards/converter/sun_usb/rules.mk b/keyboards/converter/sun_usb/rules.mk index e03b374f3720..6e36a1905084 100644 --- a/keyboards/converter/sun_usb/rules.mk +++ b/keyboards/converter/sun_usb/rules.mk @@ -40,3 +40,5 @@ ifdef HARDWARE_SERIAL else SRC += protocol/serial_soft.c endif + +DEFAULT_FOLDER = converter/sun_usb/type5 From 088b476343bf97c4bca6855a4ff2152f1bf0785e Mon Sep 17 00:00:00 2001 From: Yann Hodique Date: Mon, 15 Oct 2018 10:49:51 -0700 Subject: [PATCH 186/505] Keymap: add sun_usb keymap for sigma (#4138) Also add users/sigma, which contains useful code for keymaps. --- .../sun_usb/type5/keymaps/sigma/keymap.c | 31 ++ .../sun_usb/type5/keymaps/sigma/readme.md | 12 + .../sun_usb/type5/keymaps/sigma/rules.mk | 1 + users/sigma/config.h | 21 ++ users/sigma/rules.mk | 3 + users/sigma/sigma.c | 276 ++++++++++++++++++ users/sigma/sigma.h | 58 ++++ 7 files changed, 402 insertions(+) create mode 100644 keyboards/converter/sun_usb/type5/keymaps/sigma/keymap.c create mode 100644 keyboards/converter/sun_usb/type5/keymaps/sigma/readme.md create mode 100644 keyboards/converter/sun_usb/type5/keymaps/sigma/rules.mk create mode 100644 users/sigma/config.h create mode 100644 users/sigma/rules.mk create mode 100644 users/sigma/sigma.c create mode 100644 users/sigma/sigma.h diff --git a/keyboards/converter/sun_usb/type5/keymaps/sigma/keymap.c b/keyboards/converter/sun_usb/type5/keymaps/sigma/keymap.c new file mode 100644 index 000000000000..1c7ea3efc21f --- /dev/null +++ b/keyboards/converter/sun_usb/type5/keymaps/sigma/keymap.c @@ -0,0 +1,31 @@ +/* +Copyright 2018 Yann Hodique @sigma + +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 QMK_KEYBOARD_H +#include "sigma.h" + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = + { + [_QWERTY] = LAYOUT_us_unix( + KC_LEAD, KC_SCRT, 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_MUTE,KC_VOLD,KC_VOLU,KC_OS_LOCK, + KC_STOP, KC_OS_REDO, 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_INS, KC_HOME,KC_PGUP, KC_NLCK,KC_PSLS,KC_PAST,KC_PMNS, + VRSN, KC_OS_UNDO, 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_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS, + KC_MAKE, KC_OS_COPY, 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_P4, KC_P5, KC_P6, + KC_EXECUTE,KC_OS_PASTE, 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_P1, KC_P2, KC_P3, KC_PENT, + KC_FIND, KC_OS_CUT, KC_CAPS,KC_LGUI,KC_LALT, KC_SPC, KC_RGUI,KC_APP,KC_RALT, KC_LEFT,KC_DOWN,KC_RGHT, KC_P0, KC_PDOT + ), + }; diff --git a/keyboards/converter/sun_usb/type5/keymaps/sigma/readme.md b/keyboards/converter/sun_usb/type5/keymaps/sigma/readme.md new file mode 100644 index 000000000000..6ae011f86686 --- /dev/null +++ b/keyboards/converter/sun_usb/type5/keymaps/sigma/readme.md @@ -0,0 +1,12 @@ +Overview +======== + +This is my personal Sun Type 5 configuration. + +How to build +------------ + + make converter/sun_usb/type5:sigma:teensy + +Layers +------ diff --git a/keyboards/converter/sun_usb/type5/keymaps/sigma/rules.mk b/keyboards/converter/sun_usb/type5/keymaps/sigma/rules.mk new file mode 100644 index 000000000000..09a3af829a66 --- /dev/null +++ b/keyboards/converter/sun_usb/type5/keymaps/sigma/rules.mk @@ -0,0 +1 @@ +BOOTLOADER = halfkay diff --git a/users/sigma/config.h b/users/sigma/config.h new file mode 100644 index 000000000000..53b986cdacca --- /dev/null +++ b/users/sigma/config.h @@ -0,0 +1,21 @@ +/* + Copyright 2018 Yann Hodique @sigma + + 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 + +#define LEADER_TIMEOUT 1000 + +#define MACRO_TIMER 5 diff --git a/users/sigma/rules.mk b/users/sigma/rules.mk new file mode 100644 index 000000000000..a4cd2b34d3f0 --- /dev/null +++ b/users/sigma/rules.mk @@ -0,0 +1,3 @@ +LEADER_ENABLE = yes + +SRC += sigma.c diff --git a/users/sigma/sigma.c b/users/sigma/sigma.c new file mode 100644 index 000000000000..b2bf40d5763c --- /dev/null +++ b/users/sigma/sigma.c @@ -0,0 +1,276 @@ +/* + Copyright 2018 Yann Hodique @sigma + + 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 "sigma.h" + +userspace_config_t runtime_userspace_config; +userspace_config_t stored_userspace_config; + +__attribute__ ((weak)) +void matrix_init_keymap(void) {} + +__attribute__ ((weak)) +void startup_keymap(void) {} + +__attribute__ ((weak)) +void shutdown_keymap(void) {} + +__attribute__ ((weak)) +void suspend_power_down_keymap(void) {} + +__attribute__ ((weak)) +void suspend_wakeup_init_keymap(void) {} + +__attribute__ ((weak)) +void matrix_scan_keymap(void) {} + +__attribute__ ((weak)) +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + return true; +} + +__attribute__ ((weak)) +bool process_record_secrets(uint16_t keycode, keyrecord_t *record) { + return true; +} + + +__attribute__ ((weak)) +uint32_t layer_state_set_keymap (uint32_t state) { + return state; +} + +__attribute__ ((weak)) +uint32_t default_layer_state_set_keymap (uint32_t state) { + return state; +} + +__attribute__ ((weak)) +void led_set_keymap(uint8_t usb_led) {} + +void set_os(uint8_t os) { + runtime_userspace_config.os_target = os; + + switch (os) { + case _OS_MACOS: + set_unicode_input_mode(UC_OSX); + break; + case _OS_LINUX: + set_unicode_input_mode(UC_LNX); + break; + case _OS_WINDOWS: + set_unicode_input_mode(UC_WIN); + break; + } +} + +void matrix_init_user(void) { + stored_userspace_config.raw = eeconfig_read_user(); + runtime_userspace_config.raw = stored_userspace_config.raw; + + set_os(runtime_userspace_config.os_target); +} + +void store_userspace_config(void) { + eeconfig_update_user(stored_userspace_config.raw); +} + +LEADER_EXTERNS(); + +void matrix_scan_user(void) { + LEADER_DICTIONARY() { + leading = false; + leader_end(); + + SEQ_TWO_KEYS(KC_F1, KC_L) { + set_os(_OS_LINUX); + } + SEQ_TWO_KEYS(KC_F1, KC_M) { + set_os(_OS_MACOS); + } + SEQ_TWO_KEYS(KC_F1, KC_W) { + set_os(_OS_WINDOWS); + } + SEQ_TWO_KEYS(KC_F1, KC_S) { + stored_userspace_config.raw = runtime_userspace_config.raw; + store_userspace_config(); + } + } +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + uint8_t os_target = runtime_userspace_config.os_target; + bool pressed = record->event.pressed; + + switch (keycode) { + case KC_QWERTY: + if (pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + + case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader + if (!pressed) { + send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP +#if defined(__ARM__) + ":dfu-util" +#elif defined(BOOTLOADER_DFU) + ":dfu" +#elif defined(BOOTLOADER_HALFKAY) + ":teensy" +#elif defined(BOOTLOADER_CATERINA) + ":avrdude" +#endif // bootloader options + SS_TAP(X_ENTER)), 10); + } + return false; + break; + + case EPRM: // Resets EEPROM + if (pressed) { + eeconfig_init(); + default_layer_set(1UL< @sigma + + 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 + +#include "quantum.h" +#include "version.h" +#include "eeprom.h" + +// Define os types +enum os_types + { + _OS_MACOS = 0, + _OS_LINUX, + _OS_WINDOWS, + }; + +// Define layer names +enum userspace_layers + { + _QWERTY = 0, + }; + +typedef union { + uint32_t raw; + struct { + uint8_t os_target :2; + }; +} userspace_config_t; + +enum userspace_custom_keycodes + { + EPRM = SAFE_RANGE, // Resets EEPROM + VRSN, // Prints QMK Firmware and board info + KC_QWERTY, // Sets default layer to QWERTY + KC_MAKE, // Rebuild the current firmware + KC_OS_CUT, + KC_OS_COPY, + KC_OS_PASTE, + KC_OS_UNDO, + KC_OS_REDO, + KC_OS_LOCK, + KC_SCRT, + NEW_SAFE_RANGE //use NEW_SAFE_RANGE for keymap specific codes + }; From 2c3e617fba1fefc3116fcea38099eb5b56a6d6f3 Mon Sep 17 00:00:00 2001 From: Danny Date: Mon, 15 Oct 2018 13:53:32 -0400 Subject: [PATCH 187/505] Keymap: Add nano keymap for modding Spooka light (#4141) From 85f315ad6508d96af4497ea433c54f13c0296a90 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Mon, 8 Oct 2018 22:56:07 -0400 Subject: [PATCH 188/505] Add Iris Rev. 3 --- keyboards/iris/iris.h | 4 +- keyboards/iris/rev1/config.h | 2 - keyboards/iris/rev1_led/config.h | 2 - keyboards/iris/rev2/config.h | 2 - keyboards/iris/rev3/config.h | 85 ++++++++++++++++++++++++++++++++ keyboards/iris/rev3/rev3.c | 42 ++++++++++++++++ keyboards/iris/rev3/rev3.h | 35 +++++++++++++ keyboards/iris/rev3/rules.mk | 2 + 8 files changed, 167 insertions(+), 7 deletions(-) create mode 100644 keyboards/iris/rev3/config.h create mode 100644 keyboards/iris/rev3/rev3.c create mode 100644 keyboards/iris/rev3/rev3.h create mode 100644 keyboards/iris/rev3/rules.mk diff --git a/keyboards/iris/iris.h b/keyboards/iris/iris.h index 8d33b6b21788..afad9a0d6db8 100644 --- a/keyboards/iris/iris.h +++ b/keyboards/iris/iris.h @@ -4,8 +4,10 @@ #include "rev1.h" #elif KEYBOARD_iris_rev1_led #include "rev1_led.h" -#else +#elif KEYBOARD_iris_rev2 #include "rev2.h" +#else + #include "rev3.h" #endif #include "quantum.h" diff --git a/keyboards/iris/rev1/config.h b/keyboards/iris/rev1/config.h index fd9b2ced39a5..cc7f2d8d4455 100644 --- a/keyboards/iris/rev1/config.h +++ b/keyboards/iris/rev1/config.h @@ -65,8 +65,6 @@ along with this program. If not, see . #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 diff --git a/keyboards/iris/rev1_led/config.h b/keyboards/iris/rev1_led/config.h index 18d783ae7991..e9eac2455cf5 100644 --- a/keyboards/iris/rev1_led/config.h +++ b/keyboards/iris/rev1_led/config.h @@ -65,8 +65,6 @@ along with this program. If not, see . #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 diff --git a/keyboards/iris/rev2/config.h b/keyboards/iris/rev2/config.h index 2ea31a1541be..368d21c9893d 100644 --- a/keyboards/iris/rev2/config.h +++ b/keyboards/iris/rev2/config.h @@ -65,8 +65,6 @@ along with this program. If not, see . #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 diff --git a/keyboards/iris/rev3/config.h b/keyboards/iris/rev3/config.h new file mode 100644 index 000000000000..7f68180c2968 --- /dev/null +++ b/keyboards/iris/rev3/config.h @@ -0,0 +1,85 @@ +/* +Copyright 2017 Danny Nguyen + +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 + +#include QMK_KEYBOARD_CONFIG_H + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xCEEB +#define PRODUCT_ID 0x1256 +#define DEVICE_VER 0x0300 +#define MANUFACTURER Keebio +#define PRODUCT Iris Keyboard +#define DESCRIPTION Split 50 percent ergonomic keyboard + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 10 +#define MATRIX_COLS 6 + +// wiring of each half +#define MATRIX_ROW_PINS { D2, D3, D5, D7, D6 } +#define MATRIX_COL_PINS { F1, F4, F5, F6, D4, B4 } + +/* 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)) \ +) + +#define BACKLIGHT_PIN B5 +#define BACKLIGHT_LEVELS 5 + +/* ws2812 RGB LED */ +#define RGB_DI_PIN F7 +#define RGBLIGHT_TIMER +#define RGBLED_NUM 12 // Number of LEDs + +/* + * 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 diff --git a/keyboards/iris/rev3/rev3.c b/keyboards/iris/rev3/rev3.c new file mode 100644 index 000000000000..d8272db0f595 --- /dev/null +++ b/keyboards/iris/rev3/rev3.c @@ -0,0 +1,42 @@ +#include "rev3.h" + +#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) { + + // // green led on + // DDRD |= (1<<5); + // PORTD &= ~(1<<5); + + // // orange led on + // DDRB |= (1<<0); + // PORTB &= ~(1<<0); + + matrix_init_user(); +}; + + +#ifdef SWAP_HANDS_ENABLE +__attribute__ ((weak)) +// swap-hands action needs a matrix to define the swap +const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { + /* Left hand, matrix positions */ + {{0,5}, {1,5}, {2,5}, {3,5}, {4,5}, {5,5}}, + {{0,6}, {1,6}, {2,6}, {3,6}, {4,6}, {5,6}}, + {{0,7}, {1,7}, {2,7}, {3,7}, {4,7}, {5,7}}, + {{0,8}, {1,8}, {2,8}, {3,8}, {4,8}, {5,8}}, + {{0,9}, {1,9}, {2,9}, {3,9}, {4,9}, {5,9}}, + /* Right hand, matrix positions */ + {{0,0}, {1,0}, {2,0}, {3,0}, {4,0}, {5,0}}, + {{0,1}, {1,1}, {2,1}, {3,1}, {4,1}, {5,1}}, + {{0,2}, {1,2}, {2,2}, {3,2}, {4,2}, {5,2}}, + {{0,3}, {1,3}, {2,3}, {3,3}, {4,3}, {5,3}}, + {{0,4}, {1,4}, {2,4}, {3,4}, {4,4}, {5,4}}, +}; +#endif + diff --git a/keyboards/iris/rev3/rev3.h b/keyboards/iris/rev3/rev3.h new file mode 100644 index 000000000000..d44cef9a6bac --- /dev/null +++ b/keyboards/iris/rev3/rev3.h @@ -0,0 +1,35 @@ +#pragma once + +#include "iris.h" +#include "quantum.h" + + +#ifdef USE_I2C +#include +#ifdef __AVR__ + #include + #include +#endif +#endif + +//void promicro_bootloader_jmp(bool program); + +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, LT4, RT4, R30, R31, R32, R33, R34, R35, \ + LT1, LT2, LT3, RT3, RT2, RT1 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05 }, \ + { L10, L11, L12, L13, L14, L15 }, \ + { L20, L21, L22, L23, L24, L25 }, \ + { L30, L31, L32, L33, L34, L35 }, \ + { KC_NO, KC_NO, LT4, LT1, LT2, LT3 }, \ + { R05, R04, R03, R02, R01, R00 }, \ + { R15, R14, R13, R12, R11, R10 }, \ + { R25, R24, R23, R22, R21, R20 }, \ + { R35, R34, R33, R32, R31, R30 }, \ + { KC_NO, KC_NO, RT4, RT1, RT2, RT3 } \ + } diff --git a/keyboards/iris/rev3/rules.mk b/keyboards/iris/rev3/rules.mk new file mode 100644 index 000000000000..d7463419b4fe --- /dev/null +++ b/keyboards/iris/rev3/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes From 44a348d56f661d22144202f440b87c26832a8170 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Mon, 15 Oct 2018 12:46:33 -0400 Subject: [PATCH 189/505] Use DFU bootloader for rev 3 --- keyboards/iris/rules.mk | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/keyboards/iris/rules.mk b/keyboards/iris/rules.mk index fa261adc6f81..88dd66c18ef4 100644 --- a/keyboards/iris/rules.mk +++ b/keyboards/iris/rules.mk @@ -37,7 +37,11 @@ F_USB = $(F_CPU) # This definition is optional, and if your keyboard supports multiple bootloaders of # different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. -BOOTLOADER = caterina +ifeq ($(strip $(KEYBOARD)), iris/rev3) + BOOTLOADER = dfu +else + BOOTLOADER = caterina +endif # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT From 31d12662bde435e6636347ee842108b1cb3d8d48 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 15 Oct 2018 12:34:49 -0700 Subject: [PATCH 190/505] Update to drashna keymaps and userspace - RGB edition (#4143) * Fix up userspace after feature merges * Add new macros for keyboard layouts * Keep new layouts in keymap for easy reference * Cleanup layouts * Fix CRKBD wrappers * Fix up comments * Fix spacing in orthodox base layer * ergodox related cleanup * Make KC_MAKE only flash when holding shift * Add option to fast compile boards * Clean up rgb modes to save space * Re-enable Swap Hands on my Iris --- keyboards/crkbd/keymaps/drashna/config.h | 10 +- keyboards/crkbd/keymaps/drashna/keymap.c | 59 +++++---- keyboards/iris/keymaps/drashna/config.h | 2 +- keyboards/iris/keymaps/drashna/keymap.c | 67 ++++++---- keyboards/iris/keymaps/drashna/rules.mk | 4 +- keyboards/orthodox/keymaps/drashna/config.h | 2 +- keyboards/orthodox/keymaps/drashna/keymap.c | 52 ++++---- keyboards/orthodox/keymaps/drashna/rules.mk | 2 +- keyboards/viterbi/keymaps/drashna/config.h | 4 +- layouts/community/ergodox/drashna/config.h | 5 +- layouts/community/ergodox/drashna/keymap.c | 77 +++++------ layouts/community/ortho_4x12/drashna/config.h | 2 +- layouts/community/ortho_4x12/drashna/keymap.c | 50 +++++--- users/drashna/config.h | 6 +- users/drashna/drashna.c | 35 +++-- users/drashna/drashna.h | 120 ++++++++---------- users/drashna/rgb_stuff.c | 20 +-- users/drashna/rules.mk | 3 - users/drashna/tap_dances.c | 10 +- 19 files changed, 282 insertions(+), 248 deletions(-) diff --git a/keyboards/crkbd/keymaps/drashna/config.h b/keyboards/crkbd/keymaps/drashna/config.h index 366f013dcaf7..adfd79044d91 100644 --- a/keyboards/crkbd/keymaps/drashna/config.h +++ b/keyboards/crkbd/keymaps/drashna/config.h @@ -34,10 +34,12 @@ along with this program. If not, see . // #define TAPPING_FORCE_HOLD // #define TAPPING_TERM 100 +#ifdef RGBLIGHT_ENABLE #undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 27 + +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 #define RGBLIGHT_LIMIT_VAL 120 -#define RGBLIGHT_HUE_STEP 10 -#define RGBLIGHT_SAT_STEP 17 -#define RGBLIGHT_VAL_STEP 17 +#endif diff --git a/keyboards/crkbd/keymaps/drashna/keymap.c b/keyboards/crkbd/keymaps/drashna/keymap.c index 7bced8de3399..a293d5337403 100644 --- a/keyboards/crkbd/keymaps/drashna/keymap.c +++ b/keyboards/crkbd/keymaps/drashna/keymap.c @@ -20,37 +20,48 @@ enum crkbd_keycodes { RGBRST = NEW_SAFE_RANGE }; +#define LAYOUT_crkbd_base( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \ + ) \ + LAYOUT_wrapper( \ + KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \ + KC_TAB, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ + KC_MLSF, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ + LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE \ + ) +#define LAYOUT_crkbd_base_wrapper(...) LAYOUT_crkbd_base(__VA_ARGS__) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = LAYOUT_wrapper( - KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, - KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_MRSF, - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + [_QWERTY] = LAYOUT_crkbd_base_wrapper( + _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, + _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, + _________________QWERTY_L3_________________, _________________QWERTY_R3_________________ ), - [_COLEMAK] = LAYOUT_wrapper( - KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, - KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_MRSF, - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + + [_COLEMAK] = LAYOUT_crkbd_base_wrapper( + _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, + _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, + _________________COLEMAK_L3________________, _________________COLEMAK_R3________________ ), - [_DVORAK] = LAYOUT_wrapper( - KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, - KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_MRSF, - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + + [_DVORAK] = LAYOUT_crkbd_base_wrapper( + _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, + _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, + _________________DVORAK_L3_________________, _________________DVORAK_R3_________________ ), - [_WORKMAN] = LAYOUT_wrapper( - KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, - KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_MRSF, - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + + [_WORKMAN] = LAYOUT_crkbd_base_wrapper( + _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, + _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, + _________________WORKMAN_L3________________, _________________WORKMAN_R3________________ ), [_MODS] = LAYOUT_wrapper( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RSFT, + _______, ___________________BLANK___________________, ___________________BLANK___________________, _______, + _______, ___________________BLANK___________________, ___________________BLANK___________________, _______, + KC_LSFT, ___________________BLANK___________________, ___________________BLANK___________________, KC_RSFT, _______, _______, _______, _______, _______, _______ ), @@ -65,7 +76,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_GRV, _________________RAISE_L1__________________, _________________RAISE_R1__________________, KC_BSPC, _______, _________________RAISE_L2__________________, _________________RAISE_R2__________________, KC_BSLS, _______, _________________RAISE_L3__________________, _________________RAISE_R3__________________, _______, - _______, _______, _______, _______, _______, _______ //`--------------------' `--------------------' + _______, _______, _______, _______, _______, _______ ), [_ADJUST] = LAYOUT_wrapper( \ diff --git a/keyboards/iris/keymaps/drashna/config.h b/keyboards/iris/keymaps/drashna/config.h index 47276845f955..0274867153fe 100644 --- a/keyboards/iris/keymaps/drashna/config.h +++ b/keyboards/iris/keymaps/drashna/config.h @@ -31,7 +31,7 @@ along with this program. If not, see . #ifdef RGBLIGHT_ENABLE #undef RGBLED_NUM #define RGBLED_NUM 18 // Number of LEDs -#define RGBLIGHT_ANIMATIONS + #define RGBLIGHT_HUE_STEP 12 #define RGBLIGHT_SAT_STEP 12 #define RGBLIGHT_VAL_STEP 12 diff --git a/keyboards/iris/keymaps/drashna/keymap.c b/keyboards/iris/keymaps/drashna/keymap.c index 37c3f97f54ae..60f41f9d98e2 100644 --- a/keyboards/iris/keymaps/drashna/keymap.c +++ b/keyboards/iris/keymaps/drashna/keymap.c @@ -2,42 +2,53 @@ #include QMK_KEYBOARD_H #include "drashna.h" + +#define LAYOUT_iris_base( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \ + ) \ + LAYOUT_wrapper( \ + KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, \ + KC_TAB , K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSLS, \ + KC_C1R3, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ + KC_MLSF, CTL_T(K21), K22, K23, K24, K25, ALT_APP, OS_RGUI, K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ + LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE \ + ) +#define LAYOUT_iris_base_wrapper(...) LAYOUT_iris_base(__VA_ARGS__) + + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = LAYOUT_wrapper( - KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, - KC_TAB , _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSLS, - KC_C1R3, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, ALT_APP, OS_RGUI, _________________QWERTY_R3_________________, KC_MRSF, - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + [_QWERTY] = LAYOUT_iris_base_wrapper( + _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, + _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, + _________________QWERTY_L3_________________, _________________QWERTY_R3_________________ ), - [_COLEMAK] = LAYOUT_wrapper( - KC_ESC , ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, - KC_TAB , _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, KC_BSLS, - KC_C1R3, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_QUOT, - KC_MLSF, _________________COLEMAK_L3________________, ALT_APP, OS_RGUI, _________________COLEMAK_R3________________, KC_MRSF, - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + + [_COLEMAK] = LAYOUT_iris_base_wrapper( + _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, + _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, + _________________COLEMAK_L3________________, _________________COLEMAK_R3________________ ), - [_DVORAK] = LAYOUT_wrapper( - KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, - KC_TAB , _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, KC_BSLS, - KC_C1R3, _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, KC_QUOT, - KC_MLSF, _________________DVORAK_L3_________________, ALT_APP, OS_RGUI, _________________DVORAK_R3_________________, KC_MRSF, - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + + [_DVORAK] = LAYOUT_iris_base_wrapper( + _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, + _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, + _________________DVORAK_L3_________________, _________________DVORAK_R3_________________ ), - [_WORKMAN] = LAYOUT_wrapper( - KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, - KC_TAB , _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, KC_BSLS, - KC_C1R3, _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, KC_QUOT, - KC_MLSF, _________________WORKMAN_L3________________, ALT_APP, OS_RGUI, _________________WORKMAN_R3________________, KC_MRSF, - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE + + [_WORKMAN] = LAYOUT_iris_base_wrapper( + _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, + _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, + _________________WORKMAN_L3________________, _________________WORKMAN_R3________________ ), [_MODS] = LAYOUT_wrapper( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RSFT, + _______, ___________________BLANK___________________, ___________________BLANK___________________, _______, + _______, ___________________BLANK___________________, ___________________BLANK___________________, _______, + _______, ___________________BLANK___________________, ___________________BLANK___________________, _______, + KC_LSFT, ___________________BLANK___________________, _______, _______, ___________________BLANK___________________, KC_RSFT, _______, _______, _______, _______, _______, _______ ), diff --git a/keyboards/iris/keymaps/drashna/rules.mk b/keyboards/iris/keymaps/drashna/rules.mk index e8035176efb5..89e568f39912 100644 --- a/keyboards/iris/keymaps/drashna/rules.mk +++ b/keyboards/iris/keymaps/drashna/rules.mk @@ -8,10 +8,10 @@ RGBLIGHT_ENABLE = yes AUDIO_ENABLE = yes NKRO_ENABLE = yes BACKLIGHT_ENABLE = no -SWAP_HANDS_ENABLE = no +SWAP_HANDS_ENABLE = yes INDICATOR_LIGHTS = yes MACROS_ENABLED = no -RGBLIGHT_TWINKLE = no +RGBLIGHT_TWINKLE = yes BOOTLOADER = qmk-dfu diff --git a/keyboards/orthodox/keymaps/drashna/config.h b/keyboards/orthodox/keymaps/drashna/config.h index 2257b62fd3b4..09df12d9ed96 100644 --- a/keyboards/orthodox/keymaps/drashna/config.h +++ b/keyboards/orthodox/keymaps/drashna/config.h @@ -45,7 +45,7 @@ along with this program. If not, see . #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN D3 #define RGBLED_NUM 16 // Number of LEDs -#define RGBLIGHT_ANIMATIONS + #define RGBLIGHT_HUE_STEP 12 #define RGBLIGHT_SAT_STEP 12 #define RGBLIGHT_VAL_STEP 12 diff --git a/keyboards/orthodox/keymaps/drashna/keymap.c b/keyboards/orthodox/keymaps/drashna/keymap.c index 67f732c12779..25296ca4fdd2 100644 --- a/keyboards/orthodox/keymaps/drashna/keymap.c +++ b/keyboards/orthodox/keymaps/drashna/keymap.c @@ -30,41 +30,47 @@ uint8_t last_led; uint8_t last_osm; #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. -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO +#define LAYOUT_orthodox_base( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \ + ) \ + LAYOUT_wrapper( \ + KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \ + KC_TAB, K11, K12, K13, K14, K15, ALT_APP, OS_LGUI, KC_LALT, OS_RGUI, K16, K17, K18, K19, K1A, KC_QUOT, \ + KC_MLSF, CTL_T(K21), K22, K23, K24, K25, LOWER, KC_SPACE,KC_BSPC, KC_DEL, KC_ENT, RAISE, K26, K27, K28, K29, CTL_T(K2A), KC_MRSF \ + ) +#define LAYOUT_orthodox_base_wrapper(...) LAYOUT_orthodox_base(__VA_ARGS__) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[_QWERTY] = LAYOUT_wrapper(\ - KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, - KC_TAB, _________________QWERTY_L2_________________, ___________ORTHODOX_THUMP_TOP_____________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, ___________________ORTHODOX_THUMB_BOTTOM____________________, _________________QWERTY_R3_________________, KC_MRSF +[_QWERTY] = LAYOUT_orthodox_base_wrapper( + _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, + _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, + _________________QWERTY_L3_________________, _________________QWERTY_R3_________________ ), -[_COLEMAK] = LAYOUT_wrapper(\ - KC_ESC, _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, KC_BSPC, - KC_TAB, _________________COLEMAK_L2________________, ___________ORTHODOX_THUMP_TOP_____________, _________________COLEMAK_R2________________, KC_QUOT, - KC_MLSF, _________________COLEMAK_L3________________, ___________________ORTHODOX_THUMB_BOTTOM____________________, _________________COLEMAK_R3________________, KC_MRSF +[_COLEMAK] = LAYOUT_orthodox_base_wrapper( + _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, + _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, + _________________COLEMAK_L3________________, _________________COLEMAK_R3________________ ), -[_DVORAK] = LAYOUT_wrapper(\ - KC_ESC, _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, KC_BSPC, - KC_TAB, _________________DVORAK_L2_________________, ___________ORTHODOX_THUMP_TOP_____________, _________________DVORAK_R2_________________, KC_MINS, - KC_MLSF, _________________DVORAK_L3_________________, ___________________ORTHODOX_THUMB_BOTTOM____________________, _________________DVORAK_R3_________________, KC_MRSF +[_DVORAK] = LAYOUT_orthodox_base_wrapper( + _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, + _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, + _________________DVORAK_L3_________________, _________________DVORAK_R3_________________ ), -[_WORKMAN] = LAYOUT_wrapper(\ - KC_ESC, _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, KC_BSPC, - KC_TAB, _________________WORKMAN_L2________________, ___________ORTHODOX_THUMP_TOP_____________, _________________WORKMAN_R2________________, KC_MINS, - KC_MLSF, _________________WORKMAN_L3________________, ___________________ORTHODOX_THUMB_BOTTOM____________________, _________________WORKMAN_R3________________, KC_MRSF + +[_WORKMAN] = LAYOUT_orthodox_base_wrapper( + _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, + _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, + _________________WORKMAN_L3________________, _________________WORKMAN_R3________________ ), + [_MODS] = LAYOUT_wrapper(\ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/orthodox/keymaps/drashna/rules.mk b/keyboards/orthodox/keymaps/drashna/rules.mk index a826c664a7bf..f870c3a7d654 100644 --- a/keyboards/orthodox/keymaps/drashna/rules.mk +++ b/keyboards/orthodox/keymaps/drashna/rules.mk @@ -10,6 +10,6 @@ NKRO_ENABLE = yes INDICATOR_LIGHTS = yes MACROS_ENABLED = no -RGBLIGHT_TWINKLE = no +RGBLIGHT_TWINKLE = yes BOOTLOADER = qmk-dfu diff --git a/keyboards/viterbi/keymaps/drashna/config.h b/keyboards/viterbi/keymaps/drashna/config.h index a1e361e346de..6eb871a50fa3 100644 --- a/keyboards/viterbi/keymaps/drashna/config.h +++ b/keyboards/viterbi/keymaps/drashna/config.h @@ -19,16 +19,14 @@ along with this program. If not, see . #ifdef RGBLIGHT_ENABLE #undef RGBLED_NUM -#define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 16 + #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 #define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 #define RGBLIGHT_EFFECT_SNAKE_LENGTH 2 #define RGBLIGHT_EFFECT_BREATHE_CENTER 1 -#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 300 -#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1 #endif // RGBLIGHT_ENABLE diff --git a/layouts/community/ergodox/drashna/config.h b/layouts/community/ergodox/drashna/config.h index 3ced18593241..fee954d17945 100644 --- a/layouts/community/ergodox/drashna/config.h +++ b/layouts/community/ergodox/drashna/config.h @@ -5,8 +5,9 @@ #ifdef RGBLIGHT_ENABLE #undef RGBLIGHT_SAT_STEP #define RGBLIGHT_SAT_STEP 12 -#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 7 -#define RGBLIGHT_EFFECT_SNAKE_LENGTH 7 + +#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 3 +#define RGBLIGHT_EFFECT_SNAKE_LENGTH 3 #define RGBLIGHT_EFFECT_BREATHE_CENTER 1 #endif // RGBLIGHT_ENABLE diff --git a/layouts/community/ergodox/drashna/keymap.c b/layouts/community/ergodox/drashna/keymap.c index 15153c46927e..b9a2eb7a8f92 100644 --- a/layouts/community/ergodox/drashna/keymap.c +++ b/layouts/community/ergodox/drashna/keymap.c @@ -30,6 +30,24 @@ along with this program. If not, see . //define layer change stuff for underglow indicator bool skip_leds = false; +#define LAYOUT_ergodox_pretty_base( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \ + ) \ + LAYOUT_ergodox_pretty_wrapper( \ + KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, \ + KC_TAB, K01, K02, K03, K04, K05, TG(_DIABLO), TG(_DIABLO), K06, K07, K08, K09, K0A, KC_BSLS, \ + KC_C1R3, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ + KC_MLSF, CTL_T(K21), K22, K23, K24, K25, TG(_GAMEPAD), TG(_GAMEPAD), K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ + KC_GRV, OSM(MOD_MEH),OSM(MOD_LGUI),KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, UC_IRNY, \ + ALT_T(KC_APP), OSM(MOD_LGUI), OSM(MOD_RGUI), CTL_T(KC_ESCAPE), \ + KC_HOME, KC_PGUP, \ + LT(_LOWER, KC_SPACE),KC_BSPC, KC_END, KC_PGDN, KC_DEL, LT(_RAISE, KC_ENTER) \ + ) + +#define LAYOUT_ergodox_pretty_base_wrapper(...) LAYOUT_ergodox_pretty_base(__VA_ARGS__) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -55,15 +73,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | End | | PgDn | | | * `---------------------' `---------------------' */ - [_QWERTY] = LAYOUT_ergodox_pretty_wrapper( - // left hand // right hand - KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, - KC_TAB, _________________QWERTY_L1_________________, TG(_DIABLO), TG(_DIABLO), _________________QWERTY_R1_________________, KC_BSLS, - KC_C1R3, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________QWERTY_R3_________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, UC_IRNY, - __________________ERGODOX_THUMB_CLUSTER_____________________ - ), + [_QWERTY] = LAYOUT_ergodox_pretty_base_wrapper( + _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, + _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, + _________________QWERTY_L3_________________, _________________QWERTY_R3_________________ + ), /* Keymap 0: COLEMAK layer * * ,--------------------------------------------------. ,--------------------------------------------------. @@ -87,15 +101,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ // If it accepts an argument (i.e, is a function), it doesn't need KC_. // Otherwise, it needs KC_* - [_COLEMAK] = LAYOUT_ergodox_pretty_wrapper( - // left hand // right hand - KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, - KC_TAB, _________________COLEMAK_L1________________, TG(_DIABLO), TG(_DIABLO), _________________COLEMAK_R1________________, KC_BSLS, - KC_C1R3, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_QUOT, - KC_MLSF, _________________COLEMAK_L3________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________COLEMAK_R3________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, UC_IRNY, - __________________ERGODOX_THUMB_CLUSTER_____________________ - ), + [_COLEMAK] = LAYOUT_ergodox_pretty_base_wrapper( + _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, + _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, + _________________COLEMAK_L3________________, _________________COLEMAK_R3________________ + ), /* Keymap 0: DVORAK Layout * * ,--------------------------------------------------. ,--------------------------------------------------. @@ -119,15 +129,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ // If it accepts an argument (i.e, is a function), it doesn't need KC_. // Otherwise, it needs KC_* - [_DVORAK] = LAYOUT_ergodox_pretty_wrapper( - // left hand // right hand - KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_BSLS, - KC_TAB, _________________DVORAK_L1_________________, TG(_DIABLO), TG(_DIABLO), _________________DVORAK_R1_________________, KC_SLSH, - KC_C1R3, _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, KC_MINS, - KC_MLSF, _________________DVORAK_L3_________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________DVORAK_R3_________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, UC_IRNY, - __________________ERGODOX_THUMB_CLUSTER_____________________ - ), + [_DVORAK] = LAYOUT_ergodox_pretty_base_wrapper( + _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, + _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, + _________________DVORAK_L3_________________, _________________DVORAK_R3_________________ + ), /* Keymap 0: WORKMAN layer * * ,--------------------------------------------------. ,--------------------------------------------------. @@ -149,17 +155,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | |ace | End | | PgDn | | | * `--------------------' `----------------------' */ -// If it accepts an argument (i.e, is a function), it doesn't need KC_. -// Otherwise, it needs KC_* - [_WORKMAN] = LAYOUT_ergodox_pretty_wrapper( - // left hand - KC_ESC, ________________NUMBER_LEFT________________, UC_FLIP, UC_TABL, ________________NUMBER_RIGHT_______________, KC_MINS, - KC_TAB, _________________WORKMAN_L1________________, TG(_DIABLO), TG(_DIABLO), _________________WORKMAN_R1________________, KC_BSLS, - KC_C1R3, _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, KC_QUOT, - KC_MLSF, _________________WORKMAN_L3________________, TG(_GAMEPAD), TG(_GAMEPAD), _________________WORKMAN_R3________________, KC_MRSF, - KC_GRV, ___________ERGODOX_BOTTOM_LEFT_____________, ___________ERGODOX_BOTTOM_RIGHT____________, UC_IRNY, - __________________ERGODOX_THUMB_CLUSTER_____________________ - ), + + [_WORKMAN] = LAYOUT_ergodox_pretty_base_wrapper( + _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, + _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, + _________________WORKMAN_L3________________, _________________WORKMAN_R3________________ + ), // Reverts OSM(Shift) to normal Shifts. However, may not need since we fixed the issue with RDP (LOCAL RESOURCES) [_MODS] = LAYOUT_ergodox_pretty_wrapper( diff --git a/layouts/community/ortho_4x12/drashna/config.h b/layouts/community/ortho_4x12/drashna/config.h index cbd5bb4602a4..b4c780cc1163 100644 --- a/layouts/community/ortho_4x12/drashna/config.h +++ b/layouts/community/ortho_4x12/drashna/config.h @@ -5,7 +5,7 @@ #if defined(RGBLIGHT_ENABLE) && !defined(RGBLED_NUM) #define RGB_DI_PIN D3 #define RGBLED_NUM 16 // Number of LEDs -#define RGBLIGHT_ANIMATIONS + #define RGBLIGHT_HUE_STEP 12 #define RGBLIGHT_SAT_STEP 12 #define RGBLIGHT_VAL_STEP 12 diff --git a/layouts/community/ortho_4x12/drashna/keymap.c b/layouts/community/ortho_4x12/drashna/keymap.c index 39f901b14f1c..108df693157d 100644 --- a/layouts/community/ortho_4x12/drashna/keymap.c +++ b/layouts/community/ortho_4x12/drashna/keymap.c @@ -25,34 +25,44 @@ enum planck_keycodes { #define BACKLIT OSM(MOD_LSFT) #endif +#define LAYOUT_ortho_4x12_base( \ + K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, \ + K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, \ + K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \ + ) \ + LAYOUT_ortho_4x12_wrapper( \ + KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \ + KC_TAB, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ + KC_MLSF, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, CTL_T(K2A), KC_ENT, \ + BACKLIT, OS_LCTL, OS_LALT, OS_LGUI, SP_LWER, BK_LWER, DL_RAIS, ET_RAIS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + ) +#define LAYOUT_ortho_4x12_base_wrapper(...) LAYOUT_ortho_4x12_base(__VA_ARGS__) + + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[_QWERTY] = LAYOUT_ortho_4x12_wrapper( - KC_ESC, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, - KC_TAB, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, - KC_MLSF, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_ENT, - BACKLIT, OS_LCTL, OS_LALT, OS_LGUI, SP_LWER, BK_LWER, DL_RAIS, ET_RAIS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +[_QWERTY] = LAYOUT_ortho_4x12_base_wrapper( + _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, + _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, + _________________QWERTY_L3_________________, _________________QWERTY_R3_________________ ), -[_COLEMAK] = LAYOUT_ortho_4x12_wrapper( - KC_ESC, _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, KC_BSPC, - KC_TAB, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_QUOT, - KC_MLSF, _________________COLEMAK_L3________________, _________________COLEMAK_R3________________, KC_ENT, - BACKLIT, OS_LCTL, OS_LALT, OS_LGUI, SP_LWER, BK_LWER, DL_RAIS, ET_RAIS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +[_COLEMAK] = LAYOUT_ortho_4x12_base_wrapper( + _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, + _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, + _________________COLEMAK_L3________________, _________________COLEMAK_R3________________ ), -[_DVORAK] = LAYOUT_ortho_4x12_wrapper( - KC_ESC, _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, KC_BSPC, - KC_TAB, _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, KC_SLSH, - KC_MLSF, _________________DVORAK_L3_________________, _________________DVORAK_R3_________________, KC_ENT, - BACKLIT, OS_LCTL, OS_LALT, OS_LGUI, SP_LWER, BK_LWER, DL_RAIS, ET_RAIS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +[_DVORAK] = LAYOUT_ortho_4x12_base_wrapper( + _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, + _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, + _________________DVORAK_L3_________________, _________________DVORAK_R3_________________ ), -[_WORKMAN] = LAYOUT_ortho_4x12_wrapper( - KC_TAB, _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, KC_BSPC, - KC_ESC, _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, KC_QUOT, - KC_MLSF, _________________WORKMAN_L3________________, _________________WORKMAN_R3________________, KC_ENT, - BACKLIT, OS_LCTL, OS_LALT, OS_LGUI, SP_LWER, BK_LWER, DL_RAIS, ET_RAIS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT +[_WORKMAN] = LAYOUT_ortho_4x12_base_wrapper( + _________________WORKMAN_L1________________, _________________WORKMAN_R1________________, + _________________WORKMAN_L2________________, _________________WORKMAN_R2________________, + _________________WORKMAN_L3________________, _________________WORKMAN_R3________________ ), [_MODS] = LAYOUT_ortho_4x12_wrapper( diff --git a/users/drashna/config.h b/users/drashna/config.h index 3ddec93b13c7..4545b34ef67d 100644 --- a/users/drashna/config.h +++ b/users/drashna/config.h @@ -19,10 +19,12 @@ #ifdef RGBLIGHT_ENABLE #define RGBLIGHT_SLEEP +#undef RGBLIGHT_ANIMATIONS +#define RGBLIGHT_EFFECT_BREATHING +#define RGBLIGHT_EFFECT_SNAKE +#define RGBLIGHT_EFFECT_KNIGHT #endif // RGBLIGHT_ENABLE - - #ifndef ONESHOT_TAP_TOGGLE #define ONESHOT_TAP_TOGGLE 2 #endif // !ONESHOT_TAP_TOGGLE diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index aad9fab611bc..5b6620cf33d6 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -36,11 +36,11 @@ bool send_game_macro(const char *str, keyrecord_t *record, bool override) { keycode = KC_ENTER; } clear_keyboard(); - tap(keycode); + tap_code(keycode); wait_ms(50); send_string_with_delay(str, MACRO_TIMER); wait_ms(50); - tap(KC_ENTER); + tap_code(KC_ENTER); } if (override) wait_ms(3000); return false; @@ -127,13 +127,13 @@ uint32_t default_layer_state_set_keymap (uint32_t state) { __attribute__ ((weak)) void led_set_keymap(uint8_t usb_led) {} - +__attribute__ ((weak)) +void eeconfig_init_keymap(void) {} // Call user matrix init, set default RGB colors and then // call the keymap's init function void matrix_init_user(void) { - userspace_config.raw = eeprom_read_dword(EECONFIG_USERSPACE); - + userspace_config.raw = eeconfig_read_user(); #ifdef BOOTLOADER_CATERINA DDRD &= ~(1<<5); @@ -250,7 +250,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader if (!record->event.pressed) { - send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP + uint8_t temp_mod = get_mods(); + clear_mods(); + send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), 10); + if (temp_mod & MODS_SHIFT_MASK) { + send_string_with_delay_P(PSTR( #if defined(__ARM__) ":dfu-util" #elif defined(BOOTLOADER_DFU) @@ -260,7 +264,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #elif defined(BOOTLOADER_CATERINA) ":avrdude" #endif // bootloader options - SS_TAP(X_ENTER)), 10); + ), 10); + } + if (temp_mod & MODS_CTRL_MASK) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10); } + send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10); + set_mods(temp_mod); } return false; break; @@ -268,8 +276,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case EPRM: // Resets EEPROM if (record->event.pressed) { eeconfig_init(); - default_layer_set(1UL<event.pressed) { userspace_config.is_overwatch ^= 1; eeprom_update_dword(EECONFIG_USERSPACE, userspace_config.raw); } + if (record->event.pressed) { userspace_config.is_overwatch ^= 1; eeconfig_update_user(userspace_config.raw); } #ifdef RGBLIGHT_ENABLE userspace_config.is_overwatch ? rgblight_mode_noeeprom(17) : rgblight_mode_noeeprom(18); #endif //RGBLIGHT_ENABLE @@ -344,11 +350,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } else { if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy register_code(KC_LCTL); - tap(KC_C); + tap_code(KC_C); unregister_code(KC_LCTL); } else { // Tap, paste register_code(KC_LCTL); - tap(KC_V); + tap_code(KC_V); unregister_code(KC_LCTL); } } @@ -413,3 +419,8 @@ uint32_t default_layer_state_set_user(uint32_t state) { void led_set_user(uint8_t usb_led) { led_set_keymap(usb_led); } + +void eeconfig_init_user(void) { + userspace_config.raw = 0; + eeconfig_update_user(userspace_config.raw); +} diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h index 49e3fc870bfe..7e69a9f8d9f4 100644 --- a/users/drashna/drashna.h +++ b/users/drashna/drashna.h @@ -19,14 +19,13 @@ along with this program. If not, see . #include "quantum.h" #include "version.h" #include "eeprom.h" -#include "send_unicode.h" #ifdef RGB_MATRIX_ENABLE #include "rgb_matrix.h" #endif -// Define layer names +/* Define layer names */ enum userspace_layers { _QWERTY = 0, _NUMLOCK = 0, @@ -43,28 +42,27 @@ enum userspace_layers { _ADJUST, }; -//define modifiers +/* +define modifiers here, since MOD_* doesn't seem to work for these + */ #define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) #define MODS_CTRL_MASK (MOD_BIT(KC_LCTL)|MOD_BIT(KC_RCTRL)) #define MODS_ALT_MASK (MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT)) #define MODS_GUI_MASK (MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)) -// RGB color codes are no longer located here anymore. Instead, you will want to -// head to https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight_list.h - -extern bool rgb_layer_change; +/* +RGB color codes are no longer located here anymore. Instead, you will want to +head to https://github.com/qmk/qmk_firmware/blob/master/quantum/rgblight_list.h +*/ #ifdef RGBLIGHT_ENABLE void rgblight_sethsv_default_helper(uint8_t index); #endif // RGBLIGHT_ENABLE -inline void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); }; bool mod_key_press_timer (uint16_t code, uint16_t mod_code, bool pressed); bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t this_timer); -#define EECONFIG_USERSPACE (uint32_t *)19 - typedef union { uint32_t raw; struct { @@ -149,7 +147,7 @@ enum userspace_custom_keycodes { #define DL_RAIS LT(_RAISE, KC_DEL) #define ET_RAIS LT(_RAISE, KC_ENTER) -// OSM keycodes, to keep things clean and easy to change +/* OSM keycodes, to keep things clean and easy to change */ #define KC_MLSF OSM(MOD_LSFT) #define KC_MRSF OSM(MOD_RSFT) @@ -178,9 +176,11 @@ enum { #endif // TAP_DANCE_ENABLE -// Custom Keycodes for Diablo 3 layer -// But since TD() doesn't work when tap dance is disabled -// We use custom codes here, so we can substitute the right stuff +/* +Custom Keycodes for Diablo 3 layer +But since TD() doesn't work when tap dance is disabled +We use custom codes here, so we can substitute the right stuff +*/ #ifdef TAP_DANCE_ENABLE #define KC_D3_1 TD(TD_D3_1) #define KC_D3_2 TD(TD_D3_2) @@ -193,11 +193,11 @@ enum { #define KC_D3_4 KC_4 #endif // TAP_DANCE_ENABLE - - -// Since our quirky block definitions are basically a list of comma separated -// arguments, we need a wrapper in order for these definitions to be -// expanded before being used as arguments to the LAYOUT_xxx macro. +/* +Since our quirky block definitions are basically a list of comma separated +arguments, we need a wrapper in order for these definitions to be +expanded before being used as arguments to the LAYOUT_xxx macro. +*/ #if (!defined(LAYOUT) && defined(KEYMAP)) #define LAYOUT KEYMAP #endif @@ -208,112 +208,114 @@ enum { #define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) #define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) -// Blocks for each of the four major keyboard layouts -// Organized so we can quickly adapt and modify all of them -// at once, rather than for each keyboard, one at a time. -// And this allows for much cleaner blocks in the keymaps. -// For instance Tap/Hold for Control on all of the layouts - -// NOTE: These are all the same length. If you do a search/replace -// then you need to add/remove underscores to keep the -// lengths consistent. +/* +Blocks for each of the four major keyboard layouts +Organized so we can quickly adapt and modify all of them +at once, rather than for each keyboard, one at a time. +And this allows for much cleaner blocks in the keymaps. +For instance Tap/Hold for Control on all of the layouts + +NOTE: These are all the same length. If you do a search/replace + then you need to add/remove underscores to keep the + lengths consistent. +*/ #define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T #define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G -#define _________________QWERTY_L3_________________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B +#define _________________QWERTY_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B #define _________________QWERTY_R1_________________ KC_Y, KC_U, KC_I, KC_O, KC_P #define _________________QWERTY_R2_________________ KC_H, KC_J, KC_K, KC_L, KC_SCLN -#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLASH) +#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH #define _________________COLEMAK_L1________________ KC_Q, KC_W, KC_F, KC_P, KC_G #define _________________COLEMAK_L2________________ KC_A, KC_R, KC_S, KC_T, KC_D -#define _________________COLEMAK_L3________________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B +#define _________________COLEMAK_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_B #define _________________COLEMAK_R1________________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN #define _________________COLEMAK_R2________________ KC_H, KC_N, KC_E, KC_I, KC_O -#define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLASH) +#define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH #define ______________COLEMAK_MOD_DH_L1____________ KC_Q, KC_W, KC_F, KC_P, KC_B #define ______________COLEMAK_MOD_DH_L2____________ KC_A, KC_R, KC_S, KC_T, KC_G -#define ______________COLEMAK_MOD_DH_L3____________ CTL_T(KC_Z), KC_X, KC_C, KC_D, KC_V +#define ______________COLEMAK_MOD_DH_L3____________ KC_Z, KC_X, KC_C, KC_D, KC_V #define ______________COLEMAK_MOD_DH_R1____________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN #define ______________COLEMAK_MOD_DH_R2____________ KC_M, KC_N, KC_E, KC_I, KC_O -#define ______________COLEMAK_MOD_DH_R3____________ KC_K, KC_H, KC_COMM, KC_DOT, CTL_T(KC_SLASH) +#define ______________COLEMAK_MOD_DH_R3____________ KC_K, KC_H, KC_COMM, KC_DOT, KC_SLASH #define _________________DVORAK_L1_________________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y #define _________________DVORAK_L2_________________ KC_A, KC_O, KC_E, KC_U, KC_I -#define _________________DVORAK_L3_________________ CTL_T(KC_SCLN),KC_Q, KC_J, KC_K, KC_X +#define _________________DVORAK_L3_________________ KC_SCLN, KC_Q, KC_J, KC_K, KC_X #define _________________DVORAK_R1_________________ KC_F, KC_G, KC_C, KC_R, KC_L #define _________________DVORAK_R2_________________ KC_D, KC_H, KC_T, KC_N, KC_S -#define _________________DVORAK_R3_________________ KC_B, KC_M, KC_W, KC_V, CTL_T(KC_Z) +#define _________________DVORAK_R3_________________ KC_B, KC_M, KC_W, KC_V, KC_Z #define _________________WORKMAN_L1________________ KC_Q, KC_D, KC_R, KC_W, KC_B #define _________________WORKMAN_L2________________ KC_A, KC_S, KC_H, KC_T, KC_G -#define _________________WORKMAN_L3________________ CTL_T(KC_Z), KC_X, KC_M, KC_C, KC_V +#define _________________WORKMAN_L3________________ KC_Z, KC_X, KC_M, KC_C, KC_V #define _________________WORKMAN_R1________________ KC_J, KC_F, KC_U, KC_P, KC_SCLN #define _________________WORKMAN_R2________________ KC_Y, KC_N, KC_E, KC_O, KC_I -#define _________________WORKMAN_R3________________ KC_K, KC_L, KC_COMM, KC_DOT, CTL_T(KC_SLASH) +#define _________________WORKMAN_R3________________ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH #define _________________NORMAN_L1_________________ KC_Q, KC_W, KC_D, KC_F, KC_K #define _________________NORMAN_L2_________________ KC_A, KC_S, KC_E, KC_T, KC_G -#define _________________NORMAN_L3_________________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B +#define _________________NORMAN_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B #define _________________NORMAN_R1_________________ KC_J, KC_U, KC_R, KC_L, KC_SCLN #define _________________NORMAN_R2_________________ KC_Y, KC_N, KC_I, KC_O, KC_U -#define _________________NORMAN_R3_________________ KC_P, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLASH) +#define _________________NORMAN_R3_________________ KC_P, KC_M, KC_COMM, KC_DOT, KC_SLASH #define _________________MALTRON_L1________________ KC_Q, KC_P, KC_Y, KC_C, KC_B #define _________________MALTRON_L2________________ KC_A, KC_N, KC_I, KC_S, KC_F -#define _________________MALTRON_L3________________ CTL_T(KC_SCLN), KC_SLSH, KC_J KC_G, KC_COMM +#define _________________MALTRON_L3________________ KC_SCLN, KC_SLSH, KC_J KC_G, KC_COMM #define _________________MALTRON_R1________________ KC_V, KC_M, KC_U, KC_Z, KC_L #define _________________MALTRON_R2________________ KC_D, KC_T, KC_D, KC_O, KC_R -#define _________________MALTRON_R3________________ KC_DOT, KC_W, KC_K, KC_MINS, CTL_T(KC_x) +#define _________________MALTRON_R3________________ KC_DOT, KC_W, KC_K, KC_MINS, KC_X #define _________________EUCALYN_L1________________ KC_SLSH, KC_COMM, KC_DOT, KC_F, KC_Q #define _________________EUCALYN_L2________________ KC_A, KC_O, KC_E, KC_I, KC_U -#define _________________EUCALYN_L3________________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_W +#define _________________EUCALYN_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_W #define _________________EUCALYN_R1________________ KC_M, KC_R, KC_D, KC_Y, KC_P #define _________________EUCALYN_R2________________ KC_G, KC_T, KC_K, KC_S, KC_N -#define _________________EUCALYN_R3________________ KC_B, KC_H, KC_J, KC_L, CTL_T(KC_SCLN) +#define _________________EUCALYN_R3________________ KC_B, KC_H, KC_J, KC_L, KC_SCLN #define _____________CARPLAX_QFMLWY_L1_____________ KC_Q, KC_F, KC_M, KC_L, KC_W #define _____________CARPLAX_QFMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R -#define _____________CARPLAX_QFMLWY_L3_____________ CTL_T(KC_Z), KC_V, KC_G, KC_C, KC_X +#define _____________CARPLAX_QFMLWY_L3_____________ KC_Z, KC_V, KC_G, KC_C, KC_X #define _____________CARPLAX_QFMLWY_R1_____________ KC_Y, KC_U, KC_O, KC_B, KC_J #define _____________CARPLAX_QFMLWY_R2_____________ KC_I, KC_A, KC_E, KC_H, KC_SCLN -#define _____________CARPLAX_QFMLWY_R3_____________ KC_P, KC_K, KC_COMM, KC_DOT, CTL_T(KC_SLSH) +#define _____________CARPLAX_QFMLWY_R3_____________ KC_P, KC_K, KC_COMM, KC_DOT, KC_SLSH #define _____________CARPLAX_QGMLWB_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W #define _____________CARPLAX_QGMLWB_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R -#define _____________CARPLAX_QGMLWB_L3_____________ CTL_T(KC_Z), KC_X, KC_C, KC_F, KC_J +#define _____________CARPLAX_QGMLWB_L3_____________ KC_Z, KC_X, KC_C, KC_F, KC_J #define _____________CARPLAX_QGMLWB_R1_____________ KC_B, KC_Y, KC_U, KC_V, KC_SCLN #define _____________CARPLAX_QGMLWB_R2_____________ KC_I, KC_A, KC_E, KC_O, KC_H -#define _____________CARPLAX_QGMLWB_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, CTL_T(KC_SLSH) +#define _____________CARPLAX_QGMLWB_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH #define _____________CARPLAX_QGMLWY_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W #define _____________CARPLAX_QGMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R -#define _____________CARPLAX_QGMLWY_L3_____________ CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_J +#define _____________CARPLAX_QGMLWY_L3_____________ KC_Z, KC_X, KC_C, KC_V, KC_J #define _____________CARPLAX_QGMLWY_R1_____________ KC_Y, KC_F, KC_U, KC_B, KC_SCLN #define _____________CARPLAX_QGMLWY_R2_____________ KC_I, KC_A, KC_E, KC_O, KC_H -#define _____________CARPLAX_QGMLWY_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, CTL_T(KC_SLSH) +#define _____________CARPLAX_QGMLWY_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH #define ________________NUMBER_LEFT________________ KC_1, KC_2, KC_3, KC_4, KC_5 @@ -352,21 +354,3 @@ enum { #define _________________ADJUST_R2_________________ AG_SWAP, QWERTY, COLEMAK, DVORAK, WORKMAN #define _________________ADJUST_R3_________________ MG_NKRO, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT - -// Since we have 4 default layouts (QWERTY, DVORAK, COLEMAK and WORKMAN), -// this allows us to quickly modify the bottom row for all of the layouts -// so we don't have to alter it 4 times and hope that we haven't missed -// anything -#define ___________ERGODOX_BOTTOM_LEFT_____________ OSM(MOD_MEH), OSM(MOD_LGUI), KC_LBRC, KC_RBRC -#define ___________ERGODOX_BOTTOM_RIGHT____________ KC_LEFT, KC_DOWN, KC_UP, KC_RGHT - - -#define ___________ORTHODOX_THUMP_TOP_____________ ALT_APP, OS_LGUI, KC_LALT, OS_RGUI -#define ___________________ORTHODOX_THUMB_BOTTOM____________________ LOWER, KC_SPACE,KC_BSPC, KC_DEL, KC_ENT, RAISE - - -#define __________________ERGODOX_THUMB_CLUSTER_____________________ ALT_T(KC_APP), OSM(MOD_LGUI), OSM(MOD_RGUI), CTL_T(KC_ESCAPE), \ - KC_HOME, KC_PGUP, \ - LT(_LOWER, KC_SPACE),KC_BSPC, KC_END, KC_PGDN, KC_DEL, LT(_RAISE, KC_ENTER) - - diff --git a/users/drashna/rgb_stuff.c b/users/drashna/rgb_stuff.c index 4a1a8de69293..dc6075320e51 100644 --- a/users/drashna/rgb_stuff.c +++ b/users/drashna/rgb_stuff.c @@ -230,7 +230,7 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { userspace_config.rgb_layer_change ^= 1; xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); - eeprom_update_dword(EECONFIG_USERSPACE, userspace_config.raw); + eeconfig_update_user(userspace_config.raw); if (userspace_config.rgb_layer_change) { layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better) } @@ -243,7 +243,7 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { if (userspace_config.rgb_layer_change) { userspace_config.rgb_layer_change = false; xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); - eeprom_update_dword(EECONFIG_USERSPACE, userspace_config.raw); + eeconfig_update_user(userspace_config.raw); } } return true; break; @@ -295,31 +295,31 @@ uint32_t layer_state_set_rgb(uint32_t state) { switch (biton32(state)) { case _MACROS: rgblight_sethsv_noeeprom_orange(); - userspace_config.is_overwatch ? rgblight_mode_noeeprom(17) : rgblight_mode_noeeprom(18); + userspace_config.is_overwatch ? rgblight_effect_snake(RGBLIGHT_MODE_SNAKE + 2) : rgblight_effect_snake(RGBLIGHT_MODE_SNAKE + 3); break; case _MEDIA: rgblight_sethsv_noeeprom_chartreuse(); - rgblight_mode_noeeprom(22); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 1); break; case _GAMEPAD: rgblight_sethsv_noeeprom_orange(); - rgblight_mode_noeeprom(17); + rgblight_mode_noeeprom(RGBLIGHT_MODE_SNAKE + 2); break; case _DIABLO: rgblight_sethsv_noeeprom_red(); - rgblight_mode_noeeprom(5); + rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); break; case _RAISE: rgblight_sethsv_noeeprom_yellow(); - rgblight_mode_noeeprom(5); + rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); break; case _LOWER: rgblight_sethsv_noeeprom_green(); - rgblight_mode_noeeprom(5); + rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); break; case _ADJUST: rgblight_sethsv_noeeprom_red(); - rgblight_mode_noeeprom(23); + rgblight_mode_noeeprom(RGBLIGHT_MODE_KNIGHT + 2); break; default: // for any other layers, or the default layer switch (biton32(default_layer_state)) { @@ -332,7 +332,7 @@ uint32_t layer_state_set_rgb(uint32_t state) { default: rgblight_sethsv_noeeprom_cyan(); break; } - biton32(state) == _MODS ? rgblight_mode_noeeprom(2) : rgblight_mode_noeeprom(1); // if _MODS layer is on, then breath to denote it + biton32(state) == _MODS ? rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING) : rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); // if _MODS layer is on, then breath to denote it break; } // layer_state_set_indicator(); // Runs every scan, so need to call this here .... since I can't get it working "right" anyhow diff --git a/users/drashna/rules.mk b/users/drashna/rules.mk index 3d6213eff256..964c96c52277 100644 --- a/users/drashna/rules.mk +++ b/users/drashna/rules.mk @@ -37,6 +37,3 @@ ifdef CONSOLE_ENABLE endif endif -ifeq ($(strip $(UNICODE_ENABLE)), yes) - SRC += send_unicode.c -endif diff --git a/users/drashna/tap_dances.c b/users/drashna/tap_dances.c index c9e4b1d0ff25..3466758530ac 100644 --- a/users/drashna/tap_dances.c +++ b/users/drashna/tap_dances.c @@ -38,16 +38,16 @@ qk_tap_dance_action_t tap_dance_actions[] = { // Sends the key press to system, but only if on the Diablo layer void send_diablo_keystroke(uint8_t diablo_key) { - if (biton32(layer_state) == _DIABLO) { + if (IS_LAYER_ON(_DIABLO)) { switch (diablo_key) { case 0: - tap(KC_1); break; + tap_code(KC_1); break; case 1: - tap(KC_2); break; + tap_code(KC_2); break; case 2: - tap(KC_3); break; + tap_code(KC_3); break; case 3: - tap(KC_4); break; + tap_code(KC_4); break; } } } From 4e2817eff18f868b6d62710b67f46808d6efd22d Mon Sep 17 00:00:00 2001 From: Max Rumpf Date: Mon, 15 Oct 2018 22:23:19 +0200 Subject: [PATCH 191/505] Keymap: Some tweaks to Maxr1998's Contra layout (#4144) * Make some keys more accessible, prevent mistypings * Add "Gaming" layer which maps L-Ctrl to space (left-handed jumping compatibility-mode for all games) --- keyboards/contra/keymaps/maxr1998/keymap.c | 70 +++++++++++++++++----- 1 file changed, 55 insertions(+), 15 deletions(-) diff --git a/keyboards/contra/keymaps/maxr1998/keymap.c b/keyboards/contra/keymaps/maxr1998/keymap.c index afdd3d94accb..87bf33894891 100644 --- a/keyboards/contra/keymaps/maxr1998/keymap.c +++ b/keyboards/contra/keymaps/maxr1998/keymap.c @@ -20,13 +20,17 @@ enum contra_layers { _QWERTZ, _FUNC, - _NUMROW + _NUMROW, + _NUMROW_L3, + _GAMING }; #define KC_I3 LM(_NUMROW, MOD_LALT) #define KC_NR MO(_NUMROW) #define NR_L3 SAFE_RANGE #define FUN MO(_FUNC) +#define G_1 TO(_GAMING) +#define G_0 TG(_GAMING) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -52,7 +56,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------------------------------------------------. * | | | | | | | | Ü | | Ö | | Del | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Lock | Ä | ß | | | | | RGBS | RGBB | RGBS | | | + * | Lock | Ä | ß | | | GAME | | RGBS | RGBB | RGBS | | | * |------+------+------+------+------+------|------+------+------+------+------+------| * | | | | | | | | RGBH-| RGBT | RGBH+| PgUp | | * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -61,14 +65,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_FUNC] = { {_______, _______, _______, _______, _______, _______, _______, DE_UE, _______, DE_OE, _______, KC_DEL }, - {KC_LOCK, DE_AE, DE_SS, _______, _______, _______, _______, RGB_M_P, RGB_M_B, RGB_M_SW,_______, _______}, + {KC_LOCK, DE_AE, DE_SS, _______, _______, G_1, _______, RGB_M_P, RGB_M_B, RGB_M_SW,_______, _______}, {_______, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_TOG, RGB_HUI, KC_PGUP, _______}, {_______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, KC_HOME, KC_PGDN, KC_END } }, /* Numrow layer (special characters with Shift and ISO_L3_Shift) * ,-----------------------------------------------------------------------------------. - * | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ß | + * | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | * |------+------+------+------+------+-------------+------+------+------+------+------| * | | | | | | | | | | | #' | | * |------+------+------+------+------+------|------+------+------+------+------+------| @@ -78,25 +82,61 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_NUMROW] = { - {_______, DE_1, DE_2, DE_3, DE_4, DE_5, DE_6, DE_7, DE_8, DE_9, DE_0, DE_SS }, + {_______, DE_1, DE_2, DE_3, DE_4, DE_5, DE_6, DE_7, DE_8, DE_9, DE_0, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, DE_HASH, _______}, {_______, DE_LESS, _______, _______, _______, _______, _______, _______, _______, _______, DE_MINS, _______}, {_______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, _______, _______, _______} +}, +[_NUMROW_L3] = { + {_______, DE_1, DE_2, DE_3, DE_4, DE_5, DE_6, DE_7, DE_8, DE_9, DE_0, _______}, + {_______, DE_Q, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + {_______, DE_LESS, _______, _______, _______, _______, _______, _______, _______, _______, DE_MINS, _______}, + {_______, _______, _______, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, _______, _______, _______} +}, + +/* Gaming + * ,-----------------------------------------------------------------------------------. + * | | | | | | | | | | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Space| | | | | | | | Reset| | | | + * `-----------------------------------------------------------------------------------' + */ +[_GAMING] = { + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, + {KC_SPC, _______, _______, _______, _______, _______, _______, _______, G_0, _______, _______, _______} } }; bool process_record_user(uint16_t keycode, keyrecord_t *record) { - if (keycode == NR_L3) { - if (record->event.pressed) { - register_code(DE_ALGR); - layer_on(_NUMROW); - } else { - layer_off(_NUMROW); - unregister_code(DE_ALGR); - } - return false; + switch(keycode) { + case KC_BSPC: + if (record->event.pressed) { + if (get_mods() & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT))) { + register_code(DE_SS); + return false; + } + } else { + unregister_code(DE_SS); + } + return true; + case NR_L3: + if (record->event.pressed) { + register_code(DE_ALGR); + layer_on(_NUMROW_L3); + } else { + layer_off(_NUMROW_L3); + unregister_code(DE_ALGR); + } + return false; + default: + return true; } - return true; } void led_set_user(uint8_t usb_led) { From 423b419138f78118a0fde0144053284ab64ab88e Mon Sep 17 00:00:00 2001 From: jshuf <44121348+jshuf@users.noreply.github.com> Date: Mon, 15 Oct 2018 16:27:09 -0400 Subject: [PATCH 192/505] Keymap: 60_ansi keymap for DZ60 (#4139) * 60_ansi keymap for DZ60 * 60_ansi keymap for DZ60 Amend author * 60_ansi keymap for DZ60 --- keyboards/dz60/keymaps/60_ansi/keymap.c | 18 ++++++++++++++++++ keyboards/dz60/keymaps/60_ansi/readme.md | 9 +++++++++ 2 files changed, 27 insertions(+) create mode 100644 keyboards/dz60/keymaps/60_ansi/keymap.c create mode 100644 keyboards/dz60/keymaps/60_ansi/readme.md diff --git a/keyboards/dz60/keymaps/60_ansi/keymap.c b/keyboards/dz60/keymaps/60_ansi/keymap.c new file mode 100644 index 000000000000..9a9e11ac91d2 --- /dev/null +++ b/keyboards/dz60/keymaps/60_ansi/keymap.c @@ -0,0 +1,18 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + LAYOUT_60_ansi( + KC_GESC, 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, MO(1), KC_RCTL), + + LAYOUT_60_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_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, RESET, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_HOME, KC_PGUP, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_TOGG, BL_INC, BL_STEP, KC_TRNS, KC_DEL, KC_END, KC_PGDN, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; diff --git a/keyboards/dz60/keymaps/60_ansi/readme.md b/keyboards/dz60/keymaps/60_ansi/readme.md new file mode 100644 index 000000000000..edbc16c0420f --- /dev/null +++ b/keyboards/dz60/keymaps/60_ansi/readme.md @@ -0,0 +1,9 @@ +![60_ansi DZ60 base layer](https://i.imgur.com/MqBLh3D.png) + +![60_ansi DZ60 fn layer](https://i.imgur.com/ml1djHi.png) + +# 60_ansi DZ60 Layout + +This is a basic keymap for the 60_ansi layout of the DZ60. +The default layer is normal ANSI and the Fn layer is used for RGB +and backlighting functions. From 76aa2baf3ea169b976c4cef7013b2020d93a69c3 Mon Sep 17 00:00:00 2001 From: Jim Tittsler Date: Tue, 16 Oct 2018 08:36:20 +0900 Subject: [PATCH 193/505] Fix doc typo --- docs/getting_started_github.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting_started_github.md b/docs/getting_started_github.md index 7a3531c75d73..aeb8738b772b 100644 --- a/docs/getting_started_github.md +++ b/docs/getting_started_github.md @@ -8,7 +8,7 @@ Start on the [QMK Github page](https://github.com/qmk/qmk_firmware), and you'll ![Fork on Github](http://i.imgur.com/8Toomz4.jpg) -If you're apart of an organization, you'll need to choose which account to fork it to. In most circumstances, you'll want to fork it to your personal account. Once your fork is completed (sometimes this takes a little while), click the "Clone or Download" button: +If you're a part of an organization, you'll need to choose which account to fork it to. In most circumstances, you'll want to fork it to your personal account. Once your fork is completed (sometimes this takes a little while), click the "Clone or Download" button: ![Download from Github](http://i.imgur.com/N1NYcSz.jpg) From 6cf9402cbc8156dd7c0892822ba949a1a1d8a4ba Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 16 Oct 2018 11:14:52 -0700 Subject: [PATCH 194/505] Fix LAYOUT define generation (#4148) * Fix LAYOUT define generation Prior to this, only the full keyboard path was defined. Eg `KEYBOARD_planck_rev6`. But the docs mention `KEYBOAD_planck`, which never actually gets defined. This addresses this, and creates a define for each level of the keyboard folder, so that stuff like `KEYBOARD_planck` actually exists. * Clean up changes to make it more readable --- build_keyboard.mk | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/build_keyboard.mk b/build_keyboard.mk index a73741bb3eaa..d225fe82160a 100644 --- a/build_keyboard.mk +++ b/build_keyboard.mk @@ -110,8 +110,28 @@ ifneq ("$(wildcard $(KEYBOARD_C_1))","") KEYBOARD_SRC += $(KEYBOARD_C_1) endif -OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE) +# Generate KEYBOARD_name_subname for all levels of the keyboard folder +KEYBOARD_FILESAFE_1 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_1))) +KEYBOARD_FILESAFE_2 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_2))) +KEYBOARD_FILESAFE_3 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_3))) +KEYBOARD_FILESAFE_4 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_4))) +KEYBOARD_FILESAFE_5 := $(subst .,,$(subst /,_,$(KEYBOARD_FOLDER_PATH_5))) +ifneq ("$(wildcard $(KEYBOARD_PATH_5)/)","") + OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_5) +endif +ifneq ("$(wildcard $(KEYBOARD_PATH_4)/)","") + OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_4) +endif +ifneq ("$(wildcard $(KEYBOARD_PATH_3)/)","") + OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_3) +endif +ifneq ("$(wildcard $(KEYBOARD_PATH_2)/)","") + OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_2) +endif +ifneq ("$(wildcard $(KEYBOARD_PATH_1)/)","") + OPT_DEFS += -DKEYBOARD_$(KEYBOARD_FILESAFE_1) +endif # Setup the define for QMK_KEYBOARD_H. This is used inside of keymaps so # that the same keymap may be used on multiple keyboards. From 1dc1e12fec6b8ce06792ac2e2224b6466b4de2a3 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 16 Oct 2018 11:35:43 -0700 Subject: [PATCH 195/505] Only include lufa.h if AVR in quantum/api.h --- quantum/api.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/quantum/api.h b/quantum/api.h index efc0ddca1207..fc016391bcf3 100644 --- a/quantum/api.h +++ b/quantum/api.h @@ -17,7 +17,9 @@ #ifndef _API_H_ #define _API_H_ +#ifdef __AVR__ #include "lufa.h" +#endif enum MESSAGE_TYPE { MT_GET_DATA = 0x10, // Get data from keyboard @@ -28,7 +30,7 @@ enum MESSAGE_TYPE { MT_SEND_DATA_ACK = 0x31, // returned data/action confirmation (ACK) MT_EXE_ACTION = 0x40, // executing actions on keyboard MT_EXE_ACTION_ACK =0x41, // return confirmation/value (ACK) - MT_TYPE_ERROR = 0x80 // type not recofgnised (ACK) + MT_TYPE_ERROR = 0x80 // type not recognised (ACK) }; enum DATA_TYPE { From 8ce9e3255ee324174c7dbcc553ff089c54fc5265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=BDan=20Pevec?= Date: Wed, 17 Oct 2018 00:45:05 +0200 Subject: [PATCH 196/505] Fixes on slovenian keymap --- quantum/keymap_extras/keymap_slovenian.h | 28 ++++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/quantum/keymap_extras/keymap_slovenian.h b/quantum/keymap_extras/keymap_slovenian.h index 8b197e6c5b20..364bd90b8c5a 100644 --- a/quantum/keymap_extras/keymap_slovenian.h +++ b/quantum/keymap_extras/keymap_slovenian.h @@ -73,7 +73,7 @@ // shifted characters #define SI_EXLM LSFT(KC_1) // ! -#define SO_DQOT LSFT(KC_2) // " +#define SI_DQOT LSFT(KC_2) // " #define SI_HASH LSFT(KC_3) // # #define SI_DLR LSFT(KC_4) // $ #define SI_PERC LSFT(KC_5) // % @@ -89,18 +89,18 @@ #define SI_UNDS LSFT(SI_MINS) // _ // Alt Gr-ed characters -#define SI_CIRC ALGR(KC_3) // ^ -#define SI_DEG ALGR(KC_5) // ° -#define SI_GRV ALGR(KC_7) // ` -#define SI_ACCU ALGR(KC_9) // ´ -#define SI_LCBR ALGR(KC_B) // { -#define SI_RCBR ALGR(KC_N) // } -#define SI_LBRC ALGR(KC_F) // [ -#define SI_RBRC ALGR(KC_G) // ] -#define SI_BSLS ALGR(KC_Q) // backslash -#define SI_AT ALGR(KC_V) // @ -#define SI_EURO ALGR(KC_E) // € -#define SI_TILD ALGR(KC_1) // ~ -#define SI_PIPE ALGR(KC_W) // | +#define SI_CIRC ALTG(KC_3) // ^ +#define SI_DEG ALTG(KC_5) // ° +#define SI_GRV ALTG(KC_7) // ` +#define SI_ACCU ALTG(KC_9) // ´ +#define SI_LCBR ALTG(KC_B) // { +#define SI_RCBR ALTG(KC_N) // } +#define SI_LBRC ALTG(KC_F) // [ +#define SI_RBRC ALTG(KC_G) // ] +#define SI_BSLS ALTG(KC_Q) // backslash +#define SI_AT ALTG(KC_V) // @ +#define SI_EURO ALTG(KC_E) // € +#define SI_TILD ALTG(KC_1) // ~ +#define SI_PIPE ALTG(KC_W) // | #endif From 1d03af876c122cf16ed78025eb753e1d838edcac Mon Sep 17 00:00:00 2001 From: QMK Bot Date: Tue, 16 Oct 2018 23:11:58 +0000 Subject: [PATCH 197/505] convert to unix line-endings [skip ci] --- quantum/keymap_extras/keymap_slovenian.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quantum/keymap_extras/keymap_slovenian.h b/quantum/keymap_extras/keymap_slovenian.h index 364bd90b8c5a..53d07837e9a9 100644 --- a/quantum/keymap_extras/keymap_slovenian.h +++ b/quantum/keymap_extras/keymap_slovenian.h @@ -1,4 +1,4 @@ -/* Copyright 2018 Žan Pevec +/* Copyright 2018 Žan Pevec * * 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 From 1f13254460db4ad4cb3c4868b69fbb35cca9c764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=BDan=20Pevec?= Date: Wed, 17 Oct 2018 01:56:39 +0200 Subject: [PATCH 198/505] Keymap: Personal keymap for planck (#4061) * added my keymap * Adde more changes * Moved to pevecyan folder * Added slovenian mapping * Slovenian keymap completed * Suggestions updates * Fixes on slovenian keymap Made some typos in previous iteration --- keyboards/planck/keymaps/pevecyan/config.h | 38 ++++ keyboards/planck/keymaps/pevecyan/keymap.c | 226 ++++++++++++++++++++ keyboards/planck/keymaps/pevecyan/readme.md | 2 + keyboards/planck/keymaps/pevecyan/rules.mk | 1 + 4 files changed, 267 insertions(+) create mode 100644 keyboards/planck/keymaps/pevecyan/config.h create mode 100644 keyboards/planck/keymaps/pevecyan/keymap.c create mode 100644 keyboards/planck/keymaps/pevecyan/readme.md create mode 100644 keyboards/planck/keymaps/pevecyan/rules.mk diff --git a/keyboards/planck/keymaps/pevecyan/config.h b/keyboards/planck/keymaps/pevecyan/config.h new file mode 100644 index 000000000000..e8c13caac59f --- /dev/null +++ b/keyboards/planck/keymaps/pevecyan/config.h @@ -0,0 +1,38 @@ +#pragma once + +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(PLANCK_SOUND) + // #define STARTUP_SONG SONG(NO_SOUND) + + #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ + SONG(COLEMAK_SOUND), \ + SONG(DVORAK_SOUND) \ + } +#endif + +/* + * 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 + +// Most tactile encoders have detents every 4 stages +#define ENCODER_RESOLUTION 4 diff --git a/keyboards/planck/keymaps/pevecyan/keymap.c b/keyboards/planck/keymaps/pevecyan/keymap.c new file mode 100644 index 000000000000..7bc43a373cd1 --- /dev/null +++ b/keyboards/planck/keymaps/pevecyan/keymap.c @@ -0,0 +1,226 @@ +/* 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 . + */ + +#include QMK_KEYBOARD_H + +#include "action_layer.h" +#include "muse.h" +#include "keymap_slovenian.h" + +extern keymap_config_t keymap_config; + +enum planck_layers { + _QWERTY, + _LOWER, + _RAISE, + _ADJUST, + _ALTGR, + _CAPS +}; + +enum planck_keycodes { + QWERTY = SAFE_RANGE, +}; + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) +#define CAPS MO(_CAPS) +#define ALTGR MO(_ALTGR) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Z | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | CAPS | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Y | X | C | V | B | N | M | , | . | / |Enter | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | GUI | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_planck_grid( + KC_TAB, SI_Q, SI_W, SI_E, SI_R, SI_T, SI_Z, SI_U, SI_I, SI_O, SI_P, KC_BSPC, + CAPS, SI_A, SI_S, SI_D, SI_F, SI_G, SI_H, SI_J, SI_K, SI_L, KC_SCLN, KC_ENT, + KC_LSFT, SI_Y, SI_X, SI_C, SI_V, SI_B, SI_N, SI_M, SI_COMM, SI_DOT, SI_MINS, KC_RSFT , + KC_LCTL, KC_LGUI, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, ALTGR, KC_DOWN, KC_UP, KC_F5 +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_planck_grid( + 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_MINS, KC_PPLS , KC_ENT, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, + _______, _______, _______, _______, _______, _______, _______, _______, 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 / |Pg Up |Pg Dn | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_planck_grid( + 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_PGUP, KC_PGDN, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_planck_grid( + _______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL , + _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______, + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +[_ALTGR] = LAYOUT_planck_grid( + _______, ALTG(KC_Q), ALTG(KC_W), ALTG(KC_E), _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, ALTG(KC_F), ALTG(KC_G), _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, ALTG(KC_V), ALTG(KC_B), ALTG(KC_N), _______, ALTG(KC_COMM), ALTG(KC_DOT), _______, _______ , + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +[_CAPS] = LAYOUT_planck_grid( + KC_ESC , KC_BSPC, KC_UP , KC_DEL , _______, _______, _______, _______, _______, _______, _______, KC_DEL , + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + + +}; + +#ifdef AUDIO_ENABLE + float plover_song[][2] = SONG(PLOVER_SOUND); + float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND); +#endif + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} + +bool muse_mode = false; +uint8_t last_muse_note = 0; +uint16_t muse_counter = 0; +uint8_t muse_offset = 70; +uint16_t muse_tempo = 50; + +void encoder_update(bool clockwise) { + if (muse_mode) { + if (IS_LAYER_ON(_RAISE)) { + if (clockwise) { + muse_offset++; + } else { + muse_offset--; + } + } else { + if (clockwise) { + muse_tempo+=1; + } else { + muse_tempo-=1; + } + } + } else { + if (clockwise) { + register_code(KC_PGDN); + unregister_code(KC_PGDN); + } else { + register_code(KC_PGUP); + unregister_code(KC_PGUP); + } + } +} + +void dip_update(uint8_t index, bool active) { + switch (index) { + case 0: + if (active) { + #ifdef AUDIO_ENABLE + PLAY_SONG(plover_song); + #endif + layer_on(_ADJUST); + } else { + #ifdef AUDIO_ENABLE + PLAY_SONG(plover_gb_song); + #endif + layer_off(_ADJUST); + } + break; + case 1: + if (active) { + muse_mode = true; + } else { + muse_mode = false; + #ifdef AUDIO_ENABLE + stop_all_notes(); + #endif + } + } +} + +void matrix_scan_user(void) { + #ifdef AUDIO_ENABLE + if (muse_mode) { + if (muse_counter == 0) { + uint8_t muse_note = muse_offset + SCALE[muse_clock_pulse()]; + if (muse_note != last_muse_note) { + stop_note(compute_freq_for_midi_note(last_muse_note)); + play_note(compute_freq_for_midi_note(muse_note), 0xF); + last_muse_note = muse_note; + } + } + muse_counter = (muse_counter + 1) % muse_tempo; + } + #endif +} + +bool music_mask_user(uint16_t keycode) { + switch (keycode) { + case RAISE: + case LOWER: + return false; + default: + return true; + } +} diff --git a/keyboards/planck/keymaps/pevecyan/readme.md b/keyboards/planck/keymaps/pevecyan/readme.md new file mode 100644 index 000000000000..de9680b49851 --- /dev/null +++ b/keyboards/planck/keymaps/pevecyan/readme.md @@ -0,0 +1,2 @@ +# The Default Planck Layout + diff --git a/keyboards/planck/keymaps/pevecyan/rules.mk b/keyboards/planck/keymaps/pevecyan/rules.mk new file mode 100644 index 000000000000..dcf16bef3994 --- /dev/null +++ b/keyboards/planck/keymaps/pevecyan/rules.mk @@ -0,0 +1 @@ +SRC += muse.c From 9de4ace6f274c5bebfcfd8d31fa793f8d9060cb5 Mon Sep 17 00:00:00 2001 From: jshuf <44121348+jshuf@users.noreply.github.com> Date: Tue, 16 Oct 2018 20:13:53 -0400 Subject: [PATCH 199/505] Keyboard: Add tkl_ansi_plus_five layout for Phantom (#4145) * 60_ansi keymap for DZ60 * 60_ansi keymap for DZ60 Amend author * 60_ansi keymap for DZ60 * Merge new phantom layout from dev branch --- keyboards/phantom/info.json | 474 ++++++++++++++++++++++++++++++++++++ keyboards/phantom/phantom.h | 18 ++ 2 files changed, 492 insertions(+) diff --git a/keyboards/phantom/info.json b/keyboards/phantom/info.json index cf7b161803c7..6a1e4f72f5d8 100644 --- a/keyboards/phantom/info.json +++ b/keyboards/phantom/info.json @@ -459,6 +459,480 @@ } ] }, + "LAYOUT_tkl_ansi_plus_five": { + "key_count": 92, + "layout": [ + { + "label": "Esc", + "x": 0, + "y": 0 + }, + { + "label": "F1", + "x": 2, + "y": 0 + }, + { + "label": "F2", + "x": 3, + "y": 0 + }, + { + "label": "F3", + "x": 4, + "y": 0 + }, + { + "label": "F4", + "x": 5, + "y": 0 + }, + { + "label": "F5", + "x": 6.5, + "y": 0 + }, + { + "label": "F6", + "x": 7.5, + "y": 0 + }, + { + "label": "F7", + "x": 8.5, + "y": 0 + }, + { + "label": "F8", + "x": 9.5, + "y": 0 + }, + { + "label": "F9", + "x": 11, + "y": 0 + }, + { + "label": "F10", + "x": 12, + "y": 0 + }, + { + "label": "F11", + "x": 13, + "y": 0 + }, + { + "label": "F12", + "x": 14, + "y": 0 + }, + { + "label": "PrtSc", + "x": 15.25, + "y": 0 + }, + { + "label": "Scroll Lock", + "x": 16.25, + "y": 0 + }, + { + "label": "Pause", + "x": 17.25, + "y": 0 + }, + { + "label": "~", + "x": 0, + "y": 1.5 + }, + { + "label": "!", + "x": 1, + "y": 1.5 + }, + { + "label": "@", + "x": 2, + "y": 1.5 + }, + { + "label": "#", + "x": 3, + "y": 1.5 + }, + { + "label": "$", + "x": 4, + "y": 1.5 + }, + { + "label": "%", + "x": 5, + "y": 1.5 + }, + { + "label": "^", + "x": 6, + "y": 1.5 + }, + { + "label": "&", + "x": 7, + "y": 1.5 + }, + { + "label": "*", + "x": 8, + "y": 1.5 + }, + { + "label": "(", + "x": 9, + "y": 1.5 + }, + { + "label": ")", + "x": 10, + "y": 1.5 + }, + { + "label": "_", + "x": 11, + "y": 1.5 + }, + { + "label": "+", + "x": 12, + "y": 1.5 + }, + { + "label": "Backspace", + "x": 13, + "y": 1.5, + "w": 2 + }, + { + "label": "Insert", + "x": 15.25, + "y": 1.5 + }, + { + "label": "Home", + "x": 16.25, + "y": 1.5 + }, + { + "label": "PgUp", + "x": 17.25, + "y": 1.5 + }, + { + "label": "Tab", + "x": 0, + "y": 2.5, + "w": 1.5 + }, + { + "label": "Q", + "x": 1.5, + "y": 2.5 + }, + { + "label": "W", + "x": 2.5, + "y": 2.5 + }, + { + "label": "E", + "x": 3.5, + "y": 2.5 + }, + { + "label": "R", + "x": 4.5, + "y": 2.5 + }, + { + "label": "T", + "x": 5.5, + "y": 2.5 + }, + { + "label": "Y", + "x": 6.5, + "y": 2.5 + }, + { + "label": "U", + "x": 7.5, + "y": 2.5 + }, + { + "label": "I", + "x": 8.5, + "y": 2.5 + }, + { + "label": "O", + "x": 9.5, + "y": 2.5 + }, + { + "label": "P", + "x": 10.5, + "y": 2.5 + }, + { + "label": "{", + "x": 11.5, + "y": 2.5 + }, + { + "label": "}", + "x": 12.5, + "y": 2.5 + }, + { + "label": "|", + "x": 13.5, + "y": 2.5, + "w": 1.5 + }, + { + "label": "Delete", + "x": 15.25, + "y": 2.5 + }, + { + "label": "End", + "x": 16.25, + "y": 2.5 + }, + { + "label": "PgDn", + "x": 17.25, + "y": 2.5 + }, + { + "label": "Caps Lock", + "x": 0, + "y": 3.5, + "w": 1.75 + }, + { + "label": "A", + "x": 1.75, + "y": 3.5 + }, + { + "label": "S", + "x": 2.75, + "y": 3.5 + }, + { + "label": "D", + "x": 3.75, + "y": 3.5 + }, + { + "label": "F", + "x": 4.75, + "y": 3.5 + }, + { + "label": "G", + "x": 5.75, + "y": 3.5 + }, + { + "label": "H", + "x": 6.75, + "y": 3.5 + }, + { + "label": "J", + "x": 7.75, + "y": 3.5 + }, + { + "label": "K", + "x": 8.75, + "y": 3.5 + }, + { + "label": "L", + "x": 9.75, + "y": 3.5 + }, + { + "label": ":", + "x": 10.75, + "y": 3.5 + }, + { + "label": "\"", + "x": 11.75, + "y": 3.5 + }, + { + "label": "Enter", + "x": 12.75, + "y": 3.5, + "w": 2.25 + }, + { + "x": 15.25, + "y": 3.5 + }, + { + "x": 16.25, + "y": 3.5 + }, + { + "x": 17.25, + "y": 3.5 + }, + { + "label": "Shift", + "x": 0, + "y": 4.5, + "w": 2.25 + }, + { + "label": "Z", + "x": 2.25, + "y": 4.5 + }, + { + "label": "X", + "x": 3.25, + "y": 4.5 + }, + { + "label": "C", + "x": 4.25, + "y": 4.5 + }, + { + "label": "V", + "x": 5.25, + "y": 4.5 + }, + { + "label": "B", + "x": 6.25, + "y": 4.5 + }, + { + "label": "N", + "x": 7.25, + "y": 4.5 + }, + { + "label": "M", + "x": 8.25, + "y": 4.5 + }, + { + "label": "<", + "x": 9.25, + "y": 4.5 + }, + { + "label": ">", + "x": 10.25, + "y": 4.5 + }, + { + "label": "?", + "x": 11.25, + "y": 4.5 + }, + { + "label": "Shift", + "x": 12.25, + "y": 4.5, + "w": 2.75 + }, + { + "x": 15.25, + "y": 4.5 + }, + { + "label": "\\u2191", + "x": 16.25, + "y": 4.5 + }, + { + "x": 17.25, + "y": 4.5 + }, + { + "label": "Ctrl", + "x": 0, + "y": 5.5, + "w": 1.25 + }, + { + "label": "Win", + "x": 1.25, + "y": 5.5, + "w": 1.25 + }, + { + "label": "Alt", + "x": 2.5, + "y": 5.5, + "w": 1.25 + }, + { + "x": 3.75, + "y": 5.5, + "w": 6.25 + }, + { + "label": "Alt", + "x": 10, + "y": 5.5, + "w": 1.25 + }, + { + "label": "Win", + "x": 11.25, + "y": 5.5, + "w": 1.25 + }, + { + "label": "FN", + "x": 12.5, + "y": 5.5, + "w": 1.25 + }, + { + "label": "Ctrl", + "x": 13.75, + "y": 5.5, + "w": 1.25 + }, + { + "label": "\\u2190", + "x": 15.25, + "y": 5.5 + }, + { + "label": "\\u2193", + "x": 16.25, + "y": 5.5 + }, + { + "label": "\\u2192", + "x": 17.25, + "y": 5.5 + } + ] + }, "LAYOUT_tkl_ansi_wkl": { "key_count": 86, "layout": [ diff --git a/keyboards/phantom/phantom.h b/keyboards/phantom/phantom.h index bed840f1911b..fa77634d3c27 100644 --- a/keyboards/phantom/phantom.h +++ b/keyboards/phantom/phantom.h @@ -54,6 +54,24 @@ K50, K51, K52, KC_NO, KC_NO, K57, KC_NO, K5A, K5B, K5C, K5D, K5E, K5F, K5G \ ) +// Keymap for a standard ANSI layout plus the five extra keys +// above the arrow block. +#define LAYOUT_tkl_ansi_plus_five( \ + K00, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ + K01, K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1D, K1E, K1F, K1G, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3E, K3F, K3G, \ + K40, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4D, K4E, K4F, K4G, \ + K50, K51, K52, K57, K5A, K5B, K5C, K5D, K5E, K5F, K5G \ +) LAYOUT_7bit( \ + K00, KC_NO, K02, K03, K04, K05, KC_NO, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ + K01, K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, KC_NO, K1D, K1E, K1F, K1G, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, K3E, K3F, K3G, \ + K40, KC_NO, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, KC_NO, K4D, K4E, K4F, K4G, \ + K50, K51, K52, KC_NO, KC_NO, K57, KC_NO, K5A, K5B, K5C, K5D, K5E, K5F, K5G \ +) + #define LAYOUT_tkl_ansi_wkl( \ K00, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ K01, K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1D, K1E, K1F, K1G, \ From 397d404ce0b2a0730e493897f72a86f7a40f4207 Mon Sep 17 00:00:00 2001 From: Bramver Date: Wed, 17 Oct 2018 22:42:26 +0200 Subject: [PATCH 200/505] Keymap: Added personal Quefrency layout (#4156) --- keyboards/quefrency/keymaps/bramver/README.md | 61 ++++++++ keyboards/quefrency/keymaps/bramver/config.h | 31 ++++ keyboards/quefrency/keymaps/bramver/keymap.c | 134 ++++++++++++++++++ keyboards/quefrency/keymaps/bramver/rules.mk | 6 + 4 files changed, 232 insertions(+) create mode 100644 keyboards/quefrency/keymaps/bramver/README.md create mode 100644 keyboards/quefrency/keymaps/bramver/config.h create mode 100644 keyboards/quefrency/keymaps/bramver/keymap.c create mode 100644 keyboards/quefrency/keymaps/bramver/rules.mk diff --git a/keyboards/quefrency/keymaps/bramver/README.md b/keyboards/quefrency/keymaps/bramver/README.md new file mode 100644 index 000000000000..76310ed73a85 --- /dev/null +++ b/keyboards/quefrency/keymaps/bramver/README.md @@ -0,0 +1,61 @@ +# Quefrency Layout - initial 60% + +Standard qwerty layout. +Limited emoji support and proper mouse settings. + +Mostly based off of my other XD75 and Nyquist layouts. + +## Keymap + +``` +/* BASE + * + * KC_GESC , 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_DEL , 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_EMOJ , 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_UP , \ + * KC_LCTL , KC_LALT , KC_LGUI , MO_SYMB , SP_LMS , /**/ SP_RMS , KC_BSPC , KC_RGUI , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT + * + */ + +/* LMSE + * + * _______ , _______ , _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + * _______ , KC_WH_L , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_U , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + * _______ , KC_WH_R , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_D , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ ,\ + * _______ , _______ , KC_PGDN , KC_PGUP , KC_END , KC_HOME , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + * _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ + * + */ + +/* RMSE + * + * _______ , _______ , _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + * _______ , _______ , _______ , _______ , _______ , _______ , /**/ KC_WH_U , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_L , _______ , _______ , _______ , \ + * _______ , _______ , _______ , _______ , _______ , _______ , /**/ KC_WH_D , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_R , _______ , _______ ,\ + * _______ , _______ , _______ , _______ , _______ , _______ , /**/ KC_HOME , KC_END , KC_PGUP , KC_PGDN , _______ , _______ , _______ , \ + * _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ + * + */ + +/* SYMB + * + * KC_GESC , KC_F1 , KC_F12 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , /**/ KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_DEL , KC_BSPC , \ + * _______ , _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + * _______ , KC_EXLM , KC_AT , KC_HASH , KC_DLR , KC_PERC , /**/ KC_CIRC , KC_AMPR , KC_ASTR , KC_LPRN , KC_RPRN , _______ , _______ ,\ + * _______ , _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + * _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ + * + */ + +/* EMOJ + * + * _______ , _______ , _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + * _______ , X(CLAP) , X(CUM) , X(BNIS) , X(BUTT) , X(CAR) , /**/ X(FIRE) , X(REDB) , X(MONY) , X(HNDR) , X(SOS) , _______ , _______ , _______ , \ + * _______ , X(CELE) , X(PRAY) , X(NAIL) , X(OK) , X(THNK) , /**/ X(UNAM) , X(HEYE) , X(COOL) , X(EYES) , X(SMIR) , _______ , _______ ,\ + * _______ , X(TRIU) , X(SCRM) , X(VOMI) , X(DTIV) , X(EXPL) , /**/ X(HAIR) , X(DANC) , X(STRN) , X(LEFT) , X(RGHT) , _______ , _______ , \ + * _______ , _______ , _______ , _______ , _______ , /**/ _______ , _______ , _______ , _______ , _______ , _______ , _______ + * + */ + +``` \ No newline at end of file diff --git a/keyboards/quefrency/keymaps/bramver/config.h b/keyboards/quefrency/keymaps/bramver/config.h new file mode 100644 index 000000000000..c908386e282d --- /dev/null +++ b/keyboards/quefrency/keymaps/bramver/config.h @@ -0,0 +1,31 @@ +/* Copyright 2018 darm + * + * 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 + +#define USE_SERIAL +#define MASTER_LEFT + +#define TAPPING_TERM 200 +#define TAPPING_TOGGLE 2 + +#define MOUSEKEY_DELAY 0 +#define MOUSEKEY_INTERVAL 16 +#define MOUSEKEY_MAX_SPEED 7 +#define MOUSEKEY_TIME_TO_MAX 60 +#define MOUSEKEY_WHEEL_MAX_SPEED 8 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 40 +#define MOUSEKEY_WHEEL_DELAY 0 diff --git a/keyboards/quefrency/keymaps/bramver/keymap.c b/keyboards/quefrency/keymaps/bramver/keymap.c new file mode 100644 index 000000000000..527f5de04748 --- /dev/null +++ b/keyboards/quefrency/keymaps/bramver/keymap.c @@ -0,0 +1,134 @@ +#include QMK_KEYBOARD_H + +enum custom_keycodes { + QWERTY = SAFE_RANGE, +}; + +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +#define _BASE 0 +#define _LMSE 1 +#define _RMSE 2 +#define _SYMB 3 +#define _EMOJ 4 + +#define SP_LMS LT(_LMSE, KC_SPC) +#define SP_RMS LT(_RMSE, KC_SPC) +#define MO_SYMB TT(_SYMB) +#define MO_EMOJ TT(_EMOJ) + + +enum emoji_map { + UNAM, // unamused 😒 + HEYE, // smiling face with heart shaped eyes 😍 + OK, // ok hand sign 👌 + SMIR, // smirk 😏 + PRAY, // pray 🙏 + CELE, // celebration 🙌 + COOL, // smile with sunglasses 😎 + EYES, // eyes + THNK, // BIG THONK + NAIL, // Nailcare + SOS, // Vuile sos + REDB, // Red B + HNDR, // 100 + MONY, + FIRE, + CAR, + BUTT, + BNIS, + CUM, + CLAP, + TRIU, // Fart from nose + SCRM, + VOMI, + DTIV, // Detective + EXPL, // Brainsplosion + HAIR, // Haircut + DANC, // Salsa dancer + STRN, // Stronk + LEFT, // Point Left + RGHT, // Point Right +}; + +const uint32_t PROGMEM unicode_map[] = { + [UNAM] = 0x1F612, + [HEYE] = 0x1f60d, + [OK] = 0x1F44C, + [SMIR] = 0x1F60F, + [PRAY] = 0x1F64F, + [CELE] = 0x1F64C, + [COOL] = 0x1F60E, + [EYES] = 0x1F440, + [THNK] = 0x1F914, + [NAIL] = 0x1F485, + [SOS] = 0x1F198, + [REDB] = 0x1F171, + [HNDR] = 0x1F4AF, + [MONY] = 0x1F480, + [FIRE] = 0x1F525, + [CAR] = 0x1F697, + [BUTT] = 0x1F351, + [BNIS] = 0x1F346, + [CUM] = 0x1F4A6, + [CLAP] = 0x1F44F, + [TRIU] = 0x1F624, + [SCRM] = 0x1F631, + [VOMI] = 0x1F92E, + [DTIV] = 0x1F575, + [EXPL] = 0x1F92F, + [HAIR] = 0x2640, + [DANC] = 0x1F483, + [STRN] = 0x1F4AA, + [LEFT] = 0x1F448, + [RGHT] = 0x1F449, +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT( + KC_GESC , 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_DEL , 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_EMOJ , 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_UP , \ + KC_LCTL , KC_LALT , KC_LGUI , MO_SYMB , SP_LMS , SP_RMS , KC_BSPC , KC_RGUI , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT + ), + + [_LMSE] = LAYOUT( + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + _______ , KC_WH_L , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_U , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + _______ , KC_WH_R , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_D , _______ , _______ , _______ , _______ , _______ , _______ , _______ ,\ + _______ , _______ , KC_PGDN , KC_PGUP , KC_END , KC_HOME , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ), + + [_RMSE] = LAYOUT( + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + _______ , _______ , _______ , _______ , _______ , _______ , KC_WH_U , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_L , _______ , _______ , _______ , \ + _______ , _______ , _______ , _______ , _______ , _______ , KC_WH_D , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_R , _______ , _______ ,\ + _______ , _______ , _______ , _______ , _______ , _______ , KC_HOME , KC_END , KC_PGUP , KC_PGDN , _______ , _______ , _______ , \ + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ), + + [_SYMB] = LAYOUT( + KC_GESC , KC_F1 , KC_F12 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , KC_DEL , KC_BSPC , \ + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + _______ , KC_EXLM , KC_AT , KC_HASH , KC_DLR , KC_PERC , KC_CIRC , KC_AMPR , KC_ASTR , KC_LPRN , KC_RPRN , _______ , _______ ,\ + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ), + + [_EMOJ] = LAYOUT( + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , \ + _______ , X(CLAP) , X(CUM) , X(BNIS) , X(BUTT) , X(CAR) , X(FIRE) , X(REDB) , X(MONY) , X(HNDR) , X(SOS) , _______ , _______ , _______ , \ + _______ , X(CELE) , X(PRAY) , X(NAIL) , X(OK) , X(THNK) , X(UNAM) , X(HEYE) , X(COOL) , X(EYES) , X(SMIR) , _______ , _______ ,\ + _______ , X(TRIU) , X(SCRM) , X(VOMI) , X(DTIV) , X(EXPL) , X(HAIR) , X(DANC) , X(STRN) , X(LEFT) , X(RGHT) , _______ , _______ , \ + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ), + +}; + +void matrix_init_user(void) { + set_unicode_input_mode(UC_LNX); +}; diff --git a/keyboards/quefrency/keymaps/bramver/rules.mk b/keyboards/quefrency/keymaps/bramver/rules.mk new file mode 100644 index 000000000000..d211d7b4cfb0 --- /dev/null +++ b/keyboards/quefrency/keymaps/bramver/rules.mk @@ -0,0 +1,6 @@ +# Build options +MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses +EXTRAKEY_ENABLE = yes # Use system and audio control key codes +TAP_DANCE_ENABLE = no # Use multi-tap features +UNICODEMAP_ENABLE = yes # Emojify me pls +NKRO_ENABLE = yes From d08f9cb6e4d5f14409d49ea5df93cb91777357da Mon Sep 17 00:00:00 2001 From: Christoffer Holmberg Date: Wed, 17 Oct 2018 21:54:37 +0300 Subject: [PATCH 201/505] Fix grammar, typos, and the link to HID specification --- docs/how_keyboards_work.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/how_keyboards_work.md b/docs/how_keyboards_work.md index fac2b5a489d8..cc54e566a1f1 100644 --- a/docs/how_keyboards_work.md +++ b/docs/how_keyboards_work.md @@ -27,17 +27,17 @@ This usually happens with a periodic scan of key presses. This speed often is li ## 2. What the Firmware Sends -The [HID specification](http://www.usb.org/developers/hidpage/Hut1_12v2.pdf) tells what a keyboard can actually send through USB to have a chance to be properly recognised. This includes a pre-defined list of scancodes which are simple numbers from `0x00` to `0xE7`. The firmware assigns a scancode to each key of the keyboard. +The [HID specification](https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf) tells what a keyboard can actually send through USB to have a chance to be properly recognised. This includes a pre-defined list of scancodes which are simple numbers from `0x00` to `0xE7`. The firmware assigns a scancode to each key of the keyboard. -The firmware does not send actually letters or characters, but only scancodes. -Thus, by modifying the firmware, you only can modify what scancode is sent over +The firmware does not send actual letters or characters, but only scancodes. +Thus, by modifying the firmware, you can only modify what scancode is sent over USB for a given key. ## 3. What the Operating System Does Once the keycode reaches the operating system, a piece of software has to have it match an actual character thanks to a keyboard layout. For example, if your -layout is set to QWERTY, a sample of the matching table is as follow: +layout is set to QWERTY, a sample of the matching table is as follows: | keycode | character | |---------|-----------| @@ -55,11 +55,11 @@ As the layout is generally fixed (unless you create your own), the firmware can ## List of Characters You Can Send -Putting aside shortcuts, having a limited set of keycodes mapped to a limited layout means that **the list of characters you can assign to a given key only is the ones present in the layout**. +Putting aside shortcuts, having a limited set of keycodes mapped to a limited layout means that **the list of characters you can assign to a given key are only the ones present in the layout**. -For example, this means that if you have a QWERTY US layout, and you want to assign 1 key to produce `€` (euro currency symbol), you are unable to do so, because the QWERTY US layout does not have such mapping. You could fix that by using a QWERTY UK layout, or a QWERTY US International. +For example, this means that if you have a QWERTY US layout, and you want to assign one key to produce `€` (euro currency symbol), you are unable to do so, because the QWERTY US layout does not have such mapping. You could fix that by using a QWERTY UK layout, or a QWERTY US International. -You may wonder why a keyboard layout containing all of Unicode is not devised then? The limited number of keycode available through USB simply disallow such a thing. +You may wonder why a keyboard layout containing all of Unicode is not devised then? The limited number of keycodes available through USB simply disallows such a thing. ## How to (Maybe) Enter Unicode Characters From dad79cafcd9b3401b68fb29aaa311e999c4c4e6e Mon Sep 17 00:00:00 2001 From: Christoffer Holmberg Date: Wed, 17 Oct 2018 23:27:16 +0300 Subject: [PATCH 202/505] Fix more broken links to the HID spec --- docs/keycodes_basic.md | 2 +- docs/reference_glossary.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/keycodes_basic.md b/docs/keycodes_basic.md index 8445b05ef34e..82e94aa5e9c0 100644 --- a/docs/keycodes_basic.md +++ b/docs/keycodes_basic.md @@ -1,6 +1,6 @@ # Basic Keycodes -The basic set of keycodes are based on the [HID Keyboard/Keypad Usage Page (0x07)](http://www.usb.org/developers/hidpage/Hut1_12v2.pdf) with the exception of `KC_NO`, `KC_TRNS` and keycodes in the `0xA5-DF` range. See below for more details. +The basic set of keycodes are based on the [HID Keyboard/Keypad Usage Page (0x07)](https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf) with the exception of `KC_NO`, `KC_TRNS` and keycodes in the `0xA5-DF` range. See below for more details. ## Letters and Numbers diff --git a/docs/reference_glossary.md b/docs/reference_glossary.md index 29d07f26d343..422abb2ece6f 100644 --- a/docs/reference_glossary.md +++ b/docs/reference_glossary.md @@ -128,7 +128,7 @@ The standard Deutsche (German) keyboard layout. Named for the first 6 letters on The term for pressing a key while a key is already held down. Variants include 2KRO, 6KRO, and NKRO. ## Scancode -A 1 byte number that is sent as part of a HID report over USB that represents a single key. These numbers are documented in the [HID Usage Tables](http://www.usb.org/developers/hidpage/Hut1_12v2.pdf) published by the [USB-IF](http://www.usb.org/). +A 1 byte number that is sent as part of a HID report over USB that represents a single key. These numbers are documented in the [HID Usage Tables](https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf) published by the [USB-IF](http://www.usb.org/). ## Space Cadet Shift A special set of shift keys which allow you to type various types of braces by tapping the left or right shift one or more times. From 4a7baaaf50bc9cce3886ff7e1b6455e028d92ab9 Mon Sep 17 00:00:00 2001 From: TheOneTrueTrench <38593283+TheOneTrueTrench@users.noreply.github.com> Date: Thu, 18 Oct 2018 00:38:24 -0400 Subject: [PATCH 203/505] Keymap: Adding new functionality to personal keymap, smart macros (#4159) * Added base keymap * Added initial layers and mirrored most of Pok3r behavior. * Some stuff for Space Captain * Added new Marianas keymap for DZ60 * Included suggestions to remove unnecessary line regarding MODS_CTRL_MASK, and added names for layers. Added enum to define names for layers, and removed unused #DEFINE * Added DVORAK and COLEMAK * Caps + enter + space for flashing mode. * Added RGB status * added flash script * Changed lighting modes to make layers more apparent * fixed issue with not being able to exit gaming mode. * Added abbreviation constructor * Changed lighting modes to make layers more apparent * fixed issue with not being able to exit gaming mode. * Added abbreviation constructor * Fixed bug with SQL Table Macro generator. * restructured file. No Logical changes. * literals only for smart macros * removed extraneous pointer declaration. * Smart Macros * Added Makefile and header file * extended smart macros to be able to cover the whole alphas. * removed non-relavent keymaps. * didn't mean to include this guy. --- keyboards/dz60/keymaps/marianas/keymap.c | 592 ++++++++++++++++++++--- keyboards/dz60/keymaps/marianas/keymap.h | 103 ++++ keyboards/dz60/keymaps/marianas/rules.mk | 17 + 3 files changed, 657 insertions(+), 55 deletions(-) create mode 100644 keyboards/dz60/keymaps/marianas/keymap.h create mode 100644 keyboards/dz60/keymaps/marianas/rules.mk diff --git a/keyboards/dz60/keymaps/marianas/keymap.c b/keyboards/dz60/keymaps/marianas/keymap.c index dfc83fb50894..e40bc6897b78 100644 --- a/keyboards/dz60/keymaps/marianas/keymap.c +++ b/keyboards/dz60/keymaps/marianas/keymap.c @@ -1,71 +1,553 @@ #include QMK_KEYBOARD_H +#include "keymap.h" enum marianas_layers { - BASE, + QWERTY, +/* + COLEMAK, + DVORAK, +*/ NAV_CLUSTER, - RGB, - MOUSE, GAMING, - FN_LAYER, - LAYER_SEL + SQLMACROS, + SQLNAMES, + FN_LAYER +}; + +enum sql_macros { + S_LFTJN = SAFE_RANGE, // L + S_INRJN, // I + S_SLCT, // S + S_FROM, // F + S_DSNCT, // D + S_ORDER, // O + S_WHERE, // W + S_ALTER, // Esc + S_ASTRK, // * + + TD_A, + TD_B, + TD_C, // Corp, Corporation, Company + TD_D, // Distribution, Dist, Distributor + TD_E, + TD_F, + TD_G, // GlobalLookup + TD_H, + TD_I, // Instance, Item + TD_J, + TD_K, + TD_L, + TD_M, + TD_N, // NadRate + TD_O, + TD_P, // Product, Person, + TD_Q, // Darden + TD_R, + TD_S, // Supplier, Step + TD_T, // Task, Type + TD_U, + TD_V, + TD_W, // Workflow, + TD_X, + TD_Y, + TD_Z, + TD_BSPC, + TD_ENT, + TD_ESC +}; + +uint16_t *macroTaps = 0; + +char *tableNameList = 0; + +uint8_t *charCount = 0; +uint8_t countPointer = 0; + +bool shifted = false; + +bool sendAbbr = false; + + +void initStringData(void) +{ + if (macroTaps == 0) + { + macroTaps = malloc(macroTapsLen*sizeof(uint16_t)); + for(int i = 0; i < macroTapsLen; i++) + { + macroTaps[i] = 0; + } + } + if (tableNameList == 0) + { + tableNameList = malloc(tableNameListLen*sizeof(char)); + for(int i = 0; i < tableNameListLen; i++) + { + tableNameList[i] = 0; + } + } + if (charCount == 0) + { + charCount = malloc(charCountLen*sizeof(uint8_t)); + for (int i = 0; i < charCountLen; i++) + { + charCount[i] = 0; + } + } +} + + +uint32_t layer_state_set_user(uint32_t state) +{ + switch (biton32(state)) + { + case QWERTY: + rgblight_mode(9); + break; + case NAV_CLUSTER: + rgblight_mode(29); + break; + case GAMING: + rgblight_mode(26); + break; + case SQLMACROS: + rgblight_mode(1); + rgblight_setrgb(0x00, 0xFF, 0x80); + break; + case SQLNAMES: + rgblight_mode(1); + rgblight_setrgb(0x80, 0xFF, 0x00); + break; + case FN_LAYER: + rgblight_mode(1); + rgblight_setrgb(0x00, 0x80, 0xFF); + break; + } + return state; +} + +bool containsCode(uint16_t kc) +{ + for (int i = 0; i < macroTapsLen && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc) return true; + } + return false; +} + +bool lastCodeIs(uint16_t kc) +{ + for (int i = 0; i < macroTapsLen-1 && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc && macroTaps[i+1] == 0) return true; + } + return false; +} + +bool last2CodeAre(uint16_t kc) +{ + for (int i = 0; i < macroTapsLen-2 && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc && macroTaps[i+1] == kc && macroTaps[i+2] == 0) return true; + } + return false; +} + +bool last2CodesAre(uint16_t kc, uint16_t kc2) +{ + for (int i = 0; i < macroTapsLen-2 && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc && macroTaps[i+1] == kc2 && macroTaps[i+2] == 0) return true; + } + return false; +} + +void addKeyCode(uint16_t kc) +{ + int i = 0; + while (i < macroTapsLen-2 && macroTaps[i] > 0) i++; + if (macroTaps[i] == 0) + { + macroTaps[i] = kc; + macroTaps[i+1] = 0; + } +} + +void eraseKeyCodes(void) +{ + int i = 0; + while (i < macroTapsLen && macroTaps[i] > 0) macroTaps[i++] = 0; +} + +void eraseCharCounts(void) +{ + int i = 0; + while (i < charCountLen) + { + charCount[i] = 0; + } +} + +void printTableAbbreviation(void) +{ + initStringData(); + if (tableNameList[0] == 0) + { + return; + } + send_char(0x20); + int i = 0; + for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + { + if (tableNameList[i] >= 65 && tableNameList[i] <= 90) + { + send_char(tableNameList[i]+32); + } + else + { + send_char(tableNameList[i]); + } + } + send_char(0x20); +} + +void eraseTableAbbreviation(void) +{ + initStringData(); + for (int i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + { + tableNameList[i] = '\0'; + } +} + +void printString(char* str) +{ + + if (str[0] != '\0') + { + int i = 0; + while (true) + { + if (str[i] == 0) + { + break; + } + send_char(str[i++]); + charCount[countPointer]++; + } + } +} + +void printStringAndQueueChar(char* str) +{ + initStringData(); + if (charCount[countPointer] != 0) + { + countPointer++; + } + sendAbbr = true; + if (str[0] != '\0') + { + printString(str); + + for (int i = 0; i < tableNameListLen-1; i++) + { + if (tableNameList[i] == '\0') + { + tableNameList[i] = str[0]; + tableNameList[i+1] = '\0'; + break; + } + else if (i == tableNameListLen-2) + { + printTableAbbreviation(); + break; + } + } + //for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + //{ + // send_char(tableNameList[i]); + //} + //send_string_P("Darden"); + //send_string_P(&myarray); + //send_string_P(str); + } +} + +void ReplaceString(char *orig, char *repl) +{ + int i = 0; + while((orig[i] != 0x0 && repl[i] != 0x0) && orig[i] == repl[i]) + i++; + + if(orig[i] != 0x0) + { + int o = i; + while (orig[o++] != 0x0) { + charCount[countPointer]--; + register_code(KC_BSPC); + unregister_code(KC_BSPC); + } + } + printString(repl+i); +} + +void deletePrev(void) +{ + for (int i = 0; i < charCount[countPointer]; i++) + { + register_code(KC_BSPC); + unregister_code(KC_BSPC); + } + charCount[countPointer] = 0; + countPointer--; + int i = 1; + for (;i < tableNameListLen-1; i++) + { + if (tableNameList[i] == 0x0) + { + break; + } + } + tableNameList[i-1] = 0x0; +} + +void processSmartMacroTap(uint16_t kc) +{ + initStringData(); + switch(kc) + { + case TD_C: + if (containsCode(TD_D)) + { + printString("ribution"); + printStringAndQueueChar("Center"); + } + else if (last2CodeAre(TD_C)) + { + ReplaceString("Corporation", "Contact"); + } + else if(lastCodeIs(TD_C)) + { + printString("oration"); + } + else + { + printStringAndQueueChar("Corp"); + } + break; + case TD_D: + if (last2CodeAre(TD_D)) + { + ReplaceString("Distribution", "Distributor"); + } + else if(lastCodeIs(TD_D)) + { + printString("ribution"); + } + else + { + printStringAndQueueChar("Dist"); + } + break; + case TD_G: + printStringAndQueueChar("Global"); + printStringAndQueueChar("Lookup"); + break; + case TD_I: + if (containsCode(TD_W)) + printStringAndQueueChar("Instance"); + else + printStringAndQueueChar("Item"); + break; + case TD_N: + printStringAndQueueChar("NadRate"); + break; + case TD_P: + if (last2CodesAre(TD_D, TD_C)) + { + ReplaceString("DistributionCenter", "DistCenter"); + printStringAndQueueChar("Pricing"); + } + else if (last2CodeAre(TD_P)) + { + } + else if(lastCodeIs(TD_P)) + { + ReplaceString("Product", "Person"); + } + else + { + printStringAndQueueChar("Product"); + } + break; + case TD_Q: + printStringAndQueueChar("Darden"); + break; + case TD_S: + if (containsCode(TD_W)) + if (containsCode(TD_S) || containsCode(TD_D)) + printStringAndQueueChar("Step"); + else + printStringAndQueueChar("Session"); + else + printStringAndQueueChar("Supplier"); + break; + case TD_T: + if (containsCode(TD_W)) + printStringAndQueueChar("Task"); + else + printStringAndQueueChar("Type"); + break; + case TD_W: + printStringAndQueueChar("Workflow"); + break; + } + addKeyCode(kc); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) +{ + if (record->event.pressed) + { + switch (keycode) + { + case KC_LSPO: + case KC_RSPC: + shifted = true; + return true; + + case S_LFTJN: SEND_STRING("LEFT JOIN"); return false; + case S_INRJN: SEND_STRING("INNER JOIN "); return false; + case S_SLCT: SEND_STRING("SELECT "); return false; + case S_FROM: SEND_STRING("FROM "); return false; + case S_DSNCT: SEND_STRING("DISTINCT "); return false; + case S_ORDER: SEND_STRING("ORDER "); return false; + case S_WHERE: SEND_STRING("WHERE "); return false; + case S_ALTER: SEND_STRING("ALTER SESSION SET CURRENT_SCHEMA = "); return false; + case S_ASTRK: SEND_STRING("* "); return false; + + case KC_BSLS: + initStringData(); + layer_on(SQLNAMES); + return false; + + case TD_BSPC: + if (!shifted){ + deletePrev(); + } + else { + register_code(KC_BSPC); + unregister_code(KC_BSPC); + } + return false; + + case TD_A: + case TD_B: + case TD_C: + case TD_D: + case TD_E: + case TD_F: + case TD_G: + case TD_H: + case TD_I: + case TD_J: + case TD_K: + case TD_L: + case TD_M: + case TD_N: + case TD_O: + case TD_P: + case TD_Q: + case TD_R: + case TD_S: + case TD_T: + case TD_U: + case TD_V: + case TD_W: + case TD_X: + case TD_Y: + case TD_Z: + processSmartMacroTap(keycode); + return false; + + case TD_ENT: + printTableAbbreviation(); + case TD_ESC: + eraseKeyCodes(); + eraseTableAbbreviation(); + layer_off(SQLNAMES); + return true; + } + } + else + { + switch (keycode) + { + + case KC_BSLS: + if (macroTaps[0] == 0) + { + SEND_STRING("\\"); + layer_off(SQLNAMES); + } + return true; + case KC_LSPO: + case KC_RSPC: + shifted = false; + return true; + } + } + return true; }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [BASE]= - LAYOUT( - 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_NO, 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(FN_LAYER), 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_LSPO, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_NO, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_LGUI, KC_NO, KC_APP, KC_RCTL), + [QWERTY]= + LAYOUT_60_ansi( + ESCAP, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, MNUS, EQUL, BACKSPC, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, LBRC, RBRC, BSLASH, + MO_FNLR, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, COLN, QUOT, ENTER_OR_SQL, + LEFTSHFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, CMMA, PRRD, SLSH, RIGHT_SHIFT__PAREN, + CTLL, WINL, ALTL, SPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACE, ALTR, WINR, APPR, CTLR), [NAV_CLUSTER]= - LAYOUT( - KC_TRNS, KC_PSCREEN, KC_SCROLLLOCK, KC_PAUSE, KC_INSERT, KC_HOME, KC_PGUP, KC_NUMLOCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DELETE, KC_END, KC_PGDOWN, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_UP, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_KP_0, KC_KP_0, KC_KP_0, KC_KP_DOT, KC_KP_ENTER, KC_TRNS, KC_TRNS, KC_TRNS), - - [RGB]= - LAYOUT( - KC_TRNS, RGB_TOG, RGB_MOD, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, RGB_SPD, RGB_SPI, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_HUI, RGB_HUD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, RGB_SAI, RGB_SAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), - - [MOUSE]= - LAYOUT( - KC_TRNS, KC_ACL0, KC_ACL1, KC_ACL2, KC_TRNS, KC_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_BTN3, KC_BTN1, KC_MS_U, KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_R, KC_TRNS, KC_TRNS, KC_BTN4, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN5, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + LAYOUT_60_ansi( + _____, PSCR, SCRL, PAUS, NSRT, HOME, PGUP, NMLK, KSSH, STAR, KMIN, ____, ____, ______, + ______, ____, ____, ____, DELT, END_, PGDN, KP_7, KP_8, KP_9, PLUS, ____, ____, _____, + _______, ____, ____, ____, ____, UPUP, UPUP, KP_4, KP_5, KP_6, PLUS, ____, ___________, + ________, ____, ____, ____, LEFT, D_WN, RGHT, KP_1, KP_2, KP_3, KNTR, _________________, + ____, ____, ____, /*-----------------*/KC_KP_0/*-----------------*/, KDOT, KNTR, ____, ____), [GAMING]= - LAYOUT( - 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_NO, 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_TRNS, 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_LSHIFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSHIFT, KC_NO, - KC_LCTL, KC_NO, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, KC_NO, KC_NO, TO(BASE)), + LAYOUT_60_ansi( + _____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ______, + ______, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, _____, + KCNO, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ___________, + ________, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, _________________, + ____, KCNO, ____, /*------------------*/_____/*------------------*/, ____, KCNO, ____, QWRTY), - [FN_LAYER]= - LAYOUT( - KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, - KC_CAPSLOCK, KC_MPRV, KC_MPLY, KC_MNXT, LWIN(KC_R), KC_TRNS, KC_CALC, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_SLCK, KC_BRK, KC_TRNS, - KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_INS, KC_DEL, MO(LAYER_SEL), - 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_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HYPR, KC_TRNS, KC_MEH, KC_TRNS), - - [LAYER_SEL]= - LAYOUT( - TO(BASE), TO(NAV_CLUSTER), TO(RGB), TO(MOUSE), TO(GAMING), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) + [SQLMACROS]= + LAYOUT_60_ansi( + S_ALTER, ____, ____, ____, ____, ____, ____, ____, S_ASTRK, ____, ____, ____, ____, ___________, + ______, ____, S_WHERE, ____, ____, ____, ____, ____, S_INRJN, S_ORDER, ____, ____, ____, ______, + _______, KC_LBRC, S_SLCT, KC_PAST,S_FROM, ____, ____, ____, ____, S_LFTJN, ____, RBRC, ___________, + ________, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, _________________, + ____, ____, ____, /*------------------*/_____/*------------------*/, ____, ____, ____, ____), + [SQLNAMES]= + LAYOUT_60_ansi( + TD_ESC, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, TD_BSPC, + ________, TD_Q, TD_W, TD_E, TD_R, TD_T, TD_Y, TD_U, TD_I, TD_O, TD_P, ____, ____, _____, + ___________, TD_A, TD_S, TD_D, TD_F, TD_G, TD_H, TD_J, TD_K, TD_L, ____, ____, TD_ENT, + ___________, TD_Z, TD_X, TD_C, TD_V, TD_B, TD_N, TD_M, ____, ____, ____, _________________, + ____, ____, ____, /*----------------------*/TD_ENT/*-----------------------*/, ____, ____, ____, RESET), + + [FN_LAYER]= + LAYOUT_60_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_CAPSLOCK, KC_MPRV, KC_MPLY, KC_MNXT, LWIN(KC_R), ____, KC_CALC, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_SLCK, KC_BRK, ____, + ____, KC_VOLD, KC_MUTE, KC_VOLU, ____, ____, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_INS, KC_DEL, ____, + ____, ____, ____, ____, ____, ____, KC_END, ____, QWRTY, NAVS, GAME, ____, + ____, ____, ____, _________________, ____, KC_HYPR, KC_MEH, ____) }; diff --git a/keyboards/dz60/keymaps/marianas/keymap.h b/keyboards/dz60/keymaps/marianas/keymap.h new file mode 100644 index 000000000000..01de5c6e2cec --- /dev/null +++ b/keyboards/dz60/keymaps/marianas/keymap.h @@ -0,0 +1,103 @@ +//Control +#define MO_FNLR MO(FN_LAYER) +#define BACKSPC KC_BSPC +#define ENTER_OR_SQL LT(SQLMACROS,KC_ENT) +#define ESCAP KC_ESC +#define PSCR KC_PSCREEN +#define SCRL KC_SCROLLLOCK +#define PAUS KC_PAUSE +#define NSRT KC_INSERT +#define HOME KC_HOME +#define PGUP KC_PGUP +#define PGDN KC_PGDN +#define END_ KC_END +#define DELT KC_DELETE +#define UPUP KC_UP +#define D_WN KC_DOWN +#define LEFT KC_LEFT +#define RGHT KC_RIGHT + +//KEYPAD +#define KP_1 KC_KP_1 +#define KP_2 KC_KP_2 +#define KP_3 KC_KP_3 +#define KP_4 KC_KP_4 +#define KP_5 KC_KP_5 +#define KP_6 KC_KP_6 +#define KP_7 KC_KP_7 +#define KP_8 KC_KP_8 +#define KP_9 KC_KP_9 +#define KP_0 KC_KP_0 +#define NMLK KC_NUMLOCK +#define STAR KC_KP_ASTERISK +#define KSSH KC_KP_SLASH +#define KMIN KC_KP_MINUS +#define PLUS KC_KP_PLUS +#define KNTR KC_KP_ENTER +#define KDOT KC_KP_DOT + +//Modifiers +#define CTLL KC_LCTL +#define LEFTSHFT KC_LSPO +#define WINL KC_LGUI +#define ALTL KC_LALT +#define CTLR KC_RCTL +#define RIGHT_SHIFT__PAREN KC_RSPC +#define WINR KC_RGUI +#define ALTR KC_RALT +#define APPR KC_APP + + +//Punctuation +#define CMMA KC_COMM +#define PRRD KC_DOT +#define SLSH KC_SLSH +#define QUOT KC_QUOT +#define COLN KC_SCLN +#define LBRC KC_LBRC +#define RBRC KC_RBRC +#define EQUL KC_EQL +#define MNUS KC_MINS +#define BSLASH KC_BSLS + +//Layers +#define QWRTY TO(QWERTY) +#define NAVS TO(NAV_CLUSTER) +#define GAME TO(GAMING) + +//Space +#define ____ KC_TRNS +#define _____ KC_TRNS +#define ______ KC_TRNS +#define _______ KC_TRNS +#define ________ KC_TRNS +#define ___________ KC_TRNS +#define _________________ KC_TRNS +#define SPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACE KC_SPC +#define KCNO KC_NO + + + + + +#define macroTapsLen 32 +#define tableNameListLen 32 +#define charCountLen 32 + +void initStringData(void); +uint32_t layer_state_set_user(uint32_t state); +bool containsCode(uint16_t kc); +bool lastCodeIs(uint16_t kc); +bool last2CodeAre(uint16_t kc); +bool last2CodesAre(uint16_t kc, uint16_t kc2); +void addKeyCode(uint16_t kc); +void eraseKeyCodes(void); +void eraseCharCounts(void); +void printTableAbbreviation(void); +void eraseTableAbbreviation(void); +void printString(char* str); +void printStringAndQueueChar(char* str); +void ReplaceString(char *orig, char *repl); +void deletePrev(void); +void processSmartMacroTap(uint16_t kc); +bool process_record_user(uint16_t keycode, keyrecord_t *record); diff --git a/keyboards/dz60/keymaps/marianas/rules.mk b/keyboards/dz60/keymaps/marianas/rules.mk new file mode 100644 index 000000000000..ab188f3b2c42 --- /dev/null +++ b/keyboards/dz60/keymaps/marianas/rules.mk @@ -0,0 +1,17 @@ +# Build Options +# comment out to disable the options. +# + + +BOOTMAGIC_ENABLE = yes # 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 # Breathing sleep LED during USB suspend +NKRO_ENABLE = no # USB 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 +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = yes +TAP_DANCE_ENABLE = no +AUTO_SHIFT_ENABLE = no From f45bc9b362363f6f3f848026eefad7d7a1842c2c Mon Sep 17 00:00:00 2001 From: mwpeterson Date: Thu, 18 Oct 2018 16:00:30 -0400 Subject: [PATCH 204/505] Keymap: Add Planck keymap (#4154) * remove clmk and dvrk and backlight; switch esc and enter to be modtap; add meh key * change songs * space cadet; move enter; move '"; move pgup pgdn * remove extra songs * update from noahfredrick keymap * make it easier to type ../../thing/*/* * move pipe * requested changes --- keyboards/planck/keymaps/mwpeterson/config.h | 40 +++ keyboards/planck/keymaps/mwpeterson/keymap.c | 295 +++++++++++++++++++ keyboards/planck/keymaps/mwpeterson/rules.mk | 6 + 3 files changed, 341 insertions(+) create mode 100644 keyboards/planck/keymaps/mwpeterson/config.h create mode 100644 keyboards/planck/keymaps/mwpeterson/keymap.c create mode 100644 keyboards/planck/keymaps/mwpeterson/rules.mk diff --git a/keyboards/planck/keymaps/mwpeterson/config.h b/keyboards/planck/keymaps/mwpeterson/config.h new file mode 100644 index 000000000000..d66557b29ddd --- /dev/null +++ b/keyboards/planck/keymaps/mwpeterson/config.h @@ -0,0 +1,40 @@ +#pragma once + +#define PERMISSIVE_HOLD +#define IGNORE_MOD_TAP_INTERRUPT + +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(ONE_UP_SOUND) + // #define STARTUP_SONG SONG(PLANCK_SOUND) + // #define STARTUP_SONG SONG(NO_SOUND) + #define GOODBYE_SONG SONG(COIN_SOUND) + + #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND) } +#endif + +/* + * 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 + +// Most tactile encoders have detents every 4 stages +#define ENCODER_RESOLUTION 4 diff --git a/keyboards/planck/keymaps/mwpeterson/keymap.c b/keyboards/planck/keymaps/mwpeterson/keymap.c new file mode 100644 index 000000000000..bfb015c7a8bc --- /dev/null +++ b/keyboards/planck/keymaps/mwpeterson/keymap.c @@ -0,0 +1,295 @@ +// from event.pressed) { +#ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(plover_song); +#endif + layer_off(RAISE_LAYER); + layer_off(LOWER_LAYER); + layer_off(ADJUST_LAYER); + layer_on(STENO_LAYER); + if (!eeconfig_is_enabled()) { + eeconfig_init(); + } + keymap_config.raw = eeconfig_read_keymap(); + keymap_config.nkro = 1; + eeconfig_update_keymap(keymap_config.raw); + plover_resume(); + } + return false; + case PV_EXIT: + if (record->event.pressed) { +#ifdef AUDIO_ENABLE + PLAY_SONG(plover_gb_song); +#endif + plover_suspend(); + layer_off(STENO_LAYER); + } + return false; + case PV_LOOK: + if (record->event.pressed) { + plover_lookup(); + } + return false; + case SEND_VERSION: + if (record->event.pressed) { + SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP "@" QMK_VERSION " (" QMK_BUILDDATE ")"); + } + return false; + case SEND_MAKE: + if (record->event.pressed) { + SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP ":dfu\n"); + } + return false; + } + return true; +} diff --git a/keyboards/planck/keymaps/mwpeterson/rules.mk b/keyboards/planck/keymaps/mwpeterson/rules.mk new file mode 100644 index 000000000000..de8aa389c4a0 --- /dev/null +++ b/keyboards/planck/keymaps/mwpeterson/rules.mk @@ -0,0 +1,6 @@ +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Disable shift combination, which conflicts with shift-parens +MOUSEKEY_ENABLE = yes # Mouse keys (disabled to save space) +NKRO_ENABLE = no # N-key rollover required for use as a steno board +AUDIO_ENABLE = yes # Audio output on port C6 From 14bdd5ed2a808075130bac26fc72dcb9b158ae2c Mon Sep 17 00:00:00 2001 From: sm0g <38926679+sm0ggles@users.noreply.github.com> Date: Thu, 18 Oct 2018 16:51:02 -0400 Subject: [PATCH 205/505] Keymap: added my tada68's from Gitlab. (#4146) * added my tada68 from Gitlab. * Removed unneeded code and the sm0gunix layout. --- keyboards/tada68/keymaps/sm0g/config.h | 3 + keyboards/tada68/keymaps/sm0g/keymap.c | 100 ++++++++++++++++++++++++ keyboards/tada68/keymaps/sm0g/readme.md | 15 ++++ keyboards/tada68/keymaps/sm0g/rules.mk | 18 +++++ 4 files changed, 136 insertions(+) create mode 100644 keyboards/tada68/keymaps/sm0g/config.h create mode 100644 keyboards/tada68/keymaps/sm0g/keymap.c create mode 100644 keyboards/tada68/keymaps/sm0g/readme.md create mode 100644 keyboards/tada68/keymaps/sm0g/rules.mk diff --git a/keyboards/tada68/keymaps/sm0g/config.h b/keyboards/tada68/keymaps/sm0g/config.h new file mode 100644 index 000000000000..3a2370b62cd5 --- /dev/null +++ b/keyboards/tada68/keymaps/sm0g/config.h @@ -0,0 +1,3 @@ +#pragma once + +#define BACKLIGHT_BREATHING \ No newline at end of file diff --git a/keyboards/tada68/keymaps/sm0g/keymap.c b/keyboards/tada68/keymaps/sm0g/keymap.c new file mode 100644 index 000000000000..25312cd98f23 --- /dev/null +++ b/keyboards/tada68/keymaps/sm0g/keymap.c @@ -0,0 +1,100 @@ +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _GM 2 +#define _GF 3 + + +// Tap dance declarations (These must go above the keymaps) +enum { + TD_F1 = 0, + TD_F2, + TD_F3, + TD_F4, + TD_F5, + TD_F6, + TD_F7, + TD_F8, + TD_F9, + TD_F10, + TD_F11, + TD_F12, +}; + +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| -| =| \ |~ ` | + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Bksp |Del | + * |----------------------------------------------------------------| + * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return |PgUp| + * |----------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| + * |----------------------------------------------------------------| + * |Caps|Win |Alt | Space |Alt|Ctrl| FN|Lef|Dow|Rig | + * `----------------------------------------------------------------' + */ +[_BL] = LAYOUT_ansi( + KC_ESC, TD(TD_F1), TD(TD_F2), TD(TD_F3), TD(TD_F4), TD(TD_F5), TD(TD_F6), TD(TD_F7), TD(TD_F8), TD(TD_F9), TD(TD_F10), TD(TD_F11), TD(TD_F12), 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_DEL, \ + 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, KC_ENT,KC_PGUP, \ + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSPC,KC_UP,KC_PGDN, \ + KC_CAPS, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RCTL,MO(_FL), KC_LEFT,KC_DOWN,KC_RGHT), + + /* Keymap _FL: Function Layer + * ,----------------------------------------------------------------. + * | | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| |Ins | + * |----------------------------------------------------------------| + * | | |Up | | | | | | | | | | | |Hme | + * |----------------------------------------------------------------| + * | Caps |<- |Dn | ->| | | | | | | | | |End | + * |----------------------------------------------------------------| + * | | | |Bl-|BL |BL+| |VU-|VU+|MUT| | McL|MsU|McR | + * |----------------------------------------------------------------| + * | | | | | | | |Prev|P/P|Next| + * `----------------------------------------------------------------' + */ +[_FL] = LAYOUT_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, TG(_GM), KC_INS , \ + _______,_______, KC_UP,_______,_______, _______,_______,_______,_______,_______,_______,_______,_______, _______,KC_HOME, \ + KC_CAPS,KC_LEFT,KC_DOWN,KC_RIGHT,_______,_______,_______,_______,_______,_______,_______,_______, _______,KC_END, \ + _______,_______,_______,BL_DEC, BL_TOGG,BL_INC, BL_BRTG,KC_VOLD,KC_VOLU,KC_MUTE,_______,_______, _______, _______, \ + _______,_______,_______, _______, _______,_______,_______,KC_MPRV,KC_MPLY, KC_MNXT), + +[_GM] = LAYOUT_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_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_DEL, \ + 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_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_CAPS, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RCTL,MO(_GF), KC_LEFT,KC_DOWN,KC_RGHT), + +[_GF] = LAYOUT_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, TG(_GM), KC_INS , \ + _______,_______, KC_UP,_______,_______, _______,_______,_______,_______,_______,_______,_______,_______, _______,KC_HOME, \ + KC_CAPS,KC_LEFT,KC_DOWN,KC_RIGHT,_______,_______,_______,_______,_______,_______,_______,_______, _______,KC_END, \ + _______,_______,_______,BL_DEC, BL_TOGG,BL_INC, BL_BRTG,KC_VOLD,KC_VOLU,KC_MUTE,_______,_______, _______, _______, \ + _______,_______,_______, _______, _______,_______,_______,KC_MPRV,KC_MPLY, KC_MNXT), + +}; + +// Tapdance definitions. Tap Dance F Keys. +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_F1] = ACTION_TAP_DANCE_DOUBLE(KC_1, KC_F1), + [TD_F2] = ACTION_TAP_DANCE_DOUBLE(KC_2, KC_F2), + [TD_F3] = ACTION_TAP_DANCE_DOUBLE(KC_3, KC_F3), + [TD_F4] = ACTION_TAP_DANCE_DOUBLE(KC_4, KC_F4), + [TD_F5] = ACTION_TAP_DANCE_DOUBLE(KC_5, KC_F5), + [TD_F6] = ACTION_TAP_DANCE_DOUBLE(KC_6, KC_F6), + [TD_F7] = ACTION_TAP_DANCE_DOUBLE(KC_7, KC_F7), + [TD_F8] = ACTION_TAP_DANCE_DOUBLE(KC_8, KC_F8), + [TD_F9] = ACTION_TAP_DANCE_DOUBLE(KC_9, KC_F9), + [TD_F10] = ACTION_TAP_DANCE_DOUBLE(KC_0, KC_F10), + [TD_F11] = ACTION_TAP_DANCE_DOUBLE(KC_MINS, KC_F11), + [TD_F12] = ACTION_TAP_DANCE_DOUBLE(KC_EQL, KC_F12), +}; diff --git a/keyboards/tada68/keymaps/sm0g/readme.md b/keyboards/tada68/keymaps/sm0g/readme.md new file mode 100644 index 000000000000..9916dcabd8b5 --- /dev/null +++ b/keyboards/tada68/keymaps/sm0g/readme.md @@ -0,0 +1,15 @@ +``` + ______ __ __ ______ ______ +.-----.--------.| |.-----. | |_.---.-.--| |.---.-.| __| __ | +|__ --| || -- || _ | | _| _ | _ || _ || __ | __ | +|_____|__|__|__||______||___ | |____|___._|_____||___._||______|______| + |_____| +``` + +Just my simple layout for the Tada68. +Space [Cadet Shift](https://docs.qmk.fm/#/feature_space_cadet_shift) is enabled. +LCTRL and Caps have been swapped and the new CTRL also acts as ESC when tapped and CTRL when held. +This is helpful for me as a VIM user. +Some other changes. + +Tap Dance for the F Row.. i.e double tap 1 and get F1 instead. diff --git a/keyboards/tada68/keymaps/sm0g/rules.mk b/keyboards/tada68/keymaps/sm0g/rules.mk new file mode 100644 index 000000000000..bd4bb32491d3 --- /dev/null +++ b/keyboards/tada68/keymaps/sm0g/rules.mk @@ -0,0 +1,18 @@ +# 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 = yes # Breathing sleep LED during USB suspend +TAP_DANCE_ENABLE = yes # Tappa Dance \ No newline at end of file From db03b76910c486cd27c175ae85efeeaa183b1c98 Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Fri, 19 Oct 2018 01:30:48 +0900 Subject: [PATCH 206/505] optimize rgblight_effect_alternating(void) rgblight_effect_alternating (void) calls rgblight_sethsv_at () RGBLED_NUM times. As a result, rgblight_set () is called RGBLED_NUM + 1 times. This is wasteful processing. --- quantum/rgblight.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 03f77cc80d1f..94e9c0a3b201 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -860,13 +860,13 @@ void rgblight_effect_alternating(void){ last_timer = timer_read(); for(int i = 0; i=RGBLED_NUM/2 && !pos){ - rgblight_sethsv_at(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, i); - }else{ - rgblight_sethsv_at(rgblight_config.hue, rgblight_config.sat, 0, i); - } + if(i=RGBLED_NUM/2 && !pos){ + sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i]); + }else{ + sethsv(rgblight_config.hue, rgblight_config.sat, 0, (LED_TYPE *)&led[i]); + } } rgblight_set(); pos = (pos + 1) % 2; From 53a43dbe995640632be834f406007a72f8fa4d3e Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Thu, 18 Oct 2018 13:53:40 -0700 Subject: [PATCH 207/505] Keymap: Swap func layer keys and add vim navigation to navigation layer (#4163) --- keyboards/dz60/keymaps/crd/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/dz60/keymaps/crd/keymap.c b/keyboards/dz60/keymaps/crd/keymap.c index a17d32caaf55..2aedc0b7288a 100644 --- a/keyboards/dz60/keymaps/crd/keymap.c +++ b/keyboards/dz60/keymaps/crd/keymap.c @@ -12,7 +12,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----------------------------------------------------------------------------------------+ * | Shift | Z | X | C | V | B | N | M | , | . | / | RSh | U | DEL | * |-----------------------------------------------------------------------------------------+ - * | FN2 | Alt | Cmd | Space | Cmd | FN1 | L | D | R | + * | FN1 | Alt | Cmd | Space | Cmd | FN2 | L | D | R | * `-----------------------------------------------------------------------------------------' */ @@ -21,7 +21,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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, 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, 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_UP, KC_DEL, - MO(2), KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT + MO(1), KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, MO(2), KC_LEFT, KC_DOWN, KC_RIGHT ), /* FN1 Layer @@ -30,7 +30,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----------------------------------------------------------------------------------------+ * | | | | | | | | | | | | | | | * |-----------------------------------------------------------------------------------------+ - * | | | | | | | | | | | | | | + * | | | | | | | L | D | U | R | | | | * |-----------------------------------------------------------------------------------------+ * | | | | | | | | | | | | |PgUp | | * |-----------------------------------------------------------------------------------------+ @@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT_directional( 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_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDOWN, KC_END ), From 480651cf9df5c0b7453f60dffe13ae5de665a120 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Thu, 18 Oct 2018 15:12:11 -0700 Subject: [PATCH 208/505] Docs: Adding QMK Git Conventions doc; formatting cleanup on Learning Resources doc (#3902) * Docs: newbs_learn_more_resources.md: formatting * Added QMK Git Conventions doc, initial version * Renamed contributing_qmk.md to newbs_best_practices.md * Updated per review by @drashna * Added navigation links * Updated to Best Practices doc * Minor updates to Learn More Resources doc Markdown formatting consistency because I'm particular about it. * Added Merge Conflict section to Best Practices doc --- docs/_sidebar.md | 1 + docs/_summary.md | 2 + docs/newbs.md | 1 + docs/newbs_best_practices.md | 163 +++++++++++++++++++++++++++++ docs/newbs_learn_more_resources.md | 6 +- 5 files changed, 171 insertions(+), 2 deletions(-) create mode 100644 docs/newbs_best_practices.md diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 56a6463918c0..465f4657cd32 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -3,6 +3,7 @@ * [Building Your First Firmware](newbs_building_firmware.md) * [Flashing Firmware](newbs_flashing.md) * [Testing and Debugging](newbs_testing_debugging.md) + * [Best Practices](newbs_best_practices.md) * [Learning Resources](newbs_learn_more_resources.md) * [QMK Basics](README.md) diff --git a/docs/_summary.md b/docs/_summary.md index 11aeb7cd36f5..465f4657cd32 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -3,6 +3,8 @@ * [Building Your First Firmware](newbs_building_firmware.md) * [Flashing Firmware](newbs_flashing.md) * [Testing and Debugging](newbs_testing_debugging.md) + * [Best Practices](newbs_best_practices.md) + * [Learning Resources](newbs_learn_more_resources.md) * [QMK Basics](README.md) * [QMK Introduction](getting_started_introduction.md) diff --git a/docs/newbs.md b/docs/newbs.md index 38a9607d4486..e687fd227940 100644 --- a/docs/newbs.md +++ b/docs/newbs.md @@ -12,6 +12,7 @@ There are 5 main sections to this guide: * [Building Your First Firmware](newbs_building_firmware.md) * [Flashing Firmware](newbs_flashing.md) * [Testing and Debugging](newbs_testing_debugging.md) +* [Best Practices](newbs_best_practices.md) * [Learn More with these Resources](newbs_learn_more_resources.md) This guide is focused on helping someone who has never compiled software before. It makes choices and recommendations based on that viewpoint. There are alternative methods for many of these procedures, and we support most of those alternatives. If you have any doubt about how to accomplish a task you can [ask us for guidance](getting_started_getting_help.md). diff --git a/docs/newbs_best_practices.md b/docs/newbs_best_practices.md new file mode 100644 index 000000000000..61bcc0c6adb8 --- /dev/null +++ b/docs/newbs_best_practices.md @@ -0,0 +1,163 @@ +# Best Practices + +## Or, "How I Learned to Stop Worrying and Love Git." + +This document aims to instruct novices in the best ways to have a smooth experience in contributing to QMK. We will walk through the process of contributing to QMK, detailing some ways to make this task easier, and then later we'll break some things in order to teach you how to fix them. + +This document assumes a few things: + +1. You have a GitHub account, and have [forked the qmk_firmware repository](getting_started_github.md) to your account. +2. You've [set up your build environment](newbs_getting_started.md?id=environment-setup). + + +## Your fork's master: Update Often, Commit Never + +It is highly recommended for QMK development, regardless of what is being done or where, to keep your `master` branch updated, but ***never*** commit to it. Instead, do all your changes in a development branch and issue pull requests from your branches when you're developing. + +To reduce the chances of merge conflicts — instances where two or more users have edited the same part of a file concurrently — keep your `master` branch relatively up-to-date, and start any new developments by creating a new branch. + +### Updating your master branch + +To keep your `master` branch updated, it is recommended to add the QMK Firmware repository ("repo") as a remote repository in git. To do this, open your Git command line interface and enter: + +``` +git remote add upstream https://github.com/qmk/qmk_firmware.git +``` + +To verify that the repository has been added, run `git remote -v`, which should return the following: + +``` +$ git remote -v +origin https://github.com//qmk_firmware.git (fetch) +origin https://github.com//qmk_firmware.git (push) +upstream https://github.com/qmk/qmk_firmware.git (fetch) +upstream https://github.com/qmk/qmk_firmware.git (push) +``` + +Now that this is done, you can check for updates to the repo by running `git fetch upstream`. This retrieves the branches and tags — collectively referred to as "refs" — from the QMK repo, which now has the nickname `upstream`. We can now compare the data on our fork `origin` to that held by QMK. + +To update your fork's master, run the following, hitting the Enter key after each line: + +``` +git checkout master +git fetch upstream +git pull upstream master +git push origin master +``` + +This switches you to your `master` branch, retrieves the refs from the QMK repo, downloads the current QMK `master` branch to your computer, and then uploads it to your fork. + +### Making Changes + +To make changes, create a new branch by entering: + +``` +git checkout -b dev_branch +git push --set-upstream origin dev_branch +``` + +This creates a new branch named `dev_branch`, checks it out, and then saves the new branch to your fork. The `--set-upstream` argument tells git to use your fork and the `dev_branch` branch every time you use `git push` or `git pull` from this branch. It only needs to be used on the first push; after that, you can safely use `git push` or `git pull`, without the rest of the arguments. + +!> With `git push`, you can use `-u` in place of `--set-upstream` — `-u` is an alias for `--set-upstream`. + +You can name your branch nearly anything you want, though it is recommended to name it something related to the changes you are going to make. + +By default `git checkout -b` will base your new branch on the branch that is checked out. You can base your new branch on an existing branch that is not checked out by adding the name of the existing branch to the command: + +``` +git checkout -b dev_branch master +``` + +Now that you have a development branch, open your text editor and make whatever changes you need to make. It is recommended to make many small commits to your branch; that way, any change that causes issues can be more easily traced and undone if needed. To make your changes, edit and save any files that need to be updated, add them to Git's *staging area*, and then commit them to your branch: + +``` +git add path/to/updated_file +git commit -m "My commit message." +``` + +`git add` adds files that have been changed to Git's *staging area*, which is Git's "loading zone." This contains the changes that are going to be *committed* by `git commit`, which saves the changes to the repo. Use descriptive commit messages so you can know what was changed at a glance. + +!> If you've changed a lot of files, but all the files are part of the same change, you can use `git add .` to add all the changed files that are in your current directory, rather than having to add each file individually. + +### Publishing Your Changes + +The last step is to push your changes to your fork. To do this, enter `git push`. Git now publishes the current state of `dev_branch` to your fork. + + +## Resolving Merge Conflicts + +Sometimes when your work in a branch takes a long time to complete, changes that have been made by others conflict with changes you have made to your branch when you open a pull request. This is called a *merge conflict*, and is what happens when multiple people edit the same parts of the same files. + +### Rebasing Your Changes + +A *rebase* is Git's way of taking changes that were applied at one point, reversing them, and then applying the same changes to another point. In the case of a merge conflict, you can rebase your branch to grab the changes that were made between when you created your branch and the present time. + +To start, run the following: + +``` +git fetch upstream +git rev-list --left-right --count HEAD...upstream/master +``` + +The `git rev-list` command entered here returns the number of commits that differ between the current branch and QMK's master branch. We run `git fetch` first to make sure we have the refs that represent the current state of the upstream repo. The output of the `git rev-list` command entered returns two numbers: + +``` +$ git rev-list --left-right --count HEAD...upstream/master +7 35 +``` + +The first number represents the number of commits on the current branch since it was created, and the second number is the number of commits made to `upstream/master` since the current branch was created, and thus, the changes that are not recorded in the current branch. + +Now that the current states of both the current branch and the upstream repo are known, we can start a rebase operation: + +``` +git rebase upstream/master +``` + +This tells Git to undo the commits on the current branch, and then reapply them against QMK's master branch. + +``` +$ git rebase upstream/master +First, rewinding head to replay your work on top of it... +Applying: Commit #1 +Using index info to reconstruct a base tree... +M conflicting_file_1.txt +Falling back to patching base and 3-way merge... +Auto-merging conflicting_file_1.txt +CONFLICT (content): Merge conflict in conflicting_file_1.txt +error: Failed to merge in the changes. +hint: Use 'git am --show-current-patch' to see the failed patch +Patch failed at 0001 Commit #1 + +Resolve all conflicts manually, mark them as resolved with +"git add/rm ", then run "git rebase --continue". +You can instead skip this commit: run "git rebase --skip". +To abort and get back to the state before "git rebase", run "git rebase --abort". +``` + +This tells us that we have a merge conflict, and gives the name of the file with the conflict. Open the conflicting file in your text editor, and somewhere in the file, you'll find something like this: + +``` +<<<<<<< HEAD +

For help with any issues, email us at support@webhost.us.

+======= +

Need help? Email support@webhost.us.

+>>>>>>> Commit #1 +``` + +The line `<<<<<<< HEAD` marks the beginning of a merge conflict, and the `>>>>>>> Commit #1` line marks the end, with the conflicting sections separated by `=======`. The part on the `HEAD` side is from the QMK master version of the file, and the part marked with the commit message is from the current branch and commit. + +Because Git tracks *changes to files* rather than the contents of the files directly, if Git can't find the text that was in the file previous to the commit that was made, it won't know how to edit the file. Re-editing the file will solve the conflict. Make your changes, and then save the file. + +``` +

Need help? Email support@webhost.us.

+``` + +Now run: + +``` +git add conflicting_file_1.txt +git rebase --continue +``` + +Git logs the changes to the conflicting file, and continues applying the commits from our branch until it reaches the end. diff --git a/docs/newbs_learn_more_resources.md b/docs/newbs_learn_more_resources.md index 23b99f470fe6..9b77db8fd428 100644 --- a/docs/newbs_learn_more_resources.md +++ b/docs/newbs_learn_more_resources.md @@ -1,13 +1,15 @@ # Learning Resources -These resources are aimed at giving new members in the qmk community more understanding to the information provided in the newbs docs. + +These resources are aimed at giving new members in the QMK community more understanding to the information provided in the Newbs docs. Git resources: * [Great General Tutorial](https://www.codecademy.com/learn/learn-git) * [Git Game To Learn From Examples](https://learngitbranching.js.org/) * [Git Resources to Learn More About Github](getting_started_github.md) -* [Git Resources Aimed Specificly toward QMK](contributing.md) +* [Git Resources Aimed Specifically toward QMK](contributing.md) Command Line resources: + * [Good General Tutorial on Command Line](https://www.codecademy.com/learn/learn-the-command-line) From fc1c692f710fcd65be250d43662ee9742b221f0d Mon Sep 17 00:00:00 2001 From: lexworth <30760424+lexworth@users.noreply.github.com> Date: Thu, 18 Oct 2018 18:36:30 -0400 Subject: [PATCH 209/505] Keymap: Adding my Minivan layout (#4162) * adding my keymap * adding my Minivan keymap * deleted old incomplete keymap * added link to layout image * adding my minivan keymap --- .../minivan/keymaps/lexworth/config.h | 5 ++++ .../minivan/keymaps/lexworth/keymap.c | 29 +++++++++++++++++++ .../minivan/keymaps/lexworth/readme.md | 7 +++++ .../minivan/keymaps/lexworth/rules.mk | 5 ++++ 4 files changed, 46 insertions(+) create mode 100644 keyboards/thevankeyboards/minivan/keymaps/lexworth/config.h create mode 100644 keyboards/thevankeyboards/minivan/keymaps/lexworth/keymap.c create mode 100644 keyboards/thevankeyboards/minivan/keymaps/lexworth/readme.md create mode 100644 keyboards/thevankeyboards/minivan/keymaps/lexworth/rules.mk diff --git a/keyboards/thevankeyboards/minivan/keymaps/lexworth/config.h b/keyboards/thevankeyboards/minivan/keymaps/lexworth/config.h new file mode 100644 index 000000000000..36062c47b9c8 --- /dev/null +++ b/keyboards/thevankeyboards/minivan/keymaps/lexworth/config.h @@ -0,0 +1,5 @@ +#pragma once + +// place overrides here +#define BACKLIGHT_PIN B7 +#define BACKLIGHT_LEVELS 5 \ No newline at end of file diff --git a/keyboards/thevankeyboards/minivan/keymaps/lexworth/keymap.c b/keyboards/thevankeyboards/minivan/keymaps/lexworth/keymap.c new file mode 100644 index 000000000000..1824f3cf3920 --- /dev/null +++ b/keyboards/thevankeyboards/minivan/keymaps/lexworth/keymap.c @@ -0,0 +1,29 @@ +#include QMK_KEYBOARD_H + +// Helpful defines + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT + (KC_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + LT(1,KC_TAB), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, LT(1,KC_QUOT), + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, + KC_LCTL, KC_LALT, KC_LGUI, KC_ENT, KC_SPC, TG(2), LT(3,KC_APP), KC_DEL), + + [1] = LAYOUT + (KC_CAPS, KC_PGUP, KC_UP, KC_PGDN, KC_INS, KC_HOME, KC_UNDS, KC_P7, KC_P8, KC_P9, KC_EQL, KC_TRNS, + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_END, KC_PMNS, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, + KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY, KC_MPRV, KC_MNXT, KC_PAST, KC_P1, KC_P2, KC_P3, KC_PSLS, KC_NLCK, + KC_TRNS, KC_TRNS, KC_MSTP, KC_PENT, KC_P0, KC_PDOT, KC_APP, KC_TRNS), + + [2] = LAYOUT + (KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F11, KC_F12), + + [3] = LAYOUT + (KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LCBR, KC_RCBR, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_PIPE, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LPRN, KC_RPRN, KC_TRNS, + BL_TOGG, BL_DEC, BL_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET) +}; diff --git a/keyboards/thevankeyboards/minivan/keymaps/lexworth/readme.md b/keyboards/thevankeyboards/minivan/keymaps/lexworth/readme.md new file mode 100644 index 000000000000..5ac3aafdcc12 --- /dev/null +++ b/keyboards/thevankeyboards/minivan/keymaps/lexworth/readme.md @@ -0,0 +1,7 @@ +# Minivan + +![Layout Image](https://drive.google.com/file/d/1rDbtoOBvw5lxfvUBLYmjTt6MJPoeXngr/view?usp=sharing) + +# Custom keymap for the minivan with backlight enabled and 5 backlight levels. +# Hardware Supported: Minivan +# Hardware Availability: [thevankeyboards.com](https://thevankeyboards.com/) \ No newline at end of file diff --git a/keyboards/thevankeyboards/minivan/keymaps/lexworth/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/lexworth/rules.mk new file mode 100644 index 000000000000..9c7dc2e122f6 --- /dev/null +++ b/keyboards/thevankeyboards/minivan/keymaps/lexworth/rules.mk @@ -0,0 +1,5 @@ +# 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 + +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality From 8efe8b498d344928fb55ea78a289d9eb32145e48 Mon Sep 17 00:00:00 2001 From: 194h <38110558+194h@users.noreply.github.com> Date: Fri, 19 Oct 2018 02:09:06 +0200 Subject: [PATCH 210/505] Keymap: Added 194h atreus62 keymap (#4164) * Added my(194h) atreus62 keymap * Fixed what noroadsleft remarked in my pull request, hopefully got it all. * Followed drashna's suggestion. --- keyboards/atreus62/keymaps/194h/config.h | 6 + keyboards/atreus62/keymaps/194h/keymap.c | 160 +++++++++++++++++++++++ keyboards/atreus62/keymaps/194h/rules.mk | 8 ++ 3 files changed, 174 insertions(+) create mode 100644 keyboards/atreus62/keymaps/194h/config.h create mode 100644 keyboards/atreus62/keymaps/194h/keymap.c create mode 100644 keyboards/atreus62/keymaps/194h/rules.mk diff --git a/keyboards/atreus62/keymaps/194h/config.h b/keyboards/atreus62/keymaps/194h/config.h new file mode 100644 index 000000000000..f5306a07f188 --- /dev/null +++ b/keyboards/atreus62/keymaps/194h/config.h @@ -0,0 +1,6 @@ +#pragma once +#define ONESHOT_TIMEOUT 3000 +#define TAPPING_TERM 200 +#define FORCE_NKRO +#define LEADER_TIMEOUT 1000 +#define TAPPING_TOGGLE 3 diff --git a/keyboards/atreus62/keymaps/194h/keymap.c b/keyboards/atreus62/keymaps/194h/keymap.c new file mode 100644 index 000000000000..9b397fce467d --- /dev/null +++ b/keyboards/atreus62/keymaps/194h/keymap.c @@ -0,0 +1,160 @@ +#include QMK_KEYBOARD_H + +//The current Nordic and Norwegian layout files are a mess. I'll do it myself: +//Norwegian +#define NO_AE KC_QUOT // Æ +#define NO_AO KC_LBRC // Å +#define NO_BSLS KC_EQL // Backslash +#define NO_LT KC_NUBS // < +#define NO_MINS KC_SLSH // - +#define NO_OE KC_SCLN // Ø +#define NO_PIPE KC_GRV // | +#define NO_PLUS KC_MINS // + +#define NO_QUOT KC_NUHS // ' +#define NO_UMLA KC_RBRC // ¨ +//Norwegian - Modifier dependant definitions +#define NO_EXLM LSFT(KC_1) // ! +#define NO_DQT LSFT(KC_2) // " +#define NO_AT RALT(KC_2) // @ +#define NO_HASH LSFT(KC_3) // # +#define NO_EUR LSFT(KC_4) // € +#define NO_DLR RALT(KC_4) // $ +#define NO_PERC LSFT(KC_5) // % +#define NO_AND LSFT(KC_6) // & +#define NO_SLSH LSFT(KC_7) // / +#define NO_PO LSFT(KC_8) // ( +#define NO_PC LSFT(KC_9) // ) +#define NO_EQL LSFT(KC_0) // = +#define NO_LCBR RALT(KC_7) // { +#define NO_LBRC RALT(KC_8) // [ +#define NO_RBRC RALT(KC_9) // ] +#define NO_RCBR RALT(KC_0) // } +#define NO_COLN LSFT(KC_DOT) // : +#define NO_SCLN LSFT(KC_COMM) // ; +#define NO_MU RALT(KC_M) // µ +#define NO_EURO RALT(KC_E) // € +#define NO_SECT LSFT(KC_GRV) // § +#define NO_GERC RALT(KC_COMM) // ¸ +#define NO_QUAR LSFT(RALT(KC_4)) // ¼ +//Norwegian layout - dependant on previous definitions +#define NO_UNDS LSFT(NO_MINS) // _ +#define NO_QUES LSFT(NO_PLUS) // ? +#define NO_GRAV LSFT(NO_BSLS) // ` +#define NO_GT LSFT(NO_LT) // > +#define NO_HALF RALT(NO_LT) // ½ +#define NO_HAT LSFT(NO_UMLA) // ^ +#define NO_ASTR LSFT(NO_QUOT) // * +#define NO_TILD RALT(NO_UMLA) // ~ + +//One Shot Modifier +#define OSM_LCTL OSM(MOD_LCTL) +#define OSM_LALT OSM(MOD_LALT) +#define OSM_LSFT OSM(MOD_LSFT) +#define OSM_LGUI OSM(MOD_LGUI) +#define OSM_RCTL OSM(MOD_RCTL) +#define OSM_RALT OSM(MOD_RALT) +#define OSM_RSFT OSM(MOD_RSFT) +#define OSM_RGUI OSM(MOD_RGUI) + +//Layers +#define L1 0 +#define L2 1 +#define L3 2 +#define L4 3 +#define L5 4 + +// Momentary switch to layer - One Shot Layer +#define OSL_L3 OSL(L3) +#define OSL_L4 OSL(L4) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [L1] = LAYOUT( + KC_LGUI, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RGUI, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, NO_DQT, + KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, NO_SCLN, NO_QUOT, + OSM_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, NO_MINS, OSM_RSFT, + CTL_T(KC_ESC), MO(L5), KC_LEAD, OSM_LALT, MO(L4), OSL_L3, KC_SPC, KC_ENT, OSL_L3, MO(L4), OSM_RALT, NO_EQL, NO_PLUS, KC_RCTL + ), + [L2] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NO_AO, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NO_OE, NO_AE, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + [L3] = LAYOUT( + NO_LBRC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NO_RBRC, + NO_LCBR, XXXXXXX, XXXXXXX, NO_AT, XXXXXXX, NO_TILD, NO_QUES, NO_EXLM, NO_PIPE, XXXXXXX, XXXXXXX, NO_RCBR, + _______, NO_ASTR, NO_BSLS, NO_DLR, NO_HASH, XXXXXXX, NO_HAT, XXXXXXX, NO_COLN, NO_SLSH, NO_SCLN, NO_QUOT, + NO_PO, KC_0, NO_SECT, NO_PERC, XXXXXXX, NO_GRAV, NO_AND, NO_UMLA, NO_LT, NO_GT, NO_UNDS, NO_PC, + XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX + ), + [L4] = LAYOUT( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_HOME, KC_PGDN, KC_PGUP, KC_END, XXXXXXX, XXXXXXX, + _______, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX, KC_DEL, + XXXXXXX, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, XXXXXXX, KC_APP, XXXXXXX, XXXXXXX, KC_VOLD, XXXXXXX, + OSM_LCTL, _______, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MUTE, KC_VOLU, OSM_RCTL + ), + [L5] = LAYOUT( + XXXXXXX, TO(L1), TO(L2), TO(L3), TO(L4), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NO_AO, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NO_OE, NO_AE, + XXXXXXX, XXXXXXX, XXXXXXX, KC_CAPS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + ) +}; + + +// Unicode Linux +void matrix_init_user(void) { + set_unicode_input_mode(UC_LNX); +}; + + +#define TAP_ONCE(code) \ + register_code (code); \ + unregister_code (code) + + +LEADER_EXTERNS(); + +// Runs constantly in the background, in a loop. Only supports basic keycodes. +void matrix_scan_user(void) { + LEADER_DICTIONARY() { + leading = false; + leader_end(); + + //probably useless in practice, but cool + SEQ_ONE_KEY (KC_P) { + tap_random_base64(); + tap_random_base64(); + tap_random_base64(); + tap_random_base64(); + tap_random_base64(); + tap_random_base64(); + tap_random_base64(); + tap_random_base64(); + } + + SEQ_ONE_KEY (KC_G) { + SEND_STRING("grep something !"); + register_code(KC_RALT); + TAP_ONCE(KC_4); + unregister_code(KC_RALT); + } + SEQ_ONE_KEY (KC_T) { + SEND_STRING("tail "); + TAP_ONCE(KC_SLSH); + SEND_STRING("f !"); + register_code(KC_RALT); + TAP_ONCE(KC_4); + unregister_code(KC_RALT); + } + SEQ_ONE_KEY (KC_S) { + SEND_STRING("sudo !!"); + TAP_ONCE(KC_ENT); + } + } +} diff --git a/keyboards/atreus62/keymaps/194h/rules.mk b/keyboards/atreus62/keymaps/194h/rules.mk new file mode 100644 index 000000000000..5246909a3891 --- /dev/null +++ b/keyboards/atreus62/keymaps/194h/rules.mk @@ -0,0 +1,8 @@ +TAP_DANCE_ENABLE = no +NKRO_ENABLE = true +MOUSEKEY_ENABLE = no +EXTRAKEY_ENABLE = yes +CONSOLE_ENABLE = no +KEY_LOCK_ENABLE = no +AUTO_SHIFT_ENABLE = no +LEADER_ENABLE = yes From f4094930a393ec3dc597e06e95cd3365e3f8cb97 Mon Sep 17 00:00:00 2001 From: Takuya Urakawa Date: Fri, 19 Oct 2018 13:33:23 +0900 Subject: [PATCH 211/505] stm32f1xx EEPROM emulation (#3914) * * Add stm32f1xx EEPROM emulation * Fix eeprom update compare bug Squashed commit of the following: commit b8f248ae08cec0cd81ecbb8854d9b39221d4d573 Author: hsgw Date: Sat Sep 15 19:13:48 2018 +0900 fix EEPROM_update wrong compare commit d4ed4e6ea864e967a3e17f7edee4b0c3b4a25541 Author: hsgw Date: Sat Sep 15 17:43:47 2018 +0900 eeprom fix initialization define commit b61aa7c04d70c64df3416d63e5da08b73b6053af Author: hsgw Date: Sat Sep 15 16:33:40 2018 +0900 maybe working * Fix FLASH_KEY defines --- tmk_core/common.mk | 7 +++++++ tmk_core/common/chibios/eeprom_stm32.c | 8 ++++---- tmk_core/common/chibios/eeprom_stm32.h | 12 +++++++++--- tmk_core/common/chibios/flash_stm32.c | 24 ++++++++++++++++-------- tmk_core/common/eeconfig.c | 6 +++--- tmk_core/common/eeconfig.h | 2 +- tmk_core/protocol/chibios/main.c | 4 ++-- 7 files changed, 42 insertions(+), 21 deletions(-) diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 4a0f7dcf9a1f..33bcc97b2ed1 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -34,6 +34,13 @@ ifeq ($(PLATFORM),CHIBIOS) ifeq ($(MCU_SERIES), STM32F3xx) TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c + TMK_COMMON_DEFS += -DEEPROM_EMU_STM32F303xC + TMK_COMMON_DEFS += -DSTM32_EEPROM_ENABLE + else ifeq ($(MCU_SERIES), STM32F1xx) + TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c + TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c + TMK_COMMON_DEFS += -DEEPROM_EMU_STM32F103xB + TMK_COMMON_DEFS += -DSTM32_EEPROM_ENABLE else TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_teensy.c endif diff --git a/tmk_core/common/chibios/eeprom_stm32.c b/tmk_core/common/chibios/eeprom_stm32.c index 3c19451223d1..a86998550128 100755 --- a/tmk_core/common/chibios/eeprom_stm32.c +++ b/tmk_core/common/chibios/eeprom_stm32.c @@ -10,7 +10,7 @@ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * - * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and + * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and * https://github.com/leaflabs/libmaple * * Modifications for QMK and STM32F303 by Yiancar @@ -274,7 +274,7 @@ uint16_t EE_VerifyPageFullWriteVariable(uint16_t Address, uint16_t Data) // Check each active page address starting from begining for (idx = pageBase + 4; idx < pageEnd; idx += 4) - if ((*(__IO uint32_t*)idx) == 0xFFFFFFFF) // Verify if element + if ((*(__IO uint32_t*)idx) == 0xFFFFFFFF) // Verify if element { // contents are 0xFFFFFFFF FlashStatus = FLASH_ProgramHalfWord(idx, Data); // Set variable data if (FlashStatus != FLASH_COMPLETE) @@ -517,7 +517,7 @@ uint16_t EEPROM_read(uint16_t Address, uint16_t *Data) // Get the valid Page end Address pageEnd = pageBase + ((uint32_t)(PageSize - 2)); - + // Check each active page address starting from end for (pageBase += 6; pageEnd >= pageBase; pageEnd -= 4) if ((*(__IO uint16_t*)pageEnd) == Address) // Compare the read address with the virtual address @@ -574,7 +574,7 @@ uint16_t EEPROM_update(uint16_t Address, uint16_t Data) { uint16_t temp; EEPROM_read(Address, &temp); - if (Address == Data) + if (temp == Data) return EEPROM_SAME_VALUE; else return EEPROM_write(Address, Data); diff --git a/tmk_core/common/chibios/eeprom_stm32.h b/tmk_core/common/chibios/eeprom_stm32.h index 68aa14f6d485..09229530ca4f 100755 --- a/tmk_core/common/chibios/eeprom_stm32.h +++ b/tmk_core/common/chibios/eeprom_stm32.h @@ -10,7 +10,7 @@ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * - * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and + * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and * https://github.com/leaflabs/libmaple * * Modifications for QMK and STM32F303 by Yiancar @@ -27,8 +27,14 @@ #include "flash_stm32.h" // HACK ALERT. This definition may not match your processor -// To Do. Work out correct value for EEPROM_PAGE_SIZE on the STM32F103CT6 etc -#define MCU_STM32F303CC +// To Do. Work out correct value for EEPROM_PAGE_SIZE on the STM32F103CT6 etc +#if defined(EEPROM_EMU_STM32F303xC) + #define MCU_STM32F303CC +#elif defined(EEPROM_EMU_STM32F103xB) + #define MCU_STM32F103RB +#else + #error "not implemented." +#endif #ifndef EEPROM_PAGE_SIZE #if defined (MCU_STM32F103RB) diff --git a/tmk_core/common/chibios/flash_stm32.c b/tmk_core/common/chibios/flash_stm32.c index e7199ac7b127..27359348445e 100755 --- a/tmk_core/common/chibios/flash_stm32.c +++ b/tmk_core/common/chibios/flash_stm32.c @@ -10,19 +10,27 @@ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * - * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and + * This files are free to use from https://github.com/rogerclarkmelbourne/Arduino_STM32 and * https://github.com/leaflabs/libmaple * * Modifications for QMK and STM32F303 by Yiancar */ -#define STM32F303xC +#if defined(EEPROM_EMU_STM32F303xC) + #define STM32F303xC + #include "stm32f3xx.h" +#elif defined(EEPROM_EMU_STM32F103xB) + #define STM32F103xB + #include "stm32f1xx.h" +#else + #error "not implemented." +#endif -#include "stm32f3xx.h" #include "flash_stm32.h" -#define FLASH_KEY1 ((uint32_t)0x45670123) -#define FLASH_KEY2 ((uint32_t)0xCDEF89AB) +#if defined(EEPROM_EMU_STM32F103xB) + #define FLASH_SR_WRPERR FLASH_SR_WRPRTERR +#endif /* Delay definition */ #define EraseTimeout ((uint32_t)0x00000FFF) @@ -71,7 +79,7 @@ FLASH_Status FLASH_GetStatus(void) * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. */ FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout) -{ +{ FLASH_Status status; /* Check for the Flash Status */ @@ -102,7 +110,7 @@ FLASH_Status FLASH_ErasePage(uint32_t Page_Address) ASSERT(IS_FLASH_ADDRESS(Page_Address)); /* Wait for last operation to be completed */ status = FLASH_WaitForLastOperation(EraseTimeout); - + if(status == FLASH_COMPLETE) { /* if the previous operation is completed, proceed to erase the page */ @@ -128,7 +136,7 @@ FLASH_Status FLASH_ErasePage(uint32_t Page_Address) * @param Address: specifies the address to be programmed. * @param Data: specifies the data to be programmed. * @retval FLASH Status: The returned value can be: FLASH_ERROR_PG, - * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. + * FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT. */ FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data) { diff --git a/tmk_core/common/eeconfig.c b/tmk_core/common/eeconfig.c index 0fec410a9ca2..d8bab7d2e52c 100644 --- a/tmk_core/common/eeconfig.c +++ b/tmk_core/common/eeconfig.c @@ -3,7 +3,7 @@ #include "eeprom.h" #include "eeconfig.h" -#ifdef STM32F303xC +#ifdef STM32_EEPROM_ENABLE #include "hal.h" #include "eeprom_stm32.h" #endif @@ -32,7 +32,7 @@ void eeconfig_init_kb(void) { * FIXME: needs doc */ void eeconfig_init_quantum(void) { -#ifdef STM32F303xC +#ifdef STM32_EEPROM_ENABLE EEPROM_format(); #endif eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER); @@ -73,7 +73,7 @@ void eeconfig_enable(void) */ void eeconfig_disable(void) { -#ifdef STM32F303xC +#ifdef STM32_EEPROM_ENABLE EEPROM_format(); #endif eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER_OFF); diff --git a/tmk_core/common/eeconfig.h b/tmk_core/common/eeconfig.h index a45cb8b12d3c..8d4e1d4d0083 100644 --- a/tmk_core/common/eeconfig.h +++ b/tmk_core/common/eeconfig.h @@ -26,7 +26,7 @@ along with this program. If not, see . #define EECONFIG_MAGIC_NUMBER_OFF (uint16_t)0xFFFF /* eeprom parameteter address */ -#if !defined(STM32F303xC) +#if !defined(STM32_EEPROM_ENABLE) #define EECONFIG_MAGIC (uint16_t *)0 #define EECONFIG_DEBUG (uint8_t *)2 #define EECONFIG_DEFAULT_LAYER (uint8_t *)3 diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index dcc6d9d07642..6cceccd23c7a 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c @@ -44,7 +44,7 @@ #ifdef MIDI_ENABLE #include "qmk_midi.h" #endif -#ifdef STM32F303xC +#ifdef STM32_EEPROM_ENABLE #include "eeprom_stm32.h" #endif #include "suspend.h" @@ -112,7 +112,7 @@ int main(void) { halInit(); chSysInit(); -#ifdef STM32F303xC +#ifdef STM32_EEPROM_ENABLE EEPROM_init(); #endif From 7e1b57add42dcc3330d9d99e28c9b7f96eb2eee8 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 18 Oct 2018 21:34:40 -0700 Subject: [PATCH 212/505] Some cleanup of the Useful Functions docs (#4064) * Add examples for tri layers * Clean up and spelling fixes --- docs/ref_functions.md | 78 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 64 insertions(+), 14 deletions(-) diff --git a/docs/ref_functions.md b/docs/ref_functions.md index 7d0cda322759..9b5be7a883ff 100644 --- a/docs/ref_functions.md +++ b/docs/ref_functions.md @@ -1,28 +1,79 @@ # List of Useful Core Functions To Make Your Keyboard Better -There are a lot of hidden functions in QMK that are incredible useful, or may add a bit of functionality that you've been wanting. Functions that are specific to certain features are not included here, as those will be on their respective feature page. +There are a lot of hidden functions in QMK that are incredible useful, or may add a bit of functionality that you've been wanting. Functions that are specific to certain features are not included here, as those will be on their respective feature page. ## (OLKB) Tri Layers -There are actually separate functions that you can use there, depending on what you're after. +There are actually separate functions that you can use there, depending on what you're after. -The first is the `update_tri_layer(x, y, z)` function. This function check to see if layers `x` and `y` are both on. If they are both on, then it runs on layer `z`. Otherwise, if both `x` and `y` are not both on (either only one is, or neither is), then it runs off layer `z`. +### `update_tri_layer(x, y, z)` -This function is useful if you want to create specific keys that have this functionality, but other layer keycodes won't do this. +The first is the `update_tri_layer(x, y, z)` function. This function check to see if layers `x` and `y` are both on. If they are both on, then it runs on layer `z`. Otherwise, if both `x` and `y` are not both on (either only one is, or neither is), then it runs off layer `z`. -The other function is `update_tri_layer_state(state, x, y, z)`. This function is meant to be called from they [`layer_state_set_*` functions](custom_quantum_functions.md#layer-change-code). This means that any time that you use a keycode to change the layer, this will be checked. So you could use `LT(layer, kc)` to change the layer and it will trigger the same layer check. +This function is useful if you want to create specific keys that have this functionality, but other layer keycodes won't do this. -The caveat to this method is that you cannot access the `z` layer without having `x` and `y` layers on, since if you try to activate just layer `z`, it will run this code and turn off layer `z` before you could use it. +#### Example + +```c +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + 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; + } + return true; +} +``` + +### `update_tri_layer_state(state, x, y, z)` +The other function is `update_tri_layer_state(state, x, y, z)`. This function is meant to be called from they [`layer_state_set_*` functions](custom_quantum_functions.md#layer-change-code). This means that any time that you use a keycode to change the layer, this will be checked. So you could use `LT(layer, kc)` to change the layer and it will trigger the same layer check. + +The caveat to this method is that you cannot access the `z` layer without having `x` and `y` layers on, since if you try to activate just layer `z`, it will run this code and turn off layer `z` before you could use it. + +#### Example + +```c +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} +``` + +Alternatively, you don't have to immediately "return" the value. This is useful if you want to add multiple tri layers, or if you want to add additional effects. + +```c +uint32_t layer_state_set_user(uint32_t state) { + state = update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); + state = update_tri_layer_state(state, _RAISE, _SYMB, _SPECIAL); + return state; +} +``` ## Setting the Persistent Default Layer -Do you want to set the default layer, so that it's retained even after you unplug the board? If so, this is the function for you. +Do you want to set the default layer, so that it's retained even after you unplug the board? If so, this is the function for you. -To use this, you would use `set_single_persistent_default_layer(layer)`. If you have a name defined for your layer, you can use that instead (such as _QWERTY, _DVORAK or _COLEMAK). +To use this, you would use `set_single_persistent_default_layer(layer)`. If you have a name defined for your layer, you can use that instead (such as _QWERTY, _DVORAK or _COLEMAK). -This will set the default layer, update the persistent settings, and play a tune if you have [Audio](feature_audio.md) enabled on your board, and the default layer sounds set. +This will set the default layer, update the persistent settings, and play a tune if you have [Audio](feature_audio.md) enabled on your board, and the default layer sounds set. -To configure the default layer sounds, you would want to define this in your `config.h` file, like this: +To configure the default layer sounds, you would want to define this in your `config.h` file, like this: ```c #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ @@ -36,13 +87,12 @@ To configure the default layer sounds, you would want to define this in your `co ## Reseting the keyboard -There is the `RESET` quantum keycode that you can use. But if you want to reset the board as part of a macro, rather than hitting a key separately, you can do that. +There is the `RESET` quantum keycode that you can use. But if you want to reset the board as part of a macro, rather than hitting a key separately, you can do that. And to do so, add `reset_keyboard()` to your function or macro, and this will reset to bootloader. ## Wiping the EEPROM (Persistent Storage) -If you're having issues with Audio, RGB Underglow, backlighting or keys acting weird, then you can reset the EEPROM (persistent setting storage). Bootmagic is one way to do this, but if that isn't enabled, then you can use a custom macro to do so. - -To wipe the EEPROM, run `eeconfig_init()` from your function or macro to reset most of the settings to default. +If you're having issues with Audio, RGB Underglow, backlighting or keys acting weird, then you can reset the EEPROM (persistent setting storage). Bootmagic is one way to do this, but if that isn't enabled, then you can use a custom macro to do so. +To wipe the EEPROM, run `eeconfig_init()` from your function or macro to reset most of the settings to default. From 7222e3691b18128c4822f6bb5db008010f5e41dd Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 18 Oct 2018 21:35:15 -0700 Subject: [PATCH 213/505] Fix Unicode EEPROM handling so it is consistent. (#4066) * Fix Unicode EEPROM handling so it's consistant * Remove changes to my userspace * Optimize variables used * fix functions * additional cleanup * Add False Flag * rename function --- quantum/process_keycode/process_ucis.c | 6 +++--- quantum/process_keycode/process_unicode.c | 7 +------ .../process_keycode/process_unicode_common.c | 17 +++++++++++------ .../process_keycode/process_unicode_common.h | 1 + quantum/process_keycode/process_unicodemap.c | 1 + 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/quantum/process_keycode/process_ucis.c b/quantum/process_keycode/process_ucis.c index 5de2e41fc305..380199771db6 100644 --- a/quantum/process_keycode/process_ucis.c +++ b/quantum/process_keycode/process_ucis.c @@ -93,7 +93,7 @@ void register_ucis(const char *hex) { } bool process_ucis (uint16_t keycode, keyrecord_t *record) { - uint8_t i; + unicode_input_mode_init(); if (!qk_ucis_state.in_progress) return true; @@ -122,7 +122,7 @@ bool process_ucis (uint16_t keycode, keyrecord_t *record) { if (keycode == KC_ENT || keycode == KC_SPC || keycode == KC_ESC) { bool symbol_found = false; - for (i = qk_ucis_state.count; i > 0; i--) { + for (uint8_t i = qk_ucis_state.count; i > 0; i--) { register_code (KC_BSPC); unregister_code (KC_BSPC); wait_ms(UNICODE_TYPE_DELAY); @@ -134,7 +134,7 @@ bool process_ucis (uint16_t keycode, keyrecord_t *record) { } unicode_input_start(); - for (i = 0; ucis_symbol_table[i].symbol; i++) { + for (uint8_t i = 0; ucis_symbol_table[i].symbol; i++) { if (is_uni_seq (ucis_symbol_table[i].symbol)) { symbol_found = true; register_ucis(ucis_symbol_table[i].code + 2); diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c index fd008eca127a..f39c4a36e1b6 100644 --- a/quantum/process_keycode/process_unicode.c +++ b/quantum/process_keycode/process_unicode.c @@ -17,15 +17,10 @@ #include "action_util.h" #include "eeprom.h" -static uint8_t first_flag = 0; - 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_mode_init(); unicode_input_start(); register_hex(unicode); unicode_input_finish(); diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c index e6620b7ea9f9..4285d20a19fb 100644 --- a/quantum/process_keycode/process_unicode_common.c +++ b/quantum/process_keycode/process_unicode_common.c @@ -22,8 +22,7 @@ static uint8_t input_mode; uint8_t mods; -void set_unicode_input_mode(uint8_t os_target) -{ +void set_unicode_input_mode(uint8_t os_target) { input_mode = os_target; eeprom_update_byte(EECONFIG_UNICODEMODE, os_target); } @@ -32,6 +31,14 @@ uint8_t get_unicode_input_mode(void) { return input_mode; } +void unicode_input_mode_init(void) { + static bool first_flag = false; + if (!first_flag) { + input_mode = eeprom_read_byte(EECONFIG_UNICODEMODE); + first_flag = true; + } +} + __attribute__((weak)) void unicode_input_start (void) { // save current mods @@ -104,8 +111,7 @@ void unicode_input_finish (void) { } __attribute__((weak)) -uint16_t hex_to_keycode(uint8_t hex) -{ +uint16_t hex_to_keycode(uint8_t hex) { if (hex == 0x0) { return KC_0; } else if (hex < 0xA) { @@ -123,8 +129,7 @@ void register_hex(uint16_t hex) { } } -void send_unicode_hex_string(const char *str) -{ +void send_unicode_hex_string(const char *str) { if (!str) { return; } // Safety net while (*str) { diff --git a/quantum/process_keycode/process_unicode_common.h b/quantum/process_keycode/process_unicode_common.h index 814b60c573e4..e78e1cec6ce9 100644 --- a/quantum/process_keycode/process_unicode_common.h +++ b/quantum/process_keycode/process_unicode_common.h @@ -28,6 +28,7 @@ static uint8_t input_mode; void set_unicode_input_mode(uint8_t os_target); uint8_t get_unicode_input_mode(void); +void unicode_input_mode_init(void); void unicode_input_start(void); void unicode_input_finish(void); void register_hex(uint16_t hex); diff --git a/quantum/process_keycode/process_unicodemap.c b/quantum/process_keycode/process_unicodemap.c index 47c27b911716..ab5717ba3aff 100644 --- a/quantum/process_keycode/process_unicodemap.c +++ b/quantum/process_keycode/process_unicodemap.c @@ -45,6 +45,7 @@ __attribute__((weak)) void unicode_map_input_error() {} bool process_unicode_map(uint16_t keycode, keyrecord_t *record) { + unicode_input_mode_init(); uint8_t input_mode = get_unicode_input_mode(); if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) { const uint32_t* map = unicode_map; From ae31eb564a340cab53f18fe5290ee5033704be1f Mon Sep 17 00:00:00 2001 From: Trigotometry <25544371+Trigotometry@users.noreply.github.com> Date: Sat, 20 Oct 2018 02:40:46 +1100 Subject: [PATCH 214/505] Keymap: Trigotometry's Preonic (#4158) * adding my keymap * updated pull request comments from dashna, including redundancies and DVORAK entirely * changed over visual representation to use 'LAYOUT_preonic_grid()' * added a ReadMe and commented out AUDIO_ENABLED related stuff in keymap.c until I can align with current QMK standards * Update readme.md * readme corrections and adjustments --- .../preonic/keymaps/trigotometry/config.h | 8 + .../preonic/keymaps/trigotometry/keymap.c | 165 ++++++++++++++++++ .../preonic/keymaps/trigotometry/readme.md | 75 ++++++++ .../preonic/keymaps/trigotometry/rules.mk | 2 + 4 files changed, 250 insertions(+) create mode 100644 keyboards/preonic/keymaps/trigotometry/config.h create mode 100644 keyboards/preonic/keymaps/trigotometry/keymap.c create mode 100644 keyboards/preonic/keymaps/trigotometry/readme.md create mode 100644 keyboards/preonic/keymaps/trigotometry/rules.mk diff --git a/keyboards/preonic/keymaps/trigotometry/config.h b/keyboards/preonic/keymaps/trigotometry/config.h new file mode 100644 index 000000000000..eaf6997db1bd --- /dev/null +++ b/keyboards/preonic/keymaps/trigotometry/config.h @@ -0,0 +1,8 @@ +#pragma once + +#define STARTUP_SONG SONG(PREONIC_SOUND) +#define MUSIC_MASK (keycode != KC_NO) + +#define FORCE_NKRO 1 +#define PREVENT_STUCK_MODIFIERS +#define GRAVE_ESC_GUI_OVERRIDE \ No newline at end of file diff --git a/keyboards/preonic/keymaps/trigotometry/keymap.c b/keyboards/preonic/keymaps/trigotometry/keymap.c new file mode 100644 index 000000000000..31cee4a4cd6e --- /dev/null +++ b/keyboards/preonic/keymaps/trigotometry/keymap.c @@ -0,0 +1,165 @@ +#include QMK_KEYBOARD_H +#ifdef AUDIO_ENABLE + #include "audio.h" +#endif + +// Layer declarations +enum preonic_layers { + _QWERTY = 1, + _GAMING = 2, + _LOWER = 3, + _RAISE = 4, +}; + +enum preonic_keycodes { + QWERTY = SAFE_RANGE, + GAMING, + LOWER, + RAISE, +}; + +// QMK predefined macros +#define SFT_ENT SFT_T(KC_ENT) // Tap for Enter, hold for Shift + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* QWERTY + * ,-----------------------------------------------------------------------------------. + * | GEsc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Shft | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |SFTENT| Z | X | C | V | B | N | M | , | . | / | Entr | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Ctrl | Alt | Supr |Lower | Space | Raise| Left | Down | Up | Rght | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_preonic_grid( + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, 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_BSPC, \ + KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + SFT_ENT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_ENT, \ + XXXXXXX, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Gaming + * ,-----------------------------------------------------------------------------------. + * | Grve | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Shft | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shft | Z | X | C | V | B | N | M | , | . | / | Entr | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Ctrl | Alt | Alt |Lower | Space | Raise| Left | Down | Up | Rght | + * `-----------------------------------------------------------------------------------' + */ +[_GAMING] = LAYOUT_preonic_grid( + 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_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_LSFT, 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_LCTL, KC_LCTL, KC_LALT, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | Esc | F1 | F2 | F3 | F4 | F5 | F6 | | * | / | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | VolD | Up | VolU | | | 7 | 8 | 9 | - | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | Left | Down | Rght | | | 4 | 5 | 6 | + | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | Prev | Play | Skip | | | 1 | 2 | 3 | = | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | Supr | | | 0 | Home |PageDn|PageUp| End | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_preonic_grid( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_PAST, KC_PSLS, XXXXXXX, KC_DEL, \ + _______, XXXXXXX, KC_VOLD, KC_UP, KC_VOLU, XXXXXXX, XXXXXXX, KC_7, KC_8, KC_9, KC_PMNS, KC_BSPC, \ + _______, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, KC_4, KC_5, KC_6, KC_PPLS, XXXXXXX, \ + _______, XXXXXXX, KC_MRWD, KC_MPLY, KC_MFFD, XXXXXXX, XXXXXXX, KC_1, KC_2, KC_3, KC_PEQL, KC_ENT, \ + _______, _______, _______, KC_LGUI, _______, _______, _______, KC_0, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | F12 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | \ | | | / | | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | [ | { | ( | < | > | ) | } | ] | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | + | - | _ | = | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | |Qwerty| Game | | Reset| + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_preonic_grid( + KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11 , \ + _______, XXXXXXX, XXXXXXX, XXXXXXX, KC_BSLS, XXXXXXX, XXXXXXX, KC_PSLS, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ + _______, KC_PIPE, KC_LBRC, KC_LCBR, KC_LPRN, KC_LABK, KC_RABK, KC_RPRN, KC_RCBR, KC_RBRC, KC_PIPE, XXXXXXX, \ + _______, XXXXXXX, XXXXXXX, XXXXXXX, KC_PPLS, KC_PMNS, KC_UNDS, KC_EQL, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, QWERTY , GAMING, XXXXXXX, RESET \ +) + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + } else { + layer_off(_LOWER); + } + return false; + break; + + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + } else { + layer_off(_RAISE); + } + return false; + break; + + case GAMING: + if (record->event.pressed) { + set_single_persistent_default_layer(_GAMING); + } + return false; + break; + + } + return true; +}; + +// NFI how to bring this inline with current QMK standards yet, or it's redundant and don't use it. +// #ifdef AUDIO_ENABLE +// float tone_startup[][2] = { +// {NOTE_D5, 8}, +// {NOTE_E6, 8}, +// {NOTE_D6, 8}, +// {NOTE_E5, 8} +// }; + +// void startup_user() +// { +// _delay_ms(20); // gets rid of tick +// PLAY_SONG(tone_startup); +// } +// #endif diff --git a/keyboards/preonic/keymaps/trigotometry/readme.md b/keyboards/preonic/keymaps/trigotometry/readme.md new file mode 100644 index 000000000000..aff01a22eae6 --- /dev/null +++ b/keyboards/preonic/keymaps/trigotometry/readme.md @@ -0,0 +1,75 @@ +# Trigotometry's v1.0 + +This layout is the confluence of the standard Preonic QWERTY layout and some of my own tweaks to make it's software as logical and straight cut as it's physical presence, at least in my eyes. Some might say there's wasted space, though possibly true, I believe in keeping it minimal and only adding what is really needed. So if, like me, you're also beginning your journey of coding and enjoy some downtime with friends on the battlefield I think you'll find this layout a stellar place to kick off your customisation. + +## Qwerty + /* Qwerty + * ,-----------------------------------------------------------------------------------. + * | GEsc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Shft | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |SFTENT| Z | X | C | V | B | N | M | , | . | / | ENT | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | Ctrl | Alt | Supr |Lower | Space | Raise| Left | Down | Up | Rght | + * `----------------------------------------------------------------------------------- + */ +Take note of the dual Enter keys, located where normally there'd be a pair of Shifts. I did this to ensure the alphas stayed in the same spot when compared to a staggered and standard board. My brain found it easier to switch the mods across keyboard than the relative position in the alphas, however it's easy to reverse the Enters/Shifts and you'll be back an (nearly) square one! + +Also, LEnter acts as a Shift if it's held. + + + +## Gaming + /* Gaming + * ,-----------------------------------------------------------------------------------. + * | Grve | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Shft | A | S | D | F | G | H | J | K | L | ; | " | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shft | Z | X | C | V | B | N | M | , | . | / | Entr | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | Ctrl | Alt | Alt |Lower | Space | Raise| Left | Down | Up | Rght | + * `-----------------------------------------------------------------------------------' + */ +Honestly it's pretty standard, however I've doubled up on the important modifiers and removed the Super. It's still accessable readily by holding Lower and the key to it's left. Neato? I thought so. + + + +## Raise Layer + /* Raise + * ,-----------------------------------------------------------------------------------. + * | F12 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | \ | | | / | | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | [ | { | ( | < | > | ) | } | ] | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | + | - | _ | = | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | |Qwerty| Game | | Reset| + * `-----------------------------------------------------------------------------------' + */ +Pretty self explanatory I think. + + + +## Lower Layer + /* Lower + * ,-----------------------------------------------------------------------------------. + * | Esc | F1 | F2 | F3 | F4 | F5 | F6 | | * | / | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | VolD | Up | VolU | | | 7 | 8 | 9 | - | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | Left | Down | Rght | | | 4 | 5 | 6 | + | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | Prev | Play | Skip | | | 1 | 2 | 3 | = | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | Supr | | | 0 | Home |PageDn|PageUp| End | + * `-----------------------------------------------------------------------------------' + */ + Music controls and arrows in prime location. F1-F6 there for extra mappings when in the Gaming layer. diff --git a/keyboards/preonic/keymaps/trigotometry/rules.mk b/keyboards/preonic/keymaps/trigotometry/rules.mk new file mode 100644 index 000000000000..a6bcd56379b4 --- /dev/null +++ b/keyboards/preonic/keymaps/trigotometry/rules.mk @@ -0,0 +1,2 @@ +#Build Options +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) From 6c6897f7789f67076ea2f3f9cfe47da814e599fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Fri, 19 Oct 2018 17:42:01 +0200 Subject: [PATCH 215/505] Keymap: Update whitefox/konstantin keymap (#4169) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * td_fn_ctrl_* → td_fn_rctl_* * Swap Fn and RCtrl * Change key combination for Command feature * Replace register/unregister_code call with tap_code * Add virtual desktop controls to keymap * Add/close virtual desktop on Fn+GUI tap dance --- .../whitefox/keymaps/konstantin/config.h | 3 ++ .../whitefox/keymaps/konstantin/keymap.c | 34 +++++++++++-------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/keyboards/whitefox/keymaps/konstantin/config.h b/keyboards/whitefox/keymaps/konstantin/config.h index ad40105a7c97..725609b465c7 100644 --- a/keyboards/whitefox/keymaps/konstantin/config.h +++ b/keyboards/whitefox/keymaps/konstantin/config.h @@ -12,3 +12,6 @@ #define MOUSEKEY_TIME_TO_MAX 50 #define MOUSEKEY_WHEEL_MAX_SPEED 1 #define MOUSEKEY_WHEEL_TIME_TO_MAX 50 + +#undef IS_COMMAND +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL))) diff --git a/keyboards/whitefox/keymaps/konstantin/keymap.c b/keyboards/whitefox/keymaps/konstantin/keymap.c index 6998798e3c72..247bc6bbffc0 100644 --- a/keyboards/whitefox/keymaps/konstantin/keymap.c +++ b/keyboards/whitefox/keymaps/konstantin/keymap.c @@ -2,9 +2,12 @@ #define FN MO(L_FN) #define FN_CAPS LT(L_FN, KC_CAPS) -#define FN_RCTL TD(TD_FN_RCTL) // Unused -#define RLALT TD(TD_RLALT) // Unused +#define FN_RCTL TD(TD_FN_RCTL) // Unused +#define RLALT TD(TD_RLALT) // Unused +#define DESKTOP TD(TD_DESKTOP) +#define DESKT_L LCTL(LGUI(KC_LEFT)) +#define DESKT_R LCTL(LGUI(KC_RGHT)) #define TOP LCTL(KC_HOME) #define BOTTOM LCTL(KC_END) @@ -46,8 +49,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) layer_invert(L_NUMPAD); bool num_lock = host_keyboard_leds() & 1<count & 1) { layer_on(L_FN); } if (state->count & 2) { register_code(KC_RCTL); } } -void td_fn_ctrl_reset(qk_tap_dance_state_t *state, void *user_data) +void td_fn_rctl_reset(qk_tap_dance_state_t *state, void *user_data) { if (state->count & 1) { layer_off(L_FN); } if (state->count & 2) { unregister_code(KC_RCTL); } } qk_tap_dance_action_t tap_dance_actions[] = { - [TD_FN_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_fn_ctrl_finished, td_fn_ctrl_reset), + [TD_FN_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_fn_rctl_finished, td_fn_rctl_reset), [TD_RLALT] = ACTION_TAP_DANCE_DOUBLE(KC_RALT, KC_LALT), + [TD_DESKTOP] = ACTION_TAP_DANCE_DOUBLE(LCTL(LGUI(KC_D)), LCTL(LGUI(KC_F4))), // Add/close virtual desktop }; const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -89,17 +93,17 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |---------------------------------------------------------------| * |FnCaps| A | S | D | F | G | H | J | K | L | ; | ' | Enter |PgU| * |---------------------------------------------------------------| - * | LShift | Z | X | C | V | B | N | M | , | . | / | Fn | ↑ |PgD| + * | LShift | Z | X | C | V | B | N | M | , | . | / |RCtrl | ↑ |PgD| * |---------------------------------------------------------------| - * |LCtl|LGui|LAlt| Space |RAlt|RCtl| | ← | ↓ | → | + * |LCtl|LGui|LAlt| Space |RAlt| Fn | | ← | ↓ | → | * `---------------------------------------------------------------' */ [L_BASE] = LAYOUT_truefox( \ 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_PSCR, \ 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_DEL, \ FN_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,FN, KC_UP, KC_PGDN, \ - KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RCTL, KC_UP, KC_PGDN, \ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,FN, KC_LEFT,KC_DOWN,KC_RGHT \ ), /* Function layer @@ -110,17 +114,17 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |---------------------------------------------------------------| * | |M← |M↓ |M→ |MW↑| | | | | | | | |Top| * |---------------------------------------------------------------| - * | |MA0|MA2|MW←|MW→| | | |VoD|VoU|Mut| |PgU|Btm| + * | |MA0|MA2|MW←|MW→| | | |VoD|VoU|Mut| App |PgU|Btm| * |---------------------------------------------------------------| - * | | | | MW↓ | |Menu| |Hom|PgD|End| + * | |Dstp|Dst←| MW↓ |Dst→| | |Hom|PgD|End| * `---------------------------------------------------------------' */ [L_FN] = LAYOUT_truefox( \ _______,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, NUMPAD, KC_SLCK,KC_PAUS, \ KC_BTN4,KC_BTN2,KC_MS_U,KC_BTN1,KC_BTN3,KC_BTN5,_______,_______,_______,KC_MSTP,KC_MPLY,KC_MPRV,KC_MNXT,CLEAR, KC_INS, \ _______,KC_MS_L,KC_MS_D,KC_MS_R,KC_WH_U,_______,_______,_______,_______,_______,_______,_______, _______, TOP, \ - _______, KC_ACL0,KC_ACL2,KC_WH_L,KC_WH_R,_______,_______,_______,KC_VOLD,KC_VOLU,KC_MUTE,_______, KC_PGUP,BOTTOM, \ - _______,_______,_______, KC_WH_D, _______,KC_APP, KC_HOME,KC_PGDN,KC_END \ + _______, KC_ACL0,KC_ACL2,KC_WH_L,KC_WH_R,_______,_______,_______,KC_VOLD,KC_VOLU,KC_MUTE,KC_APP, KC_PGUP,BOTTOM, \ + _______,DESKTOP,DESKT_L, KC_WH_D, DESKT_R,_______, KC_HOME,KC_PGDN,KC_END \ ), /* Numpad layer From efc88a0b16055dc0b2f94da8c46ea8fadeab70f4 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 20 Oct 2018 02:43:55 +1100 Subject: [PATCH 216/505] Keymap: qwerty_code_friendly: use numpad layout for f-keys (#4170) --- .../ergodox/qwerty_code_friendly/keymap.c | 26 +++++++++---------- .../ergodox/qwerty_code_friendly/readme.md | 13 ++++++---- lib/chibios-contrib | 2 +- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/layouts/community/ergodox/qwerty_code_friendly/keymap.c b/layouts/community/ergodox/qwerty_code_friendly/keymap.c index f882d0e0026b..2a441be0e6bf 100644 --- a/layouts/community/ergodox/qwerty_code_friendly/keymap.c +++ b/layouts/community/ergodox/qwerty_code_friendly/keymap.c @@ -403,16 +403,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, K80(L1K2), K80(L1K3), KC_TRNS, KC_TRNS, KC_TRNS ), -/* Keymap 2: Numbers, media and mouse keys +/* Keymap 2: FKeys, media & mouse keys * * .--------------------------------------------------. .--------------------------------------------------. - * | | 1 | 2 | 3 | 4 | 5 | | | Mute | 6 | 7 | 8 | 9 | 0 | | + * | | | | | | | | | Mute | | F10 | F11 | F12 | | | * |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| - * | | | | MsUp | | |MWhlUp| |VolUp | | | | | | | + * | | | | MsUp | | |MWhlUp| |VolUp | | F7 | F8 | F9 | | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| - * | | |MsLeft|MsDown|MsRght| |------| |------| Left | Down | Up |Right | | | + * | | |MsLeft|MsDown|MsRght| |------| |------| | F4 | F5 | F6 | | | * |--------+------+------+------+------+------|MWhlDn| |VolDn |------+------+------+------+------+--------| - * | | | Rclk | Mclk | Lclk | | | | | | | | | | | + * | | | Rclk | Mclk | Lclk | | | | | | F1 | F2 | F3 | | | * '--------+------+------+------+------+-------------' '-------------+------+------+------+------+--------' * | | | | | | | | | | | | * '----------------------------------' '----------------------------------' @@ -427,7 +427,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* MEDIA, MOUSE & NUMBERS */ [LAYER_MDIA] = LAYOUT_ergodox_76_or_80( /* left hand */ - KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_WH_U, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN2, KC_BTN3, KC_BTN1, KC_TRNS, KC_WH_D, @@ -436,10 +436,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { K80(L2K0), K80(L2K1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, /* right hand */ - KC_MUTE, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, - KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TRNS, KC_TRNS, - KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_MUTE, KC_TRNS, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, + KC_VOLU, KC_TRNS, KC_F7, KC_F8, KC_F9, KC_TRNS, KC_TRNS, + KC_TRNS, KC_F4, KC_F5, KC_F6, KC_TRNS, KC_TRNS, + KC_VOLD, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MRWD, KC_MFFD, KC_MPRV, K80(L2K2), K80(L2K3), @@ -448,7 +448,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 3: Entire Words (one for each key) * * .--------------------------------------------------. .--------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | | + * | | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | | * |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| * | | Q | W | E | R | T | | | | Y | U | I | O | P | | * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| @@ -470,7 +470,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* FKEY & WORDS */ [LAYER_FKEY] = LAYOUT_ergodox_76_or_80( /* left hand */ - KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, + KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_TRNS, M_WORD_Q, M_WORD_W, M_WORD_E, M_WORD_R, M_WORD_T, KC_TRNS, KC_TRNS, M_WORD_A, M_WORD_S, M_WORD_D, M_WORD_F, M_WORD_G, KC_TRNS, M_WORD_Z, M_WORD_X, M_WORD_C, M_WORD_V, M_WORD_B, KC_TRNS, @@ -479,7 +479,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { K80(L3K0), K80(L3K1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, /* right hand */ - KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, + KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, KC_TRNS, M_WORD_Y, M_WORD_U, M_WORD_I, M_WORD_O, M_WORD_P, KC_TRNS, M_WORD_H, M_WORD_J, M_WORD_K, M_WORD_L, KC_TRNS, KC_TRNS, KC_TRNS, M_WORD_N, M_WORD_M, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, diff --git a/layouts/community/ergodox/qwerty_code_friendly/readme.md b/layouts/community/ergodox/qwerty_code_friendly/readme.md index 8bc15dd310f1..23afa656f762 100644 --- a/layouts/community/ergodox/qwerty_code_friendly/readme.md +++ b/layouts/community/ergodox/qwerty_code_friendly/readme.md @@ -131,13 +131,13 @@ Notes: ``` .--------------------------------------------------. .--------------------------------------------------. -| | 1 | 2 | 3 | 4 | 5 | | | Mute | 6 | 7 | 8 | 9 | 0 | | +| | | | | | | | | Mute | | F10 | F11 | F12 | | | |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| -| | | | MsUp | | |MWhlUp| |VolUp | | | | | | | +| | | | MsUp | | |MWhlUp| |VolUp | | F7 | F8 | F9 | | | |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| -| | |MsLeft|MsDown|MsRght| |------| |------| Left | Down | Up |Right | | | +| | |MsLeft|MsDown|MsRght| |------| |------| | F4 | F5 | F6 | | | |--------+------+------+------+------+------|MWhlDn| |VolDn |------+------+------+------+------+--------| -| | | Rclk | Mclk | Lclk | | | | | | | | | | | +| | | Rclk | Mclk | Lclk | | | | | | F1 | F2 | F3 | | | '--------+------+------+------+------+-------------' '-------------+------+------+------+------+--------' | | | | | | | | | | | | '----------------------------------' '----------------------------------' @@ -158,7 +158,7 @@ eg: `-DCFQ_WORD_E=\"my@email.com\"` ``` .--------------------------------------------------. .--------------------------------------------------. -| | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | | +| | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | | |--------+------+------+------+------+------+------| |------+------+------+------+------+------+--------| | | Q | W | E | R | T | | | | Y | U | I | O | P | | |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| @@ -179,6 +179,9 @@ eg: `-DCFQ_WORD_E=\"my@email.com\"` ## Changelog +- 2018/10/19 + Move F-Keys to numpad like layout. + - 2018/05/29 Add number keys for cases when keypad numbers are handled differently. diff --git a/lib/chibios-contrib b/lib/chibios-contrib index ede48346eee4..2de67e2f4a26 160000 --- a/lib/chibios-contrib +++ b/lib/chibios-contrib @@ -1 +1 @@ -Subproject commit ede48346eee4b8d6847c19bc01420bee76a5e486 +Subproject commit 2de67e2f4a268eae072c5fd76a1b160124cee4f6 From 78b48371aac3bc4ba468c9f7efcb742bafb81965 Mon Sep 17 00:00:00 2001 From: Kosuke Adachi Date: Sat, 20 Oct 2018 01:12:55 +0900 Subject: [PATCH 217/505] Keyboard: Update logo and commonize it (#4151) * Update logo and commonize it * Move the glcdfont.c to the lib and add it to the SRC values of the rules.mk in the keymap folders * Add static --- keyboards/crkbd/keymaps/default/rules.mk | 15 +- keyboards/crkbd/keymaps/drashna/glcdfont.c | 244 ------------------ keyboards/crkbd/keymaps/drashna/rules.mk | 15 +- keyboards/crkbd/keymaps/like_jis/glcdfont.c | 244 ------------------ keyboards/crkbd/keymaps/like_jis/keymap.c | 6 +- keyboards/crkbd/keymaps/like_jis/rules.mk | 15 +- .../crkbd/{keymaps/default => lib}/glcdfont.c | 113 ++++---- keyboards/crkbd/ssd1306.c | 3 +- 8 files changed, 85 insertions(+), 570 deletions(-) delete mode 100644 keyboards/crkbd/keymaps/drashna/glcdfont.c delete mode 100644 keyboards/crkbd/keymaps/like_jis/glcdfont.c rename keyboards/crkbd/{keymaps/default => lib}/glcdfont.c (76%) diff --git a/keyboards/crkbd/keymaps/default/rules.mk b/keyboards/crkbd/keymaps/default/rules.mk index 0edf1181f0ea..5ee01e89e1fa 100644 --- a/keyboards/crkbd/keymaps/default/rules.mk +++ b/keyboards/crkbd/keymaps/default/rules.mk @@ -4,24 +4,25 @@ # 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 = no # Audio control and System control(+450) +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 +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 = 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. -SWAP_HANDS_ENABLE = no # Enable one-hand typing +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SWAP_HANDS_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 # If you want to change the display of OLED, you need to change here -SRC += ./lib/rgb_state_reader.c \ +SRC += ./lib/glcdfont.c \ + ./lib/rgb_state_reader.c \ ./lib/layer_state_reader.c \ ./lib/logo_reader.c \ ./lib/keylogger.c \ diff --git a/keyboards/crkbd/keymaps/drashna/glcdfont.c b/keyboards/crkbd/keymaps/drashna/glcdfont.c deleted file mode 100644 index 4e7b27bc0c93..000000000000 --- a/keyboards/crkbd/keymaps/drashna/glcdfont.c +++ /dev/null @@ -1,244 +0,0 @@ -// 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, 0x00, -0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, -0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, -0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, -0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00, -0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00, -0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, -0x00, 0x18, 0x3C, 0x18, 0x00, 0x00, -0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, -0x00, 0x18, 0x24, 0x18, 0x00, 0x00, -0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00, -0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00, -0x26, 0x29, 0x79, 0x29, 0x26, 0x00, -0x40, 0x7F, 0x05, 0x05, 0x07, 0x00, -0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00, -0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00, -0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00, -0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00, -0x14, 0x22, 0x7F, 0x22, 0x14, 0x00, -0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00, -0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, -0x00, 0x66, 0x89, 0x95, 0x6A, 0x00, -0x60, 0x60, 0x60, 0x60, 0x60, 0x00, -0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00, -0x08, 0x04, 0x7E, 0x04, 0x08, 0x00, -0x10, 0x20, 0x7E, 0x20, 0x10, 0x00, -0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, -0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, -0x1E, 0x10, 0x10, 0x10, 0x10, 0x00, -0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00, -0x30, 0x38, 0x3E, 0x38, 0x30, 0x00, -0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, -0x00, 0x07, 0x00, 0x07, 0x00, 0x00, -0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, -0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, -0x23, 0x13, 0x08, 0x64, 0x62, 0x00, -0x36, 0x49, 0x56, 0x20, 0x50, 0x00, -0x00, 0x08, 0x07, 0x03, 0x00, 0x00, -0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, -0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, -0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00, -0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, -0x00, 0x80, 0x70, 0x30, 0x00, 0x00, -0x08, 0x08, 0x08, 0x08, 0x08, 0x00, -0x00, 0x00, 0x60, 0x60, 0x00, 0x00, -0x20, 0x10, 0x08, 0x04, 0x02, 0x00, -0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, -0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, -0x72, 0x49, 0x49, 0x49, 0x46, 0x00, -0x21, 0x41, 0x49, 0x4D, 0x33, 0x00, -0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, -0x27, 0x45, 0x45, 0x45, 0x39, 0x00, -0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00, -0x41, 0x21, 0x11, 0x09, 0x07, 0x00, -0x36, 0x49, 0x49, 0x49, 0x36, 0x00, -0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, -0x00, 0x00, 0x14, 0x00, 0x00, 0x00, -0x00, 0x40, 0x34, 0x00, 0x00, 0x00, -0x00, 0x08, 0x14, 0x22, 0x41, 0x00, -0x14, 0x14, 0x14, 0x14, 0x14, 0x00, -0x00, 0x41, 0x22, 0x14, 0x08, 0x00, -0x02, 0x01, 0x59, 0x09, 0x06, 0x00, -0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00, -0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00, -0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, -0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, -0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, -0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, -0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, -0x3E, 0x41, 0x41, 0x51, 0x73, 0x00, -0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, -0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, -0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, -0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, -0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, -0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00, -0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, -0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, -0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, -0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, -0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, -0x26, 0x49, 0x49, 0x49, 0x32, 0x00, -0x03, 0x01, 0x7F, 0x01, 0x03, 0x00, -0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, -0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, -0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, -0x63, 0x14, 0x08, 0x14, 0x63, 0x00, -0x03, 0x04, 0x78, 0x04, 0x03, 0x00, -0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, -0x00, 0x7F, 0x41, 0x41, 0x41, 0x00, -0x02, 0x04, 0x08, 0x10, 0x20, 0x00, -0x00, 0x41, 0x41, 0x41, 0x7F, 0x00, -0x04, 0x02, 0x01, 0x02, 0x04, 0x00, -0x40, 0x40, 0x40, 0x40, 0x40, 0x00, -0x00, 0x03, 0x07, 0x08, 0x00, 0x00, -0x20, 0x54, 0x54, 0x78, 0x40, 0x00, -0x7F, 0x28, 0x44, 0x44, 0x38, 0x00, -0x38, 0x44, 0x44, 0x44, 0x28, 0x00, -0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, -0x38, 0x54, 0x54, 0x54, 0x18, 0x00, -0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, -0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00, -0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, -0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, -0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, -0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, -0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, -0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, -0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, -0x38, 0x44, 0x44, 0x44, 0x38, 0x00, -0xFC, 0x18, 0x24, 0x24, 0x18, 0x00, -0x18, 0x24, 0x24, 0x18, 0xFC, 0x00, -0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, -0x48, 0x54, 0x54, 0x54, 0x24, 0x00, -0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, -0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, -0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, -0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, -0x44, 0x28, 0x10, 0x28, 0x44, 0x00, -0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00, -0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, -0x00, 0x08, 0x36, 0x41, 0x00, 0x00, -0x00, 0x00, 0x77, 0x00, 0x00, 0x00, -0x00, 0x41, 0x36, 0x08, 0x00, 0x00, -0x02, 0x01, 0x02, 0x04, 0x02, 0x00, -0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0E, 0x3F, 0xFF, 0xFF, -0xFF, 0xFF, 0xFE, 0xE0, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x1E, 0xBE, -0x7F, 0xFF, 0xFF, 0xFE, 0xFE, 0xF0, -0xE0, 0xC0, 0x80, 0x00, 0x0E, 0xEF, -0xDF, 0xDE, 0xBE, 0x3C, 0x38, 0x70, -0xE0, 0xDD, 0xBB, 0x7B, 0x07, 0x0E, -0x0E, 0x0C, 0x98, 0xF0, 0xE0, 0xF0, -0xF0, 0xF8, 0x78, 0x3C, 0x1C, 0x1E, -0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, -0x1F, 0xFE, 0xFE, 0xF8, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC, -0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00, -0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E, -0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00, -0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B, -0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00, -0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE, -0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x03, -0x0F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFE, -0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x7F, -0xFF, 0xFE, 0xFD, 0xFB, 0x1B, 0x07, -0x07, 0x0F, 0x1F, 0x1F, 0x1E, 0x1D, -0x0B, 0x07, 0x01, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, -0xF8, 0xFE, 0xFF, 0xFF, 0x1F, 0x07, -0x01, 0x01, 0x01, 0x03, 0x06, 0x06, -0x0C, 0x0C, 0x08, 0x0C, 0x0C, 0x0E, -0x07, 0x83, 0xC1, 0xE0, 0x70, 0x30, -0x18, 0x1C, 0x7C, 0xCC, 0x8C, 0xDC, -0xF8, 0xC0, 0xE0, 0xE0, 0x70, 0xB8, -0xF0, 0x60, 0x00, 0x00, 0x80, 0xC0, -0xE0, 0xF0, 0x70, 0xF8, 0xFC, 0xFC, -0x3C, 0x30, 0x38, 0xF8, 0xF8, 0xF8, -0x78, 0x00, 0x80, 0x80, 0xC0, 0xE0, -0x70, 0x38, 0x38, 0x9C, 0xDC, 0xFC, -0x7C, 0x38, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F, -0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00, -0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F, -0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00, -0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20, -0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00, -0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F, -0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x03, 0x07, -0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, -0x7E, 0x7D, 0x3B, 0x17, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -0x0F, 0x1F, 0x3F, 0x3F, 0x7E, 0x7C, -0x78, 0x70, 0x70, 0x70, 0x70, 0x70, -0x70, 0x78, 0x38, 0x18, 0x1C, 0x0E, -0x07, 0x0F, 0x1F, 0x3F, 0x3C, 0x38, -0x38, 0x18, 0x0C, 0x06, 0x03, 0x01, -0x01, 0x01, 0x01, 0x0E, 0x1F, 0x1F, -0x1C, 0x1C, 0x1E, 0x0F, 0x0F, 0x03, -0x1D, 0x0E, 0x07, 0x03, 0x01, 0x00, -0x00, 0x0E, 0x1F, 0x1F, 0x1D, 0x1E, -0x0F, 0x07, 0x03, 0x03, 0x0F, 0x1F, -0x1F, 0x19, 0x19, 0x19, 0x19, 0x0C, -0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -#endif // FONT5X7_H diff --git a/keyboards/crkbd/keymaps/drashna/rules.mk b/keyboards/crkbd/keymaps/drashna/rules.mk index f490aa2ea84f..8fca70448964 100644 --- a/keyboards/crkbd/keymaps/drashna/rules.mk +++ b/keyboards/crkbd/keymaps/drashna/rules.mk @@ -4,24 +4,25 @@ # 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 = 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 -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 +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. -SWAP_HANDS_ENABLE = no # Enable one-hand typing +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SWAP_HANDS_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 # If you want to change the display of OLED, you need to change here -SRC += ./lib/rgb_state_reader.c \ +SRC += ./lib/glcdfont.c \ + ./lib/rgb_state_reader.c \ ./lib/layer_state_reader.c \ ./lib/logo_reader.c \ ./lib/keylogger.c \ diff --git a/keyboards/crkbd/keymaps/like_jis/glcdfont.c b/keyboards/crkbd/keymaps/like_jis/glcdfont.c deleted file mode 100644 index 4e7b27bc0c93..000000000000 --- a/keyboards/crkbd/keymaps/like_jis/glcdfont.c +++ /dev/null @@ -1,244 +0,0 @@ -// 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, 0x00, -0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, -0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, -0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00, -0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00, -0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00, -0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, -0x00, 0x18, 0x3C, 0x18, 0x00, 0x00, -0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, -0x00, 0x18, 0x24, 0x18, 0x00, 0x00, -0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00, -0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00, -0x26, 0x29, 0x79, 0x29, 0x26, 0x00, -0x40, 0x7F, 0x05, 0x05, 0x07, 0x00, -0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00, -0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00, -0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00, -0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00, -0x14, 0x22, 0x7F, 0x22, 0x14, 0x00, -0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00, -0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00, -0x00, 0x66, 0x89, 0x95, 0x6A, 0x00, -0x60, 0x60, 0x60, 0x60, 0x60, 0x00, -0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00, -0x08, 0x04, 0x7E, 0x04, 0x08, 0x00, -0x10, 0x20, 0x7E, 0x20, 0x10, 0x00, -0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00, -0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00, -0x1E, 0x10, 0x10, 0x10, 0x10, 0x00, -0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00, -0x30, 0x38, 0x3E, 0x38, 0x30, 0x00, -0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, -0x00, 0x07, 0x00, 0x07, 0x00, 0x00, -0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00, -0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, -0x23, 0x13, 0x08, 0x64, 0x62, 0x00, -0x36, 0x49, 0x56, 0x20, 0x50, 0x00, -0x00, 0x08, 0x07, 0x03, 0x00, 0x00, -0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, -0x00, 0x41, 0x22, 0x1C, 0x00, 0x00, -0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00, -0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, -0x00, 0x80, 0x70, 0x30, 0x00, 0x00, -0x08, 0x08, 0x08, 0x08, 0x08, 0x00, -0x00, 0x00, 0x60, 0x60, 0x00, 0x00, -0x20, 0x10, 0x08, 0x04, 0x02, 0x00, -0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, -0x00, 0x42, 0x7F, 0x40, 0x00, 0x00, -0x72, 0x49, 0x49, 0x49, 0x46, 0x00, -0x21, 0x41, 0x49, 0x4D, 0x33, 0x00, -0x18, 0x14, 0x12, 0x7F, 0x10, 0x00, -0x27, 0x45, 0x45, 0x45, 0x39, 0x00, -0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00, -0x41, 0x21, 0x11, 0x09, 0x07, 0x00, -0x36, 0x49, 0x49, 0x49, 0x36, 0x00, -0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, -0x00, 0x00, 0x14, 0x00, 0x00, 0x00, -0x00, 0x40, 0x34, 0x00, 0x00, 0x00, -0x00, 0x08, 0x14, 0x22, 0x41, 0x00, -0x14, 0x14, 0x14, 0x14, 0x14, 0x00, -0x00, 0x41, 0x22, 0x14, 0x08, 0x00, -0x02, 0x01, 0x59, 0x09, 0x06, 0x00, -0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00, -0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00, -0x7F, 0x49, 0x49, 0x49, 0x36, 0x00, -0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, -0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00, -0x7F, 0x49, 0x49, 0x49, 0x41, 0x00, -0x7F, 0x09, 0x09, 0x09, 0x01, 0x00, -0x3E, 0x41, 0x41, 0x51, 0x73, 0x00, -0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, -0x00, 0x41, 0x7F, 0x41, 0x00, 0x00, -0x20, 0x40, 0x41, 0x3F, 0x01, 0x00, -0x7F, 0x08, 0x14, 0x22, 0x41, 0x00, -0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, -0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00, -0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00, -0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, -0x7F, 0x09, 0x09, 0x09, 0x06, 0x00, -0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00, -0x7F, 0x09, 0x19, 0x29, 0x46, 0x00, -0x26, 0x49, 0x49, 0x49, 0x32, 0x00, -0x03, 0x01, 0x7F, 0x01, 0x03, 0x00, -0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00, -0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00, -0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00, -0x63, 0x14, 0x08, 0x14, 0x63, 0x00, -0x03, 0x04, 0x78, 0x04, 0x03, 0x00, -0x61, 0x59, 0x49, 0x4D, 0x43, 0x00, -0x00, 0x7F, 0x41, 0x41, 0x41, 0x00, -0x02, 0x04, 0x08, 0x10, 0x20, 0x00, -0x00, 0x41, 0x41, 0x41, 0x7F, 0x00, -0x04, 0x02, 0x01, 0x02, 0x04, 0x00, -0x40, 0x40, 0x40, 0x40, 0x40, 0x00, -0x00, 0x03, 0x07, 0x08, 0x00, 0x00, -0x20, 0x54, 0x54, 0x78, 0x40, 0x00, -0x7F, 0x28, 0x44, 0x44, 0x38, 0x00, -0x38, 0x44, 0x44, 0x44, 0x28, 0x00, -0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, -0x38, 0x54, 0x54, 0x54, 0x18, 0x00, -0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, -0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00, -0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, -0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, -0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, -0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, -0x00, 0x41, 0x7F, 0x40, 0x00, 0x00, -0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, -0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, -0x38, 0x44, 0x44, 0x44, 0x38, 0x00, -0xFC, 0x18, 0x24, 0x24, 0x18, 0x00, -0x18, 0x24, 0x24, 0x18, 0xFC, 0x00, -0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, -0x48, 0x54, 0x54, 0x54, 0x24, 0x00, -0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, -0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00, -0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00, -0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00, -0x44, 0x28, 0x10, 0x28, 0x44, 0x00, -0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00, -0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, -0x00, 0x08, 0x36, 0x41, 0x00, 0x00, -0x00, 0x00, 0x77, 0x00, 0x00, 0x00, -0x00, 0x41, 0x36, 0x08, 0x00, 0x00, -0x02, 0x01, 0x02, 0x04, 0x02, 0x00, -0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0E, 0x3F, 0xFF, 0xFF, -0xFF, 0xFF, 0xFE, 0xE0, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x1E, 0xBE, -0x7F, 0xFF, 0xFF, 0xFE, 0xFE, 0xF0, -0xE0, 0xC0, 0x80, 0x00, 0x0E, 0xEF, -0xDF, 0xDE, 0xBE, 0x3C, 0x38, 0x70, -0xE0, 0xDD, 0xBB, 0x7B, 0x07, 0x0E, -0x0E, 0x0C, 0x98, 0xF0, 0xE0, 0xF0, -0xF0, 0xF8, 0x78, 0x3C, 0x1C, 0x1E, -0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, -0x1F, 0xFE, 0xFE, 0xF8, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC, -0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00, -0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E, -0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00, -0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B, -0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00, -0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE, -0xDE, 0xD7, 0xDC, 0x00, 0xC0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x03, -0x0F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFE, -0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x7F, -0xFF, 0xFE, 0xFD, 0xFB, 0x1B, 0x07, -0x07, 0x0F, 0x1F, 0x1F, 0x1E, 0x1D, -0x0B, 0x07, 0x01, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, -0xF8, 0xFE, 0xFF, 0xFF, 0x1F, 0x07, -0x01, 0x01, 0x01, 0x03, 0x06, 0x06, -0x0C, 0x0C, 0x08, 0x0C, 0x0C, 0x0E, -0x07, 0x83, 0xC1, 0xE0, 0x70, 0x30, -0x18, 0x1C, 0x7C, 0xCC, 0x8C, 0xDC, -0xF8, 0xC0, 0xE0, 0xE0, 0x70, 0xB8, -0xF0, 0x60, 0x00, 0x00, 0x80, 0xC0, -0xE0, 0xF0, 0x70, 0xF8, 0xFC, 0xFC, -0x3C, 0x30, 0x38, 0xF8, 0xF8, 0xF8, -0x78, 0x00, 0x80, 0x80, 0xC0, 0xE0, -0x70, 0x38, 0x38, 0x9C, 0xDC, 0xFC, -0x7C, 0x38, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F, -0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00, -0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F, -0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00, -0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20, -0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00, -0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F, -0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x03, 0x07, -0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, -0x7E, 0x7D, 0x3B, 0x17, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -0x0F, 0x1F, 0x3F, 0x3F, 0x7E, 0x7C, -0x78, 0x70, 0x70, 0x70, 0x70, 0x70, -0x70, 0x78, 0x38, 0x18, 0x1C, 0x0E, -0x07, 0x0F, 0x1F, 0x3F, 0x3C, 0x38, -0x38, 0x18, 0x0C, 0x06, 0x03, 0x01, -0x01, 0x01, 0x01, 0x0E, 0x1F, 0x1F, -0x1C, 0x1C, 0x1E, 0x0F, 0x0F, 0x03, -0x1D, 0x0E, 0x07, 0x03, 0x01, 0x00, -0x00, 0x0E, 0x1F, 0x1F, 0x1D, 0x1E, -0x0F, 0x07, 0x03, 0x03, 0x0F, 0x1F, -0x1F, 0x19, 0x19, 0x19, 0x19, 0x0C, -0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -#endif // FONT5X7_H diff --git a/keyboards/crkbd/keymaps/like_jis/keymap.c b/keyboards/crkbd/keymaps/like_jis/keymap.c index 90e5b7ec17cf..05d31845c831 100644 --- a/keyboards/crkbd/keymaps/like_jis/keymap.c +++ b/keyboards/crkbd/keymaps/like_jis/keymap.c @@ -109,7 +109,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { int RGB_current_mode; // Setting ADJUST layer RGB back to default -inline void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { +static inline void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { layer_on(layer3); } else { @@ -155,7 +155,7 @@ void matrix_scan_user(void) { iota_gfx_task(); } -inline void matrix_render_user(struct CharacterMatrix *matrix) { +static inline void matrix_render_user(struct CharacterMatrix *matrix) { if (is_master) { // If you want to change the display of OLED, you need to change here matrix_write_ln(matrix, read_layer_state()); @@ -171,7 +171,7 @@ inline void matrix_render_user(struct CharacterMatrix *matrix) { } } -inline void matrix_update(struct CharacterMatrix *dest, const struct CharacterMatrix *source) { +static inline 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; diff --git a/keyboards/crkbd/keymaps/like_jis/rules.mk b/keyboards/crkbd/keymaps/like_jis/rules.mk index 0edf1181f0ea..5ee01e89e1fa 100644 --- a/keyboards/crkbd/keymaps/like_jis/rules.mk +++ b/keyboards/crkbd/keymaps/like_jis/rules.mk @@ -4,24 +4,25 @@ # 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 = no # Audio control and System control(+450) +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 +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 = 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. -SWAP_HANDS_ENABLE = no # Enable one-hand typing +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +SWAP_HANDS_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 # If you want to change the display of OLED, you need to change here -SRC += ./lib/rgb_state_reader.c \ +SRC += ./lib/glcdfont.c \ + ./lib/rgb_state_reader.c \ ./lib/layer_state_reader.c \ ./lib/logo_reader.c \ ./lib/keylogger.c \ diff --git a/keyboards/crkbd/keymaps/default/glcdfont.c b/keyboards/crkbd/lib/glcdfont.c similarity index 76% rename from keyboards/crkbd/keymaps/default/glcdfont.c rename to keyboards/crkbd/lib/glcdfont.c index 4e7b27bc0c93..f7567c57c6c8 100644 --- a/keyboards/crkbd/keymaps/default/glcdfont.c +++ b/keyboards/crkbd/lib/glcdfont.c @@ -14,8 +14,7 @@ #endif // Standard ASCII 5x7 font - -static const unsigned char font[] PROGMEM = { +const unsigned char font[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00, 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00, @@ -119,7 +118,7 @@ static const unsigned char font[] PROGMEM = { 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00, 0x38, 0x54, 0x54, 0x54, 0x18, 0x00, 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00, -0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00, +0x18, 0x24, 0x24, 0x1C, 0x78, 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00, 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00, @@ -128,8 +127,8 @@ static const unsigned char font[] PROGMEM = { 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, -0xFC, 0x18, 0x24, 0x24, 0x18, 0x00, -0x18, 0x24, 0x24, 0x18, 0xFC, 0x00, +0x7C, 0x18, 0x24, 0x24, 0x18, 0x00, +0x18, 0x24, 0x24, 0x18, 0x7C, 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00, 0x48, 0x54, 0x54, 0x54, 0x24, 0x00, 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00, @@ -145,24 +144,24 @@ static const unsigned char font[] PROGMEM = { 0x02, 0x01, 0x02, 0x04, 0x02, 0x00, 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x0E, 0x3F, 0xFF, 0xFF, -0xFF, 0xFF, 0xFE, 0xE0, 0x80, 0x00, -0x00, 0x00, 0x00, 0x00, 0x1E, 0xBE, -0x7F, 0xFF, 0xFF, 0xFE, 0xFE, 0xF0, -0xE0, 0xC0, 0x80, 0x00, 0x0E, 0xEF, -0xDF, 0xDE, 0xBE, 0x3C, 0x38, 0x70, -0xE0, 0xDD, 0xBB, 0x7B, 0x07, 0x0E, -0x0E, 0x0C, 0x98, 0xF0, 0xE0, 0xF0, -0xF0, 0xF8, 0x78, 0x3C, 0x1C, 0x1E, -0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, -0x1F, 0xFE, 0xFE, 0xF8, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, +0xF0, 0xF8, 0xF8, 0x18, 0x00, 0xC0, +0xF0, 0xFC, 0xFE, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0xC0, 0xE0, 0xE0, +0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, +0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, +0x80, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, +0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0x80, +0x00, 0x00, 0x00, 0xE0, 0xE0, 0xC0, +0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0x00, +0x00, 0xE0, 0xE0, 0xC0, 0xC0, 0xE0, +0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0x80, +0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, +0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, +0xE0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC, @@ -177,25 +176,25 @@ static const unsigned char font[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x01, 0x03, -0x0F, 0x3F, 0xFF, 0xFF, 0xFF, 0xFE, -0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x7F, -0xFF, 0xFE, 0xFD, 0xFB, 0x1B, 0x07, -0x07, 0x0F, 0x1F, 0x1F, 0x1E, 0x1D, -0x0B, 0x07, 0x01, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, -0xF8, 0xFE, 0xFF, 0xFF, 0x1F, 0x07, -0x01, 0x01, 0x01, 0x03, 0x06, 0x06, -0x0C, 0x0C, 0x08, 0x0C, 0x0C, 0x0E, -0x07, 0x83, 0xC1, 0xE0, 0x70, 0x30, -0x18, 0x1C, 0x7C, 0xCC, 0x8C, 0xDC, -0xF8, 0xC0, 0xE0, 0xE0, 0x70, 0xB8, -0xF0, 0x60, 0x00, 0x00, 0x80, 0xC0, -0xE0, 0xF0, 0x70, 0xF8, 0xFC, 0xFC, -0x3C, 0x30, 0x38, 0xF8, 0xF8, 0xF8, -0x78, 0x00, 0x80, 0x80, 0xC0, 0xE0, -0x70, 0x38, 0x38, 0x9C, 0xDC, 0xFC, -0x7C, 0x38, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xF8, 0xFC, 0xFE, +0xFF, 0xE0, 0x00, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x1F, 0x07, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x81, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x81, +0xC3, 0xC3, 0xC3, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x81, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x81, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x01, 0x00, +0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x9D, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, +0x1C, 0x9D, 0xDF, 0xDF, 0xDF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00, @@ -209,25 +208,25 @@ static const unsigned char font[] PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x0F, 0x1F, +0x3F, 0x3F, 0x3F, 0x3F, 0x1F, 0x1F, +0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x3F, +0x3F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F, +0x7F, 0x7C, 0x78, 0x78, 0x38, 0x1C, +0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x03, 0x07, 0x07, +0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +0x03, 0x01, 0x00, 0x00, 0x00, 0x00, +0x01, 0x03, 0x07, 0x07, 0x07, 0x07, +0x07, 0x07, 0x07, 0x07, 0x03, 0x01, +0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x01, 0x03, 0x07, -0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, -0x7E, 0x7D, 0x3B, 0x17, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x07, 0x07, 0x07, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x07, 0x07, +0x07, 0x00, 0x00, 0x00, 0x01, 0x03, +0x07, 0x07, 0x07, 0x07, 0x07, 0x07, +0x07, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -0x0F, 0x1F, 0x3F, 0x3F, 0x7E, 0x7C, -0x78, 0x70, 0x70, 0x70, 0x70, 0x70, -0x70, 0x78, 0x38, 0x18, 0x1C, 0x0E, -0x07, 0x0F, 0x1F, 0x3F, 0x3C, 0x38, -0x38, 0x18, 0x0C, 0x06, 0x03, 0x01, -0x01, 0x01, 0x01, 0x0E, 0x1F, 0x1F, -0x1C, 0x1C, 0x1E, 0x0F, 0x0F, 0x03, -0x1D, 0x0E, 0x07, 0x03, 0x01, 0x00, -0x00, 0x0E, 0x1F, 0x1F, 0x1D, 0x1E, -0x0F, 0x07, 0x03, 0x03, 0x0F, 0x1F, -0x1F, 0x19, 0x19, 0x19, 0x19, 0x0C, -0x0C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, diff --git a/keyboards/crkbd/ssd1306.c b/keyboards/crkbd/ssd1306.c index b8f9512e3fb0..205ce67a9e00 100644 --- a/keyboards/crkbd/ssd1306.c +++ b/keyboards/crkbd/ssd1306.c @@ -4,7 +4,6 @@ #include "i2c.h" #include #include "print.h" -#include "glcdfont.c" #ifdef ADAFRUIT_BLE_ENABLE #include "adafruit_ble.h" #endif @@ -14,6 +13,8 @@ #include "sendchar.h" #include "timer.h" +static const unsigned char font[] PROGMEM; + // 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 From 9ca73a9edcb8cfaeba13baae16b8c8cc5c9fafe6 Mon Sep 17 00:00:00 2001 From: Andy Date: Fri, 19 Oct 2018 19:57:44 +0200 Subject: [PATCH 218/505] Keymap: Add dz60 iso-de layout (#4173) --- .../dz60/keymaps/iso_de_andys8/README.md | 3 ++ keyboards/dz60/keymaps/iso_de_andys8/keymap.c | 38 +++++++++++++++++++ keyboards/dz60/keymaps/iso_de_andys8/rules.mk | 15 ++++++++ 3 files changed, 56 insertions(+) create mode 100644 keyboards/dz60/keymaps/iso_de_andys8/README.md create mode 100644 keyboards/dz60/keymaps/iso_de_andys8/keymap.c create mode 100644 keyboards/dz60/keymaps/iso_de_andys8/rules.mk diff --git a/keyboards/dz60/keymaps/iso_de_andys8/README.md b/keyboards/dz60/keymaps/iso_de_andys8/README.md new file mode 100644 index 000000000000..504726adf511 --- /dev/null +++ b/keyboards/dz60/keymaps/iso_de_andys8/README.md @@ -0,0 +1,3 @@ +# ISO DE layout + +This layout is ISO-DE and similar to a standard 60 ISO layout. There are vim style arrow keys on the function layer. The bottom right is the expected default. diff --git a/keyboards/dz60/keymaps/iso_de_andys8/keymap.c b/keyboards/dz60/keymaps/iso_de_andys8/keymap.c new file mode 100644 index 000000000000..3039914c6f68 --- /dev/null +++ b/keyboards/dz60/keymaps/iso_de_andys8/keymap.c @@ -0,0 +1,38 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* ISO 60 layout by andys8 (ISO German keyboard layout shown) + * + * This layout starts from a standard ISO 60% layout, and adds a function layer. + * + * ,-----------------------------------------------------------------------------------------. + * | Esc | 1 ! | 2 " | 3 § | 4 $ | 5 % | 6 & | 7 / | 8 ( | 9 ) | 0 = | ß ? | ´ ` | Backspace | + * |-----------------------------------------------------------------------------------------| + * | Tab | Q | W | E | R | T | Z | U | I | O | P | Ä | + * | Enter | + * |---------------------------------------------------------------------------------- | + * | Layer_1 | A | S | D | F | G | H | J | K | L | Ö | Ü | # ' | | + * |-----------------------------------------------------------------------------------------| + * | Shift | < > | Y | X | C | V | B | N | M | , ; | . : | - _ | Shift | + * |-----------------------------------------------------------------------------------------| + * | LCtl | LGUI | LAlt | Space | RAlt | RGUI | App | RCtl | + * `-----------------------------------------------------------------------------------------' + */ + LAYOUT_60_iso( + 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, + MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, + 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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL + ), + + + LAYOUT_60_iso( + 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_NO, KC_NO, KC_NO, KC_NO, RESET, KC_NO, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_PSCR, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_END, KC_DEL, KC_NO, KC_NO, + KC_LSFT, BL_TOGG, KC_APP, KC_PAUS, KC_INS, KC_NO, KC_MPLY, KC_MSTP, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + ), + +}; diff --git a/keyboards/dz60/keymaps/iso_de_andys8/rules.mk b/keyboards/dz60/keymaps/iso_de_andys8/rules.mk new file mode 100644 index 000000000000..b5f45d7aa89c --- /dev/null +++ b/keyboards/dz60/keymaps/iso_de_andys8/rules.mk @@ -0,0 +1,15 @@ +# Build Options +# comment out to disable the options. +# +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 # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = no +AUTO_SHIFT_ENABLE = no # If the time depressed is greater than or equal to the AUTO_SHIFT_TIMEOUT, then a shifted version of the key is emitted. If the time is less than the AUTO_SHIFT_TIMEOUT time, then the normal state is emitted +TAP_DANCE_ENABLE = no From 6f6d28fa8d81063691d2fd11540675eaa5b6989c Mon Sep 17 00:00:00 2001 From: wanleg <32079073+wanleg@users.noreply.github.com> Date: Fri, 19 Oct 2018 11:01:40 -0700 Subject: [PATCH 219/505] Big Switch and 5x5 edits (#4168) * 4x4 - pro micro version * pro-micro setup on 4x4 * tap dance LCTL/RESET key * remove test file * more research * revert a couple un-intended edits * opt_defs version of adding custom rules.mk variables * cleanup * cleanup * cleanup * cleanup * layout edits * layout edits * keymap edit * numpad layout change * got tap dance layer-switch working * keymap changes * temporary revert * restore previous settings * misc fixes * layer order change * fix layout matrix * Update tapdances.c * playing around with triple tap dance * sync with upstream * quick edit * tapdance cleanup * mod tap interrupt * tapping term edit * tapping term adjust * 5x5 board edits * set gherkin tapping term * big switch tap dance edit * tapping term refinements * 5x10 layout setup * add audio for bigswitch * keymap change * keymap change & created testing board * sound setup for big_switch * more big switch size testing * bigswitch testing finished * final touch-ups --- keyboards/5x5/5x5.h | 4 +- keyboards/bigswitch/bigswitch.c | 2 + keyboards/bigswitch/keymaps/wanleg/config.h | 11 +- keyboards/bigswitch/keymaps/wanleg/keymap.c | 9 +- keyboards/bigswitch/keymaps/wanleg/rules.mk | 15 +- layouts/community/ortho_3x10/wanleg/readme.md | 9 +- layouts/community/ortho_5x10/wanleg/config.h | 9 - layouts/community/ortho_5x10/wanleg/keymap.c | 38 --- layouts/community/ortho_5x10/wanleg/rules.mk | 3 - layouts/community/ortho_5x15/wanleg/config.h | 11 +- layouts/community/ortho_5x15/wanleg/keymap.c | 89 +++++-- layouts/community/ortho_5x5/layout.json | 1 + layouts/community/ortho_5x5/readme.md | 3 + users/wanleg/config.h | 18 +- users/wanleg/rules.mk | 4 +- users/wanleg/tapdances.c | 246 ++++++++++-------- users/wanleg/wanleg.c | 6 + users/wanleg/wanleg.h | 39 ++- 18 files changed, 305 insertions(+), 212 deletions(-) delete mode 100644 layouts/community/ortho_5x10/wanleg/config.h delete mode 100644 layouts/community/ortho_5x10/wanleg/keymap.c delete mode 100644 layouts/community/ortho_5x10/wanleg/rules.mk create mode 100644 layouts/community/ortho_5x5/layout.json create mode 100644 layouts/community/ortho_5x5/readme.md diff --git a/keyboards/5x5/5x5.h b/keyboards/5x5/5x5.h index cbfc28a9014c..45fb80a4f757 100644 --- a/keyboards/5x5/5x5.h +++ b/keyboards/5x5/5x5.h @@ -35,7 +35,7 @@ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, ___, ___, ___, ___, ___}, \ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, ___, ___, ___, ___, ___}, \ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, ___, ___, ___, ___, ___}, \ - { K30, K31, K32, K33, K34, K35, K35, K37, K38, K39, ___, ___, ___, ___, ___}, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, ___, ___, ___, ___, ___}, \ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, ___, ___, ___, ___, ___} \ } @@ -50,7 +50,7 @@ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0a, K0b, K0c, K0d, K0e}, \ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, K1c, K1d, K1e}, \ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, K2c, K2d, K2e}, \ - { K30, K31, K32, K33, K34, K35, K35, K37, K38, K39, K3a, K3b, K3c, K3d, K3e}, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, K3d, K3e}, \ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4a, K4b, K4c, K4d, K4e} \ } diff --git a/keyboards/bigswitch/bigswitch.c b/keyboards/bigswitch/bigswitch.c index b924c7017cc2..32f9f7fab82a 100644 --- a/keyboards/bigswitch/bigswitch.c +++ b/keyboards/bigswitch/bigswitch.c @@ -26,10 +26,12 @@ void matrix_init_user(void) { __attribute__ ((weak)) void matrix_scan_user(void) { +#if defined(RGBLIGHT_ENABLE) if (runonce && timer_elapsed(my_timer) > 1000) { runonce = false; rgblight_sethsv_noeeprom(0x0, 0xff, 0x80); rgblight_mode_noeeprom(9); rgblight_enable_noeeprom(); } +#endif } diff --git a/keyboards/bigswitch/keymaps/wanleg/config.h b/keyboards/bigswitch/keymaps/wanleg/config.h index f1e169345714..8ac82f40d99f 100644 --- a/keyboards/bigswitch/keymaps/wanleg/config.h +++ b/keyboards/bigswitch/keymaps/wanleg/config.h @@ -21,7 +21,6 @@ #define MATRIX_ROW_PINS { B4 } #undef MATRIX_COL_PINS #define MATRIX_COL_PINS { B6 } -//#define UNUSED_PINS /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #undef DIODE_DIRECTION @@ -32,14 +31,12 @@ #define BACKLIGHT_LEVELS 3 #define BREATHING_PERIOD 5 -/* for Tap Dance */ -#undef TAPPING_TERM -#define TAPPING_TERM 700 - /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ -//#define DEBOUNCING_DELAY 5 #undef DEBOUNCING_DELAY -#define DEBOUNCING_DELAY 2 +#define DEBOUNCING_DELAY 5 // set flashing LED with QMK DFU #define QMK_LED B0 + +// set audio pin +#define C6_AUDIO diff --git a/keyboards/bigswitch/keymaps/wanleg/keymap.c b/keyboards/bigswitch/keymaps/wanleg/keymap.c index 7f4150e58164..76d0808fda9a 100644 --- a/keyboards/bigswitch/keymaps/wanleg/keymap.c +++ b/keyboards/bigswitch/keymaps/wanleg/keymap.c @@ -20,8 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( /* Base */ TD(CAD_TD) \ ), -}; - -void led_set_user(uint8_t usb_led) { - -} +[1] = LAYOUT( /*Secondary*/ +TD(BSW_TAP_DANCE) \ +), +}; \ No newline at end of file diff --git a/keyboards/bigswitch/keymaps/wanleg/rules.mk b/keyboards/bigswitch/keymaps/wanleg/rules.mk index bc4a1873f845..a6c7d1d3f0e6 100644 --- a/keyboards/bigswitch/keymaps/wanleg/rules.mk +++ b/keyboards/bigswitch/keymaps/wanleg/rules.mk @@ -1,7 +1,16 @@ -BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default - #If using a ProMicro and it has the QMK DFU bootloader instead of Caterina, #run "make : dfu=qmk" when compiling to ensure it is flagged properly after being flashed ifeq ($(strip $(dfu)), qmk) BOOTLOADER = qmk-dfu -endif \ No newline at end of file +endif + +AUDIO_ENABLE = yes # Audio output on port C6 +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) \ No newline at end of file diff --git a/layouts/community/ortho_3x10/wanleg/readme.md b/layouts/community/ortho_3x10/wanleg/readme.md index ef6c1f9dbb68..8696cccf6bfe 100644 --- a/layouts/community/ortho_3x10/wanleg/readme.md +++ b/layouts/community/ortho_3x10/wanleg/readme.md @@ -1,13 +1,10 @@ ![Gherkin Wanleg Layout Image](https://i.imgur.com/nCPog2W.png) # Gherkin Wanleg Layout This is the layout I came up with to preserve a standard QWERTY 104 key ANSI layout as much as possible, in as few layers as possible for a 30 key board. -I originally set up a few Tap Dance keys, but dropped half of them in favor of chorded versions since in actual use, they tended to impede typing speed more than their current two-key versions. -I've left them in my `keymap.c` ready for use if anyone wants to try them out: +Here are the two Tap Dance keys I've set up for this board: -Legend Name | Single Tap | Double Tap | Hold ---- | --- | --- | --- -*null* | space | enter | shift -*null* | backspace | delete | control +Legend Name | Single Tap | Double Tap | Hold +--- | --- | --- | --- Sft//Cp | shift | caps lock | *null* Q//Esc | KC_Q | escape | *null* diff --git a/layouts/community/ortho_5x10/wanleg/config.h b/layouts/community/ortho_5x10/wanleg/config.h deleted file mode 100644 index 2d24f2771b18..000000000000 --- a/layouts/community/ortho_5x10/wanleg/config.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -//QMK DFU settings (ProMicro boards) -// set top left key as bootloader mode escape key on Gherkin -#if defined(KEYBOARD_5x5) -#define QMK_LED B0 -#define QMK_ESC_OUTPUT D7 // usually COL -#define QMK_ESC_INPUT B2 // usually ROW -#endif diff --git a/layouts/community/ortho_5x10/wanleg/keymap.c b/layouts/community/ortho_5x10/wanleg/keymap.c deleted file mode 100644 index 5d06e53ae4c8..000000000000 --- a/layouts/community/ortho_5x10/wanleg/keymap.c +++ /dev/null @@ -1,38 +0,0 @@ -#include QMK_KEYBOARD_H -#include "wanleg.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[gGK] = LAYOUT_ortho_5x10_wrapper( - _______________Gherkin_NUM_0_______________, - _______________Gherkin_Row_0_______________, - _______________Gherkin_Row_1_______________, - _______________Gherkin_Row_2_______________, - _______, _______, _______, gNUMBER, gETCETERA, KC_SPC,gDIRECTION, KC_RGUI, _______, _______ -), - - -[gNUM] = LAYOUT_ortho_5x10_wrapper( - _______________Gherkin_NUM_0_______________, - _______________Gherkin_NUM_0_______________, - _______________Gherkin_NUM_1_______________, - _______________Gherkin_NUM_2_______________, - _______, _______, _______, _______, _______, KC_ENT, KC_RSFT, KC_RGUI, _______, _______ -), - -[gDIR] = LAYOUT_ortho_5x10_wrapper( - _______________Gherkin_NUM_0_______________, - _______________Gherkin_DIR_0_______________, - _______________Gherkin_DIR_1_______________, - _______________Gherkin_DIR_2_______________, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ -), - -[gETC] = LAYOUT_ortho_5x10_wrapper( - _______________Gherkin_NUM_0_______________, - _______________Gherkin_ETC_0_______________, - _______________Gherkin_ETC_1_______________, - _______________Gherkin_ETC_2_______________, - _______, _______, _______, _______, _______, LALT(LCTL(KC_DEL)), _______, _______, _______, _______ -), - -}; diff --git a/layouts/community/ortho_5x10/wanleg/rules.mk b/layouts/community/ortho_5x10/wanleg/rules.mk deleted file mode 100644 index 90841d2abeda..000000000000 --- a/layouts/community/ortho_5x10/wanleg/rules.mk +++ /dev/null @@ -1,3 +0,0 @@ -SWAP_HANDS_ENABLE = no - -BOOTLOADER = qmk-dfu \ No newline at end of file diff --git a/layouts/community/ortho_5x15/wanleg/config.h b/layouts/community/ortho_5x15/wanleg/config.h index a55fc6a3ebc2..1043986f7a66 100644 --- a/layouts/community/ortho_5x15/wanleg/config.h +++ b/layouts/community/ortho_5x15/wanleg/config.h @@ -1,3 +1,8 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H -#endif +#pragma once + +// set top left key as bootloader mode escape key on 5x5 75key layout +#if defined(KEYBOARD_5x5) && !defined(PRO_MICRO) +#define QMK_LED B0 +#define QMK_ESC_OUTPUT D7 // usually COL +#define QMK_ESC_INPUT B2 // usually ROW +#endif \ No newline at end of file diff --git a/layouts/community/ortho_5x15/wanleg/keymap.c b/layouts/community/ortho_5x15/wanleg/keymap.c index 7731edb6a2a3..df7424115705 100644 --- a/layouts/community/ortho_5x15/wanleg/keymap.c +++ b/layouts/community/ortho_5x15/wanleg/keymap.c @@ -2,30 +2,36 @@ #include "wanleg.h" #define _________________BLANK_75__________________ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +#define _________________BLANK_50__________________ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ #define _________________Num_Row_75________________ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NLCK const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - /* QWERTY 75 - * .--------------------------------------------------------------------------------------------------------------------------------------. - * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | NUMLOCK| gherkin| | FN | - * |-----------------------------------------------------------------------------------------------------------+--------+--------+--------| - * | | 7 | 8 | 9 | - * | |--------+--------+--------| - * | 4x12 QWERTY LAYOUT | 4 | 5 | 6 | - * | |--------+--------+--------| - * | | 1 | 2 | 3 | - * | |--------+--------+--------| - * | | 0 | 0 | . | - * '--------------------------------------------------------------------------------------------------------------------------------------' - */ -[QW75] = LAYOUT_ortho_5x15_wrapper( - _________________Num_Row_75________________, GHERKIN75, XXXXXXX, FUNCTION75, - _______________Qwerty_Row__0_______________, KC_KP_7, KC_KP_8, KC_KP_9, - _______________Qwerty_Row__1_______________, KC_KP_4, KC_KP_5, KC_KP_6, - _______________Qwerty_Row__2_______________, KC_KP_1, KC_KP_2, KC_KP_3, - KC_LCTL, KC_LGUI, KC_LALT, KC_LALT, SUBTER75, KC_LSFT, KC_SPC, SUPRA75, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL, KC_KP_0, KC_KP_0, KC_KP_DOT +#if defined(KEYBOARD_5x5) +[GK75] = LAYOUT_ortho_5x15_wrapper( + _________________Num_Row_75________________, QWERTY75, XXXXXXX, FUNCTION75, + _______________GherkinLike_0_______________, KC_KP_7, KC_KP_8, KC_KP_9, + _______________GherkinLike_1_______________, KC_KP_4, KC_KP_5, KC_KP_6, + TD(TD_SFT_CAPS), SFT_T(KC_Z), KC_X, KC_C, LT(NUM75, KC_V), LT(ETC75, KC_B), KC_N, LT(DIR75, KC_M), GUI_T(KC_COMM), ALT_T(KC_DOT), CTL_T(KC_BSPC), SFT_T(KC_ENT), KC_KP_1, KC_KP_2, KC_KP_3, + TD(RST_TAP_DANCE), GHERKIN50, KC_LALT, NUMPAD, NUMBER75, ETCETERA75, KC_SPC,DIRECTION75, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL, KC_KP_0, KC_KP_0, KC_KP_DOT +), + +[PAD] = LAYOUT_ortho_5x5_wrapper( + _______, _______, _______, _______, _______, + _______________NUMPAD_Row__0_______________, _______, + _______________NUMPAD_Row__1_______________, _______, + _______________NUMPAD_Row__2_______________, _______, + KC_KP_0, TD(LYR50_TAP_DANCE), KC_KP_DOT, KC_PMNS, _______ +), + +[GK50] = LAYOUT_ortho_5x10_wrapper( + KC_ESC, _______, _______, _______, _______, _______, _______, _______, _______, KC_BSPC, + _______________Gherkin_Row_0_______________, + _______________Gherkin_Row_1_______________, + _______________Gherkin_Row_2_______________, + TD(RST_TAP_DANCE), GHERKIN75, NUMPAD, gNUMBER, gETCETERA, KC_SPC,gDIRECTION, KC_RGUI, KC_RALT, KC_RGUI ), +#else /* Gherkin 75 * .--------------------------------------------------------------------------------------------------------------------------------------. * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | NUMLOCK| qwerty | | FN | @@ -46,6 +52,27 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TD(TD_SFT_CAPS), SFT_T(KC_Z), KC_X, KC_C, LT(NUM75, KC_V), LT(ETC75, KC_B), KC_N, LT(DIR75, KC_M), GUI_T(KC_COMM), ALT_T(KC_DOT), CTL_T(KC_BSPC), SFT_T(KC_ENT), KC_KP_1, KC_KP_2, KC_KP_3, KC_LCTL, KC_LGUI, KC_LALT, KC_LALT, NUMBER75, ETCETERA75, KC_SPC,DIRECTION75, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL, KC_KP_0, KC_KP_0, KC_KP_DOT ), +#endif + /* QWERTY 75 + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | NUMLOCK| gherkin| | FN | + * |-----------------------------------------------------------------------------------------------------------+--------+--------+--------| + * | | 7 | 8 | 9 | + * | |--------+--------+--------| + * | 4x12 QWERTY LAYOUT | 4 | 5 | 6 | + * | |--------+--------+--------| + * | | 1 | 2 | 3 | + * | |--------+--------+--------| + * | | 0 | 0 | . | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ +[QW75] = LAYOUT_ortho_5x15_wrapper( + _________________Num_Row_75________________, GHERKIN75, XXXXXXX, FUNCTION75, + _______________Qwerty_Row__0_______________, KC_KP_7, KC_KP_8, KC_KP_9, + _______________Qwerty_Row__1_______________, KC_KP_4, KC_KP_5, KC_KP_6, + _______________Qwerty_Row__2_______________, KC_KP_1, KC_KP_2, KC_KP_3, + KC_LCTL, KC_LGUI, KC_LALT, KC_LALT, SUBTER75, KC_LSFT, KC_SPC, SUPRA75, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL, KC_KP_0, KC_KP_0, KC_KP_DOT +), /* SUBTER75 * .--------------------------------------------------------------------------------------------------------------------------------------. @@ -173,4 +200,28 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, BL_TOGG, BL_INC, BL_DEC, _______, _______, KC_MS_U, KC_WH_D, _______, _______, _______, _______, _______, _______, KC_BTN1, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R ), + +[gNUM] = LAYOUT_ortho_5x10_wrapper( + _________________BLANK_50__________________, + _______________Gherkin_NUM_0_______________, + _______________Gherkin_NUM_1_______________, + _______________Gherkin_NUM_2_______________, + _______, _______, _______, _______, _______, KC_ENT, KC_RSFT, KC_RGUI, _______, _______ +), + +[gDIR] = LAYOUT_ortho_5x10_wrapper( + _________________BLANK_50__________________, + _______________Gherkin_DIR_0_______________, + _______________Gherkin_DIR_1_______________, + _______________Gherkin_DIR_2_______________, + _________________BLANK_50__________________ +), + +[gETC] = LAYOUT_ortho_5x10_wrapper( + _________________BLANK_50__________________, + _______________Gherkin_ETC_0_______________, + _______________Gherkin_ETC_1_______________, + _______________Gherkin_ETC_2_______________, + _______, KC_CAPS, _______, _______, _______, LALT(LCTL(KC_DEL)), _______, _______, _______, _______ +), }; diff --git a/layouts/community/ortho_5x5/layout.json b/layouts/community/ortho_5x5/layout.json new file mode 100644 index 000000000000..ab4eef8e1bc1 --- /dev/null +++ b/layouts/community/ortho_5x5/layout.json @@ -0,0 +1 @@ +["","","","",""],["","","","",""],["","","","",""],["","","","",""],["","","","",""] diff --git a/layouts/community/ortho_5x5/readme.md b/layouts/community/ortho_5x5/readme.md new file mode 100644 index 000000000000..3dd75765d19e --- /dev/null +++ b/layouts/community/ortho_5x5/readme.md @@ -0,0 +1,3 @@ +# ortho_5x5 + + LAYOUT_ortho_5x5 \ No newline at end of file diff --git a/users/wanleg/config.h b/users/wanleg/config.h index 28e7690e653f..f2e785659f96 100644 --- a/users/wanleg/config.h +++ b/users/wanleg/config.h @@ -2,8 +2,17 @@ #define USERSPACE_CONFIG_H //TAPPING_TERM -#ifdef TAP_DANCE_ENABLE -#define TAPPING_TERM 200 +//tapping term short (<100): on multi-purpose keys, slow taps may not register, but "holds" register easier. multi-tap keys may be difficult to activate. +//tapping term long (>200): holds don't register as easily - noticeable when typing quickly (e.g. shift doesn't want to engage.) +#if defined(TAP_DANCE_ENABLE) && defined(KEYBOARD_lets_split_rev2) +//Kailh Coppers activate quickly and don't need a long tapping term +#define TAPPING_TERM 100 + +#elif defined(TAP_DANCE_ENABLE) && defined(KEYBOARD_bigswitch) +#define TAPPING_TERM 700 + +#else +#define TAPPING_TERM 145 #endif //Mousekey Settings @@ -27,4 +36,9 @@ #define NO_ACTION_FUNCTION #define NO_ACTION_ONESHOT +// Disable mod tap interrrupt +#ifndef IGNORE_MOD_TAP_INTERRUPT +#define IGNORE_MOD_TAP_INTERRUPT +#endif // !mod tap interrrupt + #endif // !USERSPACE_CONFIG_H diff --git a/users/wanleg/rules.mk b/users/wanleg/rules.mk index 56304013153d..2a2a65cfea5c 100644 --- a/users/wanleg/rules.mk +++ b/users/wanleg/rules.mk @@ -9,8 +9,8 @@ ifeq ($(strip $(dfu)), qmk) BOOTLOADER = qmk-dfu endif -#use alternate settings for 4x4 board using ProMicro instead of Micro -#usage: make 4x4:wanleg PM=yes +#use alternate settings for boards using ProMicro instead of Micro +#example usage: make 4x4:wanleg PM=yes ifeq ($(strip $(PM)), yes) OPT_DEFS += -DPRO_MICRO endif diff --git a/users/wanleg/tapdances.c b/users/wanleg/tapdances.c index 0778bf5f7e8f..3878e6d31c23 100644 --- a/users/wanleg/tapdances.c +++ b/users/wanleg/tapdances.c @@ -1,6 +1,12 @@ //Tap Dance Settings #include "wanleg.h" +//audio settings for one of the tap dances below +#ifdef AUDIO_ENABLE + float lyrup_song[][2] = SONG(MUSIC_ON_SOUND); + float lyrdown_song[][2] = SONG(MUSIC_OFF_SOUND); +#endif + ///// QUAD FUNCTION TAP DANCE GENERAL SETUP SECTION START ///// ///// (no need to edit this section) ///// //Enums used to clearly convey the state of the tap dance @@ -9,7 +15,10 @@ enum { SINGLE_HOLD = 2, DOUBLE_TAP = 3, DOUBLE_HOLD = 4, - DOUBLE_SINGLE_TAP = 5 //send SINGLE_TAP twice - NOT DOUBLE_TAP + DOUBLE_SINGLE_TAP = 5, //send SINGLE_TAP twice - NOT DOUBLE_TAP + TRIPLE_TAP = 6, + TRIPLE_HOLD = 7, + TRIPLE_SINGLE_TAP = 8 // Add more enums here if you want for triple, quadruple, etc. }; @@ -32,69 +41,18 @@ int cur_dance (qk_tap_dance_state_t *state) { else if (state->pressed) return DOUBLE_HOLD; else return DOUBLE_TAP; } - else return 6; //magic number. At some point this method will expand to work for more presses -} -///// QUAD FUNCTION TAP DANCE GENERAL SETUP SECTION END ///// -///// QUAD FUNCTION TAP DANCE PERSONALIZATION SECTION START ///// -//instantiate 'tap' for the 'ENT' tap dance. -static tap ENTtap_state = { - .is_press_action = true, - .state = 0 -}; - -void ENT_finished (qk_tap_dance_state_t *state, void *user_data) { - ENTtap_state.state = cur_dance(state); - switch (ENTtap_state.state) { - case SINGLE_TAP: register_code(KC_SPC); break; - case SINGLE_HOLD: register_code(KC_LSFT); break; - case DOUBLE_TAP: register_code(KC_ENT); break; - case DOUBLE_HOLD: register_code(KC_NO); break; // setting double hold to do nothing (change this if you want) - case DOUBLE_SINGLE_TAP: register_code(KC_SPC); unregister_code(KC_SPC); register_code(KC_SPC); - //Last case is for fast typing. Assuming your key is `f`: - //For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`. - //In order to type `ff` when typing fast, the next character will have to be hit within the `TAPPING_TERM`, which by default is 200ms. - } -} - -void ENT_reset (qk_tap_dance_state_t *state, void *user_data) { - switch (ENTtap_state.state) { - case SINGLE_TAP: unregister_code(KC_SPC); break; - case SINGLE_HOLD: unregister_code(KC_LSFT); break; - case DOUBLE_TAP: unregister_code(KC_ENT); break; - case DOUBLE_HOLD: unregister_code(KC_NO); - case DOUBLE_SINGLE_TAP: unregister_code(KC_SPC); - } - ENTtap_state.state = 0; -} - -//instantiate 'tap' for the 'DEL' tap dance. -static tap DELtap_state = { - .is_press_action = true, - .state = 0 -}; - -void DEL_finished (qk_tap_dance_state_t *state, void *user_data) { - DELtap_state.state = cur_dance(state); - switch (DELtap_state.state) { - case SINGLE_TAP: register_code(KC_BSPC); break; - case SINGLE_HOLD: register_code(KC_LCTL); break; - case DOUBLE_TAP: register_code(KC_DEL); break; - case DOUBLE_HOLD: register_code(KC_NO); break; - case DOUBLE_SINGLE_TAP: register_code(KC_BSPC); unregister_code(KC_BSPC); register_code(KC_BSPC); - } -} -void DEL_reset (qk_tap_dance_state_t *state, void *user_data) { - switch (DELtap_state.state) { - case SINGLE_TAP: unregister_code(KC_BSPC); break; - case SINGLE_HOLD: unregister_code(KC_LCTL); break; - case DOUBLE_TAP: unregister_code(KC_DEL); break; - case DOUBLE_HOLD: unregister_code(KC_NO); - case DOUBLE_SINGLE_TAP: unregister_code(KC_BSPC); + //If count = 3, and it has been interrupted - assume that user is trying to type the letter associated + //with double tap. + else if (state->count == 3) { + if (state->interrupted) return TRIPLE_SINGLE_TAP; + else if (state->pressed) return TRIPLE_HOLD; + else return TRIPLE_TAP; } - DELtap_state.state = 0; + else return 9; //magic number. At some point this method will expand to work for more presses } - +///// QUAD FUNCTION TAP DANCE GENERAL SETUP SECTION END ///// +///// QUAD FUNCTION TAP DANCE PERSONALIZATION SECTION START ///// //instantiate 'tap' for the 'CAD' tap dance. static tap CADtap_state = { .is_press_action = true, @@ -104,14 +62,14 @@ static tap CADtap_state = { void CAD_finished (qk_tap_dance_state_t *state, void *user_data) { CADtap_state.state = cur_dance(state); switch (CADtap_state.state) { - case SINGLE_TAP: - //register_code(KC_SPC); + case SINGLE_TAP: + //register_code(KC_SPC); SEND_STRING(SS_LGUI("l")); #ifdef BACKLIGHT_ENABLE - backlight_set(3); + backlight_level(3); #endif break; - case SINGLE_HOLD: + case SINGLE_HOLD: //register_code(KC_NO); //take a screenshot of a single window, open Paint and paste SEND_STRING(SS_LALT(SS_TAP(X_PSCREEN)) SS_LGUI("r")); @@ -120,47 +78,37 @@ void CAD_finished (qk_tap_dance_state_t *state, void *user_data) { _delay_ms(700); SEND_STRING(SS_LCTRL("v")); break; //register this keycode when button is held - case DOUBLE_TAP: - //register_code(KC_ENT); + case DOUBLE_TAP: + //register_code(KC_ENT); SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_DELETE)))); #ifdef BACKLIGHT_ENABLE - backlight_set(0); + backlight_level(0); #endif break; //case DOUBLE_HOLD: register_code(KC_NO); break; //register this keycode when button is tapped and then held - case DOUBLE_HOLD: - reset_keyboard(); + case DOUBLE_HOLD: + reset_keyboard(); break; //register this keycode when button is tapped and then held - case DOUBLE_SINGLE_TAP: register_code(KC_NO); unregister_code(KC_NO); register_code(KC_NO); + case TRIPLE_TAP: + SEND_STRING("wanleg@github.com"); + break; + case TRIPLE_HOLD: + set_single_persistent_default_layer(1); + #ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(lyrup_song); + #endif + break; } } void CAD_reset (qk_tap_dance_state_t *state, void *user_data) { switch (CADtap_state.state) { - case SINGLE_TAP: - //unregister_code(KC_SPC); - SEND_STRING(SS_LGUI("l")); - #ifdef BACKLIGHT_ENABLE - backlight_set(3); - #endif - break; - case SINGLE_HOLD: - register_code(KC_NO); //(un)register this keycode when button is held and then released - //SEND_STRING(SS_LCTRL("v")); - break; - case DOUBLE_TAP: - //register_code(KC_ENT); - SEND_STRING(SS_LCTRL(SS_LALT(SS_TAP(X_DELETE)))); - #ifdef BACKLIGHT_ENABLE - backlight_set(0); - #endif - break; - case DOUBLE_HOLD: register_code(KC_NO); //(un)register this keycode when button is tapped and then held, and then released - case DOUBLE_SINGLE_TAP: unregister_code(KC_NO); +//nothing to do } CADtap_state.state = 0; -} - +} + //instantiate 'tap' for the 'RST' tap dance. static tap RSTtap_state = { .is_press_action = true, @@ -173,21 +121,18 @@ void RST_finished (qk_tap_dance_state_t *state, void *user_data) { case SINGLE_TAP: register_code(KC_LCTL); break; case SINGLE_HOLD: register_code(KC_LCTL); break; case DOUBLE_TAP: reset_keyboard(); break; - case DOUBLE_HOLD: register_code(KC_NO); break; - case DOUBLE_SINGLE_TAP: register_code(KC_LCTL); unregister_code(KC_LCTL); register_code(KC_LCTL); + case DOUBLE_SINGLE_TAP: register_code(KC_LCTL); unregister_code(KC_LCTL); register_code(KC_LCTL); break; } -} +} void RST_reset (qk_tap_dance_state_t *state, void *user_data) { switch (RSTtap_state.state) { case SINGLE_TAP: unregister_code(KC_LCTL); break; case SINGLE_HOLD: unregister_code(KC_LCTL); break; - case DOUBLE_TAP: unregister_code(KC_NO); break; - case DOUBLE_HOLD: unregister_code(KC_NO); - case DOUBLE_SINGLE_TAP: unregister_code(KC_LCTL); + case DOUBLE_SINGLE_TAP: unregister_code(KC_LCTL); break; } RSTtap_state.state = 0; -} +} //instantiate 'tap' for the 'LYR' tap dance. static tap LYRtap_state = { @@ -199,23 +144,106 @@ void LYR_finished (qk_tap_dance_state_t *state, void *user_data) { LYRtap_state.state = cur_dance(state); switch (LYRtap_state.state) { case SINGLE_TAP: register_code(KC_PSLS); break; - case SINGLE_HOLD: register_code(KC_NO); break; case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break; - case DOUBLE_HOLD: register_code(KC_NO); break; case DOUBLE_SINGLE_TAP: register_code(KC_PSLS); unregister_code(KC_PSLS); register_code(KC_PSLS); } -} +} void LYR_reset (qk_tap_dance_state_t *state, void *user_data) { switch (LYRtap_state.state) { case SINGLE_TAP: unregister_code(KC_PSLS); break; - case SINGLE_HOLD: unregister_code(KC_NO); break; case DOUBLE_TAP: set_single_persistent_default_layer(_GK); break; - case DOUBLE_HOLD: unregister_code(KC_NO); case DOUBLE_SINGLE_TAP: unregister_code(KC_PSLS); } LYRtap_state.state = 0; -} +} + +//instantiate 'tap' for the 'LYR75' tap dance. +static tap LYR75tap_state = { + .is_press_action = true, + .state = 0 +}; + +void LYR75_finished (qk_tap_dance_state_t *state, void *user_data) { + LYR75tap_state.state = cur_dance(state); + switch (LYR75tap_state.state) { + case SINGLE_TAP: register_code(KC_PSLS); break; + case DOUBLE_TAP: set_single_persistent_default_layer(GK75); break; + case DOUBLE_SINGLE_TAP: register_code(KC_PSLS); unregister_code(KC_PSLS); register_code(KC_PSLS); + } +} + +void LYR75_reset (qk_tap_dance_state_t *state, void *user_data) { + switch (LYR75tap_state.state) { + case SINGLE_TAP: unregister_code(KC_PSLS); break; + case DOUBLE_TAP: set_single_persistent_default_layer(GK75); break; + case DOUBLE_SINGLE_TAP: unregister_code(KC_PSLS); + } + LYR75tap_state.state = 0; +} + +//instantiate 'tap' for the 'LYR50' tap dance. +static tap LYR50tap_state = { + .is_press_action = true, + .state = 0 +}; + +void LYR50_finished (qk_tap_dance_state_t *state, void *user_data) { + LYR50tap_state.state = cur_dance(state); + switch (LYR75tap_state.state) { + case SINGLE_TAP: register_code(KC_PSLS); break; + case DOUBLE_TAP: set_single_persistent_default_layer(GK50); break; + case DOUBLE_SINGLE_TAP: register_code(KC_PSLS); unregister_code(KC_PSLS); register_code(KC_PSLS); + } +} + +void LYR50_reset (qk_tap_dance_state_t *state, void *user_data) { + switch (LYR50tap_state.state) { + case SINGLE_TAP: unregister_code(KC_PSLS); break; + case DOUBLE_TAP: set_single_persistent_default_layer(GK50); break; + case DOUBLE_SINGLE_TAP: unregister_code(KC_PSLS); + } + LYR50tap_state.state = 0; +} + +//instantiate 'tap' for the 'BSW' tap dance. +static tap BSWtap_state = { + .is_press_action = true, + .state = 0 +}; + +void BSW_finished (qk_tap_dance_state_t *state, void *user_data) { + BSWtap_state.state = cur_dance(state); + switch (BSWtap_state.state) { + case SINGLE_TAP: register_code(KC_ENTER); break; + case SINGLE_HOLD: + set_single_persistent_default_layer(0); + #ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(lyrdown_song); + #endif + break; + case DOUBLE_TAP: + register_code(KC_LCTRL); + register_code(KC_C); + break; + case DOUBLE_HOLD: + reset_keyboard(); + break; //register this keycode when button is tapped and then held + } +} + +void BSW_reset (qk_tap_dance_state_t *state, void *user_data) { + switch (BSWtap_state.state) { + case SINGLE_TAP: unregister_code(KC_ENTER); break; + case DOUBLE_TAP: + unregister_code(KC_LCTRL); + unregister_code(KC_C); + break; + } + BSWtap_state.state = 0; +} + ///// QUAD FUNCTION TAP DANCE PERSONALIZATION SECTION END ///// //Tap Dance Definitions @@ -224,12 +252,12 @@ qk_tap_dance_action_t tap_dance_actions[] = { [TD_SFT_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS) // Other declarations would go here, separated by commas, if you have them ,[TD_Q_ESC] = ACTION_TAP_DANCE_DOUBLE(KC_Q, KC_ESC) - ,[ENT_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ENT_finished, ENT_reset) - ,[DEL_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, DEL_finished, DEL_reset) ,[RST_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, RST_finished, RST_reset) ,[CAD_TD] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, CAD_finished, CAD_reset) ,[LYR_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, LYR_finished, LYR_reset) - + ,[LYR75_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, LYR75_finished, LYR75_reset) + ,[LYR50_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, LYR50_finished, LYR50_reset) + ,[BSW_TAP_DANCE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, BSW_finished, BSW_reset) }; //In Layer declaration, add tap dance item in place of a key code diff --git a/users/wanleg/wanleg.c b/users/wanleg/wanleg.c index f22c34ba30fa..4e60c422fae2 100644 --- a/users/wanleg/wanleg.c +++ b/users/wanleg/wanleg.c @@ -47,6 +47,12 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; + case GHERKIN50: + if (record->event.pressed) { + set_single_persistent_default_layer(GK50); + } + return false; + break; case SUBTER: if (record->event.pressed) { layer_on(SUB); diff --git a/users/wanleg/wanleg.h b/users/wanleg/wanleg.h index 65028751a9ce..9e0cf3ee5d66 100644 --- a/users/wanleg/wanleg.h +++ b/users/wanleg/wanleg.h @@ -27,10 +27,12 @@ enum userspace_layers { ETC75, FN75, PAD, + GK50, }; #elif KEYBOARD_xd75 enum userspace_layers { GK75 = 0, + PAD, QW75, SUB75, SUP75, @@ -50,7 +52,32 @@ enum userspace_layers { gNUM, gDIR, gETC, + GK50, +}; +#elif KEYBOARD_5x5 +enum userspace_layers { + GK50 = 0, + gNUM, + gDIR, + gETC, + GK75, + QW75, + SUB75, + SUP75, + NUM75, + DIR75, + ETC75, + FN75, PAD, + gGK, + _GK, + _QW, + ONE, + SUB, + SUP, + NUM, + DIR, + ETC, }; #else enum userspace_layers { @@ -75,6 +102,7 @@ enum userspace_layers { DIR75, ETC75, FN75, + GK50, }; #endif @@ -100,6 +128,7 @@ enum userspace_custom_keycodes { ETCETERA75, FUNCTION75, NUMPAD, + GHERKIN50, }; @@ -108,11 +137,12 @@ enum userspace_custom_keycodes { enum { TD_SFT_CAPS = 0 ,TD_Q_ESC - ,ENT_TAP_DANCE - ,DEL_TAP_DANCE ,CAD_TD ,RST_TAP_DANCE ,LYR_TAP_DANCE + ,LYR50_TAP_DANCE + ,LYR75_TAP_DANCE + ,BSW_TAP_DANCE }; #endif @@ -130,6 +160,7 @@ enum { #define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) #define LAYOUT_ortho_5x15_wrapper(...) LAYOUT_ortho_5x15(__VA_ARGS__) #define LAYOUT_ortho_4x4_wrapper(...) LAYOUT_ortho_4x4(__VA_ARGS__) +#define LAYOUT_ortho_5x5_wrapper(...) LAYOUT_ortho_5x5(__VA_ARGS__) // Blocks for each of the major keyboard layouts // Organized so we can quickly adapt and modify all of them @@ -189,12 +220,12 @@ enum { * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | mLeft | mDown | mRight | | SHIFT | mBtn3 | mBtn1 | mBtn2 | ; | ' | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | Sft//Cp| | | | | C-A-D | mScrL | mScrR | ALT | DEL | + * | Sft//Cp| CAPS | | | | C-A-D | mScrL | mScrR | ALT | DEL | * '-----------------------------------------------------------------------------------------' */ #define _______________Gherkin_ETC_0_______________ KC_GRV, KC_MS_U, _______,_______, RESET, KC_RSFT, KC_WH_U, KC_WH_D, _______, KC_BSLS #define _______________Gherkin_ETC_1_______________ KC_MS_L, KC_MS_D, KC_MS_R,_______, KC_LSFT, KC_BTN3, KC_BTN1, KC_BTN2, KC_SCLN, KC_QUOT -#define _______________Gherkin_ETC_2_______________ TD(TD_SFT_CAPS),_______, _______,_______, _______, LALT(LCTL(KC_DEL)), KC_WH_L, KC_WH_R, KC_LALT, KC_DEL +#define _______________Gherkin_ETC_2_______________ TD(TD_SFT_CAPS),KC_CAPS, _______,_______, _______, LALT(LCTL(KC_DEL)), KC_WH_L, KC_WH_R, KC_LALT, KC_DEL /* Gherkin-Like * .-----------------------------------------------------------------------------------------------------------. From 0d1e0a0d972c77231062e2ff84742f168a6010a6 Mon Sep 17 00:00:00 2001 From: mcarni Date: Fri, 19 Oct 2018 21:05:34 +0200 Subject: [PATCH 220/505] added an ISO split spacebar layout, keymap and readme files (#4165) --- keyboards/dz60/dz60.h | 14 ++ keyboards/dz60/info.json | 4 + .../dz60/keymaps/iso_split-spacebar/README.md | 69 +++++++ .../dz60/keymaps/iso_split-spacebar/keymap.c | 193 ++++++++++++++++++ 4 files changed, 280 insertions(+) create mode 100644 keyboards/dz60/keymaps/iso_split-spacebar/README.md create mode 100644 keyboards/dz60/keymaps/iso_split-spacebar/keymap.c diff --git a/keyboards/dz60/dz60.h b/keyboards/dz60/dz60.h index fac5fa32ffc5..36ddb7ade121 100644 --- a/keyboards/dz60/dz60.h +++ b/keyboards/dz60/dz60.h @@ -196,6 +196,20 @@ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \ { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \ } +// iso split +#define LAYOUT_60_iso_split( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, \ + K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \ + K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ + K400, K401, K403, K404, K406, K408, K410, K411, K413, K414 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, KC_NO, K014 }, \ + { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ + { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, KC_NO }, \ + { K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, KC_NO, K413, K414 } \ +} /* LAYOUT_60_iso_5x1u * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ diff --git a/keyboards/dz60/info.json b/keyboards/dz60/info.json index 56e3677b7af3..1f621360bffd 100644 --- a/keyboards/dz60/info.json +++ b/keyboards/dz60/info.json @@ -28,6 +28,10 @@ "LAYOUT_60_iso": { "key_count": 62, "layout": [{"label":"¬", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"£", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + }, + "LAYOUT_60_iso_split": { + "key_count": 64, + "layout": [{"label":"¬", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"£", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"label":"FN", "x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] }, "LAYOUT_60_hhkb": { "key_count": 60, diff --git a/keyboards/dz60/keymaps/iso_split-spacebar/README.md b/keyboards/dz60/keymaps/iso_split-spacebar/README.md new file mode 100644 index 000000000000..7d96f2225fac --- /dev/null +++ b/keyboards/dz60/keymaps/iso_split-spacebar/README.md @@ -0,0 +1,69 @@ +# iso layout with a split spacebar + +i needed to have an ISO layout +and i wanted to have a split spacebar +i couldn't find anything ready so i cobbled this together + + + +---- Layer 0 - BL +this is basically the standard iso layout with the addition of the split spacebar +menu key (KC_APP) is used to move to the next layer +the key in between the two spacebars is the function key + *,-----------------------------------------------------------. + *| ' | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Backsp | + *|-----------------------------------------------------------| + *| Tab | q | w | e | r | t | y | u | i | o | p | [ | ] |enter| + *|------------------------------------------------------ | + *| Caps | a | s | d | f | g | h | j | k | l | ; | ' | # | | + *|-----------------------------------------------------------| + *|Shft| < | z | x | c | v | b | n | m | , | . | / | Shift | + *|-----------------------------------------------------------| + *|Ctrl|Gui |Alt | Space | FN | Space |Alt |Gui | NL |Ctrl | + *`-----------------------------------------------------------' + +---- Layer 1 - FL +quite standard function layer +arrow keys and mouse movement/buttons on the home row + *,-----------------------------------------------------------. + *|ESC|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| DEL | + *|-----------------------------------------------------------| + *| | | | | | | | | | |prt| | | | + *|------------------------------------------------------ | + *| |m l|m d|m u|m r| | | l | d | u | r | | | | + *|-----------------------------------------------------------| + *| | | | | |mb1|mb2| |hm |pgd|pgu|end| | + *|-----------------------------------------------------------| + *| | | | | | | | | | | + *`-----------------------------------------------------------' + +---- Layer 2 - NL +numbers numbers numbers... +first key (top left) to return to BL +menu key (KC_APP) is used to move to the next layer + *,-----------------------------------------------------------. + *|BL | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | | | + *|-----------------------------------------------------------| + *| | 4 | 5 | 6 | * | / | | 4 | 5 | 6 | * | / | ] | | + *|------------------------------------------------------ | + *| | 7 | 8 | 9 | + | - | | 1 | 2 | 3 | + | - | | | + *|-----------------------------------------------------------| + *| | | 0 | , | . | = | | | 0 | , | . | = | | + *|-----------------------------------------------------------| + *| | | | | | | | | RL | | + *`-----------------------------------------------------------' + +---- Layer 3 - BL +all the fancy lights +and useful reset button (top right) + *,-----------------------------------------------------------. + *|BL | | | | | | | | | | | | |Reset | + *|-----------------------------------------------------------| + *| |tog|mod|hui|hud| | |sai|sad|vai|vad| | | | + *|------------------------------------------------------ | + *| |sta|bre|rai|swi| | |sna|kni|gra|xms| | | | + *|-----------------------------------------------------------| + *| | |bd |bt |bi |bs | | | | | | | | + *|-----------------------------------------------------------| + *| | | | | | | | | BL | | + *`-----------------------------------------------------------' diff --git a/keyboards/dz60/keymaps/iso_split-spacebar/keymap.c b/keyboards/dz60/keymaps/iso_split-spacebar/keymap.c new file mode 100644 index 000000000000..7c17a6f5f812 --- /dev/null +++ b/keyboards/dz60/keymaps/iso_split-spacebar/keymap.c @@ -0,0 +1,193 @@ +// using as reference +// https://docs.qmk.fm/#/keymap + +// thanks to atlacat, hailbreno, itsaferbie and weeheavy... + +// and special thanks to AGausmann and drashna for the layer-activated RGB underglow +// https://www.reddit.com/r/olkb/comments/6t1vdu/update_layeractivated_rgb_underglow/ +// https://github.com/AGausmann/qmk_firmware/blob/agausmann-v3.x/keyboards/nyquist/keymaps/agausmann/keymap.c + +#include QMK_KEYBOARD_H + + +// Helpful defines +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +/* +* 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 // Base Layer +#define FL 1 // Function Layer +#define NL 2 // Numpad Layer +#define RL 3 // RGB Layer + +/* +* Let's give an easier name to the RGB modes +* and assign the ones we want to the different layer +* these will then be used by the function below +* +*/ +#define RGB_STA RGB_M_P //rgb static +#define RGB_BRE RGB_M_B //rgb breathe +#define RGB_RAI RGB_M_R //rgb rainbow +#define RGB_SWI RGB_M_SW //rgb swirl +#define RGB_SNA RGB_M_SN //rgb snake +#define RGB_KNI RGB_M_K //rgb knight +#define RGB_GRA RGB_M_G //rgb gradient +#define RGB_XMS RGB_M_X //rgb christmas +// +#define RGB_BL_MODE rgblight_mode_noeeprom(3) //rgb mode for BL layer +#define RGB_BL_LIGHT rgblight_sethsv_noeeprom_turquoise() //rgb light for BL layer +// +#define RGB_FL_MODE rgblight_mode_noeeprom(1) //rgb mode for FL layer +#define RGB_FL_LIGHT rgblight_sethsv_noeeprom_orange() //rgb light for FL layer +// +#define RGB_NL_MODE rgblight_mode_noeeprom(12) //rgb mode for NL layer +#define RGB_NL_LIGHT rgblight_sethsv_noeeprom_turquoise() //rgb light for NL layer +// +#define RGB_RL_MODE rgblight_mode_noeeprom(22) //rgb mode for RL layer +#define RGB_RL_LIGHT rgblight_sethsv_noeeprom_red() //rgb light for RL layer + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Keymap BL: Base Layer (Default Layer) + * + * ,-----------------------------------------------------------. + * | ' | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Backsp | + * |-----------------------------------------------------------| + * | Tab | q | w | e | r | t | y | u | i | o | p | [ | ] |enter| + * |------------------------------------------------------ | + * | Caps | a | s | d | f | g | h | j | k | l | ; | ' | # | | + * |-----------------------------------------------------------| + * |Shft| < | z | x | c | v | b | n | m | , | . | / | Shift | + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space | FN | Space |Alt |Gui | NL |Ctrl | + * `-----------------------------------------------------------' + */ + [BL] = LAYOUT_60_iso_split( + // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + 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_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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, + 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_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(FL), KC_SPC, KC_RALT, KC_RGUI, TO(NL), KC_RCTL), + + /* Keymap FL: Function Layer + * + * ,-----------------------------------------------------------. + * |ESC|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| DEL | + * |-----------------------------------------------------------| + * | | | | | | | | | | |prt| | | | + * |------------------------------------------------------ | + * | |m l|m d|m u|m r| | | l | d | u | r | | | | + * |-----------------------------------------------------------| + * | | | | | |mb1|mb2| |hm |pgd|pgu|end| | + * |-----------------------------------------------------------| + * | | | | | | | | | | | + * `-----------------------------------------------------------' + */ + [FL] = LAYOUT_60_iso_split( + // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + 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_DEL, + _______ , _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, _______, _______, + _______, KC_MS_LEFT,KC_MS_DOWN,KC_MS_UP, KC_MS_RIGHT,_______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, _______, + _______, _______, _______, _______, _______, KC_MS_BTN1,KC_MS_BTN2,_______, KC_HOME, KC_PGDOWN, KC_PGUP, KC_END, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + /* Keymap NL: Numpad Layer + * + * ,-----------------------------------------------------------. + * |BL | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | | | + * |-----------------------------------------------------------| + * | | 4 | 5 | 6 | * | / | | 4 | 5 | 6 | * | / | ] | | + * |------------------------------------------------------ | + * | | 7 | 8 | 9 | + | - | | 1 | 2 | 3 | + | - | | | + * |-----------------------------------------------------------| + * | | | 0 | , | . | = | | | 0 | , | . | = | | + * |-----------------------------------------------------------| + * | | | | | | | | | RL | | + * `-----------------------------------------------------------' + */ + [NL] = LAYOUT_60_iso_split( + // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + TG(NL), 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_4, KC_5, KC_6, KC_PAST, KC_PSLS, _______, KC_4, KC_5, KC_6, KC_PAST, KC_PSLS, _______, + _______, KC_7, KC_8, KC_9, KC_PPLS, KC_PMNS, _______, KC_1, KC_2, KC_3, KC_PPLS, KC_PMNS, _______, _______, + _______, KC_0, KC_COMM, KC_DOT, KC_EQL, _______, _______, _______, KC_0, KC_COMM, KC_DOT, KC_EQL, _______, + _______, _______, _______, _______, MO(FL), _______, _______, _______, TG(RL), _______), + + /* Keymap RL: RGB Layer + * + * ,-----------------------------------------------------------. + * |BL | | | | | | | | | | | | |Reset | + * |-----------------------------------------------------------| + * | |tog|mod|hui|hud| | |sai|sad|vai|vad| | | | + * |------------------------------------------------------ | + * | |sta|bre|rai|swi| | |sna|kni|gra|xms| | | | + * |-----------------------------------------------------------| + * | | |bd |bt |bi |bs | | | | | | | | + * |-----------------------------------------------------------| + * | | | | | | | | | BL | | + * `-----------------------------------------------------------' + */ + [RL] = LAYOUT_60_iso_split( + // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + TG(RL), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, _______, _______, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, + _______, RGB_STA, RGB_BRE, RGB_RAI, RGB_SWI, _______, _______, RGB_SNA, RGB_KNI, RGB_GRA, RGB_XMS, _______, _______, _______, + _______, BL_DEC, BL_TOGG, BL_INC, BL_STEP, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, MO(FL), _______, _______, _______, TO(BL), _______), + + +}; + + +void persistent_default_layer_set(uint16_t default_layer) { + eeconfig_update_default_layer(default_layer); + default_layer_set(default_layer); +} + + +// layer-activated RGB underglow + +void matrix_scan_user(void) { + + #ifdef RGBLIGHT_ENABLE + + static uint8_t old_layer = 1; + uint8_t new_layer = biton32(layer_state); + + if (old_layer != new_layer) { + switch (new_layer) { + case BL: + RGB_BL_MODE; + RGB_BL_LIGHT; + break; + case FL: + RGB_FL_MODE; + RGB_FL_LIGHT; + break; + case NL: + RGB_NL_MODE; + // RGB_NL_LIGHT; + break; + case RL: + RGB_RL_MODE; + // RGB_RL_LIGHT; + break; + } + + old_layer = new_layer; + } + + #endif //RGBLIGHT_ENABLE + +} From 6c086f2b6d340c22462f6d6d3cb1d9b583123a65 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 19 Oct 2018 12:42:28 -0700 Subject: [PATCH 221/505] Revert changes to chibiOS-contrib (#4176) * Revert "Keymap: qwerty_code_friendly: use numpad layout for f-keys (#4170)" This reverts commit efc88a0b16055dc0b2f94da8c46ea8fadeab70f4. * Fix keymap --- lib/chibios-contrib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/chibios-contrib b/lib/chibios-contrib index 2de67e2f4a26..ede48346eee4 160000 --- a/lib/chibios-contrib +++ b/lib/chibios-contrib @@ -1 +1 @@ -Subproject commit 2de67e2f4a268eae072c5fd76a1b160124cee4f6 +Subproject commit ede48346eee4b8d6847c19bc01420bee76a5e486 From f775168c4fa870c045984069a1b55eb9d269098c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 20 Oct 2018 10:47:59 +1100 Subject: [PATCH 222/505] Keymap: qwerty_code_friendly: update readme, comments (#4178) --- .../ergodox/qwerty_code_friendly/keymap.c | 2 +- .../ergodox/qwerty_code_friendly/readme.md | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/layouts/community/ergodox/qwerty_code_friendly/keymap.c b/layouts/community/ergodox/qwerty_code_friendly/keymap.c index 2a441be0e6bf..43a1d1ad8084 100644 --- a/layouts/community/ergodox/qwerty_code_friendly/keymap.c +++ b/layouts/community/ergodox/qwerty_code_friendly/keymap.c @@ -445,7 +445,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_MPRV, K80(L2K2), K80(L2K3), KC_MNXT, KC_TRNS, KC_MPLY ), -/* Keymap 3: Entire Words (one for each key) +/* Keymap 3: Entire Words (one for each key) & Numbers * * .--------------------------------------------------. .--------------------------------------------------. * | | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | | diff --git a/layouts/community/ergodox/qwerty_code_friendly/readme.md b/layouts/community/ergodox/qwerty_code_friendly/readme.md index 23afa656f762..9abd071b9b60 100644 --- a/layouts/community/ergodox/qwerty_code_friendly/readme.md +++ b/layouts/community/ergodox/qwerty_code_friendly/readme.md @@ -30,7 +30,7 @@ Some optional behavior is configurable without editing the code using `CFQ_` prefixed defines which can be set by passing `EXTRAFLAGS` to make. - `CFQ_USER_KEY0` - (0..7) are used for custom-keys + (0..8) are used for custom-keys - `CFQ_USE_MOMENTARY_LAYER_KEYS` is used to prevent layer keys from toggling when tapped. - `CFQ_USE_SHIFT_QUOTES` @@ -122,12 +122,7 @@ Notes: '--------------------' '--------------------' ``` -## Keymap 2: Media, Mouse Keys and Numbers - -Notes: - -- Numbers are included on this layer since some applications differentiate - between numbers top row and keypad. +## Keymap 2: F-Keys, Media & Mouse Keys ``` .--------------------------------------------------. .--------------------------------------------------. @@ -150,12 +145,17 @@ Notes: '--------------------' '--------------------' ``` -## Keymap 3: F-Keys & User Defined Words +## Keymap 3: User Defined Words & Numbers This is for assigning whole words to single keys. You can define the arguments (which must be quoted) using: `CFQ_WORD_[A-Z]` eg: `-DCFQ_WORD_E=\"my@email.com\"` +Notes: + +- Numbers are included on this layer since some applications differentiate + between numbers top row and keypad. + ``` .--------------------------------------------------. .--------------------------------------------------. | | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | | @@ -180,7 +180,7 @@ eg: `-DCFQ_WORD_E=\"my@email.com\"` ## Changelog - 2018/10/19 - Move F-Keys to numpad like layout. + Move F-Keys to key-pad like layout. - 2018/05/29 Add number keys for cases when keypad numbers are handled differently. From 26d2ef2ad1c9b040151d1aac19c4fff3f8b55dd5 Mon Sep 17 00:00:00 2001 From: Alex Mayer Date: Sat, 20 Oct 2018 01:07:48 -0400 Subject: [PATCH 223/505] Ergodox EZ: Use Correct Const For LED Color --- keyboards/ergodox_ez/keymaps/default/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/ergodox_ez/keymaps/default/keymap.c b/keyboards/ergodox_ez/keymaps/default/keymap.c index e400ffcd3784..ef70decd531f 100644 --- a/keyboards/ergodox_ez/keymaps/default/keymap.c +++ b/keyboards/ergodox_ez/keymaps/default/keymap.c @@ -266,7 +266,7 @@ uint32_t layer_state_set_user(uint32_t state) { ergodox_right_led_2_on(); ergodox_right_led_3_on(); #ifdef RGBLIGHT_COLOR_LAYER_7 - rgblight_setrgb(RGBLIGHT_COLOR_LAYER_6); + rgblight_setrgb(RGBLIGHT_COLOR_LAYER_7); #endif break; default: From ea17e363a61b925c1c6da0146fe383630a7848c0 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 20 Oct 2018 08:40:32 -0700 Subject: [PATCH 224/505] Add instructions for zadig when bootloader device is unknown --- docs/faq_build.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/faq_build.md b/docs/faq_build.md index 7d17df074524..00a0d386b913 100644 --- a/docs/faq_build.md +++ b/docs/faq_build.md @@ -17,7 +17,7 @@ or just: Note that running `make` with `sudo` is generally *not* a good idea, and you should use one of the former methods, if possible. -## Linux `udev` Rules +### Linux `udev` Rules On Linux, you'll need proper privileges to access the MCU. You can either use `sudo` when flashing firmware, or place these files in `/etc/udev/rules.d/`. @@ -37,6 +37,14 @@ SUBSYSTEMS=="usb", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2ff0", MODE:="066 SUBSYSTEMS=="usb", ATTRS{idVendor}=="feed", MODE:="0666" ``` +## Unknown Device for DFU Bootloader + +If you're using Windows to flash your keyboard, and you are running into issues, check the Device Manager. If you see an "Unknown Device" when the keyboard is in "bootloader mode", then you may have a driver issue. + +Re-running the installation script for MSYS2 may help (eg run `./util/qmk_install.sh` from MSYS2/WSL) or reinstalling the QMK Toolbox may fix the issue. + +If that doesn't work, then you may need to grab the [Zadig Utility](https://zadig.akeo.ie/). Download this, find the device in question, and select the `WinUS(libusb-1.0)` option, and hit "Reinstall driver". Once you've done that, try flashing your board, again. + ## WINAVR is Obsolete It is no longer recommended and may cause some problem. See [TMK Issue #99](https://github.com/tmk/tmk_keyboard/issues/99). From 4fffef88535dd62c19e7a1db10c557895ef9cd86 Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Sun, 21 Oct 2018 12:05:45 -0400 Subject: [PATCH 225/505] Keymap: add initial khord iris keymap (#4188) --- keyboards/iris/keymaps/khord/config.h | 38 +++++++ keyboards/iris/keymaps/khord/keymap.c | 136 ++++++++++++++++++++++++++ keyboards/iris/keymaps/khord/rules.mk | 3 + 3 files changed, 177 insertions(+) create mode 100644 keyboards/iris/keymaps/khord/config.h create mode 100644 keyboards/iris/keymaps/khord/keymap.c create mode 100644 keyboards/iris/keymaps/khord/rules.mk diff --git a/keyboards/iris/keymaps/khord/config.h b/keyboards/iris/keymaps/khord/config.h new file mode 100644 index 000000000000..9b44bca7924e --- /dev/null +++ b/keyboards/iris/keymaps/khord/config.h @@ -0,0 +1,38 @@ +/* +Copyright 2017 Danny Nguyen + +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 + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#define TAPPING_TERM 150 + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 12 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/iris/keymaps/khord/keymap.c b/keyboards/iris/keymaps/khord/keymap.c new file mode 100644 index 000000000000..379617a8b76a --- /dev/null +++ b/keyboards/iris/keymaps/khord/keymap.c @@ -0,0 +1,136 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, + ADMIN, + SMSPC1 +}; + +enum { + SFT_CAP = 0 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_QUOT, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + TD(SFT_CAP),KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, SFT_T(KC_ENT), + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_HOME, KC_END, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + KC_LGUI, LOWER, KC_ENT, KC_SPC, RAISE, KC_LALT + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_LOWER] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + RESET, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + KC_DEL, _______, KC_LEFT, KC_RGHT, KC_UP, KC_LBRC, KC_RBRC, KC_P4, KC_P5, KC_P6, KC_PLUS, KC_PIPE, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + BL_STEP, _______, _______, _______, KC_DOWN, KC_LCBR, KC_LPRN, KC_RPRN, KC_RCBR, KC_P1, KC_P2, KC_P3, KC_MINS, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, KC_DEL, KC_DEL, _______, KC_P0 + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_RAISE] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + RGB_TOG, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + RGB_MOD, KC_MPRV, KC_MNXT, KC_VOLU, KC_PGUP, KC_UNDS, KC_EQL, KC_HOME, RGB_HUI, RGB_SAI, RGB_VAI, KC_BSLS, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_MUTE, KC_MSTP, KC_MPLY, KC_VOLD, KC_PGDN, KC_MINS, KC_LPRN, _______, KC_PLUS, KC_END, RGB_HUD, RGB_SAD, RGB_VAD, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, _______, _______, _______, _______ + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ), + + [_ADJUST] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘ + _______, _______, _______, _______, _______, _______ + // └────────┴────────┴────────┘ └────────┴────────┴────────┘ + ) +}; + +qk_tap_dance_action_t tap_dance_actions[] = { + [SFT_CAP] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + 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; + case ADMIN: + if (record->event.pressed) { + SEND_STRING("Administrator"); + } + return false; + break; + case SMSPC1: + if (record->event.pressed) { + SEND_STRING("Simspace1!"); + } + return false; + break; + } + return true; +} diff --git a/keyboards/iris/keymaps/khord/rules.mk b/keyboards/iris/keymaps/khord/rules.mk new file mode 100644 index 000000000000..c46edbd1282d --- /dev/null +++ b/keyboards/iris/keymaps/khord/rules.mk @@ -0,0 +1,3 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes +TAP_DANCE_ENABLE = yes From 877c285ec8c5509f665b558cb2bcaa89d6093055 Mon Sep 17 00:00:00 2001 From: Vyolle <44031868+Vyolle@users.noreply.github.com> Date: Sun, 21 Oct 2018 11:15:48 -0500 Subject: [PATCH 226/505] Keymap: Renabled EXTRAKEYS in layout (#4174) * Renabled EXTRAKEYS. * Update keyboards/iris/keymaps/vyolle_steno/rules.mk Co-Authored-By: Vyolle --- keyboards/iris/keymaps/vyolle_steno/rules.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/iris/keymaps/vyolle_steno/rules.mk b/keyboards/iris/keymaps/vyolle_steno/rules.mk index e41231683370..ebe1c86a0e7f 100644 --- a/keyboards/iris/keymaps/vyolle_steno/rules.mk +++ b/keyboards/iris/keymaps/vyolle_steno/rules.mk @@ -1,7 +1,7 @@ -EXTRAKEY_ENABLE = no -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -STENO_ENABLE = yes # Additional protocols for Stenography(+1700), requires VIRTSER +EXTRAKEY_ENABLE = yes # Disable if you run out of usb endpoints. Media keys need this to work. +MOUSEKEY_ENABLE = no # Mouse keys(+4700) Uses extra usb endpoints. +STENO_ENABLE = yes # Additional protocols for Stenography(+1700), requires VIRTSER. AUDIO_ENABLE = no # Audio output on port C6 MIDI_ENABLE = no # MIDI controls NKRO_ENABLE = yes -BOOTMAGIC_ENABLE = yes \ No newline at end of file +BOOTMAGIC_ENABLE = yes From 8e3330bbf6f8c4faf39a3df20fa3ab62910c8b19 Mon Sep 17 00:00:00 2001 From: a-chol Date: Sun, 21 Oct 2018 18:20:24 +0200 Subject: [PATCH 227/505] Keyboard: bminiex : Working backlight (#4171) * bminiex : Working backlight * bminiex keyboard with fixes * bminiex keyboard more fixes --- keyboards/bminiex/backlight.c | 211 +++++++++++ keyboards/bminiex/backlight_custom.h | 13 + keyboards/bminiex/bminiex.c | 97 +++++ keyboards/bminiex/bminiex.h | 58 +++ keyboards/bminiex/breathing_custom.h | 140 ++++++++ keyboards/bminiex/config.h | 41 +++ keyboards/bminiex/i2c.c | 106 ++++++ keyboards/bminiex/i2c.h | 25 ++ keyboards/bminiex/keymaps/default/keymap.c | 29 ++ keyboards/bminiex/matrix.c | 122 +++++++ keyboards/bminiex/readme.md | 14 + keyboards/bminiex/rules.mk | 56 +++ keyboards/bminiex/usbconfig.h | 396 +++++++++++++++++++++ tmk_core/common/backlight.h | 5 +- 14 files changed, 1309 insertions(+), 4 deletions(-) create mode 100644 keyboards/bminiex/backlight.c create mode 100644 keyboards/bminiex/backlight_custom.h create mode 100644 keyboards/bminiex/bminiex.c create mode 100644 keyboards/bminiex/bminiex.h create mode 100644 keyboards/bminiex/breathing_custom.h create mode 100644 keyboards/bminiex/config.h create mode 100644 keyboards/bminiex/i2c.c create mode 100644 keyboards/bminiex/i2c.h create mode 100644 keyboards/bminiex/keymaps/default/keymap.c create mode 100644 keyboards/bminiex/matrix.c create mode 100644 keyboards/bminiex/readme.md create mode 100644 keyboards/bminiex/rules.mk create mode 100644 keyboards/bminiex/usbconfig.h diff --git a/keyboards/bminiex/backlight.c b/keyboards/bminiex/backlight.c new file mode 100644 index 000000000000..94e8126d888e --- /dev/null +++ b/keyboards/bminiex/backlight.c @@ -0,0 +1,211 @@ +/** + * Backlighting code for PS2AVRGB boards (ATMEGA32A) + * Kenneth A. (github.com/krusli | krusli.me) + */ + +#include "backlight.h" +#include "quantum.h" + +#include +#include + +#include "backlight_custom.h" +#include "breathing_custom.h" + +// DEBUG +#include +#include + +// Port D: digital pins of the AVR chipset +#define NUMLOCK_PORT (1 << 0) // D0 +#define CAPSLOCK_PORT (1 << 1) // D1 +#define BACKLIGHT_PORT (1 << 4) // D4 +#define SCROLLLOCK_PORT (1 << 6) // D6 + +#define TIMER_CLK_DIV64 0x03 ///< Timer clocked at F_CPU/64 +#define TIMER1PRESCALE TIMER_CLK_DIV64 ///< timer 1 prescaler default + +#define TIMER_PRESCALE_MASK 0x07 ///< Timer Prescaler Bit-Mask + +#define PWM_MAX 0xFF +#define TIMER_TOP 255 // 8 bit PWM + +extern backlight_config_t backlight_config; + +/** + * References + * Port Registers: https://www.arduino.cc/en/Reference/PortManipulation + * TCCR1A: https://electronics.stackexchange.com/questions/92350/what-is-the-difference-between-tccr1a-and-tccr1b + * Timers: http://www.avrbeginners.net/architecture/timers/timers.html + * 16-bit timer setup: http://sculland.com/ATmega168/Interrupts-And-Timers/16-Bit-Timer-Setup/ + * PS2AVRGB firmware: https://github.com/showjean/ps2avrU/tree/master/firmware + */ + +// @Override +// turn LEDs on and off depending on USB caps/num/scroll lock states. +__attribute__ ((weak)) +void led_set_user(uint8_t usb_led) { + if (usb_led & (1 << USB_LED_NUM_LOCK)) { + // turn on + DDRD |= NUMLOCK_PORT; + PORTD |= NUMLOCK_PORT; + } else { + // turn off + DDRD &= ~NUMLOCK_PORT; + PORTD &= ~NUMLOCK_PORT; + } + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRD |= CAPSLOCK_PORT; + PORTD |= CAPSLOCK_PORT; + } else { + DDRD &= ~CAPSLOCK_PORT; + PORTD &= ~CAPSLOCK_PORT; + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + DDRD |= SCROLLLOCK_PORT; + PORTD |= SCROLLLOCK_PORT; + } else { + DDRD &= ~SCROLLLOCK_PORT; + PORTD &= ~SCROLLLOCK_PORT; + } +} + +#ifdef BACKLIGHT_ENABLE + +// sets up Timer 1 for 8-bit PWM +void timer1PWMSetup(void) { // NOTE ONLY CALL THIS ONCE + // default 8 bit mode + TCCR1A &= ~(1 << 1); // cbi(TCCR1A,PWM11); <- set PWM11 bit to HIGH + TCCR1A |= (1 << 0); // sbi(TCCR1A,PWM10); <- set PWM10 bit to LOW + + // clear output compare value A + // outb(OCR1AH, 0); + // outb(OCR1AL, 0); + + // clear output comparator registers for B + OCR1BH = 0; // outb(OCR1BH, 0); + OCR1BL = 0; // outb(OCR1BL, 0); +} + +bool is_init = false; +void timer1Init(void) { + // timer1SetPrescaler(TIMER1PRESCALE) + // set to DIV/64 + (TCCR1B) = ((TCCR1B) & ~TIMER_PRESCALE_MASK) | TIMER1PRESCALE; + + // reset TCNT1 + TCNT1H = 0; // outb(TCNT1H, 0); + TCNT1L = 0; // outb(TCNT1L, 0); + + // TOIE1: Timer Overflow Interrupt Enable (Timer 1); + TIMSK |= _BV(TOIE1); // sbi(TIMSK, TOIE1); + + is_init = true; +} + +void timer1UnInit(void) { + // set prescaler back to NONE + (TCCR1B) = ((TCCR1B) & ~TIMER_PRESCALE_MASK) | 0x00; // TIMERRTC_CLK_STOP + + // disable timer overflow interrupt + TIMSK &= ~_BV(TOIE1); // overflow bit? + + setPWM(0); + + is_init = false; +} + + +// handle TCNT1 overflow +//! Interrupt handler for tcnt1 overflow interrupt +ISR(TIMER1_OVF_vect, ISR_NOBLOCK) +{ + // sei(); + // handle breathing here + #ifdef BACKLIGHT_BREATHING + if (is_breathing()) { + custom_breathing_handler(); + } + #endif +} + +// enable timer 1 PWM +// timer1PWMBOn() +void timer1PWMBEnable(void) { + // turn on channel B (OC1B) PWM output + // set OC1B as non-inverted PWM + TCCR1A |= _BV(COM1B1); + TCCR1A &= ~_BV(COM1B0); +} + +// disable timer 1 PWM +// timer1PWMBOff() +void timer1PWMBDisable(void) { + TCCR1A &= ~_BV(COM1B1); + TCCR1A &= ~_BV(COM1B0); +} + +void enableBacklight(void) { + DDRD |= BACKLIGHT_PORT; // set digital pin 4 as output + PORTD |= BACKLIGHT_PORT; // set digital pin 4 to high +} + +void disableBacklight(void) { + // DDRD &= ~BACKLIGHT_PORT; // set digital pin 4 as input + PORTD &= ~BACKLIGHT_PORT; // set digital pin 4 to low +} + +void startPWM(void) { + timer1Init(); + timer1PWMBEnable(); + enableBacklight(); +} + +void stopPWM(void) { + timer1UnInit(); + disableBacklight(); + timer1PWMBDisable(); +} + +void b_led_init_ports(void) { + /* turn backlight on/off depending on user preference */ + #if BACKLIGHT_ON_STATE == 0 + // DDRx register: sets the direction of Port D + // DDRD &= ~BACKLIGHT_PORT; // set digital pin 4 as input + PORTD &= ~BACKLIGHT_PORT; // set digital pin 4 to low + #else + DDRD |= BACKLIGHT_PORT; // set digital pin 4 as output + PORTD |= BACKLIGHT_PORT; // set digital pin 4 to high + #endif + + timer1PWMSetup(); + startPWM(); + + #ifdef BACKLIGHT_BREATHING + breathing_enable(); + #endif +} + +void b_led_set(uint8_t level) { + if (level > BACKLIGHT_LEVELS) { + level = BACKLIGHT_LEVELS; + } + + setPWM((int)(TIMER_TOP * (float) level / BACKLIGHT_LEVELS)); +} + +// called every matrix scan +void b_led_task(void) { + // do nothing for now +} + +void setPWM(uint16_t xValue) { + if (xValue > TIMER_TOP) { + xValue = TIMER_TOP; + } + OCR1B = xValue; // timer1PWMBSet(xValue); +} + +#endif // BACKLIGHT_ENABLE diff --git a/keyboards/bminiex/backlight_custom.h b/keyboards/bminiex/backlight_custom.h new file mode 100644 index 000000000000..51365fe3ba44 --- /dev/null +++ b/keyboards/bminiex/backlight_custom.h @@ -0,0 +1,13 @@ +/** + * Backlighting code for PS2AVRGB boards (ATMEGA32A) + * Kenneth A. (github.com/krusli | krusli.me) + */ + +#pragma once + +#include +void b_led_init_ports(void); +void b_led_set(uint8_t level); +void b_led_task(void); +void setPWM(uint16_t xValue); + diff --git a/keyboards/bminiex/bminiex.c b/keyboards/bminiex/bminiex.c new file mode 100644 index 000000000000..d9b05aba5145 --- /dev/null +++ b/keyboards/bminiex/bminiex.c @@ -0,0 +1,97 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 "bminiex.h" +#include "rgblight.h" + +#include + +#include "action_layer.h" +#include "i2c.h" +#include "quantum.h" + +#include "backlight.h" +#include "backlight_custom.h" + +// for keyboard subdirectory level init functions +// @Override +void matrix_init_kb(void) { + // call user level keymaps, if any + matrix_init_user(); +} + +#ifdef BACKLIGHT_ENABLE +/// Overrides functions in `quantum.c` +void backlight_init_ports(void) { + b_led_init_ports(); +} + +void backlight_task(void) { + b_led_task(); +} + +void backlight_set(uint8_t level) { + b_led_set(level); +} +#endif + +#ifdef RGBLIGHT_ENABLE +extern rgblight_config_t rgblight_config; + +// custom RGB driver +void rgblight_set(void) { + if (!rgblight_config.enable) { + for (uint8_t i=0; i + +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 + +#include "quantum.h" + +#define LAYOUT( \ + K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, K65, K75, K85, K95, \ + K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD0, K64, K74, K84, K94, \ + K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC3, KD3, K67, K63, K73, K83, \ + K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KB2, KC2, KD2, KE0, K62, K72, K82, K92, \ + K01, K30, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KB1, K86, K77, K61, K71, K81, \ + K00, K10, K20, K56, K57, KB0, KC0, K66, K76, K96, K60, K80, K90 \ +){ \ + { K00, K10, K20, K30, KC_NO, KC_NO, K60, KC_NO, K80, K90, KC_NO, KB0, KC0, KD0, KE0 }, \ + { K01, K11, K21, K31, K41, K51, K61, K71, K81, KC_NO, KA1, KB1, KC_NO, KD1, KE1 }, \ + { K02, K12, K22, K32, K42, K52, K62, K72, K82, K92, KA2, KB2, KC2, KD2, KE2 }, \ + { K03, K13, K23, K33, K43, K53, K63, K73, K83, KC_NO, KA3, KB3, KC3, KD3, KC_NO }, \ + { K04, K14, K24, K34, K44, K54, K64, K74, K84, K94, KA4, KB4, KC4, KC_NO, KE4 }, \ + { K05, KC_NO, K25, K35, K45, K55, K65, K75, K85, K95, KC_NO, KB5, KC5, KD5, KE5 }, \ + { K06, K16, K26, K36, K46, K56, K66, K76, K86, K96, KA6, KB6, KC6, KD6, KE6 }, \ + { K07, K17, K27, K37, K47, K57, K67, K77, KC_NO, KC_NO, KA7, KB7, KC7, KD7, KE7 } \ +} + +#define LAYOUT_kc( \ + K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, K65, K75, K85, K95, \ + K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD0, K64, K74, K84, K94, \ + K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC3, KD3, K67, K63, K73, K83, \ + K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KB2, KC2, KD2, KE0, K62, K72, K82, K92, \ + K01, K30, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KB1, K86, K77, K61, K71, K81, \ + K00, K10, K20, K56, K57, KB0, KC0, K66, K76, K96, K60, K80, K90 \ +) \ +{ \ + { KC_##K00, KC_##K10, KC_##K20, KC_##K30, KC_NO, KC_NO, KC_##K60, KC_NO, KC_##K80, KC_##K90, KC_NO, KC_##KB0, KC_##KC0, KC_##KD0, KC_##KE0 }, \ + { KC_##K01, KC_##K11, KC_##K21, KC_##K31, KC_##K41, KC_##K51, KC_##K61, KC_##K71, KC_##K81, KC_NO, KC_##KA1, KC_##KB1, KC_NO, KC_##KD1, KC_##KE1 }, \ + { KC_##K02, KC_##K12, KC_##K22, KC_##K32, KC_##K42, KC_##K52, KC_##K62, KC_##K72, KC_##K82, KC_##K92, KC_##KA2, KC_##KB2, KC_##KC2, KC_##KD2, KC_##KE2 }, \ + { KC_##K03, KC_##K13, KC_##K23, KC_##K33, KC_##K43, KC_##K53, KC_##K63, KC_##K73, KC_##K83, KC_NO, KC_##KA3, KC_##KB3, KC_##KC3, KC_##KD3, KC_NO }, \ + { KC_##K04, KC_##K14, KC_##K24, KC_##K34, KC_##K44, KC_##K54, KC_##K64, KC_##K74, KC_##K84, KC_##K94, KC_##KA4, KC_##KB4, KC_##KC4, KC_NO, KC_##KE4 }, \ + { KC_##K05, KC_NO, KC_##K25, KC_##K35, KC_##K45, KC_##K55, KC_##K65, KC_##K75, KC_##K85, KC_##K95, KC_NO, KC_##KB5, KC_##KC5, KC_##KD5, KC_##KE5 }, \ + { KC_##K06, KC_##K16, KC_##K26, KC_##K36, KC_##K46, KC_##K56, KC_##K66, KC_##K76, KC_##K86, KC_##K96, KC_##KA6, KC_##KB6, KC_##KC6, KC_##KD6, KC_##KE6 }, \ + { KC_##K07, KC_##K17, KC_##K27, KC_##K37, KC_##K47, KC_##K57, KC_##K67, KC_##K77, KC_NO, KC_NO, KC_##KA7, KC_##KB7, KC_##KC7, KC_##KD7, KC_##KE7 } \ +} + diff --git a/keyboards/bminiex/breathing_custom.h b/keyboards/bminiex/breathing_custom.h new file mode 100644 index 000000000000..71416b1b45da --- /dev/null +++ b/keyboards/bminiex/breathing_custom.h @@ -0,0 +1,140 @@ +/** + * Breathing effect code for PS2AVRGB boards (ATMEGA32A) + * Works in conjunction with `backlight.c`. + * + * Code adapted from `quantum.c` to register with the existing TIMER1 overflow + * handler in `backlight.c` instead of setting up its own timer. + * Kenneth A. (github.com/krusli | krusli.me) + */ + +#ifdef BACKLIGHT_ENABLE +#ifdef BACKLIGHT_BREATHING + +#include "backlight_custom.h" + +#ifndef BREATHING_PERIOD +#define BREATHING_PERIOD 6 +#endif + +#define breathing_min() do {breathing_counter = 0;} while (0) +#define breathing_max() do {breathing_counter = breathing_period * 244 / 2;} while (0) + +// TODO make this share code with quantum.c + +#define BREATHING_NO_HALT 0 +#define BREATHING_HALT_OFF 1 +#define BREATHING_HALT_ON 2 +#define BREATHING_STEPS 128 + +static uint8_t breathing_period = BREATHING_PERIOD; +static uint8_t breathing_halt = BREATHING_NO_HALT; +static uint16_t breathing_counter = 0; + +static bool breathing = false; + +bool is_breathing(void) { + return breathing; +} + +// See http://jared.geek.nz/2013/feb/linear-led-pwm +static uint16_t cie_lightness(uint16_t v) { + if (v <= 5243) // if below 8% of max + return v / 9; // same as dividing by 900% + else { + uint32_t y = (((uint32_t) v + 10486) << 8) / (10486 + 0xFFFFUL); // add 16% of max and compare + // to get a useful result with integer division, we shift left in the expression above + // and revert what we've done again after squaring. + y = y * y * y >> 8; + if (y > 0xFFFFUL) // prevent overflow + return 0xFFFFU; + else + return (uint16_t) y; + } +} + +void breathing_enable(void) { + breathing = true; + breathing_counter = 0; + breathing_halt = BREATHING_NO_HALT; + // interrupt already registered +} + +void breathing_pulse(void) { + if (get_backlight_level() == 0) + breathing_min(); + else + breathing_max(); + breathing_halt = BREATHING_HALT_ON; + // breathing_interrupt_enable(); + breathing = true; +} + +void breathing_disable(void) { + breathing = false; + // backlight_set(get_backlight_level()); + b_led_set(get_backlight_level()); // custom implementation of backlight_set() +} + +void breathing_self_disable(void) +{ + if (get_backlight_level() == 0) + breathing_halt = BREATHING_HALT_OFF; + else + breathing_halt = BREATHING_HALT_ON; +} + +void breathing_toggle(void) { + if (is_breathing()) + breathing_disable(); + else + breathing_enable(); +} + +void breathing_period_set(uint8_t value) +{ + if (!value) + value = 1; + breathing_period = value; +} + +void breathing_period_default(void) { + breathing_period_set(BREATHING_PERIOD); +} + +void breathing_period_inc(void) +{ + breathing_period_set(breathing_period+1); +} + +void breathing_period_dec(void) +{ + breathing_period_set(breathing_period-1); +} + +/* To generate breathing curve in python: + * from math import sin, pi; [int(sin(x/128.0*pi)**4*255) for x in range(128)] + */ +static const uint8_t breathing_table[BREATHING_STEPS] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 17, 20, 24, 28, 32, 36, 41, 46, 51, 57, 63, 70, 76, 83, 91, 98, 106, 113, 121, 129, 138, 146, 154, 162, 170, 178, 185, 193, 200, 207, 213, 220, 225, 231, 235, 240, 244, 247, 250, 252, 253, 254, 255, 254, 253, 252, 250, 247, 244, 240, 235, 231, 225, 220, 213, 207, 200, 193, 185, 178, 170, 162, 154, 146, 138, 129, 121, 113, 106, 98, 91, 83, 76, 70, 63, 57, 51, 46, 41, 36, 32, 28, 24, 20, 17, 15, 12, 10, 8, 6, 5, 4, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + +// Use this before the cie_lightness function. +static inline uint16_t scale_backlight(uint16_t v) { + return v / BACKLIGHT_LEVELS * get_backlight_level(); +} + +void custom_breathing_handler(void) { + uint16_t interval = (uint16_t) breathing_period * 244 / BREATHING_STEPS; + // resetting after one period to prevent ugly reset at overflow. + breathing_counter = (breathing_counter + 1) % (breathing_period * 244); + uint8_t index = breathing_counter / interval % BREATHING_STEPS; + + if (((breathing_halt == BREATHING_HALT_ON) && (index == BREATHING_STEPS / 2)) || + ((breathing_halt == BREATHING_HALT_OFF) && (index == BREATHING_STEPS - 1))) + { + // breathing_interrupt_disable(); + } + + setPWM(cie_lightness(scale_backlight((uint16_t) pgm_read_byte(&breathing_table[index]) * 0x0101U))); +} + +#endif // BACKLIGHT_BREATHING +#endif // BACKLIGHT_ENABLE diff --git a/keyboards/bminiex/config.h b/keyboards/bminiex/config.h new file mode 100644 index 000000000000..3f160109e3a4 --- /dev/null +++ b/keyboards/bminiex/config.h @@ -0,0 +1,41 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 + +#include "config_common.h" + +#define VENDOR_ID 0x20A0 +#define PRODUCT_ID 0x422E +#define MANUFACTURER winkeyless.kr +#define PRODUCT B.mini Ex + +#define RGBLED_NUM 20 + +/* matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 15 + +#define RGBLIGHT_ANIMATIONS + +#define BACKLIGHT_LEVELS 5 + +#define NO_UART 1 + +/* key combination for command */ +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) + diff --git a/keyboards/bminiex/i2c.c b/keyboards/bminiex/i2c.c new file mode 100644 index 000000000000..a4f95213524f --- /dev/null +++ b/keyboards/bminiex/i2c.c @@ -0,0 +1,106 @@ +/* +Copyright 2016 Luiz Ribeiro + +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 . +*/ + +// Please do not modify this file + +#include +#include + +#include "i2c.h" + +void i2c_set_bitrate(uint16_t bitrate_khz) { + uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz); + if (bitrate_div >= 16) { + bitrate_div = (bitrate_div - 16) / 2; + } + TWBR = bitrate_div; +} + +void i2c_init(void) { + // set pull-up resistors on I2C bus pins + PORTC |= 0b11; + + i2c_set_bitrate(400); + + // enable TWI (two-wire interface) + TWCR |= (1 << TWEN); + + // enable TWI interrupt and slave address ACK + TWCR |= (1 << TWIE); + TWCR |= (1 << TWEA); +} + +uint8_t i2c_start(uint8_t address) { + // reset TWI control register + TWCR = 0; + + // begin transmission and wait for it to end + TWCR = (1< + +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 . +*/ + +// Please do not modify this file + +#pragma once + +void i2c_init(void); +void i2c_set_bitrate(uint16_t bitrate_khz); +uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length); + diff --git a/keyboards/bminiex/keymaps/default/keymap.c b/keyboards/bminiex/keymaps/default/keymap.c new file mode 100644 index 000000000000..ed949d74fb70 --- /dev/null +++ b/keyboards/bminiex/keymaps/default/keymap.c @@ -0,0 +1,29 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + 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_HOME,KC_END, KC_NO, KC_NO, KC_NO, KC_NO, + 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_DEL, 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_NO, KC_INS, KC_P7, KC_P8, KC_P9, + KC_LCAP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_NUHS,KC_ENT, KC_PGUP, KC_P4, KC_P5, KC_P6, KC_PPLS, + 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_PGDN, KC_P1, KC_P2, KC_P3, + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_APP ,KC_RCTL,KC_LEFT,KC_DOWN,KC_RGHT, KC_P0, KC_PDOT, KC_PENT + ) +}; diff --git a/keyboards/bminiex/matrix.c b/keyboards/bminiex/matrix.c new file mode 100644 index 000000000000..8faaed8ac0d0 --- /dev/null +++ b/keyboards/bminiex/matrix.c @@ -0,0 +1,122 @@ +/* +Copyright 2017 Luiz Ribeiro + +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 "matrix.h" +#include "backlight.h" + +#ifndef DEBOUNCE +#define DEBOUNCE 5 +#endif + +static uint8_t debouncing = DEBOUNCE; + +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +__attribute__ ((weak)) +void matrix_init_user(void) {} +__attribute__ ((weak)) +void matrix_scan_user(void) {} +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +void matrix_init(void) { + // all outputs for rows high + DDRB = 0xFF; + PORTB = 0xFF; + // all inputs for columns + DDRA = 0x00; + DDRC &= ~(0x111111<<2); + DDRD &= ~(1<> 1) & 0x55) | ((x << 1) & 0xaa); + x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc); + x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0); + return x; +} + +uint8_t matrix_scan(void) { + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + matrix_set_row_status(row); + _delay_us(5); + + matrix_row_t cols = ( + // cols 0..7, PORTA 0 -> 7 + (~PINA) & 0xFF + ) | ( + // cols 8..13, PORTC 7 -> 0 + bit_reverse((~PINC) & 0xFF) << 8 + ) | ( + // col 14, PORTD 7 + ((~PIND) & (1 << PIND7)) << 7 + ); + + if (matrix_debouncing[row] != cols) { + matrix_debouncing[row] = cols; + debouncing = DEBOUNCE; + } + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + + matrix_scan_quantum(); + + return 1; +} + +inline matrix_row_t matrix_get_row(uint8_t row) { + return matrix[row]; +} + +void matrix_print(void) { +} diff --git a/keyboards/bminiex/readme.md b/keyboards/bminiex/readme.md new file mode 100644 index 000000000000..204bcbbb1b77 --- /dev/null +++ b/keyboards/bminiex/readme.md @@ -0,0 +1,14 @@ +B.mini EX +========= + +A compact fullsize keyboard with RGB + +Keyboard Maintainer: QMK Community +Hardware Supported: B.mini EX PCB +Hardware Availability: https://winkeyless.kr/product/b-mini-ex-x2-pcb/ + +Make example for this keyboard (after setting up your build environment): + + make bminiex:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). \ No newline at end of file diff --git a/keyboards/bminiex/rules.mk b/keyboards/bminiex/rules.mk new file mode 100644 index 000000000000..e5d3a2a88ca0 --- /dev/null +++ b/keyboards/bminiex/rules.mk @@ -0,0 +1,56 @@ +# Copyright 2017 Luiz Ribeiro +# +# 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 . + +# MCU name +MCU = atmega32a +PROTOCOL = VUSB + +# unsupported features for now +NO_UART = yes +NO_SUSPEND_POWER_DOWN = yes + +# processor frequency +F_CPU = 12000000 + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = bootloadHID + +# build options +BOOTMAGIC_ENABLE = yes +MOUSEKEY_ENABLE = yes +EXTRAKEY_ENABLE = yes +CONSOLE_ENABLE = no +DEBUG_ENABLE = no +COMMAND_ENABLE = no +BACKLIGHT_ENABLE = yes +BACKLIGHT_CUSTOM_DRIVER = yes +RGBLIGHT_ENABLE = yes +RGBLIGHT_CUSTOM_DRIVER = yes +TAP_DANCE_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 + +OPT_DEFS = -DDEBUG_LEVEL=0 + +# custom matrix setup +CUSTOM_MATRIX = yes +SRC = matrix.c i2c.c backlight.c + +# programming options +PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex diff --git a/keyboards/bminiex/usbconfig.h b/keyboards/bminiex/usbconfig.h new file mode 100644 index 000000000000..d2d848fcdc8f --- /dev/null +++ b/keyboards/bminiex/usbconfig.h @@ -0,0 +1,396 @@ +/* Name: usbconfig.h + * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers + * Author: Christian Starkjohann + * Creation Date: 2005-04-01 + * Tabsize: 4 + * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH + * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt) + * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $ + */ + +#ifndef __usbconfig_h_included__ +#define __usbconfig_h_included__ + +#include "config.h" + +/* +General Description: +This file is an example configuration (with inline documentation) for the USB +driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is +also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may +wire the lines to any other port, as long as D+ is also wired to INT0 (or any +other hardware interrupt, as long as it is the highest level interrupt, see +section at the end of this file). +*/ + +/* ---------------------------- Hardware Config ---------------------------- */ + +#define USB_CFG_IOPORTNAME D +/* This is the port where the USB bus is connected. When you configure it to + * "B", the registers PORTB, PINB and DDRB will be used. + */ +#define USB_CFG_DMINUS_BIT 3 +/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. + * This may be any bit in the port. + */ +#define USB_CFG_DPLUS_BIT 2 +/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. + * This may be any bit in the port. Please note that D+ must also be connected + * to interrupt pin INT0! [You can also use other interrupts, see section + * "Optional MCU Description" below, or you can connect D- to the interrupt, as + * it is required if you use the USB_COUNT_SOF feature. If you use D- for the + * interrupt, the USB interrupt will also be triggered at Start-Of-Frame + * markers every millisecond.] + */ +#define USB_CFG_CLOCK_KHZ (F_CPU/1000) +/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000, + * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code + * require no crystal, they tolerate +/- 1% deviation from the nominal + * frequency. All other rates require a precision of 2000 ppm and thus a + * crystal! + * Since F_CPU should be defined to your actual clock rate anyway, you should + * not need to modify this setting. + */ +#define USB_CFG_CHECK_CRC 0 +/* Define this to 1 if you want that the driver checks integrity of incoming + * data packets (CRC checks). CRC checks cost quite a bit of code size and are + * currently only available for 18 MHz crystal clock. You must choose + * USB_CFG_CLOCK_KHZ = 18000 if you enable this option. + */ + +/* ----------------------- Optional Hardware Config ------------------------ */ + +/* #define USB_CFG_PULLUP_IOPORTNAME D */ +/* If you connect the 1.5k pullup resistor from D- to a port pin instead of + * V+, you can connect and disconnect the device from firmware by calling + * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). + * This constant defines the port on which the pullup resistor is connected. + */ +/* #define USB_CFG_PULLUP_BIT 4 */ +/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined + * above) where the 1.5k pullup resistor is connected. See description + * above for details. + */ + +/* --------------------------- Functional Range ---------------------------- */ + +#define USB_CFG_HAVE_INTRIN_ENDPOINT 1 +/* Define this to 1 if you want to compile a version with two endpoints: The + * default control endpoint 0 and an interrupt-in endpoint (any other endpoint + * number). + */ +#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1 +/* Define this to 1 if you want to compile a version with three endpoints: The + * default control endpoint 0, an interrupt-in endpoint 3 (or the number + * configured below) and a catch-all default interrupt-in endpoint as above. + * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature. + */ +#define USB_CFG_EP3_NUMBER 3 +/* If the so-called endpoint 3 is used, it can now be configured to any other + * endpoint number (except 0) with this macro. Default if undefined is 3. + */ +/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */ +/* The above macro defines the startup condition for data toggling on the + * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1. + * Since the token is toggled BEFORE sending any data, the first packet is + * sent with the oposite value of this configuration! + */ +#define USB_CFG_IMPLEMENT_HALT 0 +/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature + * for endpoint 1 (interrupt endpoint). Although you may not need this feature, + * it is required by the standard. We have made it a config option because it + * bloats the code considerably. + */ +#define USB_CFG_SUPPRESS_INTR_CODE 0 +/* Define this to 1 if you want to declare interrupt-in endpoints, but don't + * want to send any data over them. If this macro is defined to 1, functions + * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if + * you need the interrupt-in endpoints in order to comply to an interface + * (e.g. HID), but never want to send any data. This option saves a couple + * of bytes in flash memory and the transmit buffers in RAM. + */ +#define USB_CFG_INTR_POLL_INTERVAL 1 +/* If you compile a version with endpoint 1 (interrupt-in), this is the poll + * interval. The value is in milliseconds and must not be less than 10 ms for + * low speed devices. + */ +#define USB_CFG_IS_SELF_POWERED 0 +/* Define this to 1 if the device has its own power supply. Set it to 0 if the + * device is powered from the USB bus. + */ +#define USB_CFG_MAX_BUS_POWER 500 +/* Set this variable to the maximum USB bus power consumption of your device. + * The value is in milliamperes. [It will be divided by two since USB + * communicates power requirements in units of 2 mA.] + */ +#define USB_CFG_IMPLEMENT_FN_WRITE 1 +/* Set this to 1 if you want usbFunctionWrite() to be called for control-out + * transfers. Set it to 0 if you don't need it and want to save a couple of + * bytes. + */ +#define USB_CFG_IMPLEMENT_FN_READ 0 +/* Set this to 1 if you need to send control replies which are generated + * "on the fly" when usbFunctionRead() is called. If you only want to send + * data from a static buffer, set it to 0 and return the data from + * usbFunctionSetup(). This saves a couple of bytes. + */ +#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0 +/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints. + * You must implement the function usbFunctionWriteOut() which receives all + * interrupt/bulk data sent to any endpoint other than 0. The endpoint number + * can be found in 'usbRxToken'. + */ +#define USB_CFG_HAVE_FLOWCONTROL 0 +/* Define this to 1 if you want flowcontrol over USB data. See the definition + * of the macros usbDisableAllRequests() and usbEnableAllRequests() in + * usbdrv.h. + */ +#define USB_CFG_DRIVER_FLASH_PAGE 0 +/* If the device has more than 64 kBytes of flash, define this to the 64 k page + * where the driver's constants (descriptors) are located. Or in other words: + * Define this to 1 for boot loaders on the ATMega128. + */ +#define USB_CFG_LONG_TRANSFERS 0 +/* Define this to 1 if you want to send/receive blocks of more than 254 bytes + * in a single control-in or control-out transfer. Note that the capability + * for long transfers increases the driver size. + */ +/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */ +/* This macro is a hook if you want to do unconventional things. If it is + * defined, it's inserted at the beginning of received message processing. + * If you eat the received message and don't want default processing to + * proceed, do a return after doing your things. One possible application + * (besides debugging) is to flash a status LED on each packet. + */ +/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */ +/* This macro is a hook if you need to know when an USB RESET occurs. It has + * one parameter which distinguishes between the start of RESET state and its + * end. + */ +/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */ +/* This macro (if defined) is executed when a USB SET_ADDRESS request was + * received. + */ +#define USB_COUNT_SOF 1 +/* define this macro to 1 if you need the global variable "usbSofCount" which + * counts SOF packets. This feature requires that the hardware interrupt is + * connected to D- instead of D+. + */ +/* #ifdef __ASSEMBLER__ + * macro myAssemblerMacro + * in YL, TCNT0 + * sts timer0Snapshot, YL + * endm + * #endif + * #define USB_SOF_HOOK myAssemblerMacro + * This macro (if defined) is executed in the assembler module when a + * Start Of Frame condition is detected. It is recommended to define it to + * the name of an assembler macro which is defined here as well so that more + * than one assembler instruction can be used. The macro may use the register + * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages + * immediately after an SOF pulse may be lost and must be retried by the host. + * What can you do with this hook? Since the SOF signal occurs exactly every + * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in + * designs running on the internal RC oscillator. + * Please note that Start Of Frame detection works only if D- is wired to the + * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES! + */ +#define USB_CFG_CHECK_DATA_TOGGLING 0 +/* define this macro to 1 if you want to filter out duplicate data packets + * sent by the host. Duplicates occur only as a consequence of communication + * errors, when the host does not receive an ACK. Please note that you need to + * implement the filtering yourself in usbFunctionWriteOut() and + * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable + * for each control- and out-endpoint to check for duplicate packets. + */ +#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0 +/* define this macro to 1 if you want the function usbMeasureFrameLength() + * compiled in. This function can be used to calibrate the AVR's RC oscillator. + */ +#define USB_USE_FAST_CRC 0 +/* The assembler module has two implementations for the CRC algorithm. One is + * faster, the other is smaller. This CRC routine is only used for transmitted + * messages where timing is not critical. The faster routine needs 31 cycles + * per byte while the smaller one needs 61 to 69 cycles. The faster routine + * may be worth the 32 bytes bigger code size if you transmit lots of data and + * run the AVR close to its limit. + */ + +/* -------------------------- Device Description --------------------------- */ + +#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF) +/* USB vendor ID for the device, low byte first. If you have registered your + * own Vendor ID, define it here. Otherwise you may use one of obdev's free + * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF) +/* This is the ID of the product, low byte first. It is interpreted in the + * scope of the vendor ID. If you have registered your own VID with usb.org + * or if you have licensed a PID from somebody else, define it here. Otherwise + * you may use one of obdev's free shared VID/PID pairs. See the file + * USB-IDs-for-free.txt for details! + * *** IMPORTANT NOTE *** + * This template uses obdev's shared VID/PID pair for Vendor Class devices + * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand + * the implications! + */ +#define USB_CFG_DEVICE_VERSION 0x00, 0x02 +/* Version number of the device: Minor number first, then major number. + */ +#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r' +#define USB_CFG_VENDOR_NAME_LEN 13 +/* These two values define the vendor name returned by the USB device. The name + * must be given as a list of characters under single quotes. The characters + * are interpreted as Unicode (UTF-16) entities. + * If you don't want a vendor name string, undefine these macros. + * ALWAYS define a vendor name containing your Internet domain name if you use + * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for + * details. + */ +#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B' +#define USB_CFG_DEVICE_NAME_LEN 8 +/* Same as above for the device name. If you don't want a device name, undefine + * the macros. See the file USB-IDs-for-free.txt before you assign a name if + * you use a shared VID/PID. + */ +/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */ +/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */ +/* Same as above for the serial number. If you don't want a serial number, + * undefine the macros. + * It may be useful to provide the serial number through other means than at + * compile time. See the section about descriptor properties below for how + * to fine tune control over USB descriptors such as the string descriptor + * for the serial number. + */ +#define USB_CFG_DEVICE_CLASS 0 +#define USB_CFG_DEVICE_SUBCLASS 0 +/* See USB specification if you want to conform to an existing device class. + * Class 0xff is "vendor specific". + */ +#define USB_CFG_INTERFACE_CLASS 3 /* HID */ +#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */ +#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */ +/* See USB specification if you want to conform to an existing device class or + * protocol. The following classes must be set at interface level: + * HID class is 3, no subclass and protocol required (but may be useful!) + * CDC class is 2, use subclass 2 and protocol 1 for ACM + */ +#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0 +/* Define this to the length of the HID report descriptor, if you implement + * an HID device. Otherwise don't define it or define it to 0. + * If you use this define, you must add a PROGMEM character array named + * "usbHidReportDescriptor" to your code which contains the report descriptor. + * Don't forget to keep the array and this define in sync! + */ + +/* #define USB_PUBLIC static */ +/* Use the define above if you #include usbdrv.c instead of linking against it. + * This technique saves a couple of bytes in flash memory. + */ + +/* ------------------- Fine Control over USB Descriptors ------------------- */ +/* If you don't want to use the driver's default USB descriptors, you can + * provide our own. These can be provided as (1) fixed length static data in + * flash memory, (2) fixed length static data in RAM or (3) dynamically at + * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more + * information about this function. + * Descriptor handling is configured through the descriptor's properties. If + * no properties are defined or if they are 0, the default descriptor is used. + * Possible properties are: + * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched + * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is + * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if + * you want RAM pointers. + * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found + * in static memory is in RAM, not in flash memory. + * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash), + * the driver must know the descriptor's length. The descriptor itself is + * found at the address of a well known identifier (see below). + * List of static descriptor names (must be declared PROGMEM if in flash): + * char usbDescriptorDevice[]; + * char usbDescriptorConfiguration[]; + * char usbDescriptorHidReport[]; + * char usbDescriptorString0[]; + * int usbDescriptorStringVendor[]; + * int usbDescriptorStringDevice[]; + * int usbDescriptorStringSerialNumber[]; + * Other descriptors can't be provided statically, they must be provided + * dynamically at runtime. + * + * Descriptor properties are or-ed or added together, e.g.: + * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18)) + * + * The following descriptors are defined: + * USB_CFG_DESCR_PROPS_DEVICE + * USB_CFG_DESCR_PROPS_CONFIGURATION + * USB_CFG_DESCR_PROPS_STRINGS + * USB_CFG_DESCR_PROPS_STRING_0 + * USB_CFG_DESCR_PROPS_STRING_VENDOR + * USB_CFG_DESCR_PROPS_STRING_PRODUCT + * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER + * USB_CFG_DESCR_PROPS_HID + * USB_CFG_DESCR_PROPS_HID_REPORT + * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver) + * + * Note about string descriptors: String descriptors are not just strings, they + * are Unicode strings prefixed with a 2 byte header. Example: + * int serialNumberDescriptor[] = { + * USB_STRING_DESCRIPTOR_HEADER(6), + * 'S', 'e', 'r', 'i', 'a', 'l' + * }; + */ + +#define USB_CFG_DESCR_PROPS_DEVICE 0 +#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0 +#define USB_CFG_DESCR_PROPS_STRINGS 0 +#define USB_CFG_DESCR_PROPS_STRING_0 0 +#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0 +#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0 +#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0 +#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_HID 0 +#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC +//#define USB_CFG_DESCR_PROPS_HID_REPORT 0 +#define USB_CFG_DESCR_PROPS_UNKNOWN 0 + +#define usbMsgPtr_t unsigned short +/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to + * a scalar type here because gcc generates slightly shorter code for scalar + * arithmetics than for pointer arithmetics. Remove this define for backward + * type compatibility or define it to an 8 bit type if you use data in RAM only + * and all RAM is below 256 bytes (tiny memory model in IAR CC). + */ + +/* ----------------------- Optional MCU Description ------------------------ */ + +/* The following configurations have working defaults in usbdrv.h. You + * usually don't need to set them explicitly. Only if you want to run + * the driver on a device which is not yet supported or with a compiler + * which is not fully supported (such as IAR C) or if you use a differnt + * interrupt than INT0, you may have to define some of these. + */ +/* #define USB_INTR_CFG MCUCR */ +/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */ +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE GIMSK */ +/* #define USB_INTR_ENABLE_BIT INT0 */ +/* #define USB_INTR_PENDING GIFR */ +/* #define USB_INTR_PENDING_BIT INTF0 */ +/* #define USB_INTR_VECTOR INT0_vect */ + +/* Set INT1 for D- falling edge to count SOF */ +/* #define USB_INTR_CFG EICRA */ +#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10)) +/* #define USB_INTR_CFG_CLR 0 */ +/* #define USB_INTR_ENABLE EIMSK */ +#define USB_INTR_ENABLE_BIT INT1 +/* #define USB_INTR_PENDING EIFR */ +#define USB_INTR_PENDING_BIT INTF1 +#define USB_INTR_VECTOR INT1_vect + +#endif /* __usbconfig_h_included__ */ diff --git a/tmk_core/common/backlight.h b/tmk_core/common/backlight.h index f5730926745c..ef8ab9b2be92 100644 --- a/tmk_core/common/backlight.h +++ b/tmk_core/common/backlight.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef BACKLIGHT_H -#define BACKLIGHT_H +#pragma once #include #include @@ -37,5 +36,3 @@ void backlight_step(void); void backlight_set(uint8_t level); void backlight_level(uint8_t level); uint8_t get_backlight_level(void); - -#endif From dedbc37196d5b9d9ccbb5654441fd84f820c4a7b Mon Sep 17 00:00:00 2001 From: Yan-Fa Li Date: Sun, 21 Oct 2018 18:27:33 -0700 Subject: [PATCH 228/505] Doesn't need a 50ms debounce Set it to default. I have no idea what I was thinking. --- keyboards/catch22/config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/catch22/config.h b/keyboards/catch22/config.h index f151e7048f4e..c5cf8233db59 100644 --- a/keyboards/catch22/config.h +++ b/keyboards/catch22/config.h @@ -39,7 +39,7 @@ along with this program. If not, see . #define DIODE_DIRECTION COL2ROW /* Set 0 if debouncing isn't needed */ -#define DEBOUNCING_DELAY 50 +// #define DEBOUNCING_DELAY 0 /* key combination for command */ #define IS_COMMAND() ( \ From 91bfbb62560cc237066de2392eefbb271eff9d6b Mon Sep 17 00:00:00 2001 From: "Colin T.A. Gray" Date: Mon, 22 Oct 2018 14:19:51 -0400 Subject: [PATCH 229/505] Updates docs - planck 6 and macos instructions (#4201) * add note about how to install rev6 (dfu-util) * include instructions on installing dfu-util on macOS --- docs/faq_build.md | 2 ++ docs/getting_started_build_tools.md | 1 + keyboards/planck/readme.md | 4 ++++ 3 files changed, 7 insertions(+) diff --git a/docs/faq_build.md b/docs/faq_build.md index 00a0d386b913..465a283aef24 100644 --- a/docs/faq_build.md +++ b/docs/faq_build.md @@ -105,10 +105,12 @@ The solution is to remove and reinstall all affected modules. ``` brew rm avr-gcc brew rm dfu-programmer +brew rm dfu-util brew rm gcc-arm-none-eabi brew rm avrdude brew install avr-gcc brew install dfu-programmer +brew install dfu-util brew install gcc-arm-none-eabi brew install avrdude ``` diff --git a/docs/getting_started_build_tools.md b/docs/getting_started_build_tools.md index c1e02d4e0727..dd3e7805a9f5 100644 --- a/docs/getting_started_build_tools.md +++ b/docs/getting_started_build_tools.md @@ -58,6 +58,7 @@ If you're using [homebrew,](http://brew.sh/) you can use the following commands: brew update brew install avr-gcc@7 brew install dfu-programmer + brew install dfu-util brew install gcc-arm-none-eabi brew install avrdude diff --git a/keyboards/planck/readme.md b/keyboards/planck/readme.md index f857c546cc88..083279e8a62d 100644 --- a/keyboards/planck/readme.md +++ b/keyboards/planck/readme.md @@ -13,4 +13,8 @@ Make example for this keyboard (after setting up your build environment): make planck/rev4:default +Install examples: + + make planck/rev6:default:dfu-util + See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. From fbc6bd82664f7286e358e14da6c7945aa061ee3b Mon Sep 17 00:00:00 2001 From: Dylan Khor Date: Mon, 22 Oct 2018 14:29:04 -0400 Subject: [PATCH 230/505] Minor updates to build tools docs revised (#4195) * add initial khord iris keymap * correct path of windows qmk install script --- docs/getting_started_build_tools.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/getting_started_build_tools.md b/docs/getting_started_build_tools.md index dd3e7805a9f5..88f3642b280f 100644 --- a/docs/getting_started_build_tools.md +++ b/docs/getting_started_build_tools.md @@ -62,7 +62,7 @@ If you're using [homebrew,](http://brew.sh/) you can use the following commands: brew install gcc-arm-none-eabi brew install avrdude -This is the recommended method. If you don't have homebrew, [install it!](http://brew.sh/) It's very much worth it for anyone who works in the command line. Note that the `make` and `make install` portion during the homebrew installation of avr-libc can take over 20 minutes and exhibit high CPU usage. +This is the recommended method. If you don't have homebrew, [install it!](http://brew.sh/) It's very much worth it for anyone who works in the command line. Note that the `make` and `make install` portion during the homebrew installation of `avr-gcc@7` can take over 20 minutes and exhibit high CPU usage. ## Windows with msys2 (recommended) @@ -70,9 +70,9 @@ The best environment to use, for Windows Vista through any later version (tested * Install msys2 by downloading it and following the instructions here: http://www.msys2.org * Open the ``MSYS2 MingGW 64-bit`` shortcut -* Navigate to your qmk checkout. For example, if it's in the root of your c drive: +* Navigate to your QMK repository. For example, if it's in the root of your c drive: * `$ cd /c/qmk_firmware` -* Run `util/msys2_install.sh` and follow the prompts +* Run `util/qmk_install.sh` and follow the prompts ## Windows 10 (deprecated) These are the old instructions for Windows 10. We recommend you use [MSYS2 as outlined above](#windows-with-msys2-recommended). From 4665e4ffffcdfc6fe6f498928963adc64f6fefd7 Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Tue, 23 Oct 2018 03:38:05 +0900 Subject: [PATCH 231/505] Keyboard: Helix serial.c, split_scom.c bug fix and update (#4191) * helix/serial.c add support PD1,PD3,PE6 and configuration simplify * Add comment about ATmega32U4 I2C * Add compile time check for ATmega32U4 I2C * change TAB code to 8 SPACE code * Helix serial.c PORTD,PD0 test. OK OK PD0 - PD1 OK PD2 - PD3 - PE6 * Helix serial.c PORTD,PD1 test. OK OK PD0 OK PD1 OK PD2 - PD3 - PE6 * Helix serial.c PORTD,PD3 test. OK OK PD0 OK PD1 OK PD2 OK PD3 - PE6 * Helix serial.c PORTE,PD6 test. OK OK PD0 OK PD1 OK PD2 OK PD3 OK PE6 * Helix serial.c: PD0,PD1,PD3,PE6 all test end * Helix serial.c: rename SOFT_SERIAL_PORT to SOFT_SERIAL_PIN * Helix serial.c add debug code * Helix serial.c: add transaction ID range check * Helix serial.c debug code update * Helix serial.c debug code update * Helix serial.c: Strict checking of the value of tid. * adjust the delay of serial.c * Helix serial.c: remove debug code * remove EXTRAFLAGS += -DCONSOLE_ENABLE from five_rows/rules.mk tmk_core/common.mk has >ifeq ($(strip $(CONSOLE_ENABLE)), yes) > TMK_COMMON_DEFS += -DCONSOLE_ENABLE * Fix error handling in split_scomm.c * add some comment to serial.c * add some comment about SELECT_SOFT_SERIAL_SPEED --- keyboards/helix/pico/serial_config.h | 15 +- .../rev1/keymaps/OLED_sample/serial_config.h | 15 +- keyboards/helix/rev1/serial_config.h | 15 +- .../helix/rev2/keymaps/five_rows/rules.mk | 4 - keyboards/helix/rev2/serial_config.h | 15 +- keyboards/helix/rev2/split_scomm.c | 48 +++- keyboards/helix/serial.c | 228 +++++++++++++----- keyboards/helix/serial.h | 22 +- 8 files changed, 227 insertions(+), 135 deletions(-) diff --git a/keyboards/helix/pico/serial_config.h b/keyboards/helix/pico/serial_config.h index 82c6e4e836e3..fc8736d4729e 100644 --- a/keyboards/helix/pico/serial_config.h +++ b/keyboards/helix/pico/serial_config.h @@ -1,16 +1,9 @@ -#ifndef SOFT_SERIAL_CONFIG_H -#define SOFT_SERIAL_CONFIG_H +//// #error rev2 serial config +#ifndef SOFT_SERIAL_PIN /* Soft Serial defines */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD2) -#define SERIAL_PIN_INTERRUPT INT2_vect +#define SOFT_SERIAL_PIN D2 #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 #define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 - -//// #error rev2 serial config - -#endif /* SOFT_SERIAL_CONFIG_H */ +#endif diff --git a/keyboards/helix/rev1/keymaps/OLED_sample/serial_config.h b/keyboards/helix/rev1/keymaps/OLED_sample/serial_config.h index b991b874b73c..f56951e707fb 100644 --- a/keyboards/helix/rev1/keymaps/OLED_sample/serial_config.h +++ b/keyboards/helix/rev1/keymaps/OLED_sample/serial_config.h @@ -1,16 +1,9 @@ -#ifndef SOFT_SERIAL_CONFIG_H -#define SOFT_SERIAL_CONFIG_H +//// #error rev1/keymaps/OLED_sample serial config +#ifndef SOFT_SERIAL_PIN /* Soft Serial defines */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD2) -#define SERIAL_PIN_INTERRUPT INT2_vect +#define SOFT_SERIAL_PIN D2 #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 #define SERIAL_MASTER_BUFFER_LENGTH 0 - -//// #error rev1/keymaps/OLED_sample serial config - -#endif /* SOFT_SERIAL_CONFIG_H */ +#endif diff --git a/keyboards/helix/rev1/serial_config.h b/keyboards/helix/rev1/serial_config.h index 51c6aa3750ad..32218f9bbec3 100644 --- a/keyboards/helix/rev1/serial_config.h +++ b/keyboards/helix/rev1/serial_config.h @@ -1,16 +1,9 @@ -#ifndef SOFT_SERIAL_CONFIG_H -#define SOFT_SERIAL_CONFIG_H +/// #error rev1 serial config +#ifndef SOFT_SERIAL_PIN /* Soft Serial defines */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD0) -#define SERIAL_PIN_INTERRUPT INT0_vect +#define SOFT_SERIAL_PIN D0 #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 #define SERIAL_MASTER_BUFFER_LENGTH 0 - -/// #error rev1 serial config - -#endif /* SOFT_SERIAL_CONFIG_H */ +#endif diff --git a/keyboards/helix/rev2/keymaps/five_rows/rules.mk b/keyboards/helix/rev2/keymaps/five_rows/rules.mk index 63106df76450..f771c94c9ce4 100644 --- a/keyboards/helix/rev2/keymaps/five_rows/rules.mk +++ b/keyboards/helix/rev2/keymaps/five_rows/rules.mk @@ -122,10 +122,6 @@ ifeq ($(strip $(Link_Time_Optimization)),yes) EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization endif -ifeq ($(strip $(CONSOLE_ENABLE)),yes) - EXTRAFLAGS += -DCONSOLE_ENABLE -endif - # 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/helix/rev2/serial_config.h b/keyboards/helix/rev2/serial_config.h index 8d7e6283783c..37135213d55f 100644 --- a/keyboards/helix/rev2/serial_config.h +++ b/keyboards/helix/rev2/serial_config.h @@ -1,15 +1,8 @@ -#ifndef SOFT_SERIAL_CONFIG_H -#define SOFT_SERIAL_CONFIG_H +//// #error rev2 serial config +#ifndef SOFT_SERIAL_PIN /* Soft Serial defines */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD2) -#define SERIAL_PIN_INTERRUPT INT2_vect +#define SOFT_SERIAL_PIN D2 #define SERIAL_USE_MULTI_TRANSACTION - -//// #error rev2 serial config - -#endif /* SOFT_SERIAL_CONFIG_H */ +#endif diff --git a/keyboards/helix/rev2/split_scomm.c b/keyboards/helix/rev2/split_scomm.c index 9719eb22ea19..50d233ce9afd 100644 --- a/keyboards/helix/rev2/split_scomm.c +++ b/keyboards/helix/rev2/split_scomm.c @@ -10,6 +10,9 @@ #ifdef SERIAL_DEBUG_MODE #include #endif +#ifdef CONSOLE_ENABLE + #include +#endif uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; @@ -17,6 +20,7 @@ uint8_t volatile status_com = 0; uint8_t volatile status1 = 0; uint8_t slave_buffer_change_count = 0; uint8_t s_change_old = 0xff; +uint8_t s_change_new = 0xff; SSTD_t transactions[] = { #define GET_SLAVE_STATUS 0 @@ -41,12 +45,12 @@ SSTD_t transactions[] = { void serial_master_init(void) { - soft_serial_initiator_init(transactions); + soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } void serial_slave_init(void) { - soft_serial_target_init(transactions); + soft_serial_target_init(transactions, TID_LIMIT(transactions)); } // 0 => no error @@ -54,19 +58,37 @@ void serial_slave_init(void) // 2 => checksum error int serial_update_buffers(int master_update) { - int status; + int status, smatstatus; static int need_retry = 0; - if( s_change_old != slave_buffer_change_count ) { - status = soft_serial_transaction(GET_SLAVE_BUFFER); - if( status == TRANSACTION_END ) - s_change_old = slave_buffer_change_count; + + if( s_change_old != s_change_new ) { + smatstatus = soft_serial_transaction(GET_SLAVE_BUFFER); + if( smatstatus == TRANSACTION_END ) { + s_change_old = s_change_new; +#ifdef CONSOLE_ENABLE + uprintf("slave matrix = %b %b %b %b %b\n", + serial_slave_buffer[0], serial_slave_buffer[1], + serial_slave_buffer[2], serial_slave_buffer[3], + serial_slave_buffer[4] ); +#endif + } + } else { + // serial_slave_buffer dosen't change + smatstatus = TRANSACTION_END; // dummy status + } + + if( !master_update && !need_retry) { + status = soft_serial_transaction(GET_SLAVE_STATUS); + } else { + status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS); + } + if( status == TRANSACTION_END ) { + s_change_new = slave_buffer_change_count; + need_retry = 0; + } else { + need_retry = 1; } - if( !master_update && !need_retry) - status = soft_serial_transaction(GET_SLAVE_STATUS); - else - status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS); - need_retry = ( status == TRANSACTION_END ) ? 0 : 1; - return status; + return smatstatus; } #endif // SERIAL_USE_MULTI_TRANSACTION diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c index 11ceff0b37cd..830f86b55a68 100644 --- a/keyboards/helix/serial.c +++ b/keyboards/helix/serial.c @@ -14,7 +14,56 @@ #include "serial.h" //#include -#ifdef USE_SERIAL +#ifdef SOFT_SERIAL_PIN + +#ifdef __AVR_ATmega32U4__ + // if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial. + #ifdef USE_I2C + #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 + #error Using ATmega32U4 I2C, so can not use PD0, PD1 + #endif + #endif + + #if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3 + #define SERIAL_PIN_DDR DDRD + #define SERIAL_PIN_PORT PORTD + #define SERIAL_PIN_INPUT PIND + #if SOFT_SERIAL_PIN == D0 + #define SERIAL_PIN_MASK _BV(PD0) + #define EIMSK_BIT _BV(INT0) + #define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01))) + #define SERIAL_PIN_INTERRUPT INT0_vect + #elif SOFT_SERIAL_PIN == D1 + #define SERIAL_PIN_MASK _BV(PD1) + #define EIMSK_BIT _BV(INT1) + #define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11))) + #define SERIAL_PIN_INTERRUPT INT1_vect + #elif SOFT_SERIAL_PIN == D2 + #define SERIAL_PIN_MASK _BV(PD2) + #define EIMSK_BIT _BV(INT2) + #define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21))) + #define SERIAL_PIN_INTERRUPT INT2_vect + #elif SOFT_SERIAL_PIN == D3 + #define SERIAL_PIN_MASK _BV(PD3) + #define EIMSK_BIT _BV(INT3) + #define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31))) + #define SERIAL_PIN_INTERRUPT INT3_vect + #endif + #elif SOFT_SERIAL_PIN == E6 + #define SERIAL_PIN_DDR DDRE + #define SERIAL_PIN_PORT PORTE + #define SERIAL_PIN_INPUT PINE + #define SERIAL_PIN_MASK _BV(PE6) + #define EIMSK_BIT _BV(INT6) + #define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) + #define SERIAL_PIN_INTERRUPT INT6_vect + #else + #error invalid SOFT_SERIAL_PIN value + #endif + +#else + #error serial.c now support ATmega32U4 only +#endif #ifndef SERIAL_USE_MULTI_TRANSACTION /* --- USE Simple API (OLD API, compatible with let's split serial.c) */ @@ -42,16 +91,20 @@ SSTD_t transactions[] = { }; void serial_master_init(void) -{ soft_serial_initiator_init(transactions); } +{ soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } void serial_slave_init(void) -{ soft_serial_target_init(transactions); } +{ soft_serial_target_init(transactions, TID_LIMIT(transactions)); } // 0 => no error // 1 => slave did not respond // 2 => checksum error int serial_update_buffers() -{ return soft_serial_transaction(); } +{ + int result; + result = soft_serial_transaction(); + return result; +} #endif // Simple API (OLD API, compatible with let's split serial.c) @@ -59,39 +112,66 @@ int serial_update_buffers() #define NO_INLINE __attribute__((noinline)) #define _delay_sub_us(x) __builtin_avr_delay_cycles(x) -// Serial pulse period in microseconds. -#define TID_SEND_ADJUST 14 +// parity check +#define ODD_PARITY 1 +#define EVEN_PARITY 0 +#define PARITY EVEN_PARITY + +#ifdef SERIAL_DELAY + // custom setup in config.h + // #define TID_SEND_ADJUST 2 + // #define SERIAL_DELAY 6 // micro sec + // #define READ_WRITE_START_ADJUST 30 // cycles + // #define READ_WRITE_WIDTH_ADJUST 8 // cycles +#else +// ============ Standard setups ============ + +#ifndef SELECT_SOFT_SERIAL_SPEED +#define SELECT_SOFT_SERIAL_SPEED 1 +// 0: about 189kbps +// 1: about 137kbps (default) +// 2: about 75kbps +// 3: about 39kbps +// 4: about 26kbps +// 5: about 20kbps +#endif + +#define TID_SEND_ADJUST 2 -#define SELECT_SERIAL_SPEED 1 -#if SELECT_SERIAL_SPEED == 0 +#if SELECT_SOFT_SERIAL_SPEED == 0 // Very High speed #define SERIAL_DELAY 4 // micro sec #define READ_WRITE_START_ADJUST 33 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 1 + #define READ_WRITE_WIDTH_ADJUST 6 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 1 // High speed #define SERIAL_DELAY 6 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 2 + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 2 // Middle speed #define SERIAL_DELAY 12 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 3 + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 3 // Low speed #define SERIAL_DELAY 24 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 4 + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 4 // Very Low speed - #define SERIAL_DELAY 50 // micro sec + #define SERIAL_DELAY 36 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 5 + // Ultra Low speed + #define SERIAL_DELAY 48 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles #else -#error Illegal Serial Speed -#endif - +#error invalid SELECT_SOFT_SERIAL_SPEED value +#endif /* SELECT_SOFT_SERIAL_SPEED */ +#endif /* SERIAL_DELAY */ #define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) #define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) @@ -105,6 +185,7 @@ int serial_update_buffers() #endif static SSTD_t *Transaction_table = NULL; +static uint8_t Transaction_table_size = 0; inline static void serial_delay(void) { @@ -152,30 +233,28 @@ void serial_high(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } -void soft_serial_initiator_init(SSTD_t *sstd_table) +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size) { Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; serial_output(); serial_high(); } -void soft_serial_target_init(SSTD_t *sstd_table) +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size) { Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; serial_input_with_pullup(); -#if SERIAL_PIN_MASK == _BV(PD0) - // Enable INT0 - EIMSK |= _BV(INT0); - // Trigger on falling edge of INT0 - EICRA &= ~(_BV(ISC00) | _BV(ISC01)); -#elif SERIAL_PIN_MASK == _BV(PD2) - // Enable INT2 - EIMSK |= _BV(INT2); - // Trigger on falling edge of INT2 - EICRA &= ~(_BV(ISC20) | _BV(ISC21)); + // Enable INT0-INT3,INT6 + EIMSK |= EIMSK_BIT; +#if SERIAL_PIN_MASK == _BV(PE6) + // Trigger on falling edge of INT6 + EICRB &= EICRx_BIT; #else - #error unknown SERIAL_PIN_MASK value + // Trigger on falling edge of INT0-INT3 + EICRA &= EICRx_BIT; #endif } @@ -205,12 +284,12 @@ static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { uint8_t byte, i, p, pb; _delay_sub_us(READ_WRITE_START_ADJUST); - for( i = 0, byte = 0, p = 0; i < bit; i++ ) { + for( i = 0, byte = 0, p = PARITY; i < bit; i++ ) { serial_delay_half1(); // read the middle of pulses if( serial_read_pin() ) { - byte = (byte << 1) | 1; p ^= 1; + byte = (byte << 1) | 1; p ^= 1; } else { - byte = (byte << 1) | 0; p ^= 0; + byte = (byte << 1) | 0; p ^= 0; } _delay_sub_us(READ_WRITE_WIDTH_ADJUST); serial_delay_half2(); @@ -230,13 +309,13 @@ static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE; void serial_write_chunk(uint8_t data, uint8_t bit) { uint8_t b, p; - for( p = 0, b = 1<<(bit-1); b ; b >>= 1) { - if(data & b) { - serial_high(); p ^= 1; - } else { - serial_low(); p ^= 0; - } - serial_delay(); + for( p = PARITY, b = 1<<(bit-1); b ; b >>= 1) { + if(data & b) { + serial_high(); p ^= 1; + } else { + serial_low(); p ^= 0; + } + serial_delay(); } /* send parity bit */ if(p & 1) { serial_high(); } @@ -288,6 +367,13 @@ void change_reciver2sender(void) { serial_delay_half1(); //4 } +static inline uint8_t nibble_bits_count(uint8_t bits) +{ + bits = (bits & 0x5) + (bits >> 1 & 0x5); + bits = (bits & 0x3) + (bits >> 2 & 0x3); + return bits; +} + // interrupt handle to be used by the target device ISR(SERIAL_PIN_INTERRUPT) { @@ -297,12 +383,15 @@ ISR(SERIAL_PIN_INTERRUPT) { SSTD_t *trans = Transaction_table; #else // recive transaction table index - uint8_t tid; + uint8_t tid, bits; uint8_t pecount = 0; sync_recv(); - tid = serial_read_chunk(&pecount,4); - if(pecount> 0) + bits = serial_read_chunk(&pecount,7); + tid = bits>>3; + bits = (bits&7) != nibble_bits_count(tid); + if( bits || pecount> 0 || tid > Transaction_table_size ) { return; + } serial_delay_half1(); serial_high(); // response step1 low->high @@ -315,17 +404,17 @@ ISR(SERIAL_PIN_INTERRUPT) { // target send phase if( trans->target2initiator_buffer_size > 0 ) serial_send_packet((uint8_t *)trans->target2initiator_buffer, - trans->target2initiator_buffer_size); + trans->target2initiator_buffer_size); // target switch to input change_sender2reciver(); // target recive phase if( trans->initiator2target_buffer_size > 0 ) { if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer, - trans->initiator2target_buffer_size) ) { - *trans->status = TRANSACTION_ACCEPTED; + trans->initiator2target_buffer_size) ) { + *trans->status = TRANSACTION_ACCEPTED; } else { - *trans->status = TRANSACTION_DATA_ERROR; + *trans->status = TRANSACTION_DATA_ERROR; } } else { *trans->status = TRANSACTION_ACCEPTED; @@ -349,6 +438,8 @@ int soft_serial_transaction(void) { SSTD_t *trans = Transaction_table; #else int soft_serial_transaction(int sstd_index) { + if( sstd_index > Transaction_table_size ) + return TRANSACTION_TYPE_ERROR; SSTD_t *trans = &Transaction_table[sstd_index]; #endif cli(); @@ -375,9 +466,10 @@ int soft_serial_transaction(int sstd_index) { #else // send transaction table index + int tid = (sstd_index<<3) | (7 & nibble_bits_count(sstd_index)); sync_send(); _delay_sub_us(TID_SEND_ADJUST); - serial_write_chunk(sstd_index, 4); + serial_write_chunk(tid, 7); serial_delay_half1(); // wait for the target response (step1 low->high) @@ -389,12 +481,12 @@ int soft_serial_transaction(int sstd_index) { // check if the target is present (step2 high->low) for( int i = 0; serial_read_pin(); i++ ) { if (i > SLAVE_INT_ACK_WIDTH + 1) { - // slave failed to pull the line low, assume not present - serial_output(); - serial_high(); - *trans->status = TRANSACTION_NO_RESPONSE; - sei(); - return TRANSACTION_NO_RESPONSE; + // slave failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; + sei(); + return TRANSACTION_NO_RESPONSE; } _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT); } @@ -404,12 +496,12 @@ int soft_serial_transaction(int sstd_index) { // if the target is present syncronize with it if( trans->target2initiator_buffer_size > 0 ) { if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer, - trans->target2initiator_buffer_size) ) { - serial_output(); - serial_high(); - *trans->status = TRANSACTION_DATA_ERROR; - sei(); - return TRANSACTION_DATA_ERROR; + trans->target2initiator_buffer_size) ) { + serial_output(); + serial_high(); + *trans->status = TRANSACTION_DATA_ERROR; + sei(); + return TRANSACTION_DATA_ERROR; } } @@ -419,7 +511,7 @@ int soft_serial_transaction(int sstd_index) { // initiator send phase if( trans->initiator2target_buffer_size > 0 ) { serial_send_packet((uint8_t *)trans->initiator2target_buffer, - trans->initiator2target_buffer_size); + trans->initiator2target_buffer_size); } // always, release the line when not in use @@ -442,3 +534,9 @@ int soft_serial_get_and_clean_status(int sstd_index) { #endif #endif + +// Helix serial.c history +// 2018-1-29 fork from let's split (#2308) +// 2018-6-28 bug fix master to slave comm (#3255) +// 2018-8-11 improvements (#3608) +// 2018-10-21 fix serial and RGB animation conflict (#4191) diff --git a/keyboards/helix/serial.h b/keyboards/helix/serial.h index d2b7fd8e60be..7e0c0847a431 100644 --- a/keyboards/helix/serial.h +++ b/keyboards/helix/serial.h @@ -4,14 +4,16 @@ #include // ///////////////////////////////////////////////////////////////// -// Need Soft Serial defines in serial_config.h +// Need Soft Serial defines in config.h // ///////////////////////////////////////////////////////////////// // ex. -// #define SERIAL_PIN_DDR DDRD -// #define SERIAL_PIN_PORT PORTD -// #define SERIAL_PIN_INPUT PIND -// #define SERIAL_PIN_MASK _BV(PD?) ?=0,2 -// #define SERIAL_PIN_INTERRUPT INT?_vect ?=0,2 +// #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6 +// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5 +// // 1: about 137kbps (default) +// // 2: about 75kbps +// // 3: about 39kbps +// // 4: about 26kbps +// // 5: about 20kbps // // //// USE Simple API (OLD API, compatible with let's split serial.c) // ex. @@ -47,16 +49,18 @@ typedef struct _SSTD_t { uint8_t target2initiator_buffer_size; uint8_t *target2initiator_buffer; } SSTD_t; +#define TID_LIMIT( table ) (sizeof(table) / sizeof(SSTD_t)) // initiator is transaction start side -void soft_serial_initiator_init(SSTD_t *sstd_table); +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size); // target is interrupt accept side -void soft_serial_target_init(SSTD_t *sstd_table); +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size); // initiator resullt #define TRANSACTION_END 0 #define TRANSACTION_NO_RESPONSE 0x1 #define TRANSACTION_DATA_ERROR 0x2 +#define TRANSACTION_TYPE_ERROR 0x4 #ifndef SERIAL_USE_MULTI_TRANSACTION int soft_serial_transaction(void); #else @@ -72,7 +76,7 @@ int soft_serial_transaction(int sstd_index); // target: // TRANSACTION_DATA_ERROR // or TRANSACTION_ACCEPTED -#define TRANSACTION_ACCEPTED 0x4 +#define TRANSACTION_ACCEPTED 0x8 #ifdef SERIAL_USE_MULTI_TRANSACTION int soft_serial_get_and_clean_status(int sstd_index); #endif From f69333a0e57ca767d49b3155a31fd6d30114dced Mon Sep 17 00:00:00 2001 From: Naoki Katahira Date: Tue, 23 Oct 2018 03:39:26 +0900 Subject: [PATCH 232/505] Lily58 default keymap fix / add keymap (#4190) * keymap fix/add * keymap fix * file fix * typo fix --- keyboards/lily58/keymaps/default/config.h | 2 - keyboards/lily58/keymaps/default/keymap.c | 60 ++-- keyboards/lily58/keymaps/default/rules.mk | 1 - keyboards/lily58/keymaps/yuchi/config.h | 39 +++ keyboards/lily58/keymaps/yuchi/keymap.c | 148 ++++++++++ keyboards/lily58/keymaps/yuchi/rules.mk | 22 ++ keyboards/lily58/rev1/rev1.c | 12 +- keyboards/lily58/rules.mk | 4 +- keyboards/lily58/split_util.c | 3 - keyboards/lily58/ssd1306.c | 330 ---------------------- keyboards/lily58/ssd1306.h | 94 ------ 11 files changed, 237 insertions(+), 478 deletions(-) create mode 100644 keyboards/lily58/keymaps/yuchi/config.h create mode 100644 keyboards/lily58/keymaps/yuchi/keymap.c create mode 100644 keyboards/lily58/keymaps/yuchi/rules.mk delete mode 100644 keyboards/lily58/ssd1306.c delete mode 100644 keyboards/lily58/ssd1306.h diff --git a/keyboards/lily58/keymaps/default/config.h b/keyboards/lily58/keymaps/default/config.h index 3077c94632c9..fd0978559361 100644 --- a/keyboards/lily58/keymaps/default/config.h +++ b/keyboards/lily58/keymaps/default/config.h @@ -19,8 +19,6 @@ along with this program. If not, see . */ #pragma once -#include "config.h" - /* Use I2C or Serial, not both */ #define USE_SERIAL diff --git a/keyboards/lily58/keymaps/default/keymap.c b/keyboards/lily58/keymaps/default/keymap.c index 624ce210b187..8d770581293d 100644 --- a/keyboards/lily58/keymaps/default/keymap.c +++ b/keyboards/lily58/keymaps/default/keymap.c @@ -19,7 +19,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* QWERTY * ,-----------------------------------------. ,-----------------------------------------. - * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ~ | + * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | Tab | Q | W | E | R | T | | Y | U | I | O | P | - | * |------+------+------+------+------+------| |------+------+------+------+------+------| @@ -27,9 +27,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift| * `-----------------------------------------/ / \ \-----------------------------------------' - * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE |BackSP| RGUI | * | | | |/ / \ \ | | | | - * `-------------------''-------' '------''--------------------' + * `----------------------------' '------''--------------------' */ [_QWERTY] = LAYOUT( \ @@ -37,53 +37,52 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_LCTRL, 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_LBRC, KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ - LOWER,KC_LGUI, KC_LALT, KC_SPC, KC_ENT, KC_BSPC, KC_RGUI, RAISE \ + KC_LALT, KC_LGUI,LOWER, KC_SPC, KC_ENT, RAISE, KC_BSPC, KC_RGUI \ ), /* LOWER * ,-----------------------------------------. ,-----------------------------------------. - * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | + * | | | | | | | | | | | | | | * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | |-------. ,-------| | _ | + | | | | + * | ` | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | - | * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| - * | | | | | | |-------| |-------| |ISO ~ |ISO | | | | | + * | | | | | | |-------| |-------| | _ | + | { | } | | | * `-----------------------------------------/ / \ \-----------------------------------------' - * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE |BackSP| RGUI | * | | | |/ / \ \ | | | | - * `-------------------''-------' '------''--------------------' + * `----------------------------' '------''--------------------' */ [_LOWER] = LAYOUT( \ - 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_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ - _______, _______, _______, _______, _______, _______, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______,S(KC_NUHS),S(KC_NUBS),_______, _______, _______,\ + _______, _______, _______, _______, _______, _______, _______, _______, _______,_______, _______, _______,\ + 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_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_TILD, \ + _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ _______, _______, _______, _______, _______, _______, _______, _______\ ), /* RAISE * ,-----------------------------------------. ,-----------------------------------------. - * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | + * | | | | | | | | | | | | | | * |------+------+------+------+------+------| |------+------+------+------+------+------| * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | * |------+------+------+------+------+------| |------+------+------+------+------+------| - * | | | | | | |-------. ,-------| | Left | Down | Up |Right | | + * | F1 | F2 | F3 | F4 | F5 | F6 |-------. ,-------| | Left | Down | Up |Right | | * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| - * | | | | | | |-------| |-------| + | - | = | [ | ] | \ | + * | F7 | F8 | F9 | F10 | F11 | F12 |-------| |-------| + | - | = | [ | ] | \ | * `-----------------------------------------/ / \ \-----------------------------------------' - * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE |BackSP| RGUI | * | | | |/ / \ \ | | | | - * `-------------------''-------' '------''--------------------' + * `----------------------------' '------''--------------------' */ [_RAISE] = LAYOUT( \ - 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_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ - _______, _______, _______, _______, _______, _______, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, \ - _______, _______, _______, _______, _______, _______, _______, _______, KC_PLUS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, \ + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_PLUS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ _______, _______, _______, _______, _______, _______, _______, _______ \ ), - -/* ADJUST (Layers for Underglow) +/* ADJUST * ,-----------------------------------------. ,-----------------------------------------. * | | | | | | | | | | | | | | * |------+------+------+------+------+------| |------+------+------+------+------+------| @@ -93,9 +92,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------| | | |------+------+------+------+------+------| * | | | | | | |-------| |-------| | | | | | | * `-----------------------------------------/ / \ \-----------------------------------------' - * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE |BackSP| RGUI | * | | | |/ / \ \ | | | | - * `-------------------''-------' '------''--------------------' + * `----------------------------' '------''--------------------' */ [_ADJUST] = LAYOUT( \ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ @@ -107,17 +106,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; - -void persistent_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) { - print("mode just switched to qwerty and this is a huge string\n"); + if (record->event.pressed) { set_single_persistent_default_layer(_QWERTY); } return false; diff --git a/keyboards/lily58/keymaps/default/rules.mk b/keyboards/lily58/keymaps/default/rules.mk index 73777a1b7859..3d2d3c9e0f6c 100644 --- a/keyboards/lily58/keymaps/default/rules.mk +++ b/keyboards/lily58/keymaps/default/rules.mk @@ -4,7 +4,6 @@ # the appropriate keymap folder that will get included automatically # -OLED_ENABLE = no RGBLIGHT_ENABLE = no BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) diff --git a/keyboards/lily58/keymaps/yuchi/config.h b/keyboards/lily58/keymaps/yuchi/config.h new file mode 100644 index 000000000000..fd0978559361 --- /dev/null +++ b/keyboards/lily58/keymaps/yuchi/config.h @@ -0,0 +1,39 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +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 . +*/ +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +// Underglow +/* +#undef RGBLED_NUM +#define RGBLED_NUM 14 // Number of LEDs +#define RGBLIGHT_ANIMATIONS +#define RGBLIGHT_SLEEP +*/ \ No newline at end of file diff --git a/keyboards/lily58/keymaps/yuchi/keymap.c b/keyboards/lily58/keymaps/yuchi/keymap.c new file mode 100644 index 000000000000..d708dbec7665 --- /dev/null +++ b/keyboards/lily58/keymaps/yuchi/keymap.c @@ -0,0 +1,148 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, +}; + + +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 | - | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * |LCTRL | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' | + * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| + * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift| + * `-----------------------------------------/ / \ \-----------------------------------------' + * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | | | |/ / \ \ | | | | + * `-------------------''-------' '------''--------------------' + */ + + [_QWERTY] = LAYOUT( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, 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_MINS, \ + KC_LCTRL, 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_LBRC, KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + LOWER,KC_LGUI, KC_LALT, KC_SPC, KC_ENT, KC_BSPC, KC_RGUI, RAISE \ +), +/* LOWER + * ,-----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ~ | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | - | + * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| + * | | | | | | |-------| |-------| | _ | + | { | } | | | + * `-----------------------------------------/ / \ \-----------------------------------------' + * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | | | |/ / \ \ | | | | + * `-------------------''-------' '------''--------------------' + */ +[_LOWER] = LAYOUT( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______,_______, _______, _______,\ + 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_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_TILD, \ + _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, _______, _______, _______, _______, _______, _______, _______\ +), +/* RAISE + * ,-----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | F1 | F2 | F3 | F4 | F5 | F6 |-------. ,-------| | Left | Down | Up |Right | | + * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------| + * | F7 | F8 | F9 | F10 | F11 | F12 |-------| |-------| + | - | = | [ | ] | \ | + * `-----------------------------------------/ / \ \-----------------------------------------' + * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | | | |/ / \ \ | | | | + * `-------------------''-------' '------''--------------------' + */ + +[_RAISE] = LAYOUT( \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, \ + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_PLUS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, _______, _______, _______, _______, _______, _______, _______ \ +), + +/* ADJUST + * ,-----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | |-------. ,-------| | | | | | | + * |------+------+------+------+------+------| | | |------+------+------+------+------+------| + * | | | | | | |-------| |-------| | | | | | | + * `-----------------------------------------/ / \ \-----------------------------------------' + * |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE | + * | | | |/ / \ \ | | | | + * `-------------------''-------' '------''--------------------' + */ + [_ADJUST] = LAYOUT( \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\ + _______, _______, _______, _______, _______, _______, _______, _______ \ + ) +}; + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + 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 diff --git a/keyboards/lily58/keymaps/yuchi/rules.mk b/keyboards/lily58/keymaps/yuchi/rules.mk new file mode 100644 index 000000000000..73777a1b7859 --- /dev/null +++ b/keyboards/lily58/keymaps/yuchi/rules.mk @@ -0,0 +1,22 @@ + +# 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 +# + +OLED_ENABLE = no +RGBLIGHT_ENABLE = no + +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 = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +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 +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 \ No newline at end of file diff --git a/keyboards/lily58/rev1/rev1.c b/keyboards/lily58/rev1/rev1.c index 64dd084b21ab..4c54d7717c38 100644 --- a/keyboards/lily58/rev1/rev1.c +++ b/keyboards/lily58/rev1/rev1.c @@ -1,14 +1,5 @@ #include "lily58.h" -/* -#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) { // // green led on @@ -20,5 +11,4 @@ void matrix_init_kb(void) { // PORTB &= ~(1<<0); matrix_init_user(); -}; - +}; \ No newline at end of file diff --git a/keyboards/lily58/rules.mk b/keyboards/lily58/rules.mk index 23527476a34e..72964fca1b3d 100644 --- a/keyboards/lily58/rules.mk +++ b/keyboards/lily58/rules.mk @@ -1,9 +1,7 @@ SRC += matrix.c \ i2c.c \ split_util.c \ - serial.c \ - ssd1306.c - + serial.c # MCU name #MCU = at90usb1287 MCU = atmega32u4 diff --git a/keyboards/lily58/split_util.c b/keyboards/lily58/split_util.c index ff069b7e2819..49b065518c8f 100644 --- a/keyboards/lily58/split_util.c +++ b/keyboards/lily58/split_util.c @@ -34,9 +34,6 @@ 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/lily58/ssd1306.c b/keyboards/lily58/ssd1306.c deleted file mode 100644 index d07900119946..000000000000 --- a/keyboards/lily58/ssd1306.c +++ /dev/null @@ -1,330 +0,0 @@ -#ifdef SSD1306OLED - -#include "ssd1306.h" -#include "i2c.h" -#include -#include "print.h" -#include "glcdfont.c" -#ifdef ADAFRUIT_BLE_ENABLE -#include "adafruit_ble.h" -#endif -#ifdef PROTOCOL_LUFA -#include "lufa.h" -#endif -#include "sendchar.h" -#include "timer.h" - -// 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 - -//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; - -// Write command sequence. -// Returns true on success. -static inline bool _send_cmd1(uint8_t cmd) { - bool res = false; - - if (i2c_start_write(SSD1306_ADDRESS)) { - xprintf("failed to start write to %d\n", SSD1306_ADDRESS); - 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 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(SSD1306_ADDRESS)) { - 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(bool rotate) { - 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 */); - - if(rotate){ - // the following Flip the display orientation 180 degrees - send_cmd1(SegRemap); - send_cmd1(ComScanInc); - }else{ - // Flips the display orientation 0 degrees - send_cmd1(SegRemap | 0x1); - send_cmd1(ComScanDec); - } - - 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; -} - -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); - } -} - -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); -} - -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 matrix_write_ln(struct CharacterMatrix *matrix, const char *data) { - char data_ln[strlen(data)+2]; - snprintf(data_ln, sizeof(data_ln), "%s\n", data); - matrix_write(matrix, data_ln); -} - -void iota_gfx_write(const char *data) { - matrix_write(&display, data); -} - -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); -} - -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); -} - -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(SSD1306_ADDRESS)) { - 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); - - for (uint8_t glyphCol = 0; glyphCol < FontWidth; ++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); -} - -__attribute__ ((weak)) -void iota_gfx_task_user(void) { -} - -void iota_gfx_task(void) { - iota_gfx_task_user(); - - if (display.dirty) { - iota_gfx_flush(); - } - - if (timer_elapsed(last_flush) > ScreenOffInterval) { - iota_gfx_off(); - } -} -#endif diff --git a/keyboards/lily58/ssd1306.h b/keyboards/lily58/ssd1306.h deleted file mode 100644 index 59d31c9f3278..000000000000 --- a/keyboards/lily58/ssd1306.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef SSD1306_H -#define SSD1306_H - -#include -#include -#include "pincontrol.h" -#include "config.h" - -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, -}; - -// Controls the SSD1306 128x32 OLED display via i2c - -#ifndef SSD1306_ADDRESS -#define SSD1306_ADDRESS 0x3C -#endif - -#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; -}; - -struct CharacterMatrix display; - -bool iota_gfx_init(bool rotate); -void iota_gfx_task(void); -bool iota_gfx_off(void); -bool iota_gfx_on(void); -void iota_gfx_flush(void); -void iota_gfx_write_char(uint8_t c); -void iota_gfx_write(const char *data); -void iota_gfx_write_P(const char *data); -void iota_gfx_clear_screen(void); - -void iota_gfx_task_user(void); - -void matrix_clear(struct CharacterMatrix *matrix); -void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c); -void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c); -void matrix_write(struct CharacterMatrix *matrix, const char *data); -void matrix_write_ln(struct CharacterMatrix *matrix, const char *data); -void matrix_write_P(struct CharacterMatrix *matrix, const char *data); -void matrix_render(struct CharacterMatrix *matrix); - - - -#endif From 387bd555c7e6c88a78e0d388ea7eda5b1ce7958b Mon Sep 17 00:00:00 2001 From: Mattia Dal Ben Date: Mon, 22 Oct 2018 20:41:57 +0200 Subject: [PATCH 233/505] Keyboard: Add Redox Wireless keyboard (#4180) * Added folder and default keymap * Added italian keymap * Fixed readme.md * Added layer display through RGB led * Added layer status display to italian keymap * Fixed indentation * Removed obsolete comments * Updated instructions * Fixed keymaps readmes and removed RGB controls on ADJUST layer * Removed redundant KC_* definitions * Fixed readme file * Changed include guards to pragma once * Removed unused audio functions * Fixed rules.mk file * Added spaces in readme to fix rendering * Reconfigured keymap macro to resemble physical layout * Updated default keymap * Updated italian keymap * Removed unused persistent_default_layer_set function --- keyboards/redox_w/config.h | 81 ++++++++++ keyboards/redox_w/keymaps/default/keymap.c | 115 ++++++++++++++ keyboards/redox_w/keymaps/default/readme.md | 1 + keyboards/redox_w/keymaps/italian/keymap.c | 125 +++++++++++++++ keyboards/redox_w/keymaps/italian/readme.md | 1 + keyboards/redox_w/matrix.c | 162 ++++++++++++++++++++ keyboards/redox_w/readme.md | 34 ++++ keyboards/redox_w/redox_w.c | 42 +++++ keyboards/redox_w/redox_w.h | 40 +++++ keyboards/redox_w/rules.mk | 76 +++++++++ 10 files changed, 677 insertions(+) create mode 100644 keyboards/redox_w/config.h create mode 100644 keyboards/redox_w/keymaps/default/keymap.c create mode 100644 keyboards/redox_w/keymaps/default/readme.md create mode 100644 keyboards/redox_w/keymaps/italian/keymap.c create mode 100644 keyboards/redox_w/keymaps/italian/readme.md create mode 100644 keyboards/redox_w/matrix.c create mode 100644 keyboards/redox_w/readme.md create mode 100644 keyboards/redox_w/redox_w.c create mode 100644 keyboards/redox_w/redox_w.h create mode 100644 keyboards/redox_w/rules.mk diff --git a/keyboards/redox_w/config.h b/keyboards/redox_w/config.h new file mode 100644 index 000000000000..810a236d9a53 --- /dev/null +++ b/keyboards/redox_w/config.h @@ -0,0 +1,81 @@ +/* Copyright 2017 Mattia Dal Ben + * + * 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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Mattia Dal Ben +#define PRODUCT Redox_wireless +#define DESCRIPTION q.m.k. keyboard firmware for Redox-w + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* number of backlight levels */ +//#define BACKLIGHT_LEVELS 3 + +#define ONESHOT_TIMEOUT 500 + + +/* 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 + +//UART settings for communication with the RF microcontroller +#define SERIAL_UART_BAUD 1000000 +#define SERIAL_UART_DATA UDR1 +#define SERIAL_UART_UBRR (F_CPU / (16UL * SERIAL_UART_BAUD) - 1) +#define SERIAL_UART_TXD_READY (UCSR1A & _BV(UDRE1)) +#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1)) +#define SERIAL_UART_INIT() do { \ + /* baud rate */ \ + UBRR1L = SERIAL_UART_UBRR; \ + /* baud rate */ \ + UBRR1H = SERIAL_UART_UBRR >> 8; \ + /* enable TX and RX */ \ + UCSR1B = _BV(TXEN1) | _BV(RXEN1); \ + /* 8-bit data */ \ + UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); \ + } while(0) diff --git a/keyboards/redox_w/keymaps/default/keymap.c b/keyboards/redox_w/keymaps/default/keymap.c new file mode 100644 index 000000000000..9cfc1734ebfb --- /dev/null +++ b/keyboards/redox_w/keymaps/default/keymap.c @@ -0,0 +1,115 @@ +#include QMK_KEYBOARD_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 _SYMB 1 +#define _NAV 2 +#define _ADJUST 3 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + SYMB, + NAV, + ADJUST, +}; + +// Shortcut to make keymap more readable +#define KC_BKSL KC_BSLASH +#define SYM_L MO(_SYMB) + +#define KC_ALAS LALT_T(KC_PAST) +#define KC_CTPL LCTL_T(KC_PSLS) + +#define KC_NAGR LT(_NAV, KC_GRV) +#define KC_NAMI LT(_NAV, KC_MINS) + +#define KC_ADEN LT(_ADJUST, KC_END) +#define KC_ADPU LT(_ADJUST, KC_PGUP) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_NAGR ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_NAMI , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,SYM_L , SYM_L ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_EQL , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_ESC ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_LBRC , KC_RBRC ,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_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_BKSL ,KC_RSFT , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + KC_LGUI ,KC_PPLS ,KC_PMNS ,KC_ALAS , KC_CTPL , KC_BSPC ,KC_DEL , KC_ENT ,KC_SPC , KC_RALT , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_SYMB] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_EXLM ,KC_AT ,KC_LCBR ,KC_RCBR ,KC_PIPE ,_______ , _______ ,XXXXXXX ,KC_KP_7 ,KC_KP_8 ,KC_KP_9 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_HASH ,KC_DLR ,KC_LBRC ,KC_RBRC ,KC_GRV ,_______ , _______ ,XXXXXXX ,KC_KP_4 ,KC_KP_5 ,KC_KP_6 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_PERC ,KC_CIRC ,KC_LPRN ,KC_RPRN ,KC_TILD ,_______ ,_______ , _______ ,_______ ,XXXXXXX ,KC_KP_1 ,KC_KP_2 ,KC_KP_3 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , KC_KP_0 , KC_KP_0 ,KC_PDOT ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_NAV] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,KC_MS_U ,XXXXXXX ,KC_WH_U ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D ,XXXXXXX ,_______ , _______ ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_BTN1 , KC_BTN2 ,_______ , _______ ,_______ , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_ADJUST] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,RESET ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,XXXXXXX , XXXXXXX ,_______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ) + +}; + +void matrix_scan_user(void) { + uint8_t layer = biton32(layer_state); + + switch (layer) { + case _QWERTY: + set_led_off; + break; + case _SYMB: + set_led_green; + break; + case _NAV: + set_led_blue; + break; + case _ADJUST: + set_led_red; + break; + default: + break; + } +}; + + diff --git a/keyboards/redox_w/keymaps/default/readme.md b/keyboards/redox_w/keymaps/default/readme.md new file mode 100644 index 000000000000..32ab1253d7ae --- /dev/null +++ b/keyboards/redox_w/keymaps/default/readme.md @@ -0,0 +1 @@ +# Default keymap for Redox Wireless diff --git a/keyboards/redox_w/keymaps/italian/keymap.c b/keyboards/redox_w/keymaps/italian/keymap.c new file mode 100644 index 000000000000..6e23a32d4d99 --- /dev/null +++ b/keyboards/redox_w/keymaps/italian/keymap.c @@ -0,0 +1,125 @@ +#include QMK_KEYBOARD_H + +#include "keymap_italian.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 _SYMB 1 +#define _NAV 2 +#define _ADJUST 3 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + SYMB, + NAV, + ADJUST, +}; + +// Shortcut to make keymap more readable +#define KC_BKSL KC_BSLASH +#define SYM_L MO(_SYMB) + +#define KC_ALAS LALT_T(KC_PAST) +#define KC_CTPL LCTL_T(KC_PSLS) + +#define KC_NAGR LT(_NAV, KC_GRV) +#define KC_NAMI LT(_NAV, KC_MINS) + +#define KC_ADEN LT(_ADJUST, KC_END) +#define KC_ADPU LT(_ADJUST, KC_PGUP) + +// Italian specific shortcuts +#define ALT_IACC RALT_T(IT_IACC) +#define GUI_LESS LGUI_T(IT_LESS) + +#define IT_SHSL RSFT_T(KC_SLSH) +#define IT_GRV RALT(KC_MINS) +#define IT_TILD RALT(KC_EQL) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_NAGR ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_NAMI , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,SYM_L , SYM_L ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,IT_EACC , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_ESC ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,IT_LBRC , IT_RBRC ,KC_H ,KC_J ,KC_K ,KC_L ,IT_OACC ,IT_AACC , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,IT_UACC ,IT_SHSL , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + GUI_LESS,KC_PPLS ,KC_PMNS ,KC_ALAS , KC_CTPL , KC_BSPC ,KC_DEL , KC_ENT ,KC_SPC , ALT_IACC, KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_SYMB] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,IT_EXLM ,IT_AT ,IT_LCBR ,IT_RCBR ,IT_PIPE ,_______ , _______ ,XXXXXXX ,KC_KP_7 ,KC_KP_8 ,KC_KP_9 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,IT_SHRP ,IT_DLR ,IT_LBRC ,IT_RBRC ,IT_GRV ,_______ , _______ ,XXXXXXX ,KC_KP_4 ,KC_KP_5 ,KC_KP_6 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,IT_PERC ,IT_CRC ,IT_LPRN ,IT_RPRN ,IT_TILD ,_______ ,_______ , _______ ,_______ ,XXXXXXX ,KC_KP_1 ,KC_KP_2 ,KC_KP_3 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , KC_KP_0 , KC_KP_0 ,KC_PDOT ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_NAV] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,KC_MS_U ,XXXXXXX ,KC_WH_U ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D ,XXXXXXX ,_______ , _______ ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_BTN1 , KC_BTN2 ,_______ , _______ ,_______ , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_ADJUST] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,RESET ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,XXXXXXX , XXXXXXX ,_______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ) + +}; + +void matrix_scan_user(void) { + uint8_t layer = biton32(layer_state); + + switch (layer) { + case _QWERTY: + set_led_off; + break; + case _SYMB: + set_led_green; + break; + case _NAV: + set_led_blue; + break; + case _ADJUST: + set_led_red; + break; + default: + break; + } +}; + + diff --git a/keyboards/redox_w/keymaps/italian/readme.md b/keyboards/redox_w/keymaps/italian/readme.md new file mode 100644 index 000000000000..a2b5ef707945 --- /dev/null +++ b/keyboards/redox_w/keymaps/italian/readme.md @@ -0,0 +1 @@ +# Italian keymap for Redox Wireless diff --git a/keyboards/redox_w/matrix.c b/keyboards/redox_w/matrix.c new file mode 100644 index 000000000000..5e61103f201c --- /dev/null +++ b/keyboards/redox_w/matrix.c @@ -0,0 +1,162 @@ +/* Copyright 2017 Mattia Dal Ben + * + * 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 +#if defined(__AVR__) +#include +#endif +#include "wait.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "timer.h" + +#if (MATRIX_COLS <= 8) +# define print_matrix_header() print("\nr/c 01234567\n") +# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop(matrix[i]) +# define ROW_SHIFTER ((uint8_t)1) +#elif (MATRIX_COLS <= 16) +# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n") +# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop16(matrix[i]) +# define ROW_SHIFTER ((uint16_t)1) +#elif (MATRIX_COLS <= 32) +# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") +# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop32(matrix[i]) +# define ROW_SHIFTER ((uint32_t)1) +#endif + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; + +__attribute__ ((weak)) +void matrix_init_quantum(void) { + matrix_init_kb(); +} + +__attribute__ ((weak)) +void matrix_scan_quantum(void) { + matrix_scan_kb(); +} + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +inline +uint8_t matrix_rows(void) { + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) { + return MATRIX_COLS; +} + +void matrix_init(void) { + + matrix_init_quantum(); +} + +uint8_t matrix_scan(void) +{ + SERIAL_UART_INIT(); + + uint32_t timeout = 0; + + //the s character requests the RF slave to send the matrix + SERIAL_UART_DATA = 's'; + + //trust the external keystates entirely, erase the last data + uint8_t uart_data[11] = {0}; + + //there are 14 bytes corresponding to 14 columns, and an end byte + for (uint8_t i = 0; i < 11; i++) { + //wait for the serial data, timeout if it's been too long + //this only happened in testing with a loose wire, but does no + //harm to leave it in here + while(!SERIAL_UART_RXD_PRESENT){ + timeout++; + if (timeout > 10000){ + break; + } + } + uart_data[i] = SERIAL_UART_DATA; + } + + //check for the end packet, the key state bytes use the LSBs, so 0xE0 + //will only show up here if the correct bytes were recieved + if (uart_data[10] == 0xE0) + { + //shifting and transferring the keystates to the QMK matrix variable + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 7; + } + } + + + matrix_scan_quantum(); + return 1; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1 +Redox logo +

+ +**Redox**: the **R**educed **E**rgo**dox** project. More information and building instruction [here](https://github.com/mattdibi/redox-keyboard). + +A wireless version of the Redox keyboard. + +- Keyboard Maintainer: [@mattdibi](https://github.com/mattdibi) +- Hardware Supported: Redox-w rev1.0W PCB +- Hardware Availability: Falbatech + +Make example for this keyboard (after setting up your build environment): + +```sh +make redox_w:default +``` + +Example of flashing this keyboard: + +```sh +make redox_w/rev1:default:avrdude +``` + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +For nRF51822 firmware upload instruction and development see [the Redox wireless firmware repository](https://github.com/mattdibi/redox-w-firmware). + +## Redox-w Notes + +These configuration files were based off the [Mitosis](https://github.com/qmk/qmk_firmware/tree/master/keyboards/mitosis) and [Atreus](https://github.com/technomancy/atreus) keyboard. It assumes a Pro Micro is being used, however retains the 'make upload' feature from the Atreus branch. This keyboard uses a completely different 'matrix scan' system to other keyboards, it relies on an external nRF51822 microcontroller maintaining a matrix of keystates received from the keyboard halves. The matrix.c file contains the code to poll the external microcontroller for the key matrix. As long as this file is not changed, all other QMK features are supported. diff --git a/keyboards/redox_w/redox_w.c b/keyboards/redox_w/redox_w.c new file mode 100644 index 000000000000..75df91066cde --- /dev/null +++ b/keyboards/redox_w/redox_w.c @@ -0,0 +1,42 @@ +#include "redox_w.h" + +void uart_init(void) { + SERIAL_UART_INIT(); +} + +void led_init(void) { + DDRD |= (1<<1); + PORTD |= (1<<1); + DDRF |= (1<<4) | (1<<5); + PORTF |= (1<<4) | (1<<5); +} + + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + matrix_init_user(); + uart_init(); + led_init(); +} + +void matrix_scan_kb(void) { + // put your looping keyboard code here + // runs every cycle (a lot) + matrix_scan_user(); +} + +void led_set_kb(uint8_t usb_led) { + +} + +#ifdef ONEHAND_ENABLE +__attribute__ ((weak)) +const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { +{{13, 0}, {12, 0}, {11, 0}, {10, 0}, {9, 0}, {8, 0}, {7, 0}, {6, 0}, {5, 0}, {4, 0}, {3, 0}, {2, 0}, {1, 0}, {0, 0}}, +{{13, 1}, {12, 1}, {11, 1}, {10, 1}, {9, 1}, {8, 1}, {7, 1}, {6, 1}, {5, 1}, {4, 1}, {3, 1}, {2, 1}, {1, 1}, {0, 1}}, +{{13, 2}, {12, 2}, {11, 2}, {10, 2}, {9, 2}, {8, 2}, {7, 2}, {6, 2}, {5, 2}, {4, 2}, {3, 2}, {2, 2}, {1, 2}, {0, 2}}, +{{13, 3}, {12, 3}, {11, 3}, {10, 3}, {9, 3}, {8, 3}, {7, 3}, {6, 3}, {5, 3}, {4, 3}, {3, 3}, {2, 3}, {1, 3}, {0, 3}}, +{{13, 4}, {12, 4}, {11, 4}, {10, 4}, {9, 4}, {8, 4}, {7, 4}, {6, 4}, {5, 4}, {4, 4}, {3, 4}, {2, 4}, {1, 4}, {0, 4}}, +}; +#endif diff --git a/keyboards/redox_w/redox_w.h b/keyboards/redox_w/redox_w.h new file mode 100644 index 000000000000..3adcb121d1c9 --- /dev/null +++ b/keyboards/redox_w/redox_w.h @@ -0,0 +1,40 @@ +#pragma once + +#include "quantum.h" +#include "matrix.h" +#include "backlight.h" +#include + +#define red_led_off PORTF |= (1<<5) +#define red_led_on PORTF &= ~(1<<5) +#define blu_led_off PORTF |= (1<<4) +#define blu_led_on PORTF &= ~(1<<4) +#define grn_led_off PORTD |= (1<<1) +#define grn_led_on PORTD &= ~(1<<1) + +#define set_led_off red_led_off; grn_led_off; blu_led_off +#define set_led_red red_led_on; grn_led_off; blu_led_off +#define set_led_blue red_led_off; grn_led_off; blu_led_on +#define set_led_green red_led_off; grn_led_on; blu_led_off +#define set_led_yellow red_led_on; grn_led_on; blu_led_off +#define set_led_magenta red_led_on; grn_led_off; blu_led_on +#define set_led_cyan red_led_off; grn_led_on; blu_led_on +#define set_led_white red_led_on; grn_led_on; blu_led_on + +// This a shortcut to help you visually see your layout. +// The first section contains all of the arguements +// The second converts the arguments into a two-dimensional array +#define LAYOUT( \ + k00, k01, k02, k03, k04, k05, k08, k09, k10, k11, k12, k13, \ + k14, k15, k16, k17, k18, k19, k06, k07, k22, k23, k24, k25, k26, k27, \ + k28, k29, k30, k31, k32, k33, k20, k21, k36, k37, k38, k39, k40, k41, \ + k42, k43, k44, k45, k46, k47, k34, k48, k49, k35, k50, k51, k52, k53, k54, k55, \ + k56, k57, k58, k59, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69 \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, k12, k13 }, \ + { k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, k24, k25, k26, k27 }, \ + { k28, k29, k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k40, k41 }, \ + { k42, k43, k44, k45, k46, k47, k48, k49, k50, k51, k52, k53, k54, k55 }, \ + { k56, k57, k58, k59, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69 } \ +} diff --git a/keyboards/redox_w/rules.mk b/keyboards/redox_w/rules.mk new file mode 100644 index 000000000000..f2f73d5c5f9d --- /dev/null +++ b/keyboards/redox_w/rules.mk @@ -0,0 +1,76 @@ + +OPT_DEFS += -DREDOX_W_PROMICRO +INTERPHASE_UPLOAD_COMMAND = while [ ! -r $(USB) ]; do sleep 1; done; \ + avrdude -p $(MCU) -c avr109 -U flash:w:$(TARGET).hex -P $(USB) + +# # project specific files +SRC = matrix.c + + +# 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) + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = caterina + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Build Options +# comment out to disable the options. +# +#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = yes # Console for debug(+400) +COMMAND_ENABLE = yes # Commands for debug and configuration +CUSTOM_MATRIX = yes # Remote matrix from the wireless bridge +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +# SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - not yet supported in LUFA +# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +# MIDI_ENABLE = YES # MIDI controls +UNICODE_ENABLE = YES # Unicode +# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID + +USB = /dev/ttyACM0 + +# upload: build +# $(REDOX_W_UPLOAD_COMMAND) From cf19cb0dbeda15d51df9c513a51cd2d985747b36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Pazos=20Est=C3=A9vez?= <30479687+fpazos@users.noreply.github.com> Date: Mon, 22 Oct 2018 20:45:46 +0200 Subject: [PATCH 234/505] Add Bluepill (stm32f103) handwired keyboard (#4126) * Main folder Main folder with some changes like the base layout and matrix for uploading in a future to the qmk repositorie * First Commit Firsts non previously commited changes: -Changed to keyboards/handwired -Basic credit to Xydane -70% Layout * Modified file structure for several keyboards As I don't want to create several folders and overcrowd the main folders I made a few modifications to being able of configure several keyboards as revisions of the main keyboard. Added a second variant. Compiling tests went right but I haven't tried it on the controller. * Starting leds * Started dual color leds PWM functions and configs I started to create the PWM functions and configs based on internet examples, it doesn't compile yet * Backtraced a bit to establish and try debug before continuing the pwm Just this, algo some doc as a new pinout image, space cadet modification to try if it works and little more * Deleted unuseful stuff After trying the reestructure to being compatible with several keyboards and that it worked I deleted the other keyboard. Added space cadet shift to ISO. Finally I couldn't debug everything and I'm getting quite frustrated to continue much more than just adding pwm leds * Changed again Iso fix for Space Cadet * Renamed keyboard, future pull I just renamed the keyboard and made some simplifying changes in order to make a pull request sometime soon. I'm too frustrated, tired and knowledge limited to achive using the PWM for leds, I didn't even get to use the debug mode... I intend to end basic led color change using layers (if I can), document everything properly and make a pull request so other users can continue/use this project. * Writed Readme.md file I also corrected a previous compilation problem and ordered a bit the keymaps * Corrected readme * Try to add layer activated light * Revert "Try to add layer activated light" This reverts commit 205af820d845dab08988f329b9f062f558060220. * Progress to fork Coming back to work, upcoming pull * Linked image Corrected readme * Some cleanning Added images to readme, som cleaning, burning after commit. * Almost finished (working) Finally * Finished bluepill firmware Just finished and tried layer dependant led colors. Going for merge * Deleted innecesary stuff and trailing spaces Just as commit title said. * Coding conventions Just modified some files to respect coding conventions * Deleted XXXXXX define Checking some other PR seen this improvement * Changes suggested on PR Firs doing the easy changes * More changes for the PR -I also deleted one unused function for led toggling on matrix.c (Now it uses layer dependent baklight, algo on of on start) -Deleted commented function on keymaps. Right now only needs testing and all pragma replaces. * Almost every pragma change on PR That's almost finished, only waiting for reply due to compiling errors * Revert "Almost every pragma change on PR" This reverts commit 07f23aa862b370cdf0ae37d6f2130c9e9856f491. * Revert last commit I moddified by mistake a file from another keyboard * Solved last pragma Compiles fine. Now I only need to test it, I say you if it works to include it in the main repository. --- keyboards/handwired/bluepill/bluepill.c | 1 + keyboards/handwired/bluepill/bluepill.h | 54 ++ .../bluepill/bluepill70/bluepill70.c | 1 + .../bluepill/bluepill70/bluepill70.h | 4 + .../bluepill/bluepill70/bootloader_defs.h | 10 + .../handwired/bluepill/bluepill70/chconf.h | 524 ++++++++++++++++++ .../handwired/bluepill/bluepill70/config.h | 25 + .../handwired/bluepill/bluepill70/flash.sh | 2 + .../handwired/bluepill/bluepill70/halconf.h | 354 ++++++++++++ keyboards/handwired/bluepill/bluepill70/led.c | 38 ++ .../handwired/bluepill/bluepill70/matrix.c | 225 ++++++++ .../handwired/bluepill/bluepill70/mcuconf.h | 209 +++++++ .../handwired/bluepill/bluepill70/rules.mk | 47 ++ .../boards/GENERIC_STM32_F103/board.c | 49 ++ .../boards/GENERIC_STM32_F103/board.h | 170 ++++++ .../boards/GENERIC_STM32_F103/board.mk | 5 + keyboards/handwired/bluepill/config.h | 58 ++ .../bluepill/keymaps/default/keymap.c | 69 +++ .../handwired/bluepill/keymaps/iso/keymap.c | 69 +++ keyboards/handwired/bluepill/ld/MKL26Z64.ld | 105 ++++ .../ld/STM32F103x8_stm32duino_bootloader.ld | 88 +++ keyboards/handwired/bluepill/readme.md | 60 ++ keyboards/handwired/bluepill/rules.mk | 10 + 23 files changed, 2177 insertions(+) create mode 100644 keyboards/handwired/bluepill/bluepill.c create mode 100644 keyboards/handwired/bluepill/bluepill.h create mode 100644 keyboards/handwired/bluepill/bluepill70/bluepill70.c create mode 100644 keyboards/handwired/bluepill/bluepill70/bluepill70.h create mode 100644 keyboards/handwired/bluepill/bluepill70/bootloader_defs.h create mode 100644 keyboards/handwired/bluepill/bluepill70/chconf.h create mode 100644 keyboards/handwired/bluepill/bluepill70/config.h create mode 100644 keyboards/handwired/bluepill/bluepill70/flash.sh create mode 100644 keyboards/handwired/bluepill/bluepill70/halconf.h create mode 100644 keyboards/handwired/bluepill/bluepill70/led.c create mode 100644 keyboards/handwired/bluepill/bluepill70/matrix.c create mode 100644 keyboards/handwired/bluepill/bluepill70/mcuconf.h create mode 100644 keyboards/handwired/bluepill/bluepill70/rules.mk create mode 100644 keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.c create mode 100644 keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.h create mode 100644 keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.mk create mode 100644 keyboards/handwired/bluepill/config.h create mode 100644 keyboards/handwired/bluepill/keymaps/default/keymap.c create mode 100644 keyboards/handwired/bluepill/keymaps/iso/keymap.c create mode 100644 keyboards/handwired/bluepill/ld/MKL26Z64.ld create mode 100644 keyboards/handwired/bluepill/ld/STM32F103x8_stm32duino_bootloader.ld create mode 100644 keyboards/handwired/bluepill/readme.md create mode 100644 keyboards/handwired/bluepill/rules.mk diff --git a/keyboards/handwired/bluepill/bluepill.c b/keyboards/handwired/bluepill/bluepill.c new file mode 100644 index 000000000000..85c92dfe96ff --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill.c @@ -0,0 +1 @@ +#include "bluepill.h" \ No newline at end of file diff --git a/keyboards/handwired/bluepill/bluepill.h b/keyboards/handwired/bluepill/bluepill.h new file mode 100644 index 000000000000..a686d155cea8 --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill.h @@ -0,0 +1,54 @@ +#pragma once + +#include "quantum.h" +#include "led.h" + +/* ANSI LAYOUT + ESC| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10| F11| F12| PSC| PGU| PGD + GRA| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ' | ¡ | BCKS | DEL + TAB| Q | W | E | R | T | Y | U | I | O | P | ` | + | | HOM + CAP| A | S | D | F | G | H | J | K | L | Ñ | ´ | Ç | ENTER | END + LSI| (<)| Z | X | C | V | B | N | M | , | . | - | RSHIF | UP | FNL + LCT| WIN| ALT| ESPACE | ALG| FN | RCT| LEF| DOW| RIG +*/ + +#define LAYOUT_seventy_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \ + 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, K3E, \ + K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, \ + K50, K51, K52, K53, K54, K55, K56, K57, K58, K59 \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K0E, K1E }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K1D, K2D }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \ + { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E }, \ + { K50, K51, K52, KC_NO, KC_NO, KC_NO, K53, KC_NO, KC_NO,K54, K55, K56, K57, K58, K59 } \ +} + +/* ISO LAYOUT + ESC| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10| F11| F12| PSC| PGU| PGD + GRA| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ' | ¡ | BCKS | DEL + TAB| Q | W | E | R | T | Y | U | I | O | P | ` | + | | HOM + CAP| A | S | D | F | G | H | J | K | L | Ñ | ´ | Ç | ENTER | END + LSI| < | Z | X | C | V | B | N | M | , | . | - | RSHIF | UP | FNL + LCT| WIN| ALT| ESPACE | ALG| FN | RCT| LEF| DOW| RIG +*/ + +#define LAYOUT_seventy_iso( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \ + 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, K3E, \ + K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, \ + K50, K51, K52, K53, K54, K55, K56, K57, K58, K59 \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K0E, K1E }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K1D, K2D }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \ + { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E }, \ + { K50, K51, K52, KC_NO, KC_NO, KC_NO, K53, KC_NO, KC_NO,K54, K55, K56, K57, K58, K59 } \ +} diff --git a/keyboards/handwired/bluepill/bluepill70/bluepill70.c b/keyboards/handwired/bluepill/bluepill70/bluepill70.c new file mode 100644 index 000000000000..511c602d4529 --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/bluepill70.c @@ -0,0 +1 @@ +#include "bluepill70.h" \ No newline at end of file diff --git a/keyboards/handwired/bluepill/bluepill70/bluepill70.h b/keyboards/handwired/bluepill/bluepill70/bluepill70.h new file mode 100644 index 000000000000..8a313cc500a8 --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/bluepill70.h @@ -0,0 +1,4 @@ +#pragma once +#include "bluepill.h" +// Modified by Xydane +// #define LAYOUT(k00) {{ k00 }} \ No newline at end of file diff --git a/keyboards/handwired/bluepill/bluepill70/bootloader_defs.h b/keyboards/handwired/bluepill/bluepill70/bootloader_defs.h new file mode 100644 index 000000000000..0f45203cb613 --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/bootloader_defs.h @@ -0,0 +1,10 @@ +/* Address for jumping to bootloader on STM32 chips. */ +/* It is chip dependent, the correct number can be looked up here (page 175): + * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf + * This also requires a patch to chibios: + * /tmk_core/tool/chibios/ch-bootloader-jump.patch + */ + +// STM32F103* does NOT have an USB bootloader in ROM (only serial), +// so setting anything here does not make much sense +// #define STM32_BOOTLOADER_ADDRESS 0x1FFFC800 diff --git a/keyboards/handwired/bluepill/bluepill70/chconf.h b/keyboards/handwired/bluepill/bluepill70/chconf.h new file mode 100644 index 000000000000..dfb1f9dfb9e6 --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/chconf.h @@ -0,0 +1,524 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16 or 32 bits. + */ +#define CH_CFG_ST_RESOLUTION 16 + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#define CH_CFG_ST_FREQUENCY 2000 + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#define CH_CFG_ST_TIMEDELTA 2 + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#define CH_CFG_TIME_QUANTUM 0 + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#define CH_CFG_MEMCORE_SIZE 0 + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#define CH_CFG_NO_IDLE_THREAD FALSE + +/* Use __WFI in the idle thread for waiting. Does lower the power + * consumption. */ +#define CORTEX_ENABLE_WFI_IDLE TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#define CH_CFG_OPTIMIZE_SPEED TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_TM FALSE + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_REGISTRY TRUE + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_WAITEXIT TRUE + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_SEMAPHORES TRUE + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MUTEXES TRUE + +/** + * @brief Enables recursive behavior on mutexes. + * @note Recursive mutexes are heavier and have an increased + * memory footprint. + * + * @note The default is @p FALSE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_CONDVARS TRUE + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_CONDVARS. + */ +#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_EVENTS TRUE + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_EVENTS. + */ +#define CH_CFG_USE_EVENTS_TIMEOUT TRUE + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MESSAGES TRUE + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_MESSAGES. + */ +#define CH_CFG_USE_MESSAGES_PRIORITY FALSE + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_MAILBOXES TRUE + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMCORE TRUE + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#define CH_CFG_USE_HEAP TRUE + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMPOOLS FALSE + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_WAITEXIT. + * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. + */ +#define CH_CFG_USE_DYNAMIC FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, kernel statistics. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_STATISTICS FALSE + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_SYSTEM_STATE_CHECK FALSE + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_CHECKS FALSE + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_ASSERTS FALSE + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the trace buffer is activated. + * + * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_BUFFER_SIZE 128 + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#define CH_DBG_ENABLE_STACK_CHECK FALSE + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_FILL_THREADS FALSE + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p thread_t structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. + */ +#define CH_DBG_THREADS_PROFILING FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p thread_t structure. + */ +#define CH_CFG_THREAD_EXTRA_FIELDS \ + /* Add threads custom fields here.*/ + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + */ +#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* Context switch code here.*/ \ +} + +/** + * @brief ISR enter hook. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ + /* IRQ prologue code here.*/ \ +} + +/** + * @brief ISR exit hook. + */ +#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ + /* IRQ epilogue code here.*/ \ +} + +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#define CH_CFG_IDLE_ENTER_HOOK() { \ + /* Idle-enter code here.*/ \ +} + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#define CH_CFG_IDLE_LEAVE_HOOK() { \ + /* Idle-leave code here.*/ \ +} + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#define CH_CFG_IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#define CH_CFG_SYSTEM_TICK_HOOK() { \ + /* System tick event code here.*/ \ +} + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ + /* System halt code here.*/ \ +} + +/** + * @brief Trace hook. + * @details This hook is invoked each time a new record is written in the + * trace buffer. + */ +#define CH_CFG_TRACE_HOOK(tep) { \ + /* Trace code here.*/ \ +} + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* CHCONF_H */ + +/** @} */ diff --git a/keyboards/handwired/bluepill/bluepill70/config.h b/keyboards/handwired/bluepill/bluepill70/config.h new file mode 100644 index 000000000000..87fd74633f81 --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/config.h @@ -0,0 +1,25 @@ +#pragma once + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6464 +#define DEVICE_VER 0x0001 +/* in python2: list(u"whatever".encode('utf-16-le')) */ +/* at most 32 characters or the ugly hack in usb_main.c works */ + +// Modified by Xydane +#define MANUFACTURER "QMK" +#define USBSTR_MANUFACTURER 'T', '\x00', 'M', '\x00', 'K', '\x00', ' ', '\x00', '\xc6', '\x00' +#define PRODUCT "BluePill70" +#define USBSTR_PRODUCT 'C', '\x00', 'h', '\x00', 'i', '\x00', 'b', '\x00', 'i', '\x00', 'O', '\x00', 'S', '\x00', ' ', '\x00', 'Q', '\x00', 'M', '\x00', 'K', '\x00' +#define DESCRIPTION "QMK keyboard firmware with ChibiOS" + +/* key matrix size */ +// Modified by Xydane +#define MATRIX_ROWS 6 +#define MATRIX_COLS 15 +#define DIODE_DIRECTION COL2ROW + +// Iso fix for Space Cadet, comment for ANSI layouts +#define LSPO_KEY KC_8 +#define RSPC_KEY KC_9 \ No newline at end of file diff --git a/keyboards/handwired/bluepill/bluepill70/flash.sh b/keyboards/handwired/bluepill/bluepill70/flash.sh new file mode 100644 index 000000000000..d001ff007e92 --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/flash.sh @@ -0,0 +1,2 @@ +#!/bin/bash +Arduino_STM32_usb_hid/tools/linux/maple_upload ttyACM0 2 1EAF:0003 build/ch.bin \ No newline at end of file diff --git a/keyboards/handwired/bluepill/bluepill70/halconf.h b/keyboards/handwired/bluepill/bluepill70/halconf.h new file mode 100644 index 000000000000..5be284cd35fa --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/halconf.h @@ -0,0 +1,354 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef _HALCONF_H_ +#define _HALCONF_H_ + +#include "mcuconf.h" + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the DAC subsystem. + */ +#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) +#define HAL_USE_DAC FALSE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT FALSE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C FALSE +#endif + +/** + * @brief Enables the I2S subsystem. + */ +#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) +#define HAL_USE_I2S FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM TRUE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL FALSE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB FALSE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI FALSE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB TRUE +#endif + +/** + * @brief Enables the WDG subsystem. + */ +#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) +#define HAL_USE_WDG FALSE +#endif + +/*===========================================================================*/ +/* ADC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) +#define ADC_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define ADC_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* CAN driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Sleep mode related APIs inclusion switch. + */ +#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) +#define CAN_USE_SLEEP_MODE TRUE +#endif + +/*===========================================================================*/ +/* I2C driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the mutual exclusion APIs on the I2C bus. + */ +#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define I2C_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* MAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) +#define MAC_USE_ZERO_COPY FALSE +#endif + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) +#define MAC_USE_EVENTS TRUE +#endif + +/*===========================================================================*/ +/* MMC_SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + * This option is recommended also if the SPI driver does not + * use a DMA channel and heavily loads the CPU. + */ +#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) +#define MMC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SDC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Number of initialization attempts before rejecting the card. + * @note Attempts are performed at 10mS intervals. + */ +#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) +#define SDC_INIT_RETRY 100 +#endif + +/** + * @brief Include support for MMC cards. + * @note MMC support is not yet implemented so this option must be kept + * at @p FALSE. + */ +#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) +#define SDC_MMC_SUPPORT FALSE +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + */ +#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) +#define SDC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SERIAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Default bit rate. + * @details Configuration parameter, this is the baud rate selected for the + * default configuration. + */ +#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) +#define SERIAL_DEFAULT_BITRATE 38400 +#endif + +/** + * @brief Serial buffers size. + * @details Configuration parameter, you can change the depth of the queue + * buffers depending on the requirements of your application. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_BUFFERS_SIZE 16 +#endif + +/*===========================================================================*/ +/* SERIAL_USB driver related setting. */ +/*===========================================================================*/ + +/** + * @brief Serial over USB buffers size. + * @details Configuration parameter, the buffer size must be a multiple of + * the USB data endpoint maximum packet size. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +// Modified by Xydane +#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_SIZE 256 +#endif + +/*===========================================================================*/ +/* SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) +#define SPI_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define SPI_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* USB driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) +#define USB_USE_WAIT TRUE +#endif + +#endif /* _HALCONF_H_ */ + +/** @} */ diff --git a/keyboards/handwired/bluepill/bluepill70/led.c b/keyboards/handwired/bluepill/bluepill70/led.c new file mode 100644 index 000000000000..5c557bbee1f3 --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/led.c @@ -0,0 +1,38 @@ +/* +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 . +*/ + +#include "hal.h" +#include "led.h" + + +void led_set(uint8_t usb_led){ + if (usb_led & (1< + +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 "ch.h" +#include "hal.h" + +/* + * scan matrix + */ +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "wait.h" + +//#include "pwm.c" + +#ifndef DEBOUNCE +# define DEBOUNCE 5 +#endif +static uint8_t debouncing = DEBOUNCE; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static matrix_row_t read_cols(void); +static void init_cols(void); +static void unselect_rows(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; +} + +/* generic STM32F103C8T6 board */ +#ifdef BOARD_GENERIC_STM32_F103 +// This could be removed, only used now in matrix_init() +#define LED_ON() do { palClearPad(GPIOA, 1) ;} while (0) +#define LED_OFF() do { palSetPad(GPIOA, 1); } while (0) +#endif + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +void matrix_init(void) +{ + // initialize row and col + unselect_rows(); + init_cols(); + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } + //debug + debug_matrix = true; + LED_ON(); + wait_ms(500); + LED_OFF(); + + matrix_init_quantum(); +} + +uint8_t matrix_scan(void){ + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + select_row(i); + wait_us(30); // without this wait read unstable value. + matrix_row_t cols = read_cols(); + if (matrix_debouncing[i] != cols) { + matrix_debouncing[i] = cols; + if (debouncing) { + debug("bounce!: "); debug_hex(debouncing); debug("\n"); + } + debouncing = DEBOUNCE; + } + unselect_rows(); + } + + if (debouncing) { + if (--debouncing) { + wait_ms(1); + } else { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debouncing[i]; + } + } + } + matrix_scan_quantum(); + return 1; +} + +inline bool matrix_is_on(uint8_t row, uint8_t col){ + return (matrix[row] & ((matrix_row_t)1</os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) +MCU_FAMILY = STM32 +MCU_SERIES = STM32F1xx +# linker script to use +# it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/ +# or /ld/ +# startup code to use +# is should exist in /os/common/ports/ARMCMx/compilers/GCC/mk/ +MCU_STARTUP = stm32f1xx +# it should exist either in /os/hal/boards/ +# or /boards +# Cortex version +# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4 +MCU = cortex-m3 +# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 +ARMV = 7 +# If you want to be able to jump to bootloader from firmware on STM32 MCUs, +# set the correct BOOTLOADER_ADDRESS. Either set it here, or define it in +# ./bootloader_defs.h or in ./boards//bootloader_defs.h (if you have +# a custom board definition that you plan to reuse). +# If you're not setting it here, leave it commented out. +# It is chip dependent, the correct number can be looked up here (page 175): +# http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf +# This also requires a patch to chibios: +# /tmk_core/tool/chibios/ch-bootloader-jump.patch +#STM32_BOOTLOADER_ADDRESS = 0x1FFFC800 \ No newline at end of file diff --git a/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.c b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.c new file mode 100644 index 000000000000..2809c9d184ed --- /dev/null +++ b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.c @@ -0,0 +1,49 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include "hal.h" + +/** + * @brief PAL setup. + * @details Digital I/O ports static configuration as defined in @p board.h. + * This variable is used by the HAL when initializing the PAL driver. + */ +#if HAL_USE_PAL || defined(__DOXYGEN__) +const PALConfig pal_default_config = +{ + {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH}, + {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH}, + {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH}, + {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH}, + {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH}, +}; +#endif + +/* + * Early initialization code. + * This initialization must be performed just after stack setup and before + * any other initialization. + */ +void __early_init(void) { + + stm32_clock_init(); +} + +/* + * Board-specific initialization code. + */ +void boardInit(void) { +} diff --git a/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.h b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.h new file mode 100644 index 000000000000..75bb848fd077 --- /dev/null +++ b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.h @@ -0,0 +1,170 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +/* + * Setup for a Generic STM32F103 board. + */ + +/* + * Board identifier. + */ +#define BOARD_GENERIC_STM32_F103 +#define BOARD_NAME "Generic STM32F103x board" + +/* + * Board frequencies. + */ +#define STM32_LSECLK 32768 +#define STM32_HSECLK 8000000 + +/* + * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h. + */ +#define STM32F103xB + +/* + * IO pins assignments + */ + +/* on-board */ + +#define GPIOC_LED 13 +#define GPIOD_OSC_IN 0 +#define GPIOD_OSC_OUT 1 + +/* Backlighting */ + +/*#define GPIOC_BACKLIGHT_PIN 15*/ + +/* In case your board has a "USB enable" hardware + controlled by a pin, define it here. (It could be just + a 1.5k resistor connected to D+ line.) +*/ +/* +#define GPIOB_USB_DISC 10 +*/ + +/* + * I/O ports initial setup, this configuration is established soon after reset + * in the initialization code. + * + * The digits have the following meaning: + * 0 - Analog input. + * 1 - Push Pull output 10MHz. + * 2 - Push Pull output 2MHz. + * 3 - Push Pull output 50MHz. + * 4 - Digital input. + * 5 - Open Drain output 10MHz. + * 6 - Open Drain output 2MHz. + * 7 - Open Drain output 50MHz. + * 8 - Digital input with PullUp or PullDown resistor depending on ODR. + * 9 - Alternate Push Pull output 10MHz. + * A - Alternate Push Pull output 2MHz. + * B - Alternate Push Pull output 50MHz. + * C - Reserved. + * D - Alternate Open Drain output 10MHz. + * E - Alternate Open Drain output 2MHz. + * F - Alternate Open Drain output 50MHz. + * Please refer to the STM32 Reference Manual for details. + */ + +/* + * Port A setup. + * Everything input with pull-up except: + * PA2 - Alternate output (USART2 TX). + * PA3 - Normal input (USART2 RX). + * PA9 - Alternate output (USART1 TX). + * PA10 - Normal input (USART1 RX). + */ +#define VAL_GPIOACRL 0x88884B88 /* PA7...PA0 */ +#define VAL_GPIOACRH 0x888884B8 /* PA15...PA8 */ +#define VAL_GPIOAODR 0xFFFFFFFF + +/* + * Port B setup. + * Everything input with pull-up except: + * PB10 - Push Pull output (USB switch). + */ +#define VAL_GPIOBCRL 0x88888888 /* PB7...PB0 */ +#define VAL_GPIOBCRH 0x88888388 /* PB15...PB8 */ +#define VAL_GPIOBODR 0xFFFFFFFF + +/* + * Port C setup. + * Everything input with pull-up except: + * PC13 - Push Pull output (LED). + */ +#define VAL_GPIOCCRL 0x88888888 /* PC7...PC0 */ +#define VAL_GPIOCCRH 0x88388888 /* PC15...PC8 */ +#define VAL_GPIOCODR 0xFFFFFFFF + +/* + * Port D setup. + * Everything input with pull-up except: + * PD0 - Normal input (XTAL). + * PD1 - Normal input (XTAL). + */ +#define VAL_GPIODCRL 0x88888844 /* PD7...PD0 */ +#define VAL_GPIODCRH 0x88888888 /* PD15...PD8 */ +#define VAL_GPIODODR 0xFFFFFFFF + +/* + * Port E setup. + * Everything input with pull-up except: + */ +#define VAL_GPIOECRL 0x88888888 /* PE7...PE0 */ +#define VAL_GPIOECRH 0x88888888 /* PE15...PE8 */ +#define VAL_GPIOEODR 0xFFFFFFFF + +/* + * USB bus activation macro, required by the USB driver. + */ +/* The point is that most of the generic STM32F103* boards + have a 1.5k resistor connected on one end to the D+ line + and on the other end to some pin. Or even a slightly more + complicated "USB enable" circuit, controlled by a pin. + That should go here. + + However on some boards (e.g. one that I have), there's no + such hardware. In which case it's better to not do anything. +*/ +/* +#define usb_lld_connect_bus(usbp) palClearPad(GPIOB, GPIOB_USB_DISC) +*/ +#define usb_lld_connect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_INPUT); + +/* + * USB bus de-activation macro, required by the USB driver. + */ +/* +#define usb_lld_disconnect_bus(usbp) palSetPad(GPIOB, GPIOB_USB_DISC) +*/ +#define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12); + +#if !defined(_FROM_ASM_) +#ifdef __cplusplus +extern "C" { +#endif + void boardInit(void); +#ifdef __cplusplus +} +#endif +#endif /* _FROM_ASM_ */ + +#endif /* _BOARD_H_ */ diff --git a/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.mk b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.mk new file mode 100644 index 000000000000..6b8b312fd9fd --- /dev/null +++ b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.mk @@ -0,0 +1,5 @@ +# List of all the board related files. +BOARDSRC = $(BOARD_PATH)/boards/GENERIC_STM32_F103/board.c + +# Required include directories +BOARDINC = $(BOARD_PATH)/boards/GENERIC_STM32_F103 diff --git a/keyboards/handwired/bluepill/config.h b/keyboards/handwired/bluepill/config.h new file mode 100644 index 000000000000..aeab1808a8c1 --- /dev/null +++ b/keyboards/handwired/bluepill/config.h @@ -0,0 +1,58 @@ +/* +Copyright 2015 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 . +*/ + +#pragma once + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +// Modified by Xydane +#define DEBOUNCE 1 + +/* 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)) \ +) + +/* Backlighting include */ +/*#define BACKLIGHT_PIN 19 +#define BACKLIGHT_LEVELS 5 +#define BACKLIGHT_BREATHING +#define BREATHING_PERIOD 6*/ +/* + * 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 \ No newline at end of file diff --git a/keyboards/handwired/bluepill/keymaps/default/keymap.c b/keyboards/handwired/bluepill/keymaps/default/keymap.c new file mode 100644 index 000000000000..8a3493039092 --- /dev/null +++ b/keyboards/handwired/bluepill/keymaps/default/keymap.c @@ -0,0 +1,69 @@ +/* +Copyright 2012,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 . +*/ + +#include QMK_KEYBOARD_H + +// Define layer names +#define _NORMAL 0 +#define _FNONE 1 +#define _FNTWO 2 + +// Highly Modified by Xydane +const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_NORMAL] = LAYOUT_seventy_ansi( + 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_PSCREEN,KC_HOME, KC_END, \ +KC_GRAVE, 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_DELETE, \ + 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_PGUP, \ + 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_SLASH,KC_PGDOWN, \ + KC_LSPO, XXXXXXX,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSPC,KC_UP, TT(2), \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT ), + + [_FNONE] = LAYOUT_seventy_ansi( + KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, KC_TRNS,KC_MUTE,KC_VOLD,KC_VOLU, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P7, KC_P8, KC_P9, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P1, KC_P2, KC_P3, KC_PAST, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \ + KC_TRNS, XXXXXXX, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_P0, KC_PDOT,KC_PENT, KC_PSLS, KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS ), + + [_FNTWO] = LAYOUT_seventy_ansi( + KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, KC_TRNS, KC_MUTE,KC_VOLD,KC_VOLU,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P7, KC_P8, KC_P9, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P1, KC_P2, KC_P3, KC_PAST, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \ + KC_TRNS, XXXXXXX, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_P0, KC_PDOT,KC_PENT, KC_PSLS, KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS ), +}; + +/* Layer based ilumination, just binary */ +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case _FNONE: + palSetPad(GPIOA, 0); //OFF Color A + palClearPad(GPIOA, 1); //ON Color B + break; + case _FNTWO: + palClearPad(GPIOA, 0); //ON Color A + palClearPad(GPIOA, 1); //ON Color B + break; + default: // for any other layers, or the default layer + palClearPad(GPIOA, 0); //ON Color A + palSetPad(GPIOA, 1); //OFF Color B + break; + } + return state; +} \ No newline at end of file diff --git a/keyboards/handwired/bluepill/keymaps/iso/keymap.c b/keyboards/handwired/bluepill/keymaps/iso/keymap.c new file mode 100644 index 000000000000..a6aedde7a3d8 --- /dev/null +++ b/keyboards/handwired/bluepill/keymaps/iso/keymap.c @@ -0,0 +1,69 @@ +/* +Copyright 2012,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 . +*/ + +#include QMK_KEYBOARD_H + +// Define layer names +#define _NORMAL 0 +#define _FNONE 1 +#define _FNTWO 2 + +// Highly Modified by Xydane +const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_NORMAL] = LAYOUT_seventy_iso( + 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_PSCREEN,KC_HOME, KC_END, \ +KC_GRAVE, 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_DELETE, \ + 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_PGUP, \ + 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_NUHS, KC_ENT,KC_PGDOWN, \ + KC_LSPO, KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSPC,KC_UP, TT(2), \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT ), + + [_FNONE] = LAYOUT_seventy_iso( + KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, KC_TRNS,KC_MUTE,KC_VOLD,KC_VOLU, KC_TRNS,KC_TRNS,KC_NLCK, KC_CALC, KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P7, KC_P8, KC_P9, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P1, KC_P2, KC_P3, KC_PAST, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_P0, KC_PDOT,KC_PENT, KC_PSLS, KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS ), + + [_FNTWO] = LAYOUT_seventy_iso( + KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, KC_TRNS,KC_MUTE,KC_VOLD,KC_VOLU, KC_TRNS,KC_TRNS,KC_NLCK, KC_CALC, KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P7, KC_P8, KC_P9, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P1, KC_P2, KC_P3, KC_PAST, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_P0, KC_PDOT,KC_PENT, KC_PSLS, KC_TRNS,KC_TRNS,KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS ), +}; + +/* Layer based ilumination, just binary */ +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case _FNONE: + palSetPad(GPIOA, 0); //OFF Color A + palClearPad(GPIOA, 1); //ON Color B + break; + case _FNTWO: + palClearPad(GPIOA, 0); //ON Color A + palClearPad(GPIOA, 1); //ON Color B + break; + default: // for any other layers, or the default layer + palClearPad(GPIOA, 0); //ON Color A + palSetPad(GPIOA, 1); //OFF Color B + break; + } + return state; +} \ No newline at end of file diff --git a/keyboards/handwired/bluepill/ld/MKL26Z64.ld b/keyboards/handwired/bluepill/ld/MKL26Z64.ld new file mode 100644 index 000000000000..c4ca8b874cca --- /dev/null +++ b/keyboards/handwired/bluepill/ld/MKL26Z64.ld @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2013-2016 Fabio Utzig, http://fabioutzig.com + * (C) 2016 flabbergast + * + * 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 to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* + * KL26Z64 memory setup. + */ +MEMORY +{ + flash0 : org = 0x00000000, len = 0x100 + flash1 : org = 0x00000400, len = 0x10 + flash2 : org = 0x00000410, len = 62k - 0x410 + flash3 : org = 0x0000F800, len = 2k + flash4 : org = 0x00000000, len = 0 + flash5 : org = 0x00000000, len = 0 + flash6 : org = 0x00000000, len = 0 + flash7 : org = 0x00000000, len = 0 + ram0 : org = 0x1FFFF800, len = 8k + ram1 : org = 0x00000000, len = 0 + ram2 : org = 0x00000000, len = 0 + ram3 : org = 0x00000000, len = 0 + ram4 : org = 0x00000000, len = 0 + ram5 : org = 0x00000000, len = 0 + ram6 : org = 0x00000000, len = 0 + ram7 : org = 0x00000000, len = 0 +} + +/* Flash region for the configuration bytes.*/ +SECTIONS +{ + .cfmprotect : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.cfmconfig)) + } > flash1 +} + +/* For each data/text section two region are defined, a virtual region + and a load region (_LMA suffix).*/ + +/* Flash region to be used for exception vectors.*/ +REGION_ALIAS("VECTORS_FLASH", flash0); +REGION_ALIAS("VECTORS_FLASH_LMA", flash0); + +/* Flash region to be used for constructors and destructors.*/ +REGION_ALIAS("XTORS_FLASH", flash2); +REGION_ALIAS("XTORS_FLASH_LMA", flash2); + +/* Flash region to be used for code text.*/ +REGION_ALIAS("TEXT_FLASH", flash2); +REGION_ALIAS("TEXT_FLASH_LMA", flash2); + +/* Flash region to be used for read only data.*/ +REGION_ALIAS("RODATA_FLASH", flash2); +REGION_ALIAS("RODATA_FLASH_LMA", flash2); + +/* Flash region to be used for various.*/ +REGION_ALIAS("VARIOUS_FLASH", flash2); +REGION_ALIAS("VARIOUS_FLASH_LMA", flash2); + +/* Flash region to be used for RAM(n) initialization data.*/ +REGION_ALIAS("RAM_INIT_FLASH_LMA", flash2); + +/* RAM region to be used for Main stack. This stack accommodates the processing + of all exceptions and interrupts.*/ +REGION_ALIAS("MAIN_STACK_RAM", ram0); + +/* RAM region to be used for the process stack. This is the stack used by + the main() function.*/ +REGION_ALIAS("PROCESS_STACK_RAM", ram0); + +/* RAM region to be used for data segment.*/ +REGION_ALIAS("DATA_RAM", ram0); +REGION_ALIAS("DATA_RAM_LMA", flash2); + +/* RAM region to be used for BSS segment.*/ +REGION_ALIAS("BSS_RAM", ram0); + +/* RAM region to be used for the default heap.*/ +REGION_ALIAS("HEAP_RAM", ram0); + +__eeprom_workarea_start__ = ORIGIN(flash3); +__eeprom_workarea_size__ = LENGTH(flash3); +__eeprom_workarea_end__ = __eeprom_workarea_start__ + __eeprom_workarea_size__; + +/* Generic rules inclusion.*/ +INCLUDE rules.ld diff --git a/keyboards/handwired/bluepill/ld/STM32F103x8_stm32duino_bootloader.ld b/keyboards/handwired/bluepill/ld/STM32F103x8_stm32duino_bootloader.ld new file mode 100644 index 000000000000..f9bfe9c00527 --- /dev/null +++ b/keyboards/handwired/bluepill/ld/STM32F103x8_stm32duino_bootloader.ld @@ -0,0 +1,88 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/* + * ST32F103xB memory setup for use with the maplemini bootloader. + * You will have to + * #define CORTEX_VTOR_INIT 0x5000 + * in your projects chconf.h + */ +MEMORY +{ + flash0 : org = 0x08002000, len = 128k - 0x2000 + flash1 : org = 0x00000000, len = 0 + flash2 : org = 0x00000000, len = 0 + flash3 : org = 0x00000000, len = 0 + flash4 : org = 0x00000000, len = 0 + flash5 : org = 0x00000000, len = 0 + flash6 : org = 0x00000000, len = 0 + flash7 : org = 0x00000000, len = 0 + ram0 : org = 0x20000000, len = 20k + ram1 : org = 0x00000000, len = 0 + ram2 : org = 0x00000000, len = 0 + ram3 : org = 0x00000000, len = 0 + ram4 : org = 0x00000000, len = 0 + ram5 : org = 0x00000000, len = 0 + ram6 : org = 0x00000000, len = 0 + ram7 : org = 0x00000000, len = 0 +} + +/* For each data/text section two region are defined, a virtual region + and a load region (_LMA suffix).*/ + +/* Flash region to be used for exception vectors.*/ +REGION_ALIAS("VECTORS_FLASH", flash0); +REGION_ALIAS("VECTORS_FLASH_LMA", flash0); + +/* Flash region to be used for constructors and destructors.*/ +REGION_ALIAS("XTORS_FLASH", flash0); +REGION_ALIAS("XTORS_FLASH_LMA", flash0); + +/* Flash region to be used for code text.*/ +REGION_ALIAS("TEXT_FLASH", flash0); +REGION_ALIAS("TEXT_FLASH_LMA", flash0); + +/* Flash region to be used for read only data.*/ +REGION_ALIAS("RODATA_FLASH", flash0); +REGION_ALIAS("RODATA_FLASH_LMA", flash0); + +/* Flash region to be used for various.*/ +REGION_ALIAS("VARIOUS_FLASH", flash0); +REGION_ALIAS("VARIOUS_FLASH_LMA", flash0); + +/* Flash region to be used for RAM(n) initialization data.*/ +REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0); + +/* RAM region to be used for Main stack. This stack accommodates the processing + of all exceptions and interrupts.*/ +REGION_ALIAS("MAIN_STACK_RAM", ram0); + +/* RAM region to be used for the process stack. This is the stack used by + the main() function.*/ +REGION_ALIAS("PROCESS_STACK_RAM", ram0); + +/* RAM region to be used for data segment.*/ +REGION_ALIAS("DATA_RAM", ram0); +REGION_ALIAS("DATA_RAM_LMA", flash0); + +/* RAM region to be used for BSS segment.*/ +REGION_ALIAS("BSS_RAM", ram0); + +/* RAM region to be used for the default heap.*/ +REGION_ALIAS("HEAP_RAM", ram0); + +/* Generic rules inclusion.*/ +INCLUDE rules.ld diff --git a/keyboards/handwired/bluepill/readme.md b/keyboards/handwired/bluepill/readme.md new file mode 100644 index 000000000000..8b53f12f46e4 --- /dev/null +++ b/keyboards/handwired/bluepill/readme.md @@ -0,0 +1,60 @@ + +# BluePill handwired + +Keyboards using a BluePill controller (generic Chinese STM32F103C8T6) and based on the [KC64 of Xydane](https://github.com/Xydane/qmk_firmware). + +Keyboard Maintainer: [FPazos](https://github.com/fpazos), but I hope to leave the project in better hands. +Hardware Supported: Bluepill STM32F103C8T6 +Hardware Availability: Everywhere + +Make example for BluePill70 (after setting up your build environment): + +make handwired/bluepill/bluepill70:default + +See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. + +Read everything before using it. + +## Introduction + +First of all thanks to [Xydane](https://github.com/Xydane) at [GeekHack](https://geekhack.org/) for his advice and his repository, without it you couldn't be reading this. + +That's was an attempt to create a firmware using an STM32F103C8T6, and in a "future", also developing a revision for split keyboards. But... +As I'm mainly a web developer I didn't even get to debug the controller, not to speak about ChibiOS. So I just structured everything, created a working 70% layout and leave the project to someone with more knowledge and patience. + +## Resistor fix + +If you want to use the Bluepill USB port, it's very likely that you need to solder a 1.8 kΩ between PA12 and 3.3V. That depends on the PC's motherboard but I needed, more info [here](https://wiki.stm32duino.com/index.php?title=Blue_Pill). + +## No bootloader + +Neither Xydane or I used the bootloader, the code for it is commented and you can use it if you want. I didn't achieve to run it and just used a serial programmer (FTDI, ST-LINK). + +## Adding layouts and revisions + +If you want to create new layouts just add them to the keymaps folder. If you prefer to develop a more complex revision just copy the bluepill70 folder, rename it and create a new keymap in /keymap.c (I tried to divide the project even more but it didn't worked). + +## Pinout + +That's the pinout; + + A5 A15 A10 A9 A8 B15 B14 B13 B12 B11 B10 B1 B0 A7 A6 + B9 ESC| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10| F11| F12| PSC| PGU| PGD + B8 GRA| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ' | ¡ | BCKS | DEL + B7 TAB| Q | W | E | R | T | Y | U | I | O | P | ` | + | | HOM + B6 CAP| A | S | D | F | G | H | J | K | L | Ñ | ´ | Ç | ENTER | END + B5 LSI| < | Z | X | C | V | B | N | M | , | . | - | RSHIF | UP | FNT + A4 LCT| WIN| ALT| ESPACE | ALG| FN | RCT| LEF| DOW| RIG + +And the wiring: +ISO +![Wiring](https://i.imgur.com/ZCaxVzs.jpg) +ANSI +![Wiring](https://i.imgur.com/dBUJCdD.jpg) + +It also uses: +PC13: Caps Lock led. + +Backlight dual color leds, my version is for common anode that's more common, for leds with common anode just replace the palSetPad with palClearPad and viceversa. +PA1: Backlight color A. +PA0: Backlight color B. \ No newline at end of file diff --git a/keyboards/handwired/bluepill/rules.mk b/keyboards/handwired/bluepill/rules.mk new file mode 100644 index 000000000000..38bacae34daf --- /dev/null +++ b/keyboards/handwired/bluepill/rules.mk @@ -0,0 +1,10 @@ +#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = yes # Console for debug +COMMAND_ENABLE = yes # Commands for debug and configuration +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover +CUSTOM_MATRIX = yes # Custom matrix file +MOUSEKEY_ENABLE = no + +DEFAULT_FOLDER = handwired/bluepill/bluepill70 \ No newline at end of file From 5694e7b6a60e0a1b60c1bd7fce51e99a8314abb7 Mon Sep 17 00:00:00 2001 From: ROMUSKING <38523153+ROMUSKING@users.noreply.github.com> Date: Mon, 22 Oct 2018 19:54:31 +0100 Subject: [PATCH 235/505] Keymap: add new keymap (#4127) * an attempt at own layout * typematrixed dvorak * columns shifted columns shifted out, second pinky column moved to the inside. * Update users/romus/romus.h * code cleanup Changes requested by Drashna + Tap Dance enabled * Fixed EOF Fixed the no newline at the end of file alert. * rgblight fight eeprom writes * rgb code simplification * Update users/romus/README.md * Update quantum/keymap_extras/keymap_slovenian.h --- .../keymaps/doxish_dvorak/config.h | 21 + .../keymaps/doxish_dvorak/keymap.c | 161 +++++ .../keymaps/doxish_dvorak/rules.mk | 0 .../lets_split_eh/keymaps/romus/README.md | 7 + .../lets_split_eh/keymaps/romus/keymap.c | 28 + .../lets_split_eh/keymaps/romus/rules.mk | 7 + quantum/keymap_extras/keymap_slovenian.h | 1 + users/romus/README.md | 45 ++ users/romus/config.h | 8 + users/romus/romus.c | 557 ++++++++++++++++++ users/romus/romus.h | 272 +++++++++ users/romus/rules.mk | 24 + 12 files changed, 1131 insertions(+) create mode 100644 keyboards/lets_split_eh/keymaps/doxish_dvorak/config.h create mode 100644 keyboards/lets_split_eh/keymaps/doxish_dvorak/keymap.c create mode 100644 keyboards/lets_split_eh/keymaps/doxish_dvorak/rules.mk create mode 100644 keyboards/lets_split_eh/keymaps/romus/README.md create mode 100644 keyboards/lets_split_eh/keymaps/romus/keymap.c create mode 100644 keyboards/lets_split_eh/keymaps/romus/rules.mk create mode 100644 users/romus/README.md create mode 100644 users/romus/config.h create mode 100644 users/romus/romus.c create mode 100644 users/romus/romus.h create mode 100644 users/romus/rules.mk diff --git a/keyboards/lets_split_eh/keymaps/doxish_dvorak/config.h b/keyboards/lets_split_eh/keymaps/doxish_dvorak/config.h new file mode 100644 index 000000000000..526c0837c725 --- /dev/null +++ b/keyboards/lets_split_eh/keymaps/doxish_dvorak/config.h @@ -0,0 +1,21 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +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 . +*/ + +#pragma once diff --git a/keyboards/lets_split_eh/keymaps/doxish_dvorak/keymap.c b/keyboards/lets_split_eh/keymaps/doxish_dvorak/keymap.c new file mode 100644 index 000000000000..8976081542d8 --- /dev/null +++ b/keyboards/lets_split_eh/keymaps/doxish_dvorak/keymap.c @@ -0,0 +1,161 @@ +#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 _DVORAK 0 + +#define _LOWER 3 +#define _RAISE 4 +#define _FUNCTION 15 +#define _ADJUST 16 + +enum custom_keycodes { + DVORAK = SAFE_RANGE, + LOWER, + RAISE, + ADJUST +}; + +// Defines for task manager and such +#define CALTDEL LCTL(LALT(KC_DEL)) +#define TSKMGR LCTL(LSFT(KC_ESC)) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------------------------------------------------. + * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Func | A | S | D | F | G | H | J | K | L | ; | Enter| + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | N | M | , | . | / | ' | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | ` | GUI | Alt |Lower | Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_DVORAK] = LAYOUT( \ + KC_QUOTE, KC_COMMA, KC_DOT, KC_P, KC_Y, KC_TAB, KC_BSPC, KC_F, KC_G, KC_C, KC_R, KC_L, \ + KC_A, KC_O, KC_E, KC_U, KC_I, KC_ENT, KC_ENT, KC_D, KC_H, KC_T, KC_N, KC_S, \ + KC_SCOLON, KC_Q, KC_J, KC_K, KC_X, OSM(MOD_LSFT), OSM(MOD_RSFT), KC_B, KC_M, KC_W, KC_V, KC_Z, \ + KC_LCTL, KC_LGUI, KC_LALT, OSM(MOD_LSFT), KC_SPC, LOWER, RAISE, KC_SPC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ +), + +/*[BASE] = LAYOUT( + * KC_QUOTE, KC_COMMA, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, + * KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, + * KC_SCOLON, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, + * OSM(MOD_LSFT), OSM(MOD_LCTL), MO(KEYSEL), MO(BROWSER_CONTROL), MO(COMBINED), MO(KEYNAV), KC_ENTER, KC_SPACE, KC_BSPC, RCTL(KC_BSPC), KC_CAPSLOCK, OSM(MOD_LSFT) + * ), + *KC_GRV, + */ +/* Lower + * ,-----------------------------------------------------------------------------------. + * | Esc | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } |Enter | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | | | Mute | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | |Lower | Bksp | Bksp |Raise | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT( \ + KC_ESC, 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_PLUS, KC_LCBR, KC_RCBR, _______, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_MUTE, _______, KC_PIPE, \ + _______, _______, _______, _______, KC_BSPC, _______, _______, KC_BSPC, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Raise + * ,-----------------------------------------------------------------------------------. + * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | 4 | 5 | 6 | + | F5 | F6 | - | = | [ | ] |Enter | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |Enter | 7 | 8 | 9 | - | F11 | F12 |ISO # |ISO / | Mute | | \ | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | , | 0 | . |Lower | Bksp | Bksp |Raise | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \ + _______, KC_4, KC_5, KC_6, KC_PLUS, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______, \ + KC_ENT, KC_7, KC_8, KC_9, KC_MINS, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_MUTE, _______, KC_BSLS, \ + _______, KC_COMM, KC_0, KC_DOT, _______, KC_BSPC, KC_BSPC, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * |Taskmg| | | | | | | |RGBVAI|RGBSAI|RGBHUI|caltde| + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | |Qwerty|RGBVAD|RGBSAD|RGBHUD|RGBTOG| + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | |BLSTEP| + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | RESET| + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT( \ + TSKMGR, _______, _______, _______, _______, _______, KC_DEL, _______, RGB_VAI, RGB_SAI, RGB_HUI, CALTDEL, \ + _______, _______, _______, _______, _______, _______, _______, DVORAK, RGB_VAD, RGB_SAD, RGB_HUD, RGB_TOG, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_STEP, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET \ +), + +/* Function + * ,-----------------------------------------------------------------------------------. + * | | | | | | | | | Up | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | | Left | Down |Right | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | Caps | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_FUNCTION] = LAYOUT( \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, \ + KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + 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; +} diff --git a/keyboards/lets_split_eh/keymaps/doxish_dvorak/rules.mk b/keyboards/lets_split_eh/keymaps/doxish_dvorak/rules.mk new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/keyboards/lets_split_eh/keymaps/romus/README.md b/keyboards/lets_split_eh/keymaps/romus/README.md new file mode 100644 index 000000000000..d54ed6856ff1 --- /dev/null +++ b/keyboards/lets_split_eh/keymaps/romus/README.md @@ -0,0 +1,7 @@ +# Lets Split Eh Layout + +Check out [user readme](../../../../users/romus/README.md) for more info. + +# Usage + +Fill in after flashing diff --git a/keyboards/lets_split_eh/keymaps/romus/keymap.c b/keyboards/lets_split_eh/keymaps/romus/keymap.c new file mode 100644 index 000000000000..ba5b75a5cf7b --- /dev/null +++ b/keyboards/lets_split_eh/keymaps/romus/keymap.c @@ -0,0 +1,28 @@ +#include QMK_KEYBOARD_H +#include "romus.h" + + +void matrix_init_keymap (void) { +} + +uint32_t layer_state_set_keymap(uint32_t state) { + + return state; +} + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + // Main Dvorak layer + [_DV] = LAYOUT_letssplit_wrapper(DVORAK), + // Turkish and special character overlay + [_AL] = LAYOUT_letssplit_wrapper(ALTCHAR), + // Gaming layer + [_GA] = LAYOUT_letssplit_wrapper(GAME), + // Numbers layer + [_NU] = LAYOUT_letssplit_wrapper(NUMBERS), + // Settings layer + [_SE] = LAYOUT_letssplit_wrapper(SETTINGS), + // Mouse emulation layer + [_MO] = LAYOUT_letssplit_wrapper(MOUSE), + // Music layer + [_MU] = LAYOUT_letssplit_wrapper(MUSIC), +}; diff --git a/keyboards/lets_split_eh/keymaps/romus/rules.mk b/keyboards/lets_split_eh/keymaps/romus/rules.mk new file mode 100644 index 000000000000..ad7dd4c4749e --- /dev/null +++ b/keyboards/lets_split_eh/keymaps/romus/rules.mk @@ -0,0 +1,7 @@ +# Build options + +BACKLIGHT_ENABLE = no # Switch LEDs +MOUSEKEY_ENABLE = yes # Emulates mouse key using keypresses +RGBLIGHT_ENABLE = yes # LED strips +TAP_DANCE_ENABLE = yes # Use multi-tap features +AUDIO_ENABLE = no # Audio stuff diff --git a/quantum/keymap_extras/keymap_slovenian.h b/quantum/keymap_extras/keymap_slovenian.h index 53d07837e9a9..a9db17becd8f 100644 --- a/quantum/keymap_extras/keymap_slovenian.h +++ b/quantum/keymap_extras/keymap_slovenian.h @@ -1,4 +1,5 @@ /* Copyright 2018 Žan Pevec + * * 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/users/romus/README.md b/users/romus/README.md new file mode 100644 index 000000000000..0de9d9a81754 --- /dev/null +++ b/users/romus/README.md @@ -0,0 +1,45 @@ +# overview + + this is a modified version of let's split keyboard from bbaserdem. i don't like standard dvorak overuses right pinky + so i shifted the columns out. i'm not sure if this is any good, time will tell. + + i have ortholinear let's split eh, which share a lot of functions with other ortholinear keyboards. + +# layout + +i use dvorak with an unorthodox off layout. +if you wanna grab my code, and you used a layout with a persistent base +layer change, change it to layer 0 before proceeding. + +# layers + +* **dvorak**: base layer,with dvorak layout. +* **alternative**: has alternate characters. +* **game**: toggled from *function*, comfortable for gaming use. +* **numeric**: has numericals and symbols. can be locked. +* **function**: layer has media and function keys. +* **mouse**: manipulates mouse. can be locked. +* **music** allows playing sounds. + +# functionality + +* **rgb backlight**: with layer indication, and ability to change base layer lighting mode. +* **secrets**: by placing a secrets.h, and not tracking it, passwords can be stored. +* **mouse**: mouse emulation, complete with diagonal keys. +* **turkish**: an altgr-like overlay that allows some non-common letters, in unicode. + +i suggest checking out how i enabled turkish keys, +how i planned out rgb lighting, +and my mouse implementation; +they might offer some insight into fringe user cases. + +# issues + +all features are too big for the 32kb bootloader. +offenders are audio and rgb lights; it comes down to one or the other. + +~the proton board, and rev 6 might fix that.~ + +# credits + +this is a modified version of let's split keyboard from bbaserdem who has previously written his keymap by himself before, but rewrote it here. diff --git a/users/romus/config.h b/users/romus/config.h new file mode 100644 index 000000000000..9332febe639b --- /dev/null +++ b/users/romus/config.h @@ -0,0 +1,8 @@ +#pragma once + +#ifdef TAP_DANCE_ENABLE + #define TAPPING_TERM 300 + #define TAPPING_TOGGLE 1 +#endif + +// !USERSPACE_CONFIG_H diff --git a/users/romus/romus.c b/users/romus/romus.c new file mode 100644 index 000000000000..35b524f9413c --- /dev/null +++ b/users/romus/romus.c @@ -0,0 +1,557 @@ +#include "romus.h" + +/*---------------*\ +|*-----MOUSE-----*| +\*---------------*/ +#ifdef MOUSEKEY_ENABLE +#include "mousekey.h" +#endif + +/*-------------*\ +|*-----RGB-----*| +\*-------------*/ +#ifdef RGBLIGHT_ENABLE +#include "rgblight.h" +#endif + +/*-------------*\ +|*---UNICODE---*| +\*-------------*/ +#ifdef UNICODE_ENABLE +#endif + +/*-----------------*\ +|*-----SECRETS-----*| +\*-----------------*/ +// Enabled by adding a non-tracked secrets.h to this dir. +#if (__has_include("secrets.h")) +#include "secrets.h" +#endif + +/*---------------*\ +|*-----MUSIC-----*| +\*---------------*/ +#ifdef AUDIO_ENABLE +float tone_game[][2] = SONG(ZELDA_PUZZLE); +float tone_return[][2] = SONG(ZELDA_TREASURE); +float tone_linux[][2] = SONG(UNICODE_LINUX); +float tone_windows[][2] = SONG(UNICODE_WINDOWS); +#endif + +/*-------------------*\ +|*-----TAP-DANCE-----*| +\*-------------------*/ +#ifdef TAP_DANCE_ENABLE +qk_tap_dance_action_t tap_dance_actions[] = { + // Shift on double tap of semicolon + [SCL] = ACTION_TAP_DANCE_DOUBLE( KC_SCLN, KC_COLN ) +}; +#endif + +/* In keymaps, instead of writing _user functions, write _keymap functions + * The __attribute__((weak)) allows for empty definitions here, and during + * compilation, if these functions are defined elsewhere, they are written + * over. This allows to include custom code from keymaps in the generic code + * in this file. + */ +__attribute__ ((weak)) void matrix_init_keymap(void) { } +__attribute__ ((weak)) void matrix_scan_keymap(void) { } +__attribute__ ((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + return true; +} +__attribute__ ((weak)) uint32_t layer_state_set_keymap (uint32_t state) { + return state; +} +__attribute__ ((weak)) void led_set_keymap(uint8_t usb_led) { } + +/* ----------------------- *\ + * -----RGB Functions----- * +\* ----------------------- */ +#ifdef RGBLIGHT_ENABLE + +// Set RGBLIGHT state depending on layer +void rgblight_change( uint8_t this_layer ) { + // Enable RGB light; will not work without this + //rgblight_enable_noeeprom(); + // Change RGB light + switch ( this_layer ) { + case _DV: + // Load base layer + rgblight_disable_noeeprom(); + break; + case _AL: + // Do yellow for alternate + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom( 60,255,255); + + + break; + case _GA: + // Do purple for game + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom(285,255,255); + + + break; + case _NU: + // Do azure for number + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom(186,200,255); + + + break; + case _SE: + // Do red for settings + rgblight_enable_noeeprom(); + + rgblight_sethsv_noeeprom( 16,255,255); + + break; + case _MO: + // Do green for mouse + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom(120,255,255); + + + break; + case _MU: + // Do orange for music + + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom( 39,255,255); + + break; + default: + // Something went wrong + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom( 0,255,255); + + break; + } +} + +#endif + +/*---------------------*\ +|*-----MATRIX INIT-----*| +\*---------------------*/ +void matrix_init_user (void) { + + // Keymap specific things, do it first thing to allow for delays etc + matrix_init_keymap(); + + // Correct unicode +#ifdef UNICODE_ENABLE + set_unicode_input_mode(UC_LNX); +#endif + + // Make beginning layer DVORAK + set_single_persistent_default_layer(_DV); + +} + +/*---------------------*\ +|*-----MATRIX SCAN-----*| +\*---------------------*/ +void matrix_scan_user (void) { + // Keymap specific, do it first + matrix_scan_keymap(); +} + +/*------------------*\ +|*-----KEYCODES-----*| +\*------------------*/ +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + + // Shift check + bool is_capital = ( keyboard_report->mods & (MOD_BIT(KC_LSFT)|MOD_BIT(KC_RSFT)) ); + static bool lock_flag = false; + uint8_t layer = biton32 (layer_state); + + switch (keycode) { + // Secrets implementation +#if (__has_include("secrets.h")) + case SECRET1: + if( !record->event.pressed ) { + send_string_P( secret[ keycode - SECRET1 ] ); + } + return false; + break; + case SECRET2: + if( !record->event.pressed ) { + send_string_P( secret[ keycode - SECRET2 ] ); + } + return false; + break; + case SECRET3: + if( !record->event.pressed ) { + send_string_P( secret[ keycode - SECRET3 ] ); + } + return false; + break; +#endif + + // Lock functionality: These layers are locked if the LOCKED buttons are + // pressed. Otherwise, they are momentary toggles + case K_LOCK: + if (record->event.pressed) { + lock_flag = !lock_flag; + } + return false; + break; + case K_MOUSE: + if (record->event.pressed) { + layer_on(_MO); + lock_flag = false; + } else { + if ( lock_flag ) { + lock_flag = false; + } else { + layer_off(_MO); + } + } + return false; + break; + case K_NUMBR: + if (record->event.pressed) { + layer_on(_NU); + lock_flag = false; + } else { + if ( lock_flag ) { + lock_flag = false; + } else { + layer_off(_NU); + } + } + return false; + break; + + // Layer switches with sound + case K_GAMES: + if (record->event.pressed) { + // On press, turn off layer if active + if ( layer == _GA ) { +#ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(tone_return); +#endif + layer_off(_GA); + } + } else { + // After click, turn on layer if accessed from setting + if ( layer == _SE ) { +#ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(tone_game); +#endif + layer_on(_GA); + layer_off(_SE); + } + } + return false; + break; + case MU_TOG: + if (record->event.pressed) { + // On press, turn off layer if active + if ( layer == _SE ) { + layer_off(_SE); + layer_on(_MU); + } else { + layer_off(_MU); + } + } + return true; + break; + +//------UNICODE + // Unicode switches with sound +#ifdef UNICODE_ENABLE + case UNI_LI: + if (record->event.pressed) { +#ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(tone_linux); +#endif + set_unicode_input_mode(UC_LNX); + } + return false; + break; + case UNI_WN: + if (record->event.pressed) { +#ifdef AUDIO_ENABLE + stop_all_notes(); + PLAY_SONG(tone_windows); +#endif + set_unicode_input_mode(UC_WIN); + } + return false; + break; + + // Turkish letters, with capital functionality + case TUR_A: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); + register_hex(0x00c2); + unicode_input_finish(); + } else { + unicode_input_start(); + register_hex(0x00e2); + unicode_input_finish(); + } + } + return false; + break; + case TUR_O: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); + register_hex(0x00d6); + unicode_input_finish(); + } else { + unicode_input_start(); + register_hex(0x00f6); + unicode_input_finish(); + } + } + return false; + break; + case TUR_U: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); + register_hex(0x00dc); + unicode_input_finish(); + } else { + unicode_input_start(); + register_hex(0x00fc); + unicode_input_finish(); + } + } + return false; + break; + case TUR_I: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); + register_hex(0x0130); + unicode_input_finish(); + } else { + unicode_input_start(); + register_hex(0x0131); + unicode_input_finish(); + } + } + return false; + break; + case TUR_G: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); + register_hex(0x011e); + unicode_input_finish(); + } else { + unicode_input_start(); + register_hex(0x011f); + unicode_input_finish(); + } + } + return false; + break; + case TUR_C: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); + register_hex(0x00c7); + unicode_input_finish(); + } else { + unicode_input_start(); + register_hex(0x00e7); + unicode_input_finish(); + } + } + return false; + break; + case TUR_S: + if (record->event.pressed) { + if ( is_capital ) { + unicode_input_start(); + register_hex(0x015e); + unicode_input_finish(); + } else { + unicode_input_start(); + register_hex(0x015f); + unicode_input_finish(); + } + } + return false; + break; +#endif + +//-------Diagonal mouse movements +#ifdef MOUSEKEY_ENABLE + case MO_NE: + if( record->event.pressed ) { + mousekey_on(MO_N); + mousekey_on(MO_E); + mousekey_send(); + } else { + mousekey_off(MO_N); + mousekey_off(MO_E); + mousekey_send(); + } + return false; + break; + case MO_NW: + if( record->event.pressed ) { + mousekey_on(MO_N); + mousekey_on(MO_W); + mousekey_send(); + } else { + mousekey_off(MO_N); + mousekey_off(MO_W); + mousekey_send(); + } + return false; + break; + case MO_SE: + if( record->event.pressed ) { + mousekey_on(MO_S); + mousekey_on(MO_E); + mousekey_send(); + } else { + mousekey_off(MO_S); + mousekey_off(MO_E); + mousekey_send(); + } + return false; + break; + case MO_SW: + if( record->event.pressed ) { + mousekey_on(MO_S); + mousekey_on(MO_W); + mousekey_send(); + } else { + mousekey_off(MO_S); + mousekey_off(MO_W); + mousekey_send(); + } + return false; + break; + case MO_S_NE: + if( record->event.pressed ) { + mousekey_on(MO_S_N); + mousekey_on(MO_S_E); + mousekey_send(); + } else { + mousekey_off(MO_S_N); + mousekey_off(MO_S_E); + mousekey_send(); + } + return false; + break; + case MO_S_NW: + if( record->event.pressed ) { + mousekey_on(MO_S_N); + mousekey_on(MO_S_W); + mousekey_send(); + } else { + mousekey_off(MO_S_N); + mousekey_off(MO_S_W); + mousekey_send(); + } + return false; + break; + case MO_S_SE: + if( record->event.pressed ) { + mousekey_on(MO_S_S); + mousekey_on(MO_S_E); + mousekey_send(); + } else { + mousekey_off(MO_S_S); + mousekey_off(MO_S_E); + mousekey_send(); + } + return false; + break; + case MO_S_SW: + if( record->event.pressed ) { + mousekey_on(MO_S_S); + mousekey_on(MO_S_W); + mousekey_send(); + } else { + mousekey_off(MO_S_S); + mousekey_off(MO_S_W); + mousekey_send(); + } + return false; + break; +#endif + +//------DOUBLE PRESS, with added left navigation + case DBL_SPC: + if( record->event.pressed ) { + SEND_STRING(" "SS_TAP(X_LEFT)); + } + return false; + break; + case DBL_ANG: + if( record->event.pressed ) { + SEND_STRING("<>"SS_TAP(X_LEFT)); + } + return false; + break; + case DBL_PAR: + if( record->event.pressed ) { + SEND_STRING("()"SS_TAP(X_LEFT)); + } + return false; + break; + case DBL_SQR: + if( record->event.pressed ) { + SEND_STRING("[]"SS_TAP(X_LEFT)); + } + return false; + break; + case DBL_BRC: + if( record->event.pressed ) { + SEND_STRING("{}"SS_TAP(X_LEFT)); + } + return false; + break; + case DBL_QUO: + if( record->event.pressed ) { + SEND_STRING("\'\'"SS_TAP(X_LEFT)); + } + return false; + break; + case DBL_DQT: + if( record->event.pressed ) { + SEND_STRING("\"\""SS_TAP(X_LEFT)); + } + return false; + break; + case DBL_GRV: + if( record->event.pressed ) { + SEND_STRING("``"SS_TAP(X_LEFT)); + } + return false; + break; +// END OF KEYCODES + } + return process_record_keymap(keycode, record); +} + +/*----------------------*\ +|*-----LAYER CHANGE-----*| +\*----------------------*/ + +uint32_t layer_state_set_user(uint32_t state) { + + state = layer_state_set_keymap (state); +#ifdef RGBLIGHT_ENABLE + // Change RGB lighting depending on the last layer activated + rgblight_change( biton32(state) ); +#endif + return state; +} \ No newline at end of file diff --git a/users/romus/romus.h b/users/romus/romus.h new file mode 100644 index 000000000000..265c942e9208 --- /dev/null +++ b/users/romus/romus.h @@ -0,0 +1,272 @@ +// This is a modified version of Let's Split keyboard from bbaserdem + +#pragma once + +#include "quantum.h" + +// Use 7 wide characters for keymaps +#define _______ KC_TRNS +#define XXX KC_NO + +// Layers +#define _DV 0 // Base layer +#define _AL 1 // Alt char overlay +#define _GA 2 // Game layer +#define _NU 3 // Numbers layer +#define _SE 4 // Settings layer +#define _MO 5 // Mouse emulation +#define _MU 6 // Music mode + +// Define short macros +#define UNDO LCTL(KC_Z) +#define REDO LCTL(KC_Y) +#define COPY LCTL(KC_C) +#define CUT LCTL(KC_X) +#define PASTE LCTL(KC_V) +#define EXIT LALT(KC_F4) +#define CAPS SFT_T(KC_CAPS) + + +// Rename mouse keys with 7 letters +#ifdef MOUSEKEY_ENABLE +#define MO_S_N KC_MS_WH_UP +#define MO_S_S KC_MS_WH_DOWN +#define MO_S_E KC_MS_WH_RIGHT +#define MO_S_W KC_MS_WH_LEFT +#define MO_N KC_MS_UP +#define MO_S KC_MS_DOWN +#define MO_E KC_MS_RIGHT +#define MO_W KC_MS_LEFT +#define MO_CL_L KC_MS_BTN1 +#define MO_CL_R KC_MS_BTN2 +#define MO_CL_M KC_MS_BTN3 +#define MO_CL_4 KC_MS_BTN4 +#define MO_CL_5 KC_MS_BTN5 +#define MO_AC_0 KC_MS_ACCEL0 +#define MO_AC_1 KC_MS_ACCEL1 +#define MO_AC_2 KC_MS_ACCEL2 +#else +#define MO_S_N KC_NO +#define MO_S_S KC_NO +#define MO_S_E KC_NO +#define MO_S_W KC_NO +#define MO_N KC_NO +#define MO_S KC_NO +#define MO_E KC_NO +#define MO_W KC_NO +#define MO_CL_L KC_NO +#define MO_CL_R KC_NO +#define MO_CL_M KC_NO +#define MO_CL_1 KC_NO +#define MO_CL_2 KC_NO +#define MO_AC_0 KC_NO +#define MO_AC_1 KC_NO +#define MO_AC_2 KC_NO +#endif + +// Rename music keys with <8 letters +#ifdef AUDIO_ENABLE +#define MU_REC KC_LCTL +#define MU_STOP KC_LALT +#define MU_PLAY KC_LGUI +#define MU_PLAY KC_LGUI +#define MU_FAST KC_UP +#define MU_SLOW KC_DOWN +#define MU_MASK KC_A +#else +#define MU_REC KC_NO +#define MU_STOP KC_NO +#define MU_PLAY KC_NO +#define MU_PLAY KC_NO +#define MU_FAST KC_NO +#define MU_SLOW KC_NO +#define MU_MASK KC_NO +#endif + +// Define non-capitalized UTF shortcuts here +#ifdef UNICODE_ENABLE +#define PHY_HBR UC(0x0127) +#define PHY_DEG UC(0x00b0) +#define CUR_LIR UC(0x20ba) +#define CUR_BIT UC(0x20bf) +#define CUR_EUR UC(0x20ac) +#define CUR_BPN UC(0x00a3) +#define CUR_YEN UC(0x00a5) +#else +#define PHY_HBR KC_NO +#define PHY_DEG KC_NO +#define CUR_LIR KC_NO +#define CUR_BIT KC_NO +#define CUR_EUR KC_NO +#define CUR_BPN KC_NO +#define CUR_YEN KC_NO +#endif + +// Custom keycodes +enum userspace_custom_keycodes { + // Turkish letters, with shifting + TUR_A = SAFE_RANGE, + TUR_C, + TUR_G, + TUR_I, + TUR_O, + TUR_S, + TUR_U, + // Unicode mode switch + UNI_LI, + UNI_WN, + // Double keys + DBL_SPC, + DBL_ANG, + DBL_PAR, + DBL_SQR, + DBL_BRC, + DBL_QUO, + DBL_DQT, + DBL_GRV, + // Diagonal mouse movements + MO_NE, + MO_NW, + MO_SE, + MO_SW, + MO_S_NE, + MO_S_NW, + MO_S_SE, + MO_S_SW, + // Layer switches and lock functionality + K_MOUSE, + K_NUMBR, + K_LOCK, + K_GAMES, + // Secret macros + SECRET1, + SECRET2, + SECRET3 +}; + +// Do tap dancable semicolon key if available +#ifdef TAP_DANCE_ENABLE +enum { + SCL = 0 +}; +#define MY_SCL TD(SCL) +#else +#define MY_SCL KC_SCLN +#endif + +// Shared keymaps +#define LAYOUT_planck_wrapper(...) LAYOUT_planck_grid(__VA_ARGS__) +#define LAYOUT_letssplit_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) + +/* Dvorak + * ,------------------------------------------------------------------------. + * | ' " | , | . | P | Y | Esc || Del | F | G | C | R | L | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | A | O | E | U | I | Bkp || Ent | D | H | T | N | S | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | ; : | Q | J | K | X | Spc || SET | B | M | W | V | Z | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Ctrl| OS | Alt | Tab | Cps | ACH || SYM | Spc | Lft | Up | Dwn | Rght| + * `------------------------------------------------------------------------' */ +#define DVORAK \ + KC_QUOT,KC_COMM,KC_DOT, KC_P, KC_Y, KC_ESC, KC_DEL, KC_F, KC_G, KC_C, KC_R, KC_L, \ + KC_A, KC_O, KC_E, KC_U, KC_I, KC_BSPC,KC_ENT, KC_D, KC_H, KC_T, KC_N, KC_S, \ + MY_SCL, KC_Q, KC_J, KC_K, KC_X, KC_SPC, MO(_SE),KC_B, KC_M, KC_W, KC_V, KC_Z, \ + KC_LCTL,KC_LGUI,KC_LALT,KC_TAB, CAPS, MO(_AL),K_NUMBR,KC_SPC, KC_LEFT,KC_UP, KC_DOWN,KC_RGHT + +/* Alternative character overlay + * ,------------------------------------------------------------------------. + * | ` ~ | ' ' | " " | Euro|Pound| || Del | Home| PgUp| Prn | \ | | / ? | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Redo| < > | ( ) | [ ] | { } | Alt || Ins | End |PgDwn| Scl | BTC | - _ | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Undo| Cut | Copy|Paste| EXIT| Shf || | | | | Yen | = + | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | | | | | || | | | | | | + * `------------------------------------------------------------------------' */ +#define ALTCHAR \ + KC_GRV, DBL_QUO,DBL_DQT,CUR_EUR,CUR_BPN,_______,_______,KC_HOME,KC_PGUP,KC_PSCREEN, KC_BSLASH, KC_SLSH, \ + REDO, DBL_ANG,DBL_PAR,DBL_SQR,DBL_BRC,KC_LALT,KC_INS, KC_END, KC_PGDN,KC_SCROLLLOCK, CUR_BIT, KC_MINUS, \ + UNDO, CUT, COPY, PASTE, EXIT, KC_LSFT,_______,_______,_______,_______, CUR_YEN, KC_EQUAL, \ + _______,_______,_______,_______,_______,_______,_______,DBL_SPC,_______,_______, _______, _______ + +/* Game layer + * ,------------------------------------------------------------------------. + * | OFF | Q | W | E | R | T || Esc | 7 | 8 | 9 |NumLk|Bkspc| + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Tab | A | S | D | F | G || F1 | 4 | 5 | 6 | \ | Ent | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Shf | Z | X | C | V | B || F2 | 1 | 2 | 3 | ^ | MSE | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Ctrl| Alt | / | ` | SYM | Spc || F5 | Ent | 0 | < | v | > | + * `------------------------------------------------------------------------' */ +#define GAME \ + K_GAMES,KC_Q, KC_W, KC_E, KC_R, KC_T, KC_ESC, KC_P7, KC_P8, KC_P9, KC_NLCK,KC_BSPC, \ + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_F1, KC_P4, KC_P5, KC_P6, KC_BSLS,KC_ENT , \ + KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_F2, KC_P1, KC_P2, KC_P3, KC_UP,K_MOUSE, \ + KC_LCTL,KC_LALT,KC_SLSH,KC_GRV, K_NUMBR,KC_SPC, KC_F5, KC_ENT, KC_P0, KC_LEFT,KC_DOWN,KC_RGHT + +/* Symbols layer + * ,------------------------------------------------------------------------. + * | OFF | ` | ~ | \ | [ | { || } | ] | - | _ | = | + | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | 1 | 2 | 3 | 4 | 5 | || LCK | 6 | 7 | 8 | 9 | 0 | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | ! | @ | # | $ | % | ||Vol +| ^ | & | * | ( | ) | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | | | | | | || | | | | | | + * `------------------------------------------------------------------------' */ +#define NUMBERS \ + K_NUMBR,KC_GRV, KC_TILD,KC_BSLS,KC_LBRC,KC_LCBR,KC_RCBR,KC_RBRC,KC_MINS,KC_UNDS,KC_EQL, KC_PLUS, \ + KC_1, KC_2, KC_3, KC_4, KC_5, _______,K_LOCK, KC_6, KC_7, KC_8, KC_9, KC_0, \ + KC_EXLM,KC_AT, KC_HASH,KC_DLR, KC_PERC,_______,KC_VOLU,KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN, \ + KC_PIPE,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______ + +/* Settings layer + * ,------------------------------------------------------------------------. + * |BLLed| F1 | F2 | F3 | F4 | Lin || Win | Wake| |Hue -|Hue +|Reset| + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | F5 | F6 | F7 | F8 | ||Vol 0| |RGBto|Sat -|Sat +| | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | Game| F9 | F10 | F11 | F12 |Vol 0|| |PrtSc|RGBan|Bri -|Bri +| | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * |Musir| | | | |Vol +||Vol -| Prev| Stop|TogMu| Next| | + * `------------------------------------------------------------------------' */ +#define SETTINGS \ + BL_STEP,KC_F1, KC_F2, KC_F3, KC_F4, UNI_LI, UNI_WN, KC_WAKE,_______,RGB_HUD,RGB_HUI,RESET , \ + _______,KC_F5, KC_F6, KC_F7, KC_F8, _______,KC_MUTE,_______,RGB_TOG,RGB_SAD,RGB_SAI,_______, \ + K_GAMES,KC_F9, KC_F10, KC_F11, KC_F12, KC_MUTE,_______,KC_PSCR,RGB_MOD,RGB_VAD,RGB_VAI,_______, \ + MU_TOG, _______,_______,_______,_______,KC_VOLU,KC_VOLD,KC_MPRV,KC_MSTP,KC_MPLY,KC_MNXT,_______ + +/* Mouse layer + * ,------------------------------------------------------------------------. + * |Ulock| \ | ^ | / |.....|.....||.....|.....| |\|.| |^| | |/|.| | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | < | Mid | > |Btn 4|.....||.....|Btn 5| <-- | Mid | --> | | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | / | v | \ |.....|.....||.....|.....| |/| | |v| | |\| | LCK | + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | | | | | | Left||Right| | |Accl0|Accl1|Accl2| + * `------------------------------------------------------------------------' */ +#define MOUSE \ + K_MOUSE,MO_NW, MO_N, MO_NE, XXX, XXX ,XXX, XXX, MO_S_NW,MO_S_N, MO_S_NE,_______, \ + _______,MO_W, MO_CL_M,MO_E, MO_CL_4,XXX ,XXX, MO_CL_5,MO_S_W, MO_CL_M,MO_S_E, _______, \ + _______,MO_SW, MO_S, MO_SE, XXX, XXX ,XXX, XXX, MO_S_SW,MO_S_S, MO_S_SE,K_LOCK , \ + _______,_______,_______,_______,_______,MO_CL_L,MO_CL_R,_______,MO_AC_0,MO_AC_1,MO_AC_2,_______ + +/* Music layer + * ,------------------------------------------------------------------------. + * |.....|.....|.....|.....|.....|.....||.....|.....|.....|.....|.....|.....| + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * |.....|.....|.....|.....|.....|.....||.....|.....|.....|.....|.....|.....| + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * |.....|.....|.....|.....|.....|.....||.....|.....|.....|.....|.....|.....| + * |-----+-----+-----+-----+-----+-----++-----+-----+-----+-----+-----+-----| + * | togg| rec | stop| play| slow| fast||modes|.....|.....|.....|.....|.....| + * `------------------------------------------------------------------------' + */ +#define MUSIC \ + MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK, \ + MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK, \ + MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK, \ + MU_TOG, MU_REC, MU_STOP,MU_PLAY,MU_SLOW,MU_FAST,MU_MOD, MU_MASK,MU_MASK,MU_MASK,MU_MASK,MU_MASK diff --git a/users/romus/rules.mk b/users/romus/rules.mk new file mode 100644 index 000000000000..78ce2e93f45c --- /dev/null +++ b/users/romus/rules.mk @@ -0,0 +1,24 @@ +SRC += romus.c +EXTRAFLAGS += -flto # Used to make code smaller + +# ENABLE +UNICODE_ENABLE = yes # Used for unicode character emulation +EXTRAKEY_ENABLE = yes # OS signals like volume control + +# DISABLE +ifndef BLUETOOTH_ENABLE + BLUETOOTH_ENABLE = no # No bluetooth +endif +COMMAND_ENABLE = no # Some bootmagic thing i dont use +BOOTMAGIC_ENABLE = no # Access to EEPROM settings, not needed +CONSOLE_ENABLE = no # Allows console output with a command +SLEEP_LED_ENABLE = no # Breathes LED's when computer is asleep. Untested. +NKRO_ENABLE = no # Default is 6KRO which is plenty +MIDI_ENABLE = no # Untested feature +FAUXCLICKY_ENABLE = no # Emulates clicks using speaker +KEY_LOCK_ENABLE = no # Allows locking any key. Not used +API_SYSEX_ENABLE = no # Allows OS to send signals. + + +# Disabling this makes it compile, i dont know why +# VARIABLE_TRACE = no # Allows debugging variables From 00b6f14821f44ead75504e28d7fed26791cb2875 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 22 Oct 2018 08:57:37 -0700 Subject: [PATCH 236/505] Replace outdated RGB/Audio information --- keyboards/amj40/keymaps/default/rules.mk | 4 ++-- keyboards/amj40/keymaps/fabian/rules.mk | 2 +- keyboards/amj40/keymaps/jetpacktuxedo/rules.mk | 2 +- keyboards/amj40/keymaps/myee/rules.mk | 2 +- keyboards/amj60/keymaps/iso_split_rshift/rules.mk | 2 +- keyboards/atomic/keymaps/pvc/rules.mk | 2 +- keyboards/atomic/rules.mk | 2 +- keyboards/atreus/keymaps/xk/rules.mk | 2 +- keyboards/bfo9000/rules.mk | 2 +- keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/rules.mk | 2 +- keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk | 2 +- keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk | 2 +- keyboards/bpiphany/frosty_flake/keymaps/tkl/rules.mk | 2 +- keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk | 2 +- keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk | 2 +- keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk | 2 +- keyboards/bpiphany/pegasushoof/rules.mk | 2 +- keyboards/bpiphany/tiger_lily/keymaps/default/rules.mk | 2 +- keyboards/bpiphany/tiger_lily/keymaps/default_ansi/rules.mk | 2 +- keyboards/clueboard/66/keymaps/xyverz/rules.mk | 2 +- keyboards/comet46/keymaps/satt/rules.mk | 2 +- keyboards/contra/keymaps/losinggeneration/rules.mk | 2 +- keyboards/converter/ibm_terminal/keymaps/default/rules.mk | 2 +- keyboards/converter/ibm_terminal/keymaps/priyadi/rules.mk | 2 +- keyboards/converter/ibm_terminal/rules.mk | 2 +- keyboards/converter/sun_usb/rules.mk | 2 +- keyboards/crkbd/keymaps/default/rules.mk | 2 +- keyboards/crkbd/keymaps/drashna/rules.mk | 2 +- keyboards/crkbd/keymaps/like_jis/rules.mk | 2 +- keyboards/crkbd/rules.mk | 2 +- keyboards/daisy/rules.mk | 2 +- keyboards/deltasplit75/keymaps/itsaferbie/rules.mk | 2 +- keyboards/deltasplit75/rules.mk | 6 +++--- keyboards/diverge3/rules.mk | 2 +- keyboards/divergetm2/rules.mk | 2 +- keyboards/do60/rules.mk | 2 +- keyboards/eco/keymaps/default/rules.mk | 2 +- keyboards/eco/keymaps/hexwire/rules.mk | 2 +- keyboards/eco/keymaps/that_canadian/rules.mk | 2 +- keyboards/eco/keymaps/xyverz/rules.mk | 2 +- keyboards/ergo42/rules.mk | 2 +- keyboards/ergodash/rules.mk | 2 +- keyboards/ergodox_infinity/keymaps/narze/rules.mk | 2 +- keyboards/ergoinu/keymaps/default/rules.mk | 2 +- keyboards/ergoinu/keymaps/default_jis/rules.mk | 2 +- keyboards/ergoinu/rules.mk | 2 +- keyboards/ergotravel/rules.mk | 2 +- keyboards/fortitude60/rules.mk | 2 +- keyboards/fourier/rules.mk | 2 +- keyboards/gherkin/keymaps/mjt/rules.mk | 2 +- keyboards/gonnerd/keymaps/default/rules.mk | 2 +- keyboards/gonnerd/keymaps/gam3cat/rules.mk | 2 +- keyboards/gonnerd/keymaps/mauin/rules.mk | 2 +- keyboards/gonnerd/keymaps/tkl/rules.mk | 2 +- keyboards/hadron/keymaps/default/rules.mk | 2 +- keyboards/hadron/keymaps/side_numpad/rules.mk | 2 +- .../handwired/MS_sculpt_mobile/keymaps/default/rules.mk | 2 +- .../handwired/MS_sculpt_mobile/keymaps/milestogo/rules.mk | 2 +- keyboards/handwired/arrow_pad/keymaps/pad_21/rules.mk | 2 +- keyboards/handwired/arrow_pad/keymaps/pad_24/rules.mk | 2 +- keyboards/handwired/atreus50/rules.mk | 2 +- keyboards/handwired/dactyl_manuform/4x5/rules.mk | 3 +-- keyboards/handwired/dactyl_manuform/4x6/rules.mk | 3 +-- keyboards/handwired/dactyl_manuform/5x6/rules.mk | 3 +-- keyboards/handwired/dactyl_manuform/5x7/rules.mk | 2 +- keyboards/handwired/dactyl_manuform/6x6/rules.mk | 3 +-- keyboards/handwired/dactyl_manuform/rules.mk | 2 +- keyboards/handwired/kbod/keymaps/default/rules.mk | 2 +- keyboards/handwired/minorca/keymaps/default/rules.mk | 2 +- keyboards/handwired/minorca/keymaps/rgb/rules.mk | 2 +- keyboards/handwired/minorca/rules.mk | 2 +- keyboards/handwired/not_so_minidox/rules.mk | 2 +- keyboards/handwired/pilcrow/keymaps/default/rules.mk | 2 +- keyboards/handwired/promethium/keymaps/default/rules.mk | 2 +- keyboards/handwired/promethium/keymaps/priyadi/rules.mk | 2 +- keyboards/handwired/promethium/rules.mk | 2 +- keyboards/handwired/qc60/rules.mk | 2 +- keyboards/handwired/terminus_mini/keymaps/default/rules.mk | 2 +- keyboards/handwired/terminus_mini/rules.mk | 2 +- keyboards/handwired/woodpad/keymaps/default/rules.mk | 2 +- keyboards/handwired/xealous/rules.mk | 2 +- keyboards/helix/pico/keymaps/biacco/rules.mk | 2 +- keyboards/helix/pico/keymaps/default/rules.mk | 2 +- keyboards/helix/rev1/keymaps/OLED_sample/rules.mk | 2 +- keyboards/helix/rev2/keymaps/default/rules.mk | 2 +- keyboards/helix/rev2/keymaps/edvorakjp/rules.mk | 2 +- keyboards/helix/rev2/keymaps/five_rows/rules.mk | 2 +- keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk | 2 +- keyboards/helix/rev2/keymaps/froggy/rules.mk | 2 +- keyboards/helix/rev2/keymaps/led_test/rules.mk | 2 +- keyboards/helix/rev2/keymaps/yshrsmz/rules.mk | 2 +- keyboards/helix/rules.mk | 2 +- keyboards/hhkb/keymaps/cinaeco/rules.mk | 2 +- keyboards/iris/keymaps/edvorakjp/rules.mk | 2 +- keyboards/iris/rules.mk | 2 +- keyboards/jd45/keymaps/mjt/rules.mk | 2 +- keyboards/jd45/keymaps/mjt6u/rules.mk | 2 +- keyboards/kinesis/keymaps/carpalx/rules.mk | 2 +- keyboards/kinesis/keymaps/default/rules.mk | 2 +- keyboards/kinesis/keymaps/default_pretty/rules.mk | 2 +- keyboards/kinesis/keymaps/dvorak/rules.mk | 2 +- keyboards/kinesis/keymaps/insertsnideremarks/rules.mk | 2 +- keyboards/kinesis/keymaps/milestogo/rules.mk | 2 +- keyboards/kinesis/keymaps/xyverz/rules.mk | 2 +- keyboards/launchpad/keymaps/default/rules.mk | 2 +- keyboards/lets_split/keymaps/OLED_sample/rules.mk | 2 +- keyboards/lets_split/keymaps/heartrobotninja/rules.mk | 3 +-- keyboards/lets_split/keymaps/mjt/rules.mk | 2 +- keyboards/lets_split/keymaps/piemod/rules.mk | 2 +- keyboards/lets_split/keymaps/xk/rules.mk | 2 +- keyboards/lets_split/rules.mk | 2 +- keyboards/levinson/keymaps/losinggeneration/rules.mk | 2 +- keyboards/levinson/rules.mk | 2 +- keyboards/lfkeyboards/lfk78/keymaps/default/rules.mk | 2 +- keyboards/lfkeyboards/lfk78/keymaps/iso/rules.mk | 2 +- keyboards/lfkeyboards/lfk78/keymaps/split_bs_osx/rules.mk | 2 +- keyboards/lfkeyboards/lfkpad/keymaps/default/rules.mk | 2 +- keyboards/lily58/rules.mk | 2 +- keyboards/meira/rules.mk | 2 +- keyboards/minidox/keymaps/alairock/rules.mk | 2 +- keyboards/minidox/keymaps/that_canadian/rules.mk | 2 +- keyboards/minidox/keymaps/xyverz/rules.mk | 2 +- keyboards/minidox/rules.mk | 2 +- keyboards/mint60/rules.mk | 2 +- keyboards/miuni32/keymaps/adam-lee/rules.mk | 2 +- keyboards/miuni32/keymaps/default/rules.mk | 2 +- keyboards/miuni32/keymaps/ht_156/rules.mk | 2 +- keyboards/miuni32/keymaps/ki/rules.mk | 2 +- keyboards/mt40/rules.mk | 2 +- keyboards/niu_mini/keymaps/spacebarracecar/rules.mk | 2 +- keyboards/nyquist/keymaps/DivergeJM/rules.mk | 2 +- keyboards/nyquist/keymaps/danielhklein/rules.mk | 2 +- keyboards/nyquist/keymaps/losinggeneration/rules.mk | 2 +- keyboards/nyquist/rules.mk | 2 +- keyboards/org60/rules.mk | 2 +- keyboards/orthodox/rules.mk | 2 +- keyboards/planck/keymaps/ab/rules.mk | 2 +- keyboards/planck/keymaps/alexey/rules.mk | 2 +- keyboards/planck/keymaps/angerthosenear/rules.mk | 2 +- keyboards/planck/keymaps/austin/rules.mk | 2 +- keyboards/planck/keymaps/basic/rules.mk | 2 +- keyboards/planck/keymaps/bone2planck/rules.mk | 2 +- keyboards/planck/keymaps/callum/rules.mk | 2 +- keyboards/planck/keymaps/cbbrowne/rules.mk | 2 +- keyboards/planck/keymaps/chance/rules.mk | 2 +- keyboards/planck/keymaps/charlie/rules.mk | 2 +- keyboards/planck/keymaps/circuit/rules.mk | 2 +- keyboards/planck/keymaps/daniel/rules.mk | 2 +- keyboards/planck/keymaps/danielhklein/rules.mk | 2 +- keyboards/planck/keymaps/david/rules.mk | 2 +- keyboards/planck/keymaps/dc/rules.mk | 2 +- keyboards/planck/keymaps/dlaroe/rules.mk | 2 +- keyboards/planck/keymaps/dr_notsokind/rules.mk | 2 +- keyboards/planck/keymaps/dzobert/rules.mk | 2 +- keyboards/planck/keymaps/espynn/rules.mk | 2 +- keyboards/planck/keymaps/experimental/rules.mk | 2 +- keyboards/planck/keymaps/gabriel/rules.mk | 2 +- keyboards/planck/keymaps/gunp/rules.mk | 2 +- keyboards/planck/keymaps/impossible/rules.mk | 2 +- keyboards/planck/keymaps/jacob/rules.mk | 2 +- keyboards/planck/keymaps/jeebak/rules.mk | 2 +- keyboards/planck/keymaps/jhenahan/rules.mk | 2 +- keyboards/planck/keymaps/joe/rules.mk | 2 +- keyboards/planck/keymaps/johannes/rules.mk | 2 +- keyboards/planck/keymaps/kyle/rules.mk | 2 +- keyboards/planck/keymaps/lae3/rules.mk | 2 +- keyboards/planck/keymaps/leo/rules.mk | 2 +- keyboards/planck/keymaps/lucas/rules.mk | 2 +- keyboards/planck/keymaps/lukas/rules.mk | 2 +- keyboards/planck/keymaps/luke/rules.mk | 2 +- keyboards/planck/keymaps/max/rules.mk | 2 +- keyboards/planck/keymaps/mollat/rules.mk | 2 +- keyboards/planck/keymaps/myoung34/rules.mk | 2 +- keyboards/planck/keymaps/narze/rules.mk | 2 +- keyboards/planck/keymaps/neo2planck/rules.mk | 2 +- keyboards/planck/keymaps/nico/rules.mk | 2 +- keyboards/planck/keymaps/not-quite-neo/rules.mk | 2 +- keyboards/planck/keymaps/pickle_jr/rules.mk | 2 +- keyboards/planck/keymaps/premek/rules.mk | 2 +- keyboards/planck/keymaps/priyadi/rules.mk | 2 +- keyboards/planck/keymaps/pvc/rules.mk | 2 +- keyboards/planck/keymaps/rai-suta/rules.mk | 2 +- keyboards/planck/keymaps/sgoodwin/rules.mk | 2 +- keyboards/planck/keymaps/spacebarracecar/rules.mk | 3 +-- keyboards/planck/keymaps/tak3over/rules.mk | 2 +- keyboards/planck/keymaps/thermal_printer/rules.mk | 2 +- keyboards/planck/keymaps/tong92/rules.mk | 2 +- keyboards/planck/keymaps/vifon/rules.mk | 2 +- keyboards/planck/keymaps/yale/rules.mk | 2 +- keyboards/planck/keymaps/yang/rules.mk | 2 +- keyboards/planck/keymaps/zach/rules.mk | 2 +- keyboards/planck/keymaps/zrichard/rules.mk | 2 +- keyboards/preonic/keymaps/bucktooth/rules.mk | 2 +- keyboards/preonic/keymaps/dlaroe/rules.mk | 2 +- keyboards/preonic/keymaps/jacwib/rules.mk | 2 +- keyboards/preonic/keymaps/kinesis/rules.mk | 2 +- keyboards/preonic/keymaps/seph/rules.mk | 2 +- keyboards/preonic/keymaps/zach/rules.mk | 2 +- keyboards/quefrency/rules.mk | 2 +- keyboards/qwertyydox/rules.mk | 2 +- keyboards/rama/m60_a/rules.mk | 3 +-- keyboards/redox/rules.mk | 2 +- keyboards/rorschach/keymaps/insertsnideremarks/rules.mk | 4 +--- keyboards/rorschach/rules.mk | 2 +- keyboards/s60_x/keymaps/ansi_qwertz/rules.mk | 2 +- keyboards/s60_x/keymaps/bluebear/rules.mk | 2 +- keyboards/satan/keymaps/addcninblue/rules.mk | 2 +- keyboards/satan/keymaps/admiralStrokers/rules.mk | 2 +- keyboards/satan/keymaps/ben_iso/rules.mk | 2 +- keyboards/satan/keymaps/chaser/rules.mk | 2 +- keyboards/satan/keymaps/colemak/rules.mk | 2 +- keyboards/satan/keymaps/default/rules.mk | 2 +- keyboards/satan/keymaps/dende_iso/rules.mk | 2 +- keyboards/satan/keymaps/dkrieger/rules.mk | 2 +- keyboards/satan/keymaps/isoHHKB/rules.mk | 2 +- keyboards/satan/keymaps/lepa/rules.mk | 2 +- keyboards/satan/keymaps/midi/rules.mk | 2 +- keyboards/satan/keymaps/olligranlund_iso/rules.mk | 2 +- keyboards/satan/keymaps/sethbc/rules.mk | 2 +- keyboards/satan/keymaps/smt/rules.mk | 2 +- keyboards/satan/keymaps/unxmaal/rules.mk | 2 +- keyboards/tada68/keymaps/ardakilic/rules.mk | 2 +- keyboards/tada68/keymaps/bazooka/rules.mk | 2 +- keyboards/tada68/keymaps/cheese/rules.mk | 3 +-- keyboards/tada68/keymaps/default/rules.mk | 2 +- keyboards/tada68/keymaps/fakb/rules.mk | 2 +- keyboards/tada68/keymaps/fezzant/rules.mk | 2 +- keyboards/tada68/keymaps/iso-nor/rules.mk | 2 +- keyboards/tada68/keymaps/iso-uk/rules.mk | 2 +- keyboards/tada68/keymaps/isoish/rules.mk | 2 +- keyboards/tada68/keymaps/mattdicarlo/rules.mk | 2 +- keyboards/tada68/keymaps/mlechner/rules.mk | 2 +- keyboards/tada68/keymaps/mtdjr/rules.mk | 2 +- keyboards/tada68/keymaps/pascamel/rules.mk | 2 +- keyboards/tada68/keymaps/raylas/rules.mk | 2 +- keyboards/tada68/keymaps/rbong/rules.mk | 2 +- keyboards/tada68/keymaps/rgb/rules.mk | 2 +- keyboards/tada68/keymaps/rys/rules.mk | 2 +- keyboards/tada68/keymaps/shalzz/rules.mk | 2 +- keyboards/tada68/keymaps/sm0g/rules.mk | 2 +- keyboards/tada68/keymaps/stephengrier/rules.mk | 2 +- keyboards/tada68/keymaps/trashcat/rules.mk | 2 +- keyboards/tada68/keymaps/tshack/rules.mk | 2 +- keyboards/tada68/keymaps/unix/rules.mk | 2 +- keyboards/tada68/keymaps/wamsm_tada/rules.mk | 2 +- keyboards/the_ruler/keymaps/default/rules.mk | 2 +- keyboards/the_ruler/rules.mk | 2 +- keyboards/thevankeyboards/bananasplit/keymaps/0010/rules.mk | 2 +- .../bananasplit/keymaps/coloneljesus/rules.mk | 2 +- .../thevankeyboards/bananasplit/keymaps/default/rules.mk | 2 +- .../thevankeyboards/bananasplit/keymaps/kamon/rules.mk | 2 +- keyboards/thevankeyboards/minivan/keymaps/default/rules.mk | 2 +- keyboards/thevankeyboards/minivan/keymaps/jeebak/rules.mk | 2 +- .../thevankeyboards/minivan/keymaps/jetpacktuxedo/rules.mk | 2 +- keyboards/thevankeyboards/minivan/keymaps/mjt/rules.mk | 2 +- keyboards/thevankeyboards/minivan/keymaps/smt/rules.mk | 2 +- keyboards/thevankeyboards/minivan/keymaps/tong92/rules.mk | 2 +- keyboards/thevankeyboards/minivan/keymaps/xyverz/rules.mk | 2 +- keyboards/thevankeyboards/roadkit/keymaps/default/rules.mk | 2 +- .../thevankeyboards/roadkit/keymaps/flipphone/rules.mk | 2 +- keyboards/thevankeyboards/roadkit/keymaps/khord/rules.mk | 2 +- keyboards/thevankeyboards/roadkit/keymaps/mjt/rules.mk | 2 +- keyboards/thevankeyboards/roadkit/keymaps/singles/rules.mk | 2 +- .../thevankeyboards/roadkit/keymaps/singlesBrent/rules.mk | 2 +- .../roadkit/keymaps/wavebeem-gamepad/rules.mk | 2 +- keyboards/vision_division/keymaps/default/rules.mk | 2 +- keyboards/vitamins_included/rules.mk | 2 +- keyboards/viterbi/rules.mk | 2 +- keyboards/wavelet/rules.mk | 2 +- keyboards/xd60/rules.mk | 2 +- keyboards/xd75/keymaps/fabian/rules.mk | 2 +- keyboards/xd75/keymaps/germanized/rules.mk | 2 +- keyboards/xd75/rules.mk | 2 +- keyboards/zeal60/rules.mk | 2 +- keyboards/zeal65/rules.mk | 3 +-- keyboards/zen/rules.mk | 2 +- layouts/community/ergodox/alphadox/rules.mk | 4 +--- 277 files changed, 280 insertions(+), 293 deletions(-) diff --git a/keyboards/amj40/keymaps/default/rules.mk b/keyboards/amj40/keymaps/default/rules.mk index 034e697bc2f2..41a1982248d8 100644 --- a/keyboards/amj40/keymaps/default/rules.mk +++ b/keyboards/amj40/keymaps/default/rules.mk @@ -1,5 +1,5 @@ # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# 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) @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # 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/amj40/keymaps/fabian/rules.mk b/keyboards/amj40/keymaps/fabian/rules.mk index a914e4c0cec3..7e0634e09e5e 100644 --- a/keyboards/amj40/keymaps/fabian/rules.mk +++ b/keyboards/amj40/keymaps/fabian/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # 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/amj40/keymaps/jetpacktuxedo/rules.mk b/keyboards/amj40/keymaps/jetpacktuxedo/rules.mk index d7f3e76054e4..6ad92366889a 100644 --- a/keyboards/amj40/keymaps/jetpacktuxedo/rules.mk +++ b/keyboards/amj40/keymaps/jetpacktuxedo/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/amj40/keymaps/myee/rules.mk b/keyboards/amj40/keymaps/myee/rules.mk index 034e697bc2f2..c35191cef270 100644 --- a/keyboards/amj40/keymaps/myee/rules.mk +++ b/keyboards/amj40/keymaps/myee/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # 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/amj60/keymaps/iso_split_rshift/rules.mk b/keyboards/amj60/keymaps/iso_split_rshift/rules.mk index 2969ed8aece1..931affcd5633 100644 --- a/keyboards/amj60/keymaps/iso_split_rshift/rules.mk +++ b/keyboards/amj60/keymaps/iso_split_rshift/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/atomic/keymaps/pvc/rules.mk b/keyboards/atomic/keymaps/pvc/rules.mk index c7c04485fcea..8414b40fb6d0 100644 --- a/keyboards/atomic/keymaps/pvc/rules.mk +++ b/keyboards/atomic/keymaps/pvc/rules.mk @@ -9,7 +9,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/keyboards/atomic/rules.mk b/keyboards/atomic/rules.mk index 3bd04a00a73e..eee6c2530a26 100644 --- a/keyboards/atomic/rules.mk +++ b/keyboards/atomic/rules.mk @@ -63,7 +63,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/atreus/keymaps/xk/rules.mk b/keyboards/atreus/keymaps/xk/rules.mk index fe431f28a737..2e76f9da5dd8 100644 --- a/keyboards/atreus/keymaps/xk/rules.mk +++ b/keyboards/atreus/keymaps/xk/rules.mk @@ -10,7 +10,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = yes # 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) ifndef QUANTUM_DIR diff --git a/keyboards/bfo9000/rules.mk b/keyboards/bfo9000/rules.mk index 8a7e56f462d3..d11f9a54e7cb 100644 --- a/keyboards/bfo9000/rules.mk +++ b/keyboards/bfo9000/rules.mk @@ -63,7 +63,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/bpiphany/frosty_flake/keymaps/QFR_JM/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/rules.mk index 0ae0b96462f5..856481d03175 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/rules.mk +++ b/keyboards/bpiphany/frosty_flake/keymaps/QFR_JM/rules.mk @@ -13,5 +13,5 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk index 9d3df5964f21..93f927c7d0a4 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk +++ b/keyboards/bpiphany/frosty_flake/keymaps/default/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk index b21eb640443a..fc5761c0535b 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk +++ b/keyboards/bpiphany/frosty_flake/keymaps/nikchi/rules.mk @@ -14,7 +14,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes # unicodemap 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes LEADER_ENABLE = yes diff --git a/keyboards/bpiphany/frosty_flake/keymaps/tkl/rules.mk b/keyboards/bpiphany/frosty_flake/keymaps/tkl/rules.mk index f29756f2238b..c76a5a80e4b3 100644 --- a/keyboards/bpiphany/frosty_flake/keymaps/tkl/rules.mk +++ b/keyboards/bpiphany/frosty_flake/keymaps/tkl/rules.mk @@ -13,5 +13,5 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk index 168fb625b2dd..7a616ee5f341 100644 --- a/keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk +++ b/keyboards/bpiphany/pegasushoof/keymaps/blowrak/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. ifndef QUANTUM_DIR diff --git a/keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk index 0dd8a79f4e42..4cec29477ac0 100644 --- a/keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk +++ b/keyboards/bpiphany/pegasushoof/keymaps/citadel/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. TAP_DANCE_ENABLE = yes # see https://docs.qmk.fm/#/feature_tap_dance (+1000) diff --git a/keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk index 168fb625b2dd..7a616ee5f341 100644 --- a/keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk +++ b/keyboards/bpiphany/pegasushoof/keymaps/default/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. ifndef QUANTUM_DIR diff --git a/keyboards/bpiphany/pegasushoof/rules.mk b/keyboards/bpiphany/pegasushoof/rules.mk index c5a35428ca2b..0cfe115aabfd 100644 --- a/keyboards/bpiphany/pegasushoof/rules.mk +++ b/keyboards/bpiphany/pegasushoof/rules.mk @@ -60,7 +60,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. CUSTOM_MATRIX = yes diff --git a/keyboards/bpiphany/tiger_lily/keymaps/default/rules.mk b/keyboards/bpiphany/tiger_lily/keymaps/default/rules.mk index 9d3df5964f21..93f927c7d0a4 100644 --- a/keyboards/bpiphany/tiger_lily/keymaps/default/rules.mk +++ b/keyboards/bpiphany/tiger_lily/keymaps/default/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/bpiphany/tiger_lily/keymaps/default_ansi/rules.mk b/keyboards/bpiphany/tiger_lily/keymaps/default_ansi/rules.mk index 9d3df5964f21..93f927c7d0a4 100644 --- a/keyboards/bpiphany/tiger_lily/keymaps/default_ansi/rules.mk +++ b/keyboards/bpiphany/tiger_lily/keymaps/default_ansi/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/clueboard/66/keymaps/xyverz/rules.mk b/keyboards/clueboard/66/keymaps/xyverz/rules.mk index 950dadf841e9..fc02ecb7ef91 100644 --- a/keyboards/clueboard/66/keymaps/xyverz/rules.mk +++ b/keyboards/clueboard/66/keymaps/xyverz/rules.mk @@ -42,7 +42,7 @@ # change to "no" to disable the options, or define them in the makefile.mk in # the appropriate keymap folder that will get included automatically # -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/comet46/keymaps/satt/rules.mk b/keyboards/comet46/keymaps/satt/rules.mk index 08af2e70a494..dc4355c78f41 100644 --- a/keyboards/comet46/keymaps/satt/rules.mk +++ b/keyboards/comet46/keymaps/satt/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. ONEHAND_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/contra/keymaps/losinggeneration/rules.mk b/keyboards/contra/keymaps/losinggeneration/rules.mk index 1728afd85c00..ea2b7165d9be 100644 --- a/keyboards/contra/keymaps/losinggeneration/rules.mk +++ b/keyboards/contra/keymaps/losinggeneration/rules.mk @@ -10,7 +10,7 @@ COMMAND_ENABLE = no # Commands for debug and configuration CONSOLE_ENABLE = no # Console for debug(+400) MIDI_ENABLE = no # MIDI controls NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/converter/ibm_terminal/keymaps/default/rules.mk b/keyboards/converter/ibm_terminal/keymaps/default/rules.mk index 19eb5972e3bf..76d349920fc7 100644 --- a/keyboards/converter/ibm_terminal/keymaps/default/rules.mk +++ b/keyboards/converter/ibm_terminal/keymaps/default/rules.mk @@ -14,7 +14,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. PS2_USE_USART = yes API_SYSEX_ENABLE = no diff --git a/keyboards/converter/ibm_terminal/keymaps/priyadi/rules.mk b/keyboards/converter/ibm_terminal/keymaps/priyadi/rules.mk index 19eb5972e3bf..76d349920fc7 100644 --- a/keyboards/converter/ibm_terminal/keymaps/priyadi/rules.mk +++ b/keyboards/converter/ibm_terminal/keymaps/priyadi/rules.mk @@ -14,7 +14,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. PS2_USE_USART = yes API_SYSEX_ENABLE = no diff --git a/keyboards/converter/ibm_terminal/rules.mk b/keyboards/converter/ibm_terminal/rules.mk index 9401cf199c57..77b3a6f3f75f 100644 --- a/keyboards/converter/ibm_terminal/rules.mk +++ b/keyboards/converter/ibm_terminal/rules.mk @@ -61,7 +61,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. PS2_USE_USART = yes API_SYSEX_ENABLE = n CUSTOM_MATRIX = yes diff --git a/keyboards/converter/sun_usb/rules.mk b/keyboards/converter/sun_usb/rules.mk index 6e36a1905084..3cf503b1d25f 100644 --- a/keyboards/converter/sun_usb/rules.mk +++ b/keyboards/converter/sun_usb/rules.mk @@ -24,7 +24,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. CUSTOM_MATRIX = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/crkbd/keymaps/default/rules.mk b/keyboards/crkbd/keymaps/default/rules.mk index 5ee01e89e1fa..16deaf45d1de 100644 --- a/keyboards/crkbd/keymaps/default/rules.mk +++ b/keyboards/crkbd/keymaps/default/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/crkbd/keymaps/drashna/rules.mk b/keyboards/crkbd/keymaps/drashna/rules.mk index 8fca70448964..8f69cba72f6d 100644 --- a/keyboards/crkbd/keymaps/drashna/rules.mk +++ b/keyboards/crkbd/keymaps/drashna/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/crkbd/keymaps/like_jis/rules.mk b/keyboards/crkbd/keymaps/like_jis/rules.mk index 5ee01e89e1fa..16deaf45d1de 100644 --- a/keyboards/crkbd/keymaps/like_jis/rules.mk +++ b/keyboards/crkbd/keymaps/like_jis/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/crkbd/rules.mk b/keyboards/crkbd/rules.mk index 6396b115de3e..426ed0c03f33 100644 --- a/keyboards/crkbd/rules.mk +++ b/keyboards/crkbd/rules.mk @@ -65,7 +65,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = no USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/daisy/rules.mk b/keyboards/daisy/rules.mk index f24df2fd6c26..8157b168e5d7 100644 --- a/keyboards/daisy/rules.mk +++ b/keyboards/daisy/rules.mk @@ -62,5 +62,5 @@ 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 -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file diff --git a/keyboards/deltasplit75/keymaps/itsaferbie/rules.mk b/keyboards/deltasplit75/keymaps/itsaferbie/rules.mk index bab3b4c56471..75db99ebece4 100644 --- a/keyboards/deltasplit75/keymaps/itsaferbie/rules.mk +++ b/keyboards/deltasplit75/keymaps/itsaferbie/rules.mk @@ -1,4 +1,4 @@ -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. AUDIO_ENABLE = no # Audio disabled while using RGB underlight. EXTRAKEY_ENABLE = yes diff --git a/keyboards/deltasplit75/rules.mk b/keyboards/deltasplit75/rules.mk index 2a13dbdfc68e..5c7571b9dbc3 100644 --- a/keyboards/deltasplit75/rules.mk +++ b/keyboards/deltasplit75/rules.mk @@ -41,7 +41,7 @@ F_USB = $(F_CPU) # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = caterina @@ -63,7 +63,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE @@ -71,4 +71,4 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend CUSTOM_MATRIX = yes -DEFAULT_FOLDER = deltasplit75/v2 \ No newline at end of file +DEFAULT_FOLDER = deltasplit75/v2 diff --git a/keyboards/diverge3/rules.mk b/keyboards/diverge3/rules.mk index aa7453054383..38f3ee4e6a9e 100644 --- a/keyboards/diverge3/rules.mk +++ b/keyboards/diverge3/rules.mk @@ -66,7 +66,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/divergetm2/rules.mk b/keyboards/divergetm2/rules.mk index 2be853a2a617..084a3bf63e33 100644 --- a/keyboards/divergetm2/rules.mk +++ b/keyboards/divergetm2/rules.mk @@ -64,7 +64,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/do60/rules.mk b/keyboards/do60/rules.mk index e7314caf9e5b..8003914fa70c 100644 --- a/keyboards/do60/rules.mk +++ b/keyboards/do60/rules.mk @@ -59,7 +59,7 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450) MIDI_ENABLE = no # MIDI controls MOUSEKEY_ENABLE = yes # Mouse keys(+4700) NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend UNICODE_ENABLE = no # Unicode diff --git a/keyboards/eco/keymaps/default/rules.mk b/keyboards/eco/keymaps/default/rules.mk index 7dab979426d5..0996602325b9 100644 --- a/keyboards/eco/keymaps/default/rules.mk +++ b/keyboards/eco/keymaps/default/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/eco/keymaps/hexwire/rules.mk b/keyboards/eco/keymaps/hexwire/rules.mk index 7dab979426d5..0996602325b9 100644 --- a/keyboards/eco/keymaps/hexwire/rules.mk +++ b/keyboards/eco/keymaps/hexwire/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/eco/keymaps/that_canadian/rules.mk b/keyboards/eco/keymaps/that_canadian/rules.mk index 7dab979426d5..0996602325b9 100644 --- a/keyboards/eco/keymaps/that_canadian/rules.mk +++ b/keyboards/eco/keymaps/that_canadian/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/eco/keymaps/xyverz/rules.mk b/keyboards/eco/keymaps/xyverz/rules.mk index 9a3059e715a8..9e7b9c20246b 100644 --- a/keyboards/eco/keymaps/xyverz/rules.mk +++ b/keyboards/eco/keymaps/xyverz/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/ergo42/rules.mk b/keyboards/ergo42/rules.mk index 252411cab413..cdc9da908458 100644 --- a/keyboards/ergo42/rules.mk +++ b/keyboards/ergo42/rules.mk @@ -67,7 +67,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/ergodash/rules.mk b/keyboards/ergodash/rules.mk index bf0df4040f57..e25346dacd12 100644 --- a/keyboards/ergodash/rules.mk +++ b/keyboards/ergodash/rules.mk @@ -64,7 +64,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/ergodox_infinity/keymaps/narze/rules.mk b/keyboards/ergodox_infinity/keymaps/narze/rules.mk index 7d2e00d0e93d..bd89bb9d989c 100644 --- a/keyboards/ergodox_infinity/keymaps/narze/rules.mk +++ b/keyboards/ergodox_infinity/keymaps/narze/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/ergoinu/keymaps/default/rules.mk b/keyboards/ergoinu/keymaps/default/rules.mk index 7d7a475d17ce..92dde90ff1b5 100644 --- a/keyboards/ergoinu/keymaps/default/rules.mk +++ b/keyboards/ergoinu/keymaps/default/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/ergoinu/keymaps/default_jis/rules.mk b/keyboards/ergoinu/keymaps/default_jis/rules.mk index 7d7a475d17ce..92dde90ff1b5 100644 --- a/keyboards/ergoinu/keymaps/default_jis/rules.mk +++ b/keyboards/ergoinu/keymaps/default_jis/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/ergoinu/rules.mk b/keyboards/ergoinu/rules.mk index a00cc16de2c3..de4bcad526ad 100644 --- a/keyboards/ergoinu/rules.mk +++ b/keyboards/ergoinu/rules.mk @@ -60,7 +60,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = no USE_I2C = no # i2c is not supported # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/ergotravel/rules.mk b/keyboards/ergotravel/rules.mk index d2da788067b4..55155b5a3ea7 100644 --- a/keyboards/ergotravel/rules.mk +++ b/keyboards/ergotravel/rules.mk @@ -59,7 +59,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # 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/fortitude60/rules.mk b/keyboards/fortitude60/rules.mk index 7b2557b7010b..3d1745c6f77f 100644 --- a/keyboards/fortitude60/rules.mk +++ b/keyboards/fortitude60/rules.mk @@ -62,7 +62,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. USE_SERIAL = yes # Serial support only on fortitude60 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend diff --git a/keyboards/fourier/rules.mk b/keyboards/fourier/rules.mk index 151339bc9d00..9ec05e87400e 100644 --- a/keyboards/fourier/rules.mk +++ b/keyboards/fourier/rules.mk @@ -63,7 +63,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/gherkin/keymaps/mjt/rules.mk b/keyboards/gherkin/keymaps/mjt/rules.mk index b397f86d04a5..afb93b674c1b 100644 --- a/keyboards/gherkin/keymaps/mjt/rules.mk +++ b/keyboards/gherkin/keymaps/mjt/rules.mk @@ -20,7 +20,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE=yes diff --git a/keyboards/gonnerd/keymaps/default/rules.mk b/keyboards/gonnerd/keymaps/default/rules.mk index 772d7aee3b9a..e34aba6927f6 100644 --- a/keyboards/gonnerd/keymaps/default/rules.mk +++ b/keyboards/gonnerd/keymaps/default/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/gonnerd/keymaps/gam3cat/rules.mk b/keyboards/gonnerd/keymaps/gam3cat/rules.mk index a32d22e41eff..a226838424ff 100644 --- a/keyboards/gonnerd/keymaps/gam3cat/rules.mk +++ b/keyboards/gonnerd/keymaps/gam3cat/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/gonnerd/keymaps/mauin/rules.mk b/keyboards/gonnerd/keymaps/mauin/rules.mk index 772d7aee3b9a..e34aba6927f6 100644 --- a/keyboards/gonnerd/keymaps/mauin/rules.mk +++ b/keyboards/gonnerd/keymaps/mauin/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/gonnerd/keymaps/tkl/rules.mk b/keyboards/gonnerd/keymaps/tkl/rules.mk index 5854366f9dde..b96663efe6c0 100644 --- a/keyboards/gonnerd/keymaps/tkl/rules.mk +++ b/keyboards/gonnerd/keymaps/tkl/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/hadron/keymaps/default/rules.mk b/keyboards/hadron/keymaps/default/rules.mk index 545ffa75c177..4c6d04f1e54a 100644 --- a/keyboards/hadron/keymaps/default/rules.mk +++ b/keyboards/hadron/keymaps/default/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/hadron/keymaps/side_numpad/rules.mk b/keyboards/hadron/keymaps/side_numpad/rules.mk index d9fabc1accbe..687c285bdb91 100644 --- a/keyboards/hadron/keymaps/side_numpad/rules.mk +++ b/keyboards/hadron/keymaps/side_numpad/rules.mk @@ -15,7 +15,7 @@ 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 = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/rules.mk b/keyboards/handwired/MS_sculpt_mobile/keymaps/default/rules.mk index b3c01678f3ee..3955a3ff4276 100644 --- a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/rules.mk +++ b/keyboards/handwired/MS_sculpt_mobile/keymaps/default/rules.mk @@ -13,5 +13,5 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/rules.mk b/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/rules.mk index 4f62657b3fe8..ddfea8255672 100644 --- a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/rules.mk +++ b/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/rules.mk @@ -13,5 +13,5 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/handwired/arrow_pad/keymaps/pad_21/rules.mk b/keyboards/handwired/arrow_pad/keymaps/pad_21/rules.mk index af51976a89a2..d2403c9ecb36 100644 --- a/keyboards/handwired/arrow_pad/keymaps/pad_21/rules.mk +++ b/keyboards/handwired/arrow_pad/keymaps/pad_21/rules.mk @@ -9,7 +9,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/handwired/arrow_pad/keymaps/pad_24/rules.mk b/keyboards/handwired/arrow_pad/keymaps/pad_24/rules.mk index e31bfe1af231..b305f8482a8b 100644 --- a/keyboards/handwired/arrow_pad/keymaps/pad_24/rules.mk +++ b/keyboards/handwired/arrow_pad/keymaps/pad_24/rules.mk @@ -9,7 +9,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/handwired/atreus50/rules.mk b/keyboards/handwired/atreus50/rules.mk index 2e2d48f6ab58..21c4704e0db3 100644 --- a/keyboards/handwired/atreus50/rules.mk +++ b/keyboards/handwired/atreus50/rules.mk @@ -63,7 +63,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/handwired/dactyl_manuform/4x5/rules.mk b/keyboards/handwired/dactyl_manuform/4x5/rules.mk index 14b6e1e4e31b..7508070515e2 100644 --- a/keyboards/handwired/dactyl_manuform/4x5/rules.mk +++ b/keyboards/handwired/dactyl_manuform/4x5/rules.mk @@ -14,8 +14,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/handwired/dactyl_manuform/4x6/rules.mk b/keyboards/handwired/dactyl_manuform/4x6/rules.mk index 14b6e1e4e31b..7508070515e2 100644 --- a/keyboards/handwired/dactyl_manuform/4x6/rules.mk +++ b/keyboards/handwired/dactyl_manuform/4x6/rules.mk @@ -14,8 +14,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/handwired/dactyl_manuform/5x6/rules.mk b/keyboards/handwired/dactyl_manuform/5x6/rules.mk index 14b6e1e4e31b..7508070515e2 100644 --- a/keyboards/handwired/dactyl_manuform/5x6/rules.mk +++ b/keyboards/handwired/dactyl_manuform/5x6/rules.mk @@ -14,8 +14,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/handwired/dactyl_manuform/5x7/rules.mk b/keyboards/handwired/dactyl_manuform/5x7/rules.mk index fc9cbcccd408..7508070515e2 100644 --- a/keyboards/handwired/dactyl_manuform/5x7/rules.mk +++ b/keyboards/handwired/dactyl_manuform/5x7/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/handwired/dactyl_manuform/6x6/rules.mk b/keyboards/handwired/dactyl_manuform/6x6/rules.mk index 14b6e1e4e31b..7508070515e2 100644 --- a/keyboards/handwired/dactyl_manuform/6x6/rules.mk +++ b/keyboards/handwired/dactyl_manuform/6x6/rules.mk @@ -14,8 +14,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/handwired/dactyl_manuform/rules.mk b/keyboards/handwired/dactyl_manuform/rules.mk index adb058c8af6c..a93de3685876 100644 --- a/keyboards/handwired/dactyl_manuform/rules.mk +++ b/keyboards/handwired/dactyl_manuform/rules.mk @@ -58,7 +58,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/handwired/kbod/keymaps/default/rules.mk b/keyboards/handwired/kbod/keymaps/default/rules.mk index eb6bf940ae2c..5b9ff0bfdca1 100644 --- a/keyboards/handwired/kbod/keymaps/default/rules.mk +++ b/keyboards/handwired/kbod/keymaps/default/rules.mk @@ -13,5 +13,5 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/handwired/minorca/keymaps/default/rules.mk b/keyboards/handwired/minorca/keymaps/default/rules.mk index 0ea7a693535a..584798d1a15a 100644 --- a/keyboards/handwired/minorca/keymaps/default/rules.mk +++ b/keyboards/handwired/minorca/keymaps/default/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/handwired/minorca/keymaps/rgb/rules.mk b/keyboards/handwired/minorca/keymaps/rgb/rules.mk index da44256f993a..6e430d59e240 100644 --- a/keyboards/handwired/minorca/keymaps/rgb/rules.mk +++ b/keyboards/handwired/minorca/keymaps/rgb/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # 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/handwired/minorca/rules.mk b/keyboards/handwired/minorca/rules.mk index ce502b8204ce..3e408e2b9361 100644 --- a/keyboards/handwired/minorca/rules.mk +++ b/keyboards/handwired/minorca/rules.mk @@ -61,7 +61,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # 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/keyboards/handwired/not_so_minidox/rules.mk b/keyboards/handwired/not_so_minidox/rules.mk index fe4cc014e7c7..833dd4b79e3a 100644 --- a/keyboards/handwired/not_so_minidox/rules.mk +++ b/keyboards/handwired/not_so_minidox/rules.mk @@ -63,7 +63,7 @@ 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. +RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. USE_I2C ?= 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/handwired/pilcrow/keymaps/default/rules.mk b/keyboards/handwired/pilcrow/keymaps/default/rules.mk index b3c01678f3ee..3955a3ff4276 100644 --- a/keyboards/handwired/pilcrow/keymaps/default/rules.mk +++ b/keyboards/handwired/pilcrow/keymaps/default/rules.mk @@ -13,5 +13,5 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/handwired/promethium/keymaps/default/rules.mk b/keyboards/handwired/promethium/keymaps/default/rules.mk index a0d4261fa13a..5761be517018 100644 --- a/keyboards/handwired/promethium/keymaps/default/rules.mk +++ b/keyboards/handwired/promethium/keymaps/default/rules.mk @@ -16,7 +16,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. PS2_MOUSE_ENABLE = yes PS2_USE_INT = yes FAUXCLICKY_ENABLE = yes diff --git a/keyboards/handwired/promethium/keymaps/priyadi/rules.mk b/keyboards/handwired/promethium/keymaps/priyadi/rules.mk index a0d4261fa13a..5761be517018 100644 --- a/keyboards/handwired/promethium/keymaps/priyadi/rules.mk +++ b/keyboards/handwired/promethium/keymaps/priyadi/rules.mk @@ -16,7 +16,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. PS2_MOUSE_ENABLE = yes PS2_USE_INT = yes FAUXCLICKY_ENABLE = yes diff --git a/keyboards/handwired/promethium/rules.mk b/keyboards/handwired/promethium/rules.mk index 69903dcebe0b..21328b7f8e82 100644 --- a/keyboards/handwired/promethium/rules.mk +++ b/keyboards/handwired/promethium/rules.mk @@ -62,7 +62,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. PS2_MOUSE_ENABLE = yes PS2_USE_INT = yes API_SYSEX_ENABLE = no diff --git a/keyboards/handwired/qc60/rules.mk b/keyboards/handwired/qc60/rules.mk index 1be83d5f8dc6..e61b18b00cc1 100644 --- a/keyboards/handwired/qc60/rules.mk +++ b/keyboards/handwired/qc60/rules.mk @@ -58,7 +58,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SPLIT_KEYBOARD = yes diff --git a/keyboards/handwired/terminus_mini/keymaps/default/rules.mk b/keyboards/handwired/terminus_mini/keymaps/default/rules.mk index 1485c08320c5..42ab51f15077 100644 --- a/keyboards/handwired/terminus_mini/keymaps/default/rules.mk +++ b/keyboards/handwired/terminus_mini/keymaps/default/rules.mk @@ -29,6 +29,6 @@ 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 -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no # Enable Tap Dance diff --git a/keyboards/handwired/terminus_mini/rules.mk b/keyboards/handwired/terminus_mini/rules.mk index d7acbf7d5203..9ecba25d80f5 100644 --- a/keyboards/handwired/terminus_mini/rules.mk +++ b/keyboards/handwired/terminus_mini/rules.mk @@ -63,7 +63,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no # Enable tap dance diff --git a/keyboards/handwired/woodpad/keymaps/default/rules.mk b/keyboards/handwired/woodpad/keymaps/default/rules.mk index b8879076bd46..f060db79c0b8 100644 --- a/keyboards/handwired/woodpad/keymaps/default/rules.mk +++ b/keyboards/handwired/woodpad/keymaps/default/rules.mk @@ -29,7 +29,7 @@ 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 -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/handwired/xealous/rules.mk b/keyboards/handwired/xealous/rules.mk index 7178959606c6..eebd11d86ecf 100644 --- a/keyboards/handwired/xealous/rules.mk +++ b/keyboards/handwired/xealous/rules.mk @@ -59,7 +59,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SPLIT_KEYBOARD = yes # Use shared split_common code SUBPROJECT_rev1 = yes diff --git a/keyboards/helix/pico/keymaps/biacco/rules.mk b/keyboards/helix/pico/keymaps/biacco/rules.mk index 4f264fa952dc..d6b36580e119 100644 --- a/keyboards/helix/pico/keymaps/biacco/rules.mk +++ b/keyboards/helix/pico/keymaps/biacco/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port B5 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/pico/keymaps/default/rules.mk b/keyboards/helix/pico/keymaps/default/rules.mk index b1e219537f4a..c5ee8acb2ac4 100644 --- a/keyboards/helix/pico/keymaps/default/rules.mk +++ b/keyboards/helix/pico/keymaps/default/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port B5 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/rev1/keymaps/OLED_sample/rules.mk b/keyboards/helix/rev1/keymaps/OLED_sample/rules.mk index 3f8fd5dc674b..c56d6f37e043 100644 --- a/keyboards/helix/rev1/keymaps/OLED_sample/rules.mk +++ b/keyboards/helix/rev1/keymaps/OLED_sample/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/helix/rev2/keymaps/default/rules.mk b/keyboards/helix/rev2/keymaps/default/rules.mk index 14c353d507f1..3f84b895aaa6 100644 --- a/keyboards/helix/rev2/keymaps/default/rules.mk +++ b/keyboards/helix/rev2/keymaps/default/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/rules.mk b/keyboards/helix/rev2/keymaps/edvorakjp/rules.mk index 9bd46fabcfc2..4257d004da44 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/rules.mk +++ b/keyboards/helix/rev2/keymaps/edvorakjp/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/rev2/keymaps/five_rows/rules.mk b/keyboards/helix/rev2/keymaps/five_rows/rules.mk index f771c94c9ce4..bd7130cfc663 100644 --- a/keyboards/helix/rev2/keymaps/five_rows/rules.mk +++ b/keyboards/helix/rev2/keymaps/five_rows/rules.mk @@ -18,7 +18,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk b/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk index 14c353d507f1..3f84b895aaa6 100644 --- a/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk +++ b/keyboards/helix/rev2/keymaps/five_rows_jis/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/rev2/keymaps/froggy/rules.mk b/keyboards/helix/rev2/keymaps/froggy/rules.mk index e52e4a37362e..f46017071149 100644 --- a/keyboards/helix/rev2/keymaps/froggy/rules.mk +++ b/keyboards/helix/rev2/keymaps/froggy/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/rev2/keymaps/led_test/rules.mk b/keyboards/helix/rev2/keymaps/led_test/rules.mk index f599cd4f387c..a9cd251bc5f5 100644 --- a/keyboards/helix/rev2/keymaps/led_test/rules.mk +++ b/keyboards/helix/rev2/keymaps/led_test/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk b/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk index 8331a2e1d8cb..3f390b48f86f 100644 --- a/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk +++ b/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing define HELIX_CUSTOMISE_MSG diff --git a/keyboards/helix/rules.mk b/keyboards/helix/rules.mk index 7c1d56527a7f..be234e60eccf 100644 --- a/keyboards/helix/rules.mk +++ b/keyboards/helix/rules.mk @@ -62,7 +62,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = no USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/hhkb/keymaps/cinaeco/rules.mk b/keyboards/hhkb/keymaps/cinaeco/rules.mk index 05b724051ec8..efed95492f74 100644 --- a/keyboards/hhkb/keymaps/cinaeco/rules.mk +++ b/keyboards/hhkb/keymaps/cinaeco/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/iris/keymaps/edvorakjp/rules.mk b/keyboards/iris/keymaps/edvorakjp/rules.mk index 1c88fbc7bc3c..58d244c38954 100644 --- a/keyboards/iris/keymaps/edvorakjp/rules.mk +++ b/keyboards/iris/keymaps/edvorakjp/rules.mk @@ -13,4 +13,4 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. diff --git a/keyboards/iris/rules.mk b/keyboards/iris/rules.mk index 88dd66c18ef4..e93d7dae8027 100644 --- a/keyboards/iris/rules.mk +++ b/keyboards/iris/rules.mk @@ -61,7 +61,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # 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/jd45/keymaps/mjt/rules.mk b/keyboards/jd45/keymaps/mjt/rules.mk index 1f4b391d55e1..a22e71b0d96d 100644 --- a/keyboards/jd45/keymaps/mjt/rules.mk +++ b/keyboards/jd45/keymaps/mjt/rules.mk @@ -13,5 +13,5 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/jd45/keymaps/mjt6u/rules.mk b/keyboards/jd45/keymaps/mjt6u/rules.mk index f9cec3b84a22..1df8b9754b66 100644 --- a/keyboards/jd45/keymaps/mjt6u/rules.mk +++ b/keyboards/jd45/keymaps/mjt6u/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend DEBUG_ENABLE = yes diff --git a/keyboards/kinesis/keymaps/carpalx/rules.mk b/keyboards/kinesis/keymaps/carpalx/rules.mk index 1854d35df24b..c7753fae05f4 100644 --- a/keyboards/kinesis/keymaps/carpalx/rules.mk +++ b/keyboards/kinesis/keymaps/carpalx/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/kinesis/keymaps/default/rules.mk b/keyboards/kinesis/keymaps/default/rules.mk index 9d3df5964f21..93f927c7d0a4 100644 --- a/keyboards/kinesis/keymaps/default/rules.mk +++ b/keyboards/kinesis/keymaps/default/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/kinesis/keymaps/default_pretty/rules.mk b/keyboards/kinesis/keymaps/default_pretty/rules.mk index 9d3df5964f21..93f927c7d0a4 100644 --- a/keyboards/kinesis/keymaps/default_pretty/rules.mk +++ b/keyboards/kinesis/keymaps/default_pretty/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/kinesis/keymaps/dvorak/rules.mk b/keyboards/kinesis/keymaps/dvorak/rules.mk index 9d3df5964f21..93f927c7d0a4 100644 --- a/keyboards/kinesis/keymaps/dvorak/rules.mk +++ b/keyboards/kinesis/keymaps/dvorak/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/kinesis/keymaps/insertsnideremarks/rules.mk b/keyboards/kinesis/keymaps/insertsnideremarks/rules.mk index 8e4a8ffada53..24b16ba9b760 100644 --- a/keyboards/kinesis/keymaps/insertsnideremarks/rules.mk +++ b/keyboards/kinesis/keymaps/insertsnideremarks/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = yes # 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes # Enable Tap Dancing function diff --git a/keyboards/kinesis/keymaps/milestogo/rules.mk b/keyboards/kinesis/keymaps/milestogo/rules.mk index 9d3df5964f21..93f927c7d0a4 100644 --- a/keyboards/kinesis/keymaps/milestogo/rules.mk +++ b/keyboards/kinesis/keymaps/milestogo/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/kinesis/keymaps/xyverz/rules.mk b/keyboards/kinesis/keymaps/xyverz/rules.mk index c21f8aea67d3..94dc4cdfeae8 100644 --- a/keyboards/kinesis/keymaps/xyverz/rules.mk +++ b/keyboards/kinesis/keymaps/xyverz/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/launchpad/keymaps/default/rules.mk b/keyboards/launchpad/keymaps/default/rules.mk index 260b9d8fad60..9bf35a59d09c 100644 --- a/keyboards/launchpad/keymaps/default/rules.mk +++ b/keyboards/launchpad/keymaps/default/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/lets_split/keymaps/OLED_sample/rules.mk b/keyboards/lets_split/keymaps/OLED_sample/rules.mk index 874d09eab540..a14e84d4e5c5 100644 --- a/keyboards/lets_split/keymaps/OLED_sample/rules.mk +++ b/keyboards/lets_split/keymaps/OLED_sample/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/lets_split/keymaps/heartrobotninja/rules.mk b/keyboards/lets_split/keymaps/heartrobotninja/rules.mk index 2261a848aa69..36f5e5b6d556 100644 --- a/keyboards/lets_split/keymaps/heartrobotninja/rules.mk +++ b/keyboards/lets_split/keymaps/heartrobotninja/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE @@ -23,4 +23,3 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR include ../../../../Makefile endif - diff --git a/keyboards/lets_split/keymaps/mjt/rules.mk b/keyboards/lets_split/keymaps/mjt/rules.mk index 874d09eab540..a14e84d4e5c5 100644 --- a/keyboards/lets_split/keymaps/mjt/rules.mk +++ b/keyboards/lets_split/keymaps/mjt/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/lets_split/keymaps/piemod/rules.mk b/keyboards/lets_split/keymaps/piemod/rules.mk index 027ea977e714..e2bb583cd9cf 100644 --- a/keyboards/lets_split/keymaps/piemod/rules.mk +++ b/keyboards/lets_split/keymaps/piemod/rules.mk @@ -9,5 +9,5 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = yes # 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = no diff --git a/keyboards/lets_split/keymaps/xk/rules.mk b/keyboards/lets_split/keymaps/xk/rules.mk index 84bf8e1f595a..195f01577897 100644 --- a/keyboards/lets_split/keymaps/xk/rules.mk +++ b/keyboards/lets_split/keymaps/xk/rules.mk @@ -11,7 +11,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = yes # 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) ifndef QUANTUM_DIR diff --git a/keyboards/lets_split/rules.mk b/keyboards/lets_split/rules.mk index 951723edc5bb..4cd972786f49 100644 --- a/keyboards/lets_split/rules.mk +++ b/keyboards/lets_split/rules.mk @@ -64,7 +64,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/levinson/keymaps/losinggeneration/rules.mk b/keyboards/levinson/keymaps/losinggeneration/rules.mk index f3e47b4c2ee0..c8eef2cb3f1e 100644 --- a/keyboards/levinson/keymaps/losinggeneration/rules.mk +++ b/keyboards/levinson/keymaps/losinggeneration/rules.mk @@ -10,7 +10,7 @@ COMMAND_ENABLE = no # Commands for debug and configuration CONSOLE_ENABLE = no # Console for debug(+400) MIDI_ENABLE = no # MIDI controls NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/levinson/rules.mk b/keyboards/levinson/rules.mk index 4805ed99ee23..8f1fa130fa62 100644 --- a/keyboards/levinson/rules.mk +++ b/keyboards/levinson/rules.mk @@ -22,7 +22,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/lfkeyboards/lfk78/keymaps/default/rules.mk b/keyboards/lfkeyboards/lfk78/keymaps/default/rules.mk index 20030f17d0b7..555ad9723046 100644 --- a/keyboards/lfkeyboards/lfk78/keymaps/default/rules.mk +++ b/keyboards/lfkeyboards/lfk78/keymaps/default/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. RGBLIGHT_CUSTOM_DRIVER = yes # RGB code is implemented in lefkeyboards, not qmk base SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no diff --git a/keyboards/lfkeyboards/lfk78/keymaps/iso/rules.mk b/keyboards/lfkeyboards/lfk78/keymaps/iso/rules.mk index ab20ac0db23e..147e95bc8784 100644 --- a/keyboards/lfkeyboards/lfk78/keymaps/iso/rules.mk +++ b/keyboards/lfkeyboards/lfk78/keymaps/iso/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. RGBLIGHT_CUSTOM_DRIVER = yes # RGB code is implemented in lefkeyboards, not qmk base SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no diff --git a/keyboards/lfkeyboards/lfk78/keymaps/split_bs_osx/rules.mk b/keyboards/lfkeyboards/lfk78/keymaps/split_bs_osx/rules.mk index 20030f17d0b7..555ad9723046 100644 --- a/keyboards/lfkeyboards/lfk78/keymaps/split_bs_osx/rules.mk +++ b/keyboards/lfkeyboards/lfk78/keymaps/split_bs_osx/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. RGBLIGHT_CUSTOM_DRIVER = yes # RGB code is implemented in lefkeyboards, not qmk base SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no diff --git a/keyboards/lfkeyboards/lfkpad/keymaps/default/rules.mk b/keyboards/lfkeyboards/lfkpad/keymaps/default/rules.mk index d2ddd157837e..1653f4e3023b 100644 --- a/keyboards/lfkeyboards/lfkpad/keymaps/default/rules.mk +++ b/keyboards/lfkeyboards/lfkpad/keymaps/default/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. RGBLIGHT_CUSTOM_DRIVER = yes # RGB code is implemented in lefkeyboards, not qmk base SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no diff --git a/keyboards/lily58/rules.mk b/keyboards/lily58/rules.mk index 72964fca1b3d..ad8ad585e9a4 100644 --- a/keyboards/lily58/rules.mk +++ b/keyboards/lily58/rules.mk @@ -63,7 +63,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = no USE_I2C = no # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/meira/rules.mk b/keyboards/meira/rules.mk index d3e45fc8d0d0..6c2472f43369 100644 --- a/keyboards/meira/rules.mk +++ b/keyboards/meira/rules.mk @@ -59,7 +59,7 @@ 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 -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches BACKLIGHT_CUSTOM_DRIVER = yes BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality, also set ISSI_ENABLE below for Miera diff --git a/keyboards/minidox/keymaps/alairock/rules.mk b/keyboards/minidox/keymaps/alairock/rules.mk index cd7ab91c22ab..ebada165ae79 100644 --- a/keyboards/minidox/keymaps/alairock/rules.mk +++ b/keyboards/minidox/keymaps/alairock/rules.mk @@ -1,2 +1,2 @@ -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. EXTRAKEY_ENABLE = yes diff --git a/keyboards/minidox/keymaps/that_canadian/rules.mk b/keyboards/minidox/keymaps/that_canadian/rules.mk index 52ef1ad3e4dd..7637dfc09a96 100644 --- a/keyboards/minidox/keymaps/that_canadian/rules.mk +++ b/keyboards/minidox/keymaps/that_canadian/rules.mk @@ -1,4 +1,4 @@ -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/minidox/keymaps/xyverz/rules.mk b/keyboards/minidox/keymaps/xyverz/rules.mk index d34df5b19b34..c777cb1b9ff8 100644 --- a/keyboards/minidox/keymaps/xyverz/rules.mk +++ b/keyboards/minidox/keymaps/xyverz/rules.mk @@ -1 +1 @@ -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. diff --git a/keyboards/minidox/rules.mk b/keyboards/minidox/rules.mk index 0c3a03bd73c3..861976e15bd3 100644 --- a/keyboards/minidox/rules.mk +++ b/keyboards/minidox/rules.mk @@ -63,7 +63,7 @@ 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. +RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight. USE_I2C ?= 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/mint60/rules.mk b/keyboards/mint60/rules.mk index b4d4bddd33e6..b4472153bc81 100644 --- a/keyboards/mint60/rules.mk +++ b/keyboards/mint60/rules.mk @@ -75,4 +75,4 @@ HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) CUSTOM_MATRIX = yes USE_I2C = yes -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. diff --git a/keyboards/miuni32/keymaps/adam-lee/rules.mk b/keyboards/miuni32/keymaps/adam-lee/rules.mk index 88a3aea7419e..3138ab57f736 100644 --- a/keyboards/miuni32/keymaps/adam-lee/rules.mk +++ b/keyboards/miuni32/keymaps/adam-lee/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/miuni32/keymaps/default/rules.mk b/keyboards/miuni32/keymaps/default/rules.mk index 88a3aea7419e..3138ab57f736 100644 --- a/keyboards/miuni32/keymaps/default/rules.mk +++ b/keyboards/miuni32/keymaps/default/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/miuni32/keymaps/ht_156/rules.mk b/keyboards/miuni32/keymaps/ht_156/rules.mk index 88a3aea7419e..3138ab57f736 100644 --- a/keyboards/miuni32/keymaps/ht_156/rules.mk +++ b/keyboards/miuni32/keymaps/ht_156/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/miuni32/keymaps/ki/rules.mk b/keyboards/miuni32/keymaps/ki/rules.mk index 8a72a6e4e7ef..7639c2b3f140 100644 --- a/keyboards/miuni32/keymaps/ki/rules.mk +++ b/keyboards/miuni32/keymaps/ki/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/mt40/rules.mk b/keyboards/mt40/rules.mk index 64e7413f5c5a..db6ec93f5e38 100644 --- a/keyboards/mt40/rules.mk +++ b/keyboards/mt40/rules.mk @@ -27,7 +27,7 @@ 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. +RGBLIGHT_ENABLE ?= yes # Enable WS2812 RGB underlight. RGBLIGHT_CUSTOM_DRIVER = yes TAP_DANCE_ENABLE = no diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/rules.mk b/keyboards/niu_mini/keymaps/spacebarracecar/rules.mk index b1d7055da7ce..124de79deb86 100644 --- a/keyboards/niu_mini/keymaps/spacebarracecar/rules.mk +++ b/keyboards/niu_mini/keymaps/spacebarracecar/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # 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/nyquist/keymaps/DivergeJM/rules.mk b/keyboards/nyquist/keymaps/DivergeJM/rules.mk index 654e82a10f51..2c26b47ea1f6 100644 --- a/keyboards/nyquist/keymaps/DivergeJM/rules.mk +++ b/keyboards/nyquist/keymaps/DivergeJM/rules.mk @@ -29,6 +29,6 @@ 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 -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no # Enable Tap Dance diff --git a/keyboards/nyquist/keymaps/danielhklein/rules.mk b/keyboards/nyquist/keymaps/danielhklein/rules.mk index 0b540a471290..12ad2fec5957 100644 --- a/keyboards/nyquist/keymaps/danielhklein/rules.mk +++ b/keyboards/nyquist/keymaps/danielhklein/rules.mk @@ -29,6 +29,6 @@ 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 -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no # Enable Tap Dance diff --git a/keyboards/nyquist/keymaps/losinggeneration/rules.mk b/keyboards/nyquist/keymaps/losinggeneration/rules.mk index 1728afd85c00..ea2b7165d9be 100644 --- a/keyboards/nyquist/keymaps/losinggeneration/rules.mk +++ b/keyboards/nyquist/keymaps/losinggeneration/rules.mk @@ -10,7 +10,7 @@ COMMAND_ENABLE = no # Commands for debug and configuration CONSOLE_ENABLE = no # Console for debug(+400) MIDI_ENABLE = no # MIDI controls NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/nyquist/rules.mk b/keyboards/nyquist/rules.mk index e8f1840418b4..74d5625f8553 100644 --- a/keyboards/nyquist/rules.mk +++ b/keyboards/nyquist/rules.mk @@ -64,7 +64,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID USE_I2C = yes -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # 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/org60/rules.mk b/keyboards/org60/rules.mk index c79e6e27048b..53e9a28fe870 100644 --- a/keyboards/org60/rules.mk +++ b/keyboards/org60/rules.mk @@ -59,7 +59,7 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450) MIDI_ENABLE = no # MIDI controls MOUSEKEY_ENABLE = yes # Mouse keys(+4700) NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend UNICODE_ENABLE = no # Unicode diff --git a/keyboards/orthodox/rules.mk b/keyboards/orthodox/rules.mk index 7132a915bf36..715f25c3a005 100644 --- a/keyboards/orthodox/rules.mk +++ b/keyboards/orthodox/rules.mk @@ -61,7 +61,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/planck/keymaps/ab/rules.mk b/keyboards/planck/keymaps/ab/rules.mk index 44a030ba3807..0b025a2313e8 100644 --- a/keyboards/planck/keymaps/ab/rules.mk +++ b/keyboards/planck/keymaps/ab/rules.mk @@ -53,7 +53,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/alexey/rules.mk b/keyboards/planck/keymaps/alexey/rules.mk index 581e08cd02aa..caff043c582e 100644 --- a/keyboards/planck/keymaps/alexey/rules.mk +++ b/keyboards/planck/keymaps/alexey/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/angerthosenear/rules.mk b/keyboards/planck/keymaps/angerthosenear/rules.mk index 581e08cd02aa..caff043c582e 100644 --- a/keyboards/planck/keymaps/angerthosenear/rules.mk +++ b/keyboards/planck/keymaps/angerthosenear/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/austin/rules.mk b/keyboards/planck/keymaps/austin/rules.mk index 581e08cd02aa..caff043c582e 100644 --- a/keyboards/planck/keymaps/austin/rules.mk +++ b/keyboards/planck/keymaps/austin/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/basic/rules.mk b/keyboards/planck/keymaps/basic/rules.mk index 0c0632da09bd..6f88a28d5089 100644 --- a/keyboards/planck/keymaps/basic/rules.mk +++ b/keyboards/planck/keymaps/basic/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/bone2planck/rules.mk b/keyboards/planck/keymaps/bone2planck/rules.mk index 39635192e5ca..699726948dfd 100644 --- a/keyboards/planck/keymaps/bone2planck/rules.mk +++ b/keyboards/planck/keymaps/bone2planck/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/callum/rules.mk b/keyboards/planck/keymaps/callum/rules.mk index 8ee9a45ab710..67fe8d284d5d 100644 --- a/keyboards/planck/keymaps/callum/rules.mk +++ b/keyboards/planck/keymaps/callum/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/cbbrowne/rules.mk b/keyboards/planck/keymaps/cbbrowne/rules.mk index d5026e2d9b03..c7cef55a9af1 100644 --- a/keyboards/planck/keymaps/cbbrowne/rules.mk +++ b/keyboards/planck/keymaps/cbbrowne/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. API_SYSEX_ENABLE = no # Enable SYSEX API (+5390) # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/planck/keymaps/chance/rules.mk b/keyboards/planck/keymaps/chance/rules.mk index 00d09e974a3e..5c9798a5726d 100644 --- a/keyboards/planck/keymaps/chance/rules.mk +++ b/keyboards/planck/keymaps/chance/rules.mk @@ -1,4 +1,4 @@ -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. AUDIO_ENABLE = no ifndef QUANTUM_DIR diff --git a/keyboards/planck/keymaps/charlie/rules.mk b/keyboards/planck/keymaps/charlie/rules.mk index 581e08cd02aa..caff043c582e 100644 --- a/keyboards/planck/keymaps/charlie/rules.mk +++ b/keyboards/planck/keymaps/charlie/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/circuit/rules.mk b/keyboards/planck/keymaps/circuit/rules.mk index 1ed0ff9568e2..e9a02e31e200 100644 --- a/keyboards/planck/keymaps/circuit/rules.mk +++ b/keyboards/planck/keymaps/circuit/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. TAP_DANCE_ENABLE = yes # Enables the double-tap functionality of keys # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/planck/keymaps/daniel/rules.mk b/keyboards/planck/keymaps/daniel/rules.mk index 581e08cd02aa..caff043c582e 100644 --- a/keyboards/planck/keymaps/daniel/rules.mk +++ b/keyboards/planck/keymaps/daniel/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/danielhklein/rules.mk b/keyboards/planck/keymaps/danielhklein/rules.mk index a73d8518337a..72386fae7d3a 100644 --- a/keyboards/planck/keymaps/danielhklein/rules.mk +++ b/keyboards/planck/keymaps/danielhklein/rules.mk @@ -9,6 +9,6 @@ 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 -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no # Enable Tap Dance \ No newline at end of file diff --git a/keyboards/planck/keymaps/david/rules.mk b/keyboards/planck/keymaps/david/rules.mk index 581e08cd02aa..caff043c582e 100644 --- a/keyboards/planck/keymaps/david/rules.mk +++ b/keyboards/planck/keymaps/david/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/dc/rules.mk b/keyboards/planck/keymaps/dc/rules.mk index 6106b40e1449..ea4341b4fd29 100644 --- a/keyboards/planck/keymaps/dc/rules.mk +++ b/keyboards/planck/keymaps/dc/rules.mk @@ -17,7 +17,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. TAP_DANCE_ENABLE = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/planck/keymaps/dlaroe/rules.mk b/keyboards/planck/keymaps/dlaroe/rules.mk index 22a08c668baa..0064f622b76b 100644 --- a/keyboards/planck/keymaps/dlaroe/rules.mk +++ b/keyboards/planck/keymaps/dlaroe/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/dr_notsokind/rules.mk b/keyboards/planck/keymaps/dr_notsokind/rules.mk index 7f691ebe435d..eea90f8e6a44 100644 --- a/keyboards/planck/keymaps/dr_notsokind/rules.mk +++ b/keyboards/planck/keymaps/dr_notsokind/rules.mk @@ -14,7 +14,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. TAP_DANCE_ENABLE = yes # Enables the double-tap functionality of keys # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/planck/keymaps/dzobert/rules.mk b/keyboards/planck/keymaps/dzobert/rules.mk index 581e08cd02aa..caff043c582e 100644 --- a/keyboards/planck/keymaps/dzobert/rules.mk +++ b/keyboards/planck/keymaps/dzobert/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/espynn/rules.mk b/keyboards/planck/keymaps/espynn/rules.mk index 44a030ba3807..0b025a2313e8 100644 --- a/keyboards/planck/keymaps/espynn/rules.mk +++ b/keyboards/planck/keymaps/espynn/rules.mk @@ -53,7 +53,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/experimental/rules.mk b/keyboards/planck/keymaps/experimental/rules.mk index 168d3cb9f094..721e887b98c8 100644 --- a/keyboards/planck/keymaps/experimental/rules.mk +++ b/keyboards/planck/keymaps/experimental/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = yes # Enable one-hand typing STENO_ENABLE = yes # Enable TX Bolt protocol for Stenography, requires VIRTSER and may not work with mouse keys LEADER_ENABLE = yes diff --git a/keyboards/planck/keymaps/gabriel/rules.mk b/keyboards/planck/keymaps/gabriel/rules.mk index 581e08cd02aa..caff043c582e 100644 --- a/keyboards/planck/keymaps/gabriel/rules.mk +++ b/keyboards/planck/keymaps/gabriel/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/gunp/rules.mk b/keyboards/planck/keymaps/gunp/rules.mk index 1ad30423bed5..7d03482abc61 100644 --- a/keyboards/planck/keymaps/gunp/rules.mk +++ b/keyboards/planck/keymaps/gunp/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = yes # 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/impossible/rules.mk b/keyboards/planck/keymaps/impossible/rules.mk index 247a1fd2ae01..1e877943d9b8 100644 --- a/keyboards/planck/keymaps/impossible/rules.mk +++ b/keyboards/planck/keymaps/impossible/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/keyboards/planck/keymaps/jacob/rules.mk b/keyboards/planck/keymaps/jacob/rules.mk index 581e08cd02aa..caff043c582e 100644 --- a/keyboards/planck/keymaps/jacob/rules.mk +++ b/keyboards/planck/keymaps/jacob/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/jeebak/rules.mk b/keyboards/planck/keymaps/jeebak/rules.mk index 247a1fd2ae01..1e877943d9b8 100644 --- a/keyboards/planck/keymaps/jeebak/rules.mk +++ b/keyboards/planck/keymaps/jeebak/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/keyboards/planck/keymaps/jhenahan/rules.mk b/keyboards/planck/keymaps/jhenahan/rules.mk index bb12dd865c0c..f8d1f0d8f302 100644 --- a/keyboards/planck/keymaps/jhenahan/rules.mk +++ b/keyboards/planck/keymaps/jhenahan/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/keyboards/planck/keymaps/joe/rules.mk b/keyboards/planck/keymaps/joe/rules.mk index 247a1fd2ae01..1e877943d9b8 100644 --- a/keyboards/planck/keymaps/joe/rules.mk +++ b/keyboards/planck/keymaps/joe/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/keyboards/planck/keymaps/johannes/rules.mk b/keyboards/planck/keymaps/johannes/rules.mk index 0c0632da09bd..6f88a28d5089 100644 --- a/keyboards/planck/keymaps/johannes/rules.mk +++ b/keyboards/planck/keymaps/johannes/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/kyle/rules.mk b/keyboards/planck/keymaps/kyle/rules.mk index 581e08cd02aa..caff043c582e 100644 --- a/keyboards/planck/keymaps/kyle/rules.mk +++ b/keyboards/planck/keymaps/kyle/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/lae3/rules.mk b/keyboards/planck/keymaps/lae3/rules.mk index 595803e322fe..89b147f81915 100644 --- a/keyboards/planck/keymaps/lae3/rules.mk +++ b/keyboards/planck/keymaps/lae3/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/leo/rules.mk b/keyboards/planck/keymaps/leo/rules.mk index 247a1fd2ae01..1e877943d9b8 100644 --- a/keyboards/planck/keymaps/leo/rules.mk +++ b/keyboards/planck/keymaps/leo/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/keyboards/planck/keymaps/lucas/rules.mk b/keyboards/planck/keymaps/lucas/rules.mk index 247a1fd2ae01..1e877943d9b8 100644 --- a/keyboards/planck/keymaps/lucas/rules.mk +++ b/keyboards/planck/keymaps/lucas/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/keyboards/planck/keymaps/lukas/rules.mk b/keyboards/planck/keymaps/lukas/rules.mk index 581e08cd02aa..caff043c582e 100644 --- a/keyboards/planck/keymaps/lukas/rules.mk +++ b/keyboards/planck/keymaps/lukas/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/luke/rules.mk b/keyboards/planck/keymaps/luke/rules.mk index 847686873de9..76ed281c11e8 100644 --- a/keyboards/planck/keymaps/luke/rules.mk +++ b/keyboards/planck/keymaps/luke/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = yes # 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/max/rules.mk b/keyboards/planck/keymaps/max/rules.mk index 581e08cd02aa..caff043c582e 100644 --- a/keyboards/planck/keymaps/max/rules.mk +++ b/keyboards/planck/keymaps/max/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/mollat/rules.mk b/keyboards/planck/keymaps/mollat/rules.mk index be3f692802a4..249f422a558b 100644 --- a/keyboards/planck/keymaps/mollat/rules.mk +++ b/keyboards/planck/keymaps/mollat/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/myoung34/rules.mk b/keyboards/planck/keymaps/myoung34/rules.mk index c47418104a56..b1aaafd3a4d2 100644 --- a/keyboards/planck/keymaps/myoung34/rules.mk +++ b/keyboards/planck/keymaps/myoung34/rules.mk @@ -7,5 +7,5 @@ CONSOLE_ENABLE = no # Console for debug(+400) MIDI_ENABLE = no # MIDI controls MOUSEKEY_ENABLE = no # Mouse keys(+4700) NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. BACKLIGHT_ENABLE = yes diff --git a/keyboards/planck/keymaps/narze/rules.mk b/keyboards/planck/keymaps/narze/rules.mk index 05c2ce455f89..286a2ffdc10d 100644 --- a/keyboards/planck/keymaps/narze/rules.mk +++ b/keyboards/planck/keymaps/narze/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/neo2planck/rules.mk b/keyboards/planck/keymaps/neo2planck/rules.mk index 2122dd349b19..cedf3095e61b 100644 --- a/keyboards/planck/keymaps/neo2planck/rules.mk +++ b/keyboards/planck/keymaps/neo2planck/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/nico/rules.mk b/keyboards/planck/keymaps/nico/rules.mk index 247a1fd2ae01..1e877943d9b8 100644 --- a/keyboards/planck/keymaps/nico/rules.mk +++ b/keyboards/planck/keymaps/nico/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/keyboards/planck/keymaps/not-quite-neo/rules.mk b/keyboards/planck/keymaps/not-quite-neo/rules.mk index 316a3ea7bb43..90e6353f65b0 100644 --- a/keyboards/planck/keymaps/not-quite-neo/rules.mk +++ b/keyboards/planck/keymaps/not-quite-neo/rules.mk @@ -20,7 +20,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode (can't be used with unicodemap) 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/pickle_jr/rules.mk b/keyboards/planck/keymaps/pickle_jr/rules.mk index d452c706d043..43e0b843f047 100644 --- a/keyboards/planck/keymaps/pickle_jr/rules.mk +++ b/keyboards/planck/keymaps/pickle_jr/rules.mk @@ -12,7 +12,7 @@ BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/keyboards/planck/keymaps/premek/rules.mk b/keyboards/planck/keymaps/premek/rules.mk index 247a1fd2ae01..1e877943d9b8 100644 --- a/keyboards/planck/keymaps/premek/rules.mk +++ b/keyboards/planck/keymaps/premek/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/keyboards/planck/keymaps/priyadi/rules.mk b/keyboards/planck/keymaps/priyadi/rules.mk index 27c2638e2f61..282c047eec42 100644 --- a/keyboards/planck/keymaps/priyadi/rules.mk +++ b/keyboards/planck/keymaps/priyadi/rules.mk @@ -14,7 +14,7 @@ AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = no # Unicode UNICODEMAP_ENABLE = yes # Unicode map 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. API_SYSEX_ENABLE = no FAUXCLICKY_ENABLE = yes diff --git a/keyboards/planck/keymaps/pvc/rules.mk b/keyboards/planck/keymaps/pvc/rules.mk index 8a73eab584e7..3fb98eca86aa 100644 --- a/keyboards/planck/keymaps/pvc/rules.mk +++ b/keyboards/planck/keymaps/pvc/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/keyboards/planck/keymaps/rai-suta/rules.mk b/keyboards/planck/keymaps/rai-suta/rules.mk index 38efe374cfb2..ce13befd9061 100644 --- a/keyboards/planck/keymaps/rai-suta/rules.mk +++ b/keyboards/planck/keymaps/rai-suta/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/sgoodwin/rules.mk b/keyboards/planck/keymaps/sgoodwin/rules.mk index 279e16eb724d..cdcb4a887d2e 100644 --- a/keyboards/planck/keymaps/sgoodwin/rules.mk +++ b/keyboards/planck/keymaps/sgoodwin/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. API_SYSEX_ENABLE = no # Disable extra stuff for ergodoxen # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/planck/keymaps/spacebarracecar/rules.mk b/keyboards/planck/keymaps/spacebarracecar/rules.mk index fbdd1217c058..bc817a140317 100644 --- a/keyboards/planck/keymaps/spacebarracecar/rules.mk +++ b/keyboards/planck/keymaps/spacebarracecar/rules.mk @@ -13,11 +13,10 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # Userspace defines GERMAN_ENABLE = yes # Enable Custom US Ansi Keycodes for PC with German set as input language - diff --git a/keyboards/planck/keymaps/tak3over/rules.mk b/keyboards/planck/keymaps/tak3over/rules.mk index 247a1fd2ae01..1e877943d9b8 100644 --- a/keyboards/planck/keymaps/tak3over/rules.mk +++ b/keyboards/planck/keymaps/tak3over/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/keyboards/planck/keymaps/thermal_printer/rules.mk b/keyboards/planck/keymaps/thermal_printer/rules.mk index 7c50d87a0f9c..3c0e340d1fb5 100644 --- a/keyboards/planck/keymaps/thermal_printer/rules.mk +++ b/keyboards/planck/keymaps/thermal_printer/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. PRINTING_ENABLE = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/planck/keymaps/tong92/rules.mk b/keyboards/planck/keymaps/tong92/rules.mk index e6608e74c514..df9e7918ca30 100644 --- a/keyboards/planck/keymaps/tong92/rules.mk +++ b/keyboards/planck/keymaps/tong92/rules.mk @@ -52,7 +52,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/vifon/rules.mk b/keyboards/planck/keymaps/vifon/rules.mk index da83096d6b41..5caec1afa8f1 100644 --- a/keyboards/planck/keymaps/vifon/rules.mk +++ b/keyboards/planck/keymaps/vifon/rules.mk @@ -15,7 +15,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. API_SYSEX_ENABLE = no # https://www.reddit.com/r/olkb/comments/5swhij/_/ddie6zq/ KEY_LOCK_ENABLE = yes diff --git a/keyboards/planck/keymaps/yale/rules.mk b/keyboards/planck/keymaps/yale/rules.mk index 581e08cd02aa..caff043c582e 100644 --- a/keyboards/planck/keymaps/yale/rules.mk +++ b/keyboards/planck/keymaps/yale/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/yang/rules.mk b/keyboards/planck/keymaps/yang/rules.mk index 6b18762fa7ab..173fe29893b6 100644 --- a/keyboards/planck/keymaps/yang/rules.mk +++ b/keyboards/planck/keymaps/yang/rules.mk @@ -2,7 +2,7 @@ # change to "no" to disable the options, or define them in the Makefile in # the appropriate keymap folder that will get included automatically # -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. AUDIO_ENABLE = no ifndef QUANTUM_DIR diff --git a/keyboards/planck/keymaps/zach/rules.mk b/keyboards/planck/keymaps/zach/rules.mk index 9d86fc81fc7d..ca24b47929a6 100644 --- a/keyboards/planck/keymaps/zach/rules.mk +++ b/keyboards/planck/keymaps/zach/rules.mk @@ -20,7 +20,7 @@ AUDIO_ENABLE = no # Audio output on port C6 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/planck/keymaps/zrichard/rules.mk b/keyboards/planck/keymaps/zrichard/rules.mk index 0b87bc98828c..7b17f58ce13a 100755 --- a/keyboards/planck/keymaps/zrichard/rules.mk +++ b/keyboards/planck/keymaps/zrichard/rules.mk @@ -20,7 +20,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. TAP_DANCE_ENABLE = no # Enable double or n tap macros # 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/keymaps/bucktooth/rules.mk b/keyboards/preonic/keymaps/bucktooth/rules.mk index 3e87d41d36a9..9dbdfcbd3baa 100644 --- a/keyboards/preonic/keymaps/bucktooth/rules.mk +++ b/keyboards/preonic/keymaps/bucktooth/rules.mk @@ -11,7 +11,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/preonic/keymaps/dlaroe/rules.mk b/keyboards/preonic/keymaps/dlaroe/rules.mk index b356244713a1..eea316849727 100644 --- a/keyboards/preonic/keymaps/dlaroe/rules.mk +++ b/keyboards/preonic/keymaps/dlaroe/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/keymaps/jacwib/rules.mk b/keyboards/preonic/keymaps/jacwib/rules.mk index 3e87d41d36a9..9dbdfcbd3baa 100644 --- a/keyboards/preonic/keymaps/jacwib/rules.mk +++ b/keyboards/preonic/keymaps/jacwib/rules.mk @@ -11,7 +11,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/preonic/keymaps/kinesis/rules.mk b/keyboards/preonic/keymaps/kinesis/rules.mk index 6c8d2897cde9..f37fe433891f 100644 --- a/keyboards/preonic/keymaps/kinesis/rules.mk +++ b/keyboards/preonic/keymaps/kinesis/rules.mk @@ -15,7 +15,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/keymaps/seph/rules.mk b/keyboards/preonic/keymaps/seph/rules.mk index 4333bf45532d..dd26cd906d3b 100644 --- a/keyboards/preonic/keymaps/seph/rules.mk +++ b/keyboards/preonic/keymaps/seph/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/keymaps/zach/rules.mk b/keyboards/preonic/keymaps/zach/rules.mk index eebf4134958c..f00af43961ee 100644 --- a/keyboards/preonic/keymaps/zach/rules.mk +++ b/keyboards/preonic/keymaps/zach/rules.mk @@ -20,7 +20,7 @@ AUDIO_ENABLE = yes # Audio output on port C6 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/quefrency/rules.mk b/keyboards/quefrency/rules.mk index b78dc5df7b64..3ec04fbf1f3d 100644 --- a/keyboards/quefrency/rules.mk +++ b/keyboards/quefrency/rules.mk @@ -22,7 +22,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/qwertyydox/rules.mk b/keyboards/qwertyydox/rules.mk index d8a287bbc825..d04a4b9f3003 100644 --- a/keyboards/qwertyydox/rules.mk +++ b/keyboards/qwertyydox/rules.mk @@ -58,7 +58,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # I2C is used between the sides # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/rama/m60_a/rules.mk b/keyboards/rama/m60_a/rules.mk index 02617cf1c76e..7ab1b7d3ba97 100644 --- a/keyboards/rama/m60_a/rules.mk +++ b/keyboards/rama/m60_a/rules.mk @@ -68,7 +68,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend @@ -76,4 +76,3 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend RAW_ENABLE = yes DYNAMIC_KEYMAP_ENABLE = yes CIE1931_CURVE = yes - diff --git a/keyboards/redox/rules.mk b/keyboards/redox/rules.mk index c74a3bda2cf1..748d89dcfbd0 100644 --- a/keyboards/redox/rules.mk +++ b/keyboards/redox/rules.mk @@ -66,7 +66,7 @@ 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 -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes diff --git a/keyboards/rorschach/keymaps/insertsnideremarks/rules.mk b/keyboards/rorschach/keymaps/insertsnideremarks/rules.mk index 6beaae7aee57..b9e39c05393e 100644 --- a/keyboards/rorschach/keymaps/insertsnideremarks/rules.mk +++ b/keyboards/rorschach/keymaps/insertsnideremarks/rules.mk @@ -14,8 +14,6 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = yes # 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes # Enable Tap Dancing function - - diff --git a/keyboards/rorschach/rules.mk b/keyboards/rorschach/rules.mk index 9de068d2f22a..32012534871e 100644 --- a/keyboards/rorschach/rules.mk +++ b/keyboards/rorschach/rules.mk @@ -17,7 +17,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # 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/s60_x/keymaps/ansi_qwertz/rules.mk b/keyboards/s60_x/keymaps/ansi_qwertz/rules.mk index 6a078bcc3f47..cf5012252685 100644 --- a/keyboards/s60_x/keymaps/ansi_qwertz/rules.mk +++ b/keyboards/s60_x/keymaps/ansi_qwertz/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/s60_x/keymaps/bluebear/rules.mk b/keyboards/s60_x/keymaps/bluebear/rules.mk index 78d770d262c3..b7c9a0479055 100644 --- a/keyboards/s60_x/keymaps/bluebear/rules.mk +++ b/keyboards/s60_x/keymaps/bluebear/rules.mk @@ -9,6 +9,6 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no # Enable tap dancing keys \ No newline at end of file diff --git a/keyboards/satan/keymaps/addcninblue/rules.mk b/keyboards/satan/keymaps/addcninblue/rules.mk index c2937fd57f34..fd7f34300bf8 100644 --- a/keyboards/satan/keymaps/addcninblue/rules.mk +++ b/keyboards/satan/keymaps/addcninblue/rules.mk @@ -16,6 +16,6 @@ UNICODEMAP_ENABLE = no # This allows sending unicode symbols using X() 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no# Breathing sleep LED during USB suspend API_SYSEX_ENABLE = no # This enables using the Quantum SYSEX API to send strings ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/ben_iso/rules.mk b/keyboards/satan/keymaps/ben_iso/rules.mk index 2a7ff27793f9..bb535beb34c5 100644 --- a/keyboards/satan/keymaps/ben_iso/rules.mk +++ b/keyboards/satan/keymaps/ben_iso/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/chaser/rules.mk b/keyboards/satan/keymaps/chaser/rules.mk index 2a7ff27793f9..bb535beb34c5 100644 --- a/keyboards/satan/keymaps/chaser/rules.mk +++ b/keyboards/satan/keymaps/chaser/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/colemak/rules.mk b/keyboards/satan/keymaps/colemak/rules.mk index 2a7ff27793f9..bb535beb34c5 100644 --- a/keyboards/satan/keymaps/colemak/rules.mk +++ b/keyboards/satan/keymaps/colemak/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/default/rules.mk b/keyboards/satan/keymaps/default/rules.mk index 2a7ff27793f9..bb535beb34c5 100644 --- a/keyboards/satan/keymaps/default/rules.mk +++ b/keyboards/satan/keymaps/default/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/dende_iso/rules.mk b/keyboards/satan/keymaps/dende_iso/rules.mk index 2a7ff27793f9..bb535beb34c5 100644 --- a/keyboards/satan/keymaps/dende_iso/rules.mk +++ b/keyboards/satan/keymaps/dende_iso/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/dkrieger/rules.mk b/keyboards/satan/keymaps/dkrieger/rules.mk index 4c280ceb04ec..f2434d30e555 100644 --- a/keyboards/satan/keymaps/dkrieger/rules.mk +++ b/keyboards/satan/keymaps/dkrieger/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes diff --git a/keyboards/satan/keymaps/isoHHKB/rules.mk b/keyboards/satan/keymaps/isoHHKB/rules.mk index 026b33c7d88e..80ce56058834 100644 --- a/keyboards/satan/keymaps/isoHHKB/rules.mk +++ b/keyboards/satan/keymaps/isoHHKB/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/lepa/rules.mk b/keyboards/satan/keymaps/lepa/rules.mk index 636dd1b1d360..72ca006465cb 100644 --- a/keyboards/satan/keymaps/lepa/rules.mk +++ b/keyboards/satan/keymaps/lepa/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes diff --git a/keyboards/satan/keymaps/midi/rules.mk b/keyboards/satan/keymaps/midi/rules.mk index 89c34b3946ea..d144314de74a 100644 --- a/keyboards/satan/keymaps/midi/rules.mk +++ b/keyboards/satan/keymaps/midi/rules.mk @@ -13,7 +13,7 @@ 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 -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/olligranlund_iso/rules.mk b/keyboards/satan/keymaps/olligranlund_iso/rules.mk index c96deccaa998..73106b6749d6 100644 --- a/keyboards/satan/keymaps/olligranlund_iso/rules.mk +++ b/keyboards/satan/keymaps/olligranlund_iso/rules.mk @@ -13,5 +13,5 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/satan/keymaps/sethbc/rules.mk b/keyboards/satan/keymaps/sethbc/rules.mk index 2a7ff27793f9..bb535beb34c5 100644 --- a/keyboards/satan/keymaps/sethbc/rules.mk +++ b/keyboards/satan/keymaps/sethbc/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/smt/rules.mk b/keyboards/satan/keymaps/smt/rules.mk index 0c9ae824f6d5..806c2cb84b08 100644 --- a/keyboards/satan/keymaps/smt/rules.mk +++ b/keyboards/satan/keymaps/smt/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/satan/keymaps/unxmaal/rules.mk b/keyboards/satan/keymaps/unxmaal/rules.mk index ee94a67b4ee3..470d621b105f 100644 --- a/keyboards/satan/keymaps/unxmaal/rules.mk +++ b/keyboards/satan/keymaps/unxmaal/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/ardakilic/rules.mk b/keyboards/tada68/keymaps/ardakilic/rules.mk index 2a7ff27793f9..bb535beb34c5 100644 --- a/keyboards/tada68/keymaps/ardakilic/rules.mk +++ b/keyboards/tada68/keymaps/ardakilic/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/bazooka/rules.mk b/keyboards/tada68/keymaps/bazooka/rules.mk index 1915481bf9d3..b2789a78a7da 100644 --- a/keyboards/tada68/keymaps/bazooka/rules.mk +++ b/keyboards/tada68/keymaps/bazooka/rules.mk @@ -13,5 +13,5 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/tada68/keymaps/cheese/rules.mk b/keyboards/tada68/keymaps/cheese/rules.mk index fdbd25ea80fe..b2789a78a7da 100644 --- a/keyboards/tada68/keymaps/cheese/rules.mk +++ b/keyboards/tada68/keymaps/cheese/rules.mk @@ -13,6 +13,5 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - diff --git a/keyboards/tada68/keymaps/default/rules.mk b/keyboards/tada68/keymaps/default/rules.mk index 2a7ff27793f9..bb535beb34c5 100644 --- a/keyboards/tada68/keymaps/default/rules.mk +++ b/keyboards/tada68/keymaps/default/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/fakb/rules.mk b/keyboards/tada68/keymaps/fakb/rules.mk index 54b79fc9d4fb..642e16de5978 100644 --- a/keyboards/tada68/keymaps/fakb/rules.mk +++ b/keyboards/tada68/keymaps/fakb/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/fezzant/rules.mk b/keyboards/tada68/keymaps/fezzant/rules.mk index f2439cc7d14f..8df84ae954f3 100644 --- a/keyboards/tada68/keymaps/fezzant/rules.mk +++ b/keyboards/tada68/keymaps/fezzant/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = no # Audio output on port C6 UNICODE_ENABLE = yes # 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/iso-nor/rules.mk b/keyboards/tada68/keymaps/iso-nor/rules.mk index 4deca710b8a9..baaca071cf7e 100644 --- a/keyboards/tada68/keymaps/iso-nor/rules.mk +++ b/keyboards/tada68/keymaps/iso-nor/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/iso-uk/rules.mk b/keyboards/tada68/keymaps/iso-uk/rules.mk index 4deca710b8a9..baaca071cf7e 100644 --- a/keyboards/tada68/keymaps/iso-uk/rules.mk +++ b/keyboards/tada68/keymaps/iso-uk/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/isoish/rules.mk b/keyboards/tada68/keymaps/isoish/rules.mk index 4deca710b8a9..baaca071cf7e 100644 --- a/keyboards/tada68/keymaps/isoish/rules.mk +++ b/keyboards/tada68/keymaps/isoish/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/mattdicarlo/rules.mk b/keyboards/tada68/keymaps/mattdicarlo/rules.mk index c92000665084..ac92f99f4855 100644 --- a/keyboards/tada68/keymaps/mattdicarlo/rules.mk +++ b/keyboards/tada68/keymaps/mattdicarlo/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/mlechner/rules.mk b/keyboards/tada68/keymaps/mlechner/rules.mk index 2a7ff27793f9..bb535beb34c5 100644 --- a/keyboards/tada68/keymaps/mlechner/rules.mk +++ b/keyboards/tada68/keymaps/mlechner/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/mtdjr/rules.mk b/keyboards/tada68/keymaps/mtdjr/rules.mk index 2a7ff27793f9..bb535beb34c5 100644 --- a/keyboards/tada68/keymaps/mtdjr/rules.mk +++ b/keyboards/tada68/keymaps/mtdjr/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/pascamel/rules.mk b/keyboards/tada68/keymaps/pascamel/rules.mk index 2a7ff27793f9..bb535beb34c5 100644 --- a/keyboards/tada68/keymaps/pascamel/rules.mk +++ b/keyboards/tada68/keymaps/pascamel/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/raylas/rules.mk b/keyboards/tada68/keymaps/raylas/rules.mk index 2a7ff27793f9..bb535beb34c5 100644 --- a/keyboards/tada68/keymaps/raylas/rules.mk +++ b/keyboards/tada68/keymaps/raylas/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/rbong/rules.mk b/keyboards/tada68/keymaps/rbong/rules.mk index 1915481bf9d3..b2789a78a7da 100644 --- a/keyboards/tada68/keymaps/rbong/rules.mk +++ b/keyboards/tada68/keymaps/rbong/rules.mk @@ -13,5 +13,5 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/tada68/keymaps/rgb/rules.mk b/keyboards/tada68/keymaps/rgb/rules.mk index ee94a67b4ee3..470d621b105f 100644 --- a/keyboards/tada68/keymaps/rgb/rules.mk +++ b/keyboards/tada68/keymaps/rgb/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/rys/rules.mk b/keyboards/tada68/keymaps/rys/rules.mk index 1915481bf9d3..b2789a78a7da 100644 --- a/keyboards/tada68/keymaps/rys/rules.mk +++ b/keyboards/tada68/keymaps/rys/rules.mk @@ -13,5 +13,5 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/tada68/keymaps/shalzz/rules.mk b/keyboards/tada68/keymaps/shalzz/rules.mk index 1df3af955d4e..4595aa8c24f4 100644 --- a/keyboards/tada68/keymaps/shalzz/rules.mk +++ b/keyboards/tada68/keymaps/shalzz/rules.mk @@ -8,5 +8,5 @@ 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 = yes # Enable keyboard backlight functionality AUDIO_ENABLE = no # Audio output on port C6 -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend diff --git a/keyboards/tada68/keymaps/sm0g/rules.mk b/keyboards/tada68/keymaps/sm0g/rules.mk index bd4bb32491d3..0826db755461 100644 --- a/keyboards/tada68/keymaps/sm0g/rules.mk +++ b/keyboards/tada68/keymaps/sm0g/rules.mk @@ -13,6 +13,6 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes # Tappa Dance \ No newline at end of file diff --git a/keyboards/tada68/keymaps/stephengrier/rules.mk b/keyboards/tada68/keymaps/stephengrier/rules.mk index 2a7ff27793f9..bb535beb34c5 100644 --- a/keyboards/tada68/keymaps/stephengrier/rules.mk +++ b/keyboards/tada68/keymaps/stephengrier/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/trashcat/rules.mk b/keyboards/tada68/keymaps/trashcat/rules.mk index 644b6a814b67..6fb496919379 100644 --- a/keyboards/tada68/keymaps/trashcat/rules.mk +++ b/keyboards/tada68/keymaps/trashcat/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes # Tappa Dance Bitch ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/tshack/rules.mk b/keyboards/tada68/keymaps/tshack/rules.mk index 061907d3a20f..86d22dd3fd06 100644 --- a/keyboards/tada68/keymaps/tshack/rules.mk +++ b/keyboards/tada68/keymaps/tshack/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/unix/rules.mk b/keyboards/tada68/keymaps/unix/rules.mk index 46f0b65a9cbf..aade51459b4c 100644 --- a/keyboards/tada68/keymaps/unix/rules.mk +++ b/keyboards/tada68/keymaps/unix/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/tada68/keymaps/wamsm_tada/rules.mk b/keyboards/tada68/keymaps/wamsm_tada/rules.mk index 2a7ff27793f9..bb535beb34c5 100644 --- a/keyboards/tada68/keymaps/wamsm_tada/rules.mk +++ b/keyboards/tada68/keymaps/wamsm_tada/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/the_ruler/keymaps/default/rules.mk b/keyboards/the_ruler/keymaps/default/rules.mk index fac9327db3e0..b491f5b3f3fe 100644 --- a/keyboards/the_ruler/keymaps/default/rules.mk +++ b/keyboards/the_ruler/keymaps/default/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/the_ruler/rules.mk b/keyboards/the_ruler/rules.mk index 30d76a3c92c7..6362176fea74 100644 --- a/keyboards/the_ruler/rules.mk +++ b/keyboards/the_ruler/rules.mk @@ -65,4 +65,4 @@ MIDI_ENABLE = no # MIDI controls UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID AUDIO_ENABLE = no # Audio output on port C6 -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. diff --git a/keyboards/thevankeyboards/bananasplit/keymaps/0010/rules.mk b/keyboards/thevankeyboards/bananasplit/keymaps/0010/rules.mk index 7d09c322e5e3..159fd7dc6c34 100644 --- a/keyboards/thevankeyboards/bananasplit/keymaps/0010/rules.mk +++ b/keyboards/thevankeyboards/bananasplit/keymaps/0010/rules.mk @@ -29,7 +29,7 @@ # 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. +# RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/bananasplit/keymaps/coloneljesus/rules.mk b/keyboards/thevankeyboards/bananasplit/keymaps/coloneljesus/rules.mk index 7d09c322e5e3..159fd7dc6c34 100644 --- a/keyboards/thevankeyboards/bananasplit/keymaps/coloneljesus/rules.mk +++ b/keyboards/thevankeyboards/bananasplit/keymaps/coloneljesus/rules.mk @@ -29,7 +29,7 @@ # 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. +# RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/bananasplit/keymaps/default/rules.mk b/keyboards/thevankeyboards/bananasplit/keymaps/default/rules.mk index 7d09c322e5e3..159fd7dc6c34 100644 --- a/keyboards/thevankeyboards/bananasplit/keymaps/default/rules.mk +++ b/keyboards/thevankeyboards/bananasplit/keymaps/default/rules.mk @@ -29,7 +29,7 @@ # 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. +# RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/bananasplit/keymaps/kamon/rules.mk b/keyboards/thevankeyboards/bananasplit/keymaps/kamon/rules.mk index 7d09c322e5e3..159fd7dc6c34 100644 --- a/keyboards/thevankeyboards/bananasplit/keymaps/kamon/rules.mk +++ b/keyboards/thevankeyboards/bananasplit/keymaps/kamon/rules.mk @@ -29,7 +29,7 @@ # 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. +# RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/minivan/keymaps/default/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/default/rules.mk index f4671a9d113c..3ff14772511e 100644 --- a/keyboards/thevankeyboards/minivan/keymaps/default/rules.mk +++ b/keyboards/thevankeyboards/minivan/keymaps/default/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/minivan/keymaps/jeebak/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/jeebak/rules.mk index f4671a9d113c..3ff14772511e 100644 --- a/keyboards/thevankeyboards/minivan/keymaps/jeebak/rules.mk +++ b/keyboards/thevankeyboards/minivan/keymaps/jeebak/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/rules.mk index ebc9f810f9cf..d7ca73ac58f2 100644 --- a/keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/rules.mk +++ b/keyboards/thevankeyboards/minivan/keymaps/jetpacktuxedo/rules.mk @@ -13,5 +13,5 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/thevankeyboards/minivan/keymaps/mjt/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/mjt/rules.mk index 41afd9a55137..b2c421c4dc2b 100644 --- a/keyboards/thevankeyboards/minivan/keymaps/mjt/rules.mk +++ b/keyboards/thevankeyboards/minivan/keymaps/mjt/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/minivan/keymaps/smt/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/smt/rules.mk index f4671a9d113c..3ff14772511e 100644 --- a/keyboards/thevankeyboards/minivan/keymaps/smt/rules.mk +++ b/keyboards/thevankeyboards/minivan/keymaps/smt/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/minivan/keymaps/tong92/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/tong92/rules.mk index e60e3c5c5a38..1e006e94724b 100644 --- a/keyboards/thevankeyboards/minivan/keymaps/tong92/rules.mk +++ b/keyboards/thevankeyboards/minivan/keymaps/tong92/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/minivan/keymaps/xyverz/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/xyverz/rules.mk index f4671a9d113c..3ff14772511e 100644 --- a/keyboards/thevankeyboards/minivan/keymaps/xyverz/rules.mk +++ b/keyboards/thevankeyboards/minivan/keymaps/xyverz/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/roadkit/keymaps/default/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/default/rules.mk index f4671a9d113c..3ff14772511e 100644 --- a/keyboards/thevankeyboards/roadkit/keymaps/default/rules.mk +++ b/keyboards/thevankeyboards/roadkit/keymaps/default/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/roadkit/keymaps/flipphone/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/flipphone/rules.mk index f4671a9d113c..3ff14772511e 100644 --- a/keyboards/thevankeyboards/roadkit/keymaps/flipphone/rules.mk +++ b/keyboards/thevankeyboards/roadkit/keymaps/flipphone/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/roadkit/keymaps/khord/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/khord/rules.mk index 9f3c958bd89a..ba4b4fec0c6f 100644 --- a/keyboards/thevankeyboards/roadkit/keymaps/khord/rules.mk +++ b/keyboards/thevankeyboards/roadkit/keymaps/khord/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = no # Enable Tap Dance functionality diff --git a/keyboards/thevankeyboards/roadkit/keymaps/mjt/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/mjt/rules.mk index f4671a9d113c..3ff14772511e 100644 --- a/keyboards/thevankeyboards/roadkit/keymaps/mjt/rules.mk +++ b/keyboards/thevankeyboards/roadkit/keymaps/mjt/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/roadkit/keymaps/singles/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/singles/rules.mk index f4671a9d113c..3ff14772511e 100644 --- a/keyboards/thevankeyboards/roadkit/keymaps/singles/rules.mk +++ b/keyboards/thevankeyboards/roadkit/keymaps/singles/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/thevankeyboards/roadkit/keymaps/singlesBrent/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/singlesBrent/rules.mk index b61d6cca2c71..030d27f2a622 100644 --- a/keyboards/thevankeyboards/roadkit/keymaps/singlesBrent/rules.mk +++ b/keyboards/thevankeyboards/roadkit/keymaps/singlesBrent/rules.mk @@ -13,7 +13,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes # Enable Tap Dance functionality diff --git a/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/rules.mk b/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/rules.mk index 72fd3d30ba35..d8284e6bd591 100644 --- a/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/rules.mk +++ b/keyboards/thevankeyboards/roadkit/keymaps/wavebeem-gamepad/rules.mk @@ -13,5 +13,5 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend diff --git a/keyboards/vision_division/keymaps/default/rules.mk b/keyboards/vision_division/keymaps/default/rules.mk index 28060947aff5..342f37453c09 100644 --- a/keyboards/vision_division/keymaps/default/rules.mk +++ b/keyboards/vision_division/keymaps/default/rules.mk @@ -13,7 +13,7 @@ MIDI_ENABLE = no # MIDI controls AUDIO_ENABLE = yes # Audio output on port C6 UNICODE_ENABLE = no # Unicode BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/vitamins_included/rules.mk b/keyboards/vitamins_included/rules.mk index 4f6d497a6b11..34f423f59ddd 100644 --- a/keyboards/vitamins_included/rules.mk +++ b/keyboards/vitamins_included/rules.mk @@ -63,7 +63,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/viterbi/rules.mk b/keyboards/viterbi/rules.mk index af24c15f53a5..ee043cca3b45 100644 --- a/keyboards/viterbi/rules.mk +++ b/keyboards/viterbi/rules.mk @@ -63,7 +63,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/keyboards/wavelet/rules.mk b/keyboards/wavelet/rules.mk index 86149c5622bf..cfff50a41d25 100644 --- a/keyboards/wavelet/rules.mk +++ b/keyboards/wavelet/rules.mk @@ -22,7 +22,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # 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/xd60/rules.mk b/keyboards/xd60/rules.mk index 50fba97e5fc0..8a60252dcf9b 100644 --- a/keyboards/xd60/rules.mk +++ b/keyboards/xd60/rules.mk @@ -61,7 +61,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend LAYOUTS = 60_ansi \ No newline at end of file diff --git a/keyboards/xd75/keymaps/fabian/rules.mk b/keyboards/xd75/keymaps/fabian/rules.mk index 6e8941fdfd85..f1ae8d44a17e 100644 --- a/keyboards/xd75/keymaps/fabian/rules.mk +++ b/keyboards/xd75/keymaps/fabian/rules.mk @@ -29,7 +29,7 @@ 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 -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend ifndef QUANTUM_DIR diff --git a/keyboards/xd75/keymaps/germanized/rules.mk b/keyboards/xd75/keymaps/germanized/rules.mk index d72bcf575d5f..f57fb8c54e68 100644 --- a/keyboards/xd75/keymaps/germanized/rules.mk +++ b/keyboards/xd75/keymaps/germanized/rules.mk @@ -29,7 +29,7 @@ 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 -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend TAP_DANCE_ENABLE = yes # Enable Tap Dancing diff --git a/keyboards/xd75/rules.mk b/keyboards/xd75/rules.mk index 5f6e85648642..e99272943289 100644 --- a/keyboards/xd75/rules.mk +++ b/keyboards/xd75/rules.mk @@ -62,7 +62,7 @@ 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 -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend LAYOUTS = ortho_5x15 \ No newline at end of file diff --git a/keyboards/zeal60/rules.mk b/keyboards/zeal60/rules.mk index f099ea9fdd5e..1327d88210ae 100644 --- a/keyboards/zeal60/rules.mk +++ b/keyboards/zeal60/rules.mk @@ -67,7 +67,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # 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/zeal65/rules.mk b/keyboards/zeal65/rules.mk index 02617cf1c76e..7ab1b7d3ba97 100644 --- a/keyboards/zeal65/rules.mk +++ b/keyboards/zeal65/rules.mk @@ -68,7 +68,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend @@ -76,4 +76,3 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend RAW_ENABLE = yes DYNAMIC_KEYMAP_ENABLE = yes CIE1931_CURVE = yes - diff --git a/keyboards/zen/rules.mk b/keyboards/zen/rules.mk index 32d3dc51c8f9..4e82689111d3 100644 --- a/keyboards/zen/rules.mk +++ b/keyboards/zen/rules.mk @@ -62,7 +62,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SUBPROJECT_rev1 = yes USE_I2C = no # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE diff --git a/layouts/community/ergodox/alphadox/rules.mk b/layouts/community/ergodox/alphadox/rules.mk index f93ff3bb68e7..57c62a5e63b3 100644 --- a/layouts/community/ergodox/alphadox/rules.mk +++ b/layouts/community/ergodox/alphadox/rules.mk @@ -9,7 +9,5 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - - From 7e99d869deb57251dc15620beff34d5fd53066e4 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 22 Oct 2018 10:26:19 -0700 Subject: [PATCH 237/505] Remove all of the deprecated RGB defines Fixes #3641 --- drivers/avr/ws2812.h | 3 --- keyboards/6ball/config.h | 4 +--- keyboards/9key/config.h | 4 +--- keyboards/amj40/keymaps/default/rules.mk | 3 --- keyboards/amj40/keymaps/fabian/rules.mk | 10 +--------- keyboards/amj40/keymaps/jetpacktuxedo/rules.mk | 8 -------- keyboards/amj40/keymaps/myee/rules.mk | 10 +--------- keyboards/bfo9000/config.h | 2 +- keyboards/blockey/config.h | 5 +---- keyboards/chocopad/config.h | 4 +--- keyboards/crkbd/rev1/config.h | 4 +--- keyboards/deltasplit75/v2/config.h | 6 ++---- keyboards/dilly/config.h | 4 +--- keyboards/ergo42/rev1/config.h | 4 +--- keyboards/ergodash/mini/config.h | 4 +--- keyboards/ergodash/rev1/config.h | 4 +--- keyboards/ergodash/rev2/config.h | 4 +--- keyboards/ergotravel/rev1/config.h | 5 +---- keyboards/fortitude60/rev1/config.h | 2 +- keyboards/fourier/rev1/config.h | 4 +--- keyboards/gh60/keymaps/dbroqua/config.h | 13 +++---------- keyboards/gh60/keymaps/robotmaxtron/config.h | 13 +++---------- keyboards/handwired/dactyl_manuform/config.h | 4 +--- keyboards/handwired/qc60/proto/config.h | 2 -- keyboards/helix/pico/config.h | 4 +--- keyboards/helix/rev1/config.h | 5 +---- keyboards/helix/rev2/config.h | 4 +--- keyboards/iris/rev1/config.h | 2 +- keyboards/iris/rev1_led/config.h | 2 +- keyboards/iris/rev2/config.h | 2 +- keyboards/iris/rev3/config.h | 2 +- keyboards/lets_split/keymaps/zer09/config.h | 4 +--- keyboards/lets_split/rev1/config.h | 4 +--- keyboards/lets_split/rev2/config.h | 4 +--- keyboards/lets_split/sockets/config.h | 4 +--- keyboards/levinson/rev1/config.h | 2 +- keyboards/levinson/rev2/config.h | 2 +- keyboards/lily58/rev1/config.h | 8 +++----- keyboards/meira/config.h | 2 +- keyboards/minidox/keymaps/alairock/config.h | 2 +- keyboards/minidox/keymaps/that_canadian/config.h | 2 +- keyboards/minidox/keymaps/xyverz/config.h | 2 +- keyboards/mint60/config.h | 4 +--- keyboards/miuni32/config.h | 7 +++---- keyboards/nyquist/rev1/config.h | 4 +--- keyboards/nyquist/rev2/config.h | 2 +- keyboards/orthodox/rev1/config.h | 3 --- keyboards/orthodox/rev3/config.h | 4 +--- keyboards/orthodox/rev3_teensy/config.h | 4 +--- keyboards/preonic/keymaps/zach/config.h | 2 +- keyboards/qwertyydox/config.h | 4 +--- keyboards/qwertyydox/rev1/config.h | 4 +--- keyboards/redox/rev1/config.h | 4 +--- keyboards/the_ruler/config.h | 3 +-- keyboards/vitamins_included/rev1/config.h | 4 +--- keyboards/viterbi/rev1/config.h | 4 +--- keyboards/wavelet/config.h | 2 +- keyboards/zen/rev1/config.h | 4 +--- 58 files changed, 62 insertions(+), 180 deletions(-) diff --git a/drivers/avr/ws2812.h b/drivers/avr/ws2812.h index f7e0c31440ca..1f9299ffb539 100644 --- a/drivers/avr/ws2812.h +++ b/drivers/avr/ws2812.h @@ -69,7 +69,4 @@ void ws2812_sendarray_mask(uint8_t *array,uint16_t length, uint8_t pinmask); #define CONCAT_EXP(a, b) CONCAT(a, b) #endif -// #define ws2812_PORTREG CONCAT_EXP(PORT,ws2812_port) -// #define ws2812_DDRREG CONCAT_EXP(DDR,ws2812_port) - #endif /* LIGHT_WS2812_H_ */ diff --git a/keyboards/6ball/config.h b/keyboards/6ball/config.h index 19d24486cc68..b0e59f20c652 100644 --- a/keyboards/6ball/config.h +++ b/keyboards/6ball/config.h @@ -39,11 +39,9 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN F7 -#define RGBLIGHT_TIMER + #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 6 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* COL2ROW or ROW2COL */ #define DIODE_DIRECTION COL2ROW diff --git a/keyboards/9key/config.h b/keyboards/9key/config.h index eee8407cceb8..4e5a2fd45b27 100644 --- a/keyboards/9key/config.h +++ b/keyboards/9key/config.h @@ -39,10 +39,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN F7 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 1 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* COL2ROW or ROW2COL */ #define DIODE_DIRECTION COL2ROW diff --git a/keyboards/amj40/keymaps/default/rules.mk b/keyboards/amj40/keymaps/default/rules.mk index 41a1982248d8..fe986722010a 100644 --- a/keyboards/amj40/keymaps/default/rules.mk +++ b/keyboards/amj40/keymaps/default/rules.mk @@ -18,9 +18,6 @@ RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD - ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/keyboards/amj40/keymaps/fabian/rules.mk b/keyboards/amj40/keymaps/fabian/rules.mk index 7e0634e09e5e..90559e0dd226 100644 --- a/keyboards/amj40/keymaps/fabian/rules.mk +++ b/keyboards/amj40/keymaps/fabian/rules.mk @@ -1,5 +1,5 @@ # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# 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) @@ -17,11 +17,3 @@ RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD - - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/amj40/keymaps/jetpacktuxedo/rules.mk b/keyboards/amj40/keymaps/jetpacktuxedo/rules.mk index 6ad92366889a..2b613b28e4ba 100644 --- a/keyboards/amj40/keymaps/jetpacktuxedo/rules.mk +++ b/keyboards/amj40/keymaps/jetpacktuxedo/rules.mk @@ -17,11 +17,3 @@ RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. It uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD - - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/amj40/keymaps/myee/rules.mk b/keyboards/amj40/keymaps/myee/rules.mk index c35191cef270..fe07e43d8232 100644 --- a/keyboards/amj40/keymaps/myee/rules.mk +++ b/keyboards/amj40/keymaps/myee/rules.mk @@ -1,5 +1,5 @@ # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# 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) @@ -17,11 +17,3 @@ RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD - - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/bfo9000/config.h b/keyboards/bfo9000/config.h index 561d2d11468f..893fa5ab6a40 100644 --- a/keyboards/bfo9000/config.h +++ b/keyboards/bfo9000/config.h @@ -53,7 +53,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN B4 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 20 // Number of LEDs /* diff --git a/keyboards/blockey/config.h b/keyboards/blockey/config.h index b099a816bf54..53860bfbc986 100644 --- a/keyboards/blockey/config.h +++ b/keyboards/blockey/config.h @@ -51,11 +51,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN B1 -#define RGBLIGHT_TIMER -#define RGBLED_NUM 4 -#define ws2812_PORTREG PORTB -#define ws2812_DDRREG DDRB +#define RGBLED_NUM 4 #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/chocopad/config.h b/keyboards/chocopad/config.h index 2163ff8bc449..d2a1a7b48432 100644 --- a/keyboards/chocopad/config.h +++ b/keyboards/chocopad/config.h @@ -47,9 +47,7 @@ #define RGBLIGHT_VAL_STEP 8 #endif #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 4 -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD #endif diff --git a/keyboards/crkbd/rev1/config.h b/keyboards/crkbd/rev1/config.h index efce13a4902e..915779060b94 100644 --- a/keyboards/crkbd/rev1/config.h +++ b/keyboards/crkbd/rev1/config.h @@ -57,10 +57,8 @@ along with this program. If not, see . /* 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 diff --git a/keyboards/deltasplit75/v2/config.h b/keyboards/deltasplit75/v2/config.h index 319a149fbc8b..475a5c9dc54b 100644 --- a/keyboards/deltasplit75/v2/config.h +++ b/keyboards/deltasplit75/v2/config.h @@ -61,10 +61,8 @@ along with this program. If not, see . /* 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 @@ -85,4 +83,4 @@ along with this program. If not, see . //#define NO_ACTION_FUNCTION -#endif \ No newline at end of file +#endif diff --git a/keyboards/dilly/config.h b/keyboards/dilly/config.h index d9ca4597cf57..084186fc66df 100644 --- a/keyboards/dilly/config.h +++ b/keyboards/dilly/config.h @@ -50,9 +50,7 @@ #define RGBLIGHT_VAL_STEP 8 #endif #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 10 -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD #endif diff --git a/keyboards/ergo42/rev1/config.h b/keyboards/ergo42/rev1/config.h index 1a674a85862e..a7edb4097241 100644 --- a/keyboards/ergo42/rev1/config.h +++ b/keyboards/ergo42/rev1/config.h @@ -66,10 +66,8 @@ along with this program. If not, see . /* 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 diff --git a/keyboards/ergodash/mini/config.h b/keyboards/ergodash/mini/config.h index a7be1635c1b4..11cff145e181 100644 --- a/keyboards/ergodash/mini/config.h +++ b/keyboards/ergodash/mini/config.h @@ -73,10 +73,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 20 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/ergodash/rev1/config.h b/keyboards/ergodash/rev1/config.h index 09dd6604eb79..d3f3314ee61f 100644 --- a/keyboards/ergodash/rev1/config.h +++ b/keyboards/ergodash/rev1/config.h @@ -63,10 +63,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 24 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/ergodash/rev2/config.h b/keyboards/ergodash/rev2/config.h index 489afe017864..5f9c689916bd 100644 --- a/keyboards/ergodash/rev2/config.h +++ b/keyboards/ergodash/rev2/config.h @@ -70,10 +70,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 24 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/ergotravel/rev1/config.h b/keyboards/ergotravel/rev1/config.h index 5fa447da746f..3af1147a7ad6 100644 --- a/keyboards/ergotravel/rev1/config.h +++ b/keyboards/ergotravel/rev1/config.h @@ -61,10 +61,8 @@ along with this program. If not, see . /* 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 @@ -83,4 +81,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - diff --git a/keyboards/fortitude60/rev1/config.h b/keyboards/fortitude60/rev1/config.h index 8c6f21afe67b..b89f5c7df920 100644 --- a/keyboards/fortitude60/rev1/config.h +++ b/keyboards/fortitude60/rev1/config.h @@ -66,7 +66,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN B5 - #define RGBLIGHT_TIMER + #define RGBLED_NUM 18 // Number of LEDs */ #endif /* diff --git a/keyboards/fourier/rev1/config.h b/keyboards/fourier/rev1/config.h index c1375222617b..3bd67228c3dd 100644 --- a/keyboards/fourier/rev1/config.h +++ b/keyboards/fourier/rev1/config.h @@ -56,11 +56,9 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 14 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/gh60/keymaps/dbroqua/config.h b/keyboards/gh60/keymaps/dbroqua/config.h index 0b8218d28a6b..fd63c9a8f769 100644 --- a/keyboards/gh60/keymaps/dbroqua/config.h +++ b/keyboards/gh60/keymaps/dbroqua/config.h @@ -158,26 +158,19 @@ along with this program. If not, see . /* * RGB Underglow * These settings are for the F4 by default: - * * - * #define ws2812_PORTREG PORTF - * #define ws2812_DDRREG DDRF + * * #define ws2812_pin PF4 * #define RGBLED_NUM 14 // Number of LEDs * #define RGBLIGHT_HUE_STEP 10 * #define RGBLIGHT_SAT_STEP 17 * #define RGBLIGHT_VAL_STEP 17 * - * The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. - * To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. + * The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. + * To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. * For details, please check this keymap. keyboard/planck/keymaps/yang/keymap.c */ -/* Deprecated code below -#define ws2812_PORTREG PORTF -#define ws2812_DDRREG DDRF -#define ws2812_pin PF4 -*/ #define RGB_DI_PIN F4 #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 11 // Number of LEDs diff --git a/keyboards/gh60/keymaps/robotmaxtron/config.h b/keyboards/gh60/keymaps/robotmaxtron/config.h index abaddb71f1a3..925a69efe09e 100644 --- a/keyboards/gh60/keymaps/robotmaxtron/config.h +++ b/keyboards/gh60/keymaps/robotmaxtron/config.h @@ -161,26 +161,19 @@ along with this program. If not, see . /* * RGB Underglow * These settings are for the F4 by default: - * * - * #define ws2812_PORTREG PORTF - * #define ws2812_DDRREG DDRF + * * #define ws2812_pin PF4 * #define RGBLED_NUM 14 // Number of LEDs * #define RGBLIGHT_HUE_STEP 10 * #define RGBLIGHT_SAT_STEP 17 * #define RGBLIGHT_VAL_STEP 17 * - * The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. - * To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. + * The firmware supports 5 different light effects, and the color (hue, saturation, brightness) can be customized in most effects. + * To control the underglow, you need to modify your keymap file to assign those functions to some keys/key combinations. * For details, please check this keymap. keyboard/planck/keymaps/yang/keymap.c */ -/* Deprecated code below -#define ws2812_PORTREG PORTF -#define ws2812_DDRREG DDRF -#define ws2812_pin PF4 -*/ #define RGB_DI_PIN F4 #define RGBLIGHT_ANIMATIONS #define RGBLED_NUM 8 // Number of LEDs diff --git a/keyboards/handwired/dactyl_manuform/config.h b/keyboards/handwired/dactyl_manuform/config.h index 19cd356d89ac..320ce3c482dd 100644 --- a/keyboards/handwired/dactyl_manuform/config.h +++ b/keyboards/handwired/dactyl_manuform/config.h @@ -53,7 +53,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs @@ -74,5 +74,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - - diff --git a/keyboards/handwired/qc60/proto/config.h b/keyboards/handwired/qc60/proto/config.h index 81466b019687..8c21fa9265f3 100644 --- a/keyboards/handwired/qc60/proto/config.h +++ b/keyboards/handwired/qc60/proto/config.h @@ -10,5 +10,3 @@ /* ws2812 RGB LED */ #define RGB_DI_PIN D3 #define RGBLED_NUM 1 // Number of LEDs -// #define ws2812_PORTREG PORTD -// #define ws2812_DDRREG DDRD diff --git a/keyboards/helix/pico/config.h b/keyboards/helix/pico/config.h index 41edfcbc2044..b8822e2273a2 100644 --- a/keyboards/helix/pico/config.h +++ b/keyboards/helix/pico/config.h @@ -83,10 +83,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + //#define RGBLED_NUM 12 // Number of LEDs. see ./keymaps/default/config.h -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD // Helix keyboard RGB LED support //#define RGBLIGHT_ANIMATIONS : see ./rules.mk: LED_ANIMATIONS = yes or no diff --git a/keyboards/helix/rev1/config.h b/keyboards/helix/rev1/config.h index 7fec62fc83d7..07b5c4f6f8bc 100644 --- a/keyboards/helix/rev1/config.h +++ b/keyboards/helix/rev1/config.h @@ -74,11 +74,8 @@ along with this program. If not, see . /* 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 +#define RGBLED_NUM 12 // Number of LEDs /* * Feature disable options * These options are also useful to firmware size reduction. diff --git a/keyboards/helix/rev2/config.h b/keyboards/helix/rev2/config.h index b354d312d551..f7d35b371469 100644 --- a/keyboards/helix/rev2/config.h +++ b/keyboards/helix/rev2/config.h @@ -87,10 +87,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + //#define RGBLED_NUM 12 // Number of LEDs. see ./keymaps/default/config.h -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD // Helix keyboard RGB LED support //#define RGBLIGHT_ANIMATIONS : see ./rules.mk: LED_ANIMATIONS = yes or no diff --git a/keyboards/iris/rev1/config.h b/keyboards/iris/rev1/config.h index cc7f2d8d4455..3c088f671125 100644 --- a/keyboards/iris/rev1/config.h +++ b/keyboards/iris/rev1/config.h @@ -63,7 +63,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs /* diff --git a/keyboards/iris/rev1_led/config.h b/keyboards/iris/rev1_led/config.h index e9eac2455cf5..d8571f8daf01 100644 --- a/keyboards/iris/rev1_led/config.h +++ b/keyboards/iris/rev1_led/config.h @@ -63,7 +63,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs /* diff --git a/keyboards/iris/rev2/config.h b/keyboards/iris/rev2/config.h index 368d21c9893d..087e0f69e585 100644 --- a/keyboards/iris/rev2/config.h +++ b/keyboards/iris/rev2/config.h @@ -63,7 +63,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs /* diff --git a/keyboards/iris/rev3/config.h b/keyboards/iris/rev3/config.h index 7f68180c2968..3329a4edb2f2 100644 --- a/keyboards/iris/rev3/config.h +++ b/keyboards/iris/rev3/config.h @@ -63,7 +63,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN F7 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs /* diff --git a/keyboards/lets_split/keymaps/zer09/config.h b/keyboards/lets_split/keymaps/zer09/config.h index 73438d8a9391..14be4ccc59b1 100644 --- a/keyboards/lets_split/keymaps/zer09/config.h +++ b/keyboards/lets_split/keymaps/zer09/config.h @@ -52,8 +52,6 @@ along with this program. If not, see . /* ws2812 RGB LED */ #undef RGBLED_NUM #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 50 -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD #endif diff --git a/keyboards/lets_split/rev1/config.h b/keyboards/lets_split/rev1/config.h index 73f90e715dfe..c0e4d1fbce41 100644 --- a/keyboards/lets_split/rev1/config.h +++ b/keyboards/lets_split/rev1/config.h @@ -60,10 +60,8 @@ along with this program. If not, see . /* 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 diff --git a/keyboards/lets_split/rev2/config.h b/keyboards/lets_split/rev2/config.h index 1c48f38e05c1..1ff25cd480ab 100644 --- a/keyboards/lets_split/rev2/config.h +++ b/keyboards/lets_split/rev2/config.h @@ -60,10 +60,8 @@ along with this program. If not, see . /* 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 diff --git a/keyboards/lets_split/sockets/config.h b/keyboards/lets_split/sockets/config.h index d004b26bd787..a45cdd13bb3a 100644 --- a/keyboards/lets_split/sockets/config.h +++ b/keyboards/lets_split/sockets/config.h @@ -60,10 +60,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D4 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* Audio settings */ #ifdef AUDIO_ENABLE diff --git a/keyboards/levinson/rev1/config.h b/keyboards/levinson/rev1/config.h index 52a644e82f54..8161b4e32f9a 100644 --- a/keyboards/levinson/rev1/config.h +++ b/keyboards/levinson/rev1/config.h @@ -53,7 +53,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs /* Backlight LEDs */ diff --git a/keyboards/levinson/rev2/config.h b/keyboards/levinson/rev2/config.h index 4845c935e828..03b98b45c1e3 100644 --- a/keyboards/levinson/rev2/config.h +++ b/keyboards/levinson/rev2/config.h @@ -53,7 +53,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs /* Backlight LEDs */ diff --git a/keyboards/lily58/rev1/config.h b/keyboards/lily58/rev1/config.h index 9413e8d4a2c3..a991e88322c3 100644 --- a/keyboards/lily58/rev1/config.h +++ b/keyboards/lily58/rev1/config.h @@ -24,7 +24,7 @@ along with this program. If not, see . /* USB Device descriptor parameter */ #define VENDOR_ID 0xFC51 -#define PRODUCT_ID 0x0058 +#define PRODUCT_ID 0x0058 #define DEVICE_VER 0x0100 #define MANUFACTURER F_YUUCHI #define PRODUCT Lily58 @@ -62,10 +62,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 14 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options @@ -83,4 +81,4 @@ along with this program. If not, see . //#define NO_ACTION_TAPPING //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO -//#define NO_ACTION_FUNCTION \ No newline at end of file +//#define NO_ACTION_FUNCTION diff --git a/keyboards/meira/config.h b/keyboards/meira/config.h index 5e9dd6837e07..ff39f90eb727 100644 --- a/keyboards/meira/config.h +++ b/keyboards/meira/config.h @@ -42,7 +42,7 @@ along with this program. If not, see . #ifdef RGBLIGHT_ENABLE #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 15 // Number of LEDs #endif diff --git a/keyboards/minidox/keymaps/alairock/config.h b/keyboards/minidox/keymaps/alairock/config.h index 3649fdd12c6f..6b0069f4b236 100644 --- a/keyboards/minidox/keymaps/alairock/config.h +++ b/keyboards/minidox/keymaps/alairock/config.h @@ -30,7 +30,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D7 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 8 // Number of LEDs #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_HUE_STEP 10 diff --git a/keyboards/minidox/keymaps/that_canadian/config.h b/keyboards/minidox/keymaps/that_canadian/config.h index 5832d1866ed7..b85609127ee7 100644 --- a/keyboards/minidox/keymaps/that_canadian/config.h +++ b/keyboards/minidox/keymaps/that_canadian/config.h @@ -29,7 +29,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D7 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 8 // Number of LEDs #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_HUE_STEP 10 diff --git a/keyboards/minidox/keymaps/xyverz/config.h b/keyboards/minidox/keymaps/xyverz/config.h index 6d7b6256a1dc..ae26f949990c 100644 --- a/keyboards/minidox/keymaps/xyverz/config.h +++ b/keyboards/minidox/keymaps/xyverz/config.h @@ -29,7 +29,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D7 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 8 // Number of LEDs #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_HUE_STEP 10 diff --git a/keyboards/mint60/config.h b/keyboards/mint60/config.h index 51c586e6368f..a762c5ffea8b 100644 --- a/keyboards/mint60/config.h +++ b/keyboards/mint60/config.h @@ -152,10 +152,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 8 -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 17 diff --git a/keyboards/miuni32/config.h b/keyboards/miuni32/config.h index 9f26b2291e7e..a56a818f557c 100644 --- a/keyboards/miuni32/config.h +++ b/keyboards/miuni32/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 Bigtuna.io +#define MANUFACTURER Bigtuna.io #define PRODUCT Miuni32 #define DESCRIPTION A custom keyboard for writers @@ -48,7 +48,7 @@ along with this program. If not, see . /* COL2ROW or ROW2COL */ #define DIODE_DIRECTION ROW2COL - + // #define BACKLIGHT_PIN B7 // #define BACKLIGHT_BREATHING // #define BACKLIGHT_LEVELS 3 @@ -159,9 +159,8 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION -#define RGBLIGHT_TIMER + #define RGB_DI_PIN D0 // The pin your RGB strip is wired to -#define RGBLIGHT_TIMER // Require for fancier stuff (not compatible with audio) #define RGBLED_NUM 7 // Number of LEDs #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_HUE_STEP 10 diff --git a/keyboards/nyquist/rev1/config.h b/keyboards/nyquist/rev1/config.h index 61bcb80e2cf5..eec084eccd21 100644 --- a/keyboards/nyquist/rev1/config.h +++ b/keyboards/nyquist/rev1/config.h @@ -61,10 +61,8 @@ along with this program. If not, see . /* 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 diff --git a/keyboards/nyquist/rev2/config.h b/keyboards/nyquist/rev2/config.h index 75d2e939352e..ab062c9209c1 100644 --- a/keyboards/nyquist/rev2/config.h +++ b/keyboards/nyquist/rev2/config.h @@ -58,7 +58,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 16 // Number of LEDs /* Backlight LEDs */ diff --git a/keyboards/orthodox/rev1/config.h b/keyboards/orthodox/rev1/config.h index 98c24c8c08dc..03936e737fd9 100644 --- a/keyboards/orthodox/rev1/config.h +++ b/keyboards/orthodox/rev1/config.h @@ -70,10 +70,7 @@ along with this program. If not, see . /* 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 diff --git a/keyboards/orthodox/rev3/config.h b/keyboards/orthodox/rev3/config.h index 851499176258..2e4018e91bfd 100644 --- a/keyboards/orthodox/rev3/config.h +++ b/keyboards/orthodox/rev3/config.h @@ -75,10 +75,8 @@ along with this program. If not, see . /* 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 diff --git a/keyboards/orthodox/rev3_teensy/config.h b/keyboards/orthodox/rev3_teensy/config.h index daba627fa8e5..e2e693079c9d 100644 --- a/keyboards/orthodox/rev3_teensy/config.h +++ b/keyboards/orthodox/rev3_teensy/config.h @@ -67,10 +67,8 @@ along with this program. If not, see . /* 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 diff --git a/keyboards/preonic/keymaps/zach/config.h b/keyboards/preonic/keymaps/zach/config.h index 40a083da37b8..25f88afdc159 100644 --- a/keyboards/preonic/keymaps/zach/config.h +++ b/keyboards/preonic/keymaps/zach/config.h @@ -65,7 +65,7 @@ along with this program. If not, see . /* 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 diff --git a/keyboards/qwertyydox/config.h b/keyboards/qwertyydox/config.h index 5c4f8a6b2acc..b22ca534e3ef 100644 --- a/keyboards/qwertyydox/config.h +++ b/keyboards/qwertyydox/config.h @@ -64,10 +64,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D6 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/qwertyydox/rev1/config.h b/keyboards/qwertyydox/rev1/config.h index c5c4daa3d385..3d4c9b0d0002 100644 --- a/keyboards/qwertyydox/rev1/config.h +++ b/keyboards/qwertyydox/rev1/config.h @@ -64,10 +64,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D6 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* diff --git a/keyboards/redox/rev1/config.h b/keyboards/redox/rev1/config.h index f8041f235674..fe951f72261e 100644 --- a/keyboards/redox/rev1/config.h +++ b/keyboards/redox/rev1/config.h @@ -62,10 +62,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 14 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options diff --git a/keyboards/the_ruler/config.h b/keyboards/the_ruler/config.h index 16135bbd1b8e..e72875c7662f 100644 --- a/keyboards/the_ruler/config.h +++ b/keyboards/the_ruler/config.h @@ -155,9 +155,8 @@ along with this program. If not, see . //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION -#define RGBLIGHT_TIMER + #define RGB_DI_PIN E6 // The pin your RGB strip is wired to -#define RGBLIGHT_TIMER // Require for fancier stuff (not compatible with audio) #define RGBLED_NUM 1 // Number of LEDs #define RGBLIGHT_ANIMATIONS #define RGBLIGHT_HUE_STEP 10 diff --git a/keyboards/vitamins_included/rev1/config.h b/keyboards/vitamins_included/rev1/config.h index 26023bfea94b..0347477eea53 100644 --- a/keyboards/vitamins_included/rev1/config.h +++ b/keyboards/vitamins_included/rev1/config.h @@ -59,10 +59,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN F0 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 16 // Number of LEDs -#define ws2812_PORTREG PORTF -#define ws2812_DDRREG DDRF #define RGBLIGHT_ANIMATIONS /* Audio settings */ diff --git a/keyboards/viterbi/rev1/config.h b/keyboards/viterbi/rev1/config.h index 3400ea31a1a2..d6a66408efae 100644 --- a/keyboards/viterbi/rev1/config.h +++ b/keyboards/viterbi/rev1/config.h @@ -61,10 +61,8 @@ along with this program. If not, see . /* 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 diff --git a/keyboards/wavelet/config.h b/keyboards/wavelet/config.h index 4e45ef8e19d2..ac6c96696926 100644 --- a/keyboards/wavelet/config.h +++ b/keyboards/wavelet/config.h @@ -53,7 +53,7 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 12 // Number of LEDs /* Backlight LEDs */ diff --git a/keyboards/zen/rev1/config.h b/keyboards/zen/rev1/config.h index efae558927e3..890d30757030 100644 --- a/keyboards/zen/rev1/config.h +++ b/keyboards/zen/rev1/config.h @@ -65,10 +65,8 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D1 -#define RGBLIGHT_TIMER + #define RGBLED_NUM 16 // Number of LEDs -#define ws2812_PORTREG PORTD -#define ws2812_DDRREG DDRD /* * Feature disable options From ab3fbfdb3b36533125f520b540212a88349ceae6 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 22 Oct 2018 10:13:08 -0700 Subject: [PATCH 238/505] Update hardware config warnings to be more accurate Closes #3565 --- docs/hardware_avr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/hardware_avr.md b/docs/hardware_avr.md index 4d81a23d7d88..2c3652a02dbf 100644 --- a/docs/hardware_avr.md +++ b/docs/hardware_avr.md @@ -66,7 +66,7 @@ Do change the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` lines to accurately r #define DESCRIPTION A custom keyboard ``` -?> Note: On Windows and macOS the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` fields will be displayed in the list of USB devices. On Linux these values will not be visible in `lsusb`, since Linux takes that information from the list published by the USB-IF. +?> Note: On Windows and macOS the `MANUFACTURER`, `PRODUCT`, and `DESCRIPTION` fields will be displayed in the list of USB devices. ?> On Linux these values will not be visible in lsusb by default, since Linux takes the information from the list maintained by [USB ID Repository](http://www.linux-usb.org/usb-ids.html) by default. lsusb will show the information reported by the device when executed with -v option. It is also present in kernel logs after plugging in the device. ### Keyboard Matrix Configuration From 9374c0c9db317932d78356b2f92a7993145ea9a2 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 22 Oct 2018 11:57:15 -0700 Subject: [PATCH 239/505] Add caveats for shifted characters (#4192) * Add caveats for shifted characters And some formatting and grammar corrections. Closes #1037 * Fix spelling of remote * Fix spelling error * Remote not Remove * Remote not Remove --- docs/feature_advanced_keycodes.md | 20 ++++++++++++++------ docs/keycodes_us_ansi_shifted.md | 4 ++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index 15109e545993..85f4fa1bfcc9 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -2,7 +2,7 @@ Your keymap can include keycodes that are more advanced than normal, for example keys that switch layers or send modifiers when held, but send regular keycodes when tapped. This page documents the functions that are available to you. -### Assigning Custom Names +## Assigning Custom Names People often define custom names using `#define`. For example: @@ -13,7 +13,7 @@ People often define custom names using `#define`. For example: This will allow you to use `FN_CAPS` and `ALT_TAB` in your `KEYMAP()`, keeping it more readable. -### Caveats +## Caveats Currently, `LT()` and `MT()` are limited to the [Basic Keycode set](keycodes_basic.md), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. Modifiers specified as part of a Layer Tap or Mod Tap's keycode will be ignored. @@ -36,7 +36,7 @@ These functions allow you to activate layers in various ways. Note that layers a Care must be taken when switching layers, it's possible to lock yourself into a layer with no way to deactivate that layer (without unplugging your keyboard.) We've created some guidelines to help users avoid the most common problems. -### Beginners +## Beginners If you are just getting started with QMK you will want to keep everything simple. Follow these guidelines when setting up your layers: @@ -44,11 +44,11 @@ If you are just getting started with QMK you will want to keep everything simple * Arrange your layers in a "tree" layout, with layer 0 as the root. Do not try to enter the same layer from more than one other layer. * In a layer's keymap, only reference higher-numbered layers. Because layers are processed from the highest-numbered (topmost) active layer down, modifying the state of lower layers can be tricky and error-prone. -### Intermediate Users +## Intermediate Users Sometimes you need more than one base layer. For example, if you want to switch between QWERTY and Dvorak, switch between layouts for different countries, or switch your layout for different videogames. Your base layers should always be the lowest numbered layers. When you have multiple base layers you should always treat them as mutually exclusive. When one base layer is on the others are off. -### Advanced Users +## Advanced Users Once you have a good feel for how layers work and what you can do, you can get more creative. The rules listed in the beginner section will help you be successful by avoiding some of the tricker details but they can be constraining, especially for ultra-compact keyboard users. Understanding how layers work will allow you to use them in more advanced ways. @@ -126,6 +126,14 @@ For convenience, QMK includes some Mod-Tap shortcuts to make common combinations |`SGUI_T(kc)`|`SCMD_T(kc)`, `SWIN_T(kc)` |Left Shift and GUI when held, `kc` when tapped | |`LCA_T(kc)` | |Left Control and Alt when held, `kc` when tapped | +## Caveats + +Unfortunately, these keycodes cannot be used in Mod-Taps or Layer-Taps, since any modifiers specified in the keycode are ignored. + +Additionally, you may run into issues when using Remote Desktop Connection on Windows. Because these codes send shift very fast, Remote Desktop may miss the codes. + +To fix this, open Remote Desktop Connection, click on "Show Options", open the the "Local Resources" tab. In the keyboard section, change the drop down to "On this Computer". This will fix the issue, and allow the characters to work correctly. + # One Shot Keys One shot keys are keys that remain active until the next key is pressed, and then are released. This allows you to type keyboard combinations without pressing more than one key at a time. These keys are usually called "Sticky keys" or "Dead keys". @@ -146,7 +154,7 @@ You can control the behavior of one shot keys by defining these in `config.h`: Sometimes, you want to activate a one-shot layer as part of a macro or tap dance routine. To do this, you need to call `set_oneshot_layer(LAYER, ONESHOT_START)` on key down, and `set_oneshot_layer(ONESHOT_PRESSED)` on key up. If you want to cancel the oneshot, call `reset_oneshot_layer()`. For more complicated actions, take a look at the oneshot implementation in [`process_record`](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/action.c#L429). -If you're having issues with OSM translating over Remote Desktop Connection, this can be fixed by opening the settings, going to the "Local Resources" tap, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue and allow OSM to function properly over Remote Desktop. +If you're having issues with OSM translating over Remote Desktop Connection, this can be fixed by clicking on "Show Options", going to the "Local Resources" tab, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue and allow OSM to function properly over Remote Desktop. # Permissive Hold diff --git a/docs/keycodes_us_ansi_shifted.md b/docs/keycodes_us_ansi_shifted.md index e7abaa7099e3..41d6035929dc 100644 --- a/docs/keycodes_us_ansi_shifted.md +++ b/docs/keycodes_us_ansi_shifted.md @@ -6,6 +6,10 @@ These keycodes correspond to characters that are "shifted" on a standard US ANSI Unfortunately, these keycodes cannot be used in Mod-Taps or Layer-Taps, since any modifiers specified in the keycode are ignored. +Additionally, you may run into issues when using Remote Desktop Connection on Windows. Because these codes send shift very fast, Remote Desktop may miss the codes. + +To fix this, open Remote Desktop Connection, click on "Show Options", open the the "Local Resources" tab. In the keyboard section, change the drop down to "On this Computer". This will fix the issue, and allow the characters to work correctly. + ## Keycodes |Key |Aliases |Description | From a2b650df474420b2003978fbf391393b2cccbd33 Mon Sep 17 00:00:00 2001 From: Michael MacDougall Date: Mon, 22 Oct 2018 14:59:40 -0400 Subject: [PATCH 240/505] Keymap: Add mmacdougall keymap (#3852) * Add mmacdougall keymap * Make requested changes --- .../levinson/keymaps/mmacdougall/README.md | 21 ++ .../keymaps/mmacdougall/keymap/config.h | 20 ++ .../keymaps/mmacdougall/keymap/keymap.c | 201 ++++++++++++++++++ .../keymaps/mmacdougall/keymap/rules.mk | 2 + 4 files changed, 244 insertions(+) create mode 100644 keyboards/levinson/keymaps/mmacdougall/README.md create mode 100644 keyboards/levinson/keymaps/mmacdougall/keymap/config.h create mode 100644 keyboards/levinson/keymaps/mmacdougall/keymap/keymap.c create mode 100644 keyboards/levinson/keymaps/mmacdougall/keymap/rules.mk diff --git a/keyboards/levinson/keymaps/mmacdougall/README.md b/keyboards/levinson/keymaps/mmacdougall/README.md new file mode 100644 index 000000000000..bae8c8a4b832 --- /dev/null +++ b/keyboards/levinson/keymaps/mmacdougall/README.md @@ -0,0 +1,21 @@ +mmacdougall's Levinson Layout +============================ + +Similar to default layout, however RGB & backlight controls are mapped to adjust layer + +## Layouts + +### Adjust (Lower + Raise) + +``` +/* Adjust (Lower + Raise) + ,-----------------------------------------------------------------------------------. + | | Reset| | | | | | | | | | Del | + |------+------+------+------+------+-------------+------+------+------+------+------| + | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | + |------+------+------+------+------+------|------+------+------+------+------+------| + |B Step|RGB Tg|RGB Md|Hue Up|Hue Dn|Sat Up|Sat Dn|Val Up|Val Dn| | | | + |------+------+------+------+------+------+------+------+------+------+------+------| + | | | | | | | | | | | | + `-----------------------------------------------------------------------------------' +``` diff --git a/keyboards/levinson/keymaps/mmacdougall/keymap/config.h b/keyboards/levinson/keymaps/mmacdougall/keymap/config.h new file mode 100644 index 000000000000..63dd5bc88f29 --- /dev/null +++ b/keyboards/levinson/keymaps/mmacdougall/keymap/config.h @@ -0,0 +1,20 @@ +#pragma once + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 12 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/levinson/keymaps/mmacdougall/keymap/keymap.c b/keyboards/levinson/keymaps/mmacdougall/keymap/keymap.c new file mode 100644 index 000000000000..dec47a7616e0 --- /dev/null +++ b/keyboards/levinson/keymaps/mmacdougall/keymap/keymap.c @@ -0,0 +1,201 @@ +#include QMK_KEYBOARD_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 | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_ortho_4x12( \ + 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] = LAYOUT_ortho_4x12( \ + 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] = LAYOUT_ortho_4x12( \ + 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] = LAYOUT_ortho_4x12( \ + 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] = LAYOUT_ortho_4x12( \ + 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| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * |B Step|RGB Tg|RGB Md|Hue Up|Hue Dn|Sat Up|Sat Dn|Val Up|Val Dn| | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_ortho_4x12( \ + _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ + BL_STEP, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +) + + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_qwerty); + #endif + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_colemak); + #endif + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + #ifdef AUDIO_ENABLE + PLAY_SONG(tone_dvorak); + #endif + set_single_persistent_default_layer(_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; +} diff --git a/keyboards/levinson/keymaps/mmacdougall/keymap/rules.mk b/keyboards/levinson/keymaps/mmacdougall/keymap/rules.mk new file mode 100644 index 000000000000..d7463419b4fe --- /dev/null +++ b/keyboards/levinson/keymaps/mmacdougall/keymap/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_ENABLE = yes +BACKLIGHT_ENABLE = yes From 47dcda1087a2aa3bbb46d69c5cf682bf45650a8b Mon Sep 17 00:00:00 2001 From: Levi Olson Date: Mon, 22 Oct 2018 14:04:28 -0500 Subject: [PATCH 241/505] Diverge3 - Workman Layout (#3682) * Diverge3: Workman Programmers Layout * Diverge3: Comment Removal * Diverge3: Image Links Fixed * Diverge3: Images added * Diverge3: Images cleaned up * Diverge3: Images cleaned up * Diverge3: Removing Images * Diverge3: Improving readme.md * Diverge3: Improving readme.md * Diverge3: Add supporting Comments * Diverge3: Update readme * Diverge3: Update readme * Diverge3: Updates per comments in PR * Diverge3: Updates per comments in PR * Diverge3: Updates per comments in PR * Diverge3: Updates per comments in PR * Diverge3: Updates per comments in PR * Diverge3: Updates per comments in PR --- keyboards/diverge3/.gitignore | 1 + keyboards/diverge3/config.h | 9 +- keyboards/diverge3/keymaps/workman/config.h | 5 + keyboards/diverge3/keymaps/workman/keymap.c | 212 +++++++++++++++++++ keyboards/diverge3/keymaps/workman/readme.md | 21 ++ keyboards/diverge3/keymaps/workman/rules.mk | 1 + keyboards/diverge3/readme.md | 6 +- 7 files changed, 250 insertions(+), 5 deletions(-) create mode 100644 keyboards/diverge3/.gitignore create mode 100644 keyboards/diverge3/keymaps/workman/config.h create mode 100644 keyboards/diverge3/keymaps/workman/keymap.c create mode 100644 keyboards/diverge3/keymaps/workman/readme.md create mode 100644 keyboards/diverge3/keymaps/workman/rules.mk diff --git a/keyboards/diverge3/.gitignore b/keyboards/diverge3/.gitignore new file mode 100644 index 000000000000..722d5e71d93c --- /dev/null +++ b/keyboards/diverge3/.gitignore @@ -0,0 +1 @@ +.vscode diff --git a/keyboards/diverge3/config.h b/keyboards/diverge3/config.h index db3c6a6f7685..f3ed06739a8e 100644 --- a/keyboards/diverge3/config.h +++ b/keyboards/diverge3/config.h @@ -31,7 +31,9 @@ along with this program. If not, see . /* key matrix size */ #define MATRIX_ROWS 10 #define MATRIX_COLS 8 -// SERIAL is the only supported +// Only SERIAL is currently supported +// By converting this to use I2C, backlight +// would/should be fully functional as well #define USE_SERIAL /* @@ -51,7 +53,7 @@ along with this program. If not, see . /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #define DIODE_DIRECTION ROW2COL -// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_PIN C6 // #define BACKLIGHT_BREATHING // #define BACKLIGHT_LEVELS 3 @@ -61,8 +63,7 @@ along with this program. If not, see . /* 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 diff --git a/keyboards/diverge3/keymaps/workman/config.h b/keyboards/diverge3/keymaps/workman/config.h new file mode 100644 index 000000000000..9829a604f1c1 --- /dev/null +++ b/keyboards/diverge3/keymaps/workman/config.h @@ -0,0 +1,5 @@ +#pragma once + +// place overrides here +#define PERMISSIVE_HOLD +#define TAPPING_TERM 150 \ No newline at end of file diff --git a/keyboards/diverge3/keymaps/workman/keymap.c b/keyboards/diverge3/keymaps/workman/keymap.c new file mode 100644 index 000000000000..5e681f4188d6 --- /dev/null +++ b/keyboards/diverge3/keymaps/workman/keymap.c @@ -0,0 +1,212 @@ +/* Copyright 2017 IslandMan93 + * + * 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 QMK_KEYBOARD_H + +// KEYMAP +extern keymap_config_t keymap_config; + +#define _WORKMAN_P 0 +#define _GAME 1 +#define _RAISE 2 + +#define _______ KC_TRNS + +#define SHIFT_MOD MOD_BIT(KC_LSFT) +#define SPACE_RAISE LT(_RAISE, KC_SPC) +#define ENT_RAISE LT(_RAISE, KC_ENT) +#define PAGE_PREV S(LCTL(KC_TAB)) +#define PAGE_NEXT LCTL(KC_TAB) + +enum custom_keycodes +{ + LO_BSPC = SAFE_RANGE, + LO_1, + LO_2, + LO_3, + LO_4, + LO_5, + LO_6, + LO_7, + LO_8, + LO_9, + LO_0, +}; + +bool process_record_user(uint16_t keycode, keyrecord_t* record) +{ + if (record->event.pressed) { + switch (keycode) { + case LO_BSPC: + if (record->event.pressed) { + if (get_mods() & SHIFT_MOD) { + uint8_t current_mods = get_mods(); + clear_mods(); + SEND_STRING(SS_TAP(X_DELETE)); + set_mods(current_mods); + } else { + SEND_STRING(SS_TAP(X_BSPACE)); + } + } + return false; + case LO_1: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("1"); + set_mods(current_mods); + } else { + SEND_STRING("!"); + } + } + return false; + case LO_2: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("2"); + set_mods(current_mods); + } else { + SEND_STRING("@"); + } + } + return false; + case LO_3: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("3"); + set_mods(current_mods); + } else { + SEND_STRING("#"); + } + } + return false; + case LO_4: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("4"); + set_mods(current_mods); + } else { + SEND_STRING("$"); + } + } + return false; + case LO_5: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("5"); + set_mods(current_mods); + } else { + SEND_STRING("%"); + } + } + return false; + case LO_6: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("6"); + set_mods(current_mods); + } else { + SEND_STRING("^"); + } + } + return false; + case LO_7: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("7"); + set_mods(current_mods); + } else { + SEND_STRING("&"); + } + } + return false; + case LO_8: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("8"); + set_mods(current_mods); + } else { + SEND_STRING("*"); + } + } + return false; + case LO_9: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("9"); + set_mods(current_mods); + } else { + SEND_STRING("("); + } + } + return false; + case LO_0: + if (record->event.pressed) { + uint8_t current_mods = get_mods(); + if (current_mods & SHIFT_MOD) { + clear_mods(); + SEND_STRING("0"); + set_mods(current_mods); + } else { + SEND_STRING(")"); + } + } + return false; + } + } + return true; +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_WORKMAN_P] = LAYOUT( + KC_ESC, LO_1, LO_2, LO_3, LO_4, LO_5, LO_6, LO_6, LO_7, LO_8, LO_9, LO_0, KC_MINS, KC_ESC, + KC_GRV, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_LPRN, KC_RPRN, KC_J, KC_F, KC_U, KC_P, KC_SCLN, KC_EQL, + KC_TAB, KC_A, KC_S, KC_H, KC_T, KC_G, KC_LCBR, KC_RCBR, KC_Y, KC_N, KC_E, KC_O, KC_I, KC_BSLS, + KC_LCTL, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_LBRC, KC_RBRC, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT, + KC_LSFT, RESET, PAGE_PREV, PAGE_NEXT, KC_END, KC_LGUI, KC_LALT, TG(_GAME), LO_BSPC, ENT_RAISE, SPACE_RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_RCTL), + + [_GAME] = LAYOUT( + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_ESC, + KC_GRV, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_LPRN, KC_RPRN, KC_J, KC_F, KC_U, KC_P, KC_SCLN, KC_EQL, + KC_TAB, KC_A, KC_S, KC_H, KC_T, KC_G, KC_LCBR, KC_RCBR, KC_Y, KC_N, KC_E, KC_O, KC_I, KC_BSLS, + KC_LCTL, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_LBRC, KC_RBRC, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT, + KC_LSFT, KC_F1, KC_F2, KC_3, KC_F5, KC_SPC, KC_LALT, TG(_GAME), LO_BSPC, ENT_RAISE, SPACE_RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_RCTL), + + [_RAISE] = LAYOUT( + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, RESET, + _______, _______, _______, _______, _______, _______, BL_INC, KC_VOLU, _______, _______, _______, _______, _______, KC_F12, + _______, _______, _______, _______, _______, _______, BL_DEC, KC_VOLD, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, + _______, _______, _______, _______, _______, _______, BL_BRTG, KC_MUTE, _______, _______, KC_MPRV, KC_MNXT, KC_MPLY, _______, + _______, _______, _______, _______, _______, _______, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______), + +}; \ No newline at end of file diff --git a/keyboards/diverge3/keymaps/workman/readme.md b/keyboards/diverge3/keymaps/workman/readme.md new file mode 100644 index 000000000000..48ba482fe6d5 --- /dev/null +++ b/keyboards/diverge3/keymaps/workman/readme.md @@ -0,0 +1,21 @@ +# The Workman keymap for diverge3 + +Basic example of the [Workman Programming Layout](https://github.com/ojbucao/workman) which uses the `SHIFT`ed variants of the number row, by default. + +## Layer 1 - Default Layer + +Workman programming layout. + +![Workman Layout Picture](https://i.imgur.com/IOOmRfI.png) + +## Layer 2 - Gaming Layer + +Reverts the number row to the normal 1, 2, 3, etc... for better gaming compatibility. + +![Gaming Layer Picture](https://i.imgur.com/E0vmEAa.png) + +## Layer 3 - Raise Layer + +Volume and backlight controls (although backlight is not fully functional using `USE_SERIAL` in `../config.h`). + +![Raise Layer Misc Buttons Picture](https://i.imgur.com/50L3O62.png) diff --git a/keyboards/diverge3/keymaps/workman/rules.mk b/keyboards/diverge3/keymaps/workman/rules.mk new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/keyboards/diverge3/keymaps/workman/rules.mk @@ -0,0 +1 @@ + diff --git a/keyboards/diverge3/readme.md b/keyboards/diverge3/readme.md index 2ecfbca3bb52..43add9d990b2 100644 --- a/keyboards/diverge3/readme.md +++ b/keyboards/diverge3/readme.md @@ -10,7 +10,11 @@ Make example for this keyboard (after setting up your build environment): make diverge3:default +Or for the [Workman](https://github.com/ojbucao/workman) layout: + + make diverge3:workman + See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. # Reflashing Animus -Reflashing the stock firmware is pretty easy. Just follow the same steps in the [original guide](https://imgur.com/a/8UapN). You will have to manually reset the Pro Micro (by shorting the GND and RST) during the upload step. Then reapply your keymap through Arbites. \ No newline at end of file +Reflashing the stock firmware is pretty easy. Just follow the same steps in the [original guide](https://imgur.com/a/8UapN). You will have to manually reset the Pro Micro (by shorting the GND and RST pins) during the upload step. Then reapply your keymap through Arbites. \ No newline at end of file From bf57587e6203e3bcabbc161c1d45b9a6cc7abfaa Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Mon, 22 Oct 2018 12:35:09 -0700 Subject: [PATCH 242/505] Keyboard: Zlant refactor and Configurator support (#3678) * Matrix/keymap refactor White space and readability updates * Configurator support Added info.json file. * Readme update Markdown formatting * Add support for ortho_4x12 keymaps * Added planck_mit layout support * Disable SWAP_HANDS_ENABLE for zlant:wanleg keymap * Disable BACKLIGHT_ENABLE for zlant:bakingpy keymap --- keyboards/zlant/info.json | 17 +++++++ keyboards/zlant/keymaps/default/keymap.c | 22 +++++----- keyboards/zlant/readme.md | 6 +-- keyboards/zlant/rules.mk | 2 + keyboards/zlant/zlant.h | 44 +++++++++++++++---- .../community/ortho_4x12/bakingpy/rules.mk | 6 ++- layouts/community/ortho_4x12/wanleg/rules.mk | 4 ++ 7 files changed, 77 insertions(+), 24 deletions(-) create mode 100644 keyboards/zlant/info.json diff --git a/keyboards/zlant/info.json b/keyboards/zlant/info.json new file mode 100644 index 000000000000..b1f20555c035 --- /dev/null +++ b/keyboards/zlant/info.json @@ -0,0 +1,17 @@ +{ + "keyboard_name": "Zlant", + "url": "", + "maintainer": "qmk", + "width": 12.75, + "height": 4, + "layouts": { + "LAYOUT_ortho_4x12": { + "key_count": 48, + "layout": [{"label":"K000", "x":0, "y":0}, {"label":"K001", "x":1, "y":0}, {"label":"K002", "x":2, "y":0}, {"label":"K003", "x":3, "y":0}, {"label":"K004", "x":4, "y":0}, {"label":"K005", "x":5, "y":0}, {"label":"K006", "x":6, "y":0}, {"label":"K007", "x":7, "y":0}, {"label":"K008", "x":8, "y":0}, {"label":"K009", "x":9, "y":0}, {"label":"K010", "x":10, "y":0}, {"label":"K011", "x":11, "y":0}, {"label":"K100", "x":0.25, "y":1}, {"label":"K101", "x":1.25, "y":1}, {"label":"K102", "x":2.25, "y":1}, {"label":"K103", "x":3.25, "y":1}, {"label":"K104", "x":4.25, "y":1}, {"label":"K105", "x":5.25, "y":1}, {"label":"K106", "x":6.25, "y":1}, {"label":"K107", "x":7.25, "y":1}, {"label":"K108", "x":8.25, "y":1}, {"label":"K109", "x":9.25, "y":1}, {"label":"K110", "x":10.25, "y":1}, {"label":"K111", "x":11.25, "y":1}, {"label":"K200", "x":0.5, "y":2}, {"label":"K201", "x":1.5, "y":2}, {"label":"K202", "x":2.5, "y":2}, {"label":"K203", "x":3.5, "y":2}, {"label":"K204", "x":4.5, "y":2}, {"label":"K205", "x":5.5, "y":2}, {"label":"K206", "x":6.5, "y":2}, {"label":"K207", "x":7.5, "y":2}, {"label":"K208", "x":8.5, "y":2}, {"label":"K209", "x":9.5, "y":2}, {"label":"K210", "x":10.5, "y":2}, {"label":"K211", "x":11.5, "y":2}, {"label":"K300", "x":0.75, "y":3}, {"label":"K301", "x":1.75, "y":3}, {"label":"K302", "x":2.75, "y":3}, {"label":"K303", "x":3.75, "y":3}, {"label":"K304", "x":4.75, "y":3}, {"label":"K305", "x":5.75, "y":3}, {"label":"K306", "x":6.75, "y":3}, {"label":"K307", "x":7.75, "y":3}, {"label":"K308", "x":8.75, "y":3}, {"label":"K309", "x":9.75, "y":3}, {"label":"K310", "x":10.75, "y":3}, {"label":"K311", "x":11.75, "y":3}] + }, + "LAYOUT_planck_mit": { + "key_count": 47, + "layout": [{"label":"K000", "x":0, "y":0}, {"label":"K001", "x":1, "y":0}, {"label":"K002", "x":2, "y":0}, {"label":"K003", "x":3, "y":0}, {"label":"K004", "x":4, "y":0}, {"label":"K005", "x":5, "y":0}, {"label":"K006", "x":6, "y":0}, {"label":"K007", "x":7, "y":0}, {"label":"K008", "x":8, "y":0}, {"label":"K009", "x":9, "y":0}, {"label":"K010", "x":10, "y":0}, {"label":"K011", "x":11, "y":0}, {"label":"K100", "x":0.25, "y":1}, {"label":"K101", "x":1.25, "y":1}, {"label":"K102", "x":2.25, "y":1}, {"label":"K103", "x":3.25, "y":1}, {"label":"K104", "x":4.25, "y":1}, {"label":"K105", "x":5.25, "y":1}, {"label":"K106", "x":6.25, "y":1}, {"label":"K107", "x":7.25, "y":1}, {"label":"K108", "x":8.25, "y":1}, {"label":"K109", "x":9.25, "y":1}, {"label":"K110", "x":10.25, "y":1}, {"label":"K111", "x":11.25, "y":1}, {"label":"K200", "x":0.5, "y":2}, {"label":"K201", "x":1.5, "y":2}, {"label":"K202", "x":2.5, "y":2}, {"label":"K203", "x":3.5, "y":2}, {"label":"K204", "x":4.5, "y":2}, {"label":"K205", "x":5.5, "y":2}, {"label":"K206", "x":6.5, "y":2}, {"label":"K207", "x":7.5, "y":2}, {"label":"K208", "x":8.5, "y":2}, {"label":"K209", "x":9.5, "y":2}, {"label":"K210", "x":10.5, "y":2}, {"label":"K211", "x":11.5, "y":2}, {"label":"K300", "x":0.75, "y":3}, {"label":"K301", "x":1.75, "y":3}, {"label":"K302", "x":2.75, "y":3}, {"label":"K303", "x":3.75, "y":3}, {"label":"K304", "x":4.75, "y":3, "w":1.25}, {"label":"K305", "x":6, "y":3, "w":1.5}, {"label":"K307", "x":7.5, "y":3, "w":1.25}, {"label":"K308", "x":8.75, "y":3}, {"label":"K309", "x":9.75, "y":3}, {"label":"K310", "x":10.75, "y":3}, {"label":"K311", "x":11.75, "y":3}] + } + } +} diff --git a/keyboards/zlant/keymaps/default/keymap.c b/keyboards/zlant/keymaps/default/keymap.c index d586c841d825..a701a7965a2f 100755 --- a/keyboards/zlant/keymaps/default/keymap.c +++ b/keyboards/zlant/keymaps/default/keymap.c @@ -5,16 +5,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [BASE] = LAYOUT( - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, - KC_ESC, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, - RGB_HUI, RGB_HUD, KC_LGUI, KC_LALT, KC_LSFT, KC_SPC, KC_SPC, MO(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT), + [BASE] = LAYOUT( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_ESC, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, \ + RGB_HUI, RGB_HUD, KC_LGUI, KC_LALT, KC_LSFT, KC_SPC, KC_SPC, MO(1), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + ), - [FN] = LAYOUT( - KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS, - KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, - KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_PGUP, KC_HOME, KC_TRNS, KC_TRNS, - RGB_VAI, RGB_VAD, RESET, KC_PSCR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_END, KC_TRNS, KC_DEL) + [FN] = LAYOUT( + _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \ + _______, 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_PGUP, KC_HOME, _______, _______, \ + RGB_VAI, RGB_VAD, RESET, KC_PSCR, _______, _______, _______, _______, KC_PGDN, KC_END, _______, KC_DEL \ + ) }; diff --git a/keyboards/zlant/readme.md b/keyboards/zlant/readme.md index 0780cedeb118..8f50e6d4c7b3 100644 --- a/keyboards/zlant/readme.md +++ b/keyboards/zlant/readme.md @@ -4,10 +4,8 @@ A compact 40% inspired by the Plank with a staggered layout instead. -Keyboard Maintainer: [Felipe Coury](https://github.com/fcoury) - -Hardware Supported: Zlant Prototype PCB - +Keyboard Maintainer: [Felipe Coury](https://github.com/fcoury) +Hardware Supported: Zlant Prototype PCB Hardware Availability: Group buy soon Make example for this keyboard (after setting up your build environment): diff --git a/keyboards/zlant/rules.mk b/keyboards/zlant/rules.mk index 482f99b223ba..0bc5c8aaed7c 100755 --- a/keyboards/zlant/rules.mk +++ b/keyboards/zlant/rules.mk @@ -54,3 +54,5 @@ NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https:/ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality AUDIO_ENABLE = no RGBLIGHT_ENABLE = yes + +LAYOUTS = ortho_4x12 planck_mit diff --git a/keyboards/zlant/zlant.h b/keyboards/zlant/zlant.h index 48c7b3f40986..6310a14e35c2 100755 --- a/keyboards/zlant/zlant.h +++ b/keyboards/zlant/zlant.h @@ -3,16 +3,42 @@ #include "quantum.h" -#define LAYOUT( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \ - K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \ - K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311 \ +#define LAYOUT_ortho_4x12( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311 \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011 }, \ - { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111 }, \ - { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211 }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311 } \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311 } \ } +#define LAYOUT_planck_mit( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \ + K300, K301, K302, K303, K304, K305, K307, K308, K309, K310, K311 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211 }, \ + { K300, K301, K302, K303, K304, K305, K305, K307, K308, K309, K310, K311 } \ +} + +#define LAYOUT_kc_ortho_4x12( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311 \ +) LAYOUT( \ + KC_##K000, KC_##K001, KC_##K002, KC_##K003, KC_##K004, KC_##K005, KC_##K006, KC_##K007, KC_##K008, KC_##K009, KC_##K010, KC_##K011, \ + KC_##K100, KC_##K101, KC_##K102, KC_##K103, KC_##K104, KC_##K105, KC_##K106, KC_##K107, KC_##K108, KC_##K109, KC_##K110, KC_##K111, \ + KC_##K200, KC_##K201, KC_##K202, KC_##K203, KC_##K204, KC_##K205, KC_##K206, KC_##K207, KC_##K208, KC_##K209, KC_##K210, KC_##K211, \ + KC_##K300, KC_##K301, KC_##K302, KC_##K303, KC_##K304, KC_##K305, KC_##K306, KC_##K307, KC_##K308, KC_##K309, KC_##K310, KC_##K311 \ +) + +#define LAYOUT LAYOUT_ortho_4x12 + #endif diff --git a/layouts/community/ortho_4x12/bakingpy/rules.mk b/layouts/community/ortho_4x12/bakingpy/rules.mk index 0d568c401a6e..490ebbf77934 100644 --- a/layouts/community/ortho_4x12/bakingpy/rules.mk +++ b/layouts/community/ortho_4x12/bakingpy/rules.mk @@ -3,4 +3,8 @@ ifeq ($(LAYOUTS_HAS_RGB),yes) RGBLIGHT_ENABLE = yes endif AUDIO_ENABLE = no -BACKLIGHT_ENABLE = yes +ifeq ($(strip $(KEYBOARD)), zlant) + BACKLIGHT_ENABLE = no +else + BACKLIGHT_ENABLE = yes +endif diff --git a/layouts/community/ortho_4x12/wanleg/rules.mk b/layouts/community/ortho_4x12/wanleg/rules.mk index 69f377a0159f..fa433a6b0dae 100644 --- a/layouts/community/ortho_4x12/wanleg/rules.mk +++ b/layouts/community/ortho_4x12/wanleg/rules.mk @@ -7,4 +7,8 @@ endif ifeq ($(strip $(KEYBOARD)), 4x4) SWAP_HANDS_ENABLE = no +endif + +ifeq ($(strip $(KEYBOARD)), zlant) + SWAP_HANDS_ENABLE = no endif \ No newline at end of file From 6d7745a110daad815fe5edbb35a2e33702f24aaa Mon Sep 17 00:00:00 2001 From: markspanbroek Date: Mon, 22 Oct 2018 21:37:03 +0200 Subject: [PATCH 243/505] Keyboard: Port of TMK XT USB Converter (#3619) * Converter: add XT USB converter from TMK * Converter: port TMK code for USB converter to QMK * Apply requested changes after code review by @drashna - use "pragma once" instead of include guards - use LAYOUT instead of KEYMAP - allow customisation with matrix_init_user() and matrix_scan_user() - set BOOTLOADER instead of BOOTLOADER_SIZE - Add XT_ENABLE to OPT_DEFS * Remove unnecessary lines --- keyboards/converter/xt_usb/README.md | 17 + keyboards/converter/xt_usb/config.h | 78 +++++ .../converter/xt_usb/keymaps/default/config.h | 1 + .../converter/xt_usb/keymaps/default/keymap.c | 55 ++++ keyboards/converter/xt_usb/led.c | 22 ++ keyboards/converter/xt_usb/matrix.c | 309 ++++++++++++++++++ keyboards/converter/xt_usb/rules.mk | 62 ++++ keyboards/converter/xt_usb/xt_usb.c | 1 + keyboards/converter/xt_usb/xt_usb.h | 132 ++++++++ tmk_core/protocol.mk | 5 + tmk_core/protocol/xt.h | 71 ++++ tmk_core/protocol/xt_interrupt.c | 173 ++++++++++ 12 files changed, 926 insertions(+) create mode 100644 keyboards/converter/xt_usb/README.md create mode 100644 keyboards/converter/xt_usb/config.h create mode 100644 keyboards/converter/xt_usb/keymaps/default/config.h create mode 100644 keyboards/converter/xt_usb/keymaps/default/keymap.c create mode 100644 keyboards/converter/xt_usb/led.c create mode 100644 keyboards/converter/xt_usb/matrix.c create mode 100644 keyboards/converter/xt_usb/rules.mk create mode 100644 keyboards/converter/xt_usb/xt_usb.c create mode 100644 keyboards/converter/xt_usb/xt_usb.h create mode 100644 tmk_core/protocol/xt.h create mode 100644 tmk_core/protocol/xt_interrupt.c diff --git a/keyboards/converter/xt_usb/README.md b/keyboards/converter/xt_usb/README.md new file mode 100644 index 000000000000..40b265a189ec --- /dev/null +++ b/keyboards/converter/xt_usb/README.md @@ -0,0 +1,17 @@ +XT to USB keyboard converter +============================== +This is a port of TMK's converter/xt_usb to QMK. + +This firmware converts XT keyboard protocol to USB.(It supports Scan Code Set 1.) + + +Connect Wires +------------- +1. Connect **Vcc** and **GND**. +2. Connect **Clock** and **Data** line. **Clock** is on `PD1`, **Data** on `PD0` by default. And optionally you can use `PB7` for **Reset**.(Compatible to Soarer's converter) To change pin configuration edit `config.h`. +3. You need pull-up resistor. **1K-10K Ohm** will be OK. + + +XT keyboard protocol resource +------------------------------ +https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-XT-Keyboard-Protocol diff --git a/keyboards/converter/xt_usb/config.h b/keyboards/converter/xt_usb/config.h new file mode 100644 index 000000000000..963a3c639673 --- /dev/null +++ b/keyboards/converter/xt_usb/config.h @@ -0,0 +1,78 @@ +/* +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 . +*/ + +#pragma once + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6512 +#define DEVICE_VER 0x0001 +#define MANUFACTURER QMK +#define PRODUCT XT keyboard converter +#define DESCRIPTION convert XT keyboard to USB + + +/* matrix size */ +#define MATRIX_ROWS 16 // keycode bit: 3-0 +#define MATRIX_COLS 8 // keycode bit: 6-4 + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) || \ + keyboard_report->mods == (MOD_BIT(KC_LCTRL) | MOD_BIT(KC_RSHIFT)) \ +) + + +//#define NO_SUSPEND_POWER_DOWN + +/* + * XT Pin interrupt + */ +#define XT_CLOCK_PORT PORTD +#define XT_CLOCK_PIN PIND +#define XT_CLOCK_DDR DDRD +#define XT_CLOCK_BIT 1 +#define XT_DATA_PORT PORTD +#define XT_DATA_PIN PIND +#define XT_DATA_DDR DDRD +#define XT_DATA_BIT 0 +#define XT_RST_PORT PORTB +#define XT_RST_PIN PINB +#define XT_RST_DDR DDRB +#define XT_RST_BIT 7 + +/* hard reset: low pulse for 500ms and after that HiZ for safety */ +#define XT_RESET() do { \ + XT_RST_PORT &= ~(1< + +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 "led.h" + +void led_set(uint8_t usb_led) { + //XT Keyboards do not have LEDs, nothing to do. +} diff --git a/keyboards/converter/xt_usb/matrix.c b/keyboards/converter/xt_usb/matrix.c new file mode 100644 index 000000000000..e2d7117b13a9 --- /dev/null +++ b/keyboards/converter/xt_usb/matrix.c @@ -0,0 +1,309 @@ +/* +Copyright 2011 Jun Wako +Copyright 2016 Ethan Apodaca + +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 "action.h" +#include "print.h" +#include "util.h" +#include "debug.h" +#include "xt.h" +#include "matrix.h" + + +static void matrix_make(uint8_t code); +static void matrix_break(uint8_t code); + +static uint8_t matrix[MATRIX_ROWS]; +#define ROW(code) (code>>3) +#define COL(code) (code&0x07) + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +void matrix_init(void) +{ + debug_enable = true; + xt_host_init(); + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; + + matrix_init_quantum(); +} + +// convert E0-escaped codes into unused area +static uint8_t move_e0code(uint8_t code) { + switch(code) { + // Original IBM XT keyboard has these keys + case 0x37: return 0x54; // Print Screen + case 0x46: return 0x55; // Ctrl + Pause + case 0x1C: return 0x6F; // Keypad Enter + case 0x35: return 0x7F; // Keypad / + + // Any XT keyobard with these keys? + // http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/translate.pdf + // https://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc + case 0x5B: return 0x5A; // Left GUI + case 0x5C: return 0x5B; // Right GUI + case 0x5D: return 0x5C; // Application + case 0x5E: return 0x5D; // Power(not used) + case 0x5F: return 0x5E; // Sleep(not used) + case 0x63: return 0x5F; // Wake (not used) + case 0x48: return 0x60; // Up + case 0x4B: return 0x61; // Left + case 0x50: return 0x62; // Down + case 0x4D: return 0x63; // Right + case 0x52: return 0x71; // Insert + case 0x53: return 0x72; // Delete + case 0x47: return 0x74; // Home + case 0x4F: return 0x75; // End + case 0x49: return 0x77; // Home + case 0x51: return 0x78; // End + case 0x1D: return 0x7A; // Right Ctrl + case 0x38: return 0x7C; // Right Alt + } + return 0x00; +} + +uint8_t matrix_scan(void) +{ + static enum { + INIT, + E0, + // Pause: E1 1D 45, E1 9D C5 + E1, + E1_1D, + E1_9D, + } state = INIT; + + uint8_t code = xt_host_recv(); + if (!code) return 0; + xprintf("%02X ", code); + switch (state) { + case INIT: + switch (code) { + case 0xE0: + state = E0; + break; + case 0xE1: + state = E1; + break; + default: + if (code < 0x80) + matrix_make(code); + else + matrix_break(code & 0x7F); + break; + } + break; + case E0: + switch (code) { + case 0x2A: + case 0xAA: + case 0x36: + case 0xB6: + //ignore fake shift + state = INIT; + break; + default: + if (code < 0x80) + matrix_make(move_e0code(code)); + else + matrix_break(move_e0code(code & 0x7F)); + state = INIT; + break; + } + break; + case E1: + switch (code) { + case 0x1D: + state = E1_1D; + break; + case 0x9D: + state = E1_9D; + break; + default: + state = INIT; + break; + } + break; + case E1_1D: + switch (code) { + case 0x45: + matrix_make(0x55); + break; + default: + state = INIT; + break; + } + break; + case E1_9D: + switch (code) { + case 0x45: + matrix_break(0x55); + break; + default: + state = INIT; + break; + } + break; + default: + state = INIT; + } + matrix_scan_quantum(); + return 1; +} + +inline +uint8_t matrix_get_row(uint8_t row) +{ + return matrix[row]; +} + +inline +static void matrix_make(uint8_t code) +{ + if (!matrix_is_on(ROW(code), COL(code))) { + matrix[ROW(code)] |= 1< + +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 + +#include "quantum.h" + +/* IBM XT keyboard layout + * ,-------. ,--------------------------------------------------------------------------. + * | F1| F2| |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BS |NumLck |ScrLck | + * |-------| |--------------------------------------------------------------------------| + * | F3| F4| | Tab | Q| W| E| R| T| Y| U| I| O| P| [| ] | | 7| 8| 9| -| + * |-------| |------------------------------------------------------|Ent|---------------| + * | F5| F6| | Ctrl | A| S| D| F| G| H| J| K| L| ;| '| `| | 4| 5| 6| | + * |-------| |----------------------------------------------------------------------| | + * | F7| F8| |Shif| \| Z| X| C| V| B| N| M| ,| .| /|Shift|PrS| 1| 2| 3| +| + * |-------| |----------------------------------------------------------------------| | + * | F9|F10| | Alt | Space |CapsLck| 0 | . | | + * `-------' `--------------------------------------------------------------------------' + * Scan code set 1 + * ,-------. ,--------------------------------------------------------------------------. + * | 3B| 3C| | 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E | 45 | 46 | + * |-------| |--------------------------------------------------------------------------| + * | 3D| 3E| | 0F | 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B | | 47| 48| 49| 4A| + * |-------| |------------------------------------------------------| 1C|---------------| + * | 3F| 40| | 1D | 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| | 4B| 4C| 4D| | + * |-------| |----------------------------------------------------------------------| | + * | 41| 42| | 2A | 2B| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 34| 35| 36 |*37| 4F| 50| 51| 4E| + * |-------| |----------------------------------------------------------------------| | + * | 43| 44| | 38 | 39 | 3A | 52 | 53 | | + * `-------' `--------------------------------------------------------------------------' + */ +#define LAYOUT_xt( \ + K3B,K3C, K01,K02,K03,K04,K05,K06,K07,K08,K09,K0A,K0B,K0C,K0D,K0E, K45, K46, \ + K3D,K3E, K0F,K10,K11,K12,K13,K14,K15,K16,K17,K18,K19,K1A,K1B, K47,K48,K49,K4A, \ + K3F,K40, K1D,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28,K29,K1C,K4B,K4C,K4D, \ + K41,K42, K2A,K2B,K2C,K2D,K2E,K2F,K30,K31,K32,K33,K34,K35,K36,K54,K4F,K50,K51,K4E, \ + K43,K44, K38, K39, K3A, K52, K53 \ +) { \ + { KC_NO, K01, K02, K03, K04, K05, K06, K07 }, \ + { K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ + { K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27 }, \ + { K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \ + { K30, K31, K32, K33, K34, K35, K36, KC_NO }, \ + { K38, K39, K3A, K3B, K3C, K3D, K3E, K3F }, \ + { K40, K41, K42, K43, K44, K45, K46, K47 }, \ + { K48, K49, K4A, K4B, K4C, K4D, K4E, K4F }, \ + { K50, K51, K52, K53, K54, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ +} + +/* Extended keyboard layout + * ,-----------------------------------------------. + * |F13|F14|F15|F16|F17|F18|F19|F20|F21|F22|F23|F24| + * ,---. |-----------------------------------------------| ,-----------. ,-----------. + * |Esc| |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| |PrS|ScL|Pau| |VDn|VUp|Mut| + * `---' `-----------------------------------------------' `-----------' `-----------' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|JPY|Bsp| |Ins|Hom|PgU| |NmL| /| *| -| + * |-----------------------------------------------------------| |-----------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| +| + * |-----------------------------------------------------------| `-----------' |---------------| + * |CapsL | A| S| D| F| G| H| J| K| L| ;| '| #|Entr| | 4| 5| 6|KP,| + * |-----------------------------------------------------------| ,---. |---------------| + * |Shft| <| Z| X| C| V| B| N| M| ,| .| /| RO|Shift | |Up | | 1| 2| 3|Ent| + * |-----------------------------------------------------------| ,-----------. |---------------| + * |Ctl|Gui|Alt|MHEN| Space |HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .|KP=| + * `-----------------------------------------------------------' `-----------' `---------------' + * ,-----------------------------------------------. + * | 64| 65| 66| 67| 68| 69| 6A| 6B| 6C| 6D| 6E| 76| + * ,---. |-----------------------------------------------| ,-----------. ,-----------. + * | 01| | 3B| 3C| 3D| 3E| 3F| 40| 41| 42| 43| 44| 57| 58| |*37| 46|*45| |e5E|e5F|e63| + * `---' `-----------------------------------------------' `-----------' `-----------' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | 29| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 7D| 0E| |e52|e47|e49| | 45|e35| 37| 4A| + * |-----------------------------------------------------------| |-----------| |---------------| + * | 0F | 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 2B | |e53|e4F|e51| | 47| 48| 49| 4E| + * |-----------------------------------------------------------| `-----------' |---------------| + * | 3A | 1E| 1F| 20| 21| 22| 23| 24| 25| 26| 27| 28| 00| 1C | | 4B| 4C| 4D| 7E| + * |-----------------------------------------------------------| ,---. |---------------| + * | 2A | 56| 2C| 2D| 2E| 2F| 30| 31| 32| 33| 34| 35| 73| 36 | |e48| | 4F| 50| 51|e1C| + * |-----------------------------------------------------------| ,-----------. |---------------| + * | 1D|e5B| 38| 7B | 39 | 79 | 70 |e38|e5C|e5D|e1D| |e4B|e50|e4D| | 52| 53| 59| + * `-----------------------------------------------------------' `-----------' `---------------' + * e: E0-escaped codes + * *: special handling codes + */ +#define LAYOUT( \ + K64,K65,K66,K67,K68,K69,K6A,K6B,K6C,K6D,K6E,K76, \ + K01, K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K57,K58, K54,K46,K55, K5D,K5E,K5F, \ + K29,K02,K03,K04,K05,K06,K07,K08,K09,K0A,K0B,K0C,K0D,K7D,K0E, K71,K74,K77, K45,K7F,K37,K4A, \ + K0F,K10,K11,K12,K13,K14,K15,K16,K17,K18,K19,K1A,K1B, K2B, K72,K75,K78, K47,K48,K49,K4E, \ + K3A,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K28, K00,K1C, K4B,K4C,K4D,K7E, \ + K2A,K56,K2C,K2D,K2E,K2F,K30,K31,K32,K33,K34,K35, K73,K36, K60, K4F,K50,K51,K6F, \ + K1D,K5A,K38,K7B, K39, K79,K70,K7C,K5B,K5C,K7A, K61,K62,K63, K52,K53,K59 \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07 }, \ + { K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ + { K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27 }, \ + { K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \ + { K30, K31, K32, K33, K34, K35, K36, K37 }, \ + { K38, K39, K3A, K3B, K3C, K3D, K3E, K3F }, \ + { K40, K41, K42, K43, K44, K45, K46, K47 }, \ + { K48, K49, K4A, K4B, K4C, K4D, K4E, K4F }, \ + { K50, K51, K52, K53, K54, K55, K56, K57 }, \ + { K58, K59, K5A, K5B, K5C, K5D, K5E, K5F }, \ + { K60, K61, K62, K63, K64, K65, K66, K67 }, \ + { K68, K69, K6A, K6B, K6C, K6D, K6E, K6F }, \ + { K70, K71, K72, K73, K74, K75, K76, K77 }, \ + { K78, K79, K7A, K7B, K7C, K7D, K7E, K7F } \ +} diff --git a/tmk_core/protocol.mk b/tmk_core/protocol.mk index 54913329e69f..78b9deb2971d 100644 --- a/tmk_core/protocol.mk +++ b/tmk_core/protocol.mk @@ -50,5 +50,10 @@ ifdef ADB_MOUSE_ENABLE OPT_DEFS += -DADB_MOUSE_ENABLE -DMOUSE_ENABLE endif +ifdef XT_ENABLE + SRC += $(PROTOCOL_DIR)/xt_interrupt.c + OPT_DEFS += -DXT_ENABLE +endif + # Search Path VPATH += $(TMK_DIR)/protocol diff --git a/tmk_core/protocol/xt.h b/tmk_core/protocol/xt.h new file mode 100644 index 000000000000..93bc5daf8221 --- /dev/null +++ b/tmk_core/protocol/xt.h @@ -0,0 +1,71 @@ +/* +Copyright 2018 Jun WAKO +Copyright 2016 Ethan Apodaca + +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. +*/ + +#ifndef XT_H +#define XT_H + +#define XT_DATA_IN() do { \ + XT_DATA_DDR &= ~(1< +Copyright 2016 Ethan Apodaca + +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. +*/ + +#include +#include +#include +#include "xt.h" +#include "wait.h" +#include "print.h" + +static inline uint8_t pbuf_dequeue(void); +static inline void pbuf_enqueue(uint8_t data); +static inline bool pbuf_has_data(void); +static inline void pbuf_clear(void); + +void xt_host_init(void) +{ + XT_INT_INIT(); + XT_INT_OFF(); + + /* hard reset */ +#ifdef XT_RESET + XT_RESET(); +#endif + + /* soft reset: pull clock line down for 20ms */ + XT_DATA_LO(); + XT_CLOCK_LO(); + _delay_ms(20); + + /* input mode with pullup */ + XT_CLOCK_IN(); + XT_DATA_IN(); + + XT_INT_ON(); +} + +/* get data received by interrupt */ +uint8_t xt_host_recv(void) +{ + if (pbuf_has_data()) { + return pbuf_dequeue(); + } else { + return 0; + } +} + +ISR(XT_INT_VECT) +{ + /* + * XT signal format consits of 10 or 9 clocks and sends start bits and 8-bit data, + * which should be read on falling edge of clock. + * + * start(0), start(1), bit0, bit1, bit2, bit3, bit4, bit5, bit6, bit7 + * + * Original IBM XT keyboard sends start(0) bit while some of clones don't. + * Start(0) bit is read as low on data line while start(1) as high. + * + * https://github.com/tmk/tmk_keyboard/wiki/IBM-PC-XT-Keyboard-Protocol + */ + static enum { + START, BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7 + } state = START; + static uint8_t data = 0; + + uint8_t dbit = XT_DATA_READ(); + + // This is needed if using PCINT which can be called on both falling and rising edge + //if (XT_CLOCK_READ()) return; + + switch (state) { + case START: + // ignore start(0) bit + if (!dbit) return; + break; + case BIT0 ... BIT7: + data >>= 1; + if (dbit) + data |= 0x80; + break; + } + if (state++ == BIT7) { + pbuf_enqueue(data); + state = START; + data = 0; + } + return; +} + +/*-------------------------------------------------------------------- + * Ring buffer to store scan codes from keyboard + *------------------------------------------------------------------*/ +#define PBUF_SIZE 32 +static uint8_t pbuf[PBUF_SIZE]; +static uint8_t pbuf_head = 0; +static uint8_t pbuf_tail = 0; +static inline void pbuf_enqueue(uint8_t data) +{ + uint8_t sreg = SREG; + cli(); + uint8_t next = (pbuf_head + 1) % PBUF_SIZE; + if (next != pbuf_tail) { + pbuf[pbuf_head] = data; + pbuf_head = next; + } else { + print("pbuf: full\n"); + } + SREG = sreg; +} +static inline uint8_t pbuf_dequeue(void) +{ + uint8_t val = 0; + + uint8_t sreg = SREG; + cli(); + if (pbuf_head != pbuf_tail) { + val = pbuf[pbuf_tail]; + pbuf_tail = (pbuf_tail + 1) % PBUF_SIZE; + } + SREG = sreg; + + return val; +} +static inline bool pbuf_has_data(void) +{ + uint8_t sreg = SREG; + cli(); + bool has_data = (pbuf_head != pbuf_tail); + SREG = sreg; + return has_data; +} +static inline void pbuf_clear(void) +{ + uint8_t sreg = SREG; + cli(); + pbuf_head = pbuf_tail = 0; + SREG = sreg; +} From 352bef99a9a1dfe4c80d8b50677c7cbd8c78f87b Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Mon, 22 Oct 2018 12:58:23 -0700 Subject: [PATCH 244/505] Keyboard: JJ40 Refactor and Configurator support (#3197) * Deleted LAYOUTS = planck_grid from rules.mk * Refactor * Configurator support * Fixed offset layout matrix macro * Readded LAYOUT_kc_ortho_4x12 matrix alias * Refactor: rename LAYOUT_offset_right macro as LAYOUT_planck_1x2uR --- keyboards/jj40/info.json | 23 +++++++++ keyboards/jj40/jj40.h | 60 +++++++++++------------ keyboards/jj40/keymaps/cockpit/keymap.c | 8 +-- keyboards/jj40/keymaps/default/keymap.c | 6 +-- keyboards/jj40/keymaps/krusli/keymap.c | 35 ++++++++++--- keyboards/jj40/keymaps/oscillope/keymap.c | 13 ++--- keyboards/jj40/rules.mk | 2 +- 7 files changed, 92 insertions(+), 55 deletions(-) create mode 100644 keyboards/jj40/info.json diff --git a/keyboards/jj40/info.json b/keyboards/jj40/info.json new file mode 100644 index 000000000000..c6416ce16814 --- /dev/null +++ b/keyboards/jj40/info.json @@ -0,0 +1,23 @@ +{ + "keyboard_name": "jj40", + "url": "", + "maintainer": "qmk", + "width": 12, + "height": 4, + "layouts": { + "LAYOUT_planck_mit": { + "key_count": 47, + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3, "w":2}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}] + }, + + "LAYOUT_ortho_4x12": { + "key_count": 48, + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":6, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}] + }, + + "LAYOUT_planck_1x2uR": { + "key_count": 47, + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":6, "y":3, "w":2}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}] + } + } +} diff --git a/keyboards/jj40/jj40.h b/keyboards/jj40/jj40.h index bb7068fdc0f9..731f2ff455c0 100644 --- a/keyboards/jj40/jj40.h +++ b/keyboards/jj40/jj40.h @@ -25,7 +25,10 @@ along with this program. If not, see . void matrix_init_user(void); // TODO port this to other PS2AVRGB boards -#define KEYMAP_GRID( \ +#define XXX KC_NO + + +#define LAYOUT_ortho_4x12( \ K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, K012, \ K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, \ K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, \ @@ -34,61 +37,58 @@ void matrix_init_user(void); // TODO port this to other PS2AVRGB boards { \ { K012, K011, K010, K09, K05, K06, K07, K08, K04, K03, K02, K01 }, \ { K112, K111, K110, K19, K15, K16, K17, K18, K14, K13, K12, K11 }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX }, \ { K212, K211, K210, K29, K25, K26, K27, K28, K24, K23, K22, K21 }, \ { K312, K311, K310, K39, K35, K36, K37, K38, K34, K33, K32, K31 } \ } -#define KEYMAP_MIT( \ + +#define LAYOUT_planck_mit( \ K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, K012, \ K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, \ K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, \ K31, K32, K33, K34, K35, K3X, K38, K39, K310, K311, K312 \ ) \ { \ - { K012, K011, K010, K09, K05, K06, K07, K08, K04, K03, K02, K01 }, \ - { K112, K111, K110, K19, K15, K16, K17, K18, K14, K13, K12, K11 }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { K212, K211, K210, K29, K25, K26, K27, K28, K24, K23, K22, K21 }, \ - { K312, K311, K310, K39, K35, K3X, KC_NO, K38, K34, K33, K32, K31 } \ + { K012, K011, K010, K09, K05, K06, K07, K08, K04, K03, K02, K01 }, \ + { K112, K111, K110, K19, K15, K16, K17, K18, K14, K13, K12, K11 }, \ + { XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX }, \ + { K212, K211, K210, K29, K25, K26, K27, K28, K24, K23, K22, K21 }, \ + { K312, K311, K310, K39, K35, K3X, XXX, K38, K34, K33, K32, K31 } \ } -#define KEYMAP_OFFSET( \ + +#define LAYOUT_planck_1x2uR( \ K01, K02, K03, K04, K05, K06, K07, K08, K09, K010, K011, K012, \ K11, K12, K13, K14, K15, K16, K17, K18, K19, K110, K111, K112, \ K21, K22, K23, K24, K25, K26, K27, K28, K29, K210, K211, K212, \ K31, K32, K33, K34, K35, K36, K3X, K39, K310, K311, K312 \ ) \ { \ - { K012, K011, K010, K09, K05, K06, K07, K08, K04, K03, K02, K01 }, \ - { K112, K111, K110, K19, K15, K16, K17, K18, K14, K13, K12, K11 }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ - { K212, K211, K210, K29, K25, K26, K27, K28, K24, K23, K22, K21 }, \ - { K312, K311, K310, K39, K35, K36, K3X, KC_NO, K34, K33, K32, K31 } \ + { K012, K011, K010, K09, K05, K06, K07, K08, K04, K03, K02, K01 }, \ + { K112, K111, K110, K19, K15, K16, K17, K18, K14, K13, K12, K11 }, \ + { XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX, XXX }, \ + { K212, K211, K210, K29, K25, K26, K27, K28, K24, K23, K22, K21 }, \ + { K312, K311, K310, K39, K35, K36, K3X, XXX, K34, K33, K32, K31 } \ } -#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 \ + +#define LAYOUT_kc( \ + 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 \ ) \ - KEYMAP_GRID( \ + LAYOUT_ortho_4x12( \ 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_##k10, KC_##k11, KC_##k12, KC_##k13, KC_##k14, KC_##k15, 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_##k26, KC_##k27, KC_##k28, KC_##k29, KC_##k2a, KC_##k2b, \ - KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##k36, KC_##k37, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b \ - ) - - -#define KEYMAP KEYMAP_MIT + KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_##k35, KC_##k36, KC_##k37, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b \ +) -#define LAYOUT_ortho_4x12 KEYMAP_GRID -#define LAYOUT_2U_space KEYMAP_MIT -#define LAYOUT_planck_mit KEYMAP_MIT +#define LAYOUT LAYOUT_planck_mit -#define KC_LAYOUT_ortho_4x12 KC_KEYMAP -#define LAYOUT_kc_ortho_4x12 KC_KEYMAP +#define LAYOUT_kc_ortho_4x12 LAYOUT_kc #endif diff --git a/keyboards/jj40/keymaps/cockpit/keymap.c b/keyboards/jj40/keymaps/cockpit/keymap.c index 02deaaa8e3db..12ed62b6b55b 100644 --- a/keyboards/jj40/keymaps/cockpit/keymap.c +++ b/keyboards/jj40/keymaps/cockpit/keymap.c @@ -63,7 +63,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | Fn | GUI | Alt |Lower | Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ -[_QWERTY] = LAYOUT_2U_space( \ +[_QWERTY] = LAYOUT_planck_mit( \ KC_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ @@ -85,7 +85,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | | | Alt |Lower|| Space | | Home | PgDn | PgUp | End | * `-----------------------------------------------------------------------------------' */ -[_LOWER] = LAYOUT_2U_space( \ +[_LOWER] = LAYOUT_planck_mit( \ KC_GRV, LT_A_OG, LT_C_CA, LT_E_OG, LT_E_DO, LT_I_OG, LT_S_CA, LT_U_OG, LT_U_MA, LT_Z_CA, KC_MINS, KC_BSPC, \ KC_TAB, LT_EXLM, LT_AT, LT_HASH, LT_DLR, LT_PERC, LT_CIRC, LT_AMPR, LT_ASTR, KC_LPRN, KC_RPRN, KC_DEL , \ KC_LSFT, KC_PEQL, KC_PPLS, KC_PMNS, KC_PIPE, KC_LBRC, KC_RBRC, KC_LABK, KC_RABK, KC_LCBR, KC_RCBR, KC_INS , \ @@ -107,7 +107,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | | | Alt | | Space |Raise|| Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ -[_RAISE] = LAYOUT_2U_space( \ +[_RAISE] = LAYOUT_planck_mit( \ KC_GRV, LT_1, LT_2, LT_3, LT_4, LT_5, LT_6, LT_7, LT_8, LT_9, LT_0, KC_BSPC, \ KC_TAB, LT_4, LT_5, LT_6, _______, _______, _______, _______, _______, _______, _______, KC_BSLS, \ KC_LSFT, LT_7, LT_8, LT_9, LT_0, _______, _______, _______, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ @@ -130,7 +130,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl |||Fn||| Mode | Alt | | Space |MPrev |MStop |MNext |MPlay | Lock | * `-----------------------------------------------------------------------------------' */ -[_FUNC] = LAYOUT_2U_space( \ +[_FUNC] = LAYOUT_planck_mit( \ 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, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, BL_TOGG, BL_BRTG, BL_INC, _______, _______, _______, KC_VOLU, \ KC_LSFT, KC_CALC, RGB_HUD, RGB_SAD, RGB_VAD, KC_WBAK, KC_WFWD, BL_DEC, _______, _______, KC_PSCR, KC_VOLD, \ diff --git a/keyboards/jj40/keymaps/default/keymap.c b/keyboards/jj40/keymaps/default/keymap.c index 1db887bd01e4..d84b01b15a46 100644 --- a/keyboards/jj40/keymaps/default/keymap.c +++ b/keyboards/jj40/keymaps/default/keymap.c @@ -23,7 +23,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ -[_QWERTY] = LAYOUT_2U_space( \ +[_QWERTY] = LAYOUT_planck_mit( \ 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 , \ @@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ -[_LOWER] = LAYOUT_2U_space( \ +[_LOWER] = LAYOUT_planck_mit( \ 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),_______, _______, _______, \ @@ -59,7 +59,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ -[_RAISE] = LAYOUT_2U_space( \ +[_RAISE] = LAYOUT_planck_mit( \ 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, _______, _______, _______, \ diff --git a/keyboards/jj40/keymaps/krusli/keymap.c b/keyboards/jj40/keymaps/krusli/keymap.c index 6fea9d314eda..f996fbf35bcd 100644 --- a/keyboards/jj40/keymaps/krusli/keymap.c +++ b/keyboards/jj40/keymaps/krusli/keymap.c @@ -26,11 +26,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | Ctrl | GUI | Alt |Lower | Space |Raise | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ - [_QWERTY] = LAYOUT_2U_space( \ - 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_LCTL, KC_LGUI, KC_LALT, MO(_LOWER), KC_SPC, MO(_RAISE), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + + [_QWERTY] = LAYOUT_planck_mit( \ + 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 , \ + TO(_NUMPAD),KC_LCTL, KC_LGUI, KC_LALT, MO(_LOWER), KC_SPC, MO(_RAISE), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ ), /* Lower @@ -41,10 +42,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | | F7 | F8 | F9 | F10 | F11 | F12 | RGB | RGB | RGB | RGB |Enter | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | RGB | RGB | RGB | | | Next | Vol- | Vol+ | Play | | + * | | RGB | RGB | RGB | | | Next | Vol- | Vol+ | Play | | * `-----------------------------------------------------------------------------------' */ - [_LOWER] = LAYOUT_2U_space( \ + [_LOWER] = LAYOUT_planck_mit( \ 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, RGB_TOG, RGB_MOD, RGB_VAD, RGB_VAI, _______, \ @@ -62,10 +63,28 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | Prev | Play | Next | | | | Next | Vol- | Vol+ | Play | * `-----------------------------------------------------------------------------------' */ - [_RAISE] = LAYOUT_2U_space( \ + [_RAISE] = LAYOUT_planck_mit( \ 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_HOME, KC_END, KC_PGUP, KC_PGDN, _______, \ _______, KC_MRWD, KC_MPLY, KC_MNXT, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ), + + /* Numpad + * ,-----------------------------------------------------------------------------------. + * | Esc | 7 | 8 | 9 | * | / | | | | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | <-- | 4 | 5 | 6 | + | - | | | | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | 1 | 2 | 3 |Enter |Enter | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * |Qwerty| 0 | . | . |Enter | | | | | | | + * `-----------------------------------------------------------------------------------' + */ + [_NUMPAD] = LAYOUT_planck_mit( \ + KC_ESC, KC_P7, KC_P8, KC_P9, KC_PAST, KC_PSLS, _______, _______, _______, _______, _______, _______, \ + KC_BSPC, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_PMNS, _______, _______, _______, _______, _______, _______, \ + _______, KC_P1, KC_P2, KC_P3, KC_PENT, KC_PENT, _______, _______, _______, _______, _______, _______, \ + TO(_QWERTY),KC_P0, KC_PDOT, KC_PDOT, KC_PENT, _______, _______, _______, _______, _______, _______ \ ) }; diff --git a/keyboards/jj40/keymaps/oscillope/keymap.c b/keyboards/jj40/keymaps/oscillope/keymap.c index 8b30f52c8b70..1a42261940c0 100644 --- a/keyboards/jj40/keymaps/oscillope/keymap.c +++ b/keyboards/jj40/keymaps/oscillope/keymap.c @@ -17,11 +17,6 @@ along with this program. If not, see . #include QMK_KEYBOARD_H -#ifdef KEYMAP -#undef KEYMAP -#endif -#define KEYMAP KEYMAP_OFFSET - #define _QWERTY 0 #define _LOWER 1 #define _RAISE 2 @@ -51,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | OS | Alt |Lower |Shift |Raise | Space | Left | Down | Up |Right | * `-----------------------------------------------------------------------------------' */ -[_QWERTY] = KEYMAP( \ +[_QWERTY] = LAYOUT_planck_1x2uR( \ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, \ KC_GRV, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT, \ @@ -69,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | Lock | | | Prev | Stop | Play | Next | * `-----------------------------------------------------------------------------------' */ -[_LOWER] = KEYMAP( \ +[_LOWER] = LAYOUT_planck_1x2uR( \ 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, _______, _______, CC_PRN, CC_BRC, CC_CBR, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, _______, \ RESET, KC_WBAK, KC_WFWD, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, \ @@ -87,14 +82,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Ctrl | OS | Alt | |Shift | | 0 | Home | PgDn | PgUp | End | * `-----------------------------------------------------------------------------------' */ -[_RAISE] = KEYMAP( \ +[_RAISE] = LAYOUT_planck_1x2uR( \ KC_CAPS, KC_AMPR, KC_ASTR, KC_UNDS, KC_LPRN, KC_RPRN, KC_7, KC_8, KC_9, KC_EQL, KC_BSPC, KC_DEL, \ KC_TAB, KC_DLR, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_4, KC_5, KC_6, KC_MINS, KC_PLUS, _______, \ CC_ARRW, KC_EXLM, KC_AT, KC_HASH, KC_LCBR, KC_RCBR, KC_1, KC_2, KC_3, _______, KC_BSLS, KC_PIPE, \ _______, _______, _______, _______, _______, _______, KC_0, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ ), -[_NAV] = KEYMAP( \ +[_NAV] = LAYOUT_planck_1x2uR( \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ diff --git a/keyboards/jj40/rules.mk b/keyboards/jj40/rules.mk index 4e6f62617563..697e17a0141f 100644 --- a/keyboards/jj40/rules.mk +++ b/keyboards/jj40/rules.mk @@ -57,4 +57,4 @@ SRC = matrix.c i2c.c backlight.c # programming options PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex -LAYOUTS = ortho_4x12 planck_mit planck_grid +LAYOUTS = ortho_4x12 planck_mit From e7451448361b0d1490f74aae6dfe4f80e86ea1ca Mon Sep 17 00:00:00 2001 From: SpacebarRacecar <42380065+SpacebarRacecar@users.noreply.github.com> Date: Mon, 22 Oct 2018 22:22:20 +0200 Subject: [PATCH 245/505] Keyboard: Prime_O layout/matrix fix (#4205) --- .../primekb/prime_o/keymaps/default/keymap.c | 38 ++++++++----------- keyboards/primekb/prime_o/prime_o.h | 30 +++++++-------- 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/keyboards/primekb/prime_o/keymaps/default/keymap.c b/keyboards/primekb/prime_o/keymaps/default/keymap.c index f48e9e51ae9f..a2d9e807ccbb 100644 --- a/keyboards/primekb/prime_o/keymaps/default/keymap.c +++ b/keyboards/primekb/prime_o/keymaps/default/keymap.c @@ -15,6 +15,8 @@ */ #include QMK_KEYBOARD_H +#define L1BS LT(1, KC_BSPC) + // Defines the keycodes used by our macros in process_record_user enum custom_keycodes { QMKBEST = SAFE_RANGE, @@ -22,31 +24,21 @@ enum custom_keycodes { }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT( - KC_ENT, KC_P0, KC_LCTL, KC_LBRC, LT(1, KC_BSPC), KC_SPC, KC_MINS, KC_RGUI, - KC_ENT, KC_P2, KC_LSFT, KC_X, KC_V, KC_N, KC_COMM, KC_SLSH, - KC_PPLS, KC_P5, KC_TAB, KC_S, KC_F, KC_H, KC_K, KC_QUOT, - KC_PPLS, KC_P8, KC_PSCR, KC_W, KC_R, KC_Y, KC_I, KC_P, - KC_ESC, KC_PSLS, KC_NLCK, KC_2, KC_4, KC_6, KC_8, KC_0, - KC_PMNS, KC_PAST, KC_1, KC_3, KC_5, KC_7, KC_9, KC_DEL, - KC_P7, KC_P9, KC_Q, KC_E, KC_T, KC_U, KC_O, KC_BSLS, - KC_P4, KC_P6, KC_A, KC_D, KC_G, KC_J, KC_L, KC_ENT, - KC_P1, KC_P3, KC_Z, KC_C, KC_B, KC_M, KC_DOT, KC_LSFT, - KC_PDOT, KC_P0, KC_LALT, KC_RBRC, LT(1, KC_BSPC), KC_SPC, KC_EQL, KC_RCTL - ), + [0] = LAYOUT( + KC_ESC, KC_PMNS, KC_PSLS, KC_PAST, KC_NLCK, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_9, KC_DEL, + KC_PPLS, KC_P7, KC_P8, KC_P9, KC_PSCR, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, + KC_PPLS, KC_P4, KC_P5, KC_P6, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT,KC_ENT, + KC_ENT, KC_P1, KC_P2, KC_P3, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_LSFT, + KC_ENT, KC_PDOT, KC_P0, KC_P0, KC_LCTL, KC_LALT,KC_LBRC,KC_RBRC,L1BS, L1BS, KC_SPC, KC_SPC, KC_MINS,KC_EQL, KC_RGUI,KC_RCTL + ), [1] = LAYOUT( - BL_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_VOLD, KC_MUTE, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DOWN, KC_SCLN, - KC_TRNS, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, - KC_GRV, KC_F2, KC_F4, KC_F2, KC_F4, KC_F6, KC_F8, KC_F10, - KC_F1, KC_F3, KC_F1, KC_F3, KC_F5, KC_F7, KC_F9, KC_DEL, - KC_F11, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_RGHT, KC_VOLU, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, - BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_VOLU, KC_MUTE - ), + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL, + KC_TRNS, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_UP, KC_TRNS,KC_TRNS,KC_VOLU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CAPS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_LEFT,KC_DOWN,KC_RGHT,KC_SCLN,KC_VOLU, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_MUTE, + BL_TOGG, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_DEL, KC_DEL, KC_VOLD,KC_VOLU,KC_MUTE,KC_MUTE + ), }; diff --git a/keyboards/primekb/prime_o/prime_o.h b/keyboards/primekb/prime_o/prime_o.h index 1ec7277b0491..99a80545225e 100644 --- a/keyboards/primekb/prime_o/prime_o.h +++ b/keyboards/primekb/prime_o/prime_o.h @@ -19,22 +19,22 @@ #include "quantum.h" #define LAYOUT( \ - K000, K001, K002, K003, K004, K005, K006, K007, K010, K011, K012, K013, K014, K015, K016, K017, \ - K020, K021, K022, K023, K024, K025, K026, K027, K030, K031, K032, K033, K034, K035, K036, K037, \ - K040, K041, K042, K043, K044, K045, K046, K047, K050, K051, K052, K053, K054, K055, K056, K057, \ - K060, K061, K062, K063, K064, K065, K066, K067, K070, K071, K072, K073, K074, K075, K076, K077, \ - K080, K081, K082, K083, K084, K085, K086, K087, K090, K091, K092, K093, K094, K095, K096, K097 \ + K001, K008, K013, K018, K023, K029, K035, K041, K046, K052, K058, K064, K071, K076, K081, K086, \ + K002, K009, K014, K019, K024, K030, K036, K042, K047, K053, K059, K065, K072, K077, K082, K087, \ + K004, K010, K015, K020, K025, K031, K037, K043, K048, K054, K060, K066, K073, K078, K083, K089, \ + K005, K011, K016, K021, K026, K032, K038, K044, K049, K055, K061, K067, K074, K079, K084, K090, \ + K007, K012, K017, K022, K028, K034, K040, K045, K051, K057, K063, K069, K075, K080, K085, K092 \ ) { \ - { K000, K001, K002, K003, K004, K005, K006, K007 }, \ - { K010, K011, K012, K013, K014, K015, K016, K017 }, \ - { K020, K021, K022, K023, K024, K025, K026, K027 }, \ - { K030, K031, K032, K033, K034, K035, K036, K037 }, \ - { K040, K041, K042, K043, K044, K045, K046, K047 }, \ - { K050, K051, K052, K053, K054, K055, K056, K057 }, \ - { K060, K061, K062, K063, K064, K065, K066, K067 }, \ - { K070, K071, K072, K073, K074, K075, K076, K077 }, \ - { K080, K081, K082, K083, K084, K085, K086, K087 }, \ - { K090, K091, K092, K093, K094, K095, K096, K097 } \ + { K007, K017, K028, K040, K051, K063, K075, K085 }, \ + { K005, K016, K026, K038, K049, K061, K074, K084 }, \ + { K004, K015, K025, K037, K048, K060, K073, K083 }, \ + { K002, K014, K024, K036, K047, K059, K072, K082 }, \ + { K001, K013, K023, K035, K046, K058, K071, K081 }, \ + { K008, K018, K029, K041, K052, K064, K076, K086 }, \ + { K009, K019, K030, K042, K053, K065, K077, K087 }, \ + { K010, K020, K031, K043, K054, K066, K078, K089 }, \ + { K011, K021, K032, K044, K055, K067, K079, K090 }, \ + { K012, K022, K034, K045, K057, K069, K080, K092 } \ } #endif From 704a2e8d3c0bd15f6c8accd5a39fb88ca6c9e2d5 Mon Sep 17 00:00:00 2001 From: SpacebarRacecar <42380065+SpacebarRacecar@users.noreply.github.com> Date: Mon, 22 Oct 2018 22:23:22 +0200 Subject: [PATCH 246/505] Keymap: Updates to personal userspace and keymaps (#4206) * - updated personal userspace - updated fc660c, niu mini and planck keymaps - added prime_o keymap * Rename README.md to readme.md --- .../fc660c/keymaps/spacebarracecar/README.md | 4 - .../fc660c/keymaps/spacebarracecar/config.h | 11 +- .../fc660c/keymaps/spacebarracecar/keymap.c | 6 +- .../fc660c/keymaps/spacebarracecar/readme.md | 5 + .../niu_mini/keymaps/spacebarracecar/config.h | 1 + .../niu_mini/keymaps/spacebarracecar/keymap.c | 17 +- .../keymaps/spacebarracecar/readme.md | 6 +- .../planck/keymaps/spacebarracecar/config.h | 2 + .../planck/keymaps/spacebarracecar/keymap.c | 19 +- .../planck/keymaps/spacebarracecar/readme.md | 7 +- .../prime_o/keymaps/spacebarracecar/config.h | 1 + .../prime_o/keymaps/spacebarracecar/keymap.c | 286 ++++++++++++++++++ .../prime_o/keymaps/spacebarracecar/readme.md | 6 + .../prime_o/keymaps/spacebarracecar/rules.mk | 22 ++ users/spacebarracecar/spacebarracecar.c | 47 ++- users/spacebarracecar/spacebarracecar.h | 25 +- 16 files changed, 411 insertions(+), 54 deletions(-) delete mode 100644 keyboards/fc660c/keymaps/spacebarracecar/README.md create mode 100644 keyboards/fc660c/keymaps/spacebarracecar/readme.md create mode 100644 keyboards/primekb/prime_o/keymaps/spacebarracecar/config.h create mode 100644 keyboards/primekb/prime_o/keymaps/spacebarracecar/keymap.c create mode 100644 keyboards/primekb/prime_o/keymaps/spacebarracecar/readme.md create mode 100644 keyboards/primekb/prime_o/keymaps/spacebarracecar/rules.mk diff --git a/keyboards/fc660c/keymaps/spacebarracecar/README.md b/keyboards/fc660c/keymaps/spacebarracecar/README.md deleted file mode 100644 index 7d87ef8cf628..000000000000 --- a/keyboards/fc660c/keymaps/spacebarracecar/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# US International keymap for PCs with German set as input language - -This keymap emulates a US International layout including a deadkey layer on PCs that have German set as the input language. -This allows the use of the keyboard on any PC in Germany without the need of changing the input language. diff --git a/keyboards/fc660c/keymaps/spacebarracecar/config.h b/keyboards/fc660c/keymaps/spacebarracecar/config.h index 9c9b00656bd5..9d83a27000ef 100644 --- a/keyboards/fc660c/keymaps/spacebarracecar/config.h +++ b/keyboards/fc660c/keymaps/spacebarracecar/config.h @@ -1,9 +1,8 @@ #pragma once -// higher value means deeper actuation point, less sensitive -// be careful and only make small adjustments (steps of 1 or 2). -// too high and keys will fail to actuate. too low and keys will actuate spontaneously. -// test all keys before further adjustment. -// this should probably stay in the range +/-5. +/* +higher value means deeper actuation point, less sensitive +this should probably stay in the range +/-5. +*/ #undef ACTUATION_DEPTH_ADJUSTMENT -#define ACTUATION_DEPTH_ADJUSTMENT +2 +#define ACTUATION_DEPTH_ADJUSTMENT -1 diff --git a/keyboards/fc660c/keymaps/spacebarracecar/keymap.c b/keyboards/fc660c/keymaps/spacebarracecar/keymap.c index 2cbef10bbff9..760b83b9fb8d 100644 --- a/keyboards/fc660c/keymaps/spacebarracecar/keymap.c +++ b/keyboards/fc660c/keymaps/spacebarracecar/keymap.c @@ -28,11 +28,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______,KC_PGDN,KC_UP, KC_PGUP,KC_HOME,XXXXXXX,XXXXXXX,XXXXXXX,GUIU, XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX, CU_ESCT, _______,KC_LEFT,KC_DOWN,KC_RGHT,KC_END, XXXXXXX,XXXXXXX,GUIL, GUID, GUIR, XXXXXXX,XXXXXXX, KC_ENT, _______,KC_MPRV,KC_MPLY,KC_MNXT,KC_VOLD,KC_VOLU,KC_MUTE,XXXXXXX,XXXXXXX,XXXXXXX,XXXXXXX,_______, KC_PGUP, - RESET, _______,_______, _______, _______,_______,_______, KC_HOME,KC_PGDN,KC_END + RESET, _______,_______, KC_SPC, _______,_______,_______, KC_HOME,KC_PGDN,KC_END ) }; -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - return process_record_userspace(keycode, record); +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + return true; } diff --git a/keyboards/fc660c/keymaps/spacebarracecar/readme.md b/keyboards/fc660c/keymaps/spacebarracecar/readme.md new file mode 100644 index 000000000000..88c447e75c66 --- /dev/null +++ b/keyboards/fc660c/keymaps/spacebarracecar/readme.md @@ -0,0 +1,5 @@ +# SpacebarRacecar US-International FC660C Keymap for German PCs + +This keymap emulates most keys of the US-International layout on PCs that have German set as input language. +This allows the use of the keyboard on any PC in Germany without the need to change any settings. +The keymap is mostly based on the US-International layout. diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/config.h b/keyboards/niu_mini/keymaps/spacebarracecar/config.h index e69de29bb2d1..6f70f09beec2 100644 --- a/keyboards/niu_mini/keymaps/spacebarracecar/config.h +++ b/keyboards/niu_mini/keymaps/spacebarracecar/config.h @@ -0,0 +1 @@ +#pragma once diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c b/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c index b850e5fda755..c3f6fb09a106 100644 --- a/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c +++ b/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c @@ -12,7 +12,7 @@ enum layers { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Base Layer +/* Base ,-----------------------------------------------------------------------------------------------------------------------. |Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace| |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| @@ -68,7 +68,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -/* Dead-Key +/* Deadkey ,-----------------------------------------------------------------------------------------------------------------------. | | | | | | | |Ü | |Ö | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| @@ -87,15 +87,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, CU_DDQ, CU_DDQ, _______, _______, _______, _______, _______ ), -/* Nav +/* Navigation ,-----------------------------------------------------------------------------------------------------------------------. -|Caps Lock|PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | +|ESCT |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| | |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| | |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| | | | | | | | | | |RESET | | +|RESET | | | | | | | | | | |Game | `-----------------------------------------------------------------------------------------------------------------------' */ @@ -103,12 +103,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, RGB_M_P, KC_ENT, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, RGB_TOG, RGB_MOD, RGB_HUI, CU_RGBV, _______, - RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CU_GAME + RESET, _______, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME ) }; -bool process_record_user(uint16_t keycode, keyrecord_t *record) { +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case MO(_LOWER): if (game){ @@ -121,6 +121,7 @@ switch (keycode) { } else { return true; } + default: + return true; } - return process_record_userspace(keycode, record); } diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/readme.md b/keyboards/niu_mini/keymaps/spacebarracecar/readme.md index 88d72218696a..96727438167b 100644 --- a/keyboards/niu_mini/keymaps/spacebarracecar/readme.md +++ b/keyboards/niu_mini/keymaps/spacebarracecar/readme.md @@ -1,3 +1,5 @@ -# US-International like Niu Mini layout for PCs with German set as input language +# SpacebarRacecar US-International NIU Mini Keymap for German PCs -This layout aims to provide a US-International like layout for PCs that have German set as Input Language. This is useful for users living in germany, because it enables the use of the Niu Mini on any pc without having to switch the input language. It's mostly based on the Planck default layout, but adds essential features for german input, like a dead key layer to access ä, ö, ü. +This keymap emulates most keys of the US-International layout on PCs that have German set as input language. +This allows the use of the keyboard on any PC in Germany without the need to change any settings. +The keymap is mostly based on the Planck default layout but adds essential features for german input, like access to Ä, Ö, Ü, ß. diff --git a/keyboards/planck/keymaps/spacebarracecar/config.h b/keyboards/planck/keymaps/spacebarracecar/config.h index 9b55fa93aaa3..4f48857fe57d 100644 --- a/keyboards/planck/keymaps/spacebarracecar/config.h +++ b/keyboards/planck/keymaps/spacebarracecar/config.h @@ -1,3 +1,5 @@ +#pragma once + #ifdef AUDIO_ENABLE #define STARTUP_SONG SONG(NO_SOUND) #endif diff --git a/keyboards/planck/keymaps/spacebarracecar/keymap.c b/keyboards/planck/keymaps/spacebarracecar/keymap.c index 705f78f8eaa6..db91231bf720 100644 --- a/keyboards/planck/keymaps/spacebarracecar/keymap.c +++ b/keyboards/planck/keymaps/spacebarracecar/keymap.c @@ -13,7 +13,7 @@ enum layers { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* Base Layer +/* Base ,-----------------------------------------------------------------------------------------------------------------------. |Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace| |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| @@ -76,7 +76,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LALT, KC_LGUI, KC_DOWN, KC_UP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MU_MOD, MU_OFF ), -/* Dead-Key +/* Deadkey ,-----------------------------------------------------------------------------------------------------------------------. | | | | | | | |Ü | |Ö | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| @@ -92,18 +92,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, KC_BSPC, CU_NAV, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, CU_LSFT, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_RSFT, - KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL + KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, CU_DDQ, CU_DDQ, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL ), -/* Nav +/* Navigation ,-----------------------------------------------------------------------------------------------------------------------. -|Caps Lock|PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | +|ESCT |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| | |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| | |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| | | | | | | | | | |RESET | | +|RESET | | | | | | | | | | |Game | `-----------------------------------------------------------------------------------------------------------------------' */ @@ -111,12 +111,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, MU_ON, XXXXXXX, XXXXXXX, XXXXXXX, _______, - RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, CU_GAME + RESET, _______, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME ) }; -bool process_record_user(uint16_t keycode, keyrecord_t *record) { +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case MO(_LOWER): if (game){ @@ -143,6 +143,7 @@ switch (keycode) { layer_off(_MUSICMODE); } return true; + default: + return true; } - return process_record_userspace(keycode, record); } diff --git a/keyboards/planck/keymaps/spacebarracecar/readme.md b/keyboards/planck/keymaps/spacebarracecar/readme.md index daa9c4ad2b04..c8e8134caa38 100644 --- a/keyboards/planck/keymaps/spacebarracecar/readme.md +++ b/keyboards/planck/keymaps/spacebarracecar/readme.md @@ -1,4 +1,5 @@ -# US-International like Planck layout for PCs with German set as input language - -This layout aims to provide a US-International like layout for PCs that have German set as Input Language. This is useful for users living in germany, because it enables the use of the planck on any pc without having to switch the input language. It's mostly based on the Planck default layout, but adds essential features for german input, like a dead key layer to access ä, ö, ü. +# SpacebarRacecar US-International Planck Keymap for German PCs +This keymap emulates most keys of the US-International layout on PCs that have German set as input language. +This allows the use of the keyboard on any PC in Germany without the need to change any settings. +The keymap is mostly based on the Planck default layout but adds essential features for german input, like access to Ä, Ö, Ü, ß. diff --git a/keyboards/primekb/prime_o/keymaps/spacebarracecar/config.h b/keyboards/primekb/prime_o/keymaps/spacebarracecar/config.h new file mode 100644 index 000000000000..6f70f09beec2 --- /dev/null +++ b/keyboards/primekb/prime_o/keymaps/spacebarracecar/config.h @@ -0,0 +1 @@ +#pragma once diff --git a/keyboards/primekb/prime_o/keymaps/spacebarracecar/keymap.c b/keyboards/primekb/prime_o/keymaps/spacebarracecar/keymap.c new file mode 100644 index 000000000000..d38ff0d1d601 --- /dev/null +++ b/keyboards/primekb/prime_o/keymaps/spacebarracecar/keymap.c @@ -0,0 +1,286 @@ +#include QMK_KEYBOARD_H +#include "spacebarracecar.h" + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +#define LEFTNUM + +enum layers { + _BASE, + _LOWER, + _RAISE, + _GAME = _NAV+1 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +#ifndef LEFTNUM +/* Base +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |\ |Numlock |/ |* |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace|7 |8 |9 |- | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Esc/Nav |A |S |D |F |G |H |J |K |L |; |' |4 |5 |6 |+ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|(/LShift |Y |X |C |V |B |N |M |, |. |/ |)/RShift |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|RCtrl | |Alt |Win |Lower |Space |Enter |Raise |Win |AltGr | |LCtrl |00 |0 |. |Tab | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_BASE] = LAYOUT( + CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, CU_BSLS, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, KC_P7, KC_P8, KC_P9, KC_PPLS, + CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, KC_P4, KC_P5, KC_P6, KC_PEQL, + CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_P00, KC_P0, KC_PDOT, KC_TAB +), + +/* Lower +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |Numlock |/ |* |- | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|~ |! |" |# |$ |% |^ |& |* |( |) | |7 |8 |9 |+ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |@ |Strg+X |Strg+C |Strg+V | | |_ |+ |{ |} || |4 |5 |6 |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |? | | | | | | | | | | |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | |00 |0 |. |Tab | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_LOWER] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, _______, _______, _______, _______, + _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, _______, _______, _______, _______, + _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Raise +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |Numlock |/ |* |- | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |7 |8 |9 |+ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F1 |F2 |F3 |F4 |F5 |F6 |- |= |[ |] |\ |4 |5 |6 |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F7 |F8 |F9 |F10 |F11 |F12 | | | | | |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | |00 |0 |. |Tab | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_RAISE] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, _______, _______, _______, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, _______, _______, _______, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Deadkey +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +| | | | | | | | | | | | |Numlock |/ |* |- | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | |Ü | |Ö | | |7 |8 |9 |+ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Ä |ß | | | | | | | | | |4 |5 |6 |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | |" |" | | | | | |00 |0 |. |Tab | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_DEADKEY] = LAYOUT( + CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, + KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, _______, _______, _______, _______, _______, + _______, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, _______, _______, _______, _______, + _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, CU_DDQ, CU_DDQ, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Navigation +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|Escape | | | | | | | | | | | |Numlock |/ |* |- | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|ESCT |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del |7 |8 |9 |+ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter |4 |5 |6 |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|RESET | | | | | | | | | | |Game |00 |0 |. |Tab | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_NAV] = LAYOUT( + KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, + CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, _______, _______, _______, _______, + _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, _______, _______, _______, _______, + _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, + RESET, _______, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME, _______, _______, _______, _______ +), + +// Can be used to place macros on the numpad +[_GAME] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) +#endif + +#ifdef LEFTNUM +/* Base +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|- |* |/ |Numlock |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |\ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|+ |7 |8 |9 |Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace| +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|= |4 |5 |6 |Esc/Nav |A |S |D |F |G |H |J |K |L |; |' | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Enter |1 |2 |3 |(/LShift |Y |X |C |V |B |N |M |, |. |/ |)/RShift | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Backspace|. |0 |00 |RCtrl | |Alt |Win |Lower |Space |Enter |Raise |Win |AltGr | |LCtrl | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_BASE] = LAYOUT( + KC_PMNS, KC_PAST, KC_PSLS, KC_NLCK, CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, CU_BSLS, + KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, + KC_PEQL, KC_P4, KC_P5, KC_P6, CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, + KC_PENT, KC_P1, KC_P2, KC_P3, CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, + KC_BSPC, KC_PDOT, KC_P0, KC_P00, KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL +), + +/* Lower +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|- |* |/ |Numlock |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|+ |7 |8 |9 |~ |! |" |# |$ |% |^ |& |* |( |) | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|= |4 |5 |6 | |@ |Strg+X |Strg+C |Strg+V | | |_ |+ |{ |} || | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Enter |1 |2 |3 | |? | | | | | | | | | | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Backspace|. |0 |00 | | | | | | | | | | | | | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_LOWER] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, + _______, _______, _______, _______, _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, + _______, _______, _______, _______, _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Raise +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|- |* |/ |Numlock |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|+ |7 |8 |9 |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|= |4 |5 |6 | |F1 |F2 |F3 |F4 |F5 |F6 |- |= |[ |] |\ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Enter |1 |2 |3 | |F7 |F8 |F9 |F10 |F11 |F12 | | | | | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Backspace|. |0 |00 | | | | | | | | | | | | | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_RAISE] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, + _______, _______, _______, _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, + _______, _______, _______, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Deadkey +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|- |* |/ |Numlock | | | | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|+ |7 |8 |9 | | | | | | | |Ü | |Ö | | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|= |4 |5 |6 | |Ä |ß | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Enter |1 |2 |3 | | | | | | | | | | | | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Backspace|. |0 |00 | | | | | |" |" | | | | | | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_DEADKEY] = LAYOUT( + _______, _______, _______, _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, + _______, _______, _______, _______, KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, _______, + _______, _______, _______, _______, _______, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, + _______, _______, _______, _______, _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, CU_DDQ, CU_DDQ, _______, _______, _______, _______, _______ +), + +/* Navigation +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|- |* |/ |Numlock |Escape | | | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|+ |7 |8 |9 |ESCT |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|= |4 |5 |6 | |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Enter |1 |2 |3 | |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Backspace|. |0 |00 |RESET | | | | | | | | | | |Game | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_NAV] = LAYOUT( + _______, _______, _______, _______, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, _______, _______, _______, CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, + _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, + _______, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + _______, _______, _______, _______, RESET, _______, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME +), + +// Can be used to place macros on the numpad +[_GAME] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) +#endif + +}; + +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { +switch (keycode) { + case MO(_LOWER): + if (game){ + if(record->event.pressed) { + register_code(KC_SPC); + } else { + unregister_code(KC_SPC); + } + return false; + } else { + return true; + } + case CU_GAME: + if(record->event.pressed) { + if (game) + layer_on(_GAME); + else + layer_off(_GAME); + } + return false; + default: + return true; + } +} diff --git a/keyboards/primekb/prime_o/keymaps/spacebarracecar/readme.md b/keyboards/primekb/prime_o/keymaps/spacebarracecar/readme.md new file mode 100644 index 000000000000..eb8da3fa78f3 --- /dev/null +++ b/keyboards/primekb/prime_o/keymaps/spacebarracecar/readme.md @@ -0,0 +1,6 @@ +# SpacebarRacecar US-International Prime_O Keymap for German PCs + +This keymap emulates most keys of the US-International layout on PCs that have German set as input language. +This allows the use of the keyboard on any PC in Germany without the need to change any settings. +The keymap is mostly based on the Planck default layout but adds essential features for german input, like access to Ä, Ö, Ü, ß. +Righthand Numpad is enabled by default, enable lefthand Numpad with #define LEFTNUM. diff --git a/keyboards/primekb/prime_o/keymaps/spacebarracecar/rules.mk b/keyboards/primekb/prime_o/keymaps/spacebarracecar/rules.mk new file mode 100644 index 000000000000..f50334d5ec67 --- /dev/null +++ b/keyboards/primekb/prime_o/keymaps/spacebarracecar/rules.mk @@ -0,0 +1,22 @@ +# 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 +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 + +# Userspace defines +GERMAN_ENABLE = yes # Enable Custom US Ansi Keycodes for PC with German set as input language diff --git a/users/spacebarracecar/spacebarracecar.c b/users/spacebarracecar/spacebarracecar.c index 404331f8dfee..f7048869ed33 100644 --- a/users/spacebarracecar/spacebarracecar.c +++ b/users/spacebarracecar/spacebarracecar.c @@ -1,18 +1,29 @@ #include "spacebarracecar.h" #ifdef GERMAN_ENABLE +// These indicate if left and right shift are physically pressed bool lshift = false; bool rshift = false; + +// Interrupt and times for space cadet shift bool lshiftp = false; bool rshiftp = false; uint16_t lshift_timer = 0; uint16_t rshift_timer = 0; +// Number of items that are saved in prev_kcs uint8_t prev_indx = 0; +// Used to save the last 6 actual keycodes activated by frankenkeycodes uint16_t prev_kcs[6] = {0, 0, 0, 0, 0, 0}; +// If true the deadkey characters grave and circonflexe are not automatically escaped bool esct = false; +/* +Used to add a keycode to a prev_kcs to remember it. +When full the last code gets discarded and replaced by +the new one. +*/ void add_to_prev(uint16_t kc){ for (int i=0; ievent.pressed) { + timer_timeout(); game = !game; } - return false; + // allows keymap to execute further commands when CU_GAME is pressed, for example enabling a macro layer + return process_record_keymap(keycode, record) && false; case KC_LGUI: case KC_RGUI: + if (record->event.pressed) + timer_timeout(); if (game) return false; else @@ -77,11 +102,21 @@ bool process_record_userspace(uint16_t keycode, keyrecord_t *record) { } layer_off(_NAV); } - return false; + return false; + case KC_P00: + if(record->event.pressed) { + timer_timeout(); + register_code(KC_P0); + unregister_code(KC_P0); + register_code(KC_P0); + unregister_code(KC_P0); + } + return false; #ifdef RGBLIGHT_ENABLE case CU_RGBV: if(record->event.pressed) { + timer_timeout(); if (rgblight_get_val()+32>255) rgblight_sethsv(rgblight_get_hue(), rgblight_get_sat(), 31); else @@ -133,6 +168,7 @@ bool process_record_userspace(uint16_t keycode, keyrecord_t *record) { return false; case CU_ESCT: if(record->event.pressed) { + timer_timeout(); esct = !esct; } return false; @@ -282,6 +318,7 @@ bool process_record_userspace(uint16_t keycode, keyrecord_t *record) { case KC_LCTL: case KC_RCTL: if(!record->event.pressed) { + timer_timeout(); unregister_code(KC_Z); unregister_code(KC_Y); } @@ -300,6 +337,6 @@ bool process_record_userspace(uint16_t keycode, keyrecord_t *record) { #endif } - return true; + return process_record_keymap(keycode, record); } } diff --git a/users/spacebarracecar/spacebarracecar.h b/users/spacebarracecar/spacebarracecar.h index 42879d2efb24..1e18253510cb 100644 --- a/users/spacebarracecar/spacebarracecar.h +++ b/users/spacebarracecar/spacebarracecar.h @@ -4,13 +4,14 @@ #include "keymap_german.h" enum userspace_layers { - _DEADKEY = 14, //change if more than 16 layers are required + _DEADKEY = 14, // Change if more than 16 layers are required _NAV }; enum userspace_custom_keycodes { CU_GAME = SAFE_RANGE, // Toggle game mode on/off CU_NAV, // NAV | ESC + KC_P00, // Numpad double zero #ifdef GERMAN_ENABLE CU_LSFT, // LSFT | ( @@ -52,10 +53,8 @@ enum userspace_custom_keycodes { }; #ifdef GERMAN_ENABLE -// these save the current shift status extern bool lshift; extern bool rshift; -// stuff for custom space cadet shift extern bool lshiftp; extern bool rshiftp; extern uint16_t lshift_timer; @@ -63,14 +62,12 @@ extern uint16_t rshift_timer; extern uint8_t prev_indx; extern uint16_t prev_kcs[6]; - void add_to_prev(uint16_t kc); void unreg_prev(void); extern bool esct; #endif -// stuff for nav esc extern bool navesc; extern uint16_t navesc_timer; @@ -78,7 +75,7 @@ extern bool game; void timer_timeout(void); -bool process_record_userspace(uint16_t keycode, keyrecord_t *record); +bool process_record_keymap(uint16_t keycode, keyrecord_t *record); #define CTRLX LCTL(KC_X) #define CTRLC LCTL(KC_C) @@ -89,9 +86,9 @@ bool process_record_userspace(uint16_t keycode, keyrecord_t *record); #define GUIL LGUI(KC_LEFT) #define GUIR RGUI(KC_RIGHT) -// -// Templates for Keys, with custom shifted and non shifted Characters -// +/* +Templates for Keys, with custom shifted and non shifted Characters +*/ // Normal shift status #define SHIFT_NORM(kc1, kc2) \ @@ -139,7 +136,7 @@ if (record->event.pressed) { \ } \ return false; -// All shift +// Always shifted #define SHIFT_ALL(kc1, kc2) \ if (record->event.pressed) { \ timer_timeout(); \ @@ -164,7 +161,7 @@ if (record->event.pressed) { \ } \ return false; -// All no shift +// Never shifted #define SHIFT_NO(kc1, kc2) \ if (record->event.pressed) { \ timer_timeout(); \ @@ -188,7 +185,7 @@ if (record->event.pressed) { \ } \ return false; -// All algr +// Always AltGr #define SHIFT_ALGR(kc1, kc2) \ if (record->event.pressed) { \ timer_timeout(); \ @@ -208,7 +205,7 @@ if (record->event.pressed) { \ } \ return false; -// Different keycode for ctrl +// Different keycode when Ctrl is pressed #define CTRL(kc1, kc2) \ if(record->event.pressed) { \ timer_timeout(); \ @@ -227,7 +224,7 @@ if(record->event.pressed) { \ } \ return false; -// Umlaute for deadkey layer +// Template for keys on deadkey layer (mostly Umlaute) #define UML(kc) \ if(record->event.pressed) { \ timer_timeout(); \ From ca56c2145f25ab04daa6bb96f31b948be9e57ef2 Mon Sep 17 00:00:00 2001 From: skullY Date: Tue, 9 Oct 2018 09:40:10 -0700 Subject: [PATCH 247/505] Fold install_dependencies.sh into linux_install.sh and freebsd_install.sh --- util/freebsd_install.sh | 18 ++++++ util/install_dependencies.sh | 118 ----------------------------------- util/linux_install.sh | 116 +++++++++++++++++++++++++--------- util/qmk_install.sh | 13 ++-- 4 files changed, 114 insertions(+), 151 deletions(-) create mode 100644 util/freebsd_install.sh delete mode 100755 util/install_dependencies.sh diff --git a/util/freebsd_install.sh b/util/freebsd_install.sh new file mode 100644 index 000000000000..25ea80a7fcb5 --- /dev/null +++ b/util/freebsd_install.sh @@ -0,0 +1,18 @@ +#!/bin/sh +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 diff --git a/util/install_dependencies.sh b/util/install_dependencies.sh deleted file mode 100755 index 227c86f87fb3..000000000000 --- a/util/install_dependencies.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env bash -# This script will attempt to setup the Linux dependencies for compiling QMK/TMK - -# This could probably go much lower, but since we are including an Arch vagrant, -# making it the first match makes sense - -if [[ -n "$(type -P pacman )" ]]; then - # Arch linux and derivatives like Apricity - # Future improvements: - # Allow user to speed up package installs using powerpill/wget tweaks - # Always run the pacman mirror update script if possible when vagrant comes up - # This will ensure that users never get stalled on a horribly slow mirror - pacman -Syyu --needed --noconfirm - pacman -S --needed --noconfirm \ - base-devel \ - avr-gcc \ - avr-binutils \ - avr-libc \ - dfu-util \ - arm-none-eabi-gcc \ - arm-none-eabi-binutils \ - arm-none-eabi-newlib \ - git \ - diffutils - -elif [[ -n "$(type -P apt-get)" ]]; then - # Debian and derivatives - # This block performs completely non-interactive updates {{ - export DEBIAN_FRONTEND=noninteractive - export DEBCONF_NONINTERACTIVE_SEEN=true - echo "grub-pc hold" | dpkg --set-selections - apt-get -y update - apt-get -y --allow-unauthenticated upgrade \ - -o Dpkg::Options::="--force-confdef" \ - -o Dpkg::Options::="--force-confold" - # }} - apt-get install -y \ - build-essential \ - gcc \ - unzip \ - wget \ - zip \ - gcc-avr \ - binutils-avr \ - avr-libc \ - dfu-programmer \ - dfu-util \ - gcc-arm-none-eabi \ - binutils-arm-none-eabi \ - libnewlib-arm-none-eabi \ - git \ - diffutils - -elif [[ -n "$(type -P yum)" ]]; then - # Fedora, CentOS or RHEL and derivatives - yum -y makecache && yum -y update - yum -y install \ - gcc \ - glibc-headers \ - kernel-devel \ - kernel-headers \ - make \ - perl \ - git \ - wget \ - avr-binutils \ - avr-gcc \ - avr-libc \ - dfu-programmer \ - dfu-util \ - arm-none-eabi-gcc-cs \ - arm-none-eabi-newlib \ - git \ - diffutils - # The listed eabi pacackes do unfortunately not exist for CentOS, - # But at least in Fedora they do, so try to install them anyway - # TODO: Build them from sources, if the installation fails - -elif [[ -n "$(type -P zypper)" ]]; then - # openSUSE - zypper --non-interactive refresh && zypper --non-interactive update - zypper --non-interactive install \ - git \ - make \ - gcc \ - kernel-devel \ - patch \ - wget \ - dfu-programmer \ - git \ - diffutils - # 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 -elif [[ -n "$(type -P emerge)" ]]; then - echo 'Please check that your gcc is built with the multilib use flag enabled.' - emerge -vq sys-devel/crossdev - USE="-openmp -hardened -sanitize -vtv" crossdev -s4 --stable --g =4.9.4 --portage --verbose --target avr -fi diff --git a/util/linux_install.sh b/util/linux_install.sh index 0e4e26fd96a7..a6a053276843 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -1,40 +1,100 @@ #!/bin/sh -if grep ID /etc/os-release | grep -qE "rhel|fedora"; then - # RPM based OS - sudo dnf install gcc unzip wget zip dfu-util dfu-programmer avr-gcc \ - avr-libc binutils-avr32-linux-gnu arm-none-eabi-gcc-cs \ - arm-none-eabi-binutils-cs arm-none-eabi-newlib + +# Note: This file uses tabs to indent. Please don't mix tabs and spaces. + +GENTOO_WARNING="This script will make a USE change in order to ensure that that QMK works on your system. All changes will be sent to the the file /etc/portage/package.use/qmk_firmware -- please review it, and read Portage's output carefully before installing any packages on your system. You will also need to ensure that your kernel is compiled with support for the keyboard chip that you are using (e.g. enable Arduino for the Pro Micro). Further information can be found on the Gentoo wiki." + +if grep ID /etc/os-release | grep -qE "fedora"; then + sudo dnf install \ + arm-none-eabi-binutils-cs \ + arm-none-eabi-gcc-cs \ + arm-none-eabi-newlib + avr-binutils \ + avr-gcc \ + avr-libc \ + binutils-avr32-linux-gnu \ + dfu-util \ + dfu-programmer \ + diffutils \ + git \ + gcc \ + glibc-headers \ + kernel-devel \ + kernel-headers \ + make \ + perl \ + unzip \ + wget \ + zip + elif grep ID /etc/os-release | grep -qE 'debian|ubuntu'; then + DEBIAN_FRONTEND=noninteractive + DEBCONF_NONINTERACTIVE_SEEN=true + export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN sudo apt-get update - sudo apt-get install gcc unzip wget zip gcc-avr binutils-avr avr-libc \ - dfu-programmer dfu-util gcc-arm-none-eabi binutils-arm-none-eabi \ - libnewlib-arm-none-eabi + sudo apt-get install \ + build-essential \ + avr-libc \ + binutils-arm-none-eabi \ + binutils-avr \ + dfu-programmer \ + dfu-util \ + diffutils \ + gcc \ + gcc-arm-none-eabi \ + gcc-avr \ + git \ + libnewlib-arm-none-eabi \ + unzip \ + wget \ + zip + elif grep ID /etc/os-release | grep -q 'arch\|manjaro'; then - # install avr-gcc 8.1 until 8.3 is available. See #3657 for details of the bug. - sudo pacman -U https://archive.archlinux.org/packages/a/avr-gcc/avr-gcc-8.1.0-1-x86_64.pkg.tar.xz - sudo pacman -S gcc unzip wget zip avr-binutils avr-libc \ - dfu-util arm-none-eabi-gcc arm-none-eabi-binutils \ - arm-none-eabi-newlib + # install avr-gcc 8.1 until 8.3 is available. See #3657 for details of the bug. + sudo pacman -U https://archive.archlinux.org/packages/a/avr-gcc/avr-gcc-8.1.0-1-x86_64.pkg.tar.xz + sudo pacman -S \ + arm-none-eabi-binutils \ + arm-none-eabi-gcc \ + arm-none-eabi-newlib \ + avr-binutils \ + avr-libc \ + avr-gcc \ + base-devel \ + dfu-util \ + diff-utils \ + gcc \ + git \ + unzip \ + wget \ + zip git clone https://aur.archlinux.org/dfu-programmer.git /tmp/dfu-programmer cd /tmp/dfu-programmer makepkg -sic rm -rf /tmp/dfu-programmer/ + elif grep ID /etc/os-release | grep -q gentoo; then - echo "This script will make a USE change in order to ensure that that QMK works on your system. All changes will be sent to the the file /etc/portage/package.use/qmk_firmware -- please review it, and read Portage's output carefully before installing any packages on your system. You will also need to ensure that your kernel is compiled with support for the keyboard chip that you are using (e.g. enable Arduino for the Pro Micro). Further information can be found on the Gentoo wiki." - echo -n "Proceed (y/N)? " - old_stty_cfg=$(stty -g) - stty raw -echo - answer=$( while ! head -c 1 | grep -i '[ny]' ;do true ;done ) - stty $old_stty_cfg - if echo "$answer" | grep -iq "^y" ;then - sudo touch /etc/portage/package.use/qmkfirmware - echo "sys-devel/gcc multilib" | sudo tee --append /etc/portage/package.use/qmkfirmware > /dev/null - sudo emerge -auN sys-devel/gcc app-arch/unzip app-arch/zip net-misc/wget app-mobilephone/dfu-util sys-devel/crossdev dev-embedded/avrdude - sudo crossdev -s4 --stable --g =4.9.4 --portage --verbose --target avr - echo Done! - else - echo "Quitting..." -fi + echo GENTOO_WARNING | fmt + echo -n "Proceed (y/N)? " + old_stty_cfg=$(stty -g) + stty raw -echo + answer=$( while ! head -c 1 | grep -i '[ny]' ;do true ;done ) + stty $old_stty_cfg + if echo "$answer" | grep -iq "^y" ;then + sudo touch /etc/portage/package.use/qmkfirmware + echo "sys-devel/gcc multilib" | sudo tee --append /etc/portage/package.use/qmkfirmware > /dev/null + sudo emerge -auN \ + app-arch/unzip \ + app-arch/zip \ + app-mobilephone/dfu-util \ + net-misc/wget \ + sys-devel/gcc \ + sys-devel/crossdev dev-embedded/avrdude + sudo crossdev -s4 --stable --g =4.9.4 --portage --verbose --target avr + echo Done! + else + echo "Quitting..." + fi + else echo "Sorry, we don't recognize your OS. Help us by contributing support!" echo diff --git a/util/qmk_install.sh b/util/qmk_install.sh index 6f35e4c71b9f..76ecf5fc01da 100755 --- a/util/qmk_install.sh +++ b/util/qmk_install.sh @@ -7,16 +7,19 @@ case $(uname -a) in *Darwin*) exec "${util_dir}/macos_install.sh" ;; - *Linux*Microsoft*) + *Linux*Microsoft*) exec "${util_dir}/wsl_install.sh" - ;; + ;; + *FreeBSD*) + exec "${util_dir}/freebsd_install.sh" + ;; *Linux*) exec "${util_dir}/linux_install.sh" ;; MSYS_NT*|MINGW64_NT*|MINGW32_NT*) exec "${util_dir}/msys2_install.sh" ;; - *) - echo "Environment not supported. Please see https://docs.qmk.fm for details on how to configure the QMK Firmware build tools manually." - ;; + *) + echo "Environment not supported. Please see https://docs.qmk.fm for details on how to configure the QMK Firmware build tools manually." + ;; esac From 79d495f51dd0d49a4e0ba84f3bcec588dba498b5 Mon Sep 17 00:00:00 2001 From: skullY Date: Tue, 9 Oct 2018 10:21:13 -0700 Subject: [PATCH 248/505] Add opensuse packages provided by @isolatedvirus --- util/linux_install.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/util/linux_install.sh b/util/linux_install.sh index a6a053276843..5186e31f2bf6 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -95,6 +95,20 @@ elif grep ID /etc/os-release | grep -q gentoo; then echo "Quitting..." fi +elif grep ID /etc/os-release | grep -qE "opensuse|tumbleweed"; then + sudo zypper install \ + avr-libc \ + cross-avr-gcc8 \ + cross-avr-binutils \ + cross-arm-none-newlib-devel \ + cross-arm-binutils cross-arm-none-newlib-devel \ + dfu-tool \ + dfu-programmer \ + gcc \ + unzip \ + wget \ + zip + else echo "Sorry, we don't recognize your OS. Help us by contributing support!" echo From 11c4c711310d297a378f029b7ffa1409d5a04dbc Mon Sep 17 00:00:00 2001 From: skullY Date: Tue, 9 Oct 2018 11:35:31 -0700 Subject: [PATCH 249/505] Fixup the WSL install --- util/win_shared_install.sh | 3 --- util/wsl_install.sh | 7 +------ 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/util/win_shared_install.sh b/util/win_shared_install.sh index f24ec08e8ecc..c7517881eee7 100644 --- a/util/win_shared_install.sh +++ b/util/win_shared_install.sh @@ -18,11 +18,8 @@ function install_utils { wget 'https://www.pjrc.com/teensy/teensy_loader_cli_windows.zip' unzip teensy_loader_cli_windows.zip - # This URL has changed and I can't find the new location. Commenting out until we figure out the new URL or determine this isn't needed. -skullY echo "Installing Atmel Flip" wget 'http://ww1.microchip.com/downloads/en/DeviceDoc/Flip%20Installer%20-%203.4.7.112.exe' - # This is the JRE-less installer, if we need the larger bundled with JRE installer, use this: - #wget 'http://ww1.microchip.com/downloads/en/DeviceDoc/JRE%20-%20Flip%20Installer%20-%203.4.7.112.exe' mv Flip\ Installer\ \-\ 3.4.7.112.exe FlipInstaller.exe echo "Downloading the QMK driver installer" diff --git a/util/wsl_install.sh b/util/wsl_install.sh index d11c78ac7165..c2c206d2b90e 100644 --- a/util/wsl_install.sh +++ b/util/wsl_install.sh @@ -15,20 +15,15 @@ fi while true; do echo echo "Do you want to install all toolchain dependencies needed for compiling QMK?" - echo "This will run install_dependencies.sh, which calls apt-get upgrade." echo "If you don't want that, you can install the dependencies manually." read -p "(Y/N) " res case $res in - [Yy]* ) sudo ./install_dependencies.sh; break;; + [Yy]* ) ./linux_install.sh; break;; [Nn]* ) break;; * ) echo "Invalid answer";; esac done -echo "Installing dependencies needed for the installation (unzip, wget)" -echo "This will ask for the sudo password" -sudo apt-get install unzip wget - download_dir=wsl_downloaded source "$dir/win_shared_install.sh" From 552b1cccec12f2685f594df5b58afc11ca1fbc74 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 18 Oct 2018 21:33:50 -0700 Subject: [PATCH 250/505] Update the installation script PR (#4167) * Update docs to use qmk_install * Update Vagrantfile to use qmk_install --- Vagrantfile | 2 +- docs/getting_started_build_tools.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Vagrantfile b/Vagrantfile index 08de5f7f5203..9c414b2bcb9b 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -59,7 +59,7 @@ Vagrant.configure(2) do |config| # add a # before ,args: and run 'vagrant up' to get a working # non-updated box and then attempt to troubleshoot or open a Github issue - config.vm.provision "shell", run: "always", path: "./util/install_dependencies.sh", args: "-update" + config.vm.provision "shell", run: "always", path: "./util/qmk_install.sh", args: "-update" config.vm.post_up_message = <<-EOT diff --git a/docs/getting_started_build_tools.md b/docs/getting_started_build_tools.md index 88f3642b280f..587dece4a150 100644 --- a/docs/getting_started_build_tools.md +++ b/docs/getting_started_build_tools.md @@ -8,7 +8,7 @@ Note: If it is your first time here, Check out the "Complete Newbs guide" instea ## Linux -To ensure you are always up to date, you can just run `sudo util/install_dependencies.sh`. That should always install all the dependencies needed. **This will run `apt-get upgrade`.** +To ensure you are always up to date, you can just run `sudo util/qmk_install.sh`. That should always install all the dependencies needed. **This will run `apt-get upgrade`.** You can also install things manually, but this documentation might not be always up to date with all requirements. From 418a886ae44833eb323e2e902b92759369063339 Mon Sep 17 00:00:00 2001 From: "Colin T.A. Gray" Date: Mon, 22 Oct 2018 14:56:52 -0400 Subject: [PATCH 251/505] adds 'dfu-util' to macos_install.sh --- util/macos_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/macos_install.sh b/util/macos_install.sh index 7bfb105ecb4b..c31be99d2210 100755 --- a/util/macos_install.sh +++ b/util/macos_install.sh @@ -22,4 +22,4 @@ fi brew tap osx-cross/avr brew tap PX4/homebrew-px4 brew update -brew install avr-gcc@7 gcc-arm-none-eabi dfu-programmer avrdude +brew install avr-gcc@7 gcc-arm-none-eabi dfu-programmer avrdude dfu-util From e26a7b0ed8af7b6b4e99fee718ca265fcc8961f1 Mon Sep 17 00:00:00 2001 From: fougner Date: Mon, 22 Oct 2018 23:01:45 +0200 Subject: [PATCH 252/505] Keyboard: initial support for XD87 (#4182) * Keyboard: initial support for XD87 * Add row/col pin configuration for XD87 PCB * Add default ISO layout * Fix incorrect KC in default_tkl_iso The KC_NUBS is duplicated in the TKL ISO layout. Compare with the fullsize ISO which has a KC_NUHS in the corresponding place. * Add support for community layouts * Add TKL ANSI layout * Enable TKL ISO/ANSI community layout * Fix LAYOUT_all * Configure backlighting for XD87 * Various documentation changes --- keyboards/xd87/config.h | 227 ++++++++++++++++++ keyboards/xd87/info.json | 0 keyboards/xd87/keymaps/default/config.h | 19 ++ keyboards/xd87/keymaps/default/keymap.c | 68 ++++++ keyboards/xd87/keymaps/default/readme.md | 1 + keyboards/xd87/readme.md | 26 ++ keyboards/xd87/rules.mk | 84 +++++++ keyboards/xd87/xd87.c | 43 ++++ keyboards/xd87/xd87.h | 70 ++++++ .../default/tkl_iso/default_tkl_iso/keymap.c | 2 +- 10 files changed, 539 insertions(+), 1 deletion(-) create mode 100644 keyboards/xd87/config.h create mode 100644 keyboards/xd87/info.json create mode 100644 keyboards/xd87/keymaps/default/config.h create mode 100644 keyboards/xd87/keymaps/default/keymap.c create mode 100644 keyboards/xd87/keymaps/default/readme.md create mode 100644 keyboards/xd87/readme.md create mode 100644 keyboards/xd87/rules.mk create mode 100644 keyboards/xd87/xd87.c create mode 100644 keyboards/xd87/xd87.h diff --git a/keyboards/xd87/config.h b/keyboards/xd87/config.h new file mode 100644 index 000000000000..3682af7409f6 --- /dev/null +++ b/keyboards/xd87/config.h @@ -0,0 +1,227 @@ +/* +Copyright 2018 Alexander Fougner + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER KP Republic +#define PRODUCT XD87 TKL +#define DESCRIPTION KP Republic XD87 + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 17 + +/* + * 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 { D1, B0, B1, C7, D3, D5 } + +#define MATRIX_COL_PINS { E6, F0, F1, F4, F5, F6, F7, B5, B6, C6, D4, D6, D7, B4, B2, B3, D2 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN D0 +// #define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 + +// #define RGB_DI_PIN E2 +// #ifdef RGB_DI_PIN +// #define RGBLIGHT_ANIMATIONS +// #define RGBLED_NUM 16 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 +// #endif + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + diff --git a/keyboards/xd87/info.json b/keyboards/xd87/info.json new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/keyboards/xd87/keymaps/default/config.h b/keyboards/xd87/keymaps/default/config.h new file mode 100644 index 000000000000..ed56340c3914 --- /dev/null +++ b/keyboards/xd87/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 Alexander Fougner + * + * 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 + +// place overrides here diff --git a/keyboards/xd87/keymaps/default/keymap.c b/keyboards/xd87/keymaps/default/keymap.c new file mode 100644 index 000000000000..b31db9b57754 --- /dev/null +++ b/keyboards/xd87/keymaps/default/keymap.c @@ -0,0 +1,68 @@ +/* Copyright 2018 Alexander Fougner + * + * 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 QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_tkl_iso(\ + 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_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_DEL, KC_END, KC_PGDN, \ + 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_NUHS, KC_ENT, \ + 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_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ) +}; + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/xd87/keymaps/default/readme.md b/keyboards/xd87/keymaps/default/readme.md new file mode 100644 index 000000000000..41baff94358a --- /dev/null +++ b/keyboards/xd87/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for xd87 \ No newline at end of file diff --git a/keyboards/xd87/readme.md b/keyboards/xd87/readme.md new file mode 100644 index 000000000000..0b9389740da8 --- /dev/null +++ b/keyboards/xd87/readme.md @@ -0,0 +1,26 @@ +# XD87 + +![XD87](https://i.imgur.com/qVyOies.jpg) + + +- Keyboard Maintainer: [Alexander Fougner](https://github.com/fougner) +- Hardware Supported: XD87 PCB v1.1 +- Hardware Availability: + - [KPrepublic.com](https://kprepublic.com/products/xd87-xd87-xd80-custom-mechanical-keyboard-kit80-supports-tkg-tools-support-underglow-rgb-pcb-programmed-gh80-kle) + - [AliExpress](https://www.aliexpress.com/item/xd87-XD87-XD80-Custom-Mechanical-Keyboard-Kit80-Supports-TKG-TOOLS-Support-Underglow-RGB-PCB-programmed-gh80/32892540743.html) + +Make example for this keyboard (after setting up your build environment): + + make xd87:default + +It also supports the tkl_ansi and tkl_iso community layouts: + + # Build firmware with ANSI layout + make xd87:default_tkl_ansi + # Build firmware with ISO layout + make xd87:default_tkl_iso + + +The keyboard can be reset to bootloader by using bootmagic (space+b by default) or short out the small connector between the Delete and End keys. + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). \ No newline at end of file diff --git a/keyboards/xd87/rules.mk b/keyboards/xd87/rules.mk new file mode 100644 index 000000000000..39540e701ddb --- /dev/null +++ b/keyboards/xd87/rules.mk @@ -0,0 +1,84 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = yes # 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 = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +# Supported layouts +LAYOUTS = tkl_ansi tkl_iso diff --git a/keyboards/xd87/xd87.c b/keyboards/xd87/xd87.c new file mode 100644 index 000000000000..da07c71d88b0 --- /dev/null +++ b/keyboards/xd87/xd87.c @@ -0,0 +1,43 @@ +/* Copyright 2018 Alexander Fougner + * + * 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 "xd87.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/xd87/xd87.h b/keyboards/xd87/xd87.h new file mode 100644 index 000000000000..c4df290a3be1 --- /dev/null +++ b/keyboards/xd87/xd87.h @@ -0,0 +1,70 @@ +/* Copyright 2018 Alexander Fougner + * + * 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 XD87_H +#define XD87_H + +#include "quantum.h" + +#define LAYOUT_all( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K3E, K1E, K1F, K1G, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, K4F, K4G, \ + K50, K51, K52, K55, K58, K5A, K5B, K5C, K5D, K5E, K5F, K5G \ +) { \ +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F G */ \ +/* 0 */ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G }, \ +/* 1 */ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, K1G }, \ +/* 2 */ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G }, \ +/* 3 */ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, KC_NO, KC_NO, KC_NO }, \ +/* 4 */ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, K4F, K4G }, \ +/* 5 */ { K50, K51, K52, KC_NO, KC_NO, K55, KC_NO, KC_NO, K58, KC_NO, K5A, K5B, K5C, K5D, K5E, K5F, K5G } \ +} + +#define LAYOUT_tkl_ansi( \ + K00, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ + K01, K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1D, K1E, K1F, K1G, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \ + K40, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4F, \ + K50, K51, K52, K58, K5A, K5B, K5C, K5D, K5E, K5F, K5G \ +) LAYOUT_all( \ + K00, KC_NO, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, KC_NO, K1D, KC_NO, K1E, K1F, K1G, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, K2G, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, \ + K40, KC_NO, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, KC_NO, KC_NO, K4F, KC_NO, \ + K50, K51, K52, KC_NO, K58, K5A, K5B, K5C, K5D, K5E, K5F, K5G \ +) + +#define LAYOUT_tkl_iso( \ + K00, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, K1G, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2E, K2F, K2G, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4F, \ + K50, K51, K52, K58, K5A, K5B, K5C, K5D, K5E, K5F, K5G \ +) LAYOUT_all( \ + K00, KC_NO, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K0G, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO, K1E, K1F, K1G, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, KC_NO, K2E, K2F, K2G, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, KC_NO, KC_NO, K4F, KC_NO, \ + K50, K51, K52, KC_NO, K58, K5A, K5B, K5C, K5D, K5E, K5F, K5G \ +) + +#endif \ No newline at end of file diff --git a/layouts/default/tkl_iso/default_tkl_iso/keymap.c b/layouts/default/tkl_iso/default_tkl_iso/keymap.c index f29ef2267f58..eb4c48d65770 100644 --- a/layouts/default/tkl_iso/default_tkl_iso/keymap.c +++ b/layouts/default/tkl_iso/default_tkl_iso/keymap.c @@ -5,7 +5,7 @@ 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_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_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_DEL, KC_END, KC_PGDN, - 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_NUBS, KC_ENT, + 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_NUHS, KC_ENT, 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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ) \ From 5dc41446aae0b429c72ca020cb20efb3356afee5 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Mon, 22 Oct 2018 14:18:47 -0700 Subject: [PATCH 253/505] Keyboard: Chimera LS refactor and Configurator support (#3715) * Matrix/keymap refactor - Deleted `KC_KEYMAP` macro - Renamed `KEYMAP` macro to `LAYOUT_ortho_4x12` - Default keymap updated to current QMK standards - #include QMK_KEYBOARD_H - Refactored from `KC_KEYMAP` to `LAYOUT_ortho_4x12` macro - `action_get_macro()` deprecated in favor of `process_record_user()` `rules.mk` *not* updated to include `LAYOUTS = ortho_4x12` because I have no idea if and how that works on a split and/or wireless keyboard. * readme cleanup: markdown formatting * Add Configurator support * added support for ortho_4x12 layout * Macro and readme updates Macros updated to use `KC_NO` directly. Readme updates and cleanup. --- keyboards/chimera_ls/chimera_ls.h | 46 ++-- keyboards/chimera_ls/info.json | 13 + keyboards/chimera_ls/keymaps/default/keymap.c | 227 +++++++++--------- keyboards/chimera_ls/readme.md | 10 +- keyboards/chimera_ls/rules.mk | 4 +- 5 files changed, 152 insertions(+), 148 deletions(-) create mode 100644 keyboards/chimera_ls/info.json diff --git a/keyboards/chimera_ls/chimera_ls.h b/keyboards/chimera_ls/chimera_ls.h index b39bcf204742..bb99684e5f48 100644 --- a/keyboards/chimera_ls/chimera_ls.h +++ b/keyboards/chimera_ls/chimera_ls.h @@ -50,32 +50,30 @@ // The first section contains all of the arguements // The second converts the arguments into a two-dimensional array -#define KC_KEYMAP( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, \ - k12, k13, k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, \ - k24, k25, k26, k27, k28, k29, k30, k31, k32, k33, k34, k35, \ - k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47 \ -) \ -{ \ - { KC_##k43, KC_##k45, KC_##k34, KC_##k11, KC_##k23, KC_##k40, KC_##k38, KC_##k25, KC_##k00, KC_##k12 }, \ - { KC_##k31, KC_##k44, KC_##k46, KC_##k35, KC_##k22, KC_##k28, KC_##k39, KC_##k37, KC_##k24, KC_##k13 }, \ - { KC_##k30, KC_##k32, KC_##k33, KC_##k47, KC_##k09, KC_##k29, KC_##k27, KC_##k26, KC_##k36, KC_##k02 }, \ - { KC_##k19, KC_##k20, KC_##k21, KC_##k42, KC_##k18, KC_##k16, KC_##k15, KC_##k14, KC_##k41, KC_##k17 }, \ - { KC_##k06, KC_##k07, KC_##k08, KC_##k10, KC_NO, KC_##k05, KC_##k04, KC_##k03, KC_##k01, KC_NO }, \ +#define LAYOUT_ortho_4x12( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, \ + k12, k13, k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, \ + k24, k25, k26, k27, k28, k29, k30, k31, k32, k33, k34, k35, \ + k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47 \ + ) { \ + { k43, k45, k34, k11, k23, k40, k38, k25, k00, k12 }, \ + { k31, k44, k46, k35, k22, k28, k39, k37, k24, k13 }, \ + { k30, k32, k33, k47, k09, k29, k27, k26, k36, k02 }, \ + { k19, k20, k21, k42, k18, k16, k15, k14, k41, k17 }, \ + { k06, k07, k08, k10, KC_NO, k05, k04, k03, k01, KC_NO } \ } -#define KEYMAP( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, \ - k12, k13, k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, \ - k24, k25, k26, k27, k28, k29, k30, k31, k32, k33, k34, k35, \ - k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47 \ -) \ -{ \ - { k43, k45, k34, k11, k23, k40, k38, k25, k00, k12 }, \ - { k31, k44, k46, k35, k22, k28, k39, k37, k24, k13 }, \ - { k30, k32, k33, k47, k09, k29, k27, k26, k36, k02 }, \ - { k19, k20, k21, k42, k18, k16, k15, k14, k41, k17 }, \ - { k06, k07, k08, k10, KC_NO, k05, k04, k03, k01, KC_NO }, \ +#define LAYOUT_kc_ortho_4x12( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k10, k11, \ + k12, k13, k14, k15, k16, k17, k18, k19, k20, k21, k22, k23, \ + k24, k25, k26, k27, k28, k29, k30, k31, k32, k33, k34, k35, \ + k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47 \ + ) { \ + { KC_##k43, KC_##k45, KC_##k34, KC_##k11, KC_##k23, KC_##k40, KC_##k38, KC_##k25, KC_##k00, KC_##k12 }, \ + { KC_##k31, KC_##k44, KC_##k46, KC_##k35, KC_##k22, KC_##k28, KC_##k39, KC_##k37, KC_##k24, KC_##k13 }, \ + { KC_##k30, KC_##k32, KC_##k33, KC_##k47, KC_##k09, KC_##k29, KC_##k27, KC_##k26, KC_##k36, KC_##k02 }, \ + { KC_##k19, KC_##k20, KC_##k21, KC_##k42, KC_##k18, KC_##k16, KC_##k15, KC_##k14, KC_##k41, KC_##k17 }, \ + { KC_##k06, KC_##k07, KC_##k08, KC_##k10, KC_NO, KC_##k05, KC_##k04, KC_##k03, KC_##k01, KC_NO } \ } diff --git a/keyboards/chimera_ls/info.json b/keyboards/chimera_ls/info.json new file mode 100644 index 000000000000..077a76079695 --- /dev/null +++ b/keyboards/chimera_ls/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "Chimera LS", + "url": "", + "maintainer": "qmk", + "width": 13, + "height": 4, + "layouts": { + "LAYOUT_ortho_4x12": { + "key_count": 48, + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}] + } + } +} diff --git a/keyboards/chimera_ls/keymaps/default/keymap.c b/keyboards/chimera_ls/keymaps/default/keymap.c index 493b8eee15c8..0affeef3894e 100644 --- a/keyboards/chimera_ls/keymaps/default/keymap.c +++ b/keyboards/chimera_ls/keymaps/default/keymap.c @@ -1,7 +1,7 @@ // this is the style you want to emulate. // This is the canonical layout file for the Quantum project. If you want to add another keyboard, -#include "chimera_ls.h" +#include QMK_KEYBOARD_H // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. @@ -24,168 +24,163 @@ enum chimera_lets_split_layers #define KC_SCTR MT(MOD_LCTL, KC_RBRC) #define KC_SPLT MT(MOD_LALT, KC_MINS) #define KC_MESC LT(_MACROS, KC_ESC) -#define KC_INCL M(0) -#define KC_PULL M(1) -#define KC_PUSH M(2) -#define KC_SCAP M(3) -#define KC_SCOF M(4) #define KC_CAD LALT(LCTL(KC_DEL)) +enum custom_keycodes { + KC_INCL = SAFE_RANGE, + KC_PULL, + KC_PUSH, + KC_SCAP, + KC_SCOF +}; + #define LONGPRESS_DELAY 150 //#define LAYER_TOGGLE_DELAY 300 -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO -#define KC_ KC_TRNS - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = KC_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - MESC, Q , W , E , R , T , Y , U , I , O , P ,BSPC, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - TAB , A , S , D , F , G , H , J , K , L ,SCLN, ENT, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - LSPO, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH,RSPC, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - SCTL,SPFN,SPLT,AMPR,NMPD,SPC , SPC ,SYMB,ASTR,EXLM,LBRC,SCTR - //`----+----+----+----+----+----' `----+----+----+----+----+----' + [_QWERTY] = LAYOUT_ortho_4x12( + //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------. + KC_MESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_SCTL, KC_SPFN, KC_SPLT, KC_AMPR, KC_NMPD, KC_SPC, KC_SPC, KC_SYMB, KC_ASTR, KC_EXLM, KC_LBRC, KC_SCTR + //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------' ), - [_CAPS] = KC_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - , , , , , , , , , , , , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , , , , ,COLN, , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , , , , , , , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , ,UNDS, , , , , , , , , - //`----+----+----+----+----+----' `----+----+----+----+----+----' + [_CAPS] = LAYOUT_ortho_4x12( + //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------. + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, KC_UNDS, _______, _______, _______, _______, _______, _______, _______, _______, _______ + //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------' ), - [_NUMPAD] = KC_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - , , , , , , , 7 , 8 , 9 ,MINS,QUOT, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , , 4 , 5 , 6 ,PLUS, ENT, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - LSFT, , , , , , , 1 , 2 , 3 ,ASTR, EQL, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , ,BSPC, SPC , 0 , 0 , DOT,SLSH, - //`----+----+----+----+----+----' `----+----+----+----+----+----' + [_NUMPAD] = LAYOUT_ortho_4x12( + //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------. + _______, _______, _______, _______, _______, _______, _______, KC_7, KC_8, KC_9, KC_MINS, KC_QUOT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, KC_4, KC_5, KC_6, KC_PLUS, KC_ENT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_LSFT, _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, KC_ASTR, KC_EQL, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, KC_BSPC, KC_SPC, KC_0, KC_0, KC_DOT, KC_SLSH, _______ + //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------' ), - [_SYMBOLS] = KC_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - ,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,QUOT, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - F1 , F2 , F3 , F4 , F5 , F6 , TILD,EQL ,UNDS,LCBR,RCBR,PIPE, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - F7 , F8 , F9 , F10, F11, F12, GRV ,PLUS,MINS,LBRC,RBRC,BSLS, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , NO ,BSPC, SPC , , , , , - //`----+----+----+----+----+----' `----+----+----+----+----+----' + [_SYMBOLS] = LAYOUT_ortho_4x12( + //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------. + _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_QUOT, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_TILD, KC_EQL, KC_UNDS, KC_LCBR, KC_RCBR, KC_PIPE, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_GRV, KC_PLUS, KC_MINS, KC_LBRC, KC_RBRC, KC_BSLS, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, XXXXXXX, KC_BSPC, KC_SPC, _______, _______, _______, _______, _______ + //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------' ), - [_NAV] = KC_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - , , , , DEL,BSPC, ,HOME, UP , END, INS,PSCR, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , ,LSFT,LCTL, ENT, ,LEFT,DOWN,RGHT, DEL, , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , ,PGUP,PGDN, , , , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , ,DEL , , , , , , - //`----+----+----+----+----+----' `----+----+----+----+----+----' + [_NAV] = LAYOUT_ortho_4x12( + //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------. + _______, _______, _______, _______, KC_DEL, KC_BSPC, _______, KC_HOME, KC_UP, KC_END, KC_INS, KC_PSCR, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, KC_LSFT, KC_LCTL, KC_ENT, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______, _______, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, _______, _______ + //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------' ), - [_MACROS] = KC_KEYMAP( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - , , , , , , , ,INCL, , , , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , ,CAD , , , , , , , , , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - SCAP, , , , , , , ,PULL,PUSH, ,SCAP, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - , , , , , , , , , , , - //`----+----+----+----+----+----' `----+----+----+----+----+----' + [_MACROS] = LAYOUT_ortho_4x12( + //,--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------. + _______, _______, _______, _______, _______, _______, _______, _______, KC_INCL, _______, _______, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, KC_CAD, _______, _______, _______, _______, _______, _______, _______, _______, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + KC_SCAP, _______, _______, _______, _______, _______, _______, _______, KC_PULL, KC_PUSH, _______, KC_SCAP, + //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + //`--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------' ), }; -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - switch(id) { +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch(keycode) { /* include some kind of library or header */ - case 0: + case KC_INCL: if (record->event.pressed) { - SEND_STRING("#include <>"); - return MACRO( T(LEFT), END); + SEND_STRING("#include <>" SS_TAP(X_LEFT) ); + return false; } break; - case 1: + case KC_PULL: if (record->event.pressed) { - SEND_STRING("git pull"); - return MACRO( T(ENT), END ); + SEND_STRING("git pull" SS_TAP(X_ENTER) ); + return false; } break; - case 2: + case KC_PUSH: if (record->event.pressed){ - SEND_STRING("git push"); - return MACRO( T(ENT), END ); + SEND_STRING("git push" SS_TAP(X_ENTER) ); + return false; } break; - case 3: + case KC_SCAP: if (record->event.pressed){ layer_on(_CAPS); register_code(KC_CAPSLOCK); unregister_code(KC_CAPSLOCK); + return false; } break; - case 4: + case KC_SCOF: if (record->event.pressed){ layer_off(_CAPS); register_code(KC_CAPSLOCK); unregister_code(KC_CAPSLOCK); + return false; } break; } - return MACRO_NONE; + return true; }; - + void matrix_scan_user(void) { - uint8_t layer = biton32(layer_state); - - switch (layer) { - case _QWERTY: - set_led_green; - break; - case _CAPS: - set_led_white; - break; - case _NUMPAD: - set_led_blue; - break; - case _SYMBOLS: - set_led_red; - break; - case _NAV: - set_led_magenta; - break; - case _MACROS: - set_led_cyan; - break; - default: - set_led_green; - break; - } + uint8_t layer = biton32(layer_state); + + switch (layer) { + case _QWERTY: + set_led_green; + break; + case _CAPS: + set_led_white; + break; + case _NUMPAD: + set_led_blue; + break; + case _SYMBOLS: + set_led_red; + break; + case _NAV: + set_led_magenta; + break; + case _MACROS: + set_led_cyan; + break; + default: + set_led_green; + break; + } }; diff --git a/keyboards/chimera_ls/readme.md b/keyboards/chimera_ls/readme.md index 689d9ee6146f..0170dd8a8f3a 100644 --- a/keyboards/chimera_ls/readme.md +++ b/keyboards/chimera_ls/readme.md @@ -2,18 +2,14 @@ ![Chimera LS](https://imgur.com/FOGlO4M.jpg) -A wireless version of the let's split: a split 40% ortholinear keyboard +A wireless version of the Let's Split: a split 40% ortholinear keyboard. Keyboard Maintainer: [William Wilson](https://github.com/GlenPickle) - - -Hardware Supported: Chimera LS PCB, WaveShare core nRF51822 - +Hardware Supported: Chimera LS PCB, WaveShare core nRF51822 Hardware Availability: [Gerbers](https://github.com/GlenPickle/Chimera/tree/master/ls/gerbers) Make example for this keyboard (after setting up your build environment): make chimera_ls:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. - +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/chimera_ls/rules.mk b/keyboards/chimera_ls/rules.mk index af08f7a87929..497e58677e5c 100644 --- a/keyboards/chimera_ls/rules.mk +++ b/keyboards/chimera_ls/rules.mk @@ -46,7 +46,7 @@ F_USB = $(F_CPU) # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = caterina @@ -80,3 +80,5 @@ UNICODE_ENABLE = YES # Unicode # BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID USB = /dev/ttyACM0 + +LAYOUTS = ortho_4x12 From 8421a898209da6bbebddfbc93e4c10af878130a9 Mon Sep 17 00:00:00 2001 From: SpacebarRacecar <42380065+SpacebarRacecar@users.noreply.github.com> Date: Mon, 22 Oct 2018 23:20:31 +0200 Subject: [PATCH 254/505] added ASCII representation to dz60 iso-split layout and adjusted it so that it's consistent with the other layouts. (#4207) --- keyboards/dz60/dz60.h | 42 ++++++++++++++++++++++++++-------------- keyboards/dz60/info.json | 8 ++++---- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/keyboards/dz60/dz60.h b/keyboards/dz60/dz60.h index 36ddb7ade121..2cf2eec7a08c 100644 --- a/keyboards/dz60/dz60.h +++ b/keyboards/dz60/dz60.h @@ -196,20 +196,6 @@ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \ { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \ } -// iso split -#define LAYOUT_60_iso_split( \ - K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, \ - K100, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \ - K200, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, \ - K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, \ - K400, K401, K403, K404, K406, K408, K410, K411, K413, K414 \ -) { \ - { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, KC_NO, K014 }, \ - { K100, KC_NO, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114 }, \ - { K200, KC_NO, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO }, \ - { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, KC_NO }, \ - { K400, K401, KC_NO, K403, K404, KC_NO, K406, KC_NO, K408, KC_NO, K410, K411, KC_NO, K413, K414 } \ -} /* LAYOUT_60_iso_5x1u * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ @@ -238,6 +224,33 @@ { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, k4c, k4d, k4e } \ } +/* LAYOUT_60_iso_split + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐2d │ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │1e │ │ + * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ + * │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │ + * ├────┼───┴┬──┴─┬─┴───┴──┬┴───┼───┴───┴──┬┴───┼───┴┬────┬────┤ + * │40 │41 │43 │44 │46 │48 │4a │4b │4d │4e │ + * └────┴────┴────┴────────┴────┴──────────┴────┴────┴────┴────┘ +*/ +#define LAYOUT_60_iso_split( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k1e, k2d, \ + k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, \ + k40, k41, k43, k44, k46, k48, k4a, k4b, k4d, k4e \ +) { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, KC_NO, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \ + { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \ +} + /* LAYOUT_60_b_ansi (maximized DZ60 Plate B layout for ANSI) * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │ @@ -292,4 +305,5 @@ { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, k4c, k4d, k4e } \ } + #endif diff --git a/keyboards/dz60/info.json b/keyboards/dz60/info.json index 1f621360bffd..a163cc6a467a 100644 --- a/keyboards/dz60/info.json +++ b/keyboards/dz60/info.json @@ -28,10 +28,6 @@ "LAYOUT_60_iso": { "key_count": 62, "layout": [{"label":"¬", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"£", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] - }, - "LAYOUT_60_iso_split": { - "key_count": 64, - "layout": [{"label":"¬", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"£", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"label":"FN", "x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] }, "LAYOUT_60_hhkb": { "key_count": 60, @@ -41,6 +37,10 @@ "key_count": 63, "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"|", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"~", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"/", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Fn", "x":10, "y":4}, {"label":"←", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"↑", "x":13, "y":4}, {"label":"→", "x":14, "y":4}] }, + "LAYOUT_60_iso_split": { + "key_count": 64, + "layout": [{"label":"¬", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"£", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"label":"FN", "x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + }, "LAYOUT_60_b_ansi": { "key_count": 66, "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"1", "x":1, "y":0}, {"label":"2", "x":2, "y":0}, {"label":"3", "x":3, "y":0}, {"label":"4", "x":4, "y":0}, {"label":"5", "x":5, "y":0}, {"label":"6", "x":6, "y":0}, {"label":"7", "x":7, "y":0}, {"label":"8", "x":8, "y":0}, {"label":"9", "x":9, "y":0}, {"label":"0", "x":10, "y":0}, {"label":"-", "x":11, "y":0}, {"label":"=", "x":12, "y":0}, {"x":13, "y":0}, {"label":"Back Space", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"[", "x":11.5, "y":1}, {"label":"]", "x":12.5, "y":1}, {"label":"\\", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":";", "x":10.75, "y":2}, {"label":"'", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":",", "x":9.25, "y":3}, {"label":".", "x":10.25, "y":3}, {"label":"Shift", "x":11.25, "y":3, "w":1.75}, {"label":"Up", "x":13, "y":3}, {"label":"Del", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"GUI", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"label":"Space", "x":3.75, "y":4, "w":2.25}, {"label":"Space", "x":6, "y":4, "w":1.25}, {"label":"Space", "x":7.25, "y":4, "w":2.75}, {"label":"Alt", "x":10, "y":4}, {"label":"Fn", "x":11, "y":4}, {"label":"Left", "x":12, "y":4}, {"label":"Down", "x":13, "y":4}, {"label":"Right", "x":14, "y":4}] From 95619bdaca2c48156b4749270199d4a50437f44e Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 22 Oct 2018 14:39:11 -0700 Subject: [PATCH 255/505] Fix file location for mmacdougal's keymap --- keyboards/levinson/keymaps/mmacdougall/{keymap => }/config.h | 0 keyboards/levinson/keymaps/mmacdougall/{keymap => }/keymap.c | 0 keyboards/levinson/keymaps/mmacdougall/{keymap => }/rules.mk | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename keyboards/levinson/keymaps/mmacdougall/{keymap => }/config.h (100%) rename keyboards/levinson/keymaps/mmacdougall/{keymap => }/keymap.c (100%) rename keyboards/levinson/keymaps/mmacdougall/{keymap => }/rules.mk (100%) diff --git a/keyboards/levinson/keymaps/mmacdougall/keymap/config.h b/keyboards/levinson/keymaps/mmacdougall/config.h similarity index 100% rename from keyboards/levinson/keymaps/mmacdougall/keymap/config.h rename to keyboards/levinson/keymaps/mmacdougall/config.h diff --git a/keyboards/levinson/keymaps/mmacdougall/keymap/keymap.c b/keyboards/levinson/keymaps/mmacdougall/keymap.c similarity index 100% rename from keyboards/levinson/keymaps/mmacdougall/keymap/keymap.c rename to keyboards/levinson/keymaps/mmacdougall/keymap.c diff --git a/keyboards/levinson/keymaps/mmacdougall/keymap/rules.mk b/keyboards/levinson/keymaps/mmacdougall/rules.mk similarity index 100% rename from keyboards/levinson/keymaps/mmacdougall/keymap/rules.mk rename to keyboards/levinson/keymaps/mmacdougall/rules.mk From cb1e45b4efdc685134c0dbc35100e2fb99c5b006 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 22 Oct 2018 14:07:18 -0700 Subject: [PATCH 256/505] Include quantum.h to fix travis CI errors --- keyboards/dz60/keymaps/marianas/keymap.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keyboards/dz60/keymaps/marianas/keymap.h b/keyboards/dz60/keymaps/marianas/keymap.h index 01de5c6e2cec..00e51cea2c5b 100644 --- a/keyboards/dz60/keymaps/marianas/keymap.h +++ b/keyboards/dz60/keymaps/marianas/keymap.h @@ -1,3 +1,5 @@ +#include "quantum.h" + //Control #define MO_FNLR MO(FN_LAYER) #define BACKSPC KC_BSPC From 572c316e7dfb0bcd495ce09e068078593fd4ec82 Mon Sep 17 00:00:00 2001 From: Scott Gorsuch Date: Tue, 23 Oct 2018 12:29:35 -0400 Subject: [PATCH 257/505] Keymap: Fix missing 4 key (#4219) --- keyboards/iris/keymaps/dbroqua/keymap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/iris/keymaps/dbroqua/keymap.c b/keyboards/iris/keymaps/dbroqua/keymap.c index eed288c50d22..4cbb8af54055 100644 --- a/keyboards/iris/keymaps/dbroqua/keymap.c +++ b/keyboards/iris/keymaps/dbroqua/keymap.c @@ -49,7 +49,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----+-----+-----+-----+-----+-----+ ,-----+-----+-----+-----+-----+-----+ * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BSPC| * |-----+-----+-----+-----+-----+-----+ +-----+-----+-----+-----+-----+-----+ - * | RST | 1 | 2 | 3 | 5 | 5 | | 6 | 7 | 8 | 9 | 0 | | + * | RST | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | * +-----+-----+-----+-----+-----+-----+ +-----+-----+-----+-----+-----+-----+ * | DEL | | LEFT| RGHT| UP | [ | | ] | 4 | 5 | 6 | + | | | * +-----+-----+-----+-----+-----+-----+-----. ,-----+-----+-----+-----+-----+-----+-----+ From 03d16db942fe0352cc3b3522a1c778b7e60a4b3a Mon Sep 17 00:00:00 2001 From: Peter Roe Date: Tue, 23 Oct 2018 13:52:57 -0500 Subject: [PATCH 258/505] Keyboard: Ported ADB-to-USB converter from TMK to QMK (#3931) * Ported ADB-to-USB converter from TMK to QMK * Updated pull request with reviewer suggestions. * Removed precompiled header file type (gch) from gitignore per reviewer request * Update keyboards/converter/adb_usb/matrix.c Changed instances of matrix_init_quantum to matrix_scan_quantum. * Update keyboards/converter/adb_usb/matrix.c Co-Authored-By: 13-bit --- keyboards/converter/adb_usb/README.md | 83 ++++++ keyboards/converter/adb_usb/adb_usb.c | 3 + keyboards/converter/adb_usb/adb_usb.h | 109 +++++++ keyboards/converter/adb_usb/config.h | 43 +++ .../converter/adb_usb/keymaps/13bit/keymap.c | 26 ++ .../adb_usb/keymaps/default/keymap.c | 13 + keyboards/converter/adb_usb/led.c | 27 ++ keyboards/converter/adb_usb/led.h | 43 +++ keyboards/converter/adb_usb/matrix.c | 267 ++++++++++++++++++ keyboards/converter/adb_usb/rules.mk | 73 +++++ 10 files changed, 687 insertions(+) create mode 100644 keyboards/converter/adb_usb/README.md create mode 100644 keyboards/converter/adb_usb/adb_usb.c create mode 100644 keyboards/converter/adb_usb/adb_usb.h create mode 100644 keyboards/converter/adb_usb/config.h create mode 100644 keyboards/converter/adb_usb/keymaps/13bit/keymap.c create mode 100644 keyboards/converter/adb_usb/keymaps/default/keymap.c create mode 100644 keyboards/converter/adb_usb/led.c create mode 100644 keyboards/converter/adb_usb/led.h create mode 100644 keyboards/converter/adb_usb/matrix.c create mode 100644 keyboards/converter/adb_usb/rules.mk diff --git a/keyboards/converter/adb_usb/README.md b/keyboards/converter/adb_usb/README.md new file mode 100644 index 000000000000..ed7175008075 --- /dev/null +++ b/keyboards/converter/adb_usb/README.md @@ -0,0 +1,83 @@ +ADB-to USB Keyboard Converter +============================= +This firmware converts Apple Desktop Bus (ADB) keyboard protocol to USB so that you can use an ADB keyboard on a modern computer. It works on the PJRC Teensy 2.0 and other USB AVR MCUs (ATMega32U4, AT90USB64/128, etc) and needs at least 10KB of flash memory. + + +This is a port of the TMK ADB-to-USB converter to QMK. For information on QMK, please consult the following: +https://github.com/qmk/qmk_firmware +https://docs.qmk.fm + + +Wiring +------ +Connect the VCC, GND, and DATA lines of the ADB keyboard to the controller (Teensy 2.0 or similar). By default the DATA line uses port PD0. The Power SW line is unused by the converter. + +ADB female socket from the front: + + ,--_--. + / o4 3o \ 1: DATA + | o2 1o | 2: Power SW + - === - 3: VCC + `-___-' 4: GND + +This converter uses AVR's internal pull-up, but it seems to be too weak, in particular when you want to use a long or coiled cable. Using an external pull-up resistor (1K-10K Ohm) between the DATA and VCC lines is strongly recommended. + +Pull-up resistor: + + Keyboard Converter + ,------. + 5V------+------|VCC | + | | | + [R] | | + | | | + Signal--+------|PD0 | + | | + GND------------|GND | + `------' + R: 1K Ohm resistor + + +Define following macros for ADB connection in config.h if you use other than port PD0. + + ADB_PORT, ADB_PIN, ADB_DDR, ADB_DATA_BIT + + +Building the Firmware +------------------------------------------ +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + + +Keymap +------ +To build the default keymap run this command: + + $ make converter/adb_usb:default + +You may add your own keymap to the converter/adb_usb/keymaps directory, as you would with any other QMK-powered keyboard. + +To build your custom keymap, change the build command to: + + $ make converter/adb_usb:my_keymap + +Where 'my_keymap' is the name of your custom keymap directory. + + +Locking Caps Lock +---------------- +Many old ADB keyboards use a locking switch for the caps lock key. This converter supports the locking caps lock key by default. + + +Notes +----- +Non-extended ADB keyboards make no distinction between the left and right modifiers, +i.e. the keycode for the left modifier will be sent even if the right modifier + +The Apple Extended Keyboard and Apple Extended Keyboard II can differentiate between the left and right modifiers except for the GUI key (Windows/Command). + +Most ADB keyboards have no diodes in its matrix so they are not NKRO, +though the ADB protocol itself supports it. See protocol/adb.c for more info. + + +QMK Port Changelog +--------- +- 2018/09/16 - Initial release. diff --git a/keyboards/converter/adb_usb/adb_usb.c b/keyboards/converter/adb_usb/adb_usb.c new file mode 100644 index 000000000000..7026d62751bb --- /dev/null +++ b/keyboards/converter/adb_usb/adb_usb.c @@ -0,0 +1,3 @@ +#include "adb_usb.h" +#include +#include "quantum.h" diff --git a/keyboards/converter/adb_usb/adb_usb.h b/keyboards/converter/adb_usb/adb_usb.h new file mode 100644 index 000000000000..491db95f1c93 --- /dev/null +++ b/keyboards/converter/adb_usb/adb_usb.h @@ -0,0 +1,109 @@ +/* +Copyright 2011,2012,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 . + +Ported to QMK by Peter Roe +*/ + +#ifndef KEYMAP_COMMON_H +#define KEYMAP_COMMON_H + +#include "quantum.h" + +/* M0115/M3501 Apple Extended Keyboard ANSI + * ,---. ,---------------. ,---------------. ,---------------. ,-----------. ,---. + * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau| |Pwr| + * `---' `---------------' `---------------' `---------------' `-----------' `---' + * ,-----------------------------------------------------------. ,-----------. ,---------------. + * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backspa| |Ins|Hom|PgU| |NmL| =| /| *| + * |-----------------------------------------------------------| |-----------| |---------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|End|PgD| | 7| 8| 9| -| + * |-----------------------------------------------------------| `-----------' |---------------| + * |CapsLo| A| S| D| F| G| H| J| K| L| ;| '|Return | | 4| 5| 6| +| + * |-----------------------------------------------------------| ,---. |---------------| + * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | |Up | | 1| 2| 3| | + * |-----------------------------------------------------------| ,-----------. |-----------|Ent| + * |Ctrl |Opt |Cmd | Space | |Opt |Ctrl | |Lef|Dow|Rig| | 0| .| | + * `-----------------------------------------------------------' `-----------' `---------------' + */ +#define LAYOUT_ext_ansi( \ + K35, K7A,K78,K63,K76,K60,K61,K62,K64,K65,K6D,K67,K6F, K69,K6B,K71, K7F, \ + K32,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K72,K73,K74, K47,K51,K4B,K43, \ + K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E,K2A, K75,K77,K79, K59,K5B,K5C,K4E, \ + K39,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K45, \ + K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K7B, K3E, K53,K54,K55, \ + K36,K3A,K37, K31, K7C,K7D, K3B,K3D,K3C, K52, K41,K4C \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07 }, \ + { K08, K09, KC_NO, K0B, K0C, K0D, K0E, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ + { K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27 }, \ + { K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \ + { K30, K31, K32, K33, KC_NO, K35, K36, K37 }, \ + { K38, K39, K3A, K3B, K3C, K3D, K3E, KC_NO, }, \ + { KC_NO, K41, KC_NO, K43, KC_NO, K45, KC_NO, K47 }, \ + { KC_NO, KC_NO, KC_NO, K4B, K4C, KC_NO, K4E, KC_NO, }, \ + { KC_NO, KC_NO, K52, K53, K54, K55, K56, K57 }, \ + { K58, K59, KC_NO, K5B, K5C, KC_NO, KC_NO, KC_NO, }, \ + { K60, K61, K62, K63, K64, K65, KC_NO, K67 }, \ + { KC_NO, K69, KC_NO, K6B, KC_NO, K6D, KC_NO, K6F }, \ + { KC_NO, K71, K72, K73, K74, K75, K76, K77 }, \ + { K78, K79, K7A, K7B, K7C, K7D, KC_NO, K7F } \ +} + +/* M0116 Apple Standard Keyboard ANSI + * +-------+ + * | power | + * +-------+ + * +---+---+---+---+---+---+---+---+---+---+---+---+---+-----+ +---+---+---+---+ + * |esc| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | bks | |clr| = | / | * | + * +---------------------------------------------------------+ +---+---+---+---+ + * | tab | q | w | e | r | t | y | u | i | o | p | [ | ] | | | 7 | 8 | 9 | + | + * +-----------------------------------------------------+ | +---+---+---+---+ + * | ctrl | a | s | d | f | g | h | j | k | l | ; | ' |return| | 4 | 5 | 6 | - | + * +---------------------------------------------------------+ +---+---+---+---+ + * | shift | z | x | c | v | b | n | m | , | . | / | shift | | 1 | 2 | 3 | | + * +---------------------------------------------------------+ +-------+---|ent| + * |cap|opt|comnd| ` | | \ |lef|rig|dwn|up | | 0 | . | | + * +---------------------------------------------------------+ +-------+---+---+ + */ +#define LAYOUT_m0116_ansi( \ + K7F, \ + K35,K12,K13,K14,K15,K17,K16,K1A,K1C,K19,K1D,K1B,K18,K33, K47,K51,K4B,K43, \ + K30,K0C,K0D,K0E,K0F,K11,K10,K20,K22,K1F,K23,K21,K1E, K59,K5B,K5C,K45, \ + K36,K00,K01,K02,K03,K05,K04,K26,K28,K25,K29,K27, K24, K56,K57,K58,K4E, \ + K38,K06,K07,K08,K09,K0B,K2D,K2E,K2B,K2F,K2C, K7B, K53,K54,K55, \ + K39,K3A,K37,K32, K31, K2A,K3B,K3C,K3D,K3E, K52, K41,K4C \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07 }, \ + { K08, K09, KC_NO, K0B, K0C, K0D, K0E, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17 }, \ + { K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27 }, \ + { K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \ + { K30, K31, K32, K33, KC_NO, K35, K36, K37 }, \ + { K38, K39, K3A, K3B, K3C, K3D, K3E, KC_NO }, \ + { KC_NO, K41, KC_NO, K43, KC_NO, K45, KC_NO, K47 }, \ + { KC_NO, KC_NO, KC_NO, K4B, K4C, KC_NO, K4E, KC_NO }, \ + { KC_NO, K51, K52, K53, K54, K55, K56, K57 }, \ + { K58, K59, KC_NO, K5B, K5C, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, KC_NO, K7B, KC_NO, KC_NO, KC_NO, K7F } \ +} + +#endif diff --git a/keyboards/converter/adb_usb/config.h b/keyboards/converter/adb_usb/config.h new file mode 100644 index 000000000000..a5845a029047 --- /dev/null +++ b/keyboards/converter/adb_usb/config.h @@ -0,0 +1,43 @@ +/* +Copyright 2011 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 . + +Ported to QMK by Peter Roe +*/ + +#pragma once + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0ADB +#define DEVICE_VER 0x0101 +#define MANUFACTURER QMK +#define PRODUCT ADB keyboard converter +#define DESCRIPTION Convert ADB keyboard to USB + +/* matrix size */ +#define MATRIX_ROWS 16 // keycode bit: 3-0 +#define MATRIX_COLS 8 // keycode bit: 6-4 + +/* 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 + +/* ADB port setting */ +#define ADB_PORT PORTD +#define ADB_PIN PIND +#define ADB_DDR DDRD +#define ADB_DATA_BIT 0 +//#define ADB_PSW_BIT 1 // optional diff --git a/keyboards/converter/adb_usb/keymaps/13bit/keymap.c b/keyboards/converter/adb_usb/keymaps/13bit/keymap.c new file mode 100644 index 000000000000..3b36a20c256b --- /dev/null +++ b/keyboards/converter/adb_usb/keymaps/13bit/keymap.c @@ -0,0 +1,26 @@ +#include QMK_KEYBOARD_H + +#define MCTL LCTL(KC_UP) +#define SCST LSFT(LGUI(KC_4)) +#define SLP LALT(LGUI(KC_EJCT)) + +#define APP1 LSFT(LALT(LCTL(LGUI(KC_1)))) +#define APP2 LSFT(LALT(LCTL(LGUI(KC_2)))) +#define APP3 LSFT(LALT(LCTL(LGUI(KC_3)))) +#define APP4 LSFT(LALT(LCTL(LGUI(KC_4)))) +#define APP5 LSFT(LALT(LCTL(LGUI(KC_5)))) +#define APP6 LSFT(LALT(LCTL(LGUI(KC_6)))) +#define APP7 LSFT(LALT(LCTL(LGUI(KC_7)))) +#define APP8 LSFT(LALT(LCTL(LGUI(KC_8)))) + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + LAYOUT_ext_ansi( + KC_ESC, APP1, APP2, APP3, APP4, APP5, APP6, APP7, APP8, MCTL, KC_MUTE, KC_VOLD, KC_VOLU, SCST, KC_SLCK, KC_PAUS, SLP, + 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_EQL, KC_PSLS, KC_PAST, + 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_PMNS, + KC_LCAP, 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_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT + ), +}; diff --git a/keyboards/converter/adb_usb/keymaps/default/keymap.c b/keyboards/converter/adb_usb/keymaps/default/keymap.c new file mode 100644 index 000000000000..6b63c1a3c1ea --- /dev/null +++ b/keyboards/converter/adb_usb/keymaps/default/keymap.c @@ -0,0 +1,13 @@ +#include QMK_KEYBOARD_H + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + LAYOUT_ext_ansi( + 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_EJCT, + 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_EQL, KC_PSLS, KC_PAST, + 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_PMNS, + KC_LCAP, 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_PPLS, + 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_P1, KC_P2, KC_P3, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT + ), +}; diff --git a/keyboards/converter/adb_usb/led.c b/keyboards/converter/adb_usb/led.c new file mode 100644 index 000000000000..ea9bf77b5c1e --- /dev/null +++ b/keyboards/converter/adb_usb/led.c @@ -0,0 +1,27 @@ +/* +Copyright 2011 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 . +*/ + +#include +#include +#include "adb.h" +#include "led.h" + + +void led_set(uint8_t usb_led) +{ + adb_host_kbd_led(ADB_ADDR_KEYBOARD, ~usb_led); +} diff --git a/keyboards/converter/adb_usb/led.h b/keyboards/converter/adb_usb/led.h new file mode 100644 index 000000000000..19952fae2ab0 --- /dev/null +++ b/keyboards/converter/adb_usb/led.h @@ -0,0 +1,43 @@ +/* +Copyright 2011 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 . + +Ported to QMK by Peter Roe +*/ + +#ifndef LED_H +#define LED_H +#include "stdint.h" + + +/* keyboard LEDs */ +#define USB_LED_NUM_LOCK 0 +#define USB_LED_CAPS_LOCK 1 +#define USB_LED_SCROLL_LOCK 2 +#define USB_LED_COMPOSE 3 +#define USB_LED_KANA 4 + + +#ifdef __cplusplus +extern "C" { +#endif + +void led_set(uint8_t usb_led); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/keyboards/converter/adb_usb/matrix.c b/keyboards/converter/adb_usb/matrix.c new file mode 100644 index 000000000000..8ee48bf23f2c --- /dev/null +++ b/keyboards/converter/adb_usb/matrix.c @@ -0,0 +1,267 @@ +/* +Copyright 2011 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 . + +Ported to QMK by Peter Roe +*/ + +#include +#include +#include +#include +#include "print.h" +#include "util.h" +#include "debug.h" +#include "adb.h" +#include "matrix.h" +#include "report.h" +#include "host.h" +#include "led.h" +#include "timer.h" + +static bool is_iso_layout = false; + +// matrix state buffer(1:on, 0:off) +static matrix_row_t matrix[MATRIX_ROWS]; + +static void register_key(uint8_t key); + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +void matrix_init(void) +{ + // LED on + DDRD |= (1<<6); PORTD |= (1<<6); + + adb_host_init(); + // wait for keyboard to boot up and receive command + _delay_ms(2000); + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; + + led_set(host_keyboard_leds()); + + // debug_enable = false; + // debug_matrix = true; + // debug_keyboard = true; + // debug_mouse = true; + // print("debug enabled.\n"); + + // LED off + DDRD |= (1<<6); PORTD &= ~(1<<6); + matrix_init_quantum(); +} + +#ifdef ADB_MOUSE_ENABLE + +#ifdef MAX +#undef MAX +#endif +#define MAX(X, Y) ((X) > (Y) ? (X) : (Y)) + +static report_mouse_t mouse_report = {}; + +void adb_mouse_task(void) +{ + uint16_t codes; + int16_t x, y; + static int8_t mouseacc; + + /* tick of last polling */ + static uint16_t tick_ms; + + // polling with 12ms interval + if (timer_elapsed(tick_ms) < 12) return; + tick_ms = timer_read(); + + codes = adb_host_mouse_recv(); + // If nothing received reset mouse acceleration, and quit. + if (!codes) { + mouseacc = 1; + return; + }; + // Bit sixteen is button. + if (~codes & (1 << 15)) + mouse_report.buttons |= MOUSE_BTN1; + if (codes & (1 << 15)) + mouse_report.buttons &= ~MOUSE_BTN1; + // lower seven bits are movement, as signed int_7. + // low byte is X-axis, high byte is Y. + y = (codes>>8 & 0x3F); + x = (codes>>0 & 0x3F); + // bit seven and fifteen is negative + // usb does not use int_8, but int_7 (measuring distance) with sign-bit. + if (codes & (1 << 6)) + x = (x-0x40); + if (codes & (1 << 14)) + y = (y-0x40); + // Accelerate mouse. (They weren't meant to be used on screens larger than 320x200). + x *= mouseacc; + y *= mouseacc; + // Cap our two bytes per axis to one byte. + // Easier with a MIN-function, but since -MAX(-a,-b) = MIN(a,b)... + // I.E. MIN(MAX(x,-127),127) = -MAX(-MAX(x, -127), -127) = MIN(-MIN(-x,127),127) + mouse_report.x = -MAX(-MAX(x, -127), -127); + mouse_report.y = -MAX(-MAX(y, -127), -127); + if (debug_mouse) { + print("adb_host_mouse_recv: "); print_bin16(codes); print("\n"); + print("adb_mouse raw: ["); + phex(mouseacc); print(" "); + phex(mouse_report.buttons); print("|"); + print_decs(mouse_report.x); print(" "); + print_decs(mouse_report.y); print("]\n"); + } + // Send result by usb. + host_mouse_send(&mouse_report); + // increase acceleration of mouse + mouseacc += ( mouseacc < ADB_MOUSE_MAXACC ? 1 : 0 ); + return; +} +#endif + +uint8_t matrix_scan(void) +{ + /* extra_key is volatile and more convoluted than necessary because gcc refused + to generate valid code otherwise. Making extra_key uint8_t and constructing codes + here via codes = extra_key<<8 | 0xFF; would consistently fail to even LOAD + extra_key from memory, and leave garbage in the high byte of codes. I tried + dozens of code variations and it kept generating broken assembly output. So + beware if attempting to make extra_key code more logical and efficient. */ + static volatile uint16_t extra_key = 0xFFFF; + uint16_t codes; + uint8_t key0, key1; + + /* tick of last polling */ + static uint16_t tick_ms; + + codes = extra_key; + extra_key = 0xFFFF; + + if ( codes == 0xFFFF ) + { + // polling with 12ms interval + if (timer_elapsed(tick_ms) < 12) return 0; + tick_ms = timer_read(); + + codes = adb_host_kbd_recv(); + } + + key0 = codes>>8; + key1 = codes&0xFF; + + if (debug_matrix && codes) { + print("adb_host_kbd_recv: "); phex16(codes); print("\n"); + } + + if (codes == 0) { // no keys + return 0; + } else if (codes == 0x7F7F) { // power key press + register_key(0x7F); + } else if (codes == 0xFFFF) { // power key release + register_key(0xFF); + } else if (key0 == 0xFF) { // error + xprintf("adb_host_kbd_recv: ERROR(%d)\n", codes); + // something wrong or plug-in + matrix_init(); + return key1; + } else { + /* Swap codes for ISO keyboard + * https://github.com/tmk/tmk_keyboard/issues/35 + * + * ANSI + * ,----------- ----------. + * | *a| 1| 2 =|Backspa| + * |----------- ----------| + * |Tab | Q| | ]| *c| + * |----------- ----------| + * |CapsLo| A| '|Return | + * |----------- ----------| + * |Shift | Shift | + * `----------- ----------' + * + * ISO + * ,----------- ----------. + * | *a| 1| 2 =|Backspa| + * |----------- ----------| + * |Tab | Q| | ]|Retur| + * |----------- -----` | + * |CapsLo| A| '| *c| | + * |----------- ----------| + * |Shif| *b| Shift | + * `----------- ----------' + * + * ADB scan code USB usage + * ------------- --------- + * Key ANSI ISO ANSI ISO + * --------------------------------------------- + * *a 0x32 0x0A 0x35 0x35 + * *b ---- 0x32 ---- 0x64 + * *c 0x2A 0x2A 0x31 0x31(or 0x32) + */ + if (is_iso_layout) { + if ((key0 & 0x7F) == 0x32) { + key0 = (key0 & 0x80) | 0x0A; + } else if ((key0 & 0x7F) == 0x0A) { + key0 = (key0 & 0x80) | 0x32; + } + } + register_key(key0); + if (key1 != 0xFF) // key1 is 0xFF when no second key. + extra_key = key1<<8 | 0xFF; // process in a separate call + } + + matrix_scan_quantum(); + return 1; +} + +void matrix_print(void){ + +} + +inline +matrix_row_t matrix_get_row(uint8_t row) +{ + return matrix[row]; +} + +inline +static void register_key(uint8_t key) +{ + uint8_t col, row; + col = key&0x07; + row = (key>>3)&0x0F; + if (key&0x80) { + matrix[row] &= ~(1< Date: Tue, 23 Oct 2018 14:00:54 -0500 Subject: [PATCH 259/505] keymap for 1upkeyboards/sweet16 multilayers rgb lighting and tapdance (#4208) * keymap for 1upkeyboards/sweet16 multilayers rgb lighting and tapdance * Update config.h typo * cleanup Co-Authored-By: ridingintraffic * layers are using layout macro replaced the include guard (the ifndef, define, and endif at the end) with just #pragma once changed undergrow to use layer-change-code emoji macros are using send_hex_code_string cleaned up the includes * tap() removed maxtrix_scan_user updated conf.h cleanup --- .../sweet16/keymaps/ridingintraffic/config.h | 15 ++ .../sweet16/keymaps/ridingintraffic/keymap.c | 215 ++++++++++++++++++ .../sweet16/keymaps/ridingintraffic/readme.md | 10 + .../sweet16/keymaps/ridingintraffic/rules.mk | 5 + 4 files changed, 245 insertions(+) create mode 100644 keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/config.h create mode 100644 keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/keymap.c create mode 100644 keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/readme.md create mode 100644 keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/rules.mk diff --git a/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/config.h b/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/config.h new file mode 100644 index 000000000000..c83544007644 --- /dev/null +++ b/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/config.h @@ -0,0 +1,15 @@ +#pragma once + +/* tap dance stuff*/ +#undef TAPPING_TERM +#define TAPPING_TERM 500 + +#define TAPPING_TOGGLE 2 + +#define EXAMPLESTRING1 "tapdance_1" +#define EXAMPLESTRING2 "tapdance_2" +#define EXAMPLESTRING3 "tapdance_3" +#define EXAMPLESTRING4 "tapdance_4" + +#undef RGBLED_NUM +#define RGBLED_NUM 16 \ No newline at end of file diff --git a/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/keymap.c b/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/keymap.c new file mode 100644 index 000000000000..ad9786ba7f20 --- /dev/null +++ b/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/keymap.c @@ -0,0 +1,215 @@ +/* +tap danc eis turned on in the rules now... +*/ +#include QMK_KEYBOARD_H + +#define _EMOJI 0 +#define _TAPLAND 1 +#define _LEDCNTL 2 + +enum custom_keycodes { + SHRUG, + DISFACE, + FU, + TFLIP, + TFLIP2, + SAD_EYES, + TPUT, + HAPPYFACE, + HEARTFACE, + CLOUD, + CHANFACE, + CMDCLEAR +}; +//Tap Dance Declarations +enum { + TD_EXAMPLE1 = 0, + TD_EXAMPLE2, + TD_EXAMPLE3, + TD_EXAMPLE4 +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* EMOJI Pad + * ,-------------------------------. + * |TFLIP | TFlIP2|DISFACE| FU | + * |------+-------+-------+--------| + * | CLOUD| | | CLEAR | + * |------+-------+-------+--------| + * |SHRUG |DISFACE| HRTFAC| HAPPYF | + * |------+-------+-------+--------| + * | ENTER| |LEDCNTR| tapland| + * `-------------------------------' + */ + //purple + [_EMOJI] = LAYOUT_ortho_4x4( + TFLIP, TFLIP2, KC_NO, FU , + CLOUD, KC_NO, KC_NO, CMDCLEAR, + SHRUG, DISFACE, HEARTFACE, HAPPYFACE, + KC_ENT, RGB_TOG, MO(_LEDCNTL), MO(_TAPLAND) + ), + + /* TapLand // + * ,-------------------------------. + * | str1 | str2 | str3 | str4 | + * |------+-------+-------+--------| + * | | | | | + * |------+-------+-------+--------| + * | | | | | + * |------+-------+-------+--------| + * | | | | | + * `-------------------------------' + */ + //blue + [_TAPLAND] = LAYOUT_ortho_4x4( + TD(TD_EXAMPLE1), TD(TD_EXAMPLE2), TD(TD_EXAMPLE3), TD(TD_EXAMPLE4), + KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO + ), + /* LEDControl Pad + * ,-------------------------------. + * | snake|breathe|rainbow|gradient| + * |------+-------+-------+--------| + * | xmas | Val+ | Sat+ | HUE+ | + * |------+-------+-------+--------| + * |kngrdr| Val- | Sat- | HUE- | + * |------+-------+-------+--------| + * | swirl| PLAIN | | ON/OFF | + * `-------------------------------' + */ + //blue + [_LEDCNTL] = LAYOUT_ortho_4x4( + RGB_M_SN, RGB_M_B, RGB_M_R, RGB_M_G, + RGB_M_X, RGB_VAI, RGB_SAI, RGB_HUI, + RGB_M_K, RGB_VAD, RGB_SAD, RGB_HUD, + RGB_M_SW, RGB_M_P, KC_NO, RGB_TOG + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch(keycode) { + case CLOUD: // (っ◕‿◕)っ + if(record->event.pressed){ + send_unicode_hex_string("0028 3063 25D5 203F 25D5 0029 3063"); + } + return false; + break; + case FU: // t(-_-t) + if(record->event.pressed){ + SEND_STRING("t(-_-t)"); + } + return false; + break; + case HAPPYFACE: // ʘ‿ʘ + if(record->event.pressed){ + send_unicode_hex_string("0298 203F 0298"); + } + return false; + break; + case CMDCLEAR: + if (record->event.pressed) { + register_code(KC_LGUI); + tap_code(KC_A); + unregister_code(KC_LGUI); + tap_code(KC_DEL); + } + return false; + break; + case SHRUG: // ¯\_(ツ)_/¯ + if (record->event.pressed) { + send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); + } + return false; + break; + case HEARTFACE: // ♥‿♥ + if(record->event.pressed){ + send_unicode_hex_string("2665 203F 2665"); + } + return false; + break; + case DISFACE: // ಠ_ಠ + if(record->event.pressed){ + send_unicode_hex_string("0CA0 005F 0CA0"); + } + return false; + break; + case TFLIP: // (╯°□°)╯ ︵ ┻━┻ + if(record->event.pressed){ + send_unicode_hex_string("0028 256F 00B0 25A1 00B0 0029 256F 0020 FE35 0020 253B 2501 253B"); + } + return false; + break; + case TFLIP2: // ┻━┻︵ \(°□°)/ ︵ ┻━┻ + if(record->event.pressed){ + send_unicode_hex_string("253B 2501 253B FE35 0020 005C 0028 00B0 25A1 00B0 0029 002F 0020 FE35 0020 253B 2501 253B"); + } + return false; + break; + } + } + return true; +} + + +/* tap dance time */ +void tdexample1(qk_tap_dance_state_t *state, void *user_data) { + if (state->count >= 2) { + SEND_STRING(EXAMPLESTRING1); + reset_tap_dance (state); + } +} +void tdexample2(qk_tap_dance_state_t *state, void *user_data) { + if (state->count >= 2) { + SEND_STRING(EXAMPLESTRING2); + reset_tap_dance (state); + } +} +void tdexample3(qk_tap_dance_state_t *state, void *user_data) { + if (state->count >= 2) { + SEND_STRING(EXAMPLESTRING3); + reset_tap_dance (state); + } +} +void tdexample4(qk_tap_dance_state_t *state, void *user_data) { + if (state->count >= 2) { + SEND_STRING(EXAMPLESTRING4); + reset_tap_dance (state); + } +} + +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_EXAMPLE1] = ACTION_TAP_DANCE_FN(tdexample1), + [TD_EXAMPLE2] = ACTION_TAP_DANCE_FN(tdexample2), + [TD_EXAMPLE3] = ACTION_TAP_DANCE_FN(tdexample3), + [TD_EXAMPLE4] = ACTION_TAP_DANCE_FN(tdexample4) +}; + +// Runs just one time when the keyboard initializes. +void matrix_scan_user(void) { + static bool has_ran_yet; + if (!has_ran_yet) { + has_ran_yet = true; + rgblight_setrgb (16, 0, 16); + } +} +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case _TAPLAND: + rgblight_setrgb(0, 16, 0); //green + break; + case _LEDCNTL: + rgblight_setrgb(0, 0, 16); //blue + break; + case _EMOJI: + rgblight_setrgb (16, 0, 16); //purple + break; + + default: // for any other layers, or the default layer + rgblight_setrgb (16, 0, 16); //purple + break; + } + return state; +} \ No newline at end of file diff --git a/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/readme.md b/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/readme.md new file mode 100644 index 000000000000..7a3b8c8e4429 --- /dev/null +++ b/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/readme.md @@ -0,0 +1,10 @@ +# Ridingtraffic's examples +=== +This keymap has many features: +3 layers +Momentary layer switching +16 pixel neopixel +Unicode Enabled +Tap dance enabled + +The rgb also updates depending on what layer you are on, and then flips back when done. diff --git a/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/rules.mk b/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/rules.mk new file mode 100644 index 000000000000..de441755318e --- /dev/null +++ b/keyboards/1upkeyboards/sweet16/keymaps/ridingintraffic/rules.mk @@ -0,0 +1,5 @@ +# turning on tap dance +TAP_DANCE_ENABLE = yes +RGBLIGHT_ENABLE = yes +MOUSEKEY_ENABLE = no +UNICODE_ENABLE = yes \ No newline at end of file From c8267d9fea5e8b0dbdeb8521238c922ff4a83a99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Tue, 23 Oct 2018 21:34:06 +0200 Subject: [PATCH 260/505] Update whitefox/konstantin keymap (#4220) * Change brace style to QMK OTBS * Change Unicode input mode to UC_WINC * Align constant values in config.h --- keyboards/whitefox/keymaps/konstantin/config.h | 18 +++++++++--------- keyboards/whitefox/keymaps/konstantin/keymap.c | 18 ++++++------------ 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/keyboards/whitefox/keymaps/konstantin/config.h b/keyboards/whitefox/keymaps/konstantin/config.h index 725609b465c7..39450d680268 100644 --- a/keyboards/whitefox/keymaps/konstantin/config.h +++ b/keyboards/whitefox/keymaps/konstantin/config.h @@ -2,16 +2,16 @@ #define FORCE_NKRO -#define PERMISSIVE_HOLD -#define TAPPING_TERM 200 -#define TAPPING_TOGGLE 2 +#define MOUSEKEY_DELAY 50 +#define MOUSEKEY_INTERVAL 15 +#define MOUSEKEY_MAX_SPEED 4 +#define MOUSEKEY_TIME_TO_MAX 50 +#define MOUSEKEY_WHEEL_MAX_SPEED 1 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 50 -#define MOUSEKEY_DELAY 50 -#define MOUSEKEY_INTERVAL 15 -#define MOUSEKEY_MAX_SPEED 4 -#define MOUSEKEY_TIME_TO_MAX 50 -#define MOUSEKEY_WHEEL_MAX_SPEED 1 -#define MOUSEKEY_WHEEL_TIME_TO_MAX 50 +#define PERMISSIVE_HOLD +#define TAPPING_TERM 200 +#define TAPPING_TOGGLE 2 #undef IS_COMMAND #define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL))) diff --git a/keyboards/whitefox/keymaps/konstantin/keymap.c b/keyboards/whitefox/keymaps/konstantin/keymap.c index 247bc6bbffc0..edb049287c2c 100644 --- a/keyboards/whitefox/keymaps/konstantin/keymap.c +++ b/keyboards/whitefox/keymaps/konstantin/keymap.c @@ -19,9 +19,8 @@ #define UC_DIVS UC(0x00F7) #define UC_MINS UC(0x2212) -void matrix_init_user(void) -{ - set_unicode_input_mode(UC_WIN); +void matrix_init_user(void) { + set_unicode_input_mode(UC_WINC); } enum layers { @@ -35,13 +34,10 @@ enum custom_keycodes { NUMPAD, }; -bool process_record_user(uint16_t keycode, keyrecord_t *record) -{ +bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case CLEAR: - if (record->event.pressed) { - SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); - } + if (record->event.pressed) { SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); } return false; case NUMPAD: @@ -65,15 +61,13 @@ enum tap_dance { TD_DESKTOP, }; -void td_fn_rctl_finished(qk_tap_dance_state_t *state, void *user_data) -{ +void td_fn_rctl_finished(qk_tap_dance_state_t *state, void *user_data) { // Single tap → Fn, double tap → RCtrl, triple tap → Fn+RCtrl etc. if (state->count & 1) { layer_on(L_FN); } if (state->count & 2) { register_code(KC_RCTL); } } -void td_fn_rctl_reset(qk_tap_dance_state_t *state, void *user_data) -{ +void td_fn_rctl_reset(qk_tap_dance_state_t *state, void *user_data) { if (state->count & 1) { layer_off(L_FN); } if (state->count & 2) { unregister_code(KC_RCTL); } } From b0a021c07aa38905090058bd57b9304425594557 Mon Sep 17 00:00:00 2001 From: Ajax Date: Tue, 23 Oct 2018 15:44:48 -0400 Subject: [PATCH 261/505] Made a userspace that allows you to use your keyboard as an order of operations based calculator (#2864) * Made DZ60 layout with calculator * Cleaned up and commented, preparing to fix bug with negative in front of open parenthesis as first character * Fixed bug where negative sign infront of parenthesis as first character was parsed incorrectly * Made a better solution for the bug from the previous commit * Modularized and added a userfile so that this code can be used on various keyboards, found in doogle999 * Removed commented code from keymap * Made the layer that is used for calculations a define so that it can be changed per keyboard * Made the readme * Made the readme in the correct place * Revert "Made the readme in the correct place" This reverts commit 7f8b59ed9e59c77401a48be3a7ac1e8fd8e84e32. * Manually synced with qmk upstream * Stopped repeat, made keys print character that they are defined as rather than what the keyboard wants them to do * Added support for numpad, might make all keycodes custom so that there is no need to change doogle999.c if you want to change the keycode that is associated with a function, also made numpad automatically activating an option * Fixed some bugs with backspacing, updated the readme * Fixed some bugs with numlock turning on at the wrong times when a shift key was down * Made the return to layer work automatically instead of just forcing it to layer 0 * fixes and style changes, 20% decreased binary size * Fixed some bugs with double printing and compilation errors on my side * Fixed bug with exceeding the buffer size * Removed changes that added const-ness * Made changes so that backspace does not repeat to remove backspace bugs, still some bugs with recalculating without having typed anything * Fixed obo error with calc main loop * Made includes more accurate in keymap for dz60 * Moved flags to user makefile --- keyboards/dz60/keymaps/doogle999/keymap.c | 74 ++++ tmk_core/rules.mk | 1 - users/doogle999/doogle999.c | 460 ++++++++++++++++++++++ users/doogle999/doogle999.h | 99 +++++ users/doogle999/readme.md | 41 ++ users/doogle999/rules.mk | 14 + 6 files changed, 688 insertions(+), 1 deletion(-) create mode 100644 keyboards/dz60/keymaps/doogle999/keymap.c create mode 100644 users/doogle999/doogle999.c create mode 100644 users/doogle999/doogle999.h create mode 100644 users/doogle999/readme.md create mode 100644 users/doogle999/rules.mk diff --git a/keyboards/dz60/keymaps/doogle999/keymap.c b/keyboards/dz60/keymaps/doogle999/keymap.c new file mode 100644 index 000000000000..deea641f70e1 --- /dev/null +++ b/keyboards/dz60/keymaps/doogle999/keymap.c @@ -0,0 +1,74 @@ +#include QMK_KEYBOARD_H + +#include "doogle999.h" + +#define ______ KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Base layer + * ,-----------------------------------------------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace | + * |-----------------------------------------------------------------------------------------+ + * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | + * |-----------------------------------------------------------------------------------------+ + * | Fn | A | S | D | F | G | H | J | K | L | ; | ' | Enter | + * |-----------------------------------------------------------------------------------------+ + * | Shift | Z | X | C | V | B | N | M | , | . | Shift | U | Del | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl | Cmd | Alt | Space | / | Fn | L | D | R | + * `-----------------------------------------------------------------------------------------' + */ + + LAYOUT_directional( + 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, + MO(1), 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_RSFT, KC_UP, KC_DELETE, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SLSH, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT + ), + +/* Fn layer + * ,-----------------------------------------------------------------------------------------. + * | ~ | F1 | F2 | F3 | F4 | F5 | F6 | f7 | F8 | F9 | F10 | F11 | F12 | Backspace | + * |-----------------------------------------------------------------------------------------+ + * | Reset | NP1 | NP2 | NP3 | NP4 | NP5 | NP6 | NP7 | NP8 | NP9 | NP0 |VolD |VolU | Mute | + * |-----------------------------------------------------------------------------------------+ + * | | | | | | | | | | BlD | BlI | BlT | Menu | + * |-----------------------------------------------------------------------------------------+ + * | Shift | Cyc+| Cyc-| Val+| Val-| Hue+| Hue-| Sat+| Sat-| Tog | Shift | Pup | Ins | + * |-----------------------------------------------------------------------------------------+ + * | Ctrl | Cmd | Alt | Space |HwCal| |Home | Pdn | End | + * `-----------------------------------------------------------------------------------------' + */ + + LAYOUT_directional( + 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_CALC, + RESET, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_0, KC_VOLD, KC_VOLU, KC_MUTE, + ______, ______, ______, ______, ______, ______, ______, ______, ______, BL_DEC, BL_INC, BL_TOGG, KC_APP, + KC_LSFT, ______, RGB_MOD, RGB_RMOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_TOG, KC_RSFT, KC_PGUP, KC_INSERT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, TO(2), ______, KC_HOME, KC_PGDOWN, KC_END + ), + + /* Hardware calculator layer + * ,-----------------------------------------------------------------------------------------. + * |EndCa| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Backspace | + * |-----------------------------------------------------------------------------------------+ + * | | Q | | E | | T | | | | | P | | | | + * |-----------------------------------------------------------------------------------------+ + * | | | S | | | | | | | L | | | Calc | + * |-----------------------------------------------------------------------------------------+ + * | Shift | | | | C | | | | | . | Shift | | | + * |-----------------------------------------------------------------------------------------+ + * | | | | | / | | | | | + * `-----------------------------------------------------------------------------------------' + */ + + LAYOUT_directional( + ENDCALC, 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_Q, ______, KC_E, ______, KC_T, ______, ______, ______, ______, KC_P, ______, ______, ______, + ______, ______, KC_S, ______, ______, ______, ______, ______, ______, KC_L, ______, ______, CALC, + KC_LSFT, ______, ______, ______, KC_C, ______, ______, ______, ______, ______, KC_DOT, KC_RSFT, ______, ______, + ______, ______, ______, ______, ______, ______, KC_SLSH, ______, ______, ______, ______ + ), +}; \ No newline at end of file diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk index f1ef733f6904..ce3cd83b3f15 100644 --- a/tmk_core/rules.mk +++ b/tmk_core/rules.mk @@ -103,7 +103,6 @@ endif CFLAGS += -Wa,-adhlns=$(@:%.o=%.lst) CFLAGS += $(CSTANDARD) - #---------------- Compiler Options C++ ---------------- # -g*: generate debugging information # -O*: optimization level diff --git a/users/doogle999/doogle999.c b/users/doogle999/doogle999.c new file mode 100644 index 000000000000..320de7cff829 --- /dev/null +++ b/users/doogle999/doogle999.c @@ -0,0 +1,460 @@ +#include "doogle999.h" + +static unsigned char inputLocation = 0; // Current index in text input + +static double calc(const char input[CALC_BUFFER_SIZE +1]) // Finds value of input char array, relatively small and fast I think +{ + char inputToken[CALC_BUFFER_SIZE + 1]; // Input buffer, used when a single token (generally a number) takes up more + unsigned char inputTokenLocation = 0, inputLocation = 0; // Keep track of indices + + struct Token tokens[CALC_BUFFER_SIZE + 1]; // Input, converted to tokens, one extra large to accomodate for possible negative sign then open parenthesis as first character + unsigned char tokenCount = 0; // Keep track of index + + bool dashAsMinus = false; // Kind of a hacky solution to determining whether to treat a dash as a minus sign or a negative sign + + while(inputLocation < CALC_BUFFER_SIZE + 1) + { + char digit = input[inputLocation]; + + if(inputLocation == 0 && input[inputLocation] == CALC_CHAR_SUB && input[inputLocation + 1] == CALC_CHAR_BEG) + { + tokens[tokenCount].raw.num = 0; + tokens[tokenCount].isNum = true; + + tokenCount++; + dashAsMinus = true; + } + + if ((digit >= '0' && digit <= '9') || /* valid digit */ + (inputTokenLocation != 0 && input[inputLocation] == CALC_CHAR_DEC) || /* valid floating point */ + (!dashAsMinus && inputTokenLocation == 0 && input[inputLocation] == CALC_CHAR_SUB)) /* - is negative sign */ + { + inputToken[inputTokenLocation] = input[inputLocation]; + inputTokenLocation++; + inputLocation++; + continue; + } + + if(inputTokenLocation != 0) + { + // sscanf(inputToken, "%lf", &tokens[tokenCount].raw.num); // I would like to use sscanf here, but the small version of stdio.h on the chip doesn't allow sscanf or its sister functions to be used to process floats + tokens[tokenCount].raw.num = atof(inputToken); + tokens[tokenCount].isNum = true; + for(unsigned char i = 0; i < inputTokenLocation + 1; i++) + { + inputToken[i] = '\0'; + } + inputTokenLocation = 0; + tokenCount++; + dashAsMinus = true; + continue; + } + + /* inputTokenLocation == 0 */ + tokens[tokenCount].isNum = false; + tokens[tokenCount].raw.op.c = input[inputLocation]; + tokens[tokenCount].raw.op.priority = 0; + tokens[tokenCount].raw.op.ltr = true; + dashAsMinus = false; + + switch(input[inputLocation]) + { + case CALC_CHAR_BEG: + break; + case CALC_CHAR_END: + dashAsMinus = true; + break; + case CALC_CHAR_ADD: + tokens[tokenCount].raw.op.priority = CALC_PRIO_ADD; + break; + case CALC_CHAR_SUB: + tokens[tokenCount].raw.op.priority = CALC_PRIO_SUB; + break; + case CALC_CHAR_MUL: + tokens[tokenCount].raw.op.priority = CALC_PRIO_MUL; + break; + case CALC_CHAR_DIV: + tokens[tokenCount].raw.op.priority = CALC_PRIO_DIV; + break; + case CALC_CHAR_EXP: + tokens[tokenCount].raw.op.priority = CALC_PRIO_EXP; + tokens[tokenCount].raw.op.ltr = false; + break; + case CALC_CHAR_SIN: + case CALC_CHAR_COS: + case CALC_CHAR_TAN: + case CALC_CHAR_ASN: + case CALC_CHAR_ACS: + case CALC_CHAR_ATN: + case CALC_CHAR_LGE: + case CALC_CHAR_LOG: + case CALC_CHAR_SQT: + break; + case CALC_CHAR_EUL: + tokens[tokenCount].isNum = true; + tokens[tokenCount].raw.num = CALC_VALU_EUL; + dashAsMinus = true; + break; + case CALC_CHAR_PI: + tokens[tokenCount].isNum = true; + tokens[tokenCount].raw.num = CALC_VALU_PI; + dashAsMinus = true; + break; + case '\0': + tokenCount--; + inputLocation = CALC_BUFFER_SIZE; + break; + default: + tokenCount--; + break; + } + tokenCount++; + inputLocation++; + } + + struct Token output[CALC_BUFFER_SIZE + 1]; // Final output tokens before evaluation + struct Token opstack[CALC_BUFFER_SIZE + 1]; // Stack of operators + unsigned char outputLocation = 0, opstackLocation = 0; // Keep track of indices + + unsigned char numBrackets = 0; // The number of parenthesis + + for(unsigned char i = 0; i < tokenCount; i++) + { + if(tokens[i].isNum) + { + output[outputLocation] = tokens[i]; + outputLocation++; + } + else if(tokens[i].raw.op.c == CALC_CHAR_BEG) + { + opstack[opstackLocation] = tokens[i]; + opstackLocation++; + } + else if(tokens[i].raw.op.c == CALC_CHAR_END) + { + while(opstack[opstackLocation - 1].raw.op.c != CALC_CHAR_BEG) + { + output[outputLocation] = opstack[opstackLocation - 1]; + outputLocation++; + opstackLocation--; + } + opstackLocation--; + + numBrackets += 2; + } + else if(tokens[i].raw.op.priority == 0) + { + opstack[opstackLocation] = tokens[i]; + opstackLocation++; + } + else + { + while(opstackLocation != 0 + && (opstack[opstackLocation - 1].raw.op.priority == 0 + || tokens[i].raw.op.priority < opstack[opstackLocation - 1].raw.op.priority + || (tokens[i].raw.op.priority == opstack[opstackLocation - 1].raw.op.priority && opstack[opstackLocation - 1].raw.op.ltr)) + && opstack[opstackLocation - 1].raw.op.c != CALC_CHAR_BEG) + { + output[outputLocation] = opstack[opstackLocation - 1]; + outputLocation++; + opstackLocation--; + } + opstack[opstackLocation] = tokens[i]; + opstackLocation++; + } + } + + tokenCount -= numBrackets; + + for(signed char i = opstackLocation - 1; i >= 0; i--) + { + output[outputLocation] = opstack[i]; + outputLocation++; + opstackLocation--; + } + + double answer[CALC_BUFFER_SIZE]; + unsigned char answerLocation = 0; + + for(unsigned char i = 0; i < tokenCount; i++) + { + if(output[i].isNum) + { + answer[answerLocation] = output[i].raw.num; + answerLocation++; + continue; + } + + if(output[i].raw.op.priority == 0) + { + if (answerLocation < 1) { /* not handled here -- ERROR? */ } else + if(answerLocation >= 1) + { + double (*op)(double); + switch(output[i].raw.op.c) + { + case CALC_CHAR_SIN: + op = sin; + break; + case CALC_CHAR_COS: + op = cos; + break; + case CALC_CHAR_TAN: + op = tan; + break; + case CALC_CHAR_ASN: + op = asin; + break; + case CALC_CHAR_ACS: + op = acos; + break; + case CALC_CHAR_ATN: + op = atan; + break; + case CALC_CHAR_LGE: + op = log; + break; + case CALC_CHAR_LOG: + op = log10; + break; + case CALC_CHAR_SQT: + op = sqrt; + break; + default: + continue; /* invalid input */ + } + answer[answerLocation - 1] = op(answer[answerLocation - 1]); + } + } + /* priority != 0 */ + else if(answerLocation >= 2) + { + switch(output[i].raw.op.c) + { + case CALC_CHAR_ADD: + answer[answerLocation - 2] += answer[answerLocation - 1]; + break; + case CALC_CHAR_SUB: + answer[answerLocation - 2] -= answer[answerLocation - 1]; + break; + case CALC_CHAR_MUL: + answer[answerLocation - 2] *= answer[answerLocation - 1]; + break; + case CALC_CHAR_DIV: + answer[answerLocation - 2] /= answer[answerLocation - 1]; + break; + case CALC_CHAR_EXP: + answer[answerLocation - 2] = pow(answer[answerLocation - 2], answer[answerLocation - 1]); + break; + } + + answerLocation--; + } + } + + return answer[0]; +} + +/* + * @returns 0 when nothing should happen and QMK should work as usual + * @returns -1 when invalid input was given, QMK should ignore it + * @returns -2 when BSP should be done + * @returns -3 when CALC should be done + * @returns -4 when ENDCALC should be done + * @returns positive value of CALC_* when normal input was processed + */ +static int process_input(const uint16_t keycode, const uint8_t mods, const keyevent_t event) +{ + /* handle even when no key was pressed */ + if(!event.pressed) + { + switch(keycode) + { + /* QMK should handle those */ + case KC_RSFT: + case KC_LSFT: + return 0; + break; + } + /* ??? ignore */ + return -1; + } + + /* when shift key is pressed handle characters differently */ + char characterPressed; + if((get_mods() & MODS_SHIFT_MASK)) + { + switch(keycode) + { + case KC_9: + characterPressed = CALC_CHAR_BEG; + break; + case KC_0: + characterPressed = CALC_CHAR_END; + break; + case KC_EQUAL: + characterPressed = CALC_CHAR_ADD; + break; + case KC_KP_PLUS: + characterPressed = CALC_CHAR_ADD; + break; + case KC_6: + characterPressed = CALC_CHAR_EXP; + break; + case KC_8: + characterPressed = CALC_CHAR_MUL; + break; + case KC_KP_ASTERISK: + characterPressed = CALC_CHAR_MUL; + break; + case KC_S: + characterPressed = CALC_CHAR_ASN; + break; + case KC_C: + characterPressed = CALC_CHAR_ACS; + break; + case KC_T: + characterPressed = CALC_CHAR_ATN; + break; + case KC_L: + characterPressed = CALC_CHAR_LOG; + break; + default: + return -1; + break; + } + return characterPressed; + } + + /* normal key handling: shift not pressed */ + + /* digits */ + if (keycode == KC_KP_0 || keycode == KC_0) { + return '0'; + } else if (keycode >= KC_KP_1 && keycode <= KC_KP_9) { + return keycode - KC_KP_1 +1 + '0'; + } else if (keycode >= KC_1 && keycode <= KC_9) { + return keycode - KC_1 +1 + '0'; + } + + /* other tokens */ + switch (keycode) { + case KC_MINUS: + case KC_KP_MINUS: + return characterPressed = CALC_CHAR_SUB; + case KC_SLASH: + case KC_KP_SLASH: + return characterPressed = CALC_CHAR_DIV; + case KC_S: + return characterPressed = CALC_CHAR_SIN; + case KC_C: + return characterPressed = CALC_CHAR_COS; + case KC_T: + return characterPressed = CALC_CHAR_TAN; + case KC_Q: + return characterPressed = CALC_CHAR_SQT; + case KC_L: + return characterPressed = CALC_CHAR_LGE; + case KC_DOT: + case KC_KP_DOT: + return characterPressed = CALC_CHAR_DEC; + case KC_P: + return characterPressed = CALC_CHAR_PI; + case KC_E: + return characterPressed = CALC_CHAR_EUL; + case KC_BSPC: + return -2; + case KC_RSFT: + return 0; + case KC_LSFT: + return 0; + case CALC: + return -3; + case ENDCALC: + return -4; + default: + return -1; + } +} + +bool process_record_user(uint16_t keycode, keyrecord_t* record) +{ + static char text[CALC_BUFFER_SIZE + 1]; // Used to store input and then output when ready to print + static char backspaceText[CALC_BUFFER_SIZE + 1]; // Pretty dumb waste of memory because only backspace characters, used with send_string to backspace and remove input + + if((biton32(layer_state) == CALC_LAYER && CALC_FORCE_NUM_LOCK_INSIDE_CALC) || (biton32(layer_state) != CALC_LAYER && CALC_FORCE_NUM_LOCK_OUTSIDE_CALC)) + { + bool numpadKeyPressed = record->event.pressed && + !(get_mods() & MODS_SHIFT_MASK) && + /* KC_KP_1, KC_KP_2, ..., KC_KP_0, KC_KP_DOT */ + (keycode >= KC_KP_1 && keycode <= KC_KP_DOT); + + if(numpadKeyPressed && !(host_keyboard_leds() & (1 << USB_LED_NUM_LOCK))) + { + add_key(KC_NLCK); + send_keyboard_report(); + del_key(KC_NLCK); + } + } + + if(biton32(layer_state) != CALC_LAYER) { return true; } + + int action = process_input(keycode, get_mods(), record->event); + switch(action) + { + case 0: + return true; + case -1: + return false; + case -2: + if(inputLocation > 0) + { + inputLocation--; + text[inputLocation] = '\0'; + backspaceText[0] = (char)8; + backspaceText[1] = '\0'; + send_string(backspaceText); + } + return false; + case -3: + for(int i = 0; i < inputLocation; i++) + { + backspaceText[i] = (char)8; + } + send_string(backspaceText); + dtostrf(calc(text), CALC_PRINT_SIZE, CALC_PRINT_SIZE, text); + send_string(text); + for(unsigned char i = 0; i < CALC_BUFFER_SIZE; i++) + { + text[i] = '\0'; + backspaceText[i] = '\0'; + } + inputLocation = 0; + return false; + case -4: + for(unsigned char i = 0; i < CALC_BUFFER_SIZE; i++) + { + text[i] = '\0'; + backspaceText[i] = '\0'; + } + inputLocation = 0; + layer_off(CALC_LAYER); + return false; + default: + break; + } + char characterPressed = (char)action; + + if(inputLocation < CALC_BUFFER_SIZE) + { + text[inputLocation] = characterPressed; + inputLocation++; + + char characterToSend[2]; + characterToSend[0] = characterPressed; + characterToSend[1] = '\0'; + + send_string(characterToSend); + } + return false; +} \ No newline at end of file diff --git a/users/doogle999/doogle999.h b/users/doogle999/doogle999.h new file mode 100644 index 000000000000..7ed38fbcc8f1 --- /dev/null +++ b/users/doogle999/doogle999.h @@ -0,0 +1,99 @@ +#ifndef USERSPACE +#define USERSPACE + +#include "quantum.h" + +#define NO_ACTION_ONESHOT +#define NO_ACTION_MACRO + +#define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +// Layer the calculator is on +#define CALC_LAYER 2 + +// Inside is whether when you are in calc mode it should automatically force numlock, outside is whether it should do it outside of calculator mode +#define CALC_FORCE_NUM_LOCK_INSIDE_CALC true +#define CALC_FORCE_NUM_LOCK_OUTSIDE_CALC true + +// Maximum number of characters the calculator can have +#define CALC_BUFFER_SIZE 32 + +// Minimum width of the printed text / the number of decimal places +#define CALC_PRINT_SIZE 6 + +/*----- + Special +-----*/ +#define CALC_CHAR_BEG '(' +#define CALC_CHAR_END ')' +#define CALC_CHAR_DEC '.' + +/*----- + Operators - Can add more here such as modulo %, factorial ! +-----*/ +#define CALC_CHAR_ADD '+' +#define CALC_PRIO_ADD 1 + +#define CALC_CHAR_SUB '-' +#define CALC_PRIO_SUB 1 + +#define CALC_CHAR_MUL '*' +#define CALC_PRIO_MUL 2 + +#define CALC_CHAR_DIV '/' +#define CALC_PRIO_DIV 2 + +#define CALC_CHAR_EXP '^' +#define CALC_PRIO_EXP 3 + +/*----- + Functions +-----*/ +#define CALC_CHAR_SIN 's' +#define CALC_CHAR_COS 'c' +#define CALC_CHAR_TAN 't' + +#define CALC_CHAR_ASN 'S' +#define CALC_CHAR_ACS 'C' +#define CALC_CHAR_ATN 'T' + +#define CALC_CHAR_LGE 'l' +#define CALC_CHAR_LOG 'L' + +#define CALC_CHAR_SQT 'q' + +/*----- + Constants +-----*/ +#define CALC_CHAR_EUL 'e' +#define CALC_VALU_EUL 2.71828182845904523536 + +#define CALC_CHAR_PI 'p' +#define CALC_VALU_PI 3.14159265358979323846 + +struct OP // Operator/function +{ + char c; + unsigned char priority; + bool ltr; +}; + +union TokenRaw // A token after the input has been processed, can either be a number or an operator/function +{ + double num; + struct OP op; +}; + +struct Token // Encapsulator +{ + bool isNum; + union TokenRaw raw; +}; + +enum CalcFunctions // Hardware calculator key functionality +{ + CALC = SAFE_RANGE, + ENDCALC +}; + +#endif diff --git a/users/doogle999/readme.md b/users/doogle999/readme.md new file mode 100644 index 000000000000..e108555b9c48 --- /dev/null +++ b/users/doogle999/readme.md @@ -0,0 +1,41 @@ +Copyright 2018 @doogle999 + +Overview +======== + +This folder is just for some calculator code for my keyboards. + +Making Your Keyboard Into A Calculator +-------------------------------------- + +If you'd like to make your keyboard into a calculator, you can do it with this userspace (hopefully!) + +You can make a keymap for your keyboard of choice named doogle999 and then you can make it regularly. + +You should make one layer that is just the functionality for your calculator, so it just has the keys you need (numbers, symbols, some letters for functions). It should also have END_CALC and CALC somewhere. END_CALC gets you out of calculator mode, and CALC evaluates the calculation. + +On one of your other keymaps you should make a key that is TO(layer of calculator). This is how you will activate the calculator. You should also define the layer your calculator is on with the define CALC_LAYER in doogle999.h (this means that for all your keyboards, your calculator layer has to be the same layer). + +You can change what characters coorespond to what operators and functions and you can add more functions in doogle999.h and doogle999.c, you can also change which characters are sued for which keys. However, as of now standard keys should be used for operations. By that I mean if you want your multiplication sign to be an x, you should change the CALC_CHAR_MUL to an x but you should keep your multiplication keycode on the keymap either as KC_8 (shifted) or KC_KP_ASTERISK. This might be changed in the future so there are custom keycodes so this is less of a pain and more intuitive. + +You can look at my dz60 keymap doogle999 for an example. + +Issues +------ +Unfortunately the chip onboard my dz60 only does single precision floating point numbers, but I have everything set up as double so if your chip supports doubles it should work for you. + +This Was Here When I Made The ReadMe +------------------------------------ + +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 . \ No newline at end of file diff --git a/users/doogle999/rules.mk b/users/doogle999/rules.mk new file mode 100644 index 000000000000..12698a27e587 --- /dev/null +++ b/users/doogle999/rules.mk @@ -0,0 +1,14 @@ +SRC += doogle999.c + +CFLAGS += -fstrict-aliasing -ftree-vrp + +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 # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = yes From 9ed0c2d57b4f5014c24ea48a6fe448b69789957b Mon Sep 17 00:00:00 2001 From: Callum Oakley Date: Wed, 24 Oct 2018 00:28:40 +0100 Subject: [PATCH 262/505] Keymap update (#4223) * change window focus shortcuts * hangul * macos goodness * re-arrange tab keys * remove tab switching keys * left hand func * glorious macro pad * workspace rotation keys * tabbing hotkeys * left hand tab change keys * SEND_STRING("!") on KC_EXLM * use SEND_STRING for all shifted symbols * SEND_STRING even for non shifted symbols so they play nicely with the shifted ones --- keyboards/planck/keymaps/callum/keymap.c | 74 +++++++++++++++++++++--- 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/keyboards/planck/keymaps/callum/keymap.c b/keyboards/planck/keymaps/callum/keymap.c index 2a816bf677c3..1cffe15d4658 100644 --- a/keyboards/planck/keymaps/callum/keymap.c +++ b/keyboards/planck/keymaps/callum/keymap.c @@ -172,7 +172,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| * |Power| F11 | F12 | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 |VolDn| * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| - * | | F21 | F22 | F23 | F24 | | | | |Clmak|Qwrty| | + * | | | |TabL |TabR | | | | |Clmak|Qwrty| | * |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----| * | | | | |Prev |Mute |Play |Next | | | | | * `-----------------------------------------------------------------------' @@ -189,8 +189,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_F18, KC_F19, KC_F20, KC_VOLD }, { - _______, KC_F21, KC_F22, KC_F23, - KC_F24, XXXXXXX, XXXXXXX, XXXXXXX, + _______, XXXXXXX, XXXXXXX, SC(KC_TAB), + C(KC_TAB), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, QWERTY, _______ }, { @@ -229,13 +229,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { set_colemak(); } return false; - break; case QWERTY: if (record->event.pressed) { set_qwerty(); } return false; - break; case SYMB: if (record->event.pressed) { layer_on(_SYMB); @@ -243,7 +241,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { layer_off(_SYMB); } return false; - break; case MOVE: if (record->event.pressed) { layer_on(_MOVE); @@ -251,7 +248,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { layer_off(_MOVE); } return false; - break; case FUNC: if (record->event.pressed) { layer_on(_FUNC); @@ -259,7 +255,69 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { layer_off(_FUNC); } return false; - break; + + // Override the defualt auto shifted symbols to use SEND_STRING + // See https://github.com/qmk/qmk_firmware/issues/4072 + case KC_EXLM: + if (record->event.pressed) { SEND_STRING("!"); } + return false; + case KC_AT: + if (record->event.pressed) { SEND_STRING("@"); } + return false; + case KC_HASH: + if (record->event.pressed) { SEND_STRING("#"); } + return false; + case KC_DLR: + if (record->event.pressed) { SEND_STRING("$"); } + return false; + case KC_PERC: + if (record->event.pressed) { SEND_STRING("%"); } + return false; + case KC_CIRC: + if (record->event.pressed) { SEND_STRING("^"); } + return false; + case KC_AMPR: + if (record->event.pressed) { SEND_STRING("&"); } + return false; + case KC_ASTR: + if (record->event.pressed) { SEND_STRING("*"); } + return false; + case KC_LPRN: + if (record->event.pressed) { SEND_STRING("("); } + return false; + case KC_RPRN: + if (record->event.pressed) { SEND_STRING(")"); } + return false; + case KC_TILD: + if (record->event.pressed) { SEND_STRING("~"); } + return false; + case KC_GRV: + if (record->event.pressed) { SEND_STRING("`"); } + return false; + case KC_PLUS: + if (record->event.pressed) { SEND_STRING("+"); } + return false; + case KC_EQL: + if (record->event.pressed) { SEND_STRING("="); } + return false; + case KC_PIPE: + if (record->event.pressed) { SEND_STRING("|"); } + return false; + case KC_BSLS: + if (record->event.pressed) { SEND_STRING("\\"); } + return false; + case KC_LBRC: + if (record->event.pressed) { SEND_STRING("["); } + return false; + case KC_RBRC: + if (record->event.pressed) { SEND_STRING("]"); } + return false; + case KC_LCBR: + if (record->event.pressed) { SEND_STRING("{"); } + return false; + case KC_RCBR: + if (record->event.pressed) { SEND_STRING("}"); } + return false; } return true; } From bef554d18bcb14492e2513b0759407e4b4581c9c Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Wed, 24 Oct 2018 08:57:08 -0700 Subject: [PATCH 263/505] Bug: Users had to be in the /util directory to run the script (#4228) --- util/new_keymap.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/new_keymap.sh b/util/new_keymap.sh index b09f3dd0ca20..73cc9e8cc3c7 100755 --- a/util/new_keymap.sh +++ b/util/new_keymap.sh @@ -18,7 +18,7 @@ if [ -z "$USERNAME" ]; then exit 1 fi -cd .. +cd "$(dirname "$0")/.." if [ ! -d "keyboards/$KB_PATH" ]; then printf "Error! keyboards/%s does not exist!\n" "$KB_PATH" From a5b10e5da24cb52c04dddc9168d5e7590fb749d2 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 24 Oct 2018 12:13:40 -0700 Subject: [PATCH 264/505] Fix syntax for windows --- docs/newbs_building_firmware.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/newbs_building_firmware.md b/docs/newbs_building_firmware.md index ac6bff2bc7aa..fabfefb190a4 100644 --- a/docs/newbs_building_firmware.md +++ b/docs/newbs_building_firmware.md @@ -16,7 +16,7 @@ Start by navigating to the `keymaps` folder for your keyboard. ?> Windows: - start keyboards//keymaps + start .\\keyboards\\\\keymaps ## Create a Copy Of The `default` Keymap From ffb2557a3aac1e5c943b1e6242c3a693da68d8ee Mon Sep 17 00:00:00 2001 From: 194h <38110558+194h@users.noreply.github.com> Date: Thu, 25 Oct 2018 19:04:48 +0200 Subject: [PATCH 265/505] Keymap: Updated my(194h) keymap to make it more clean and useful (#4236) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added my(194h) atreus62 keymap * Fixed what noroadsleft remarked in my pull request, hopefully got it all. * Followed drashna's suggestion. * Removed unused functionality from my keymap, added tap dance æøå and changed Layer 1 and Layer 2 * Removed unused functionality from my keymap, added tap dance æøå and changed Layer 1 and Layer 2 --- keyboards/atreus62/keymaps/194h/keymap.c | 109 ++++++++++------------- keyboards/atreus62/keymaps/194h/rules.mk | 5 +- 2 files changed, 51 insertions(+), 63 deletions(-) diff --git a/keyboards/atreus62/keymaps/194h/keymap.c b/keyboards/atreus62/keymaps/194h/keymap.c index 9b397fce467d..1d069e9d4231 100644 --- a/keyboards/atreus62/keymaps/194h/keymap.c +++ b/keyboards/atreus62/keymaps/194h/keymap.c @@ -39,6 +39,7 @@ //Norwegian layout - dependant on previous definitions #define NO_UNDS LSFT(NO_MINS) // _ #define NO_QUES LSFT(NO_PLUS) // ? +#define NO_ACUT RALT(NO_BSLS) // Acute #define NO_GRAV LSFT(NO_BSLS) // ` #define NO_GT LSFT(NO_LT) // > #define NO_HALF RALT(NO_LT) // ½ @@ -56,6 +57,9 @@ #define OSM_RSFT OSM(MOD_RSFT) #define OSM_RGUI OSM(MOD_RGUI) +//CTRL on hold, ESC on tap +#define CTL_ESC CTL_T(KC_ESC) + //Layers #define L1 0 #define L2 1 @@ -63,23 +67,51 @@ #define L4 3 #define L5 4 +// Momentary switch to layer +#define MO_L2 MO(L2) +#define MO_L4 MO(L4) +#define MO_L5 MO(L5) // Momentary switch to layer - One Shot Layer +#define OSL_L2 OSL(L2) #define OSL_L3 OSL(L3) #define OSL_L4 OSL(L4) +//Tap Dance Declarations +enum { + SCLN_OE = 0, + QUOT_AE, + DQT_AO +}; + +//Tap Dance Definitions +qk_tap_dance_action_t tap_dance_actions[] = { + //Tap once for semicolon, twice for ø + [SCLN_OE] = ACTION_TAP_DANCE_DOUBLE(NO_SCLN, NO_OE), + //Tap once for single quote, twice for æ + [QUOT_AE] = ACTION_TAP_DANCE_DOUBLE(NO_QUOT, NO_AE), + //Tap once for double quote, twice for å + [DQT_AO] = ACTION_TAP_DANCE_DOUBLE(NO_DQT, NO_AO), +// Other declarations would go here, separated by commas, if you have them +}; + +//Tap Dance keys +#define TD_SCLN_OE TD(SCLN_OE) +#define TD_QUOT_AE TD(QUOT_AE) +#define TD_DQT_AO TD(DQT_AO) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [L1] = LAYOUT( KC_LGUI, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RGUI, - KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, NO_DQT, - KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, NO_SCLN, NO_QUOT, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, TD_DQT_AO, + KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, TD_SCLN_OE, TD_QUOT_AE, OSM_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, NO_MINS, OSM_RSFT, - CTL_T(KC_ESC), MO(L5), KC_LEAD, OSM_LALT, MO(L4), OSL_L3, KC_SPC, KC_ENT, OSL_L3, MO(L4), OSM_RALT, NO_EQL, NO_PLUS, KC_RCTL + CTL_ESC, MO_L5, KC_TAB, OSM_LALT, MO_L4, OSL_L3, KC_SPC, KC_ENT, OSL_L3, MO_L4, OSM_LALT, NO_EQL, NO_PLUS, KC_RCTL ), [L2] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NO_AO, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NO_OE, NO_AE, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NO_DQT, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, NO_SCLN, NO_QUOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), @@ -95,66 +127,23 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { XXXXXXX, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_HOME, KC_PGDN, KC_PGUP, KC_END, XXXXXXX, XXXXXXX, _______, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX, KC_DEL, XXXXXXX, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, XXXXXXX, KC_APP, XXXXXXX, XXXXXXX, KC_VOLD, XXXXXXX, - OSM_LCTL, _______, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MUTE, KC_VOLU, OSM_RCTL + OSM_LCTL, _______, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, OSM_RALT, KC_MUTE, KC_VOLU, OSM_RCTL ), [L5] = LAYOUT( XXXXXXX, TO(L1), TO(L2), TO(L3), TO(L4), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NO_AO, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NO_OE, NO_AE, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_CAPS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX ) }; - -// Unicode Linux -void matrix_init_user(void) { - set_unicode_input_mode(UC_LNX); -}; - - -#define TAP_ONCE(code) \ - register_code (code); \ - unregister_code (code) - - -LEADER_EXTERNS(); - -// Runs constantly in the background, in a loop. Only supports basic keycodes. -void matrix_scan_user(void) { - LEADER_DICTIONARY() { - leading = false; - leader_end(); - - //probably useless in practice, but cool - SEQ_ONE_KEY (KC_P) { - tap_random_base64(); - tap_random_base64(); - tap_random_base64(); - tap_random_base64(); - tap_random_base64(); - tap_random_base64(); - tap_random_base64(); - tap_random_base64(); - } - - SEQ_ONE_KEY (KC_G) { - SEND_STRING("grep something !"); - register_code(KC_RALT); - TAP_ONCE(KC_4); - unregister_code(KC_RALT); - } - SEQ_ONE_KEY (KC_T) { - SEND_STRING("tail "); - TAP_ONCE(KC_SLSH); - SEND_STRING("f !"); - register_code(KC_RALT); - TAP_ONCE(KC_4); - unregister_code(KC_RALT); - } - SEQ_ONE_KEY (KC_S) { - SEND_STRING("sudo !!"); - TAP_ONCE(KC_ENT); - } - } -} +//TODO: Is there productivity gain in the use of unicode? +// - Won't work in xterm. +// Create a layer for macros and/or unicode? +// Are macros useful? +// - Found no gain in having sendstring for commands. +// - Find repeated tasks that cannot be done easily on the OS. +// - Most other keymaps have macros for game/fun stuff, hard to find "serious" onces. +// Screw Norwegian layout, switch to US with unicode æøå or US/English International? +// - Will be different from laptop keyboard, requiring a switch on the OS side when only using the laptop. diff --git a/keyboards/atreus62/keymaps/194h/rules.mk b/keyboards/atreus62/keymaps/194h/rules.mk index 5246909a3891..2c97aee09345 100644 --- a/keyboards/atreus62/keymaps/194h/rules.mk +++ b/keyboards/atreus62/keymaps/194h/rules.mk @@ -1,8 +1,7 @@ -TAP_DANCE_ENABLE = no +TAP_DANCE_ENABLE = yes NKRO_ENABLE = true MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = no KEY_LOCK_ENABLE = no -AUTO_SHIFT_ENABLE = no -LEADER_ENABLE = yes +LEADER_ENABLE = no From 3c95de3c695135be358800911f4d36767392f010 Mon Sep 17 00:00:00 2001 From: SpacebarRacecar <42380065+SpacebarRacecar@users.noreply.github.com> Date: Thu, 25 Oct 2018 22:08:25 +0200 Subject: [PATCH 266/505] Adding a readme to my userspace (#4239) * added userspace readme * small fix to userspace readme * another fix to userspace readme * changed and improved userspace readme * Update readme.md * Update readme.md * changes to readme again * readme again --- users/spacebarracecar/readme.md | 111 ++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 users/spacebarracecar/readme.md diff --git a/users/spacebarracecar/readme.md b/users/spacebarracecar/readme.md new file mode 100644 index 000000000000..172764c07423 --- /dev/null +++ b/users/spacebarracecar/readme.md @@ -0,0 +1,111 @@ +# SpacebarRacecar Userspace + +The main purpose of this userspace is to keep my personal keymaps clean by moving shared code in here and also allowing me to easily change all my keymaps at once. However it also contains code that might be interesting to QMK Users living in Germany. Most of this code will be explained here. + + +## US Layout Keys for German PCs + +I'm using the US Ansi layout however I'm living in Germany which means that every PC here has its input language set to German. My goal was to create custom keycodes that emulate the US Keys so that I can plug my keyboards into any German PC and have them working without changing any settings. + +### How to use + +- To activate the custom keycodes set GERMAN_ENABLE = yes in the keyboards rules.mk file. +- The keycodes are listed and explained in [spacebarracecar.h](spacebarracecar.h) under `enum userspace_custom_keycodes`. +- The keycodes are handled by the `process_record_user` function which is now located in [spacebarracecar.c](spacebarracecar.c). To change keyboard specific configuration `process_record_keymap` is used (see [drashna userspace readme](../drashna/readme.md) for better explanation). +- There is a predefined `_DEADKEY` layer in [spacebarracecar.h](spacebarracecar.h) under `enum userspace_layers`. Shifted CU_QUOT enables the dead key layer, just like KC_QUOT would when using the US International layout. (See `enum userspace_custom_keycodes` for more explanation). +- On Windows grave and circonflexe are defined as dead keys when using the standard german layout. Those are automatically escaped when using the custom keycodes. `CU_ESCT` can be used to enable/disable this behavior. +- For a complete example see my [fc660c](../../keyboards/fc660c/keymaps/spacebarracecar/keymap.c) or [planck](../../keyboards/planck/keymaps/spacebarracecar/keymap.c) keymaps. + +### How it works + +Creating the custom keycodes was not a trivial task because it is necessary that they are able to send different keycodes depending on the physical shift state. Also the shift state of the actual send keycodes has to be completely independent of the physical shift state. At the same time it has to be ensured that shift never gets stuck or disabled accidentaly. + +(Shift state: If shift keycode is registered; Physical shift state: If shift key is actually pressed) + +Here is an example for a custom *US Equal* keycode that illustrates the problem: + +| Physical Shift State | Custom keycode | Actual send keycodes | +|----------------------|----------------|----------------------| +| Unshifted | = | Shifted DE_0 | +| Shifted | + | Unshifted DE_PLUS | + +#### Tracking the physical shift state + +To track the physical shift state there are two custom left and right shift keycodes `CU_LSFT` and `CU_RSFT`. These track the current physical shift state using two booleans `lshift` and `rshift`. To make things easier both custom shifts use KC_LSFT. A space cadet shift functionality is also included. The preexisting space cadet shift implementation could not be used because it doesn't reset when custom keycodes are pressed and therefore produces unwated parenthesis. + +#### Custom keycode templates + +To ease the creation of custom keycodes there are a few templates defined in [spacebarracecar.h](spacebarracecar.h). + +- `SHIFT_NORM(kc1, kc2)` Sends independent keycodes kc1 and kc2 depending on physical shift state without changing shift state. +- `SHIFT_SWITCH(kc1, kc2)` Sends independent keycodes kc1 and kc2 depending on physical shift state while flipping shift state. +- `SHIFT_ALL(kc1, kc2)` Sends independent keycodes kc1 and kc2 depending on physical shift state while always sending shift. +- `SHIFT_NO(kc1, kc2)` Sends independent keycodes kc1 and kc2 depending on physical shift state while never sending shift. +- `SHIFT_ALGR(kc1, kc2)` Sends independent keycodes kc1 and kc2 depending on physical shift state while never sending shift and always sending ralt. +- `UML(kc)` Sends keycode kc without changing shift state and then escapes the `_DEADKEY` layer. + +Here is `SHIFT_NORM` as an example: +```c +#define SHIFT_NORM(kc1, kc2) \ +if (record->event.pressed) { \ + timer_timeout(); \ + if (lshift || rshift) { \ + register_code(KC_LSFT); \ + unregister_code(kc2); \ + register_code(kc2); \ + add_to_prev(kc2); \ + } else { \ + unregister_code(KC_LSFT); \ + unregister_code(kc1); \ + register_code(kc1); \ + } \ +} else { \ + unregister_code(kc1); \ + unregister_code(kc2); \ +} \ +return false; +``` + +It is noticeable that before registering a keycode the same keycode gets unregistered first. The reason for this is that there can now be two physical keys that use the same keycode only with different shift states. When rolling those two keys the keycode has to be unregistered first, otherwise the second key doesn't register. Also noticable is that sometimes the `add_to_prev` function is called. This will be explained later. The `timer_timeout` function is necessary to reset the timers of the custom space cadet shift functionality. + +It's worth mentioning that `SHIFT_ALGR` unlike the other templates doesn't allow repetition of characters when held. This is because it would otherwise require extensive checking of physical ralt status similar to shift to prevent ralt from getting stuck. + +#### Ensuring that shift state is always correct when pressing normal keycodes + +To ensure that non custom keycodes always get send with the correct shift state the default case in `process_record_user` includes a physical shift check that sets shift accordingly before registering the keycode. Also `timer_timeout` is always called to reset the space cadet shift timers to prevent unwanted parenthesis. + +```c +default: + if(record->event.pressed) { + timer_timeout(); + + #ifdef GERMAN_ENABLE + if (lshift || rshift) + register_code(KC_LSFT); + else + unregister_code(KC_LSFT); + #endif + + } + return process_record_keymap(keycode, record); +``` + +#### Ensuring that custom keycodes always produce the correct character + +When very specific key combinations that include custom keycodes and/or shift are pressed it can happen that wrong characters are produced due to changing shift states. The previously mentioned `add_to_prev` function is there to prevent that. It can be used to add a keycode to the `prev_kcs` array that can hold up to 6 keycodes. On various occasions, but mainly when shift is released `unreg_prev` is called, which then unregisters all saved keycodes. + +For real use this is probably not needed, but it doesn't hurt either. + +#### Adapting the templates for other languages + +In theory the templates can be used to create custom keycodes that map any layout to any other layout. + +## Other stuff + +### Custom Nav/Esc Key + +Since I'm always using a navigation layer with all my keyboards there is a `_NAV` layer predefined in [spacebarracecar.h](spacebarracecar.h) under `enum userspace_layers`. In addition to that I wanted to have a keycode that activates the navigation layer when held, but acts as Escape when pressed. In QMK there already exists `LT(layer, kc)`, however I found that there is some amount of lag before the layer is actived. Therefore I created a custom keycode CU_NAV that does the same without lag using a custom timer. Since I already need timers for the custom space cadet shift implementing this was very easy by adding the timer to the `timer_timeout` function. + +### Gamemode + +The userspace includes the custom keycode `CU_GAME` that is used to flip a boolean variable called `game`. That variable is used to enable/disable windows keys and space cadet shift. In my [planck keymap](../../keyboards/planck/keymaps/spacebarracecar/keymap.c) it also makes Lower act like Space which is more comfortable when resting on wasd and it could also be used to change various other things when gaming. From fc1e22ea94146d090af5b47a51fcc07cac7e677c Mon Sep 17 00:00:00 2001 From: lbibass Date: Thu, 25 Oct 2018 16:10:45 -0400 Subject: [PATCH 267/505] Keymap: Mechmini layout (#4232) * Added my Mechmini2 layout to qmk. * Added more info to the readme. * Made changes. * Update keyboards/mechmini/v2/keymaps/lbibass_625_space/keymap.c Co-Authored-By: lbibass * Update keyboards/mechmini/v2/keymaps/lbibass_split_space/keymap.c Co-Authored-By: lbibass --- .../v2/keymaps/lbibass_625_space/config.h | 4 ++ .../v2/keymaps/lbibass_625_space/keymap.c | 48 +++++++++++++++++++ .../v2/keymaps/lbibass_625_space/readme.md | 2 + .../v2/keymaps/lbibass_625_space/rules.mk | 11 +++++ .../v2/keymaps/lbibass_split_space/config.h | 4 ++ .../v2/keymaps/lbibass_split_space/keymap.c | 33 +++++++++++++ .../v2/keymaps/lbibass_split_space/readme.md | 2 + .../v2/keymaps/lbibass_split_space/rules.mk | 11 +++++ 8 files changed, 115 insertions(+) create mode 100755 keyboards/mechmini/v2/keymaps/lbibass_625_space/config.h create mode 100755 keyboards/mechmini/v2/keymaps/lbibass_625_space/keymap.c create mode 100644 keyboards/mechmini/v2/keymaps/lbibass_625_space/readme.md create mode 100755 keyboards/mechmini/v2/keymaps/lbibass_625_space/rules.mk create mode 100755 keyboards/mechmini/v2/keymaps/lbibass_split_space/config.h create mode 100755 keyboards/mechmini/v2/keymaps/lbibass_split_space/keymap.c create mode 100644 keyboards/mechmini/v2/keymaps/lbibass_split_space/readme.md create mode 100755 keyboards/mechmini/v2/keymaps/lbibass_split_space/rules.mk diff --git a/keyboards/mechmini/v2/keymaps/lbibass_625_space/config.h b/keyboards/mechmini/v2/keymaps/lbibass_625_space/config.h new file mode 100755 index 000000000000..7adb68d347bc --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/lbibass_625_space/config.h @@ -0,0 +1,4 @@ +#pragma once + +#define ONESHOT_TAP_TOGGLE 3 +#define TAPPING_TERM 200 diff --git a/keyboards/mechmini/v2/keymaps/lbibass_625_space/keymap.c b/keyboards/mechmini/v2/keymaps/lbibass_625_space/keymap.c new file mode 100755 index 000000000000..40bfc42de0f7 --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/lbibass_625_space/keymap.c @@ -0,0 +1,48 @@ +#include QMK_KEYBOARD_H + +#define _BL 0 +#define _FN1 2 +#define _FN2 3 +#define _WIN 1 +//Tap Dance Declarations +enum +{ + TD_DOTCOM = 0 +}; +//Tap Dance Definitions +qk_tap_dance_action_t tap_dance_actions[] = { + //Tap once for Esc, twice for Caps Lock + [TD_DOTCOM] = ACTION_TAP_DANCE_DOUBLE(KC_COMMA, KC_DOT) + // Other declarations would go here, separated by commas, if you have them +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_BL] = LAYOUT_625_space( + LT(OSL(2), KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + GUI_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(3, KC_ENT), + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, TD(TD_DOTCOM), OSL(2), OSM(MOD_RSFT), + KC_ESC, KC_LALT, KC_LCTL, KC_SPC, KC_RGUI, RGB_TOG), + [_WIN] = LAYOUT_625_space( + LT(OSL(2), 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, LT(3, KC_ENT), + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, TD(TD_DOTCOM), OSL(2), OSM(MOD_RSFT), + KC_ESC, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, RGB_TOG), + [_FN1] = LAYOUT_625_space( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, + GUI_T(KC_ESC), KC_PGUP, KC_VOLU, KC_DEL, KC_TRNS, KC_BSLS, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL, KC_TRNS, + KC_LSFT, KC_PGDN, KC_VOLD, BL_STEP, BL_TOGG, KC_SCLN, KC_QUOT, KC_SLSH, KC_DOT, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [_FN2] = LAYOUT_625_space( + KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, RESET, + MT(KC_LGUI, KC_ESC), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TG(1), KC_TRNS, KC_TRNS, KC_F11, KC_F12, KC_TRNS, + KC_TRNS, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_TRNS, KC_TRNS, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; + + + + + diff --git a/keyboards/mechmini/v2/keymaps/lbibass_625_space/readme.md b/keyboards/mechmini/v2/keymaps/lbibass_625_space/readme.md new file mode 100644 index 000000000000..e09e520131a1 --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/lbibass_625_space/readme.md @@ -0,0 +1,2 @@ +# /u/Lbibass's 6.25u spacebar Mechmini 2.0 Layout. + diff --git a/keyboards/mechmini/v2/keymaps/lbibass_625_space/rules.mk b/keyboards/mechmini/v2/keymaps/lbibass_625_space/rules.mk new file mode 100755 index 000000000000..7bc50168df16 --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/lbibass_625_space/rules.mk @@ -0,0 +1,11 @@ +BOOTMAGIC_ENABLE = yes # 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 = no # Commands for debug and configuration +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = yes +TAP_DANCE_ENABLE = yes diff --git a/keyboards/mechmini/v2/keymaps/lbibass_split_space/config.h b/keyboards/mechmini/v2/keymaps/lbibass_split_space/config.h new file mode 100755 index 000000000000..2f35530627b8 --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/lbibass_split_space/config.h @@ -0,0 +1,4 @@ +#pragma once + +#define ONESHOT_TAP_TOGGLE 3 +#define TAPPING_TERM 200 diff --git a/keyboards/mechmini/v2/keymaps/lbibass_split_space/keymap.c b/keyboards/mechmini/v2/keymaps/lbibass_split_space/keymap.c new file mode 100755 index 000000000000..7ad2aa81e966 --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/lbibass_split_space/keymap.c @@ -0,0 +1,33 @@ +#include QMK_KEYBOARD_H + +#define _BL 0 +#define _FN1 2 +#define _FN2 3 +#define _WIN 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_BL] = LAYOUT_split_space( + LT(2, KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + GUI_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(3, KC_ENT), + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, MO(2), KC_RSHIFT, + KC_ESC, KC_LALT, KC_LCTL, KC_SPC, KC_SPC, KC_RGUI, KC_RALT, RGB_TOG), + [_WIN] = LAYOUT_split_space( + LT(2, 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, LT(3, KC_ENT), + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, MO(2), KC_RSHIFT, + KC_ESC, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_RALT, KC_LCTL, RGB_TOG), + [_FN1] = LAYOUT_split_space( + 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_TRNS, KC_PGUP, KC_VOLU, KC_TRNS, KC_TRNS, KC_BSLS, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL, KC_TRNS, + KC_LSFT, KC_PGDN, KC_VOLD, KC_TRNS, KC_TRNS, KC_SCLN, KC_QUOT, KC_SLSH, KC_DOT, KC_RSHIFT, KC_HOME, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [_FN2] = LAYOUT_split_space( + KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, RESET, + MT(KC_LGUI, KC_ESC), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, TG(1), KC_TRNS, KC_TRNS, KC_F11, KC_F12, KC_TRNS, + KC_TRNS, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, KC_TRNS, KC_END, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +}; + diff --git a/keyboards/mechmini/v2/keymaps/lbibass_split_space/readme.md b/keyboards/mechmini/v2/keymaps/lbibass_split_space/readme.md new file mode 100644 index 000000000000..34888fbb1943 --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/lbibass_split_space/readme.md @@ -0,0 +1,2 @@ +# /u/Lbibass's Split Space Mechmini 2.0 Layout + diff --git a/keyboards/mechmini/v2/keymaps/lbibass_split_space/rules.mk b/keyboards/mechmini/v2/keymaps/lbibass_split_space/rules.mk new file mode 100755 index 000000000000..fd3621e841ab --- /dev/null +++ b/keyboards/mechmini/v2/keymaps/lbibass_split_space/rules.mk @@ -0,0 +1,11 @@ +BOOTMAGIC_ENABLE = yes # 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 = no # Commands for debug and configuration +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = yes +TAP_DANCE_ENABLE = no From fa1ac4d7242a0f3944d71b58926ff2a1ce73c96b Mon Sep 17 00:00:00 2001 From: Phillip Tennen Date: Fri, 26 Oct 2018 15:59:41 +0200 Subject: [PATCH 268/505] Fix incorrect doctoring in feature.backlight.md (#4244) I'm guessing someone deleted a row at some point in the past, but I didn't blame it. --- docs/feature_backlight.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature_backlight.md b/docs/feature_backlight.md index 8f883e08fb2b..7bb7e03a89eb 100644 --- a/docs/feature_backlight.md +++ b/docs/feature_backlight.md @@ -61,7 +61,7 @@ In this handler, the value of an incrementing counter is mapped onto a precomput |`backlight_increase()` |Increase the backlight level | |`backlight_decrease()` |Decrease the backlight level | |`backlight_level(x)` |Sets the backlight level to specified level | -|`get_backlight_level()`|Toggle backlight breathing | +|`get_backlight_level()`|Return the current backlight level | ### Backlight Breathing Functions From 39addf8bc99e6282e655298c2c24da07a5ef77f8 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Thu, 25 Oct 2018 23:34:40 -0700 Subject: [PATCH 269/505] JD45: layout macro refactor The macro that was LAYOUT prepended KC_ to all the keycode arguments, preventing the Configurator from working with the JD45. This macro is now LAYOUT_kc. The macro LAYOUT is a more-standard macro. Switch identifiers have changed throughout. Format is k. --- keyboards/jd45/jd45.h | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/keyboards/jd45/jd45.h b/keyboards/jd45/jd45.h index 48641c199ad1..105a8acb6063 100644 --- a/keyboards/jd45/jd45.h +++ b/keyboards/jd45/jd45.h @@ -6,15 +6,27 @@ /* JD45 keymap definition macro */ #define LAYOUT( \ - K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, \ - K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, \ - K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, \ - K38, K39, K40, K41, K42, K43, K44, K45, K46, K47 \ + 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, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k36, k38, k39, k3a, k3b \ ) { \ - { KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K10, KC_##K11, KC_##K12, KC_##K13 }, \ - { KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_NO }, \ - { KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_NO }, \ - { KC_##K38, KC_##K39, KC_##K40, KC_##K41, KC_##K42, KC_NO, KC_##K43, KC_NO, KC_##K44, KC_##K45, KC_##K46, KC_##K47, KC_NO } \ + { 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, KC_NO }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, KC_NO }, \ + { k30, k31, k32, k33, k34, KC_NO, k36, KC_NO, k38, k39, k3a, k3b, KC_NO } \ +} + +#define LAYOUT_kc( \ + 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, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ + k30, k31, k32, k33, k34, k36, k38, k39, k3a, k3b \ +) { \ + { 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_NO }, \ + { 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_NO }, \ + { KC_##k30, KC_##k31, KC_##k32, KC_##k33, KC_##k34, KC_NO, KC_##k36, KC_NO, KC_##k38, KC_##k39, KC_##k3a, KC_##k3b, KC_NO } \ } #endif From 899731679d262023a9e25eba805b3674b1ceb82e Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Thu, 25 Oct 2018 23:38:45 -0700 Subject: [PATCH 270/505] JD45: blakedietz keymap refactor - config.h - updated to more-preferred format - layout macro LAYOUT_JD45 removed (identical to new macro LAYOUT) - keymap.c - updated to use macro LAYOUT - redundant KC_TRNS and KC_NO definitions removed --- keyboards/jd45/keymaps/blakedietz/config.h | 19 ++----------------- keyboards/jd45/keymaps/blakedietz/keymap.c | 18 +++++++----------- 2 files changed, 9 insertions(+), 28 deletions(-) diff --git a/keyboards/jd45/keymaps/blakedietz/config.h b/keyboards/jd45/keymaps/blakedietz/config.h index 38d850ef6ea6..eb4cf3bdfb2c 100644 --- a/keyboards/jd45/keymaps/blakedietz/config.h +++ b/keyboards/jd45/keymaps/blakedietz/config.h @@ -1,19 +1,4 @@ -#include "../../config.h" - -/** - *JD45 keymap definition macro - */ -#define LAYOUT_JD45( \ - K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, \ - K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, \ - K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, \ - K38, K39, K40, K41, K42, K43, K44, K45, K46, K47 \ -) { \ - { K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13 }, \ - { K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, KC_NO }, \ - { K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, KC_NO }, \ - { K38, K39, K40, K41, K42, KC_NO, K43, KC_NO, K44, K45, K46, K47, KC_NO } \ -} +#pragma once /** * This makes it possible to do rolling combos (zx) with keys that convert to other keys on hold (z becomes ctrl when @@ -28,4 +13,4 @@ #define MOUSEKEY_DELAY 0 #define MOUSEKEY_TIME_TO_MAX 5 #define MOUSEKEY_MAX_SPEED 2 -#define MOUSEKEY_WHEEL_DELAY 0 \ No newline at end of file +#define MOUSEKEY_WHEEL_DELAY 0 diff --git a/keyboards/jd45/keymaps/blakedietz/keymap.c b/keyboards/jd45/keymaps/blakedietz/keymap.c index bde760a22383..a40a2c604e6e 100644 --- a/keyboards/jd45/keymaps/blakedietz/keymap.c +++ b/keyboards/jd45/keymaps/blakedietz/keymap.c @@ -45,10 +45,6 @@ enum macro_keycodes KC_AG_TAB_R, }; -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - /** * This section of macros is for tap or hold functionality. Keys will fire off the second symbol in the name if tapped * or fire the first symbol in the name if held. For example @@ -101,7 +97,7 @@ enum macro_keycodes * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = LAYOUT_JD45( + [_QWERTY] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, ALL_T(KC_NO), /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -124,7 +120,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | Prev | Next | Mute | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_LOWER] = LAYOUT_JD45( + [_LOWER] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -146,7 +142,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | Prev | Next | Mute | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_RAISE] = LAYOUT_JD45( + [_RAISE] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ KC_TILD, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -169,7 +165,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_MOUSECURSOR] = LAYOUT_JD45( + [_MOUSECURSOR] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ _______, _______, _______, KC_MS_U, _______, _______, _______, KC_ACL2, KC_ACL1, KC_ACL0, _______, _______, _______, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -191,7 +187,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | Reset | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_ADJUST] = LAYOUT_JD45( + [_ADJUST] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, @@ -214,7 +210,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_VIM] = LAYOUT_JD45( + [_VIM] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -236,7 +232,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_MEDIA] = LAYOUT_JD45( + [_MEDIA] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ From 340dd097580f27d9f8ffaad78371869d883220d1 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Thu, 25 Oct 2018 23:40:12 -0700 Subject: [PATCH 271/505] JD45: default keymap refactor Default keymap refactored to use new macro LAYOUT (from LAYOUT_kc). --- keyboards/jd45/keymaps/default/keymap.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/keyboards/jd45/keymaps/default/keymap.c b/keyboards/jd45/keymaps/default/keymap.c index 0bb519f5fc35..61e051a360a8 100644 --- a/keyboards/jd45/keymaps/default/keymap.c +++ b/keyboards/jd45/keymaps/default/keymap.c @@ -5,13 +5,10 @@ */ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT( - ESC, Q, W, E, R, T, Y, U, I, O, P, QUOT, BSPC, - TAB, A, S, D, F, G, H, J, K, L, SCLN, ENT, - LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, - PAUSE, LCTL, LALT, DEL, SPC, DEL, LEFT, UP, DOWN, RIGHT), -}; - -const uint16_t PROGMEM fn_actions[] = { - + [0] = LAYOUT( + KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_QUOT, KC_BSPC, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_PAUS, KC_LCTL, KC_LALT, KC_DEL, KC_SPC, KC_DEL, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT + ), }; From 8cf15bffa0693caa99d1b9ddc5c6ecc0936f2605 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Thu, 25 Oct 2018 23:45:14 -0700 Subject: [PATCH 272/505] JD45: jeebak keymap refactor - config.h deleted (file was redundant) - layout macro LAYOUT_JD45 removed (identical to new macro LAYOUT) - ../../config.h include line redundant due to past changes to build script - keymap.c - updated to use macro LAYOUT - redundant KC_TRNS and KC_NO definitions removed --- keyboards/jd45/keymaps/jeebak/config.h | 16 ---------------- keyboards/jd45/keymaps/jeebak/keymap.c | 22 +++++++++------------- 2 files changed, 9 insertions(+), 29 deletions(-) delete mode 100644 keyboards/jd45/keymaps/jeebak/config.h diff --git a/keyboards/jd45/keymaps/jeebak/config.h b/keyboards/jd45/keymaps/jeebak/config.h deleted file mode 100644 index bfaa128937ea..000000000000 --- a/keyboards/jd45/keymaps/jeebak/config.h +++ /dev/null @@ -1,16 +0,0 @@ -#include "../../config.h" - -/** - *JD45 keymap definition macro - */ -#define LAYOUT_JD45( \ - K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, \ - K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, \ - K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, \ - K38, K39, K40, K41, K42, K43, K44, K45, K46, K47 \ -) { \ - { K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13 }, \ - { K14, K15, K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, KC_NO }, \ - { K26, K27, K28, K29, K30, K31, K32, K33, K34, K35, K36, K37, KC_NO }, \ - { K38, K39, K40, K41, K42, KC_NO, K43, KC_NO, K44, K45, K46, K47, KC_NO } \ -} diff --git a/keyboards/jd45/keymaps/jeebak/keymap.c b/keyboards/jd45/keymaps/jeebak/keymap.c index c711939fcf78..bb6c8293824a 100644 --- a/keyboards/jd45/keymaps/jeebak/keymap.c +++ b/keyboards/jd45/keymaps/jeebak/keymap.c @@ -48,10 +48,6 @@ enum macro_keycodes KC_AG_TAB_R, }; -// Fillers to make layering more clear -#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 @@ -91,7 +87,7 @@ enum macro_keycodes */ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = LAYOUT_JD45( + [_QWERTY] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ HPR_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -113,7 +109,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | RGUI | Alt | GUI | Lower | TC/Space | TC/Space | Raise | Vol- | Vol+ | Play | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_COLEMAK] = LAYOUT_JD45( + [_COLEMAK] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ HPR_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -135,7 +131,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | RGUI | Alt | GUI | Lower | TC/Space | TC/Space | Raise | Vol- | Vol+ | Play | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_DVORAK] = LAYOUT_JD45( + [_DVORAK] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ HPR_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -157,7 +153,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Brite | | | | | | | Prev | Next | Mute | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_LOWER] = LAYOUT_JD45( + [_LOWER] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ 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_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -179,7 +175,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Brite | | | | | | | Prev | Next | Mute | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_RAISE] = LAYOUT_JD45( + [_RAISE] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, KC_BSPC, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -205,7 +201,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * seem to work on Mac. Presumably they'll work under Windows. */ - [_TOUCHCURSOR] = LAYOUT_JD45( + [_TOUCHCURSOR] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ ALT_TAB, CMD_TAB, CTL_TAB, KC_LGUI, KC_LSFT, KC_TILD, KC_INS, KC_HOME, KC_UP, KC_END, KC_BSPC, _______, _______, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -228,7 +224,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_MOUSECURSOR] = LAYOUT_JD45( + [_MOUSECURSOR] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ _______, _______, KC_ACL0, _______, _______, _______, _______, KC_WH_L, KC_MS_U, KC_WH_R, KC_BTN2, _______, _______, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -251,7 +247,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_PLOVER] = LAYOUT_JD45( + [_PLOVER] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ @@ -273,7 +269,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | Reset | * `-------+-------+-------+-------+---^^^----+---^^^----+---------+--------+--------+----------' */ - [_ADJUST] = LAYOUT_JD45( + [_ADJUST] = LAYOUT( /*,--------+-------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.*/ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, /*|--------`-------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------`--------|*/ From 357c1bb657cfa2c65c73b8b12929725db2465bf4 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Thu, 25 Oct 2018 23:58:20 -0700 Subject: [PATCH 273/505] JD45: justin keymap refactor Updated parallel to LAYOUT_kc macro rename. --- keyboards/jd45/keymaps/justin/keymap.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/keyboards/jd45/keymaps/justin/keymap.c b/keyboards/jd45/keymaps/justin/keymap.c index a797582b072a..4590374e9b36 100644 --- a/keyboards/jd45/keymaps/justin/keymap.c +++ b/keyboards/jd45/keymaps/justin/keymap.c @@ -1,27 +1,27 @@ #include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT( + [0] = LAYOUT_kc( ESC, Q, W, F, P, G, J, L, U, Y, SCLN, QUOT, BSPC, FN8, A, R, S, T, D, H, N, E, I, O, ENT, LSFT, Z, X, C, V, B, K, M, COMM, DOT, SLSH, FN6, FN4, LGUI, FN7, FN2, FN1, SPC, FN5, RALT, FN3, FN0), - [1] = LAYOUT( + [1] = LAYOUT_kc( TRNS, FN10, FN11, FN12, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, UP, DEL, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, HOME, PGUP, LEFT, RGHT, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, END, PGDN, DOWN, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), - [2] = LAYOUT( + [2] = LAYOUT_kc( TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, 7, 8, 9, 0, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, LBRC, 4, 5, 6, DOT, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, RBRC, 1, 2, 3, BSLS, TRNS, TRNS, FN29, TRNS, TRNS, TRNS, PAUSE, EQL, MINS, TRNS, TRNS), - [3] = LAYOUT( + [3] = LAYOUT_kc( TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS), - [4] = LAYOUT( + [4] = LAYOUT_kc( TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, 7, 8, 9, 0, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, LBRC, 4, 5, 6, DOT, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, RBRC, 1, 2, 3, BSLS, TRNS, From db8454ca99b58c31ea25954b4ca513d38e5b8c72 Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Thu, 25 Oct 2018 23:59:20 -0700 Subject: [PATCH 274/505] JD45: mjt keymap refactor Updated parallel to LAYOUT_kc macro rename. --- keyboards/jd45/keymaps/mjt/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/jd45/keymaps/mjt/keymap.c b/keyboards/jd45/keymaps/mjt/keymap.c index a53b09642a79..f806de65d962 100644 --- a/keyboards/jd45/keymaps/mjt/keymap.c +++ b/keyboards/jd45/keymaps/mjt/keymap.c @@ -4,23 +4,23 @@ */ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT( + [0] = LAYOUT_kc( TAB, Q, W, E, R, T, Y, U, I, O, P, MINS, BSLS, FN1, A, S, D, F, G, H, J, K, L, QUOT, ENT, FN0, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT, NO, LCTL, LALT, LGUI, SPC, BSPC, APP, FN2, ESC, NO), - [1] = LAYOUT( + [1] = LAYOUT_kc( GRV, TRNS, UP, TRNS, 7, 8, 9, 0, MINS, EQL, PSCR, LBRC, RBRC, TRNS, LEFT, DOWN, RGHT, 4, 5, 6, INS, HOME, PGUP, SCLN, TRNS, TRNS, TRNS, TRNS, TRNS, 1, 2, 3, DEL, END, PGDN, TRNS, TRNS, TRNS, TRNS, TRNS, SPC, TRNS, DEL, TRNS, FN3, TRNS, TRNS), - [2] = LAYOUT( + [2] = LAYOUT_kc( TRNS, TRNS, VOLU, TRNS, F7, F8, F9, F10, F11, F12, PSCR, FN3, FN4, TRNS, MPRV, VOLD, MNXT, F4, F5, F6, J, K, L, SCLN, TRNS, TRNS, TRNS, TRNS, TRNS, F1, F2, F3, MUTE, MPRV, MNXT, MSTP, TRNS, TRNS, TRNS, TRNS, LGUI, TRNS, TRNS, TRNS, TRNS, PAUS, TRNS) /* , -[3] = LAYOUT( +[3] = LAYOUT_kc( TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, BTLD, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, From ca02863b569fb9a3bf21967942567149b562e2be Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Fri, 26 Oct 2018 00:03:00 -0700 Subject: [PATCH 275/505] JD45: mjt6u keymap refactor - config.h - updated to remove redundancies - add #pragma once - keymap.c - updated to use macro LAYOUT - redundant KC_TRNS and KC_NO definitions removed --- keyboards/jd45/keymaps/mjt6u/config.h | 83 +-------------------------- keyboards/jd45/keymaps/mjt6u/keymap.c | 62 +++++++++++++++----- 2 files changed, 50 insertions(+), 95 deletions(-) diff --git a/keyboards/jd45/keymaps/mjt6u/config.h b/keyboards/jd45/keymaps/mjt6u/config.h index bf9dc6df3bcd..41d1557c6f1d 100644 --- a/keyboards/jd45/keymaps/mjt6u/config.h +++ b/keyboards/jd45/keymaps/mjt6u/config.h @@ -1,84 +1,3 @@ -/* -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 geekhack -#define PRODUCT JD45 -#define DESCRIPTION q.m.k. keyboard firmware for JD45 - -/* key matrix size */ -#define MATRIX_ROWS 4 -#define MATRIX_COLS 13 - -/* Planck PCB default pin-out */ -#define MATRIX_ROW_PINS { F0, F1, F5, B4 } -#define MATRIX_COL_PINS { F4, D7, B5, B6, C6, C7, D4, D6, D5, D0, D1, D2, B0 } -#define UNUSED_PINS - -#define BACKLIGHT_PIN B7 +#pragma once #define USB_MAX_POWER_CONSUMPTION 50 - -/* 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 - -#endif diff --git a/keyboards/jd45/keymaps/mjt6u/keymap.c b/keyboards/jd45/keymaps/mjt6u/keymap.c index c17a07fd04ee..4c0b8828a585 100644 --- a/keyboards/jd45/keymaps/mjt6u/keymap.c +++ b/keyboards/jd45/keymaps/mjt6u/keymap.c @@ -25,25 +25,61 @@ enum jd45_keycodes #define LONGPRESS_DELAY 150 #define LAYER_TOGGLE_DELAY 900 -#define _______ KC_TRNS #define __MOD__ KC_TRNS -#define XXXXXXX KC_NO #define F_FNSPC F(0) #define F_NUMSPC F(1) #define F_FNTAB F(2) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = { - {F_FNTAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, 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, LT(_ADJUST, 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)}, - {XXXXXXX, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, XXXXXXX, F_FNSPC, XXXXXXX, XXXXXXX, MO(_FUNCTION), MO(_ADJUST)}}, - [_QWERTYNUMMODS] = {{F_FNTAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, 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, LT(_ADJUST, 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)}, {XXXXXXX, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, XXXXXXX, F_NUMSPC, XXXXXXX, XXXXXXX, MO(_FKEYNUMPAD), MO(_ADJUST)}}, - [_NUMSYM] = {{KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, KC_DEL}, {__MOD__, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______}, {_______, _______, _______, _______, _______, KC_SPC, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, _______}, {XXXXXXX, __MOD__, __MOD__, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, __MOD__, __MOD__}}, - [_FUNCTION] = {{__MOD__, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12}, {__MOD__, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, _______, _______}, {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, {XXXXXXX, __MOD__, __MOD__, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, __MOD__, __MOD__}}, - [_NUMPAD] = {{KC_GRV, _______, KC_UP, _______, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_PSCR, KC_LBRC, KC_RBRC}, {_______, KC_LEFT, KC_DOWN, KC_RGHT, KC_4, KC_5, KC_6, KC_INS, KC_HOME, KC_PGUP, _______, _______}, {_______, _______, _______, _______, KC_1, KC_2, KC_3, KC_DEL, KC_END, KC_PGDN, _______, _______}, {XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, __MOD__, __MOD__}}, - [_FKEYNUMPAD] = {{_______, _______, KC_VOLU, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, _______, _______}, {_______, KC_MPRV, KC_VOLD, KC_MNXT, KC_F4, KC_F5, KC_F6, KC_J, KC_K, KC_L, KC_SCLN, _______}, {_______, _______, _______, _______, KC_F1, KC_F2, KC_F3, KC_MUTE, KC_MPRV, KC_MNXT, KC_MSTP, _______}, {XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, __MOD__, __MOD__}}, - [_ADJUST] = {{_______, RESET, _______, _______, _______, _______, _______, DYN_REC_START1, DYN_REC_START2, _______, KC_PSCR, _______, _______}, {_______, _______, _______, _______, USEFNMODS, _______, _______, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, MACSLEEP, _______, _______}, {_______, _______, _______, _______, _______, _______, USENUMMODS, _______, _______, _______, _______, _______}, {XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, __MOD__, __MOD__}}}; + [_QWERTY] = LAYOUT( \ + F_FNTAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, 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, LT(_ADJUST, 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), \ + XXXXXXX, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, F_FNSPC, XXXXXXX, MO(_FUNCTION), MO(_ADJUST), XXXXXXX \ + ), + + [_QWERTYNUMMODS] = LAYOUT( \ + F_FNTAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, 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, LT(_ADJUST, 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), \ + XXXXXXX, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, F_NUMSPC, XXXXXXX, MO(_FKEYNUMPAD), MO(_ADJUST), XXXXXXX \ + ), + + [_NUMSYM] = LAYOUT( \ + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, KC_DEL, \ + __MOD__, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, \ + _______, _______, _______, _______, _______, KC_SPC, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, _______, \ + XXXXXXX, __MOD__, __MOD__, XXXXXXX, XXXXXXX, _______, XXXXXXX, __MOD__, __MOD__, XXXXXXX \ + ), + + [_FUNCTION] = LAYOUT( \ + __MOD__, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + __MOD__, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + XXXXXXX, __MOD__, __MOD__, XXXXXXX, XXXXXXX, _______, XXXXXXX, __MOD__, __MOD__, XXXXXXX \ + ), + + [_NUMPAD] = LAYOUT( \ + KC_GRV, _______, KC_UP, _______, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_PSCR, KC_LBRC, KC_RBRC, \ + _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_4, KC_5, KC_6, KC_INS, KC_HOME, KC_PGUP, _______, _______, \ + _______, _______, _______, _______, KC_1, KC_2, KC_3, KC_DEL, KC_END, KC_PGDN, _______, _______, \ + XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, __MOD__, __MOD__, XXXXXXX \ + ), + + [_FKEYNUMPAD] = LAYOUT( \ + _______, _______, KC_VOLU, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, _______, _______, \ + _______, KC_MPRV, KC_VOLD, KC_MNXT, KC_F4, KC_F5, KC_F6, KC_J, KC_K, KC_L, KC_SCLN, _______, \ + _______, _______, _______, _______, KC_F1, KC_F2, KC_F3, KC_MUTE, KC_MPRV, KC_MNXT, KC_MSTP, _______, \ + XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, __MOD__, __MOD__, XXXXXXX \ + ), + + [_ADJUST] = LAYOUT( \ + _______, RESET, _______, _______, _______, _______, _______, DYN_REC_START1, DYN_REC_START2, _______, KC_PSCR, _______, _______, \ + _______, _______, _______, _______, USEFNMODS, _______, _______, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, MACSLEEP, _______, _______, \ + _______, _______, _______, _______, _______, _______, USENUMMODS, _______, _______, _______, _______, _______, \ + XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, __MOD__, __MOD__, XXXXXXX \ + ) +}; const uint16_t PROGMEM fn_actions[] = { [0] = ACTION_LAYER_TAP_KEY(_NUMSYM, KC_SPC), From cc8744548108b1c1f820fb411ac3bf313aca1f5f Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Fri, 26 Oct 2018 00:12:07 -0700 Subject: [PATCH 276/505] JD45: readme update Updated the links to the Docs. --- keyboards/jd45/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keyboards/jd45/readme.md b/keyboards/jd45/readme.md index d85a521269eb..7ef02bd4fae5 100644 --- a/keyboards/jd45/readme.md +++ b/keyboards/jd45/readme.md @@ -11,4 +11,4 @@ Make example for this keyboard (after setting up your build environment): make jd45:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). From e22c3992454ade93ccaef70ab077e79a4b2a5ef0 Mon Sep 17 00:00:00 2001 From: gromwalh <15847180+gromwalh@users.noreply.github.com> Date: Fri, 26 Oct 2018 14:12:40 -0700 Subject: [PATCH 277/505] Ergodox Infinity: Swapped Row and Column in comments (#4247) When comparing the pins in this file to the Ergodox Infinity schematic, it seems that the first section is describing the rows and the second section is describing the columns. --- keyboards/ergodox_infinity/matrix.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keyboards/ergodox_infinity/matrix.c b/keyboards/ergodox_infinity/matrix.c index 3baa07f58327..3a0a1792866d 100644 --- a/keyboards/ergodox_infinity/matrix.c +++ b/keyboards/ergodox_infinity/matrix.c @@ -44,14 +44,14 @@ static uint16_t debouncing_time = 0; void matrix_init(void) { - /* Column(sense) */ + /* Row(sense) */ palSetPadMode(GPIOD, 1, PAL_MODE_INPUT_PULLDOWN); palSetPadMode(GPIOD, 4, PAL_MODE_INPUT_PULLDOWN); palSetPadMode(GPIOD, 5, PAL_MODE_INPUT_PULLDOWN); palSetPadMode(GPIOD, 6, PAL_MODE_INPUT_PULLDOWN); palSetPadMode(GPIOD, 7, PAL_MODE_INPUT_PULLDOWN); - /* Row(strobe) */ + /* Column(strobe) */ palSetPadMode(GPIOB, 2, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOB, 3, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOB, 18, PAL_MODE_OUTPUT_PUSHPULL); From 85688e5b52112c86895171d3dc8b26610480e932 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 26 Oct 2018 16:19:23 -0400 Subject: [PATCH 278/505] add support for encoders to core --- common_features.mk | 5 +++ docs/_sidebar.md | 1 + docs/_summary.md | 1 + docs/feature_encoders.md | 41 ++++++++++++++++++++ keyboards/planck/planck.h | 2 + keyboards/planck/rev6/config.h | 4 ++ keyboards/planck/rev6/matrix.c | 29 -------------- keyboards/planck/rev6/rules.mk | 1 + quantum/encoder.c | 70 ++++++++++++++++++++++++++++++++++ quantum/encoder.h | 29 ++++++++++++++ quantum/quantum.c | 12 ++++++ 11 files changed, 166 insertions(+), 29 deletions(-) create mode 100644 docs/feature_encoders.md create mode 100644 quantum/encoder.c create mode 100644 quantum/encoder.h diff --git a/common_features.mk b/common_features.mk index 65ff6b5b3844..3fd8361a526c 100644 --- a/common_features.mk +++ b/common_features.mk @@ -219,6 +219,11 @@ ifeq ($(strip $(USB_HID_ENABLE)), yes) include $(TMK_DIR)/protocol/usb_hid.mk endif +ifeq ($(strip $(ENCODER_ENABLE)), yes) + SRC += $(QUANTUM_DIR)/encoder.c + OPT_DEFS += -DENCODER_ENABLE +endif + ifeq ($(strip $(HD44780_ENABLE)), yes) SRC += drivers/avr/hd44780.c OPT_DEFS += -DHD44780_ENABLE diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 465f4657cd32..2c573801220a 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -52,6 +52,7 @@ * [Combos](feature_combo) * [Command](feature_command.md) * [Dynamic Macros](feature_dynamic_macros.md) + * [Encoders](feature_encoders.md) * [Grave Escape](feature_grave_esc.md) * [Key Lock](feature_key_lock.md) * [Layouts](feature_layouts.md) diff --git a/docs/_summary.md b/docs/_summary.md index 465f4657cd32..2c573801220a 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -52,6 +52,7 @@ * [Combos](feature_combo) * [Command](feature_command.md) * [Dynamic Macros](feature_dynamic_macros.md) + * [Encoders](feature_encoders.md) * [Grave Escape](feature_grave_esc.md) * [Key Lock](feature_key_lock.md) * [Layouts](feature_layouts.md) diff --git a/docs/feature_encoders.md b/docs/feature_encoders.md new file mode 100644 index 000000000000..f482eefec838 --- /dev/null +++ b/docs/feature_encoders.md @@ -0,0 +1,41 @@ +# Encoders + +Basic encoders are supported by adding this to your `rules.mk`: + + ENCODER_ENABLE = yes + +and this to your `config.h`: + + #define NUMBER_OF_ENCODERS 1 + #define ENCODERS_PAD_A { B12 } + #define ENCODERS_PAD_B { B13 } + +Each PAD_A/B variable defines an array so multiple encoders can be defined, e.g.: + + #define ENCODERS_PAD_A { encoder1a, encoder2a } + #define ENCODERS_PAD_B { encoder1a, encoder2b } + +If your encoder's clockwise directions are incorrect, you can swap the A & B pad definitions. + +Additionally, the resolution can be specified in the same file (the default & suggested is 4): + + #define ENCODER_RESOLUTION 4 + +## Callbacks + +The callback functions can be inserted into your `.c`: + + void encoder_update_kb(uint8_t index, bool clockwise) { + encoder_update_user(index, clockwise); + } + +or `keymap.c`: + + void encoder_update_user(uint8_t index, bool clockwise) { + + } + + +## Hardware + +The A an B lines of the encoders should be wired directly to the MCU, and the C/common lines should be wired to ground. diff --git a/keyboards/planck/planck.h b/keyboards/planck/planck.h index f0a12d9335b7..d908d80ec4a3 100644 --- a/keyboards/planck/planck.h +++ b/keyboards/planck/planck.h @@ -3,6 +3,8 @@ #include "quantum.h" +#define encoder_update(clockwise) encoder_update_user(uint8_t index, clockwise) + #ifdef __AVR__ #define LAYOUT_planck_mit( \ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ diff --git a/keyboards/planck/rev6/config.h b/keyboards/planck/rev6/config.h index afd69f7d847b..c0fbb412ee1b 100644 --- a/keyboards/planck/rev6/config.h +++ b/keyboards/planck/rev6/config.h @@ -43,6 +43,10 @@ * #define UNUSED_PINS */ +#define NUMBER_OF_ENCODERS 1 +#define ENCODERS_PAD_A { B12 } +#define ENCODERS_PAD_B { B13 } + #define MUSIC_MAP #undef AUDIO_VOICES #undef C6_AUDIO diff --git a/keyboards/planck/rev6/matrix.c b/keyboards/planck/rev6/matrix.c index e4ebe48acc69..2df588cefc34 100644 --- a/keyboards/planck/rev6/matrix.c +++ b/keyboards/planck/rev6/matrix.c @@ -21,10 +21,6 @@ static matrix_row_t matrix_debouncing[MATRIX_COLS]; static bool debouncing = false; static uint16_t debouncing_time = 0; -static uint8_t encoder_state = 0; -static int8_t encoder_value = 0; -static int8_t encoder_LUT[] = { 0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0 }; - static bool dip_switch[4] = {0, 0, 0, 0}; __attribute__ ((weak)) @@ -53,12 +49,6 @@ void matrix_init(void) { palSetPadMode(GPIOA, 10, PAL_MODE_INPUT_PULLUP); palSetPadMode(GPIOB, 9, PAL_MODE_INPUT_PULLUP); - // encoder setup - palSetPadMode(GPIOB, 12, PAL_MODE_INPUT_PULLUP); - palSetPadMode(GPIOB, 13, PAL_MODE_INPUT_PULLUP); - - encoder_state = (palReadPad(GPIOB, 12) << 0) | (palReadPad(GPIOB, 13) << 1); - // actual matrix setup palSetPadMode(GPIOB, 11, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOB, 10, PAL_MODE_OUTPUT_PUSHPULL); @@ -87,15 +77,8 @@ void matrix_init(void) { __attribute__ ((weak)) void dip_update(uint8_t index, bool active) { } -__attribute__ ((weak)) -void encoder_update(bool clockwise) { } - bool last_dip_switch[4] = {0}; -#ifndef ENCODER_RESOLUTION - #define ENCODER_RESOLUTION 4 -#endif - uint8_t matrix_scan(void) { // dip switch dip_switch[0] = !palReadPad(GPIOB, 14); @@ -108,18 +91,6 @@ uint8_t matrix_scan(void) { } memcpy(last_dip_switch, dip_switch, sizeof(&dip_switch)); - // encoder on B12 and B13 - encoder_state <<= 2; - encoder_state |= (palReadPad(GPIOB, 12) << 0) | (palReadPad(GPIOB, 13) << 1); - encoder_value += encoder_LUT[encoder_state & 0xF]; - if (encoder_value >= ENCODER_RESOLUTION) { - encoder_update(0); - } - if (encoder_value <= -ENCODER_RESOLUTION) { // direction is arbitrary here, but this clockwise - encoder_update(1); - } - encoder_value %= ENCODER_RESOLUTION; - // actual matrix for (int col = 0; col < MATRIX_COLS; col++) { matrix_row_t data = 0; diff --git a/keyboards/planck/rev6/rules.mk b/keyboards/planck/rev6/rules.mk index 3603e287b35e..dce683a7fff9 100644 --- a/keyboards/planck/rev6/rules.mk +++ b/keyboards/planck/rev6/rules.mk @@ -54,3 +54,4 @@ CUSTOM_MATRIX = yes # Custom matrix file AUDIO_ENABLE = yes RGBLIGHT_ENABLE = no # SERIAL_LINK_ENABLE = yes +ENCODER_ENABLE = yes diff --git a/quantum/encoder.c b/quantum/encoder.c new file mode 100644 index 000000000000..6629a098b86d --- /dev/null +++ b/quantum/encoder.c @@ -0,0 +1,70 @@ +/* + * Copyright 2018 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 "encoder.h" + +#ifndef ENCODER_RESOLUTION + #define ENCODER_RESOLUTION 4 +#endif + +#ifndef NUMBER_OF_ENCODERS + #error "Number of encoders not defined by NUMBER_OF_ENCODERS" +#endif + +#if !defined(ENCODERS_PAD_A) || !defined(ENCODERS_PAD_B) + #error "No encoder pads defined by ENCODERS_PAD_A and ENCODERS_PAD_B" +#endif + +static pin_t encoders_pad_a[NUMBER_OF_ENCODERS] = ENCODERS_PAD_A; +static pin_t encoders_pad_b[NUMBER_OF_ENCODERS] = ENCODERS_PAD_B; + +static int8_t encoder_LUT[] = { 0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0 }; + +static uint8_t encoder_state[NUMBER_OF_ENCODERS] = {0}; +static int8_t encoder_value[NUMBER_OF_ENCODERS] = {0}; + +__attribute__ ((weak)) +void encoder_update_user(int8_t index, bool clockwise) { } + +__attribute__ ((weak)) +void encoder_update_kb(int8_t index, bool clockwise) { + encoder_update_user(index, clockwise); +} + +void encoder_init(void) { + for (int i = 0; i < NUMBER_OF_ENCODERS; i++) { + setPinInputHigh(encoders_pad_a[i]); + setPinInputHigh(encoders_pad_b[i]); + + encoder_state[i] = (readPin(encoders_pad_a[i]) << 0) | (readPin(encoders_pad_b[i]) << 1); + } +} + +void encoder_read(void) { + for (int i = 0; i < NUMBER_OF_ENCODERS; i++) { + encoder_state[i] <<= 2; + encoder_state[i] |= (readPin(encoders_pad_a[i]) << 0) | (readPin(encoders_pad_b[i]) << 1); + encoder_value[i] += encoder_LUT[encoder_state[i] & 0xF]; + if (encoder_value[i] >= ENCODER_RESOLUTION) { + encoder_update_kb(i, COUNTRECLOCKWISE); + } + if (encoder_value[i] <= -ENCODER_RESOLUTION) { // direction is arbitrary here, but this clockwise + encoder_update_kb(i, CLOCKWISE); + } + encoder_value[i] %= ENCODER_RESOLUTION; + } +} diff --git a/quantum/encoder.h b/quantum/encoder.h new file mode 100644 index 000000000000..2024fa303f34 --- /dev/null +++ b/quantum/encoder.h @@ -0,0 +1,29 @@ +/* + * Copyright 2018 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 . + */ + +#pragma once + +#include "quantum.h" + +#define COUNTRECLOCKWISE 0 +#define CLOCKWISE 1 + +void encoder_init(void); +void encoder_read(void); + +void encoder_update_kb(int8_t index, bool clockwise); +void encoder_update_user(int8_t index, bool clockwise); diff --git a/quantum/quantum.c b/quantum/quantum.c index eed59f811e8b..c9bec6740baa 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -42,6 +42,11 @@ extern backlight_config_t backlight_config; #include "process_midi.h" #endif + +#ifdef ENCODER_ENABLE +#include "encoder.h" +#endif + #ifdef AUDIO_ENABLE #ifndef GOODBYE_SONG #define GOODBYE_SONG SONG(GOODBYE_SOUND) @@ -957,6 +962,9 @@ void matrix_init_quantum() { #ifdef RGB_MATRIX_ENABLE rgb_matrix_init(); #endif + #ifdef ENCODER_ENABLE + encoder_init(); + #endif matrix_init_kb(); } @@ -991,6 +999,10 @@ void matrix_scan_quantum() { rgb_matrix_task_counter = ((rgb_matrix_task_counter + 1) % (RGB_MATRIX_SKIP_FRAMES + 1)); #endif + #ifdef ENCODER_ENABLE + encoder_read(); + #endif + matrix_scan_kb(); } #if defined(BACKLIGHT_ENABLE) && defined(BACKLIGHT_PIN) From 24b3556e844ec76813a42ce4c5b7a77a6f874d5a Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 26 Oct 2018 16:47:00 -0400 Subject: [PATCH 279/505] add better example --- docs/feature_encoders.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/feature_encoders.md b/docs/feature_encoders.md index f482eefec838..036c6a1d8961 100644 --- a/docs/feature_encoders.md +++ b/docs/feature_encoders.md @@ -32,10 +32,17 @@ The callback functions can be inserted into your `.c`: or `keymap.c`: void encoder_update_user(uint8_t index, bool clockwise) { - + if (index == 0) { + if (clockwise) { + register_code(KC_PGDN); + unregister_code(KC_PGDN); + } else { + register_code(KC_PGUP); + unregister_code(KC_PGUP); + } + } } - ## Hardware The A an B lines of the encoders should be wired directly to the MCU, and the C/common lines should be wired to ground. From 6fa3cfbf534b54290f693dc1986437aebd092b32 Mon Sep 17 00:00:00 2001 From: yiancar Date: Sat, 27 Oct 2018 00:14:29 +0100 Subject: [PATCH 280/505] Keyboard: Add HS60 V2 (#4250) * HS60 V2 - Created V1 and V2 folders - Added V2 ARM configuration * Problems in paradise * More touble * We got it now! --- keyboards/hs60/{ => v1}/config.h | 5 +- keyboards/hs60/{ => v1}/info.json | 0 keyboards/hs60/{ => v1}/keymaps/ansi/config.h | 7 +- keyboards/hs60/{ => v1}/keymaps/ansi/keymap.c | 0 .../hs60/{ => v1}/keymaps/ansi/readme.md | 0 .../hs60/{ => v1}/keymaps/default/keymap.c | 0 .../hs60/{ => v1}/keymaps/default/readme.md | 0 keyboards/hs60/{ => v1}/readme.md | 2 +- keyboards/hs60/{ => v1}/rules.mk | 0 keyboards/hs60/{hs60.c => v1/v1.c} | 3 +- keyboards/hs60/{hs60.h => v1/v1.h} | 0 .../v2/boards/GENERIC_STM32_F303XC/board.c | 126 ++ .../v2/boards/GENERIC_STM32_F303XC/board.h | 1187 ++++++++++++ .../v2/boards/GENERIC_STM32_F303XC/board.mk | 5 + keyboards/hs60/v2/bootloader_defs.h | 7 + keyboards/hs60/v2/chconf.h | 520 ++++++ keyboards/hs60/v2/config.h | 117 ++ keyboards/hs60/v2/halconf.h | 388 ++++ keyboards/hs60/v2/info.json | 1650 +++++++++++++++++ keyboards/hs60/v2/keymaps/ansi/config.h | 21 + keyboards/hs60/v2/keymaps/ansi/keymap.c | 46 + keyboards/hs60/v2/keymaps/ansi/readme.md | 6 + keyboards/hs60/v2/keymaps/default/keymap.c | 46 + keyboards/hs60/v2/keymaps/default/readme.md | 6 + keyboards/hs60/v2/keymaps/hhkb/config.h | 21 + keyboards/hs60/v2/keymaps/hhkb/keymap.c | 46 + keyboards/hs60/v2/mcuconf.h | 257 +++ keyboards/hs60/v2/readme.md | 18 + keyboards/hs60/v2/rules.mk | 58 + keyboards/hs60/v2/v2.c | 635 +++++++ keyboards/hs60/v2/v2.h | 67 + 31 files changed, 5231 insertions(+), 13 deletions(-) rename keyboards/hs60/{ => v1}/config.h (99%) rename keyboards/hs60/{ => v1}/info.json (100%) rename keyboards/hs60/{ => v1}/keymaps/ansi/config.h (90%) rename keyboards/hs60/{ => v1}/keymaps/ansi/keymap.c (100%) rename keyboards/hs60/{ => v1}/keymaps/ansi/readme.md (100%) rename keyboards/hs60/{ => v1}/keymaps/default/keymap.c (100%) rename keyboards/hs60/{ => v1}/keymaps/default/readme.md (100%) rename keyboards/hs60/{ => v1}/readme.md (96%) rename keyboards/hs60/{ => v1}/rules.mk (100%) rename keyboards/hs60/{hs60.c => v1/v1.c} (99%) rename keyboards/hs60/{hs60.h => v1/v1.h} (100%) create mode 100644 keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.c create mode 100644 keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.h create mode 100644 keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.mk create mode 100644 keyboards/hs60/v2/bootloader_defs.h create mode 100644 keyboards/hs60/v2/chconf.h create mode 100644 keyboards/hs60/v2/config.h create mode 100644 keyboards/hs60/v2/halconf.h create mode 100644 keyboards/hs60/v2/info.json create mode 100644 keyboards/hs60/v2/keymaps/ansi/config.h create mode 100644 keyboards/hs60/v2/keymaps/ansi/keymap.c create mode 100644 keyboards/hs60/v2/keymaps/ansi/readme.md create mode 100644 keyboards/hs60/v2/keymaps/default/keymap.c create mode 100644 keyboards/hs60/v2/keymaps/default/readme.md create mode 100644 keyboards/hs60/v2/keymaps/hhkb/config.h create mode 100644 keyboards/hs60/v2/keymaps/hhkb/keymap.c create mode 100644 keyboards/hs60/v2/mcuconf.h create mode 100644 keyboards/hs60/v2/readme.md create mode 100644 keyboards/hs60/v2/rules.mk create mode 100644 keyboards/hs60/v2/v2.c create mode 100644 keyboards/hs60/v2/v2.h diff --git a/keyboards/hs60/config.h b/keyboards/hs60/v1/config.h similarity index 99% rename from keyboards/hs60/config.h rename to keyboards/hs60/v1/config.h index 31f7c0790176..c297a6e191f1 100644 --- a/keyboards/hs60/config.h +++ b/keyboards/hs60/v1/config.h @@ -15,8 +15,7 @@ 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 +#pragma once #include "config_common.h" @@ -142,5 +141,3 @@ along with this program. If not, see . #endif #define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL - -#endif diff --git a/keyboards/hs60/info.json b/keyboards/hs60/v1/info.json similarity index 100% rename from keyboards/hs60/info.json rename to keyboards/hs60/v1/info.json diff --git a/keyboards/hs60/keymaps/ansi/config.h b/keyboards/hs60/v1/keymaps/ansi/config.h similarity index 90% rename from keyboards/hs60/keymaps/ansi/config.h rename to keyboards/hs60/v1/keymaps/ansi/config.h index bab67fd5587f..f51cc16d8536 100644 --- a/keyboards/hs60/keymaps/ansi/config.h +++ b/keyboards/hs60/v1/keymaps/ansi/config.h @@ -14,13 +14,8 @@ 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 - -#include "../../config.h" +#pragma once /* Include overwrites for specific keymap */ #define HS60_ANSI - -#endif \ No newline at end of file diff --git a/keyboards/hs60/keymaps/ansi/keymap.c b/keyboards/hs60/v1/keymaps/ansi/keymap.c similarity index 100% rename from keyboards/hs60/keymaps/ansi/keymap.c rename to keyboards/hs60/v1/keymaps/ansi/keymap.c diff --git a/keyboards/hs60/keymaps/ansi/readme.md b/keyboards/hs60/v1/keymaps/ansi/readme.md similarity index 100% rename from keyboards/hs60/keymaps/ansi/readme.md rename to keyboards/hs60/v1/keymaps/ansi/readme.md diff --git a/keyboards/hs60/keymaps/default/keymap.c b/keyboards/hs60/v1/keymaps/default/keymap.c similarity index 100% rename from keyboards/hs60/keymaps/default/keymap.c rename to keyboards/hs60/v1/keymaps/default/keymap.c diff --git a/keyboards/hs60/keymaps/default/readme.md b/keyboards/hs60/v1/keymaps/default/readme.md similarity index 100% rename from keyboards/hs60/keymaps/default/readme.md rename to keyboards/hs60/v1/keymaps/default/readme.md diff --git a/keyboards/hs60/readme.md b/keyboards/hs60/v1/readme.md similarity index 96% rename from keyboards/hs60/readme.md rename to keyboards/hs60/v1/readme.md index 939b5882862b..a77bbc25ca18 100644 --- a/keyboards/hs60/readme.md +++ b/keyboards/hs60/v1/readme.md @@ -13,6 +13,6 @@ Due to the RGB implementation, the HS60 is currently not compatible with communi Make example for this keyboard (after setting up your build environment): - make hs60:default + make hs60/v1:default See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. diff --git a/keyboards/hs60/rules.mk b/keyboards/hs60/v1/rules.mk similarity index 100% rename from keyboards/hs60/rules.mk rename to keyboards/hs60/v1/rules.mk diff --git a/keyboards/hs60/hs60.c b/keyboards/hs60/v1/v1.c similarity index 99% rename from keyboards/hs60/hs60.c rename to keyboards/hs60/v1/v1.c index 169f84b02049..882611030b62 100644 --- a/keyboards/hs60/hs60.c +++ b/keyboards/hs60/v1/v1.c @@ -13,8 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "hs60.h" -#include "config.h" +#include "v1.h" // Please ignore this is for upcoming features /*#ifdef RAW_ENABLE diff --git a/keyboards/hs60/hs60.h b/keyboards/hs60/v1/v1.h similarity index 100% rename from keyboards/hs60/hs60.h rename to keyboards/hs60/v1/v1.h diff --git a/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.c b/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.c new file mode 100644 index 000000000000..4331155df4b6 --- /dev/null +++ b/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.c @@ -0,0 +1,126 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include "hal.h" + +#if HAL_USE_PAL || defined(__DOXYGEN__) +/** + * @brief PAL setup. + * @details Digital I/O ports static configuration as defined in @p board.h. + * This variable is used by the HAL when initializing the PAL driver. + */ +const PALConfig pal_default_config = { +#if STM32_HAS_GPIOA + {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, + VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, +#endif +#if STM32_HAS_GPIOB + {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, + VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, +#endif +#if STM32_HAS_GPIOC + {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, + VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, +#endif +#if STM32_HAS_GPIOD + {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, + VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, +#endif +#if STM32_HAS_GPIOE + {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, + VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, +#endif +#if STM32_HAS_GPIOF + {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, + VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, +#endif +#if STM32_HAS_GPIOG + {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, + VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, +#endif +#if STM32_HAS_GPIOH + {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, + VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, +#endif +#if STM32_HAS_GPIOI + {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, + VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} +#endif +}; +#endif + +void enter_bootloader_mode_if_requested(void); + +/** + * @brief Early initialization code. + * @details This initialization must be performed just after stack setup + * and before any other initialization. + */ +void __early_init(void) { + enter_bootloader_mode_if_requested(); + stm32_clock_init(); +} + +#if HAL_USE_SDC || defined(__DOXYGEN__) +/** + * @brief SDC card detection. + */ +bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { + + (void)sdcp; + /* TODO: Fill the implementation.*/ + return true; +} + +/** + * @brief SDC card write protection detection. + */ +bool sdc_lld_is_write_protected(SDCDriver *sdcp) { + + (void)sdcp; + /* TODO: Fill the implementation.*/ + return false; +} +#endif /* HAL_USE_SDC */ + +#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) +/** + * @brief MMC_SPI card detection. + */ +bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { + + (void)mmcp; + /* TODO: Fill the implementation.*/ + return true; +} + +/** + * @brief MMC_SPI card write protection detection. + */ +bool mmc_lld_is_write_protected(MMCDriver *mmcp) { + + (void)mmcp; + /* TODO: Fill the implementation.*/ + return false; +} +#endif + +/** + * @brief Board-specific initialization code. + * @todo Add your board-specific code, if any. + */ +void boardInit(void) { +} diff --git a/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.h b/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.h new file mode 100644 index 000000000000..fb7283add942 --- /dev/null +++ b/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.h @@ -0,0 +1,1187 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +/* + * Setup for Clueboard 60% Keyboard + */ + +/* + * Board identifier. + */ +#define BOARD_GENERIC_STM32_F303XC +#define BOARD_NAME "HS60 V2.0 PCB" + +/* + * Board oscillators-related settings. + * NOTE: LSE not fitted. + */ +#if !defined(STM32_LSECLK) +#define STM32_LSECLK 0U +#endif + +#define STM32_LSEDRV (3U << 3U) + +#if !defined(STM32_HSECLK) +#define STM32_HSECLK 8000000U +#endif + +// #define STM32_HSE_BYPASS + +/* + * MCU type as defined in the ST header. + */ +#define STM32F303xC + +/* + * IO pins assignments. + */ +#define GPIOA_PIN0 0U +#define GPIOA_PIN1 1U +#define GPIOA_PIN2 2U +#define GPIOA_PIN3 3U +#define GPIOA_PIN4 4U +#define GPIOA_PIN5 5U +#define GPIOA_PIN6 6U +#define GPIOA_PIN7 7U +#define GPIOA_PIN8 8U +#define GPIOA_PIN9 9U +#define GPIOA_PIN10 10U +#define GPIOA_USB_DM 11U +#define GPIOA_USB_DP 12U +#define GPIOA_SWDIO 13U +#define GPIOA_SWCLK 14U +#define GPIOA_PIN15 15U + +#define GPIOB_PIN0 0U +#define GPIOB_PIN1 1U +#define GPIOB_PIN2 2U +#define GPIOB_PIN3 3U +#define GPIOB_PIN4 4U +#define GPIOB_PIN5 5U +#define GPIOB_PIN6 6U +#define GPIOB_PIN7 7U +#define GPIOB_PIN8 8U +#define GPIOB_PIN9 9U +#define GPIOB_PIN10 10U +#define GPIOB_PIN11 11U +#define GPIOB_PIN12 12U +#define GPIOB_PIN13 13U +#define GPIOB_PIN14 14U +#define GPIOB_PIN15 15U + +#define GPIOC_PIN0 0U +#define GPIOC_PIN1 1U +#define GPIOC_PIN2 2U +#define GPIOC_PIN3 3U +#define GPIOC_PIN4 4U +#define GPIOC_PIN5 5U +#define GPIOC_PIN6 6U +#define GPIOC_PIN7 7U +#define GPIOC_PIN8 8U +#define GPIOC_PIN9 9U +#define GPIOC_PIN10 10U +#define GPIOC_PIN11 11U +#define GPIOC_PIN12 12U +#define GPIOC_PIN13 13U +#define GPIOC_PIN14 14U +#define GPIOC_PIN15 15U + +#define GPIOD_PIN0 0U +#define GPIOD_PIN1 1U +#define GPIOD_PIN2 2U +#define GPIOD_PIN3 3U +#define GPIOD_PIN4 4U +#define GPIOD_PIN5 5U +#define GPIOD_PIN6 6U +#define GPIOD_PIN7 7U +#define GPIOD_PIN8 8U +#define GPIOD_PIN9 9U +#define GPIOD_PIN10 10U +#define GPIOD_PIN11 11U +#define GPIOD_PIN12 12U +#define GPIOD_PIN13 13U +#define GPIOD_PIN14 14U +#define GPIOD_PIN15 15U + +#define GPIOE_PIN0 0U +#define GPIOE_PIN1 1U +#define GPIOE_PIN2 2U +#define GPIOE_PIN3 3U +#define GPIOE_PIN4 4U +#define GPIOE_PIN5 5U +#define GPIOE_PIN6 6U +#define GPIOE_PIN7 7U +#define GPIOE_PIN8 8U +#define GPIOE_PIN9 9U +#define GPIOE_PIN10 10U +#define GPIOE_PIN11 11U +#define GPIOE_PIN12 12U +#define GPIOE_PIN13 13U +#define GPIOE_PIN14 14U +#define GPIOE_PIN15 15U + +#define GPIOF_I2C2_SDA 0U +#define GPIOF_I2C2_SCL 1U +#define GPIOF_PIN2 2U +#define GPIOF_PIN3 3U +#define GPIOF_PIN4 4U +#define GPIOF_PIN5 5U +#define GPIOF_PIN6 6U +#define GPIOF_PIN7 7U +#define GPIOF_PIN8 8U +#define GPIOF_PIN9 9U +#define GPIOF_PIN10 10U +#define GPIOF_PIN11 11U +#define GPIOF_PIN12 12U +#define GPIOF_PIN13 13U +#define GPIOF_PIN14 14U +#define GPIOF_PIN15 15U + +#define GPIOG_PIN0 0U +#define GPIOG_PIN1 1U +#define GPIOG_PIN2 2U +#define GPIOG_PIN3 3U +#define GPIOG_PIN4 4U +#define GPIOG_PIN5 5U +#define GPIOG_PIN6 6U +#define GPIOG_PIN7 7U +#define GPIOG_PIN8 8U +#define GPIOG_PIN9 9U +#define GPIOG_PIN10 10U +#define GPIOG_PIN11 11U +#define GPIOG_PIN12 12U +#define GPIOG_PIN13 13U +#define GPIOG_PIN14 14U +#define GPIOG_PIN15 15U + +#define GPIOH_PIN0 0U +#define GPIOH_PIN1 1U +#define GPIOH_PIN2 2U +#define GPIOH_PIN3 3U +#define GPIOH_PIN4 4U +#define GPIOH_PIN5 5U +#define GPIOH_PIN6 6U +#define GPIOH_PIN7 7U +#define GPIOH_PIN8 8U +#define GPIOH_PIN9 9U +#define GPIOH_PIN10 10U +#define GPIOH_PIN11 11U +#define GPIOH_PIN12 12U +#define GPIOH_PIN13 13U +#define GPIOH_PIN14 14U +#define GPIOH_PIN15 15U + +/* + * IO lines assignments. + */ +#define LINE_L3GD20_SDI PAL_LINE(GPIOA, 7U) +#define LINE_USB_DM PAL_LINE(GPIOA, 11U) +#define LINE_USB_DP PAL_LINE(GPIOA, 12U) +#define LINE_SWDIO PAL_LINE(GPIOA, 13U) +#define LINE_SWCLK PAL_LINE(GPIOA, 14U) + +#define LINE_PIN6 PAL_LINE(GPIOF, 0U) +#define LINE_PIN7 PAL_LINE(GPIOF, 1U) + +#define LINE_CAPS_LOCK PAL_LINE(GPIOB, 7U) + + +/* + * I/O ports initial setup, this configuration is established soon after reset + * in the initialization code. + * Please refer to the STM32 Reference Manual for details. + */ +#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) +#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) +#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) +#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) +#define PIN_ODR_LOW(n) (0U << (n)) +#define PIN_ODR_HIGH(n) (1U << (n)) +#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) +#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) +#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) +#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) +#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) +#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) +#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) +#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) +#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) +#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) + +/* + * GPIOA setup: + * + * PA0 - NC + * PA1 - NC + * PA2 - COL1 + * PA3 - COL2 + * PA4 - SPEAKER1 + * PA5 - SPEAKER2 + * PA6 - COL3 + * PA7 - COL8 + * PA8 - COL6 + * PA9 - COL7 + * PA10 - ROW5 + * PA11 - USB_DM (alternate 14). + * PA12 - USB_DP (alternate 14). + * PA13 - SWDIO (alternate 0). + * PA14 - SWCLK (alternate 0). + * PA15 - ROW4 + */ +#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_PIN0) | \ + PIN_MODE_ALTERNATE(GPIOA_PIN1) | \ + PIN_MODE_INPUT(GPIOA_PIN2) | \ + PIN_MODE_INPUT(GPIOA_PIN3) | \ + PIN_MODE_INPUT(GPIOA_PIN4) | \ + PIN_MODE_INPUT(GPIOA_PIN5) | \ + PIN_MODE_INPUT(GPIOA_PIN6) | \ + PIN_MODE_INPUT(GPIOA_PIN7) | \ + PIN_MODE_INPUT(GPIOA_PIN8) | \ + PIN_MODE_INPUT(GPIOA_PIN9) | \ + PIN_MODE_INPUT(GPIOA_PIN10) | \ + PIN_MODE_ALTERNATE(GPIOA_USB_DM) | \ + PIN_MODE_ALTERNATE(GPIOA_USB_DP) | \ + PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ + PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ + PIN_MODE_INPUT(GPIOA_PIN15)) +#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | \ + PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | \ + PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ + PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) +#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_PIN0) | \ + PIN_OSPEED_HIGH(GPIOA_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \ + PIN_OSPEED_HIGH(GPIOA_USB_DM) | \ + PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | \ + PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ + PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN15)) +#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_PIN0) | \ + PIN_PUPDR_FLOATING(GPIOA_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN6) | \ + PIN_PUPDR_FLOATING(GPIOA_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN10) | \ + PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \ + PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \ + PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ + PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN15)) +#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | \ + PIN_ODR_HIGH(GPIOA_PIN1) | \ + PIN_ODR_HIGH(GPIOA_PIN2) | \ + PIN_ODR_HIGH(GPIOA_PIN3) | \ + PIN_ODR_HIGH(GPIOA_PIN4) | \ + PIN_ODR_HIGH(GPIOA_PIN5) | \ + PIN_ODR_HIGH(GPIOA_PIN6) | \ + PIN_ODR_HIGH(GPIOA_PIN7) | \ + PIN_ODR_HIGH(GPIOA_PIN8) | \ + PIN_ODR_HIGH(GPIOA_PIN9) | \ + PIN_ODR_HIGH(GPIOA_PIN10) | \ + PIN_ODR_HIGH(GPIOA_USB_DM) | \ + PIN_ODR_HIGH(GPIOA_USB_DP) | \ + PIN_ODR_HIGH(GPIOA_SWDIO) | \ + PIN_ODR_HIGH(GPIOA_SWCLK) | \ + PIN_ODR_HIGH(GPIOA_PIN15)) +#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0) | \ + PIN_AFIO_AF(GPIOA_PIN1, 1) | \ + PIN_AFIO_AF(GPIOA_PIN2, 0) | \ + PIN_AFIO_AF(GPIOA_PIN3, 0) | \ + PIN_AFIO_AF(GPIOA_PIN4, 0) | \ + PIN_AFIO_AF(GPIOA_PIN5, 5) | \ + PIN_AFIO_AF(GPIOA_PIN6, 5) | \ + PIN_AFIO_AF(GPIOA_PIN7, 5)) +#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0) | \ + PIN_AFIO_AF(GPIOA_PIN9, 0) | \ + PIN_AFIO_AF(GPIOA_PIN10, 0) | \ + PIN_AFIO_AF(GPIOA_USB_DM, 14) | \ + PIN_AFIO_AF(GPIOA_USB_DP, 14) | \ + PIN_AFIO_AF(GPIOA_SWDIO, 0) | \ + PIN_AFIO_AF(GPIOA_SWCLK, 0) | \ + PIN_AFIO_AF(GPIOA_PIN15, 0)) + +/* + * GPIOB setup: + * + * PB0 - PIN0 (input pullup). + * PB1 - PIN1 (input pullup). + * PB2 - PIN2 (input pullup). + * PB3 - PIN3 (alternate 0). + * PB4 - PIN4 (input pullup). + * PB5 - PIN5 (input pullup). + * PB6 - PIN6 LSM303DLHC_SCL (alternate 4). + * PB7 - PIN7 LSM303DLHC_SDA (alternate 4). + * PB8 - PIN8 (input pullup). + * PB9 - PIN9 (input pullup). + * PB10 - PIN10 (input pullup). + * PB11 - PIN11 (input pullup). + * PB12 - PIN12 (input pullup). + * PB13 - PIN13 (input pullup). + * PB14 - PIN14 (input pullup). + * PB15 - PIN15 (input pullup). + */ +#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ + PIN_MODE_INPUT(GPIOB_PIN1) | \ + PIN_MODE_INPUT(GPIOB_PIN2) | \ + PIN_MODE_ALTERNATE(GPIOB_PIN3) | \ + PIN_MODE_INPUT(GPIOB_PIN4) | \ + PIN_MODE_INPUT(GPIOB_PIN5) | \ + PIN_MODE_ALTERNATE(GPIOB_PIN6) | \ + PIN_MODE_OUTPUT(GPIOB_PIN7) | \ + PIN_MODE_INPUT(GPIOB_PIN8) | \ + PIN_MODE_INPUT(GPIOB_PIN9) | \ + PIN_MODE_INPUT(GPIOB_PIN10) | \ + PIN_MODE_INPUT(GPIOB_PIN11) | \ + PIN_MODE_INPUT(GPIOB_PIN12) | \ + PIN_MODE_INPUT(GPIOB_PIN13) | \ + PIN_MODE_INPUT(GPIOB_PIN14) | \ + PIN_MODE_INPUT(GPIOB_PIN15)) +#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ + PIN_OTYPE_OPENDRAIN(GPIOB_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) +#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN2) | \ + PIN_OSPEED_HIGH(GPIOB_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \ + PIN_OSPEED_HIGH(GPIOB_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN15)) +#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN2) | \ + PIN_PUPDR_FLOATING(GPIOB_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN5) | \ + PIN_PUPDR_FLOATING(GPIOB_PIN6) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN15)) +#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ + PIN_ODR_HIGH(GPIOB_PIN1) | \ + PIN_ODR_HIGH(GPIOB_PIN2) | \ + PIN_ODR_HIGH(GPIOB_PIN3) | \ + PIN_ODR_HIGH(GPIOB_PIN4) | \ + PIN_ODR_HIGH(GPIOB_PIN5) | \ + PIN_ODR_HIGH(GPIOB_PIN6) | \ + PIN_ODR_LOW(GPIOB_PIN7) | \ + PIN_ODR_HIGH(GPIOB_PIN8) | \ + PIN_ODR_HIGH(GPIOB_PIN9) | \ + PIN_ODR_HIGH(GPIOB_PIN10) | \ + PIN_ODR_HIGH(GPIOB_PIN11) | \ + PIN_ODR_HIGH(GPIOB_PIN12) | \ + PIN_ODR_HIGH(GPIOB_PIN13) | \ + PIN_ODR_HIGH(GPIOB_PIN14) | \ + PIN_ODR_HIGH(GPIOB_PIN15)) +#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0) | \ + PIN_AFIO_AF(GPIOB_PIN1, 0) | \ + PIN_AFIO_AF(GPIOB_PIN2, 0) | \ + PIN_AFIO_AF(GPIOB_PIN3, 0) | \ + PIN_AFIO_AF(GPIOB_PIN4, 0) | \ + PIN_AFIO_AF(GPIOB_PIN5, 0) | \ + PIN_AFIO_AF(GPIOB_PIN6, 4) | \ + PIN_AFIO_AF(GPIOB_PIN7, 0)) +#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0) | \ + PIN_AFIO_AF(GPIOB_PIN9, 0) | \ + PIN_AFIO_AF(GPIOB_PIN10, 0) | \ + PIN_AFIO_AF(GPIOB_PIN11, 0) | \ + PIN_AFIO_AF(GPIOB_PIN12, 0) | \ + PIN_AFIO_AF(GPIOB_PIN13, 0) | \ + PIN_AFIO_AF(GPIOB_PIN14, 0) | \ + PIN_AFIO_AF(GPIOB_PIN15, 0)) + +/* + * GPIOC setup: + * + * PC0 - PIN0 (input pullup). + * PC1 - PIN1 (input pullup). + * PC2 - PIN2 (input pullup). + * PC3 - PIN3 (input pullup). + * PC4 - PIN4 (input pullup). + * PC5 - PIN5 (input pullup). + * PC6 - PIN6 (input pullup). + * PC7 - PIN7 (input pullup). + * PC8 - PIN8 (input pullup). + * PC9 - PIN9 (input pullup). + * PC10 - PIN10 (input pullup). + * PC11 - PIN11 (input pullup). + * PC12 - PIN12 (input pullup). + * PC13 - PIN13 (input pullup). + * PC14 - PIN14 (input floating). + * PC15 - PIN15 (input floating). + */ +#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ + PIN_MODE_INPUT(GPIOC_PIN1) | \ + PIN_MODE_INPUT(GPIOC_PIN2) | \ + PIN_MODE_INPUT(GPIOC_PIN3) | \ + PIN_MODE_INPUT(GPIOC_PIN4) | \ + PIN_MODE_INPUT(GPIOC_PIN5) | \ + PIN_MODE_INPUT(GPIOC_PIN6) | \ + PIN_MODE_INPUT(GPIOC_PIN7) | \ + PIN_MODE_INPUT(GPIOC_PIN8) | \ + PIN_MODE_INPUT(GPIOC_PIN9) | \ + PIN_MODE_INPUT(GPIOC_PIN10) | \ + PIN_MODE_INPUT(GPIOC_PIN11) | \ + PIN_MODE_INPUT(GPIOC_PIN12) | \ + PIN_MODE_INPUT(GPIOC_PIN13) | \ + PIN_MODE_INPUT(GPIOC_PIN14) | \ + PIN_MODE_INPUT(GPIOC_PIN15)) +#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) +#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOC_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN13) | \ + PIN_OSPEED_HIGH(GPIOC_PIN14) | \ + PIN_OSPEED_HIGH(GPIOC_PIN15)) +#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ + PIN_PUPDR_FLOATING(GPIOC_PIN14) | \ + PIN_PUPDR_FLOATING(GPIOC_PIN15)) +#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ + PIN_ODR_HIGH(GPIOC_PIN1) | \ + PIN_ODR_HIGH(GPIOC_PIN2) | \ + PIN_ODR_HIGH(GPIOC_PIN3) | \ + PIN_ODR_HIGH(GPIOC_PIN4) | \ + PIN_ODR_HIGH(GPIOC_PIN5) | \ + PIN_ODR_HIGH(GPIOC_PIN6) | \ + PIN_ODR_HIGH(GPIOC_PIN7) | \ + PIN_ODR_HIGH(GPIOC_PIN8) | \ + PIN_ODR_HIGH(GPIOC_PIN9) | \ + PIN_ODR_HIGH(GPIOC_PIN10) | \ + PIN_ODR_HIGH(GPIOC_PIN11) | \ + PIN_ODR_HIGH(GPIOC_PIN12) | \ + PIN_ODR_HIGH(GPIOC_PIN13) | \ + PIN_ODR_HIGH(GPIOC_PIN14) | \ + PIN_ODR_HIGH(GPIOC_PIN15)) +#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0) | \ + PIN_AFIO_AF(GPIOC_PIN1, 0) | \ + PIN_AFIO_AF(GPIOC_PIN2, 0) | \ + PIN_AFIO_AF(GPIOC_PIN3, 0) | \ + PIN_AFIO_AF(GPIOC_PIN4, 0) | \ + PIN_AFIO_AF(GPIOC_PIN5, 0) | \ + PIN_AFIO_AF(GPIOC_PIN6, 0) | \ + PIN_AFIO_AF(GPIOC_PIN7, 0)) +#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0) | \ + PIN_AFIO_AF(GPIOC_PIN9, 0) | \ + PIN_AFIO_AF(GPIOC_PIN10, 0) | \ + PIN_AFIO_AF(GPIOC_PIN11, 0) | \ + PIN_AFIO_AF(GPIOC_PIN12, 0) | \ + PIN_AFIO_AF(GPIOC_PIN13, 0) | \ + PIN_AFIO_AF(GPIOC_PIN14, 0) | \ + PIN_AFIO_AF(GPIOC_PIN15, 0)) + +/* + * GPIOD setup: + * + * PD0 - PIN0 (input pullup). + * PD1 - PIN1 (input pullup). + * PD2 - PIN2 (input pullup). + * PD3 - PIN3 (input pullup). + * PD4 - PIN4 (input pullup). + * PD5 - PIN5 (input pullup). + * PD6 - PIN6 (input pullup). + * PD7 - PIN7 (input pullup). + * PD8 - PIN8 (input pullup). + * PD9 - PIN9 (input pullup). + * PD11 - PIN10 (input pullup). + * PD11 - PIN11 (input pullup). + * PD12 - PIN12 (input pullup). + * PD13 - PIN13 (input pullup). + * PD14 - PIN14 (input pullup). + * PD15 - PIN15 (input pullup). + */ +#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ + PIN_MODE_INPUT(GPIOD_PIN1) | \ + PIN_MODE_INPUT(GPIOD_PIN2) | \ + PIN_MODE_INPUT(GPIOD_PIN3) | \ + PIN_MODE_INPUT(GPIOD_PIN4) | \ + PIN_MODE_INPUT(GPIOD_PIN5) | \ + PIN_MODE_INPUT(GPIOD_PIN6) | \ + PIN_MODE_INPUT(GPIOD_PIN7) | \ + PIN_MODE_INPUT(GPIOD_PIN8) | \ + PIN_MODE_INPUT(GPIOD_PIN9) | \ + PIN_MODE_INPUT(GPIOD_PIN10) | \ + PIN_MODE_INPUT(GPIOD_PIN11) | \ + PIN_MODE_INPUT(GPIOD_PIN12) | \ + PIN_MODE_INPUT(GPIOD_PIN13) | \ + PIN_MODE_INPUT(GPIOD_PIN14) | \ + PIN_MODE_INPUT(GPIOD_PIN15)) +#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) +#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN15)) +#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN15)) +#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ + PIN_ODR_HIGH(GPIOD_PIN1) | \ + PIN_ODR_HIGH(GPIOD_PIN2) | \ + PIN_ODR_HIGH(GPIOD_PIN3) | \ + PIN_ODR_HIGH(GPIOD_PIN4) | \ + PIN_ODR_HIGH(GPIOD_PIN5) | \ + PIN_ODR_HIGH(GPIOD_PIN6) | \ + PIN_ODR_HIGH(GPIOD_PIN7) | \ + PIN_ODR_HIGH(GPIOD_PIN8) | \ + PIN_ODR_HIGH(GPIOD_PIN9) | \ + PIN_ODR_HIGH(GPIOD_PIN10) | \ + PIN_ODR_HIGH(GPIOD_PIN11) | \ + PIN_ODR_HIGH(GPIOD_PIN12) | \ + PIN_ODR_HIGH(GPIOD_PIN13) | \ + PIN_ODR_HIGH(GPIOD_PIN14) | \ + PIN_ODR_HIGH(GPIOD_PIN15)) +#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0) | \ + PIN_AFIO_AF(GPIOD_PIN1, 0) | \ + PIN_AFIO_AF(GPIOD_PIN2, 0) | \ + PIN_AFIO_AF(GPIOD_PIN3, 0) | \ + PIN_AFIO_AF(GPIOD_PIN4, 0) | \ + PIN_AFIO_AF(GPIOD_PIN5, 0) | \ + PIN_AFIO_AF(GPIOD_PIN6, 0) | \ + PIN_AFIO_AF(GPIOD_PIN7, 0)) +#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0) | \ + PIN_AFIO_AF(GPIOD_PIN9, 0) | \ + PIN_AFIO_AF(GPIOD_PIN10, 0) | \ + PIN_AFIO_AF(GPIOD_PIN11, 0) | \ + PIN_AFIO_AF(GPIOD_PIN12, 0) | \ + PIN_AFIO_AF(GPIOD_PIN13, 0) | \ + PIN_AFIO_AF(GPIOD_PIN14, 0) | \ + PIN_AFIO_AF(GPIOD_PIN15, 0)) + +/* + * GPIOE setup: + * + * PE0 - PIN0 (input pullup). + * PE1 - PIN1 (input pullup). + * PE2 - PIN2 (input pullup). + * PE3 - PIN3 L3GD20_CS (output pushpull maximum). + * PE4 - PIN4 (input pullup). + * PE5 - PIN5 (input pullup). + * PE6 - PIN6 (input pullup). + * PE7 - PIN7 (input pullup). + * PE8 - PIN8 (output pushpull maximum). + * PE9 - PIN9 (output pushpull maximum). + * PE10 - PIN10 (output pushpull maximum). + * PE11 - PIN11 (output pushpull maximum). + * PE12 - PIN12 (output pushpull maximum). + * PE13 - PIN13 (output pushpull maximum). + * PE14 - PIN14 (output pushpull maximum). + * PE15 - PIN15 (output pushpull maximum). + */ +#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ + PIN_MODE_INPUT(GPIOE_PIN1) | \ + PIN_MODE_INPUT(GPIOE_PIN2) |\ + PIN_MODE_OUTPUT(GPIOE_PIN3) | \ + PIN_MODE_INPUT(GPIOE_PIN4) |\ + PIN_MODE_INPUT(GPIOE_PIN5) |\ + PIN_MODE_INPUT(GPIOE_PIN6) | \ + PIN_MODE_INPUT(GPIOE_PIN7) | \ + PIN_MODE_OUTPUT(GPIOE_PIN8) | \ + PIN_MODE_OUTPUT(GPIOE_PIN9) | \ + PIN_MODE_OUTPUT(GPIOE_PIN10) | \ + PIN_MODE_OUTPUT(GPIOE_PIN11) | \ + PIN_MODE_OUTPUT(GPIOE_PIN12) | \ + PIN_MODE_OUTPUT(GPIOE_PIN13) | \ + PIN_MODE_OUTPUT(GPIOE_PIN14) | \ + PIN_MODE_OUTPUT(GPIOE_PIN15)) +#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN1) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN2) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN4) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN5) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN10) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN14) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) +#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN1) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN2) |\ + PIN_OSPEED_HIGH(GPIOE_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN4) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN5) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN7) | \ + PIN_OSPEED_HIGH(GPIOE_PIN8) | \ + PIN_OSPEED_HIGH(GPIOE_PIN9) | \ + PIN_OSPEED_HIGH(GPIOE_PIN10) | \ + PIN_OSPEED_HIGH(GPIOE_PIN11) | \ + PIN_OSPEED_HIGH(GPIOE_PIN12) | \ + PIN_OSPEED_HIGH(GPIOE_PIN13) | \ + PIN_OSPEED_HIGH(GPIOE_PIN14) | \ + PIN_OSPEED_HIGH(GPIOE_PIN15)) +#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN2) |\ + PIN_PUPDR_FLOATING(GPIOE_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN4) |\ + PIN_PUPDR_PULLUP(GPIOE_PIN5) |\ + PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ + PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ + PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ + PIN_PUPDR_FLOATING(GPIOE_PIN14) |\ + PIN_PUPDR_FLOATING(GPIOE_PIN15)) +#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ + PIN_ODR_HIGH(GPIOE_PIN1) | \ + PIN_ODR_HIGH(GPIOE_PIN2) | \ + PIN_ODR_HIGH(GPIOE_PIN3) | \ + PIN_ODR_HIGH(GPIOE_PIN4) | \ + PIN_ODR_HIGH(GPIOE_PIN5) | \ + PIN_ODR_HIGH(GPIOE_PIN6) | \ + PIN_ODR_HIGH(GPIOE_PIN7) | \ + PIN_ODR_LOW(GPIOE_PIN8) | \ + PIN_ODR_LOW(GPIOE_PIN9) | \ + PIN_ODR_LOW(GPIOE_PIN10) | \ + PIN_ODR_LOW(GPIOE_PIN11) | \ + PIN_ODR_LOW(GPIOE_PIN12) | \ + PIN_ODR_LOW(GPIOE_PIN13) | \ + PIN_ODR_LOW(GPIOE_PIN14) | \ + PIN_ODR_LOW(GPIOE_PIN15)) +#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0) | \ + PIN_AFIO_AF(GPIOE_PIN1, 0) | \ + PIN_AFIO_AF(GPIOE_PIN2, 0) |\ + PIN_AFIO_AF(GPIOE_PIN3, 0) | \ + PIN_AFIO_AF(GPIOE_PIN4, 0) |\ + PIN_AFIO_AF(GPIOE_PIN5, 0) |\ + PIN_AFIO_AF(GPIOE_PIN6, 0) | \ + PIN_AFIO_AF(GPIOE_PIN7, 0)) +#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0) | \ + PIN_AFIO_AF(GPIOE_PIN9, 0) | \ + PIN_AFIO_AF(GPIOE_PIN10, 0) | \ + PIN_AFIO_AF(GPIOE_PIN11, 0) | \ + PIN_AFIO_AF(GPIOE_PIN12, 0) | \ + PIN_AFIO_AF(GPIOE_PIN13, 0) | \ + PIN_AFIO_AF(GPIOE_PIN14, 0) | \ + PIN_AFIO_AF(GPIOE_PIN15, 0)) + +/* + * GPIOF setup: + * + * PF0 - I2C2_SDA (input floating). + * PF1 - I2C2_SCL (input floating). + * PF2 - PIN2 (input pullup). + * PF3 - PIN3 (input pullup). + * PF4 - PIN4 (input pullup). + * PF5 - PIN5 (input pullup). + * PF6 - PIN6 (input pullup). + * PF7 - PIN7 (input pullup). + * PF8 - PIN8 (input pullup). + * PF9 - PIN9 (input pullup). + * PF10 - PIN10 (input pullup). + * PF11 - PIN11 (input pullup). + * PF12 - PIN12 (input pullup). + * PF13 - PIN13 (input pullup). + * PF14 - PIN14 (input pullup). + * PF15 - PIN15 (input pullup). + */ +#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_I2C2_SDA) | \ + PIN_MODE_INPUT(GPIOF_I2C2_SCL) | \ + PIN_MODE_INPUT(GPIOF_PIN2) | \ + PIN_MODE_INPUT(GPIOF_PIN3) | \ + PIN_MODE_INPUT(GPIOF_PIN4) | \ + PIN_MODE_INPUT(GPIOF_PIN5) | \ + PIN_MODE_INPUT(GPIOF_PIN6) | \ + PIN_MODE_INPUT(GPIOF_PIN7) | \ + PIN_MODE_INPUT(GPIOF_PIN8) | \ + PIN_MODE_INPUT(GPIOF_PIN9) | \ + PIN_MODE_INPUT(GPIOF_PIN10) | \ + PIN_MODE_INPUT(GPIOF_PIN11) | \ + PIN_MODE_INPUT(GPIOF_PIN12) | \ + PIN_MODE_INPUT(GPIOF_PIN13) | \ + PIN_MODE_INPUT(GPIOF_PIN14) | \ + PIN_MODE_INPUT(GPIOF_PIN15)) +#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SDA) | \ + PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SCL) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) +#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_I2C2_SDA) | \ + PIN_OSPEED_HIGH(GPIOF_I2C2_SCL) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN15)) +#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_I2C2_SDA) | \ + PIN_PUPDR_FLOATING(GPIOF_I2C2_SCL) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN15)) +#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_I2C2_SDA) | \ + PIN_ODR_HIGH(GPIOF_I2C2_SCL) | \ + PIN_ODR_HIGH(GPIOF_PIN2) | \ + PIN_ODR_HIGH(GPIOF_PIN3) | \ + PIN_ODR_HIGH(GPIOF_PIN4) | \ + PIN_ODR_HIGH(GPIOF_PIN5) | \ + PIN_ODR_HIGH(GPIOF_PIN6) | \ + PIN_ODR_HIGH(GPIOF_PIN7) | \ + PIN_ODR_HIGH(GPIOF_PIN8) | \ + PIN_ODR_HIGH(GPIOF_PIN9) | \ + PIN_ODR_HIGH(GPIOF_PIN10) | \ + PIN_ODR_HIGH(GPIOF_PIN11) | \ + PIN_ODR_HIGH(GPIOF_PIN12) | \ + PIN_ODR_HIGH(GPIOF_PIN13) | \ + PIN_ODR_HIGH(GPIOF_PIN14) | \ + PIN_ODR_HIGH(GPIOF_PIN15)) +#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_I2C2_SDA, 0) | \ + PIN_AFIO_AF(GPIOF_I2C2_SCL, 0) | \ + PIN_AFIO_AF(GPIOF_PIN2, 0) | \ + PIN_AFIO_AF(GPIOF_PIN3, 0) | \ + PIN_AFIO_AF(GPIOF_PIN4, 0) | \ + PIN_AFIO_AF(GPIOF_PIN5, 0) | \ + PIN_AFIO_AF(GPIOF_PIN6, 0) | \ + PIN_AFIO_AF(GPIOF_PIN7, 0)) +#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0) | \ + PIN_AFIO_AF(GPIOF_PIN9, 0) | \ + PIN_AFIO_AF(GPIOF_PIN10, 0) | \ + PIN_AFIO_AF(GPIOF_PIN11, 0) | \ + PIN_AFIO_AF(GPIOF_PIN12, 0) | \ + PIN_AFIO_AF(GPIOF_PIN13, 0) | \ + PIN_AFIO_AF(GPIOF_PIN14, 0) | \ + PIN_AFIO_AF(GPIOF_PIN15, 0)) + +/* + * GPIOG setup: + * + * PG0 - PIN0 (input pullup). + * PG1 - PIN1 (input pullup). + * PG2 - PIN2 (input pullup). + * PG3 - PIN3 (input pullup). + * PG4 - PIN4 (input pullup). + * PG5 - PIN5 (input pullup). + * PG6 - PIN6 (input pullup). + * PG7 - PIN7 (input pullup). + * PG8 - PIN8 (input pullup). + * PG9 - PIN9 (input pullup). + * PG10 - PIN10 (input pullup). + * PG11 - PIN11 (input pullup). + * PG12 - PIN12 (input pullup). + * PG13 - PIN13 (input pullup). + * PG14 - PIN14 (input pullup). + * PG15 - PIN15 (input pullup). + */ +#define VAL_GPIOG_MODER (PIN_MODE_INPUT(GPIOG_PIN0) | \ + PIN_MODE_INPUT(GPIOG_PIN1) | \ + PIN_MODE_INPUT(GPIOG_PIN2) | \ + PIN_MODE_INPUT(GPIOG_PIN3) | \ + PIN_MODE_INPUT(GPIOG_PIN4) | \ + PIN_MODE_INPUT(GPIOG_PIN5) | \ + PIN_MODE_INPUT(GPIOG_PIN6) | \ + PIN_MODE_INPUT(GPIOG_PIN7) | \ + PIN_MODE_INPUT(GPIOG_PIN8) | \ + PIN_MODE_INPUT(GPIOG_PIN9) | \ + PIN_MODE_INPUT(GPIOG_PIN10) | \ + PIN_MODE_INPUT(GPIOG_PIN11) | \ + PIN_MODE_INPUT(GPIOG_PIN12) | \ + PIN_MODE_INPUT(GPIOG_PIN13) | \ + PIN_MODE_INPUT(GPIOG_PIN14) | \ + PIN_MODE_INPUT(GPIOG_PIN15)) +#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) +#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOG_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN15)) +#define VAL_GPIOG_PUPDR (PIN_PUPDR_PULLUP(GPIOG_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN15)) +#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ + PIN_ODR_HIGH(GPIOG_PIN1) | \ + PIN_ODR_HIGH(GPIOG_PIN2) | \ + PIN_ODR_HIGH(GPIOG_PIN3) | \ + PIN_ODR_HIGH(GPIOG_PIN4) | \ + PIN_ODR_HIGH(GPIOG_PIN5) | \ + PIN_ODR_HIGH(GPIOG_PIN6) | \ + PIN_ODR_HIGH(GPIOG_PIN7) | \ + PIN_ODR_HIGH(GPIOG_PIN8) | \ + PIN_ODR_HIGH(GPIOG_PIN9) | \ + PIN_ODR_HIGH(GPIOG_PIN10) | \ + PIN_ODR_HIGH(GPIOG_PIN11) | \ + PIN_ODR_HIGH(GPIOG_PIN12) | \ + PIN_ODR_HIGH(GPIOG_PIN13) | \ + PIN_ODR_HIGH(GPIOG_PIN14) | \ + PIN_ODR_HIGH(GPIOG_PIN15)) +#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0) | \ + PIN_AFIO_AF(GPIOG_PIN1, 0) | \ + PIN_AFIO_AF(GPIOG_PIN2, 0) | \ + PIN_AFIO_AF(GPIOG_PIN3, 0) | \ + PIN_AFIO_AF(GPIOG_PIN4, 0) | \ + PIN_AFIO_AF(GPIOG_PIN5, 0) | \ + PIN_AFIO_AF(GPIOG_PIN6, 0) | \ + PIN_AFIO_AF(GPIOG_PIN7, 0)) +#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0) | \ + PIN_AFIO_AF(GPIOG_PIN9, 0) | \ + PIN_AFIO_AF(GPIOG_PIN10, 0) | \ + PIN_AFIO_AF(GPIOG_PIN11, 0) | \ + PIN_AFIO_AF(GPIOG_PIN12, 0) | \ + PIN_AFIO_AF(GPIOG_PIN13, 0) | \ + PIN_AFIO_AF(GPIOG_PIN14, 0) | \ + PIN_AFIO_AF(GPIOG_PIN15, 0)) + +/* + * GPIOH setup: + * + * PH0 - PIN0 (input pullup). + * PH1 - PIN1 (input pullup). + * PH2 - PIN2 (input pullup). + * PH3 - PIN3 (input pullup). + * PH4 - PIN4 (input pullup). + * PH5 - PIN5 (input pullup). + * PH6 - PIN6 (input pullup). + * PH7 - PIN7 (input pullup). + * PH8 - PIN8 (input pullup). + * PH9 - PIN9 (input pullup). + * PH10 - PIN10 (input pullup). + * PH11 - PIN11 (input pullup). + * PH12 - PIN12 (input pullup). + * PH13 - PIN13 (input pullup). + * PH14 - PIN14 (input pullup). + * PH15 - PIN15 (input pullup). + */ +#define VAL_GPIOH_MODER (PIN_MODE_INPUT(GPIOH_PIN0) | \ + PIN_MODE_INPUT(GPIOH_PIN1) | \ + PIN_MODE_INPUT(GPIOH_PIN2) | \ + PIN_MODE_INPUT(GPIOH_PIN3) | \ + PIN_MODE_INPUT(GPIOH_PIN4) | \ + PIN_MODE_INPUT(GPIOH_PIN5) | \ + PIN_MODE_INPUT(GPIOH_PIN6) | \ + PIN_MODE_INPUT(GPIOH_PIN7) | \ + PIN_MODE_INPUT(GPIOH_PIN8) | \ + PIN_MODE_INPUT(GPIOH_PIN9) | \ + PIN_MODE_INPUT(GPIOH_PIN10) | \ + PIN_MODE_INPUT(GPIOH_PIN11) | \ + PIN_MODE_INPUT(GPIOH_PIN12) | \ + PIN_MODE_INPUT(GPIOH_PIN13) | \ + PIN_MODE_INPUT(GPIOH_PIN14) | \ + PIN_MODE_INPUT(GPIOH_PIN15)) +#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) +#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOH_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN15)) +#define VAL_GPIOH_PUPDR (PIN_PUPDR_PULLUP(GPIOH_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN15)) +#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_PIN0) | \ + PIN_ODR_HIGH(GPIOH_PIN1) | \ + PIN_ODR_HIGH(GPIOH_PIN2) | \ + PIN_ODR_HIGH(GPIOH_PIN3) | \ + PIN_ODR_HIGH(GPIOH_PIN4) | \ + PIN_ODR_HIGH(GPIOH_PIN5) | \ + PIN_ODR_HIGH(GPIOH_PIN6) | \ + PIN_ODR_HIGH(GPIOH_PIN7) | \ + PIN_ODR_HIGH(GPIOH_PIN8) | \ + PIN_ODR_HIGH(GPIOH_PIN9) | \ + PIN_ODR_HIGH(GPIOH_PIN10) | \ + PIN_ODR_HIGH(GPIOH_PIN11) | \ + PIN_ODR_HIGH(GPIOH_PIN12) | \ + PIN_ODR_HIGH(GPIOH_PIN13) | \ + PIN_ODR_HIGH(GPIOH_PIN14) | \ + PIN_ODR_HIGH(GPIOH_PIN15)) +#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_PIN0, 0) | \ + PIN_AFIO_AF(GPIOH_PIN1, 0) | \ + PIN_AFIO_AF(GPIOH_PIN2, 0) | \ + PIN_AFIO_AF(GPIOH_PIN3, 0) | \ + PIN_AFIO_AF(GPIOH_PIN4, 0) | \ + PIN_AFIO_AF(GPIOH_PIN5, 0) | \ + PIN_AFIO_AF(GPIOH_PIN6, 0) | \ + PIN_AFIO_AF(GPIOH_PIN7, 0)) +#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0) | \ + PIN_AFIO_AF(GPIOH_PIN9, 0) | \ + PIN_AFIO_AF(GPIOH_PIN10, 0) | \ + PIN_AFIO_AF(GPIOH_PIN11, 0) | \ + PIN_AFIO_AF(GPIOH_PIN12, 0) | \ + PIN_AFIO_AF(GPIOH_PIN13, 0) | \ + PIN_AFIO_AF(GPIOH_PIN14, 0) | \ + PIN_AFIO_AF(GPIOH_PIN15, 0)) + + +/* + * USB bus activation macro, required by the USB driver. + */ +// #define usb_lld_connect_bus(usbp) +#define usb_lld_connect_bus(usbp) (palSetPadMode(GPIOA, GPIOA_USB_DP, PAL_MODE_ALTERNATE(14))) +// #define usb_lld_connect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_INPUT) +/* + * USB bus de-activation macro, required by the USB driver. + */ +// #define usb_lld_disconnect_bus(usbp) +#define usb_lld_disconnect_bus(usbp) (palSetPadMode(GPIOA, GPIOA_USB_DP, PAL_MODE_OUTPUT_PUSHPULL)); palClearPad(GPIOA, GPIOA_USB_DP) +// #define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12) + +#if !defined(_FROM_ASM_) +#ifdef __cplusplus +extern "C" { +#endif + void boardInit(void); +#ifdef __cplusplus +} +#endif +#endif /* _FROM_ASM_ */ + +#endif /* _BOARD_H_ */ diff --git a/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.mk b/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.mk new file mode 100644 index 000000000000..43377629a3cc --- /dev/null +++ b/keyboards/hs60/v2/boards/GENERIC_STM32_F303XC/board.mk @@ -0,0 +1,5 @@ +# List of all the board related files. +BOARDSRC = $(BOARD_PATH)/boards/GENERIC_STM32_F303XC/board.c + +# Required include directories +BOARDINC = $(BOARD_PATH)/boards/GENERIC_STM32_F303XC diff --git a/keyboards/hs60/v2/bootloader_defs.h b/keyboards/hs60/v2/bootloader_defs.h new file mode 100644 index 000000000000..3b0e9d20a6ab --- /dev/null +++ b/keyboards/hs60/v2/bootloader_defs.h @@ -0,0 +1,7 @@ +/* Address for jumping to bootloader on STM32 chips. */ +/* It is chip dependent, the correct number can be looked up here: + * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf + * This also requires a patch to chibios: + * /tmk_core/tool/chibios/ch-bootloader-jump.patch + */ +#define STM32_BOOTLOADER_ADDRESS 0x1FFFD800 diff --git a/keyboards/hs60/v2/chconf.h b/keyboards/hs60/v2/chconf.h new file mode 100644 index 000000000000..1d9f12ff1f8b --- /dev/null +++ b/keyboards/hs60/v2/chconf.h @@ -0,0 +1,520 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16 or 32 bits. + */ +#define CH_CFG_ST_RESOLUTION 32 + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#define CH_CFG_ST_FREQUENCY 100000 + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#define CH_CFG_ST_TIMEDELTA 2 + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#define CH_CFG_TIME_QUANTUM 0 + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#define CH_CFG_MEMCORE_SIZE 0 + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#define CH_CFG_NO_IDLE_THREAD FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#define CH_CFG_OPTIMIZE_SPEED TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_TM TRUE + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_REGISTRY TRUE + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_WAITEXIT TRUE + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_SEMAPHORES TRUE + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MUTEXES TRUE + +/** + * @brief Enables recursive behavior on mutexes. + * @note Recursive mutexes are heavier and have an increased + * memory footprint. + * + * @note The default is @p FALSE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_CONDVARS TRUE + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_CONDVARS. + */ +#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_EVENTS TRUE + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_EVENTS. + */ +#define CH_CFG_USE_EVENTS_TIMEOUT TRUE + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MESSAGES TRUE + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_MESSAGES. + */ +#define CH_CFG_USE_MESSAGES_PRIORITY TRUE + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_MAILBOXES TRUE + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMCORE TRUE + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#define CH_CFG_USE_HEAP TRUE + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMPOOLS TRUE + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_WAITEXIT. + * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. + */ +#define CH_CFG_USE_DYNAMIC TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, kernel statistics. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_STATISTICS FALSE + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_SYSTEM_STATE_CHECK FALSE + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_CHECKS FALSE + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_ASSERTS FALSE + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the trace buffer is activated. + * + * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_BUFFER_SIZE 128 + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#define CH_DBG_ENABLE_STACK_CHECK TRUE + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_FILL_THREADS FALSE + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p thread_t structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. + */ +#define CH_DBG_THREADS_PROFILING FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p thread_t structure. + */ +#define CH_CFG_THREAD_EXTRA_FIELDS \ + /* Add threads custom fields here.*/ + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + */ +#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* Context switch code here.*/ \ +} + +/** + * @brief ISR enter hook. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ + /* IRQ prologue code here.*/ \ +} + +/** + * @brief ISR exit hook. + */ +#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ + /* IRQ epilogue code here.*/ \ +} + +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#define CH_CFG_IDLE_ENTER_HOOK() { \ + /* Idle-enter code here.*/ \ +} + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#define CH_CFG_IDLE_LEAVE_HOOK() { \ + /* Idle-leave code here.*/ \ +} + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#define CH_CFG_IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#define CH_CFG_SYSTEM_TICK_HOOK() { \ + /* System tick event code here.*/ \ +} + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ + /* System halt code here.*/ \ +} + +/** + * @brief Trace hook. + * @details This hook is invoked each time a new record is written in the + * trace buffer. + */ +#define CH_CFG_TRACE_HOOK(tep) { \ + /* Trace code here.*/ \ +} + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* CHCONF_H */ + +/** @} */ diff --git a/keyboards/hs60/v2/config.h b/keyboards/hs60/v2/config.h new file mode 100644 index 000000000000..192f7d6f25db --- /dev/null +++ b/keyboards/hs60/v2/config.h @@ -0,0 +1,117 @@ +/* +Copyright 2018 Yiancar + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0258 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Yiancar-Designs +#define PRODUCT HS60 V2 +#define DESCRIPTION GH60 compatible, tool free RGB keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +#define MATRIX_ROW_PINS { B3, B4, B5, A8, A4 } +#define MATRIX_COL_PINS { A13, A10, A9, A14, A15, B8, B9, C13, C14, C15, A0, A1, A2, A3 } +// To enable debugger set A13 A14 -> A5 A6 + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 0 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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)) \ +) + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* Backlight options */ + +#define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects +#define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended +#define RGB_MATRIX_SKIP_FRAMES 3 + +#define DRIVER_ADDR_1 0b1010000 +#define DRIVER_ADDR_2 0b1010000 // this is here for compliancy reasons. + +#define DRIVER_COUNT 2 +#ifdef HS60_ANSI +#define DRIVER_1_LED_TOTAL 61 +#else +#define DRIVER_1_LED_TOTAL 62 +#endif + +#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL diff --git a/keyboards/hs60/v2/halconf.h b/keyboards/hs60/v2/halconf.h new file mode 100644 index 000000000000..eda293c49b8b --- /dev/null +++ b/keyboards/hs60/v2/halconf.h @@ -0,0 +1,388 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef HALCONF_H +#define HALCONF_H + +#include "mcuconf.h" + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the DAC subsystem. + */ +#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) +#define HAL_USE_DAC TRUE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT TRUE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C TRUE +#endif + +/** + * @brief Enables the I2S subsystem. + */ +#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) +#define HAL_USE_I2S FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM FALSE +#endif + +/** + * @brief Enables the QSPI subsystem. + */ +#if !defined(HAL_USE_QSPI) || defined(__DOXYGEN__) +#define HAL_USE_QSPI FALSE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL FALSE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB FALSE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI FALSE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB TRUE +#endif + +/** + * @brief Enables the WDG subsystem. + */ +#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) +#define HAL_USE_WDG FALSE +#endif + +/*===========================================================================*/ +/* ADC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) +#define ADC_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define ADC_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* CAN driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Sleep mode related APIs inclusion switch. + */ +#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) +#define CAN_USE_SLEEP_MODE TRUE +#endif + +/*===========================================================================*/ +/* I2C driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the mutual exclusion APIs on the I2C bus. + */ +#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define I2C_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* MAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) +#define MAC_USE_ZERO_COPY FALSE +#endif + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) +#define MAC_USE_EVENTS TRUE +#endif + +/*===========================================================================*/ +/* MMC_SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + * This option is recommended also if the SPI driver does not + * use a DMA channel and heavily loads the CPU. + */ +#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) +#define MMC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SDC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Number of initialization attempts before rejecting the card. + * @note Attempts are performed at 10mS intervals. + */ +#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) +#define SDC_INIT_RETRY 100 +#endif + +/** + * @brief Include support for MMC cards. + * @note MMC support is not yet implemented so this option must be kept + * at @p FALSE. + */ +#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) +#define SDC_MMC_SUPPORT FALSE +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + */ +#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) +#define SDC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SERIAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Default bit rate. + * @details Configuration parameter, this is the baud rate selected for the + * default configuration. + */ +#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) +#define SERIAL_DEFAULT_BITRATE 38400 +#endif + +/** + * @brief Serial buffers size. + * @details Configuration parameter, you can change the depth of the queue + * buffers depending on the requirements of your application. + * @note The default is 16 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_BUFFERS_SIZE 16 +#endif + +/*===========================================================================*/ +/* SERIAL_USB driver related setting. */ +/*===========================================================================*/ + +/** + * @brief Serial over USB buffers size. + * @details Configuration parameter, the buffer size must be a multiple of + * the USB data endpoint maximum packet size. + * @note The default is 256 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_SIZE 1 +#endif + +/** + * @brief Serial over USB number of buffers. + * @note The default is 2 buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_NUMBER 2 +#endif + +/*===========================================================================*/ +/* SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) +#define SPI_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define SPI_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* UART driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) +#define UART_USE_WAIT FALSE +#endif + +/** + * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define UART_USE_MUTUAL_EXCLUSION FALSE +#endif + +/*===========================================================================*/ +/* USB driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) +#define USB_USE_WAIT TRUE +#endif + +#endif /* HALCONF_H */ + +/** @} */ diff --git a/keyboards/hs60/v2/info.json b/keyboards/hs60/v2/info.json new file mode 100644 index 000000000000..abafb69f99e7 --- /dev/null +++ b/keyboards/hs60/v2/info.json @@ -0,0 +1,1650 @@ +{ + "keyboard_name": "clueboard/60", + "maintainer": "skullydazed", + "url": "", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_60_ansi": { + "key_count": 61, + "layout": [ + { + "label": "~", + "x": 0, + "y": 0 + }, + { + "label": "!", + "x": 1, + "y": 0 + }, + { + "label": "@", + "x": 2, + "y": 0 + }, + { + "label": "#", + "x": 3, + "y": 0 + }, + { + "label": "$", + "x": 4, + "y": 0 + }, + { + "label": "%", + "x": 5, + "y": 0 + }, + { + "label": "^", + "x": 6, + "y": 0 + }, + { + "label": "&", + "x": 7, + "y": 0 + }, + { + "label": "*", + "x": 8, + "y": 0 + }, + { + "label": "(", + "x": 9, + "y": 0 + }, + { + "label": ")", + "x": 10, + "y": 0 + }, + { + "label": "_", + "x": 11, + "y": 0 + }, + { + "label": "+", + "x": 12, + "y": 0 + }, + { + "label": "Backspace", + "x": 13, + "y": 0, + "w": 2 + }, + { + "label": "Tab", + "x": 0, + "y": 1, + "w": 1.5 + }, + { + "label": "Q", + "x": 1.5, + "y": 1 + }, + { + "label": "W", + "x": 2.5, + "y": 1 + }, + { + "label": "E", + "x": 3.5, + "y": 1 + }, + { + "label": "R", + "x": 4.5, + "y": 1 + }, + { + "label": "T", + "x": 5.5, + "y": 1 + }, + { + "label": "Y", + "x": 6.5, + "y": 1 + }, + { + "label": "U", + "x": 7.5, + "y": 1 + }, + { + "label": "I", + "x": 8.5, + "y": 1 + }, + { + "label": "O", + "x": 9.5, + "y": 1 + }, + { + "label": "P", + "x": 10.5, + "y": 1 + }, + { + "label": "{", + "x": 11.5, + "y": 1 + }, + { + "label": "}", + "x": 12.5, + "y": 1 + }, + { + "label": "|", + "x": 13.5, + "y": 1, + "w": 1.5 + }, + { + "label": "Caps Lock", + "x": 0, + "y": 2, + "w": 1.75 + }, + { + "label": "A", + "x": 1.75, + "y": 2 + }, + { + "label": "S", + "x": 2.75, + "y": 2 + }, + { + "label": "D", + "x": 3.75, + "y": 2 + }, + { + "label": "F", + "x": 4.75, + "y": 2 + }, + { + "label": "G", + "x": 5.75, + "y": 2 + }, + { + "label": "H", + "x": 6.75, + "y": 2 + }, + { + "label": "J", + "x": 7.75, + "y": 2 + }, + { + "label": "K", + "x": 8.75, + "y": 2 + }, + { + "label": "L", + "x": 9.75, + "y": 2 + }, + { + "label": ":", + "x": 10.75, + "y": 2 + }, + { + "label": "\"", + "x": 11.75, + "y": 2 + }, + { + "label": "Enter", + "x": 12.75, + "y": 2, + "w": 2.25 + }, + { + "label": "Shift", + "x": 0, + "y": 3, + "w": 2.25 + }, + { + "label": "Z", + "x": 2.25, + "y": 3 + }, + { + "label": "X", + "x": 3.25, + "y": 3 + }, + { + "label": "C", + "x": 4.25, + "y": 3 + }, + { + "label": "V", + "x": 5.25, + "y": 3 + }, + { + "label": "B", + "x": 6.25, + "y": 3 + }, + { + "label": "N", + "x": 7.25, + "y": 3 + }, + { + "label": "M", + "x": 8.25, + "y": 3 + }, + { + "label": "<", + "x": 9.25, + "y": 3 + }, + { + "label": ">", + "x": 10.25, + "y": 3 + }, + { + "label": "?", + "x": 11.25, + "y": 3 + }, + { + "label": "Shift", + "x": 12.25, + "y": 3, + "w": 2.75 + }, + { + "label": "Ctrl", + "x": 0, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 1.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Alt", + "x": 2.5, + "y": 4, + "w": 1.25 + }, + { + "x": 3.75, + "y": 4, + "w": 6.25 + }, + { + "label": "Alt", + "x": 10, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 11.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Menu", + "x": 12.5, + "y": 4, + "w": 1.25 + }, + { + "label": "Ctrl", + "x": 13.75, + "y": 4, + "w": 1.25 + } + ] + }, + "LAYOUT_60_iso": { + "key_count": 62, + "layout": [ + { + "label": "\\u00ac", + "x": 0, + "y": 0 + }, + { + "label": "!", + "x": 1, + "y": 0 + }, + { + "label": "\"", + "x": 2, + "y": 0 + }, + { + "label": "\\u00a3", + "x": 3, + "y": 0 + }, + { + "label": "$", + "x": 4, + "y": 0 + }, + { + "label": "%", + "x": 5, + "y": 0 + }, + { + "label": "^", + "x": 6, + "y": 0 + }, + { + "label": "&", + "x": 7, + "y": 0 + }, + { + "label": "*", + "x": 8, + "y": 0 + }, + { + "label": "(", + "x": 9, + "y": 0 + }, + { + "label": ")", + "x": 10, + "y": 0 + }, + { + "label": "_", + "x": 11, + "y": 0 + }, + { + "label": "+", + "x": 12, + "y": 0 + }, + { + "label": "Backspace", + "x": 13, + "y": 0, + "w": 2 + }, + { + "label": "Tab", + "x": 0, + "y": 1, + "w": 1.5 + }, + { + "label": "Q", + "x": 1.5, + "y": 1 + }, + { + "label": "W", + "x": 2.5, + "y": 1 + }, + { + "label": "E", + "x": 3.5, + "y": 1 + }, + { + "label": "R", + "x": 4.5, + "y": 1 + }, + { + "label": "T", + "x": 5.5, + "y": 1 + }, + { + "label": "Y", + "x": 6.5, + "y": 1 + }, + { + "label": "U", + "x": 7.5, + "y": 1 + }, + { + "label": "I", + "x": 8.5, + "y": 1 + }, + { + "label": "O", + "x": 9.5, + "y": 1 + }, + { + "label": "P", + "x": 10.5, + "y": 1 + }, + { + "label": "{", + "x": 11.5, + "y": 1 + }, + { + "label": "}", + "x": 12.5, + "y": 1 + }, + { + "label": "Enter", + "x": 13.75, + "y": 1, + "w": 1.25, + "h": 2 + }, + { + "label": "Caps Lock", + "x": 0, + "y": 2, + "w": 1.75 + }, + { + "label": "A", + "x": 1.75, + "y": 2 + }, + { + "label": "S", + "x": 2.75, + "y": 2 + }, + { + "label": "D", + "x": 3.75, + "y": 2 + }, + { + "label": "F", + "x": 4.75, + "y": 2 + }, + { + "label": "G", + "x": 5.75, + "y": 2 + }, + { + "label": "H", + "x": 6.75, + "y": 2 + }, + { + "label": "J", + "x": 7.75, + "y": 2 + }, + { + "label": "K", + "x": 8.75, + "y": 2 + }, + { + "label": "L", + "x": 9.75, + "y": 2 + }, + { + "label": ":", + "x": 10.75, + "y": 2 + }, + { + "label": "@", + "x": 11.75, + "y": 2 + }, + { + "label": "~", + "x": 12.75, + "y": 2 + }, + { + "label": "Shift", + "x": 0, + "y": 3, + "w": 1.25 + }, + { + "label": "|", + "x": 1.25, + "y": 3 + }, + { + "label": "Z", + "x": 2.25, + "y": 3 + }, + { + "label": "X", + "x": 3.25, + "y": 3 + }, + { + "label": "C", + "x": 4.25, + "y": 3 + }, + { + "label": "V", + "x": 5.25, + "y": 3 + }, + { + "label": "B", + "x": 6.25, + "y": 3 + }, + { + "label": "N", + "x": 7.25, + "y": 3 + }, + { + "label": "M", + "x": 8.25, + "y": 3 + }, + { + "label": "<", + "x": 9.25, + "y": 3 + }, + { + "label": ">", + "x": 10.25, + "y": 3 + }, + { + "label": "?", + "x": 11.25, + "y": 3 + }, + { + "label": "Shift", + "x": 12.25, + "y": 3, + "w": 2.75 + }, + { + "label": "Ctrl", + "x": 0, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 1.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Alt", + "x": 2.5, + "y": 4, + "w": 1.25 + }, + { + "x": 3.75, + "y": 4, + "w": 6.25 + }, + { + "label": "AltGr", + "x": 10, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 11.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Menu", + "x": 12.5, + "y": 4, + "w": 1.25 + }, + { + "label": "Ctrl", + "x": 13.75, + "y": 4, + "w": 1.25 + } + ] + }, + "KEYMAP_AEK": { + "key_count": 60, + "layout": [ + { + "label": "~", + "x": 0, + "y": 0 + }, + { + "label": "!", + "x": 1, + "y": 0 + }, + { + "label": "@", + "x": 2, + "y": 0 + }, + { + "label": "#", + "x": 3, + "y": 0 + }, + { + "label": "$", + "x": 4, + "y": 0 + }, + { + "label": "%", + "x": 5, + "y": 0 + }, + { + "label": "^", + "x": 6, + "y": 0 + }, + { + "label": "&", + "x": 7, + "y": 0 + }, + { + "label": "*", + "x": 8, + "y": 0 + }, + { + "label": "(", + "x": 9, + "y": 0 + }, + { + "label": ")", + "x": 10, + "y": 0 + }, + { + "label": "_", + "x": 11, + "y": 0 + }, + { + "label": "+", + "x": 12, + "y": 0 + }, + { + "label": "Backspace", + "x": 13, + "y": 0, + "w": 2 + }, + { + "label": "Tab", + "x": 0, + "y": 1, + "w": 1.5 + }, + { + "label": "Q", + "x": 1.5, + "y": 1 + }, + { + "label": "W", + "x": 2.5, + "y": 1 + }, + { + "label": "E", + "x": 3.5, + "y": 1 + }, + { + "label": "R", + "x": 4.5, + "y": 1 + }, + { + "label": "T", + "x": 5.5, + "y": 1 + }, + { + "label": "Y", + "x": 6.5, + "y": 1 + }, + { + "label": "U", + "x": 7.5, + "y": 1 + }, + { + "label": "I", + "x": 8.5, + "y": 1 + }, + { + "label": "O", + "x": 9.5, + "y": 1 + }, + { + "label": "P", + "x": 10.5, + "y": 1 + }, + { + "label": "{", + "x": 11.5, + "y": 1 + }, + { + "label": "}", + "x": 12.5, + "y": 1 + }, + { + "label": "|", + "x": 13.5, + "y": 1, + "w": 1.5 + }, + { + "label": "Caps Lock", + "x": 0, + "y": 2, + "w": 1.75 + }, + { + "label": "A", + "x": 1.75, + "y": 2 + }, + { + "label": "S", + "x": 2.75, + "y": 2 + }, + { + "label": "D", + "x": 3.75, + "y": 2 + }, + { + "label": "F", + "x": 4.75, + "y": 2 + }, + { + "label": "G", + "x": 5.75, + "y": 2 + }, + { + "label": "H", + "x": 6.75, + "y": 2 + }, + { + "label": "J", + "x": 7.75, + "y": 2 + }, + { + "label": "K", + "x": 8.75, + "y": 2 + }, + { + "label": "L", + "x": 9.75, + "y": 2 + }, + { + "label": ":", + "x": 10.75, + "y": 2 + }, + { + "label": "\"", + "x": 11.75, + "y": 2 + }, + { + "label": "Enter", + "x": 12.75, + "y": 2, + "w": 2.25 + }, + { + "label": "Shift", + "x": 0, + "y": 3, + "w": 2.25 + }, + { + "label": "Z", + "x": 2.25, + "y": 3 + }, + { + "label": "X", + "x": 3.25, + "y": 3 + }, + { + "label": "C", + "x": 4.25, + "y": 3 + }, + { + "label": "V", + "x": 5.25, + "y": 3 + }, + { + "label": "B", + "x": 6.25, + "y": 3 + }, + { + "label": "N", + "x": 7.25, + "y": 3 + }, + { + "label": "M", + "x": 8.25, + "y": 3 + }, + { + "label": "<", + "x": 9.25, + "y": 3 + }, + { + "label": ">", + "x": 10.25, + "y": 3 + }, + { + "label": "?", + "x": 11.25, + "y": 3 + }, + { + "label": "Shift", + "x": 12.25, + "y": 3, + "w": 2.75 + }, + { + "label": "Ctrl", + "x": 0, + "y": 4, + "w": 1.5 + }, + { + "label": "Win", + "x": 1.5, + "y": 4, + "w": 1.25 + }, + { + "label": "Alt", + "x": 2.75, + "y": 4, + "w": 1.5 + }, + { + "x": 4.25, + "y": 4, + "w": 6.5 + }, + { + "label": "AltGr", + "x": 10.75, + "y": 4, + "w": 1.5 + }, + { + "label": "Win", + "x": 12.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Ctrl", + "x": 13.5, + "y": 4, + "w": 1.5 + } + ] + }, + "KEYMAP": { + "key_count": 65, + "layout": [ + { + "label": "~", + "x": 0, + "y": 0 + }, + { + "label": "!", + "x": 1, + "y": 0 + }, + { + "label": "@", + "x": 2, + "y": 0 + }, + { + "label": "#", + "x": 3, + "y": 0 + }, + { + "label": "$", + "x": 4, + "y": 0 + }, + { + "label": "%", + "x": 5, + "y": 0 + }, + { + "label": "^", + "x": 6, + "y": 0 + }, + { + "label": "&", + "x": 7, + "y": 0 + }, + { + "label": "*", + "x": 8, + "y": 0 + }, + { + "label": "(", + "x": 9, + "y": 0 + }, + { + "label": ")", + "x": 10, + "y": 0 + }, + { + "label": "_", + "x": 11, + "y": 0 + }, + { + "label": "+", + "x": 12, + "y": 0 + }, + { + "x": 13, + "y": 0 + }, + { + "label": "Back", + "x": 14, + "y": 0 + }, + { + "label": "Tab", + "x": 0, + "y": 1, + "w": 1.5 + }, + { + "label": "Q", + "x": 1.5, + "y": 1 + }, + { + "label": "W", + "x": 2.5, + "y": 1 + }, + { + "label": "E", + "x": 3.5, + "y": 1 + }, + { + "label": "R", + "x": 4.5, + "y": 1 + }, + { + "label": "T", + "x": 5.5, + "y": 1 + }, + { + "label": "Y", + "x": 6.5, + "y": 1 + }, + { + "label": "U", + "x": 7.5, + "y": 1 + }, + { + "label": "I", + "x": 8.5, + "y": 1 + }, + { + "label": "O", + "x": 9.5, + "y": 1 + }, + { + "label": "P", + "x": 10.5, + "y": 1 + }, + { + "label": "{", + "x": 11.5, + "y": 1 + }, + { + "label": "}", + "x": 12.5, + "y": 1 + }, + { + "label": "|", + "x": 13.5, + "y": 1, + "w": 1.5 + }, + { + "label": "Caps Lock", + "x": 0, + "y": 2, + "w": 1.75 + }, + { + "label": "A", + "x": 1.75, + "y": 2 + }, + { + "label": "S", + "x": 2.75, + "y": 2 + }, + { + "label": "D", + "x": 3.75, + "y": 2 + }, + { + "label": "F", + "x": 4.75, + "y": 2 + }, + { + "label": "G", + "x": 5.75, + "y": 2 + }, + { + "label": "H", + "x": 6.75, + "y": 2 + }, + { + "label": "J", + "x": 7.75, + "y": 2 + }, + { + "label": "K", + "x": 8.75, + "y": 2 + }, + { + "label": "L", + "x": 9.75, + "y": 2 + }, + { + "label": ":", + "x": 10.75, + "y": 2 + }, + { + "label": "\"", + "x": 11.75, + "y": 2 + }, + { + "x": 12.75, + "y": 2 + }, + { + "label": "Enter", + "x": 13.75, + "y": 2, + "w": 1.25 + }, + { + "x": 0, + "y": 3 + }, + { + "label": "Shift", + "x": 1, + "y": 3, + "w": 1.25 + }, + { + "label": "Z", + "x": 2.25, + "y": 3 + }, + { + "label": "X", + "x": 3.25, + "y": 3 + }, + { + "label": "C", + "x": 4.25, + "y": 3 + }, + { + "label": "V", + "x": 5.25, + "y": 3 + }, + { + "label": "B", + "x": 6.25, + "y": 3 + }, + { + "label": "N", + "x": 7.25, + "y": 3 + }, + { + "label": "M", + "x": 8.25, + "y": 3 + }, + { + "label": "<", + "x": 9.25, + "y": 3 + }, + { + "label": ">", + "x": 10.25, + "y": 3 + }, + { + "label": "?", + "x": 11.25, + "y": 3 + }, + { + "label": "Shift", + "x": 12.25, + "y": 3, + "w": 1.75 + }, + { + "x": 14, + "y": 3 + }, + { + "label": "Ctrl", + "x": 0, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 1.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Alt", + "x": 2.5, + "y": 4, + "w": 1.25 + }, + { + "x": 3.75, + "y": 4, + "w": 6.25 + }, + { + "label": "Alt", + "x": 10, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 11.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Menu", + "x": 12.5, + "y": 4, + "w": 1.25 + }, + { + "label": "Ctrl", + "x": 13.75, + "y": 4, + "w": 1.25 + } + ] + }, + "LAYOUT_60_ansi_split_bs_rshift": { + "key_count": 63, + "layout": [ + { + "label": "~", + "x": 0, + "y": 0 + }, + { + "label": "!", + "x": 1, + "y": 0 + }, + { + "label": "@", + "x": 2, + "y": 0 + }, + { + "label": "#", + "x": 3, + "y": 0 + }, + { + "label": "$", + "x": 4, + "y": 0 + }, + { + "label": "%", + "x": 5, + "y": 0 + }, + { + "label": "^", + "x": 6, + "y": 0 + }, + { + "label": "&", + "x": 7, + "y": 0 + }, + { + "label": "*", + "x": 8, + "y": 0 + }, + { + "label": "(", + "x": 9, + "y": 0 + }, + { + "label": ")", + "x": 10, + "y": 0 + }, + { + "label": "_", + "x": 11, + "y": 0 + }, + { + "label": "+", + "x": 12, + "y": 0 + }, + { + "x": 13, + "y": 0 + }, + { + "label": "Back", + "x": 14, + "y": 0 + }, + { + "label": "Tab", + "x": 0, + "y": 1, + "w": 1.5 + }, + { + "label": "Q", + "x": 1.5, + "y": 1 + }, + { + "label": "W", + "x": 2.5, + "y": 1 + }, + { + "label": "E", + "x": 3.5, + "y": 1 + }, + { + "label": "R", + "x": 4.5, + "y": 1 + }, + { + "label": "T", + "x": 5.5, + "y": 1 + }, + { + "label": "Y", + "x": 6.5, + "y": 1 + }, + { + "label": "U", + "x": 7.5, + "y": 1 + }, + { + "label": "I", + "x": 8.5, + "y": 1 + }, + { + "label": "O", + "x": 9.5, + "y": 1 + }, + { + "label": "P", + "x": 10.5, + "y": 1 + }, + { + "label": "{", + "x": 11.5, + "y": 1 + }, + { + "label": "}", + "x": 12.5, + "y": 1 + }, + { + "label": "|", + "x": 13.5, + "y": 1, + "w": 1.5 + }, + { + "label": "Caps Lock", + "x": 0, + "y": 2, + "w": 1.75 + }, + { + "label": "A", + "x": 1.75, + "y": 2 + }, + { + "label": "S", + "x": 2.75, + "y": 2 + }, + { + "label": "D", + "x": 3.75, + "y": 2 + }, + { + "label": "F", + "x": 4.75, + "y": 2 + }, + { + "label": "G", + "x": 5.75, + "y": 2 + }, + { + "label": "H", + "x": 6.75, + "y": 2 + }, + { + "label": "J", + "x": 7.75, + "y": 2 + }, + { + "label": "K", + "x": 8.75, + "y": 2 + }, + { + "label": "L", + "x": 9.75, + "y": 2 + }, + { + "label": ":", + "x": 10.75, + "y": 2 + }, + { + "label": "\"", + "x": 11.75, + "y": 2 + }, + { + "label": "Enter", + "x": 12.75, + "y": 2, + "w": 2.25 + }, + { + "label": "Shift", + "x": 0, + "y": 3, + "w": 2.25 + }, + { + "label": "Z", + "x": 2.25, + "y": 3 + }, + { + "label": "X", + "x": 3.25, + "y": 3 + }, + { + "label": "C", + "x": 4.25, + "y": 3 + }, + { + "label": "V", + "x": 5.25, + "y": 3 + }, + { + "label": "B", + "x": 6.25, + "y": 3 + }, + { + "label": "N", + "x": 7.25, + "y": 3 + }, + { + "label": "M", + "x": 8.25, + "y": 3 + }, + { + "label": "<", + "x": 9.25, + "y": 3 + }, + { + "label": ">", + "x": 10.25, + "y": 3 + }, + { + "label": "?", + "x": 11.25, + "y": 3 + }, + { + "label": "Shift", + "x": 12.25, + "y": 3, + "w": 1.75 + }, + { + "x": 14, + "y": 3 + }, + { + "label": "Ctrl", + "x": 0, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 1.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Alt", + "x": 2.5, + "y": 4, + "w": 1.25 + }, + { + "x": 3.75, + "y": 4, + "w": 6.25 + }, + { + "label": "Alt", + "x": 10, + "y": 4, + "w": 1.25 + }, + { + "label": "Win", + "x": 11.25, + "y": 4, + "w": 1.25 + }, + { + "label": "Menu", + "x": 12.5, + "y": 4, + "w": 1.25 + }, + { + "label": "Ctrl", + "x": 13.75, + "y": 4, + "w": 1.25 + } + ] + } + } +} diff --git a/keyboards/hs60/v2/keymaps/ansi/config.h b/keyboards/hs60/v2/keymaps/ansi/config.h new file mode 100644 index 000000000000..f51cc16d8536 --- /dev/null +++ b/keyboards/hs60/v2/keymaps/ansi/config.h @@ -0,0 +1,21 @@ +/* +Copyright 2018 Yiancar + +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 + +/* Include overwrites for specific keymap */ + +#define HS60_ANSI diff --git a/keyboards/hs60/v2/keymaps/ansi/keymap.c b/keyboards/hs60/v2/keymaps/ansi/keymap.c new file mode 100644 index 000000000000..923af9e2ce0e --- /dev/null +++ b/keyboards/hs60/v2/keymaps/ansi/keymap.c @@ -0,0 +1,46 @@ +/* Copyright 2018 Yiancar + * + * 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 QMK_KEYBOARD_H + +//This is the ANSI version of the PCB + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT_60_ansi( /* Base */ + KC_GESC, 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, MO(1) , KC_APP, KC_RCTL), + +[1] = LAYOUT_60_ansi( /* FN */ + KC_TRNS, 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_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET , KC_TRNS,\ + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\ + KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, KC_TRNS,\ + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + +void matrix_init_user(void) { + //user initialization +} + +void matrix_scan_user(void) { + //user matrix +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} \ No newline at end of file diff --git a/keyboards/hs60/v2/keymaps/ansi/readme.md b/keyboards/hs60/v2/keymaps/ansi/readme.md new file mode 100644 index 000000000000..fa811319d381 --- /dev/null +++ b/keyboards/hs60/v2/keymaps/ansi/readme.md @@ -0,0 +1,6 @@ +The default keymap for ANSI HS60 +================================ + +![Layout image](https://imgur.com/CSyPw0J.png) + +Default layer is normal ANSI and Fn layer is used for RGB functions, Volume control and arrow cluster \ No newline at end of file diff --git a/keyboards/hs60/v2/keymaps/default/keymap.c b/keyboards/hs60/v2/keymaps/default/keymap.c new file mode 100644 index 000000000000..2a5e823618c8 --- /dev/null +++ b/keyboards/hs60/v2/keymaps/default/keymap.c @@ -0,0 +1,46 @@ +/* Copyright 2018 Yiancar + * + * 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 QMK_KEYBOARD_H + +//This is the ISO version of the PCB + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT_60_iso( /* Base */ + KC_GESC, 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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, \ + 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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1) , KC_APP, KC_RCTL), + +[1] = LAYOUT_60_iso( /* FN */ + KC_TRNS, 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_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET , \ + KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\ + KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, KC_TRNS, KC_TRNS,\ + KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), +}; + +void matrix_init_user(void) { + //user initialization +} + +void matrix_scan_user(void) { + //user matrix +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} \ No newline at end of file diff --git a/keyboards/hs60/v2/keymaps/default/readme.md b/keyboards/hs60/v2/keymaps/default/readme.md new file mode 100644 index 000000000000..9125cb349e82 --- /dev/null +++ b/keyboards/hs60/v2/keymaps/default/readme.md @@ -0,0 +1,6 @@ +The default keymap for ISO HS60 +=============================== + +![Layout image](https://imgur.com/HXj4tYL.png) + +Default layer is normal ISO and Fn layer is used for RGB functions, Volume control and arrow cluster \ No newline at end of file diff --git a/keyboards/hs60/v2/keymaps/hhkb/config.h b/keyboards/hs60/v2/keymaps/hhkb/config.h new file mode 100644 index 000000000000..3db403ecc5c3 --- /dev/null +++ b/keyboards/hs60/v2/keymaps/hhkb/config.h @@ -0,0 +1,21 @@ +/* +Copyright 2018 Yiancar + +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 + +/* Include overwrites for specific keymap */ + +#define HS60_HHKB diff --git a/keyboards/hs60/v2/keymaps/hhkb/keymap.c b/keyboards/hs60/v2/keymaps/hhkb/keymap.c new file mode 100644 index 000000000000..d52fc4bac94c --- /dev/null +++ b/keyboards/hs60/v2/keymaps/hhkb/keymap.c @@ -0,0 +1,46 @@ +/* Copyright 2018 Yiancar + * + * 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 QMK_KEYBOARD_H + +//This is the HHKB version of the PCB + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT_60_hhkb( /* Base */ + 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_GRV, KC_BSLS, \ + 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(1), \ + KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL ), + +[1] = LAYOUT_60_hhkb( /* FN */ + RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS,\ + KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD, KC_UP, KC_TRNS, KC_DEL, \ + KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ) +}; + +void matrix_init_user(void) { + //user initialization +} + +void matrix_scan_user(void) { + //user matrix +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} \ No newline at end of file diff --git a/keyboards/hs60/v2/mcuconf.h b/keyboards/hs60/v2/mcuconf.h new file mode 100644 index 000000000000..226da48d5936 --- /dev/null +++ b/keyboards/hs60/v2/mcuconf.h @@ -0,0 +1,257 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef MCUCONF_H +#define MCUCONF_H + +/* + * STM32F3xx drivers configuration. + * The following settings override the default settings present in + * the various device driver implementation headers. + * Note that the settings for each driver only have effect if the whole + * driver is enabled in halconf.h. + * + * IRQ priorities: + * 15...0 Lowest...Highest. + * + * DMA priorities: + * 0...3 Lowest...Highest. + */ + +#define STM32F3xx_MCUCONF + +/* + * HAL driver system settings. + */ +#define STM32_NO_INIT FALSE +#define STM32_PVD_ENABLE FALSE +#define STM32_PLS STM32_PLS_LEV0 +#define STM32_HSI_ENABLED TRUE +#define STM32_LSI_ENABLED TRUE +#define STM32_HSE_ENABLED TRUE +#define STM32_LSE_ENABLED FALSE +#define STM32_SW STM32_SW_PLL +#define STM32_PLLSRC STM32_PLLSRC_HSE +#define STM32_PREDIV_VALUE 1 +#define STM32_PLLMUL_VALUE 9 +#define STM32_HPRE STM32_HPRE_DIV1 +#define STM32_PPRE1 STM32_PPRE1_DIV2 +#define STM32_PPRE2 STM32_PPRE2_DIV2 +#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK +#define STM32_ADC12PRES STM32_ADC12PRES_DIV1 +#define STM32_ADC34PRES STM32_ADC34PRES_DIV1 +#define STM32_USART1SW STM32_USART1SW_PCLK +#define STM32_USART2SW STM32_USART2SW_PCLK +#define STM32_USART3SW STM32_USART3SW_PCLK +#define STM32_UART4SW STM32_UART4SW_PCLK +#define STM32_UART5SW STM32_UART5SW_PCLK +#define STM32_I2C1SW STM32_I2C1SW_SYSCLK +#define STM32_I2C2SW STM32_I2C2SW_SYSCLK +#define STM32_TIM1SW STM32_TIM1SW_PCLK2 +#define STM32_TIM8SW STM32_TIM8SW_PCLK2 +#define STM32_RTCSEL STM32_RTCSEL_LSI +#define STM32_USB_CLOCK_REQUIRED TRUE +#define STM32_USBPRE STM32_USBPRE_DIV1P5 + +#undef STM32_HSE_BYPASS +// #error "oh no" +// #endif + +/* + * ADC driver system settings. + */ +#define STM32_ADC_DUAL_MODE FALSE +#define STM32_ADC_COMPACT_SAMPLES FALSE +#define STM32_ADC_USE_ADC1 FALSE +#define STM32_ADC_USE_ADC2 FALSE +#define STM32_ADC_USE_ADC3 FALSE +#define STM32_ADC_USE_ADC4 FALSE +#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) +#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) +#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) +#define STM32_ADC_ADC4_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) +#define STM32_ADC_ADC1_DMA_PRIORITY 2 +#define STM32_ADC_ADC2_DMA_PRIORITY 2 +#define STM32_ADC_ADC3_DMA_PRIORITY 2 +#define STM32_ADC_ADC4_DMA_PRIORITY 2 +#define STM32_ADC_ADC12_IRQ_PRIORITY 5 +#define STM32_ADC_ADC3_IRQ_PRIORITY 5 +#define STM32_ADC_ADC4_IRQ_PRIORITY 5 +#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 5 +#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 5 +#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 5 +#define STM32_ADC_ADC4_DMA_IRQ_PRIORITY 5 +#define STM32_ADC_ADC12_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 +#define STM32_ADC_ADC34_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 + +/* + * CAN driver system settings. + */ +#define STM32_CAN_USE_CAN1 FALSE +#define STM32_CAN_CAN1_IRQ_PRIORITY 11 + +/* + * DAC driver system settings. + */ +#define STM32_DAC_DUAL_MODE FALSE +#define STM32_DAC_USE_DAC1_CH1 TRUE +#define STM32_DAC_USE_DAC1_CH2 TRUE +#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 +#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 +#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 +#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 + +/* + * EXT driver system settings. + */ +#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI21_22_29_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 + +/* + * GPT driver system settings. + */ +#define STM32_GPT_USE_TIM1 FALSE +#define STM32_GPT_USE_TIM2 FALSE +#define STM32_GPT_USE_TIM3 FALSE +#define STM32_GPT_USE_TIM4 FALSE +#define STM32_GPT_USE_TIM6 TRUE +#define STM32_GPT_USE_TIM7 TRUE +#define STM32_GPT_USE_TIM8 TRUE +#define STM32_GPT_TIM1_IRQ_PRIORITY 7 +#define STM32_GPT_TIM2_IRQ_PRIORITY 7 +#define STM32_GPT_TIM3_IRQ_PRIORITY 7 +#define STM32_GPT_TIM4_IRQ_PRIORITY 7 +#define STM32_GPT_TIM6_IRQ_PRIORITY 7 +#define STM32_GPT_TIM7_IRQ_PRIORITY 7 +#define STM32_GPT_TIM8_IRQ_PRIORITY 7 + +/* + * I2C driver system settings. + */ +#define STM32_I2C_USE_I2C1 TRUE +#define STM32_I2C_USE_I2C2 FALSE +#define STM32_I2C_BUSY_TIMEOUT 50 +#define STM32_I2C_I2C1_IRQ_PRIORITY 10 +#define STM32_I2C_I2C2_IRQ_PRIORITY 10 +#define STM32_I2C_USE_DMA TRUE +#define STM32_I2C_I2C1_DMA_PRIORITY 1 +#define STM32_I2C_I2C2_DMA_PRIORITY 1 +#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") + +/* + * ICU driver system settings. + */ +#define STM32_ICU_USE_TIM1 FALSE +#define STM32_ICU_USE_TIM2 FALSE +#define STM32_ICU_USE_TIM3 FALSE +#define STM32_ICU_USE_TIM4 FALSE +#define STM32_ICU_USE_TIM8 FALSE +#define STM32_ICU_TIM1_IRQ_PRIORITY 7 +#define STM32_ICU_TIM2_IRQ_PRIORITY 7 +#define STM32_ICU_TIM3_IRQ_PRIORITY 7 +#define STM32_ICU_TIM4_IRQ_PRIORITY 7 +#define STM32_ICU_TIM8_IRQ_PRIORITY 7 + +/* + * PWM driver system settings. + */ +#define STM32_PWM_USE_ADVANCED FALSE +#define STM32_PWM_USE_TIM1 FALSE +#define STM32_PWM_USE_TIM2 FALSE +#define STM32_PWM_USE_TIM3 FALSE +#define STM32_PWM_USE_TIM4 FALSE +#define STM32_PWM_USE_TIM8 FALSE +#define STM32_PWM_TIM1_IRQ_PRIORITY 7 +#define STM32_PWM_TIM2_IRQ_PRIORITY 7 +#define STM32_PWM_TIM3_IRQ_PRIORITY 7 +#define STM32_PWM_TIM4_IRQ_PRIORITY 7 +#define STM32_PWM_TIM8_IRQ_PRIORITY 7 + +/* + * SERIAL driver system settings. + */ +#define STM32_SERIAL_USE_USART1 FALSE +#define STM32_SERIAL_USE_USART2 FALSE +#define STM32_SERIAL_USE_USART3 FALSE +#define STM32_SERIAL_USE_UART4 FALSE +#define STM32_SERIAL_USE_UART5 FALSE +#define STM32_SERIAL_USART1_PRIORITY 12 +#define STM32_SERIAL_USART2_PRIORITY 12 +#define STM32_SERIAL_USART3_PRIORITY 12 +#define STM32_SERIAL_UART4_PRIORITY 12 +#define STM32_SERIAL_UART5_PRIORITY 12 + +/* + * SPI driver system settings. + */ +#define STM32_SPI_USE_SPI1 FALSE +#define STM32_SPI_USE_SPI2 FALSE +#define STM32_SPI_USE_SPI3 FALSE +#define STM32_SPI_SPI1_DMA_PRIORITY 1 +#define STM32_SPI_SPI2_DMA_PRIORITY 1 +#define STM32_SPI_SPI3_DMA_PRIORITY 1 +#define STM32_SPI_SPI1_IRQ_PRIORITY 10 +#define STM32_SPI_SPI2_IRQ_PRIORITY 10 +#define STM32_SPI_SPI3_IRQ_PRIORITY 10 +#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") + +/* + * ST driver system settings. + */ +#define STM32_ST_IRQ_PRIORITY 8 +#define STM32_ST_USE_TIMER 2 + +/* + * UART driver system settings. + */ +#define STM32_UART_USE_USART1 FALSE +#define STM32_UART_USE_USART2 FALSE +#define STM32_UART_USE_USART3 FALSE +#define STM32_UART_USART1_IRQ_PRIORITY 12 +#define STM32_UART_USART2_IRQ_PRIORITY 12 +#define STM32_UART_USART3_IRQ_PRIORITY 12 +#define STM32_UART_USART1_DMA_PRIORITY 0 +#define STM32_UART_USART2_DMA_PRIORITY 0 +#define STM32_UART_USART3_DMA_PRIORITY 0 +#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") + +/* + * USB driver system settings. + */ +#define STM32_USB_USE_USB1 TRUE +#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE +#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 +#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 + +/* + * WDG driver system settings. + */ +#define STM32_WDG_USE_IWDG FALSE + +#endif /* MCUCONF_H */ diff --git a/keyboards/hs60/v2/readme.md b/keyboards/hs60/v2/readme.md new file mode 100644 index 000000000000..50c91698da62 --- /dev/null +++ b/keyboards/hs60/v2/readme.md @@ -0,0 +1,18 @@ +HS60 V2.0 +========= + +[HS60](https://mechboards.co.uk/wp-content/uploads/2018/04/IMG_20180420_140353.jpg) + +This is a standard fixed layout 60% PCB. It comes in three variants; ISO, ANSI and HHKB and support full per-key RGB. + +Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [github](https://github.com/yiancar) +Hardware Supported: HS60 ISO, ANSI and HHKB PCBs with STM32F303CC +Hardware Availability: http://groupbuys.mechboards.co.uk/shop/hs60-hotswap-60-pcb/ + +Due to the RGB implementation, the HS60 is currently not compatible with community layouts. + +Make example for this keyboard (after setting up your build environment): + + make hs60/v2:default + +See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. \ No newline at end of file diff --git a/keyboards/hs60/v2/rules.mk b/keyboards/hs60/v2/rules.mk new file mode 100644 index 000000000000..51e3cf0a3ecb --- /dev/null +++ b/keyboards/hs60/v2/rules.mk @@ -0,0 +1,58 @@ +# project specific files + +## chip/board settings +# the next two should match the directories in +# /os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) +MCU_FAMILY = STM32 +MCU_SERIES = STM32F3xx + +# Linker script to use +# it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/ +# or /ld/ +MCU_LDSCRIPT = STM32F303xC + +# Startup code to use +# - it should exist in /os/common/startup/ARMCMx/compilers/GCC/mk/ +MCU_STARTUP = stm32f3xx + +# Board: it should exist either in /os/hal/boards/ +# or /boards +BOARD = GENERIC_STM32_F303XC + +# Cortex version +MCU = cortex-m4 + +# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 +ARMV = 7 + +USE_FPU = yes + +# Vector table for application +# 0x00000000-0x00001000 area is occupied by bootlaoder.*/ +# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB +# OPT_DEFS = -DCORTEX_VTOR_INIT=0x08005000 +OPT_DEFS = + +# Do not put the microcontroller into power saving mode +# when we get USB suspend event. We want it to keep updating +# backlight effects. +OPT_DEFS += -DNO_SUSPEND_POWER_DOWN + +# Options to pass to dfu-util when flashing +DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave + +# Build Options +# comment out to disable the options. +# +BACKLIGHT_ENABLE = no +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover +AUDIO_ENABLE = no +RGB_MATRIX_ENABLE = IS31FL3733 # Use RGB matrix +NO_USB_STARTUP_CHECK = no # Disable initialization only when usb is plugged in +#SERIAL_LINK_ENABLE = yes diff --git a/keyboards/hs60/v2/v2.c b/keyboards/hs60/v2/v2.c new file mode 100644 index 000000000000..4289c1fed5ca --- /dev/null +++ b/keyboards/hs60/v2/v2.c @@ -0,0 +1,635 @@ +/* Copyright 2018 Yiancar + * + * 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 "v2.h" + +//#include "is31fl3733.h" + +// Please ignore this is for upcoming features +/*#ifdef RAW_ENABLE + +void raw_hid_receive( uint8_t *data, uint8_t length ) +{ + uint8_t command = data[0]; + switch ( command ) + { + case id_protocol_version: + { + msg_protocol_version *msg = (msg_protocol_version*)&data[1]; + msg->version = PROTOCOL_VERSION; + break; + } +#if USE_KEYMAPS_IN_EEPROM + case id_keymap_keycode_load: + { + msg_keymap_keycode_load *msg = (msg_keymap_keycode_load*)&data[1]; + msg->keycode = keymap_keycode_load( msg->layer, msg->row, msg->column ); + break; + } + case id_keymap_keycode_save: + { + msg_keymap_keycode_save *msg = (msg_keymap_keycode_save*)&data[1]; + keymap_keycode_save( msg->layer, msg->row, msg->column, msg->keycode); + break; + } + case id_keymap_default_save: + { + keymap_default_save(); + break; + } +#endif // USE_KEYMAPS_IN_EEPROM + case id_backlight_config_set_values: + { + msg_backlight_config_set_values *msg = (msg_backlight_config_set_values*)&data[1]; + backlight_config_set_values(msg); + backlight_config_save(); + break; + } + case id_backlight_config_set_alphas_mods: + { + msg_backlight_config_set_alphas_mods *msg = (msg_backlight_config_set_alphas_mods*)&data[1]; + backlight_config_set_alphas_mods( msg->alphas_mods ); + backlight_config_save(); + break; + } + case id_backlight_set_key_color: + { + msg_backlight_set_key_color *msg = (msg_backlight_set_key_color*)&data[1]; + backlight_set_key_color(msg->row, msg->column, msg->hsv); + break; + } + case id_system_get_state: + { + msg_system_state *msg = (msg_system_state*)&data[1]; + msg->value = backlight_get_tick(); + break; + } + default: + { + // Unhandled message. + data[0] = id_unhandled; + break; + } + } + + // Return same buffer with values changed + raw_hid_send( data, length ); + +} + +#endif*/ + +#ifdef HS60_ANSI + +const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { +/* Refer to IS31 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, B_1, A_1, C_1}, //MX1 + {0, E_1, D_1, F_1}, //MX2 + {0, H_1, G_1, I_1}, //MX3 + {0, K_1, J_1, L_1}, //MX4 + {0, B_2, A_2, C_2}, //MX6 + {0, E_2, D_2, F_2}, //MX7 + {0, H_2, G_2, I_2}, //MX8 + {0, K_2, J_2, L_2}, //MX14 + {0, B_3, A_3, C_3}, //MX11 + {0, E_3, D_3, F_3}, //MX12 + {0, H_3, G_3, I_3}, //MX13 + {0, K_3, J_3, L_3}, //MX19 + {0, B_4, A_4, C_4}, //MX16 + {0, E_4, D_4, F_4}, //MX17 + {0, H_4, G_4, I_4}, //MX18 + {0, K_4, J_4, L_4}, //MX23 + {0, B_5, A_5, C_5}, //MX20 + {0, E_5, D_5, F_5}, //MX21 + {0, H_5, G_5, I_5}, //MX22 + {0, K_5, J_5, L_5}, //MX27 + {0, B_6, A_6, C_6}, //MX24 + {0, E_6, D_6, F_6}, //MX25 + {0, H_6, G_6, I_6}, //MX26 + {0, K_6, J_6, L_6}, //MX31 + {0, B_7, A_7, C_7}, //MX28 + {0, E_7, D_7, F_7}, //MX29 + {0, H_7, G_7, I_7}, //MX30 + {0, K_7, J_7, L_7}, //MX36 + {0, B_8, A_8, C_8}, //MX33 + {0, E_8, D_8, F_8}, //MX34 + {0, H_8, G_8, I_8}, //MX35 + {0, K_8, J_8, L_8}, //MX40 + {0, B_9, A_9, C_9}, //MX37 + {0, E_9, D_9, F_9}, //MX38 + {0, H_9, G_9, I_9}, //MX39 + {0, K_9, J_9, L_9}, //MX44 + {0, B_10, A_10, C_10}, //MX41 + {0, E_10, D_10, F_10}, //MX42 + {0, H_10, G_10, I_10}, //MX43 + {0, K_10, J_10, L_10}, //MX48 + {0, B_11, A_11, C_11}, //MX45 + {0, E_11, D_11, F_11}, //MX46 + {0, H_11, G_11, I_11}, //MX47 + {0, K_11, J_11, L_11}, //MX53 + {0, B_12, A_12, C_12}, //MX50 + {0, E_12, D_12, F_12}, //MX51 + {0, H_12, G_12, I_12}, //MX52 + + {0, B_13, A_13, C_13}, //MX55 + {0, E_13, D_13, F_13}, //MX56 + + {0, K_13, J_13, L_13}, //MX61 + {0, B_14, A_14, C_14}, //MX59 + {0, E_14, D_14, F_14}, //MX57 + {0, H_14, G_14, I_14}, //MX60 + {0, K_14, J_14, L_14}, //MX62 + {0, B_15, A_15, C_15}, //MX5 + {0, E_15, D_15, F_15}, //MX10 + {0, H_15, G_15, I_15}, //MX15 + {0, K_15, J_15, L_15}, //MX32 + + {0, E_16, D_16, F_16}, //MX49 + {0, H_16, G_16, I_16}, //MX54 + {0, K_16, J_16, L_16}, //MX58 +}; + +const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { +// +// MX1, MX6, MX11, MX16, MX20, MX24, MX28, MX33, MX37, MX41, MX45, MX50, MX55, MX59, +// MX2, MX7, MX12, MX17, MX21, MX25, MX29, MX34, MX38, MX42, MX46, MX51, MX56, ---, +// MX3, MX8, MX13, MX18, MX22, MX26, MX30, MX35, MX39, MX43, MX47, MX52, MX57, MX60, +// MX4, ---, MX14, MX19, MX23, MX27, MX31, MX36, MX40, MX44, MX48, MX53, ---, MX61, +// MX5, MX10, MX15, ---, ---, ---, MX32, ---, ---, ---, MX49, MX54, MX58, MX62 +/* {row | col << 4} + * | {x=0..224, y=0..64} + * | | modifier + * | | | */ + {{0|(0<<4)}, { 0, 0}, 1}, //MX1 + {{1|(0<<4)}, { 0, 16}, 1}, //MX2 + {{2|(0<<4)}, { 0, 32}, 1}, //MX3 + {{3|(0<<4)}, { 0, 48}, 1}, //MX4 + {{0|(1<<4)}, { 17, 0}, 0}, //MX6 + {{1|(1<<4)}, { 17, 16}, 0}, //MX7 + {{2|(1<<4)}, { 17, 32}, 0}, //MX8 + {{3|(2<<4)}, { 34, 48}, 0}, //MX14 + {{0|(2<<4)}, { 34, 0}, 0}, //MX11 + {{1|(2<<4)}, { 34, 16}, 0}, //MX12 + {{2|(2<<4)}, { 34, 32}, 0}, //MX13 + {{3|(3<<4)}, { 51, 48}, 0}, //MX19 + {{0|(3<<4)}, { 51, 0}, 0}, //MX16 + {{1|(3<<4)}, { 51, 16}, 0}, //MX17 + {{2|(3<<4)}, { 51, 32}, 0}, //MX18 + {{3|(4<<4)}, { 68, 48}, 0}, //MX23 + {{0|(4<<4)}, { 68, 0}, 0}, //MX20 + {{1|(4<<4)}, { 68, 16}, 0}, //MX21 + {{2|(4<<4)}, { 68, 32}, 0}, //MX22 + {{3|(5<<4)}, { 85, 48}, 0}, //MX27 + {{0|(5<<4)}, { 85, 0}, 0}, //MX24 + {{1|(5<<4)}, { 85, 16}, 0}, //MX25 + {{2|(5<<4)}, { 85, 32}, 0}, //MX26 + {{3|(6<<4)}, {102, 48}, 0}, //MX31 + {{0|(6<<4)}, {102, 0}, 0}, //MX28 + {{1|(6<<4)}, {102, 16}, 0}, //MX29 + {{2|(6<<4)}, {102, 32}, 0}, //MX30 + {{3|(7<<4)}, {119, 48}, 0}, //MX36 + {{0|(7<<4)}, {119, 0}, 0}, //MX33 + {{1|(7<<4)}, {119, 16}, 0}, //MX34 + {{2|(7<<4)}, {119, 32}, 0}, //MX35 + {{3|(8<<4)}, {136, 48}, 0}, //MX40 + {{0|(8<<4)}, {136, 0}, 0}, //MX37 + {{1|(8<<4)}, {136, 16}, 0}, //MX38 + {{2|(8<<4)}, {136, 32}, 0}, //MX39 + {{3|(9<<4)}, {153, 48}, 0}, //MX44 + {{0|(9<<4)}, {153, 0}, 0}, //MX41 + {{1|(9<<4)}, {153, 16}, 0}, //MX42 + {{2|(9<<4)}, {153, 32}, 0}, //MX43 + {{3|(10<<4)}, {170, 48}, 0}, //MX48 + {{0|(10<<4)}, {170, 0}, 0}, //MX45 + {{1|(10<<4)}, {170, 16}, 0}, //MX46 + {{2|(10<<4)}, {170, 32}, 0}, //MX47 + {{3|(11<<4)}, {187, 48}, 0}, //MX53 + {{0|(11<<4)}, {187, 0}, 0}, //MX50 + {{1|(11<<4)}, {187, 16}, 0}, //MX51 + {{2|(11<<4)}, {187, 32}, 0}, //MX52 + + {{0|(12<<4)}, {204, 0}, 0}, //MX55 + {{1|(12<<4)}, {204, 16}, 0}, //MX56 + + {{3|(13<<4)}, {221, 48}, 1}, //MX61 + {{0|(13<<4)}, {221, 0}, 1}, //MX59 + {{2|(12<<4)}, {221, 16}, 0}, //MX57 + {{2|(13<<4)}, {221, 32}, 1}, //MX60 + {{4|(13<<4)}, {221, 64}, 1}, //MX62 + {{4|(0<<4)}, { 0, 64}, 1}, //MX5 + {{4|(1<<4)}, { 17, 64}, 1}, //MX10 + {{4|(2<<4)}, { 34, 64}, 1}, //MX15 + {{4|(5<<4)}, {102, 64}, 0}, //MX32 + + {{4|(10<<4)}, {170, 64}, 1}, //MX49 + {{4|(11<<4)}, {187, 64}, 1}, //MX54 + {{4|(12<<4)}, {204, 64}, 1} //MX58 +}; + +#elif defined(HS60_HHKB) + +const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { +/* Refer to IS31 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, B_1, A_1, C_1}, //MX1 + {0, E_1, D_1, F_1}, //MX2 + {0, H_1, G_1, I_1}, //MX3 + {0, K_1, J_1, L_1}, //MX4 + {0, B_2, A_2, C_2}, //MX6 + {0, E_2, D_2, F_2}, //MX7 + {0, H_2, G_2, I_2}, //MX8 + {0, K_2, J_2, L_2}, //MX14 + {0, B_3, A_3, C_3}, //MX11 + {0, E_3, D_3, F_3}, //MX12 + {0, H_3, G_3, I_3}, //MX13 + {0, K_3, J_3, L_3}, //MX19 + {0, B_4, A_4, C_4}, //MX16 + {0, E_4, D_4, F_4}, //MX17 + {0, H_4, G_4, I_4}, //MX18 + {0, K_4, J_4, L_4}, //MX23 + {0, B_5, A_5, C_5}, //MX20 + {0, E_5, D_5, F_5}, //MX21 + {0, H_5, G_5, I_5}, //MX22 + {0, K_5, J_5, L_5}, //MX27 + {0, B_6, A_6, C_6}, //MX24 + {0, E_6, D_6, F_6}, //MX25 + {0, H_6, G_6, I_6}, //MX26 + {0, K_6, J_6, L_6}, //MX31 + {0, B_7, A_7, C_7}, //MX28 + {0, E_7, D_7, F_7}, //MX29 + {0, H_7, G_7, I_7}, //MX30 + {0, K_7, J_7, L_7}, //MX36 + {0, B_8, A_8, C_8}, //MX33 + {0, E_8, D_8, F_8}, //MX34 + {0, H_8, G_8, I_8}, //MX35 + {0, K_8, J_8, L_8}, //MX40 + {0, B_9, A_9, C_9}, //MX37 + {0, E_9, D_9, F_9}, //MX38 + {0, H_9, G_9, I_9}, //MX39 + {0, K_9, J_9, L_9}, //MX44 + {0, B_10, A_10, C_10}, //MX41 + {0, E_10, D_10, F_10}, //MX42 + {0, H_10, G_10, I_10}, //MX43 + {0, K_10, J_10, L_10}, //MX48 + {0, B_11, A_11, C_11}, //MX45 + {0, E_11, D_11, F_11}, //MX46 + {0, H_11, G_11, I_11}, //MX47 + {0, K_11, J_11, L_11}, //MX53 + {0, B_12, A_12, C_12}, //MX50 + {0, E_12, D_12, F_12}, //MX51 + {0, H_12, G_12, I_12}, //MX52 + {0, K_12, J_12, L_12}, //MX64 + {0, B_13, A_13, C_13}, //MX55 + {0, E_13, D_13, F_13}, //MX56 + {0, H_13, G_13, I_13}, //MX63 + {0, K_13, J_13, L_13}, //MX61 + {0, B_14, A_14, C_14}, //MX59 + {0, E_14, D_14, F_14}, //MX57 + {0, H_14, G_14, I_14}, //MX60 + {0, K_14, J_14, L_14}, //MX62 + {0, B_15, A_15, C_15}, //MX5 + {0, E_15, D_15, F_15}, //MX10 + {0, H_15, G_15, I_15}, //MX15 + {0, K_15, J_15, L_15}, //MX32 + + + {0, H_16, G_16, I_16}, //MX54 + {0, K_16, J_16, L_16}, //MX58 +}; + +const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { +// +// MX1, MX6, MX11, MX16, MX20, MX24, MX28, MX33, MX37, MX41, MX45, MX50, MX55, MX59, +// MX2, MX7, MX12, MX17, MX21, MX25, MX29, MX34, MX38, MX42, MX46, MX51, MX56, MX64, +// MX3, MX8, MX13, MX18, MX22, MX26, MX30, MX35, MX39, MX43, MX47, MX52, MX57, MX60, +// MX4, ----, MX14, MX19, MX23, MX27, MX31, MX36, MX40, MX44, MX48, MX53, MX63, MX61, +// MX5, MX10, MX15, ----, ----, ----, MX32, ----, ---, ----, ----, MX54, MX58, MX62 +/* {row | col << 4} + * | {x=0..224, y=0..64} + * | | modifier + * | | | */ + {{0|(0<<4)}, { 0, 0}, 1}, //MX1 + {{1|(0<<4)}, { 0, 16}, 1}, //MX2 + {{2|(0<<4)}, { 0, 32}, 1}, //MX3 + {{3|(0<<4)}, { 0, 48}, 1}, //MX4 + {{0|(1<<4)}, { 17, 0}, 0}, //MX6 + {{1|(1<<4)}, { 17, 16}, 0}, //MX7 + {{2|(1<<4)}, { 17, 32}, 0}, //MX8 + {{3|(2<<4)}, { 34, 48}, 0}, //MX14 + {{0|(2<<4)}, { 34, 0}, 0}, //MX11 + {{1|(2<<4)}, { 34, 16}, 0}, //MX12 + {{2|(2<<4)}, { 34, 32}, 0}, //MX13 + {{3|(3<<4)}, { 51, 48}, 0}, //MX19 + {{0|(3<<4)}, { 51, 0}, 0}, //MX16 + {{1|(3<<4)}, { 51, 16}, 0}, //MX17 + {{2|(3<<4)}, { 51, 32}, 0}, //MX18 + {{3|(4<<4)}, { 68, 48}, 0}, //MX23 + {{0|(4<<4)}, { 68, 0}, 0}, //MX20 + {{1|(4<<4)}, { 68, 16}, 0}, //MX21 + {{2|(4<<4)}, { 68, 32}, 0}, //MX22 + {{3|(5<<4)}, { 85, 48}, 0}, //MX27 + {{0|(5<<4)}, { 85, 0}, 0}, //MX24 + {{1|(5<<4)}, { 85, 16}, 0}, //MX25 + {{2|(5<<4)}, { 85, 32}, 0}, //MX26 + {{3|(6<<4)}, {102, 48}, 0}, //MX31 + {{0|(6<<4)}, {102, 0}, 0}, //MX28 + {{1|(6<<4)}, {102, 16}, 0}, //MX29 + {{2|(6<<4)}, {102, 32}, 0}, //MX30 + {{3|(7<<4)}, {119, 48}, 0}, //MX36 + {{0|(7<<4)}, {119, 0}, 0}, //MX33 + {{1|(7<<4)}, {119, 16}, 0}, //MX34 + {{2|(7<<4)}, {119, 32}, 0}, //MX35 + {{3|(8<<4)}, {136, 48}, 0}, //MX40 + {{0|(8<<4)}, {136, 0}, 0}, //MX37 + {{1|(8<<4)}, {136, 16}, 0}, //MX38 + {{2|(8<<4)}, {136, 32}, 0}, //MX39 + {{3|(9<<4)}, {153, 48}, 0}, //MX44 + {{0|(9<<4)}, {153, 0}, 0}, //MX41 + {{1|(9<<4)}, {153, 16}, 0}, //MX42 + {{2|(9<<4)}, {153, 32}, 0}, //MX43 + {{3|(10<<4)}, {170, 48}, 0}, //MX48 + {{0|(10<<4)}, {170, 0}, 0}, //MX45 + {{1|(10<<4)}, {170, 16}, 0}, //MX46 + {{2|(10<<4)}, {170, 32}, 0}, //MX47 + {{3|(11<<4)}, {187, 48}, 0}, //MX53 + {{0|(11<<4)}, {187, 0}, 0}, //MX50 + {{1|(11<<4)}, {187, 16}, 0}, //MX51 + {{2|(11<<4)}, {187, 32}, 0}, //MX52 + {{1|(13<<4)}, {221, 0}, 1}, //MX64 + {{0|(12<<4)}, {204, 0}, 0}, //MX55 + {{1|(12<<4)}, {204, 16}, 0}, //MX56 + {{3|(12<<4)}, {204, 48}, 0}, //MX63 + {{3|(13<<4)}, {212, 48}, 1}, //MX61 + {{0|(13<<4)}, {221, 0}, 0}, //MX59 + {{2|(12<<4)}, {221, 16}, 0}, //MX57 + {{2|(13<<4)}, {221, 32}, 1}, //MX60 + {{4|(13<<4)}, {221, 64}, 1}, //MX62 + {{4|(0<<4)}, { 0, 64}, 1}, //MX5 + {{4|(1<<4)}, { 17, 64}, 1}, //MX10 + {{4|(2<<4)}, { 34, 64}, 1}, //MX15 + {{4|(5<<4)}, {102, 64}, 0}, //MX32 + + + {{4|(11<<4)}, {187, 64}, 1}, //MX54 + {{4|(12<<4)}, {204, 64}, 1} //MX58 +}; + +#else //ISO layout + +const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { +/* Refer to IS31 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, B_1, A_1, C_1}, //MX1 + {0, E_1, D_1, F_1}, //MX2 + {0, H_1, G_1, I_1}, //MX3 + {0, K_1, J_1, L_1}, //MX4 + {0, B_2, A_2, C_2}, //MX6 + {0, E_2, D_2, F_2}, //MX7 + {0, H_2, G_2, I_2}, //MX8 + {0, K_2, J_2, L_2}, //MX14 + {0, B_3, A_3, C_3}, //MX11 + {0, E_3, D_3, F_3}, //MX12 + {0, H_3, G_3, I_3}, //MX13 + {0, K_3, J_3, L_3}, //MX19 + {0, B_4, A_4, C_4}, //MX16 + {0, E_4, D_4, F_4}, //MX17 + {0, H_4, G_4, I_4}, //MX18 + {0, K_4, J_4, L_4}, //MX23 + {0, B_5, A_5, C_5}, //MX20 + {0, E_5, D_5, F_5}, //MX21 + {0, H_5, G_5, I_5}, //MX22 + {0, K_5, J_5, L_5}, //MX27 + {0, B_6, A_6, C_6}, //MX24 + {0, E_6, D_6, F_6}, //MX25 + {0, H_6, G_6, I_6}, //MX26 + {0, K_6, J_6, L_6}, //MX31 + {0, B_7, A_7, C_7}, //MX28 + {0, E_7, D_7, F_7}, //MX29 + {0, H_7, G_7, I_7}, //MX30 + {0, K_7, J_7, L_7}, //MX36 + {0, B_8, A_8, C_8}, //MX33 + {0, E_8, D_8, F_8}, //MX34 + {0, H_8, G_8, I_8}, //MX35 + {0, K_8, J_8, L_8}, //MX40 + {0, B_9, A_9, C_9}, //MX37 + {0, E_9, D_9, F_9}, //MX38 + {0, H_9, G_9, I_9}, //MX39 + {0, K_9, J_9, L_9}, //MX44 + {0, B_10, A_10, C_10}, //MX41 + {0, E_10, D_10, F_10}, //MX42 + {0, H_10, G_10, I_10}, //MX43 + {0, K_10, J_10, L_10}, //MX48 + {0, B_11, A_11, C_11}, //MX45 + {0, E_11, D_11, F_11}, //MX46 + {0, H_11, G_11, I_11}, //MX47 + {0, K_11, J_11, L_11}, //MX53 + {0, B_12, A_12, C_12}, //MX50 + {0, E_12, D_12, F_12}, //MX51 + {0, H_12, G_12, I_12}, //MX52 + {0, K_12, J_12, L_12}, //MX9 + {0, B_13, A_13, C_13}, //MX55 + {0, E_13, D_13, F_13}, //MX56 + + {0, K_13, J_13, L_13}, //MX61 + {0, B_14, A_14, C_14}, //MX59 + {0, E_14, D_14, F_14}, //MX57 + {0, H_14, G_14, I_14}, //MX60 + {0, K_14, J_14, L_14}, //MX62 + {0, B_15, A_15, C_15}, //MX5 + {0, E_15, D_15, F_15}, //MX10 + {0, H_15, G_15, I_15}, //MX15 + {0, K_15, J_15, L_15}, //MX32 + + {0, E_16, D_16, F_16}, //MX49 + {0, H_16, G_16, I_16}, //MX54 + {0, K_16, J_16, L_16}, //MX58 +}; + +const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { +// +// MX1, MX6, MX11, MX16, MX20, MX24, MX28, MX33, MX37, MX41, MX45, MX50, MX55, MX59, +// MX2, MX7, MX12, MX17, MX21, MX25, MX29, MX34, MX38, MX42, MX46, MX51, MX56, ---, +// MX3, MX8, MX13, MX18, MX22, MX26, MX30, MX35, MX39, MX43, MX47, MX52, MX57, MX60, +// MX4, ---, MX14, MX19, MX23, MX27, MX31, MX36, MX40, MX44, MX48, MX53, ---, MX61, +// MX5, MX10, MX15, ---, ---, ---, MX32, ---, ---, ---, MX49, MX54, MX58, MX62 +/* {row | col << 4} + * | {x=0..224, y=0..64} + * | | modifier + * | | | */ + {{0|(0<<4)}, { 0, 0}, 1}, //MX1 + {{1|(0<<4)}, { 0, 16}, 1}, //MX2 + {{2|(0<<4)}, { 0, 32}, 1}, //MX3 + {{3|(0<<4)}, { 0, 48}, 1}, //MX4 + {{0|(1<<4)}, { 17, 0}, 0}, //MX6 + {{1|(1<<4)}, { 17, 16}, 0}, //MX7 + {{2|(1<<4)}, { 17, 32}, 0}, //MX8 + {{3|(2<<4)}, { 34, 48}, 0}, //MX14 + {{0|(2<<4)}, { 34, 0}, 0}, //MX11 + {{1|(2<<4)}, { 34, 16}, 0}, //MX12 + {{2|(2<<4)}, { 34, 32}, 0}, //MX13 + {{3|(3<<4)}, { 51, 48}, 0}, //MX19 + {{0|(3<<4)}, { 51, 0}, 0}, //MX16 + {{1|(3<<4)}, { 51, 16}, 0}, //MX17 + {{2|(3<<4)}, { 51, 32}, 0}, //MX18 + {{3|(4<<4)}, { 68, 48}, 0}, //MX23 + {{0|(4<<4)}, { 68, 0}, 0}, //MX20 + {{1|(4<<4)}, { 68, 16}, 0}, //MX21 + {{2|(4<<4)}, { 68, 32}, 0}, //MX22 + {{3|(5<<4)}, { 85, 48}, 0}, //MX27 + {{0|(5<<4)}, { 85, 0}, 0}, //MX24 + {{1|(5<<4)}, { 85, 16}, 0}, //MX25 + {{2|(5<<4)}, { 85, 32}, 0}, //MX26 + {{3|(6<<4)}, {102, 48}, 0}, //MX31 + {{0|(6<<4)}, {102, 0}, 0}, //MX28 + {{1|(6<<4)}, {102, 16}, 0}, //MX29 + {{2|(6<<4)}, {102, 32}, 0}, //MX30 + {{3|(7<<4)}, {119, 48}, 0}, //MX36 + {{0|(7<<4)}, {119, 0}, 0}, //MX33 + {{1|(7<<4)}, {119, 16}, 0}, //MX34 + {{2|(7<<4)}, {119, 32}, 0}, //MX35 + {{3|(8<<4)}, {136, 48}, 0}, //MX40 + {{0|(8<<4)}, {136, 0}, 0}, //MX37 + {{1|(8<<4)}, {136, 16}, 0}, //MX38 + {{2|(8<<4)}, {136, 32}, 0}, //MX39 + {{3|(9<<4)}, {153, 48}, 0}, //MX44 + {{0|(9<<4)}, {153, 0}, 0}, //MX41 + {{1|(9<<4)}, {153, 16}, 0}, //MX42 + {{2|(9<<4)}, {153, 32}, 0}, //MX43 + {{3|(10<<4)}, {170, 48}, 0}, //MX48 + {{0|(10<<4)}, {170, 0}, 0}, //MX45 + {{1|(10<<4)}, {170, 16}, 0}, //MX46 + {{2|(10<<4)}, {170, 32}, 0}, //MX47 + {{3|(11<<4)}, {187, 48}, 0}, //MX53 + {{0|(11<<4)}, {187, 0}, 0}, //MX50 + {{1|(11<<4)}, {187, 16}, 0}, //MX51 + {{2|(11<<4)}, {187, 32}, 0}, //MX52 + {{3|(2<<4)}, { 17, 32}, 1}, //MX9 + {{0|(12<<4)}, {204, 0}, 0}, //MX55 + {{1|(12<<4)}, {204, 16}, 0}, //MX56 + + {{3|(13<<4)}, {221, 48}, 1}, //MX61 + {{0|(13<<4)}, {221, 0}, 1}, //MX59 + {{2|(12<<4)}, {204, 32}, 0}, //MX57 + {{2|(13<<4)}, {221, 24}, 1}, //MX60 + {{4|(13<<4)}, {221, 64}, 1}, //MX62 + {{4|(0<<4)}, { 0, 64}, 1}, //MX5 + {{4|(1<<4)}, { 17, 64}, 1}, //MX10 + {{4|(2<<4)}, { 34, 64}, 1}, //MX15 + {{4|(5<<4)}, {102, 64}, 0}, //MX32 + + {{4|(10<<4)}, {170, 64}, 1}, //MX49 + {{4|(11<<4)}, {187, 64}, 1}, //MX54 + {{4|(12<<4)}, {204, 64}, 1} //MX58 +}; + +#endif + +void bootmagic_lite(void) +{ + // The lite version of TMK's bootmagic made by Wilba. + // 100% less potential for accidentally making the + // keyboard do stupid things. + + // We need multiple scans because debouncing can't be turned off. + matrix_scan(); + wait_ms(10); + matrix_scan(); + + // If the Esc and space bar are held down on power up, + // reset the EEPROM valid state and jump to bootloader. + // Assumes Esc is at [0,0] and spacebar is at [4,6]. + // This isn't very generalized, but we need something that doesn't + // rely on user's keymaps in firmware or EEPROM. + if ( ( matrix_get_row(0) & (1<<0) ) && + ( matrix_get_row(4) & (1<<6) ) ) + { + // Set the TMK/QMK EEPROM state as invalid. + eeconfig_disable(); + //eeprom_set_valid(false); + // Jump to bootloader. + bootloader_jump(); + } +} + +void matrix_init_kb(void) { + // put your keyboard start-up code here + // runs once when the firmware starts up + + bootmagic_lite(); + + // Please ignore this is for upcoming features + // If the EEPROM has the magic, the data is good. + // OK to load from EEPROM. + /*if (eeprom_is_valid()) + { + backlight_config_load(); + + // TODO: do something to "turn on" keymaps in EEPROM? + } + else + { + // If the EEPROM has not been saved before, or is out of date, + // save the default values to the EEPROM. Default values + // come from construction of the zeal_backlight_config instance. + backlight_config_save(); + + // Clear the LED colors stored in EEPROM + for ( int row=0; row < MATRIX_ROWS; row++ ) + { + HSV hsv; + for ( int column=0; column < MATRIX_COLS; column++ ) + { + hsv.h = rand() & 0xFF; + hsv.s = rand() & 0x7F; + hsv.v = 255; + backlight_set_key_color( row, column, hsv ); + } + } + #ifdef USE_KEYMAPS_IN_EEPROM + keymap_default_save(); + #endif + // Save the magic number last, in case saving was interrupted + eeprom_set_valid(true); + }*/ + + matrix_init_user(); +} + +void matrix_scan_kb(void) { + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + + return process_record_user(keycode, record); +} + +void led_set_kb(uint8_t usb_led) { + //backlight_set_indicator_state(usb_led); +} \ No newline at end of file diff --git a/keyboards/hs60/v2/v2.h b/keyboards/hs60/v2/v2.h new file mode 100644 index 000000000000..86aeb68a74b2 --- /dev/null +++ b/keyboards/hs60/v2/v2.h @@ -0,0 +1,67 @@ +/* Copyright 2018 Yiancar + * + * 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 HS60_H +#define HS60_H + +#define XXX KC_NO + +#include "quantum.h" + +// This a shortcut to help you visually see your layout. + +#define LAYOUT_60_iso( \ + 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, \ + 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, K3D, \ + K40, K41, K42, K46, 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, XXX }, \ + { 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, XXX, K3D }, \ + { K40, K41, K42, XXX, XXX, XXX, K46, XXX, XXX, XXX, K4A, K4B, K4C, K4D } \ +} + +#define LAYOUT_60_ansi( \ + 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, K2C, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \ + K40, K41, K42, K46, 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, XXX }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \ + { K30, XXX, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, K3D }, \ + { K40, K41, K42, XXX, XXX, XXX, K46, XXX, XXX, XXX, K4A, K4B, K4C, K4D } \ +} + +#define LAYOUT_60_hhkb( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K1D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K2C, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ + K40, K41, K42, K46, 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, XXX, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \ + { K40, K41, K42, XXX, XXX, XXX, K46, XXX, XXX, XXX, XXX, K4B, K4C, K4D } \ +} + +#endif \ No newline at end of file From b11a776cef1d5e26e435ed6b4a12711c965abeb6 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Fri, 26 Oct 2018 17:14:50 -0700 Subject: [PATCH 281/505] Keymap: Update userspace (I want my Hacktoberfest shirt!) (#4252) * use ctl_t * spruce up readme and add a changelog * add comment about using CTL_T * add more description * use RSFT_T so I can still have a right shift key even on the _AL layer * add config.h for rgblight_sleep * update readme to talk about rgblight_sleep * update changelog with new changes --- .../60_ansi/mechmerlin-ansi/keymap.c | 2 +- .../mechmerlin-split/keymap.c | 2 +- users/mechmerlin/changelog.md | 14 +++++++ users/mechmerlin/config.h | 5 +++ users/mechmerlin/mechmerlin.h | 4 +- users/mechmerlin/readme.md | 41 ++++++++++++++++++- 6 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 users/mechmerlin/changelog.md create mode 100644 users/mechmerlin/config.h diff --git a/layouts/community/60_ansi/mechmerlin-ansi/keymap.c b/layouts/community/60_ansi/mechmerlin-ansi/keymap.c index e48fddea46c4..4128c4cf2d46 100644 --- a/layouts/community/60_ansi/mechmerlin-ansi/keymap.c +++ b/layouts/community/60_ansi/mechmerlin-ansi/keymap.c @@ -20,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RSFT_T(KC_UP), \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT) }; diff --git a/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c b/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c index 5ec005162f43..2464dcaa7091 100644 --- a/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c +++ b/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c @@ -20,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RSFT_T(KC_UP), KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT) }; diff --git a/users/mechmerlin/changelog.md b/users/mechmerlin/changelog.md new file mode 100644 index 000000000000..11b3ba708f6b --- /dev/null +++ b/users/mechmerlin/changelog.md @@ -0,0 +1,14 @@ +# Changelog +All notable changes to my userspace will be documented in this file. + +## [0.1.1] - 2018-10-26 +### Added +- Added a changelog, aka THIS VERY FILE! +- Added `config.h` to userspace for `RGBLIGHT_SLEEP` feature. + +### Changed +- Spruced up the readme file to better explain the things I use in my keymap for would be keymap snoopers. Also useful as an example when people ask. +- Use `CTL_T` instead of `MT` for my custom `KC_CTCP` keycode as it was causing issues on some boards. + +## [0.1.0] - 2018-08-31 +Initial usage of userspaces! diff --git a/users/mechmerlin/config.h b/users/mechmerlin/config.h new file mode 100644 index 000000000000..3d58c230af65 --- /dev/null +++ b/users/mechmerlin/config.h @@ -0,0 +1,5 @@ +#pragma once + +#ifdef RGBLIGHT_ENABLE +#define RGBLIGHT_SLEEP +#endif // RGBLIGHT_ENABLE diff --git a/users/mechmerlin/mechmerlin.h b/users/mechmerlin/mechmerlin.h index c140ac70c946..6b4d50edc841 100644 --- a/users/mechmerlin/mechmerlin.h +++ b/users/mechmerlin/mechmerlin.h @@ -10,8 +10,8 @@ enum userspace_layers { // Enum of custom keycodes defined in process_record_user enum keycodes { - KC_FNX, // Hold for FN layer, tap to toggle ARROWS layer. + KC_FNX, // Hold for FN layer, tap to toggle ARROWS layer. }; // Custom #defined keycodes -#define KC_CTCP MT(KC_LCTL, KC_CAPS) +#define KC_CTCP CTL_T(KC_CAPS) diff --git a/users/mechmerlin/readme.md b/users/mechmerlin/readme.md index 6a76dd2a9dd1..1e86a64107fc 100644 --- a/users/mechmerlin/readme.md +++ b/users/mechmerlin/readme.md @@ -1,3 +1,40 @@ -# MechMerlin's Userspace +# MechMerlin's Userspace v0.1.1 -This is a collection of my most commonly used QMK functions +This is a collection of my most commonly used QMK features. + +A majority of my keyboards are smaller than 75%, ANSI, and staggered. + +## Layers +---- + +### _BL (Base Layer) +Typical standard QWERTY keymap. + +### _FL (Function Layer) +This layer is commonly accessed via `MO(_FL)` on the base layer. It consists of your typical function key F1 through F12 and some RGB and Backlight controls. + +### _AL (Arrow Layer) +This layer is only present on my 60% boards. I habitually use the bottom right modifiers as arrows. + +### _CL (Control Layer) +This is not defined in here as it's present only on `LAYOUT_66` boards, or to be specific, my clueboard. It currently uses the default clueboard controls. + +## Custom Keycodes +---- + +### KC_FNX (Fn Extended) + +`KC_FNX` functions as a hold for `MO(X)` and tap for `TG(Y)`. Layer X and Y are different layers. + +It is used primarily on my `LAYOUT_60_ansi` boards as my regular toggle (the 1u key to the right of right shift), is not present there. + +### KC_CTCP (Control Caps) + +This is just a wrapper for `CTL_T(KC_CAPS)`. This is a hold for control and tap for caps lock. + +## QMK Features +---- + +### RGBLIGHT_SLEEP + +Ensures that when my computer is in sleep mode, the keyboard underglow lights will also be off. From b1bf0879ad2acf3aec1db0f67250b8679e565324 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 25 Oct 2018 11:22:02 -0700 Subject: [PATCH 282/505] Fix mouse_send() on chibiOS so it won't lock up the firmware --- tmk_core/protocol/chibios/usb_main.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index e79ff15e8909..71892c4f496f 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -715,15 +715,16 @@ void send_mouse(report_mouse_t *report) { osalSysUnlock(); return; } - osalSysUnlock(); - osalSysLock(); if(usbGetTransmitStatusI(&USB_DRIVER, MOUSE_IN_EPNUM)) { /* Need to either suspend, or loop and call unlock/lock during * every iteration - otherwise the system will remain locked, * no interrupts served, so USB not going through as well. * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ - osalThreadSuspendS(&(&USB_DRIVER)->epc[MOUSE_IN_EPNUM]->in_state->thread); + if (osalThreadSuspendTimeoutS(&(&USB_DRIVER)->epc[MOUSE_IN_EPNUM]->in_state->thread, MS2ST(10)==MSG_TIMEOUT)) { + osalSysUnlock(); + return; + } } usbStartTransmitI(&USB_DRIVER, MOUSE_IN_EPNUM, (uint8_t *)report, sizeof(report_mouse_t)); osalSysUnlock(); From d3a6296199c6f6564e0fffd6d7c1355496d9feac Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 22 Oct 2018 14:46:50 -0700 Subject: [PATCH 283/505] Add key caveat to combos doc --- docs/feature_combo.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/feature_combo.md b/docs/feature_combo.md index f509e9f33f2b..5bb73ef10677 100644 --- a/docs/feature_combo.md +++ b/docs/feature_combo.md @@ -19,6 +19,7 @@ combo_t key_combos[COMBO_COUNT] = {COMBO(test_combo, KC_ESC)}; This will send "Escape" if you hit the A and B keys. !> This method only supports [basic keycodes](keycodes_basic.md). See the examples for more control. +!> You cannot reuse (share) keys in combos. Each key should only belong to a single combo. ## Examples From 5632552558fc5e032e89c62d578dff7d3c3cb800 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Fri, 26 Oct 2018 21:20:00 -0700 Subject: [PATCH 284/505] RGB Support for Panc60 (#4253) * add RGB underglow support * enable RGB underglow and backlighting --- keyboards/panc60/panc60.c | 39 +++++++++++++++++++++++++++++++++++++++ keyboards/panc60/rules.mk | 4 ++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/keyboards/panc60/panc60.c b/keyboards/panc60/panc60.c index 4828cb9cfea3..9ac087dbf246 100644 --- a/keyboards/panc60/panc60.c +++ b/keyboards/panc60/panc60.c @@ -14,8 +14,15 @@ * along with this program. If not, see . */ #include "panc60.h" +#ifdef BACKLIGHT_ENABLE +#include "backlight.h" +#endif +#ifdef RGBLIGHT_ENABLE +#include "rgblight.h" +#endif #include + #include "action_layer.h" #include "i2c.h" #include "quantum.h" @@ -23,3 +30,35 @@ __attribute__ ((weak)) void matrix_scan_user(void) { } + +#ifdef RGBLIGHT_ENABLE +extern rgblight_config_t rgblight_config; + +void rgblight_set(void) { + if (!rgblight_config.enable) { + for (uint8_t i = 0; i < RGBLED_NUM; i++) { + led[i].r = 0; + led[i].g = 0; + led[i].b = 0; + } + } + + i2c_init(); + i2c_send(0xb0, (uint8_t*)led, 3 * RGBLED_NUM); +} +#endif + +void backlight_init_ports(void) { + DDRD |= (1<<0 | 1<<1 | 1<<4 | 1<<6); + PORTD &= ~(1<<0 | 1<<1 | 1<<4 | 1<<6); +} + +void backlight_set(uint8_t level) { + if (level == 0) { + // Turn out the lights + PORTD &= ~(1<<0 | 1<<1 | 1<<4 | 1<<6); + } else { + // Turn on the lights + PORTD |= (1<<0 | 1<<1 | 1<<4 | 1<<6); + } +} diff --git a/keyboards/panc60/rules.mk b/keyboards/panc60/rules.mk index fcb14d0ae0ac..588562a95b40 100644 --- a/keyboards/panc60/rules.mk +++ b/keyboards/panc60/rules.mk @@ -36,8 +36,8 @@ MOUSEKEY_ENABLE = yes EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = yes COMMAND_ENABLE = yes -BACKLIGHT_ENABLE = no -RGBLIGHT_ENABLE = no +BACKLIGHT_ENABLE = yes +RGBLIGHT_ENABLE = yes RGBLIGHT_CUSTOM_DRIVER = yes OPT_DEFS = -DDEBUG_LEVEL=0 From f16b5cc92b1fb3f5c551d009b11f291ee650b432 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 26 Oct 2018 21:21:43 -0700 Subject: [PATCH 285/505] Add delayed flashing option for DFU Util (#4225) * Add delayed flashing option for DFU Util * Use a loop to make code cleaner * Make delay configurable but default to 10 * Better formatting of check --- tmk_core/chibios.mk | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tmk_core/chibios.mk b/tmk_core/chibios.mk index 014c8d502ad9..0f665450ac56 100644 --- a/tmk_core/chibios.mk +++ b/tmk_core/chibios.mk @@ -233,6 +233,24 @@ qmk: $(BUILD_DIR)/$(TARGET).bin dfu-util: $(BUILD_DIR)/$(TARGET).bin cpfirmware sizeafter $(DFU_UTIL) $(DFU_ARGS) -D $(BUILD_DIR)/$(TARGET).bin + +ifneq ($(strip $(TIME_DELAY)),) + TIME_DELAY = $(strip $(TIME_DELAY)) +else + TIME_DELAY = 10 +endif +dfu-util-wait: $(BUILD_DIR)/$(TARGET).bin cpfirmware sizeafter + echo "Preparing to flash firmware. Please enter bootloader now..." ;\ + COUNTDOWN=$(TIME_DELAY) ;\ + while [[ $$COUNTDOWN -ge 1 ]] ; do \ + echo "Flashing in $$COUNTDOWN ..."; \ + sleep 1 ;\ + ((COUNTDOWN = COUNTDOWN - 1)) ; \ + done; \ + echo "Flashing $(TARGET).bin" ;\ + sleep 1 ;\ + $(DFU_UTIL) $(DFU_ARGS) -D $(BUILD_DIR)/$(TARGET).bin + st-link-cli: $(BUILD_DIR)/$(TARGET).hex sizeafter $(ST_LINK_CLI) $(ST_LINK_ARGS) -q -c SWD -p $(BUILD_DIR)/$(TARGET).hex -Rst From d210ac7a3ea9a6049f2c344d3a44fdc1bccd1f1b Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 25 Oct 2018 09:01:31 -0700 Subject: [PATCH 286/505] Add caveat for basic keycodes in Tap Dance docs --- docs/feature_tap_dance.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/feature_tap_dance.md b/docs/feature_tap_dance.md index 93d190883147..b2b567f1d07d 100644 --- a/docs/feature_tap_dance.md +++ b/docs/feature_tap_dance.md @@ -26,6 +26,8 @@ This array specifies what actions shall be taken when a tap-dance key is in acti The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise. +!> Keep in mind that only [basic keycodes](keycodes_basic.md) are supported here. Custom keycodes are not supported. + And that's the bulk of it! And now, on to the explanation of how it works! From 73e92ef0c06de389d39d3ca0a8c98da2196ebec7 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 26 Oct 2018 21:22:47 -0700 Subject: [PATCH 287/505] Docs: Add references to One Shot functions, and clean up formatting (#4189) * Docs: Add references to One Shot functions, and clean up formatting * Update PR based on @mechmerlin's recommendations --- docs/feature_advanced_keycodes.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index 85f4fa1bfcc9..f2e4909d861b 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -142,6 +142,8 @@ For example, if you define a key as `OSM(MOD_LSFT)`, you can type a capital A ch One shot keys also work as normal modifiers. If you hold down a one shot key and type other keys, your one shot will be released immediately after you let go of the key. +Additionally, hitting keys five times in a short period will lock that key. This applies for both One Shot Modifiers and One Shot Layers, and is controlled by the `ONESHOT_TAP_TOGGLE` define. + You can control the behavior of one shot keys by defining these in `config.h`: ```c @@ -152,15 +154,20 @@ You can control the behavior of one shot keys by defining these in `config.h`: * `OSM(mod)` - Momentarily hold down *mod*. You must use the `MOD_*` keycodes as shown in [Mod Tap](#mod-tap), not the `KC_*` codes. * `OSL(layer)` - momentary switch to *layer*. -Sometimes, you want to activate a one-shot layer as part of a macro or tap dance routine. To do this, you need to call `set_oneshot_layer(LAYER, ONESHOT_START)` on key down, and `set_oneshot_layer(ONESHOT_PRESSED)` on key up. If you want to cancel the oneshot, call `reset_oneshot_layer()`. For more complicated actions, take a look at the oneshot implementation in [`process_record`](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/action.c#L429). +Sometimes, you want to activate a one-shot key as part of a macro or tap dance routine. + +For one shot layers, you need to call `set_oneshot_layer(LAYER, ONESHOT_START)` on key down, and `set_oneshot_layer(ONESHOT_PRESSED)` on key up. If you want to cancel the oneshot, call `reset_oneshot_layer()`. + +For one shot mods, you need to call `set_oneshot_mods(MOD)` to set it, or `clear_oneshot_mods()` to cancel it. + +!> If you're having issues with OSM translating over Remote Desktop Connection, this can be fixed by opening the settings, going to the "Local Resources" tap, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue and allow OSM to function properly over Remote Desktop. -If you're having issues with OSM translating over Remote Desktop Connection, this can be fixed by clicking on "Show Options", going to the "Local Resources" tab, and in the keyboard section, change the drop down to "On this Computer". This will fix the issue and allow OSM to function properly over Remote Desktop. # Permissive Hold As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new `config.h` option: -``` +```c #define PERMISSIVE_HOLD ``` @@ -205,6 +212,6 @@ With `TAPPING_FORCE_HOLD`, the second press will be interpreted as a Shift, allo # Retro Tapping -When you hold a dual function key, and haven't pressed anything when you release the key, normally nothing happens. However, if you enable this, if you release the key without pressing another key, it will send the original key, even if it is outside of the tapping term. +Holding and releasing a dual function key without pressing another key will result in nothing happening. With retro tapping enabled, releasing the key without pressing another will send the original keycode even if it is outside the tapping term. -For instance, if you're using `LT(2, KC_SPACE)`, if you hold the key, don't hit anything else and then release it, normally, nothing happens. But with `RETRO_TAPPING` defined in your `config.h`, it will send `KC_SPACE`. +For instance, holding and releasing `LT(2, KC_SPACE)` without hitting another key will result in nothing happening. With `RETRO_TAPPING` defined in your `config.h`, it will send `KC_SPACE`. From 23cd9f4dee791464196faaf6692599325cfe6f3c Mon Sep 17 00:00:00 2001 From: Monksoffunk Date: Sat, 27 Oct 2018 13:23:49 +0900 Subject: [PATCH 288/505] Keyboard: Add new keyboard Zinc (#4245) * Add Zinc keyboard * Fix photo * Fix readme.md * Fix RGB LED init of monks/keymap.c * Fix default keymap and readme.jp * Fix change DEFS of RGB ANIMATIONS to LED_ANIMATIONS * Add EOL * Use serial_config_simpleapi.h * Fix comment char * Fix error handling in split_scomm.c : mtei works * Fix keymaps * Remove DISABLE_LEADER definition * Remove pro_micro.h * Add 2 spaces after Hardware name * Fix keymaps - remove audio codes - change LAYOUT to LAYOUT_ortho_4X12 - change "persistent_default_layer_set" to core function * Use the Community Layouts feature - with some clean up --- keyboards/zinc/config.h | 50 ++ keyboards/zinc/i2c.c | 162 ++++++ keyboards/zinc/i2c.h | 49 ++ keyboards/zinc/info.json | 13 + keyboards/zinc/keymaps/default/config.h | 38 ++ keyboards/zinc/keymaps/default/keymap.c | 306 ++++++++++ keyboards/zinc/keymaps/default/readme_jp.md | 123 ++++ keyboards/zinc/keymaps/default/rules.mk | 98 ++++ keyboards/zinc/keymaps/monks/config.h | 38 ++ keyboards/zinc/keymaps/monks/keymap.c | 255 ++++++++ keyboards/zinc/keymaps/monks/readme_jp.md | 103 ++++ keyboards/zinc/keymaps/monks/rules.mk | 100 ++++ keyboards/zinc/readme.md | 17 + keyboards/zinc/rev1/config.h | 149 +++++ keyboards/zinc/rev1/info.json | 13 + keyboards/zinc/rev1/matrix.c | 356 ++++++++++++ keyboards/zinc/rev1/rev1.c | 6 + keyboards/zinc/rev1/rev1.h | 44 ++ keyboards/zinc/rev1/rules.mk | 4 + keyboards/zinc/rev1/serial_config.h | 18 + keyboards/zinc/rev1/serial_config_simpleapi.h | 8 + keyboards/zinc/rev1/split_scomm.c | 95 +++ keyboards/zinc/rev1/split_scomm.h | 24 + keyboards/zinc/rev1/split_util.c | 70 +++ keyboards/zinc/rev1/split_util.h | 19 + keyboards/zinc/reva/config.h | 143 +++++ keyboards/zinc/reva/info.json | 13 + keyboards/zinc/reva/matrix.c | 356 ++++++++++++ keyboards/zinc/reva/reva.c | 6 + keyboards/zinc/reva/reva.h | 44 ++ keyboards/zinc/reva/rules.mk | 4 + keyboards/zinc/reva/serial_config.h | 18 + keyboards/zinc/reva/serial_config_simpleapi.h | 8 + keyboards/zinc/reva/split_scomm.c | 95 +++ keyboards/zinc/reva/split_scomm.h | 24 + keyboards/zinc/reva/split_util.c | 70 +++ keyboards/zinc/reva/split_util.h | 19 + keyboards/zinc/rules.mk | 72 +++ keyboards/zinc/serial.c | 542 ++++++++++++++++++ keyboards/zinc/serial.h | 84 +++ keyboards/zinc/zinc.c | 1 + keyboards/zinc/zinc.h | 14 + 42 files changed, 3671 insertions(+) create mode 100644 keyboards/zinc/config.h create mode 100644 keyboards/zinc/i2c.c create mode 100644 keyboards/zinc/i2c.h create mode 100644 keyboards/zinc/info.json create mode 100644 keyboards/zinc/keymaps/default/config.h create mode 100644 keyboards/zinc/keymaps/default/keymap.c create mode 100644 keyboards/zinc/keymaps/default/readme_jp.md create mode 100644 keyboards/zinc/keymaps/default/rules.mk create mode 100644 keyboards/zinc/keymaps/monks/config.h create mode 100644 keyboards/zinc/keymaps/monks/keymap.c create mode 100644 keyboards/zinc/keymaps/monks/readme_jp.md create mode 100644 keyboards/zinc/keymaps/monks/rules.mk create mode 100644 keyboards/zinc/readme.md create mode 100644 keyboards/zinc/rev1/config.h create mode 100644 keyboards/zinc/rev1/info.json create mode 100644 keyboards/zinc/rev1/matrix.c create mode 100644 keyboards/zinc/rev1/rev1.c create mode 100644 keyboards/zinc/rev1/rev1.h create mode 100644 keyboards/zinc/rev1/rules.mk create mode 100644 keyboards/zinc/rev1/serial_config.h create mode 100644 keyboards/zinc/rev1/serial_config_simpleapi.h create mode 100644 keyboards/zinc/rev1/split_scomm.c create mode 100644 keyboards/zinc/rev1/split_scomm.h create mode 100644 keyboards/zinc/rev1/split_util.c create mode 100644 keyboards/zinc/rev1/split_util.h create mode 100644 keyboards/zinc/reva/config.h create mode 100644 keyboards/zinc/reva/info.json create mode 100644 keyboards/zinc/reva/matrix.c create mode 100644 keyboards/zinc/reva/reva.c create mode 100644 keyboards/zinc/reva/reva.h create mode 100644 keyboards/zinc/reva/rules.mk create mode 100644 keyboards/zinc/reva/serial_config.h create mode 100644 keyboards/zinc/reva/serial_config_simpleapi.h create mode 100644 keyboards/zinc/reva/split_scomm.c create mode 100644 keyboards/zinc/reva/split_scomm.h create mode 100644 keyboards/zinc/reva/split_util.c create mode 100644 keyboards/zinc/reva/split_util.h create mode 100644 keyboards/zinc/rules.mk create mode 100644 keyboards/zinc/serial.c create mode 100644 keyboards/zinc/serial.h create mode 100644 keyboards/zinc/zinc.c create mode 100644 keyboards/zinc/zinc.h diff --git a/keyboards/zinc/config.h b/keyboards/zinc/config.h new file mode 100644 index 000000000000..9c60d631bce3 --- /dev/null +++ b/keyboards/zinc/config.h @@ -0,0 +1,50 @@ +/* +Copyright 2012 Jun Wako +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 . +*/ + +#pragma once +//#ifndef CONFIG_H +//#define CONFIG_H + +#include "config_common.h" + +// GCC include 'config.h" sequence in qmk_firmware/keyboards/zinc/ +// -include keyboards/zinc/config.h +// -include keyboards/zinc/rev?/config.h +// -include keyboards/zinc/rev?/keymaps/MAPNAME/config.h +// XXXX.c + +#include + +// GCC include search path in qmk_firmare/keyboards/zinc/ +// #include "..." search starts here: +// #include <...> search starts here: +// keyboards/zinc/rev?/keymaps/MAPNAME +// keyboards/zinc +// keyboards/zinc/rev? +// . +// ./tmk_core +// ...... + +#ifdef USE_Link_Time_Optimization + // LTO has issues with macros (action_get_macro) and "functions" (fn_actions), + // so just disable them + #define NO_ACTION_MACRO + #define NO_ACTION_FUNCTION +#endif // USE_Link_Time_Optimization + +//#endif /* CONFIG_H */ diff --git a/keyboards/zinc/i2c.c b/keyboards/zinc/i2c.c new file mode 100644 index 000000000000..4bee5c639829 --- /dev/null +++ b/keyboards/zinc/i2c.c @@ -0,0 +1,162 @@ +#include +#include +#include +#include +#include +#include +#include "i2c.h" + +#ifdef USE_I2C + +// Limits the amount of we wait for any one i2c transaction. +// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is +// 9 bits, a single transaction will take around 90μs to complete. +// +// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit +// poll loop takes at least 8 clock cycles to execute +#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8 + +#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE) + +volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; + +static volatile uint8_t slave_buffer_pos; +static volatile bool slave_has_register_set = false; + +// Wait for an i2c operation to finish +inline static +void i2c_delay(void) { + uint16_t lim = 0; + while(!(TWCR & (1<10. + // Check datasheets for more info. + TWBR = ((F_CPU/SCL_CLOCK)-16)/2; +} + +// Start a transaction with the given i2c slave address. The direction of the +// transfer is set with I2C_READ and I2C_WRITE. +// returns: 0 => success +// 1 => error +uint8_t i2c_master_start(uint8_t address) { + TWCR = (1< slave ACK +// 1 => slave NACK +uint8_t i2c_master_write(uint8_t data) { + TWDR = data; + TWCR = (1<= SLAVE_BUFFER_SIZE ) { + ack = 0; + slave_buffer_pos = 0; + } + slave_has_register_set = true; + } else { + i2c_slave_buffer[slave_buffer_pos] = TWDR; + BUFFER_POS_INC(); + } + break; + + case TW_ST_SLA_ACK: + case TW_ST_DATA_ACK: + // master has addressed this device as a slave transmitter and is + // requesting data. + TWDR = i2c_slave_buffer[slave_buffer_pos]; + BUFFER_POS_INC(); + break; + + case TW_BUS_ERROR: // something went wrong, reset twi state + TWCR = 0; + default: + break; + } + // Reset everything, so we are ready for the next TWI interrupt + TWCR |= (1< + +#ifndef F_CPU +#define F_CPU 16000000UL +#endif + +#define I2C_READ 1 +#define I2C_WRITE 0 + +#define I2C_ACK 1 +#define I2C_NACK 0 + +#define SLAVE_BUFFER_SIZE 0x10 + +// i2c SCL clock frequency 400kHz +#define SCL_CLOCK 400000L + +extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; + +void i2c_master_init(void); +uint8_t i2c_master_start(uint8_t address); +void i2c_master_stop(void); +uint8_t i2c_master_write(uint8_t data); +uint8_t i2c_master_read(int); +void i2c_reset_state(void); +void i2c_slave_init(uint8_t address); + + +static inline unsigned char i2c_start_read(unsigned char addr) { + return i2c_master_start((addr << 1) | I2C_READ); +} + +static inline unsigned char i2c_start_write(unsigned char addr) { + return i2c_master_start((addr << 1) | I2C_WRITE); +} + +// from SSD1306 scrips +extern unsigned char i2c_rep_start(unsigned char addr); +extern void i2c_start_wait(unsigned char addr); +extern unsigned char i2c_readAck(void); +extern unsigned char i2c_readNak(void); +extern unsigned char i2c_read(unsigned char ack); + +#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); + +#endif diff --git a/keyboards/zinc/info.json b/keyboards/zinc/info.json new file mode 100644 index 000000000000..740f31ae6e1d --- /dev/null +++ b/keyboards/zinc/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "Zinc", + "url": "https://github.com/monksoffunk/", + "maintainer": "monksoffunk", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT": { + "key_count": 48, + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":13, "y":1}, {"x":14, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}] + } + } +} diff --git a/keyboards/zinc/keymaps/default/config.h b/keyboards/zinc/keymaps/default/config.h new file mode 100644 index 000000000000..4dcb0724ff75 --- /dev/null +++ b/keyboards/zinc/keymaps/default/config.h @@ -0,0 +1,38 @@ +/* +This is the c configuration file for the keymap + +Copyright 2018 monksoffunk +Copyright 2012 Jun Wako +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 . +*/ + +#pragma once +// if you need more program area, try uncomment follow line +#include "serial_config_simpleapi.h" + +// place overrides here +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif diff --git a/keyboards/zinc/keymaps/default/keymap.c b/keyboards/zinc/keymaps/default/keymap.c new file mode 100644 index 000000000000..7729914eccb5 --- /dev/null +++ b/keyboards/zinc/keymaps/default/keymap.c @@ -0,0 +1,306 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#ifdef RGBLIGHT_ENABLE +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; +rgblight_config_t RGB_current_config; +#endif + +extern uint8_t is_master; + +// 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. +enum layer_number { + _QWERTY = 0, + _COLEMAK, + _DVORAK, + _LOWER, + _RAISE, + _ADJUST +}; + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST, + BACKLIT, + KANA, + EISU, + RGBRST +}; + +enum macro_keycodes { + KC_SAMPLEMACRO, +}; + +//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 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc |ADJUST| Win | Alt |LOWER |Space | | Space| RAISE| Left | Down | Up | Right| + * `-----------------------------------------' `-----------------------------------------' + */ +[_QWERTY] = LAYOUT_ortho_4x12( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + KC_ESC, ADJUST, KC_LGUI, KC_LALT, 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 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc |ADJUST| Alt | Win |LOWER |Space | | Space| RAISE| Left | Down | Up | Right| + * `-----------------------------------------' `-----------------------------------------' + */ + [_COLEMAK] = LAYOUT_ortho_4x12( \ + 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_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + KC_ESC, ADJUST, 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 | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | O | E | U | I | | D | H | T | N | S | / | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc |ADJUST| Alt | Win |LOWER |Space | | Space| RAISE| Left | Down | Up | Right| + * `-----------------------------------------' `-----------------------------------------' + */ + [_DVORAK] = LAYOUT_ortho_4x12( \ + 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_LCTL, 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_ESC, ADJUST, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + ), + + /* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | - | _ | + | { | } | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | Home | End | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------' `-----------------------------------------' + */ + [_LOWER] = LAYOUT_ortho_4x12( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ + _______, _______, _______, _______, _______, _______, KC_MINS, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_END, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ), + + /* Raise + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | F12 | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------' `-----------------------------------------' + */ + [_RAISE] = LAYOUT_ortho_4x12( \ + 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_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ), + + /* Adjust (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | | Reset|RGBRST|Aud on|Audoff| | | |Qwerty|Colemk|Dvorak| | Ins | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | |RGB ON| HUE+ | SAT+ | VAL+ | Mac | | Win | - | = |Print |ScLock|Pause | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | MODE | HUE- | SAT- | VAL- | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | EISU | EISU | EISU | | KANA | KANA | Home |PageDn|PageUp| End | + * `-----------------------------------------' `-----------------------------------------' + */ + [_ADJUST] = LAYOUT_ortho_4x12( \ + _______, RESET, RGBRST, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, _______, KC_INS, \ + _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, AG_NORM, AG_SWAP, KC_MINS, KC_EQL, KC_PSCR, KC_SLCK, KC_PAUS,\ + _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______,\ + _______, _______, _______, EISU, EISU, EISU, KANA, KANA, KC_HOME, KC_PGDN, KC_PGUP, KC_END\ + ) +}; + +// define variables for reactive RGB +bool TOG_STATUS = false; + +// 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)) { + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGB_current_config.mode); + #endif + 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) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_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; + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(16); + #endif + } + layer_on(_LOWER); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } else { + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGB_current_config.mode); // revert RGB to initial mode prior to RGB mode change + #endif + 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; + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(15); + #endif + } + layer_on(_RAISE); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } else { + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGB_current_config.mode); // revert RGB to initial mode prior to RGB mode change + #endif + layer_off(_RAISE); + TOG_STATUS = false; + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + 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: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + rgblight_mode_noeeprom(RGB_current_config.mode); + rgblight_step(); + RGB_current_config.mode = rgblight_config.mode; + } + #endif + return false; + break; + + case EISU: + if (record->event.pressed) { + if(keymap_config.swap_lalt_lgui==false){ + register_code(KC_LANG2); + }else{ + SEND_STRING(SS_LALT("`")); + } + } else { + unregister_code(KC_LANG2); + } + return false; + break; + case KANA: + if (record->event.pressed) { + if(keymap_config.swap_lalt_lgui==false){ + register_code(KC_LANG1); + }else{ + SEND_STRING(SS_LALT("`")); + } + } else { + unregister_code(KC_LANG1); + } + return false; + break; + + case RGBRST: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + eeconfig_update_rgblight_default(); + rgblight_enable(); + RGB_current_config = rgblight_config; + } + #endif + break; + } + return true; +} + + +void matrix_init_user(void) { + #ifdef RGBLIGHT_ENABLE + rgblight_init(); + RGB_current_config = rgblight_config; + #endif +} + + diff --git a/keyboards/zinc/keymaps/default/readme_jp.md b/keyboards/zinc/keymaps/default/readme_jp.md new file mode 100644 index 000000000000..f6e91f0c8909 --- /dev/null +++ b/keyboards/zinc/keymaps/default/readme_jp.md @@ -0,0 +1,123 @@ +# The Default Zinc Layout +## 配列 + +### Qwerty配列 + +``` + ,-----------------------------------------. ,-----------------------------------------. + | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Esc | Fn | Alt | Win |Lower |Space | | Space| Raise| Left | Down | Up | Right| + `------------------------------------------ ------------------------------------------' +``` + +### Colemak + +``` + ,-----------------------------------------. ,-----------------------------------------. + | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Esc |ADJUST| Alt | Win |LOWER |Space | | Space| RAISE| Left | Down | Up | Right| + `------------------------------------------ ------------------------------------------' +``` + +### Dvorak + +``` + ,-----------------------------------------. ,-----------------------------------------. + | Tab | ' | , | . | P | Y | | F | G | C | R | L | Del | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Ctrl | A | O | E | U | I | | D | H | T | N | S | / | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Esc |ADJUST| Alt | Win |LOWER |Space | | Space| RAISE| Left | Down | Up | Right| + `-----------------------------------------' `-----------------------------------------' +``` + + +## コンパイルの仕方 + +コンパイルは、qmk_firmware のトップディレクトリで行います。 + +``` +$ cd qmk_firmware +``` +qmk_firmwareでは各キーボードのコンパイルは、`<キーボード名>:<キーマップ名>`という指定で行います。 + +``` +$ make zinc:default +``` + +キーボードへの書き込みまで同時に行うには下記のように`:avrdude`を付けます。 + +``` +$ make zinc:default:avrdude +``` + +コンパイル結果と中間生成物を消去したい場合は以下のようにします。 + +``` +$ make zinc:default:clean +``` + +## カスタマイズ + +コマンドラインからオプションを指定してビルドすることが出来ます。 + +``` +# Zinc keyboard 'default' keymap: convenient command line option +make ZINC= zinc:defualt +# option= back | under | na | ios +# ex. +# make ZINC=under zinc:defualt +# make ZINC=under,ios zinc:defualt +# make ZINC=back zinc:default +# make ZINC=back,na zinc:default +# make ZINC=back,ios zinc:default +``` + +あるいは`qmk_firmware/keyboards/zinc/rev1/keymaps/default/rules.mk` の以下の部分を直接編集して機能を有効化してください。 + +``` +# Zinc keyboard customize +LED_BACK_ENABLE = no # LED backlight (Enable SK6812mini backlight) +LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight) +LED_ANIMATIONS = yes # LED animations +IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) + + +``` + +## RGB backlight を有効にする + +rules.mk の下記の部分を編集して no を yes に変更してください。 +``` +LED_BACK_ENABLE = yes # LED backlight (Enable SK6812mini backlight) +``` + + +## RGB Underglow を有効にする + +rules.mk の下記の部分を編集して no を yes に変更してください。 +``` +LED_UNDERGLOW_ENABLE = yes # LED underglow (Enable WS2812 RGB underlight.) +``` + + +## iPad/iPhoneサポートを有効にする。 + +rules.mk の下記の部分を編集して no を yes に変更してください。 +RBG Underglow や RGBバックライトの輝度を抑えて、iPad, iPhone にも接続できるようになります。 + +``` +IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) +``` \ No newline at end of file diff --git a/keyboards/zinc/keymaps/default/rules.mk b/keyboards/zinc/keymaps/default/rules.mk new file mode 100644 index 000000000000..2dcefc0016d0 --- /dev/null +++ b/keyboards/zinc/keymaps/default/rules.mk @@ -0,0 +1,98 @@ + +# 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 +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. +SWAP_HANDS_ENABLE = no # Enable one-hand typing + +define ZINC_CUSTOMISE_MSG + $(info Zinc customize) + $(info - LED_BACK_ENABLE=$(LED_BACK_ENABLE)) + $(info - LED_UNDERGLOW_ENABLE=$(LED_UNDERGLOW_ENABLE)) + $(info - LED_ANIMATION=$(LED_ANIMATIONS)) + $(info - IOS_DEVICE_ENABLE=$(IOS_DEVICE_ENABLE)) +endef + +# Zinc keyboard customize +LED_BACK_ENABLE = no # LED backlight (Enable SK6812mini backlight) +LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight) +LED_ANIMATIONS = yes # LED animations +IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) +Link_Time_Optimization = no # if firmware size over limit, try this option + +#### LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE. +#### Do not enable these with audio at the same time. + +### Zinc keyboard 'default' keymap: convenient command line option +## make ZINC= zinc:defualt +## option= back | under | na | ios +## ex. +## make ZINC=under zinc:defualt +## make ZINC=under,ios zinc:defualt +## make ZINC=back zinc:default +## make ZINC=back,na zinc:default +## make ZINC=back,ios zinc:default + +ifneq ($(strip $(ZINC)),) + ifeq ($(findstring back,$(ZINC)), back) + LED_BACK_ENABLE = yes + else ifeq ($(findstring under,$(ZINC)), under) + LED_UNDERGLOW_ENABLE = yes + endif + ifeq ($(findstring na,$(ZINC)), na) + LED_ANIMATIONS = no + endif + ifeq ($(findstring ios,$(ZINC)), ios) + IOS_DEVICE_ENABLE = yes + endif + $(eval $(call ZINC_CUSTOMISE_MSG)) + $(info ) +endif + +ifeq ($(strip $(LED_BACK_ENABLE)), yes) + RGBLIGHT_ENABLE = yes + OPT_DEFS += -DRGBLED_BACK + ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) + $(eval $(call ZINC_CUSTOMISE_MSG)) + $(error LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE both 'yes') + endif +else ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) + RGBLIGHT_ENABLE = yes +else + RGBLIGHT_ENABLE = no +endif + +ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) + OPT_DEFS += -DIOS_DEVICE_ENABLE +endif + +ifeq ($(strip $(LED_ANIMATIONS)), yes) +# OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS + +endif + +ifeq ($(strip $(Link_Time_Optimization)),yes) + EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization +endif + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + + +# Uncomment these for debugging +# $(info -- RGBLIGHT_ENABLE=$(RGBLIGHT_ENABLE)) +# $(info -- OPT_DEFS=$(OPT_DEFS)) +# $(info ) diff --git a/keyboards/zinc/keymaps/monks/config.h b/keyboards/zinc/keymaps/monks/config.h new file mode 100644 index 000000000000..4dcb0724ff75 --- /dev/null +++ b/keyboards/zinc/keymaps/monks/config.h @@ -0,0 +1,38 @@ +/* +This is the c configuration file for the keymap + +Copyright 2018 monksoffunk +Copyright 2012 Jun Wako +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 . +*/ + +#pragma once +// if you need more program area, try uncomment follow line +#include "serial_config_simpleapi.h" + +// place overrides here +// Selection of RGBLIGHT MODE to use. +#if defined(LED_ANIMATIONS) + #define RGBLIGHT_EFFECT_BREATHING + #define RGBLIGHT_EFFECT_RAINBOW_MOOD + #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + #define RGBLIGHT_EFFECT_SNAKE + #define RGBLIGHT_EFFECT_KNIGHT + #define RGBLIGHT_EFFECT_CHRISTMAS + #define RGBLIGHT_EFFECT_STATIC_GRADIENT + //#define RGBLIGHT_EFFECT_RGB_TEST + //#define RGBLIGHT_EFFECT_ALTERNATING +#endif diff --git a/keyboards/zinc/keymaps/monks/keymap.c b/keyboards/zinc/keymaps/monks/keymap.c new file mode 100644 index 000000000000..5fd7c6aa857d --- /dev/null +++ b/keyboards/zinc/keymaps/monks/keymap.c @@ -0,0 +1,255 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +#ifdef RGBLIGHT_ENABLE +//Following line allows macro to read current RGB settings +extern rgblight_config_t rgblight_config; +rgblight_config_t RGB_current_config; +#endif + +extern uint8_t is_master; + +// 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. +enum layer_number { + _QWERTY = 0, + _LOWER, + _RAISE, + _ADJUST +}; + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + ADJUST, + BACKLIT, + KANA, + EISU, + RGBRST +}; + +enum macro_keycodes { + KC_SAMPLEMACRO, +}; + + +//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 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc |ADJUST| Alt | GUI |LOWER |Space | | Space| RAISE| KANA | Left | Down | Right| + * `-----------------------------------------' `-----------------------------------------' + */ +[_QWERTY] = LAYOUT_ortho_4x12( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \ + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \ + KC_ESC, ADJUST, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_RGHT \ + ), + + /* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | - | _ | + | { | } | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | UP | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * `-----------------------------------------' `-----------------------------------------' + */ + [_LOWER] = LAYOUT_ortho_4x12( \ + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ + _______, _______, _______, _______, _______, _______, KC_MINS, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), + + /* Raise + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | | F12 | | | | ? | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------' `-----------------------------------------' + */ + [_RAISE] = LAYOUT_ortho_4x12( \ + 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_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, S(KC_SLSH), _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ + ), + + /* Adjust (Lower + Raise) + * ,-----------------------------------------. ,-----------------------------------------. + * | | Reset|RGBRST| | | | | | | | | | Ins | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | |RGB ON| HUE+ | SAT+ | VAL+ | Mac | | Win | - | = |Print |ScLock|Pause | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | MODE | HUE- | SAT- | VAL- | | | | | | |PageUp| | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | EISU | EISU | EISU | | KANA | KANA | KANA | Home |PageDn| End | + * `-----------------------------------------' `-----------------------------------------' + */ + [_ADJUST] = LAYOUT_ortho_4x12( \ + _______, RESET, RGBRST, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, \ + _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, AG_NORM, AG_SWAP, KC_MINS, KC_EQL, KC_PSCR, KC_SLCK, KC_PAUS,\ + _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, KC_PGUP, _______,\ + _______, _______, _______, EISU, EISU, EISU, KANA, KANA, KANA, KC_HOME, KC_PGDN, KC_END\ + ) +}; + +// define variables for reactive RGB +bool TOG_STATUS = false; + +// 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)) { + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGB_current_config.mode); + #endif + 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) { + set_single_persistent_default_layer(_QWERTY); + } + 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; + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(16); + #endif + } + layer_on(_LOWER); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } else { + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGB_current_config.mode); // revert RGB to initial mode prior to RGB mode change + #endif + 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; + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(15); + #endif + } + layer_on(_RAISE); + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } else { + #ifdef RGBLIGHT_ENABLE + rgblight_mode_noeeprom(RGB_current_config.mode); // revert RGB to initial mode prior to RGB mode change + #endif + layer_off(_RAISE); + TOG_STATUS = false; + update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); + } + return false; + break; + + case ADJUST: + if (record->event.pressed) { + layer_on(_ADJUST); + } else { + layer_off(_ADJUST); + } + 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: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + rgblight_mode_noeeprom(RGB_current_config.mode); + rgblight_step(); + RGB_current_config.mode = rgblight_config.mode; + } + #endif + return false; + break; + + case EISU: + if (record->event.pressed) { + if(keymap_config.swap_lalt_lgui==false){ + register_code(KC_LANG2); + }else{ + SEND_STRING(SS_LALT("`")); + } + } else { + unregister_code(KC_LANG2); + } + return false; + break; + case KANA: + if (record->event.pressed) { + if(keymap_config.swap_lalt_lgui==false){ + register_code(KC_LANG1); + }else{ + SEND_STRING(SS_LALT("`")); + } + } else { + unregister_code(KC_LANG1); + } + return false; + break; + + case RGBRST: + #ifdef RGBLIGHT_ENABLE + if (record->event.pressed) { + eeconfig_update_rgblight_default(); + rgblight_enable(); + RGB_current_config = rgblight_config; + } + #endif + break; + } + return true; +} + + +void matrix_init_user(void) { + #ifdef RGBLIGHT_ENABLE + rgblight_init(); + RGB_current_config = rgblight_config; + #endif +} diff --git a/keyboards/zinc/keymaps/monks/readme_jp.md b/keyboards/zinc/keymaps/monks/readme_jp.md new file mode 100644 index 000000000000..680e2866c52d --- /dev/null +++ b/keyboards/zinc/keymaps/monks/readme_jp.md @@ -0,0 +1,103 @@ +# monksoffunk's personal zinc Layout +## 配列 + +### Qwerty配列 + +``` + ,-----------------------------------------. ,-----------------------------------------. + | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter | + |------+------+------+------+------+------| |------+------+------+------+------+------| + | Esc |ADJUST| Alt | GUI |LOWER |Space | | Space| RAISE| KANA | Left | Down | Right| + `------------------------------------------ ------------------------------------------' +``` + +KANAキーを独立させ、UPキーをLOWER+スラッシュに当てています。そのほかデフォルトからレイヤーをかなりいじっています。 +また、RGB LEDがアンコメントしてありますので、実装していない場合はソースを見て適宜コメントアウトしてください。 + +## コンパイルの仕方 + +コンパイルは、qmk_firmware のトップディレクトリで行います。 + +``` +$ cd qmk_firmware +``` +qmk_firmwareでは各キーボードのコンパイルは、`<キーボード名>:<キーマップ名>`という指定で行います。 + +``` +$ make zinc:monks +``` + +キーボードへの書き込みまで同時に行うには下記のように`:avrdude`を付けます。 + +``` +$ make zinc:monks:avrdude +``` + +コンパイル結果と中間生成物を消去したい場合は以下のようにします。 + +``` +$ make zinc:monks:clean +``` + +なお、avrdudeではなくQMK Toolbox(GUIツール)を使う方法もあります。 + +https://github.com/qmk/qmk_toolbox/releases + +その場合は、$ make zinc:monksでビルドした成果物をQMK Toolboxから指定してください。 + +## カスタマイズ + +コマンドラインからオプションを指定してビルドすることが出来ます。 + +``` +# Zinc keyboard 'monks' keymap: convenient command line option +make ZINC= zinc:monks +# option= back | under | na | ios +# ex. +# make ZINC=under zinc:monks +# make ZINC=under,ios zinc:monks +# make ZINC=back zinc:monks +# make ZINC=back,na zinc:monks +# make ZINC=back,ios zinc:monks +``` + +あるいは`qmk_firmware/keyboards/zinc/rev1/keymaps/monks/rules.mk` の以下の部分を編集して機能を有効化してください。 + +``` +# Zinc keyboard customize +LED_BACK_ENABLE = no # LED backlight (Enable SK6812mini backlight) +LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight) +LED_ANIMATIONS = yes # LED animations +IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) + + +``` + +## RGB backlight を有効にする + +rules.mk の下記の部分を編集して no を yes に変更してください。 +``` +LED_BACK_ENABLE = yes # LED backlight (Enable SK6812mini backlight) +``` + + +## RGB Underglow を有効にする + +rules.mk の下記の部分を編集して no を yes に変更してください。 +``` +LED_UNDERGLOW_ENABLE = yes # LED underglow (Enable WS2812 RGB underlight) +``` + + +## iPad/iPhoneサポートを有効にする。 + +rules.mk の下記の部分を編集して no を yes に変更してください。 +RBG Underglow や RGBバックライトの輝度を抑えて、iPad, iPhone にも接続できるようになります。 + +``` +IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) +``` \ No newline at end of file diff --git a/keyboards/zinc/keymaps/monks/rules.mk b/keyboards/zinc/keymaps/monks/rules.mk new file mode 100644 index 000000000000..a5335def8718 --- /dev/null +++ b/keyboards/zinc/keymaps/monks/rules.mk @@ -0,0 +1,100 @@ + +# 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 +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. +SWAP_HANDS_ENABLE = no # Enable one-hand typing + +define ZINC_CUSTOMISE_MSG + $(info Zinc customize) + $(info - LED_BACK_ENABLE=$(LED_BACK_ENABLE)) + $(info - LED_UNDERGLOW_ENABLE=$(LED_UNDERGLOW_ENABLE)) + $(info - LED_ANIMATION=$(LED_ANIMATIONS)) + $(info - IOS_DEVICE_ENABLE=$(IOS_DEVICE_ENABLE)) +endef + +# Zinc keyboard customize +LED_BACK_ENABLE = no # LED backlight (Enable SK6812mini backlight) +LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight) +LED_ANIMATIONS = yes # LED animations +IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone) +Link_Time_Optimization = no # if firmware size over limit, try this option + +#### LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE. +#### Do not enable these with audio at the same time. + +### Zinc keyboard 'default' keymap: convenient command line option +## make ZINC= zinc:defualt +## option= back | under | na | ios +## ex. +## make ZINC=under zinc:defualt +## make ZINC=under,ios zinc:defualt +## make ZINC=back zinc:default +## make ZINC=back,na zinc:default +## make ZINC=back,ios zinc:default + +ifneq ($(strip $(ZINC)),) + ifeq ($(findstring back,$(ZINC)), back) + LED_BACK_ENABLE = yes + else ifeq ($(findstring under,$(ZINC)), under) + LED_UNDERGLOW_ENABLE = yes + endif + ifeq ($(findstring na,$(ZINC)), na) + LED_ANIMATIONS = no + endif + ifeq ($(findstring ios,$(ZINC)), ios) + IOS_DEVICE_ENABLE = yes + endif + $(eval $(call ZINC_CUSTOMISE_MSG)) + $(info ) +endif + +ifeq ($(strip $(LED_BACK_ENABLE)), yes) + RGBLIGHT_ENABLE = yes + OPT_DEFS += -DRGBLED_BACK + ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) + $(eval $(call ZINC_CUSTOMISE_MSG)) + $(error LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE both 'yes') + endif +else ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes) + RGBLIGHT_ENABLE = yes +else + RGBLIGHT_ENABLE = no +endif + +ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes) + OPT_DEFS += -DIOS_DEVICE_ENABLE +endif + +ifeq ($(strip $(LED_ANIMATIONS)), yes) +# OPT_DEFS += -DRGBLIGHT_ANIMATIONS + OPT_DEFS += -DLED_ANIMATIONS +endif + +ifeq ($(strip $(Link_Time_Optimization)),yes) + EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization +endif + +# 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 + +# Uncomment these for debugging +# $(info -- RGBLIGHT_ENABLE=$(RGBLIGHT_ENABLE)) +# $(info -- OPT_DEFS=$(OPT_DEFS)) +# $(info ) diff --git a/keyboards/zinc/readme.md b/keyboards/zinc/readme.md new file mode 100644 index 000000000000..3b4ce105c8bd --- /dev/null +++ b/keyboards/zinc/readme.md @@ -0,0 +1,17 @@ +Zinc +=== + +![Zinc](https://i.imgur.com/vxlpWkD.jpg) + +40% row-staggered split keyboard. + +Keyboard Maintainer: [monksoffunk](https://github.com/monksoffunk/) [@monksoffunkJP](https://twitter.com/monksoffunkJP) +Hardware Supported: Zinc PCB +Hardware Availability: (https://twitter.com/monksoffunkJP) + +Make example for this keyboard (after setting up your build environment): + + make zinc:default + + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/zinc/rev1/config.h b/keyboards/zinc/rev1/config.h new file mode 100644 index 000000000000..c628400f2e90 --- /dev/null +++ b/keyboards/zinc/rev1/config.h @@ -0,0 +1,149 @@ +/* +Copyright 2012 Jun Wako +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 . +*/ + +#pragma once + +//#ifndef REV1_CONFIG_H +//#define REV1_CONFIG_H + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x9991 +#define DEVICE_VER 0x0001 +#define MANUFACTURER monksoffunk +#define PRODUCT zinc rev.1 +#define DESCRIPTION A split keyboard + + +#define PREVENT_STUCK_MODIFIERS +#define TAPPING_FORCE_HOLD +#define TAPPING_TERM 100 + +/* Use I2C or Serial */ +//#define USE_I2C +#define USE_SERIAL +//#define USE_MATRIX_I2C + +/* Select hand configuration */ +#define MASTER_LEFT +//#define MASTER_RIGHT +//#define EE_HANDS + + +/* key matrix size */ +// Rows are doubled-up + #define MATRIX_ROWS 8 + #define MATRIX_ROW_PINS { F6, F7, B1, B3 } + +// wiring of each half +#define MATRIX_COLS 6 +#define MATRIX_COL_PINS { F4, D4, C6, D7, E6, B4 } + +/* 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. see ./keymaps/default/config.h +#define ws2812_PORTREG PORTD +#define ws2812_DDRREG DDRD + +// RGB LED support +//#define RGBLIGHT_ANIMATIONS : see ./rules.mk: LED_ANIMATIONS = yes or no +// see ./rules.mk: LED_BACK_ENABLE or LED_UNDERGLOW_ENABLE set yes +#ifdef RGBLED_BACK + #define RGBLED_NUM 24 +#else + #define RGBLED_NUM 6 +#endif + +#ifndef IOS_DEVICE_ENABLE + #if RGBLED_NUM <= 6 + #define RGBLIGHT_LIMIT_VAL 255 + #else + #if RGBLED_NUM <= 16 + #define RGBLIGHT_LIMIT_VAL 130 + #else + #define RGBLIGHT_LIMIT_VAL 120 + #endif + #endif + #define RGBLIGHT_VAL_STEP 17 +#else + #if RGBLED_NUM <= 6 + #define RGBLIGHT_LIMIT_VAL 90 + #else + #if RGBLED_NUM <= 16 + #define RGBLIGHT_LIMIT_VAL 45 + #else + #define RGBLIGHT_LIMIT_VAL 35 + #endif + #endif + #define RGBLIGHT_VAL_STEP 4 +#endif +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 + +#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE) +// USB_MAX_POWER_CONSUMPTION value +// 120 RGBoff +// 330 RGB 6 +// 300 RGB 32 + #define USB_MAX_POWER_CONSUMPTION 400 +#else + // fix iPhone and iPad power adapter issue + // iOS device need lessthan 100 + #define USB_MAX_POWER_CONSUMPTION 100 +#endif + +/* + * 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/zinc/rev1/info.json b/keyboards/zinc/rev1/info.json new file mode 100644 index 000000000000..0ca8acded9e4 --- /dev/null +++ b/keyboards/zinc/rev1/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "Zinc rev.1", + "url": "https://github.com/monksoffunk/zinc", + "maintainer": "monksoffunk", + "width": 15, + "height": 4, + "layouts": { + "LAYOUT": { + "key_count": 48, + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":13, "y":1}, {"x":14, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}] + } + } +} diff --git a/keyboards/zinc/rev1/matrix.c b/keyboards/zinc/rev1/matrix.c new file mode 100644 index 000000000000..220954f05197 --- /dev/null +++ b/keyboards/zinc/rev1/matrix.c @@ -0,0 +1,356 @@ +/* +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 . +*/ + +/* + * scan matrix + */ +#include +#include +#include +#include +#include +#include +#include +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "split_util.h" +#include "pro_micro.h" + +#ifdef USE_MATRIX_I2C +# include "i2c.h" +#else // USE_SERIAL +# include "split_scomm.h" +#endif + +#ifndef DEBOUNCE +# define DEBOUNCE 5 +#endif + +#define ERROR_DISCONNECT_COUNT 5 + +static uint8_t debouncing = DEBOUNCE; +static const int ROWS_PER_HAND = MATRIX_ROWS/2; +static uint8_t error_count = 0; +uint8_t is_master = 0 ; + +static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static matrix_row_t read_cols(void); +static void init_cols(void); +static void unselect_rows(void); +static void select_row(uint8_t row); +static uint8_t matrix_master_scan(void); + + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + debug_enable = true; + debug_matrix = true; + debug_mouse = true; + // initialize row and col + unselect_rows(); + init_cols(); + + TX_RX_LED_INIT; + TXLED0; + RXLED0; + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } + + is_master = has_usb(); + + matrix_init_quantum(); +} + +uint8_t _matrix_scan(void) +{ + // Right hand is stored after the left in the matirx so, we need to offset it + int offset = isLeftHand ? 0 : (ROWS_PER_HAND); + + for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { + select_row(i); + _delay_us(30); // without this wait read unstable value. + matrix_row_t cols = read_cols(); + if (matrix_debouncing[i+offset] != cols) { + matrix_debouncing[i+offset] = cols; + debouncing = DEBOUNCE; + } + unselect_rows(); + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { + matrix[i+offset] = matrix_debouncing[i+offset]; + } + } + } + + return 1; +} + +#ifdef USE_MATRIX_I2C + +// Get rows from other half over i2c +int i2c_transaction(void) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + + int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); + if (err) goto i2c_error; + + // start of matrix stored at 0x00 + err = i2c_master_write(0x00); + if (err) goto i2c_error; + + // Start read + err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); + if (err) goto i2c_error; + + if (!err) { + int i; + for (i = 0; i < ROWS_PER_HAND-1; ++i) { + matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); + } + matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); + i2c_master_stop(); + } else { +i2c_error: // the cable is disconnceted, or something else went wrong + i2c_reset_state(); + return err; + } + + return 0; +} + +#else // USE_SERIAL + +int serial_transaction(int master_changed) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; +#ifdef SERIAL_USE_MULTI_TRANSACTION + int ret=serial_update_buffers(master_changed); +#else + int ret=serial_update_buffers(); +#endif + if (ret ) { + if(ret==2) RXLED1; + return 1; + } + RXLED0; + memcpy(&matrix[slaveOffset], + (void *)serial_slave_buffer, sizeof(serial_slave_buffer)); + return 0; +} +#endif + +uint8_t matrix_scan(void) +{ + if (is_master) { + matrix_master_scan(); + }else{ + matrix_slave_scan(); + int offset = (isLeftHand) ? ROWS_PER_HAND : 0; + memcpy(&matrix[offset], + (void *)serial_master_buffer, sizeof(serial_master_buffer)); + matrix_scan_quantum(); + } + return 1; +} + + +uint8_t matrix_master_scan(void) { + + int ret = _matrix_scan(); + int mchanged = 1; + int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; + +#ifdef USE_MATRIX_I2C +// for (int i = 0; i < ROWS_PER_HAND; ++i) { + /* i2c_slave_buffer[i] = matrix[offset+i]; */ +// i2c_slave_buffer[i] = matrix[offset+i]; +// } +#else // USE_SERIAL + #ifdef SERIAL_USE_MULTI_TRANSACTION + mchanged = memcmp((void *)serial_master_buffer, + &matrix[offset], sizeof(serial_master_buffer)); + #endif + memcpy((void *)serial_master_buffer, + &matrix[offset], sizeof(serial_master_buffer)); +#endif + +#ifdef USE_MATRIX_I2C + if( i2c_transaction() ) { +#else // USE_SERIAL + if( serial_transaction(mchanged) ) { +#endif + // turn on the indicator led when halves are disconnected + TXLED1; + + error_count++; + + if (error_count > ERROR_DISCONNECT_COUNT) { + // reset other half if disconnected + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + for (int i = 0; i < ROWS_PER_HAND; ++i) { + matrix[slaveOffset+i] = 0; + } + } + } else { + // turn off the indicator led on no error + TXLED0; + error_count = 0; + } + matrix_scan_quantum(); + return ret; +} + +void matrix_slave_scan(void) { + _matrix_scan(); + + int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; + +#ifdef USE_MATRIX_I2C + for (int i = 0; i < ROWS_PER_HAND; ++i) { + /* i2c_slave_buffer[i] = matrix[offset+i]; */ + i2c_slave_buffer[i] = matrix[offset+i]; + } +#else // USE_SERIAL + #ifdef SERIAL_USE_MULTI_TRANSACTION + int change = 0; + #endif + for (int i = 0; i < ROWS_PER_HAND; ++i) { + #ifdef SERIAL_USE_MULTI_TRANSACTION + if( serial_slave_buffer[i] != matrix[offset+i] ) + change = 1; + #endif + serial_slave_buffer[i] = matrix[offset+i]; + } + #ifdef SERIAL_USE_MULTI_TRANSACTION + slave_buffer_change_count += change; + #endif +#endif +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<> 4) + 1) &= ~_BV(col_pins[x] & 0xF); + _SFR_IO8((col_pins[x] >> 4) + 2) |= _BV(col_pins[x] & 0xF); + } +} + +static matrix_row_t read_cols(void) +{ + matrix_row_t result = 0; + for(int x = 0; x < MATRIX_COLS; x++) { + result |= (_SFR_IO8(col_pins[x] >> 4) & _BV(col_pins[x] & 0xF)) ? 0 : (1 << x); + } + return result; +} + +static void unselect_rows(void) +{ + for(int x = 0; x < ROWS_PER_HAND; x++) { + _SFR_IO8((row_pins[x] >> 4) + 1) &= ~_BV(row_pins[x] & 0xF); + _SFR_IO8((row_pins[x] >> 4) + 2) |= _BV(row_pins[x] & 0xF); + } +} + +static void select_row(uint8_t row) +{ + _SFR_IO8((row_pins[row] >> 4) + 1) |= _BV(row_pins[row] & 0xF); + _SFR_IO8((row_pins[row] >> 4) + 2) &= ~_BV(row_pins[row] & 0xF); +} diff --git a/keyboards/zinc/rev1/rev1.c b/keyboards/zinc/rev1/rev1.c new file mode 100644 index 000000000000..2ce08a07c435 --- /dev/null +++ b/keyboards/zinc/rev1/rev1.c @@ -0,0 +1,6 @@ +#include "zinc.h" + +void matrix_init_kb(void) { + matrix_init_user(); +}; + diff --git a/keyboards/zinc/rev1/rev1.h b/keyboards/zinc/rev1/rev1.h new file mode 100644 index 000000000000..933e635c2df1 --- /dev/null +++ b/keyboards/zinc/rev1/rev1.h @@ -0,0 +1,44 @@ +#pragma once + +#include "../zinc.h" + +//void promicro_bootloader_jmp(bool program); +#include "quantum.h" + +#ifdef RGBLIGHT_ENABLE +//rgb led driver +#include "ws2812.h" +#endif + +#ifdef USE_I2C +#include +#ifdef __AVR__ + #include + #include +#endif +#endif + +//void promicro_bootloader_jmp(bool program); + + + +// Standard Keymap +// (TRRS jack on both halves are to the left side) +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05}, \ + { L10, L11, L12, L13, L14, L15}, \ + { L20, L21, L22, L23, L24, L25}, \ + { L30, L31, L32, L33, L34, L35}, \ + { R00, R01, R02, R03, R04, R05 }, \ + { R10, R11, R12, R13, R14, R15 }, \ + { R20, R21, R22, R23, R24, R25 }, \ + { R30, R31, R32, R33, R34, R35 }, \ + } + +#define LAYOUT_ortho_4x12 LAYOUT diff --git a/keyboards/zinc/rev1/rules.mk b/keyboards/zinc/rev1/rules.mk new file mode 100644 index 000000000000..e78b9258d770 --- /dev/null +++ b/keyboards/zinc/rev1/rules.mk @@ -0,0 +1,4 @@ +SRC += rev1/matrix.c +SRC += rev1/split_util.c +SRC += rev1/split_scomm.c +SRC += ws2812.c diff --git a/keyboards/zinc/rev1/serial_config.h b/keyboards/zinc/rev1/serial_config.h new file mode 100644 index 000000000000..9fb5dfc67149 --- /dev/null +++ b/keyboards/zinc/rev1/serial_config.h @@ -0,0 +1,18 @@ +#ifndef SOFT_SERIAL_CONFIG_H +#define SOFT_SERIAL_CONFIG_H + +#ifndef SOFT_SERIAL_PIN +/* Soft Serial defines */ +#define SOFT_SERIAL_PIN D2 +// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5 +// // 1: about 137kbps (default) +// // 2: about 75kbps +// // 3: about 39kbps +// // 4: about 26kbps +// // 5: about 20kbps +#endif + +//// USE flexible API (using multi-type transaction function) +#define SERIAL_USE_MULTI_TRANSACTION + +#endif /* SOFT_SERIAL_CONFIG_H */ diff --git a/keyboards/zinc/rev1/serial_config_simpleapi.h b/keyboards/zinc/rev1/serial_config_simpleapi.h new file mode 100644 index 000000000000..e2d22a41e7bc --- /dev/null +++ b/keyboards/zinc/rev1/serial_config_simpleapi.h @@ -0,0 +1,8 @@ +#ifndef SERIAL_CONFIG_SIMPLEAPI_H +#define SERIAL_CONFIG_SIMPLEAPI_H + +#undef SERIAL_USE_MULTI_TRANSACTION +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 + +#endif // SERIAL_CONFIG_SIMPLEAPI_H diff --git a/keyboards/zinc/rev1/split_scomm.c b/keyboards/zinc/rev1/split_scomm.c new file mode 100644 index 000000000000..50d233ce9afd --- /dev/null +++ b/keyboards/zinc/rev1/split_scomm.c @@ -0,0 +1,95 @@ +#ifdef USE_SERIAL +#ifdef SERIAL_USE_MULTI_TRANSACTION +/* --- USE flexible API (using multi-type transaction function) --- */ + +#include +#include +#include +#include +#include "serial.h" +#ifdef SERIAL_DEBUG_MODE +#include +#endif +#ifdef CONSOLE_ENABLE + #include +#endif + +uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; +uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; +uint8_t volatile status_com = 0; +uint8_t volatile status1 = 0; +uint8_t slave_buffer_change_count = 0; +uint8_t s_change_old = 0xff; +uint8_t s_change_new = 0xff; + +SSTD_t transactions[] = { +#define GET_SLAVE_STATUS 0 + /* master buffer not changed, only recive slave_buffer_change_count */ + { (uint8_t *)&status_com, + 0, NULL, + sizeof(slave_buffer_change_count), &slave_buffer_change_count, + }, +#define PUT_MASTER_GET_SLAVE_STATUS 1 + /* master buffer changed need send, and recive slave_buffer_change_count */ + { (uint8_t *)&status_com, + sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer, + sizeof(slave_buffer_change_count), &slave_buffer_change_count, + }, +#define GET_SLAVE_BUFFER 2 + /* recive serial_slave_buffer */ + { (uint8_t *)&status1, + 0, NULL, + sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer + } +}; + +void serial_master_init(void) +{ + soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); +} + +void serial_slave_init(void) +{ + soft_serial_target_init(transactions, TID_LIMIT(transactions)); +} + +// 0 => no error +// 1 => slave did not respond +// 2 => checksum error +int serial_update_buffers(int master_update) +{ + int status, smatstatus; + static int need_retry = 0; + + if( s_change_old != s_change_new ) { + smatstatus = soft_serial_transaction(GET_SLAVE_BUFFER); + if( smatstatus == TRANSACTION_END ) { + s_change_old = s_change_new; +#ifdef CONSOLE_ENABLE + uprintf("slave matrix = %b %b %b %b %b\n", + serial_slave_buffer[0], serial_slave_buffer[1], + serial_slave_buffer[2], serial_slave_buffer[3], + serial_slave_buffer[4] ); +#endif + } + } else { + // serial_slave_buffer dosen't change + smatstatus = TRANSACTION_END; // dummy status + } + + if( !master_update && !need_retry) { + status = soft_serial_transaction(GET_SLAVE_STATUS); + } else { + status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS); + } + if( status == TRANSACTION_END ) { + s_change_new = slave_buffer_change_count; + need_retry = 0; + } else { + need_retry = 1; + } + return smatstatus; +} + +#endif // SERIAL_USE_MULTI_TRANSACTION +#endif /* USE_SERIAL */ diff --git a/keyboards/zinc/rev1/split_scomm.h b/keyboards/zinc/rev1/split_scomm.h new file mode 100644 index 000000000000..873d8939d81f --- /dev/null +++ b/keyboards/zinc/rev1/split_scomm.h @@ -0,0 +1,24 @@ +#ifndef SPLIT_COMM_H +#define SPLIT_COMM_H + +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) --- */ +#include "serial.h" + +#else +/* --- USE flexible API (using multi-type transaction function) --- */ +// Buffers for master - slave communication +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 + +extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; +extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; +extern uint8_t slave_buffer_change_count; + +void serial_master_init(void); +void serial_slave_init(void); +int serial_update_buffers(int master_changed); + +#endif + +#endif /* SPLIT_COMM_H */ diff --git a/keyboards/zinc/rev1/split_util.c b/keyboards/zinc/rev1/split_util.c new file mode 100644 index 000000000000..e1ff8b4379dc --- /dev/null +++ b/keyboards/zinc/rev1/split_util.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include +#include +#include "split_util.h" +#include "matrix.h" +#include "keyboard.h" + +#ifdef USE_MATRIX_I2C +# include "i2c.h" +#else +# include "split_scomm.h" +#endif + +volatile bool isLeftHand = true; + +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) + isLeftHand = !has_usb(); + #else + isLeftHand = has_usb(); + #endif + #endif +} + +static void keyboard_master_setup(void) { + +#ifdef USE_MATRIX_I2C + i2c_master_init(); +#else + serial_master_init(); +#endif +} + +static void keyboard_slave_setup(void) { + +#ifdef USE_MATRIX_I2C + i2c_slave_init(SLAVE_I2C_ADDRESS); +#else + serial_slave_init(); +#endif +} + +bool has_usb(void) { + USBCON |= (1 << OTGPADE); //enables VBUS pad + _delay_us(5); + return (USBSTA & (1< +#include "eeconfig.h" + +#define SLAVE_I2C_ADDRESS 0x32 + +extern volatile bool isLeftHand; + +// slave version of matix scan, defined in matrix.c +void matrix_slave_scan(void); + +void split_keyboard_setup(void); +bool has_usb(void); + +void matrix_master_OLED_init (void); + +#endif diff --git a/keyboards/zinc/reva/config.h b/keyboards/zinc/reva/config.h new file mode 100644 index 000000000000..15805189054c --- /dev/null +++ b/keyboards/zinc/reva/config.h @@ -0,0 +1,143 @@ +/* +Copyright 2012 Jun Wako +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 . +*/ + +#pragma once + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x9991 +#define DEVICE_VER 0x0001 +#define MANUFACTURER monksoffunk +#define PRODUCT zinc rev.A +#define DESCRIPTION A split keyboard + + +#define PREVENT_STUCK_MODIFIERS +#define TAPPING_FORCE_HOLD +#define TAPPING_TERM 100 + +/* Use I2C or Serial */ +//#define USE_I2C +#define USE_SERIAL +//#define USE_MATRIX_I2C + +/* Select hand configuration */ +#define MASTER_LEFT +//#define MASTER_RIGHT +//#define EE_HANDS + + +/* key matrix size */ +// Rows are doubled-up + #define MATRIX_ROWS 8 + #define MATRIX_ROW_PINS { D4, C6, D7, E6 } + +// wiring of each half +#define MATRIX_COLS 6 +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3} + +/* 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 24 // Number of LEDs. see ./keymaps/default/config.h +#define ws2812_PORTREG PORTD +#define ws2812_DDRREG DDRD + +// RGB LED support +//#define RGBLIGHT_ANIMATIONS : see ./rules.mk: LED_ANIMATIONS = yes or no +// see ./rules.mk: LED_BACK_ENABLE or LED_UNDERGLOW_ENABLE set yes +#ifdef RGBLED_BACK + #define RGBLED_NUM 24 +#else + #define RGBLED_NUM 6 +#endif + +#ifndef IOS_DEVICE_ENABLE + #if RGBLED_NUM <= 6 + #define RGBLIGHT_LIMIT_VAL 255 + #else + #if RGBLED_NUM <= 16 + #define RGBLIGHT_LIMIT_VAL 130 + #else + #define RGBLIGHT_LIMIT_VAL 120 + #endif + #endif + #define RGBLIGHT_VAL_STEP 17 +#else + #if RGBLED_NUM <= 6 + #define RGBLIGHT_LIMIT_VAL 90 + #else + #if RGBLED_NUM <= 16 + #define RGBLIGHT_LIMIT_VAL 45 + #else + #define RGBLIGHT_LIMIT_VAL 35 + #endif + #endif + #define RGBLIGHT_VAL_STEP 4 +#endif +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 + +#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE) +// USB_MAX_POWER_CONSUMPTION value +// 120 RGBoff +// 330 RGB 6 +// 300 RGB 32 + #define USB_MAX_POWER_CONSUMPTION 400 +#else + // fix iPhone and iPad power adapter issue + // iOS device need lessthan 100 + #define USB_MAX_POWER_CONSUMPTION 100 +#endif + +/* + * 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 diff --git a/keyboards/zinc/reva/info.json b/keyboards/zinc/reva/info.json new file mode 100644 index 000000000000..138c79068b46 --- /dev/null +++ b/keyboards/zinc/reva/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "Zinc rev.A", + "url": "https://github.com/monksoffunk/zinc", + "maintainer": "monksoffunk", + "width": 15, + "height": 4, + "layouts": { + "LAYOUT": { + "key_count": 48, + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":13, "y":1}, {"x":14, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}] + } + } +} diff --git a/keyboards/zinc/reva/matrix.c b/keyboards/zinc/reva/matrix.c new file mode 100644 index 000000000000..220954f05197 --- /dev/null +++ b/keyboards/zinc/reva/matrix.c @@ -0,0 +1,356 @@ +/* +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 . +*/ + +/* + * scan matrix + */ +#include +#include +#include +#include +#include +#include +#include +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "split_util.h" +#include "pro_micro.h" + +#ifdef USE_MATRIX_I2C +# include "i2c.h" +#else // USE_SERIAL +# include "split_scomm.h" +#endif + +#ifndef DEBOUNCE +# define DEBOUNCE 5 +#endif + +#define ERROR_DISCONNECT_COUNT 5 + +static uint8_t debouncing = DEBOUNCE; +static const int ROWS_PER_HAND = MATRIX_ROWS/2; +static uint8_t error_count = 0; +uint8_t is_master = 0 ; + +static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +static matrix_row_t read_cols(void); +static void init_cols(void); +static void unselect_rows(void); +static void select_row(uint8_t row); +static uint8_t matrix_master_scan(void); + + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ + debug_enable = true; + debug_matrix = true; + debug_mouse = true; + // initialize row and col + unselect_rows(); + init_cols(); + + TX_RX_LED_INIT; + TXLED0; + RXLED0; + + // initialize matrix state: all keys off + for (uint8_t i=0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; + matrix_debouncing[i] = 0; + } + + is_master = has_usb(); + + matrix_init_quantum(); +} + +uint8_t _matrix_scan(void) +{ + // Right hand is stored after the left in the matirx so, we need to offset it + int offset = isLeftHand ? 0 : (ROWS_PER_HAND); + + for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { + select_row(i); + _delay_us(30); // without this wait read unstable value. + matrix_row_t cols = read_cols(); + if (matrix_debouncing[i+offset] != cols) { + matrix_debouncing[i+offset] = cols; + debouncing = DEBOUNCE; + } + unselect_rows(); + } + + if (debouncing) { + if (--debouncing) { + _delay_ms(1); + } else { + for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { + matrix[i+offset] = matrix_debouncing[i+offset]; + } + } + } + + return 1; +} + +#ifdef USE_MATRIX_I2C + +// Get rows from other half over i2c +int i2c_transaction(void) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + + int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); + if (err) goto i2c_error; + + // start of matrix stored at 0x00 + err = i2c_master_write(0x00); + if (err) goto i2c_error; + + // Start read + err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); + if (err) goto i2c_error; + + if (!err) { + int i; + for (i = 0; i < ROWS_PER_HAND-1; ++i) { + matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); + } + matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); + i2c_master_stop(); + } else { +i2c_error: // the cable is disconnceted, or something else went wrong + i2c_reset_state(); + return err; + } + + return 0; +} + +#else // USE_SERIAL + +int serial_transaction(int master_changed) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; +#ifdef SERIAL_USE_MULTI_TRANSACTION + int ret=serial_update_buffers(master_changed); +#else + int ret=serial_update_buffers(); +#endif + if (ret ) { + if(ret==2) RXLED1; + return 1; + } + RXLED0; + memcpy(&matrix[slaveOffset], + (void *)serial_slave_buffer, sizeof(serial_slave_buffer)); + return 0; +} +#endif + +uint8_t matrix_scan(void) +{ + if (is_master) { + matrix_master_scan(); + }else{ + matrix_slave_scan(); + int offset = (isLeftHand) ? ROWS_PER_HAND : 0; + memcpy(&matrix[offset], + (void *)serial_master_buffer, sizeof(serial_master_buffer)); + matrix_scan_quantum(); + } + return 1; +} + + +uint8_t matrix_master_scan(void) { + + int ret = _matrix_scan(); + int mchanged = 1; + int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; + +#ifdef USE_MATRIX_I2C +// for (int i = 0; i < ROWS_PER_HAND; ++i) { + /* i2c_slave_buffer[i] = matrix[offset+i]; */ +// i2c_slave_buffer[i] = matrix[offset+i]; +// } +#else // USE_SERIAL + #ifdef SERIAL_USE_MULTI_TRANSACTION + mchanged = memcmp((void *)serial_master_buffer, + &matrix[offset], sizeof(serial_master_buffer)); + #endif + memcpy((void *)serial_master_buffer, + &matrix[offset], sizeof(serial_master_buffer)); +#endif + +#ifdef USE_MATRIX_I2C + if( i2c_transaction() ) { +#else // USE_SERIAL + if( serial_transaction(mchanged) ) { +#endif + // turn on the indicator led when halves are disconnected + TXLED1; + + error_count++; + + if (error_count > ERROR_DISCONNECT_COUNT) { + // reset other half if disconnected + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + for (int i = 0; i < ROWS_PER_HAND; ++i) { + matrix[slaveOffset+i] = 0; + } + } + } else { + // turn off the indicator led on no error + TXLED0; + error_count = 0; + } + matrix_scan_quantum(); + return ret; +} + +void matrix_slave_scan(void) { + _matrix_scan(); + + int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; + +#ifdef USE_MATRIX_I2C + for (int i = 0; i < ROWS_PER_HAND; ++i) { + /* i2c_slave_buffer[i] = matrix[offset+i]; */ + i2c_slave_buffer[i] = matrix[offset+i]; + } +#else // USE_SERIAL + #ifdef SERIAL_USE_MULTI_TRANSACTION + int change = 0; + #endif + for (int i = 0; i < ROWS_PER_HAND; ++i) { + #ifdef SERIAL_USE_MULTI_TRANSACTION + if( serial_slave_buffer[i] != matrix[offset+i] ) + change = 1; + #endif + serial_slave_buffer[i] = matrix[offset+i]; + } + #ifdef SERIAL_USE_MULTI_TRANSACTION + slave_buffer_change_count += change; + #endif +#endif +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<> 4) + 1) &= ~_BV(col_pins[x] & 0xF); + _SFR_IO8((col_pins[x] >> 4) + 2) |= _BV(col_pins[x] & 0xF); + } +} + +static matrix_row_t read_cols(void) +{ + matrix_row_t result = 0; + for(int x = 0; x < MATRIX_COLS; x++) { + result |= (_SFR_IO8(col_pins[x] >> 4) & _BV(col_pins[x] & 0xF)) ? 0 : (1 << x); + } + return result; +} + +static void unselect_rows(void) +{ + for(int x = 0; x < ROWS_PER_HAND; x++) { + _SFR_IO8((row_pins[x] >> 4) + 1) &= ~_BV(row_pins[x] & 0xF); + _SFR_IO8((row_pins[x] >> 4) + 2) |= _BV(row_pins[x] & 0xF); + } +} + +static void select_row(uint8_t row) +{ + _SFR_IO8((row_pins[row] >> 4) + 1) |= _BV(row_pins[row] & 0xF); + _SFR_IO8((row_pins[row] >> 4) + 2) &= ~_BV(row_pins[row] & 0xF); +} diff --git a/keyboards/zinc/reva/reva.c b/keyboards/zinc/reva/reva.c new file mode 100644 index 000000000000..2ce08a07c435 --- /dev/null +++ b/keyboards/zinc/reva/reva.c @@ -0,0 +1,6 @@ +#include "zinc.h" + +void matrix_init_kb(void) { + matrix_init_user(); +}; + diff --git a/keyboards/zinc/reva/reva.h b/keyboards/zinc/reva/reva.h new file mode 100644 index 000000000000..933e635c2df1 --- /dev/null +++ b/keyboards/zinc/reva/reva.h @@ -0,0 +1,44 @@ +#pragma once + +#include "../zinc.h" + +//void promicro_bootloader_jmp(bool program); +#include "quantum.h" + +#ifdef RGBLIGHT_ENABLE +//rgb led driver +#include "ws2812.h" +#endif + +#ifdef USE_I2C +#include +#ifdef __AVR__ + #include + #include +#endif +#endif + +//void promicro_bootloader_jmp(bool program); + + + +// Standard Keymap +// (TRRS jack on both halves are to the left side) +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05}, \ + { L10, L11, L12, L13, L14, L15}, \ + { L20, L21, L22, L23, L24, L25}, \ + { L30, L31, L32, L33, L34, L35}, \ + { R00, R01, R02, R03, R04, R05 }, \ + { R10, R11, R12, R13, R14, R15 }, \ + { R20, R21, R22, R23, R24, R25 }, \ + { R30, R31, R32, R33, R34, R35 }, \ + } + +#define LAYOUT_ortho_4x12 LAYOUT diff --git a/keyboards/zinc/reva/rules.mk b/keyboards/zinc/reva/rules.mk new file mode 100644 index 000000000000..3ea61267a254 --- /dev/null +++ b/keyboards/zinc/reva/rules.mk @@ -0,0 +1,4 @@ +SRC += reva/matrix.c +SRC += reva/split_util.c +SRC += reva/split_scomm.c +SRC += ws2812.c diff --git a/keyboards/zinc/reva/serial_config.h b/keyboards/zinc/reva/serial_config.h new file mode 100644 index 000000000000..9fb5dfc67149 --- /dev/null +++ b/keyboards/zinc/reva/serial_config.h @@ -0,0 +1,18 @@ +#ifndef SOFT_SERIAL_CONFIG_H +#define SOFT_SERIAL_CONFIG_H + +#ifndef SOFT_SERIAL_PIN +/* Soft Serial defines */ +#define SOFT_SERIAL_PIN D2 +// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5 +// // 1: about 137kbps (default) +// // 2: about 75kbps +// // 3: about 39kbps +// // 4: about 26kbps +// // 5: about 20kbps +#endif + +//// USE flexible API (using multi-type transaction function) +#define SERIAL_USE_MULTI_TRANSACTION + +#endif /* SOFT_SERIAL_CONFIG_H */ diff --git a/keyboards/zinc/reva/serial_config_simpleapi.h b/keyboards/zinc/reva/serial_config_simpleapi.h new file mode 100644 index 000000000000..e2d22a41e7bc --- /dev/null +++ b/keyboards/zinc/reva/serial_config_simpleapi.h @@ -0,0 +1,8 @@ +#ifndef SERIAL_CONFIG_SIMPLEAPI_H +#define SERIAL_CONFIG_SIMPLEAPI_H + +#undef SERIAL_USE_MULTI_TRANSACTION +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 + +#endif // SERIAL_CONFIG_SIMPLEAPI_H diff --git a/keyboards/zinc/reva/split_scomm.c b/keyboards/zinc/reva/split_scomm.c new file mode 100644 index 000000000000..50d233ce9afd --- /dev/null +++ b/keyboards/zinc/reva/split_scomm.c @@ -0,0 +1,95 @@ +#ifdef USE_SERIAL +#ifdef SERIAL_USE_MULTI_TRANSACTION +/* --- USE flexible API (using multi-type transaction function) --- */ + +#include +#include +#include +#include +#include "serial.h" +#ifdef SERIAL_DEBUG_MODE +#include +#endif +#ifdef CONSOLE_ENABLE + #include +#endif + +uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; +uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; +uint8_t volatile status_com = 0; +uint8_t volatile status1 = 0; +uint8_t slave_buffer_change_count = 0; +uint8_t s_change_old = 0xff; +uint8_t s_change_new = 0xff; + +SSTD_t transactions[] = { +#define GET_SLAVE_STATUS 0 + /* master buffer not changed, only recive slave_buffer_change_count */ + { (uint8_t *)&status_com, + 0, NULL, + sizeof(slave_buffer_change_count), &slave_buffer_change_count, + }, +#define PUT_MASTER_GET_SLAVE_STATUS 1 + /* master buffer changed need send, and recive slave_buffer_change_count */ + { (uint8_t *)&status_com, + sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer, + sizeof(slave_buffer_change_count), &slave_buffer_change_count, + }, +#define GET_SLAVE_BUFFER 2 + /* recive serial_slave_buffer */ + { (uint8_t *)&status1, + 0, NULL, + sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer + } +}; + +void serial_master_init(void) +{ + soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); +} + +void serial_slave_init(void) +{ + soft_serial_target_init(transactions, TID_LIMIT(transactions)); +} + +// 0 => no error +// 1 => slave did not respond +// 2 => checksum error +int serial_update_buffers(int master_update) +{ + int status, smatstatus; + static int need_retry = 0; + + if( s_change_old != s_change_new ) { + smatstatus = soft_serial_transaction(GET_SLAVE_BUFFER); + if( smatstatus == TRANSACTION_END ) { + s_change_old = s_change_new; +#ifdef CONSOLE_ENABLE + uprintf("slave matrix = %b %b %b %b %b\n", + serial_slave_buffer[0], serial_slave_buffer[1], + serial_slave_buffer[2], serial_slave_buffer[3], + serial_slave_buffer[4] ); +#endif + } + } else { + // serial_slave_buffer dosen't change + smatstatus = TRANSACTION_END; // dummy status + } + + if( !master_update && !need_retry) { + status = soft_serial_transaction(GET_SLAVE_STATUS); + } else { + status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS); + } + if( status == TRANSACTION_END ) { + s_change_new = slave_buffer_change_count; + need_retry = 0; + } else { + need_retry = 1; + } + return smatstatus; +} + +#endif // SERIAL_USE_MULTI_TRANSACTION +#endif /* USE_SERIAL */ diff --git a/keyboards/zinc/reva/split_scomm.h b/keyboards/zinc/reva/split_scomm.h new file mode 100644 index 000000000000..873d8939d81f --- /dev/null +++ b/keyboards/zinc/reva/split_scomm.h @@ -0,0 +1,24 @@ +#ifndef SPLIT_COMM_H +#define SPLIT_COMM_H + +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) --- */ +#include "serial.h" + +#else +/* --- USE flexible API (using multi-type transaction function) --- */ +// Buffers for master - slave communication +#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2 + +extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; +extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; +extern uint8_t slave_buffer_change_count; + +void serial_master_init(void); +void serial_slave_init(void); +int serial_update_buffers(int master_changed); + +#endif + +#endif /* SPLIT_COMM_H */ diff --git a/keyboards/zinc/reva/split_util.c b/keyboards/zinc/reva/split_util.c new file mode 100644 index 000000000000..e1ff8b4379dc --- /dev/null +++ b/keyboards/zinc/reva/split_util.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include +#include +#include "split_util.h" +#include "matrix.h" +#include "keyboard.h" + +#ifdef USE_MATRIX_I2C +# include "i2c.h" +#else +# include "split_scomm.h" +#endif + +volatile bool isLeftHand = true; + +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) + isLeftHand = !has_usb(); + #else + isLeftHand = has_usb(); + #endif + #endif +} + +static void keyboard_master_setup(void) { + +#ifdef USE_MATRIX_I2C + i2c_master_init(); +#else + serial_master_init(); +#endif +} + +static void keyboard_slave_setup(void) { + +#ifdef USE_MATRIX_I2C + i2c_slave_init(SLAVE_I2C_ADDRESS); +#else + serial_slave_init(); +#endif +} + +bool has_usb(void) { + USBCON |= (1 << OTGPADE); //enables VBUS pad + _delay_us(5); + return (USBSTA & (1< +#include "eeconfig.h" + +#define SLAVE_I2C_ADDRESS 0x32 + +extern volatile bool isLeftHand; + +// slave version of matix scan, defined in matrix.c +void matrix_slave_scan(void); + +void split_keyboard_setup(void); +bool has_usb(void); + +void matrix_master_OLED_init (void); + +#endif diff --git a/keyboards/zinc/rules.mk b/keyboards/zinc/rules.mk new file mode 100644 index 000000000000..5236c0bb02fc --- /dev/null +++ b/keyboards/zinc/rules.mk @@ -0,0 +1,72 @@ +#SRC += i2c.c +SRC += serial.c + +# 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) + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = caterina + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# 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 = no # 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 +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. +SUBPROJECT_rev1 = no +USE_I2C = yes +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +CUSTOM_MATRIX = yes + +DEFAULT_FOLDER = zinc/rev1 diff --git a/keyboards/zinc/serial.c b/keyboards/zinc/serial.c new file mode 100644 index 000000000000..830f86b55a68 --- /dev/null +++ b/keyboards/zinc/serial.c @@ -0,0 +1,542 @@ +/* + * WARNING: be careful changing this code, it is very timing dependent + */ + +#ifndef F_CPU +#define F_CPU 16000000 +#endif + +#include +#include +#include +#include +#include +#include "serial.h" +//#include + +#ifdef SOFT_SERIAL_PIN + +#ifdef __AVR_ATmega32U4__ + // if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial. + #ifdef USE_I2C + #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 + #error Using ATmega32U4 I2C, so can not use PD0, PD1 + #endif + #endif + + #if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3 + #define SERIAL_PIN_DDR DDRD + #define SERIAL_PIN_PORT PORTD + #define SERIAL_PIN_INPUT PIND + #if SOFT_SERIAL_PIN == D0 + #define SERIAL_PIN_MASK _BV(PD0) + #define EIMSK_BIT _BV(INT0) + #define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01))) + #define SERIAL_PIN_INTERRUPT INT0_vect + #elif SOFT_SERIAL_PIN == D1 + #define SERIAL_PIN_MASK _BV(PD1) + #define EIMSK_BIT _BV(INT1) + #define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11))) + #define SERIAL_PIN_INTERRUPT INT1_vect + #elif SOFT_SERIAL_PIN == D2 + #define SERIAL_PIN_MASK _BV(PD2) + #define EIMSK_BIT _BV(INT2) + #define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21))) + #define SERIAL_PIN_INTERRUPT INT2_vect + #elif SOFT_SERIAL_PIN == D3 + #define SERIAL_PIN_MASK _BV(PD3) + #define EIMSK_BIT _BV(INT3) + #define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31))) + #define SERIAL_PIN_INTERRUPT INT3_vect + #endif + #elif SOFT_SERIAL_PIN == E6 + #define SERIAL_PIN_DDR DDRE + #define SERIAL_PIN_PORT PORTE + #define SERIAL_PIN_INPUT PINE + #define SERIAL_PIN_MASK _BV(PE6) + #define EIMSK_BIT _BV(INT6) + #define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) + #define SERIAL_PIN_INTERRUPT INT6_vect + #else + #error invalid SOFT_SERIAL_PIN value + #endif + +#else + #error serial.c now support ATmega32U4 only +#endif + +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; + #endif + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; + #endif + uint8_t volatile status0 = 0; + +SSTD_t transactions[] = { + { (uint8_t *)&status0, + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer, + #else + 0, (uint8_t *)NULL, + #endif + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer + #else + 0, (uint8_t *)NULL, + #endif + } +}; + +void serial_master_init(void) +{ soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } + +void serial_slave_init(void) +{ soft_serial_target_init(transactions, TID_LIMIT(transactions)); } + +// 0 => no error +// 1 => slave did not respond +// 2 => checksum error +int serial_update_buffers() +{ + int result; + result = soft_serial_transaction(); + return result; +} + +#endif // Simple API (OLD API, compatible with let's split serial.c) + +#define ALWAYS_INLINE __attribute__((always_inline)) +#define NO_INLINE __attribute__((noinline)) +#define _delay_sub_us(x) __builtin_avr_delay_cycles(x) + +// parity check +#define ODD_PARITY 1 +#define EVEN_PARITY 0 +#define PARITY EVEN_PARITY + +#ifdef SERIAL_DELAY + // custom setup in config.h + // #define TID_SEND_ADJUST 2 + // #define SERIAL_DELAY 6 // micro sec + // #define READ_WRITE_START_ADJUST 30 // cycles + // #define READ_WRITE_WIDTH_ADJUST 8 // cycles +#else +// ============ Standard setups ============ + +#ifndef SELECT_SOFT_SERIAL_SPEED +#define SELECT_SOFT_SERIAL_SPEED 1 +// 0: about 189kbps +// 1: about 137kbps (default) +// 2: about 75kbps +// 3: about 39kbps +// 4: about 26kbps +// 5: about 20kbps +#endif + +#define TID_SEND_ADJUST 2 + +#if SELECT_SOFT_SERIAL_SPEED == 0 + // Very High speed + #define SERIAL_DELAY 4 // micro sec + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 6 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 1 + // High speed + #define SERIAL_DELAY 6 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 2 + // Middle speed + #define SERIAL_DELAY 12 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 3 + // Low speed + #define SERIAL_DELAY 24 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 4 + // Very Low speed + #define SERIAL_DELAY 36 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#elif SELECT_SOFT_SERIAL_SPEED == 5 + // Ultra Low speed + #define SERIAL_DELAY 48 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles +#else +#error invalid SELECT_SOFT_SERIAL_SPEED value +#endif /* SELECT_SOFT_SERIAL_SPEED */ +#endif /* SERIAL_DELAY */ + +#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) +#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) + +#define SLAVE_INT_WIDTH_US 1 +#ifndef SERIAL_USE_MULTI_TRANSACTION + #define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY +#else + #define SLAVE_INT_ACK_WIDTH_UNIT 2 + #define SLAVE_INT_ACK_WIDTH 4 +#endif + +static SSTD_t *Transaction_table = NULL; +static uint8_t Transaction_table_size = 0; + +inline static +void serial_delay(void) { + _delay_us(SERIAL_DELAY); +} + +inline static +void serial_delay_half1(void) { + _delay_us(SERIAL_DELAY_HALF1); +} + +inline static +void serial_delay_half2(void) { + _delay_us(SERIAL_DELAY_HALF2); +} + +inline static void serial_output(void) ALWAYS_INLINE; +inline static +void serial_output(void) { + SERIAL_PIN_DDR |= SERIAL_PIN_MASK; +} + +// make the serial pin an input with pull-up resistor +inline static void serial_input_with_pullup(void) ALWAYS_INLINE; +inline static +void serial_input_with_pullup(void) { + SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK; + SERIAL_PIN_PORT |= SERIAL_PIN_MASK; +} + +inline static +uint8_t serial_read_pin(void) { + return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); +} + +inline static void serial_low(void) ALWAYS_INLINE; +inline static +void serial_low(void) { + SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; +} + +inline static void serial_high(void) ALWAYS_INLINE; +inline static +void serial_high(void) { + SERIAL_PIN_PORT |= SERIAL_PIN_MASK; +} + +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size) +{ + Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; + serial_output(); + serial_high(); +} + +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size) +{ + Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; + serial_input_with_pullup(); + + // Enable INT0-INT3,INT6 + EIMSK |= EIMSK_BIT; +#if SERIAL_PIN_MASK == _BV(PE6) + // Trigger on falling edge of INT6 + EICRB &= EICRx_BIT; +#else + // Trigger on falling edge of INT0-INT3 + EICRA &= EICRx_BIT; +#endif +} + +// Used by the sender to synchronize timing with the reciver. +static void sync_recv(void) NO_INLINE; +static +void sync_recv(void) { + for (uint8_t i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) { + } + // This shouldn't hang if the target disconnects because the + // serial line will float to high if the target does disconnect. + while (!serial_read_pin()); +} + +// Used by the reciver to send a synchronization signal to the sender. +static void sync_send(void)NO_INLINE; +static +void sync_send(void) { + serial_low(); + serial_delay(); + serial_high(); +} + +// Reads a byte from the serial line +static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) NO_INLINE; +static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { + uint8_t byte, i, p, pb; + + _delay_sub_us(READ_WRITE_START_ADJUST); + for( i = 0, byte = 0, p = PARITY; i < bit; i++ ) { + serial_delay_half1(); // read the middle of pulses + if( serial_read_pin() ) { + byte = (byte << 1) | 1; p ^= 1; + } else { + byte = (byte << 1) | 0; p ^= 0; + } + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); + serial_delay_half2(); + } + /* recive parity bit */ + serial_delay_half1(); // read the middle of pulses + pb = serial_read_pin(); + _delay_sub_us(READ_WRITE_WIDTH_ADJUST); + serial_delay_half2(); + + *pterrcount += (p != pb)? 1 : 0; + + return byte; +} + +// Sends a byte with MSB ordering +void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE; +void serial_write_chunk(uint8_t data, uint8_t bit) { + uint8_t b, p; + for( p = PARITY, b = 1<<(bit-1); b ; b >>= 1) { + if(data & b) { + serial_high(); p ^= 1; + } else { + serial_low(); p ^= 0; + } + serial_delay(); + } + /* send parity bit */ + if(p & 1) { serial_high(); } + else { serial_low(); } + serial_delay(); + + serial_low(); // sync_send() / senc_recv() need raise edge +} + +static void serial_send_packet(uint8_t *buffer, uint8_t size) NO_INLINE; +static +void serial_send_packet(uint8_t *buffer, uint8_t size) { + for (uint8_t i = 0; i < size; ++i) { + uint8_t data; + data = buffer[i]; + sync_send(); + serial_write_chunk(data,8); + } +} + +static uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) NO_INLINE; +static +uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) { + uint8_t pecount = 0; + for (uint8_t i = 0; i < size; ++i) { + uint8_t data; + sync_recv(); + data = serial_read_chunk(&pecount, 8); + buffer[i] = data; + } + return pecount == 0; +} + +inline static +void change_sender2reciver(void) { + sync_send(); //0 + serial_delay_half1(); //1 + serial_low(); //2 + serial_input_with_pullup(); //2 + serial_delay_half1(); //3 +} + +inline static +void change_reciver2sender(void) { + sync_recv(); //0 + serial_delay(); //1 + serial_low(); //3 + serial_output(); //3 + serial_delay_half1(); //4 +} + +static inline uint8_t nibble_bits_count(uint8_t bits) +{ + bits = (bits & 0x5) + (bits >> 1 & 0x5); + bits = (bits & 0x3) + (bits >> 2 & 0x3); + return bits; +} + +// interrupt handle to be used by the target device +ISR(SERIAL_PIN_INTERRUPT) { + +#ifndef SERIAL_USE_MULTI_TRANSACTION + serial_low(); + serial_output(); + SSTD_t *trans = Transaction_table; +#else + // recive transaction table index + uint8_t tid, bits; + uint8_t pecount = 0; + sync_recv(); + bits = serial_read_chunk(&pecount,7); + tid = bits>>3; + bits = (bits&7) != nibble_bits_count(tid); + if( bits || pecount> 0 || tid > Transaction_table_size ) { + return; + } + serial_delay_half1(); + + serial_high(); // response step1 low->high + serial_output(); + _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT*SLAVE_INT_ACK_WIDTH); + SSTD_t *trans = &Transaction_table[tid]; + serial_low(); // response step2 ack high->low +#endif + + // target send phase + if( trans->target2initiator_buffer_size > 0 ) + serial_send_packet((uint8_t *)trans->target2initiator_buffer, + trans->target2initiator_buffer_size); + // target switch to input + change_sender2reciver(); + + // target recive phase + if( trans->initiator2target_buffer_size > 0 ) { + if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer, + trans->initiator2target_buffer_size) ) { + *trans->status = TRANSACTION_ACCEPTED; + } else { + *trans->status = TRANSACTION_DATA_ERROR; + } + } else { + *trans->status = TRANSACTION_ACCEPTED; + } + + sync_recv(); //weit initiator output to high +} + +///////// +// start transaction by initiator +// +// int soft_serial_transaction(int sstd_index) +// +// Returns: +// TRANSACTION_END +// TRANSACTION_NO_RESPONSE +// TRANSACTION_DATA_ERROR +// this code is very time dependent, so we need to disable interrupts +#ifndef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_transaction(void) { + SSTD_t *trans = Transaction_table; +#else +int soft_serial_transaction(int sstd_index) { + if( sstd_index > Transaction_table_size ) + return TRANSACTION_TYPE_ERROR; + SSTD_t *trans = &Transaction_table[sstd_index]; +#endif + cli(); + + // signal to the target that we want to start a transaction + serial_output(); + serial_low(); + _delay_us(SLAVE_INT_WIDTH_US); + +#ifndef SERIAL_USE_MULTI_TRANSACTION + // wait for the target response + serial_input_with_pullup(); + _delay_us(SLAVE_INT_RESPONSE_TIME); + + // check if the target is present + if (serial_read_pin()) { + // target failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; + sei(); + return TRANSACTION_NO_RESPONSE; + } + +#else + // send transaction table index + int tid = (sstd_index<<3) | (7 & nibble_bits_count(sstd_index)); + sync_send(); + _delay_sub_us(TID_SEND_ADJUST); + serial_write_chunk(tid, 7); + serial_delay_half1(); + + // wait for the target response (step1 low->high) + serial_input_with_pullup(); + while( !serial_read_pin() ) { + _delay_sub_us(2); + } + + // check if the target is present (step2 high->low) + for( int i = 0; serial_read_pin(); i++ ) { + if (i > SLAVE_INT_ACK_WIDTH + 1) { + // slave failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; + sei(); + return TRANSACTION_NO_RESPONSE; + } + _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT); + } +#endif + + // initiator recive phase + // if the target is present syncronize with it + if( trans->target2initiator_buffer_size > 0 ) { + if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer, + trans->target2initiator_buffer_size) ) { + serial_output(); + serial_high(); + *trans->status = TRANSACTION_DATA_ERROR; + sei(); + return TRANSACTION_DATA_ERROR; + } + } + + // initiator switch to output + change_reciver2sender(); + + // initiator send phase + if( trans->initiator2target_buffer_size > 0 ) { + serial_send_packet((uint8_t *)trans->initiator2target_buffer, + trans->initiator2target_buffer_size); + } + + // always, release the line when not in use + sync_send(); + + *trans->status = TRANSACTION_END; + sei(); + return TRANSACTION_END; +} + +#ifdef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_get_and_clean_status(int sstd_index) { + SSTD_t *trans = &Transaction_table[sstd_index]; + cli(); + int retval = *trans->status; + *trans->status = 0;; + sei(); + return retval; +} +#endif + +#endif + +// Helix serial.c history +// 2018-1-29 fork from let's split (#2308) +// 2018-6-28 bug fix master to slave comm (#3255) +// 2018-8-11 improvements (#3608) +// 2018-10-21 fix serial and RGB animation conflict (#4191) diff --git a/keyboards/zinc/serial.h b/keyboards/zinc/serial.h new file mode 100644 index 000000000000..7e0c0847a431 --- /dev/null +++ b/keyboards/zinc/serial.h @@ -0,0 +1,84 @@ +#ifndef SOFT_SERIAL_H +#define SOFT_SERIAL_H + +#include + +// ///////////////////////////////////////////////////////////////// +// Need Soft Serial defines in config.h +// ///////////////////////////////////////////////////////////////// +// ex. +// #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6 +// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5 +// // 1: about 137kbps (default) +// // 2: about 75kbps +// // 3: about 39kbps +// // 4: about 26kbps +// // 5: about 20kbps +// +// //// USE Simple API (OLD API, compatible with let's split serial.c) +// ex. +// #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 +// #define SERIAL_MASTER_BUFFER_LENGTH 1 +// +// //// USE flexible API (using multi-type transaction function) +// #define SERIAL_USE_MULTI_TRANSACTION +// +// ///////////////////////////////////////////////////////////////// + + +#ifndef SERIAL_USE_MULTI_TRANSACTION +/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ +#if SERIAL_SLAVE_BUFFER_LENGTH > 0 +extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; +#endif +#if SERIAL_MASTER_BUFFER_LENGTH > 0 +extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; +#endif + +void serial_master_init(void); +void serial_slave_init(void); +int serial_update_buffers(void); + +#endif // USE Simple API + +// Soft Serial Transaction Descriptor +typedef struct _SSTD_t { + uint8_t *status; + uint8_t initiator2target_buffer_size; + uint8_t *initiator2target_buffer; + uint8_t target2initiator_buffer_size; + uint8_t *target2initiator_buffer; +} SSTD_t; +#define TID_LIMIT( table ) (sizeof(table) / sizeof(SSTD_t)) + +// initiator is transaction start side +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size); +// target is interrupt accept side +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size); + +// initiator resullt +#define TRANSACTION_END 0 +#define TRANSACTION_NO_RESPONSE 0x1 +#define TRANSACTION_DATA_ERROR 0x2 +#define TRANSACTION_TYPE_ERROR 0x4 +#ifndef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_transaction(void); +#else +int soft_serial_transaction(int sstd_index); +#endif + +// target status +// *SSTD_t.status has +// initiator: +// TRANSACTION_END +// or TRANSACTION_NO_RESPONSE +// or TRANSACTION_DATA_ERROR +// target: +// TRANSACTION_DATA_ERROR +// or TRANSACTION_ACCEPTED +#define TRANSACTION_ACCEPTED 0x8 +#ifdef SERIAL_USE_MULTI_TRANSACTION +int soft_serial_get_and_clean_status(int sstd_index); +#endif + +#endif /* SOFT_SERIAL_H */ diff --git a/keyboards/zinc/zinc.c b/keyboards/zinc/zinc.c new file mode 100644 index 000000000000..139919d5a60f --- /dev/null +++ b/keyboards/zinc/zinc.c @@ -0,0 +1 @@ +#include "zinc.h" diff --git a/keyboards/zinc/zinc.h b/keyboards/zinc/zinc.h new file mode 100644 index 000000000000..87d889da0332 --- /dev/null +++ b/keyboards/zinc/zinc.h @@ -0,0 +1,14 @@ +#ifndef ZINC_H +#define ZINC_H + +#ifdef KEYBOARD_zinc_reva + #include "reva.h" +#endif +#ifdef KEYBOARD_zinc_rev1 + #include "rev1.h" +#endif + + +#include "quantum.h" + +#endif From 6916c0d728c604895c96bb7105114b153f1f6731 Mon Sep 17 00:00:00 2001 From: Mattia Dal Ben Date: Sat, 27 Oct 2018 17:23:12 +0200 Subject: [PATCH 289/505] Redox Wireless configurator support (#4256) --- keyboards/redox_w/info.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 keyboards/redox_w/info.json diff --git a/keyboards/redox_w/info.json b/keyboards/redox_w/info.json new file mode 100644 index 000000000000..5bc65b5d98de --- /dev/null +++ b/keyboards/redox_w/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Redox Wireless", + "url": "", + "maintainer": "qmk", + "width": 18.5, + "height": 6.25, + "layouts": { + "LAYOUT": { + "layout": [{"label":"[L2] `", "x":0, "y":0.375, "w":1.25}, {"label":"!", "x":1.25, "y":0.375}, {"label":"@", "x":2.25, "y":0.125}, {"label":"#", "x":3.25, "y":0}, {"label":"$", "x":4.25, "y":0.125}, {"label":"%", "x":5.25, "y":0.25}, {"label":"[L1]", "x":6.25, "y":0.75}, {"label":"[L1]", "x":11.25, "y":0.75}, {"label":"^", "x":12.25, "y":0.25}, {"label":"&", "x":13.25, "y":0.125}, {"label":"*", "x":14.25, "y":0}, {"label":"(", "x":15.25, "y":0.125}, {"label":")", "x":16.25, "y":0.375}, {"label":"[L2] -", "x":17.25, "y":0.375, "w":1.25}, {"label":"Tab", "x":0, "y":1.375, "w":1.25}, {"label":"Q", "x":1.25, "y":1.375}, {"label":"W", "x":2.25, "y":1.125}, {"label":"E", "x":3.25, "y":1}, {"label":"R", "x":4.25, "y":1.125}, {"label":"T", "x":5.25, "y":1.25}, {"label":"[", "x":6.25, "y":1.75, "h":1.5}, {"label":"]", "x":11.25, "y":1.75, "h":1.5}, {"label":"Y", "x":12.25, "y":1.25}, {"label":"U", "x":13.25, "y":1.125}, {"label":"I", "x":14.25, "y":1}, {"label":"O", "x":15.25, "y":1.125}, {"label":"P", "x":16.25, "y":1.375}, {"label":"=", "x":17.25, "y":1.375, "w":1.25}, {"label":"Esc", "x":0, "y":2.375, "w":1.25}, {"label":"A", "x":1.25, "y":2.375}, {"label":"S", "x":2.25, "y":2.125}, {"label":"D", "x":3.25, "y":2}, {"label":"F", "x":4.25, "y":2.125}, {"label":"G", "x":5.25, "y":2.25}, {"label":"PgUp", "x":6.75, "y":3.75}, {"label":"End", "x":10.75, "y":3.75}, {"label":"H", "x":12.25, "y":2.25}, {"label":"J", "x":13.25, "y":2.125}, {"label":"K", "x":14.25, "y":2}, {"label":"L", "x":15.25, "y":2.125}, {"label":":", "x":16.25, "y":2.375}, {"label":"'", "x":17.25, "y":2.375, "w":1.25}, {"label":"Shift", "x":0, "y":3.375, "w":1.25}, {"label":"Z", "x":1.25, "y":3.375}, {"label":"X", "x":2.25, "y":3.125}, {"label":"C", "x":3.25, "y":3}, {"label":"V", "x":4.25, "y":3.125}, {"label":"B", "x":5.25, "y":3.25}, {"label":"PgDn", "x":7.75, "y":3.75}, {"label":"Home", "x":9.75, "y":3.75}, {"label":"N", "x":12.25, "y":3.25}, {"label":"M", "x":13.25, "y":3.125}, {"label":"<", "x":14.25, "y":3}, {"label":">", "x":15.25, "y":3.125}, {"label":"?", "x":16.25, "y":3.375}, {"label":"Shift", "x":17.25, "y":3.375, "w":1.25}, {"label":"GUI", "x":0.25, "y":4.375}, {"label":"+", "x":1.25, "y":4.375}, {"label":"-", "x":2.25, "y":4.125}, {"label":"[Alt] *", "x":3.25, "y":4}, {"label":"[Ctrl] /", "x":5.5, "y":5.25, "w":1.25}, {"label":"Backspace", "x":6.75, "y":4.75, "h":1.5}, {"label":"Del", "x":7.75, "y":4.75, "h":1.5}, {"label":"Enter", "x":9.75, "y":4.75, "h":1.5}, {"label":"Space", "x":10.75, "y":4.75, "h":1.5}, {"label":"Alt", "x":11.75, "y":5.25, "w":1.25}, {"label":"Left", "x":14.25, "y":4}, {"label":"Down", "x":15.25, "y":4.125}, {"label":"Up", "x":16.25, "y":4.375}, {"label":"Right", "x":17.25, "y":4.375}] + } + } +} From 2da852215443dc62617efee911c11a6dd9d03139 Mon Sep 17 00:00:00 2001 From: Jasper Lievisse Adriaanse Date: Sat, 27 Oct 2018 17:29:34 +0200 Subject: [PATCH 290/505] Keymap: add my planck rev 5 layout (#4085) --- keyboards/planck/keymaps/jasperla/config.h | 10 ++ keyboards/planck/keymaps/jasperla/keymap.c | 136 ++++++++++++++++++++ keyboards/planck/keymaps/jasperla/readme.md | 7 + keyboards/planck/keymaps/jasperla/rules.mk | 1 + 4 files changed, 154 insertions(+) create mode 100644 keyboards/planck/keymaps/jasperla/config.h create mode 100644 keyboards/planck/keymaps/jasperla/keymap.c create mode 100644 keyboards/planck/keymaps/jasperla/readme.md create mode 100644 keyboards/planck/keymaps/jasperla/rules.mk diff --git a/keyboards/planck/keymaps/jasperla/config.h b/keyboards/planck/keymaps/jasperla/config.h new file mode 100644 index 000000000000..dc2a7369b4d2 --- /dev/null +++ b/keyboards/planck/keymaps/jasperla/config.h @@ -0,0 +1,10 @@ +#pragma once + +#ifdef AUDIO_ENABLE + #define STARTUP_SONG SONG(PLANCK_SOUND) +#endif + +/* + * MIDI options + */ +#define MIDI_BASIC diff --git a/keyboards/planck/keymaps/jasperla/keymap.c b/keyboards/planck/keymaps/jasperla/keymap.c new file mode 100644 index 000000000000..14f445d0f20f --- /dev/null +++ b/keyboards/planck/keymaps/jasperla/keymap.c @@ -0,0 +1,136 @@ +/* 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 . + */ + +#include QMK_KEYBOARD_H +#include "muse.h" + +extern keymap_config_t keymap_config; + +enum planck_layers { + _QWERTY, + _LOWER, + _RAISE, + _POINTER, + _ADJUST +}; + +#define QWERTY 0 + +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) +#define PT MO(_POINTER) + +/* ALT+F12 is mapped (in software) to lock the user's display */ +#define LOCK LALT(KC_F12) + +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 | , | . | / |Shift | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | Ctrl | | LGUI | Alt |Lower | SPC | Enter|Raise |Point.| | LOCK | | + * `-----------------------------------------------------------------------------------' + */ +[_QWERTY] = LAYOUT_planck_grid( + 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_RSFT , + KC_LCTL, _______, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, PT, _______, LOCK, _______ +), + +/* Lower + * ,-----------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_planck_grid( + 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_HOME, KC_END, _______, + _______, _______, _______, _______, _______, _______, _______, _______, 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 | INS |ISO / |Pg Up |Pg Dn | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_planck_grid( + 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_INS, KC_NUBS, KC_PGUP, KC_PGDN, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), + +/* Pointers + * ,-----------------------------------------------------------------------------------. + * | | | | | | | | | Up | | | | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | | | | | Left | Down | Right| | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_POINTER] = LAYOUT_planck_grid( + _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, PT, _______, _______, _______ +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty| | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_planck_grid( + _______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, _______, RGB_VAI, RGB_VAD, KC_DEL , + _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______, + _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + + +}; + +uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); +} diff --git a/keyboards/planck/keymaps/jasperla/readme.md b/keyboards/planck/keymaps/jasperla/readme.md new file mode 100644 index 000000000000..381667c73a38 --- /dev/null +++ b/keyboards/planck/keymaps/jasperla/readme.md @@ -0,0 +1,7 @@ +# jasperla's keymap for Planck + +Slightly adjusted from the default keymap: +- map the arrow keys to IJKL on a separate "pointers" layer +- return key is next to the space key, and an RSHIFT is mapped + to where return used to be +- removed the dvorak, colemak and plover layers diff --git a/keyboards/planck/keymaps/jasperla/rules.mk b/keyboards/planck/keymaps/jasperla/rules.mk new file mode 100644 index 000000000000..dcf16bef3994 --- /dev/null +++ b/keyboards/planck/keymaps/jasperla/rules.mk @@ -0,0 +1 @@ +SRC += muse.c From 569545a78f24644b1b130369d53932f7f46a588a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=BDan=20Pevec?= Date: Sat, 27 Oct 2018 17:30:47 +0200 Subject: [PATCH 291/505] Keymap: Personal dz60 keymap (#4251) * Personal dz60 keymap * Replacing unused macros Co-Authored-By: pevecyan * Fixes on keymap --- keyboards/dz60/keymaps/pevecyan/keymap.c | 41 ++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 keyboards/dz60/keymaps/pevecyan/keymap.c diff --git a/keyboards/dz60/keymaps/pevecyan/keymap.c b/keyboards/dz60/keymaps/pevecyan/keymap.c new file mode 100644 index 000000000000..897b6260bad4 --- /dev/null +++ b/keyboards/dz60/keymaps/pevecyan/keymap.c @@ -0,0 +1,41 @@ + +#include QMK_KEYBOARD_H +#include "keymap_slovenian.h" + + +#define CARON LT(3, SI_CIRC) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [0] = LAYOUT( \ + KC_GESC,SI_1, SI_2, SI_3, SI_4, SI_5, SI_6, SI_7, SI_8, SI_9, SI_0, SI_QOT, SI_PLUS,XXXXXXX,KC_BSPC, \ + KC_TAB, SI_Q, SI_W, SI_E, SI_R, SI_T, SI_Z, SI_U, SI_I, SI_O, SI_P, SI_GRV, SI_TILD,CARON, \ + MO(2), SI_A, SI_S, SI_D, SI_F, SI_G, SI_H, SI_J, SI_K, SI_L, KC_SCLN,KC_QUOT,KC_ENT, \ + KC_LSFT,XXXXXXX,SI_Y, SI_X, SI_C, SI_V, SI_B, SI_N, SI_M, SI_COMM,SI_DOT, SI_MINS, KC_RSFT,XXXXXXX, \ + KC_LCTL,KC_LGUI, KC_LALT,KC_SPC, KC_SPC, KC_SPC, KC_RALT,MO(3), XXXXXXX,MO(1), KC_F5 \ + ), + + [1] = LAYOUT( \ + 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, \ + _______, RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD,_______,_______,_______,_______,RESET, \ + _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ + _______,_______,_______,_______,BL_DEC, BL_TOGG,BL_INC, BL_STEP,_______,_______,_______,_______, _______,_______, \ + _______,_______, _______,_______, _______, _______, _______,_______,_______,_______,_______ \ + ), + + [2] = LAYOUT( \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ + _______, KC_BSPC,KC_UP, KC_DEL, _______,_______,_______,_______,_______,_______,_______,_______,KC_HOME, KC_END, \ + _______, KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______, \ + _______,_______, _______,_______, _______, _______, _______,_______,_______,_______,_______ \ + ), + + [3] = LAYOUT( \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ + _______, _______,_______,_______,_______,_______,SI_ZV, _______,_______,_______,_______,_______,_______,_______, \ + _______, _______,SI_SV, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ + _______,_______,_______,_______,SI_CV, _______,_______,_______,_______,_______,_______,_______, _______,_______, \ + _______,_______, _______,_______, _______, _______, _______,_______,_______,_______,_______ \ + ), +}; From 9ea01035202e0d9b43413537702ac77b4c32108c Mon Sep 17 00:00:00 2001 From: Mattia Dal Ben Date: Sat, 27 Oct 2018 18:40:28 +0200 Subject: [PATCH 292/505] Keyboard: Redox keymaps refactoring (#4258) * Reconfigured keymap macro to resemble physical layout * Updated italian keymap * Added RGB controls * Updated default keymap * Updated german layout * Updated jeherve keymap * Changed include guards to pragmas * Changed include guards to pragmas in keymaps * Update readme * Fixed unused include * Fixed indentation --- keyboards/redox/config.h | 5 +- keyboards/redox/keymaps/default/config.h | 7 +- keyboards/redox/keymaps/default/keymap.c | 136 +++++++---------- keyboards/redox/keymaps/german/keymap.c | 126 ++++++++-------- keyboards/redox/keymaps/italian/config.h | 7 +- keyboards/redox/keymaps/italian/keymap.c | 146 +++++++++--------- keyboards/redox/keymaps/jeherve/keymap.c | 179 ++++++++++------------- keyboards/redox/readme.md | 10 +- keyboards/redox/redox.h | 22 +-- keyboards/redox/rev1/config.h | 5 +- keyboards/redox/rev1/rev1.h | 74 +++------- 11 files changed, 290 insertions(+), 427 deletions(-) diff --git a/keyboards/redox/config.h b/keyboards/redox/config.h index 1083ff5f59ad..96f57f25ebbd 100644 --- a/keyboards/redox/config.h +++ b/keyboards/redox/config.h @@ -15,9 +15,6 @@ 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 +#pragma once #include "config_common.h" - -#endif diff --git a/keyboards/redox/keymaps/default/config.h b/keyboards/redox/keymaps/default/config.h index 22e26c0041b8..0670bf294fb6 100644 --- a/keyboards/redox/keymaps/default/config.h +++ b/keyboards/redox/keymaps/default/config.h @@ -15,10 +15,7 @@ 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 - -#include "../../config.h" +#pragma once /* Use I2C or Serial, not both */ @@ -37,5 +34,3 @@ along with this program. If not, see . #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 - -#endif diff --git a/keyboards/redox/keymaps/default/keymap.c b/keyboards/redox/keymaps/default/keymap.c index 3031a0c8e361..ef8eeb2e1406 100644 --- a/keyboards/redox/keymaps/default/keymap.c +++ b/keyboards/redox/keymaps/default/keymap.c @@ -18,99 +18,75 @@ enum custom_keycodes { ADJUST, }; -// Fillers to make layering more clear -#define KC_ KC_TRNS -#define _______ KC_TRNS -#define XXXXXXX KC_NO +// Shortcut to make keymap more readable +#define KC_BKSL KC_BSLASH +#define SYM_L MO(_SYMB) + +#define KC_ALAS LALT_T(KC_PAST) +#define KC_CTPL LCTL_T(KC_PSLS) + +#define KC_NAGR LT(_NAV, KC_GRV) +#define KC_NAMI LT(_NAV, KC_MINS) + +#define KC_ADEN LT(_ADJUST, KC_END) +#define KC_ADPU LT(_ADJUST, KC_PGUP) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* QWERTY - * ,------------------------------------------------. ,------------------------------------------------. - * |`-Lyr2| 1 | 2 | 3 | 4 | 5 | Lyr1 | | Lyr1 | 6 | 7 | 8 | 9 | 0 |--Lyr2| - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | = | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Esc | A | S | D | F | G | PgUp | | End | H | J | K | L | ; | ' | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | PgDn | | Home | N | M | , | . | \ |Shift | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Gui | + | - |*(Alt)|/(Ctr)|Bcksp | Del | |Enter |Space | Alt | Left | Down | Up | Right| - * `------------------------------------------------' `------------------------------------------------' - */ [_QWERTY] = LAYOUT( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - LT(_NAV, KC_GRV) , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 ,MO(_SYMB), MO(_SYMB), KC_6 , KC_7 , KC_8 , KC_9 , KC_0 ,LT(_NAV, KC_MINS), - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T ,KC_LBRC, KC_RBRC , KC_Y , KC_U , KC_I , KC_O , KC_P ,KC_EQL, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_ESC , KC_A , KC_S , KC_D , KC_F , KC_G , LT(_ADJUST, KC_PGUP), LT( _ADJUST, KC_END) , 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_PGDN, KC_HOME , KC_N , KC_M ,KC_COMM,KC_DOT ,KC_BSLASH, KC_RSFT, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_LGUI,KC_PPLS,KC_PMNS,LALT_T(KC_PAST),LCTL_T(KC_PSLS),KC_BSPC,KC_DEL , KC_ENT , KC_SPC, KC_RALT,KC_LEFT,KC_DOWN, KC_UP ,KC_RGHT - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_NAGR ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_NAMI , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,SYM_L , SYM_L ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_EQL , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_ESC ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_LBRC , KC_RBRC ,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_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_BKSL ,KC_RSFT , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + KC_LGUI ,KC_PPLS ,KC_PMNS ,KC_ALAS , KC_CTPL , KC_BSPC ,KC_DEL , KC_ENT ,KC_SPC , KC_RALT , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Symbols - * ,------------------------------------------------. ,------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | ! | @ | { | } | | | | | | | 7 | 8 | 9 | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | # | $ | [ | ] | ~ | | | | | 4 | 5 | 6 | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | % | ^ | ( | ) | ` | | | | | 1 | 2 | 3 | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | 0 | 0 | . | | | - * `------------------------------------------------' `------------------------------------------------' - */ - [_SYMB] = LAYOUT( - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, - _______, KC_EXLM, KC_AT , KC_LCBR, KC_RCBR, KC_PIPE, _______, _______, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, XXXXXXX, XXXXXXX, - _______, KC_HASH, KC_DLR , KC_LBRC, KC_RBRC, KC_GRV, _______, _______, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, XXXXXXX, XXXXXXX, - _______, KC_PERC, KC_CIRC, KC_LPRN, KC_RPRN, KC_TILD, _______, _______, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, XXXXXXX, XXXXXXX, - _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_0, KC_KP_0, KC_PDOT, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_EXLM ,KC_AT ,KC_LCBR ,KC_RCBR ,KC_PIPE ,_______ , _______ ,XXXXXXX ,KC_KP_7 ,KC_KP_8 ,KC_KP_9 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_HASH ,KC_DLR ,KC_LBRC ,KC_RBRC ,KC_GRV ,_______ , _______ ,XXXXXXX ,KC_KP_4 ,KC_KP_5 ,KC_KP_6 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_PERC ,KC_CIRC ,KC_LPRN ,KC_RPRN ,KC_TILD ,_______ ,_______ , _______ ,_______ ,XXXXXXX ,KC_KP_1 ,KC_KP_2 ,KC_KP_3 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , KC_KP_0 , KC_KP_0 ,KC_PDOT ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Navigation - * ,------------------------------------------------. ,------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | |MOUS_U| |WHEL_U| | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | |MOUS_L|MOUS_D|MOUS_R|WHEL_D| | | | | LEFT | DOWN | UP |RIGHT | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | |MOUS_1|MOUS_2| | | | | | | | | | - * `------------------------------------------------' `------------------------------------------------' - */ [_NAV] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - XXXXXXX, XXXXXXX, KC_MS_U, XXXXXXX, KC_WH_U, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, XXXXXXX, _______, _______, KC_LEFT, KC_DOWN, KC_UP , KC_RIGHT,XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,KC_MS_U ,XXXXXXX ,KC_WH_U ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D ,XXXXXXX ,_______ , _______ ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_BTN1 , KC_BTN2 ,_______ , _______ ,_______ , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), [_ADJUST] = LAYOUT( - XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, - XXXXXXX, RESET , RGB_M_P, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, XXXXXXX, KC_DEL, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,RESET ,RGB_M_P ,RGB_TOG ,RGB_MOD ,RGB_HUD ,RGB_HUI , RGB_SAD ,RGB_SAI ,RGB_VAD ,RGB_VAI ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,XXXXXXX , XXXXXXX ,_______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ) }; - -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -#endif - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - diff --git a/keyboards/redox/keymaps/german/keymap.c b/keyboards/redox/keymaps/german/keymap.c index 315740f68b5d..f94cd164a807 100644 --- a/keyboards/redox/keymaps/german/keymap.c +++ b/keyboards/redox/keymaps/german/keymap.c @@ -1,4 +1,5 @@ #include QMK_KEYBOARD_H + #include "keymap_german.h" extern keymap_config_t keymap_config; @@ -20,89 +21,76 @@ enum custom_keycodes { ADJUST, }; -// Fillers to make layering more clear -#define KC_ KC_TRNS -#define _______ KC_TRNS -#define XXXXXXX KC_NO +// Shortcut to make keymap more readable +#define KC_BKSL KC_BSLASH +#define SYM_L MO(_SYMB) + +#define KC_ALAS LALT_T(KC_PAST) +#define KC_CTPL LCTL_T(KC_PSLS) + +#define KC_NAGR LT(_NAV, DE_CIRC) +#define KC_NAMI LT(_NAV, DE_SS) + +#define KC_ADEN LT(_ADJUST, KC_END) +#define KC_ADPU LT(_ADJUST, KC_PGUP) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* QWERTY - * ,------------------------------------------------. ,------------------------------------------------. - * |^/Lyr2| 1 | 2 | 3 | 4 | 5 | Lyr1 | | Lyr1 | 6 | 7 | 8 | 9 | 0 |--Lyr2| - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Tab | Q | W | E | R | T | ` | | + | Y | U | I | O | P | = | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Esc | A | S | D | F | G | PgUp | | End | H | J | K | L | Ö | Ä | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | PgDn | | Home | N | M | , | . | - |Shift | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Gui | < | # |*(Alt)|/(Ctr)|Bcksp | Del | |Enter |Space | Alt | Left | Down | Up | Right| - * `------------------------------------------------' `------------------------------------------------' - */ [_QWERTY] = LAYOUT( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - LT(_NAV, DE_CIRC) , DE_1 , DE_2 , DE_3 , DE_4 , DE_5 ,MO(_SYMB), MO(_SYMB), DE_6 , DE_7 , DE_8 , DE_9 , DE_0 ,LT(_NAV, DE_SS), - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_TAB , DE_Q , DE_W , DE_E , DE_R , DE_T , DE_ACUT, DE_PLUS , DE_Z , DE_U , DE_I , DE_O , DE_P , DE_UE, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_ESC , DE_A , DE_S , DE_D , DE_F , DE_G , LT(_ADJUST, KC_PGUP), LT( _ADJUST, KC_END) , DE_H , DE_J , DE_K , DE_L , DE_OE , DE_AE, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_LSFT, DE_Y , DE_X , DE_C , DE_V , DE_B ,KC_PGDN, KC_HOME , DE_N , DE_M , DE_COMM, DE_DOT , DE_MINS , KC_RSFT, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_LGUI , DE_LESS , DE_HASH , LALT_T(KC_KP_PLUS),LCTL_T(KC_KP_ASTERISK),KC_BSPC,KC_DEL , KC_ENT , KC_SPC, DE_ALGR , KC_LEFT, KC_DOWN, KC_UP , KC_RGHT - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_NAGR ,DE_1 ,DE_2 ,DE_3 ,DE_4 ,DE_5 , DE_6 ,DE_7 ,DE_8 ,DE_9 ,DE_0 ,KC_NAMI , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,DE_Q ,DE_W ,DE_E ,DE_R ,DE_T ,SYM_L , SYM_L ,DE_Z ,DE_U ,DE_I ,DE_O ,DE_P ,DE_UE , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_ESC ,DE_A ,DE_S ,DE_D ,DE_F ,DE_G ,DE_ACUT , DE_PLUS ,DE_H ,DE_J ,DE_K ,DE_L ,DE_OE ,DE_AE , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT ,DE_Y ,DE_X ,DE_C ,DE_V ,DE_B ,KC_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,DE_N ,DE_M ,DE_COMM ,DE_DOT ,DE_MINS ,KC_RSFT , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + KC_LGUI ,KC_PPLS ,KC_PMNS ,KC_ALAS , KC_CTPL , KC_BSPC ,KC_DEL , KC_ENT ,KC_SPC , KC_RALT , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Symbols - * ,------------------------------------------------. ,------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | ! | @ | { | } | | | | | | | 7 | 8 | 9 | | F12 | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | # | $ | [ | ] | ~ | | | | | 4 | 5 | 6 | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Shift| % | ^ | ( | ) | ` | | | | | 1 | 2 | 3 | |Shift | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | Alt | Ctrl | | | | | | 0 | 0 | . | | | - * `------------------------------------------------' `------------------------------------------------' - */ [_SYMB] = LAYOUT( - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, - _______, DE_EXLM, DE_AT , DE_LCBR, DE_RCBR, DE_PIPE, _______, _______, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, XXXXXXX, KC_F12, - _______, DE_HASH, DE_DLR , DE_LBRC, DE_RBRC, DE_TILD, _______, _______, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, XXXXXXX, XXXXXXX, - KC_LSFT, DE_PERC, DE_CIRC, DE_LPRN, DE_RPRN, DE_GRV, _______, _______, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, XXXXXXX, KC_RSFT, - _______, _______, _______, KC_LALT, KC_LCTL, _______, _______, _______, _______, KC_KP_0, KC_KP_0, KC_PDOT, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_F11 , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,DE_EXLM ,DE_AT ,DE_LCBR ,DE_RCBR ,DE_PIPE ,_______ , _______ ,XXXXXXX ,KC_KP_7 ,KC_KP_8 ,KC_KP_9 ,XXXXXXX ,KC_F12 , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,DE_HASH ,DE_DLR ,DE_LBRC ,DE_RBRC ,DE_TILD ,_______ , _______ ,XXXXXXX ,KC_KP_4 ,KC_KP_5 ,KC_KP_6 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT ,DE_PERC ,DE_CIRC ,DE_LPRN ,DE_RPRN ,DE_GRV ,_______ ,_______ , _______ ,_______ ,XXXXXXX ,KC_KP_1 ,KC_KP_2 ,KC_KP_3 ,XXXXXXX ,KC_RSFT , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,KC_LALT , KC_LCTL , _______ ,_______ , _______ ,_______ , KC_KP_0 , KC_KP_0 ,KC_PDOT ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Navigation - * ,------------------------------------------------. ,------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | |MOUS_U| |WHEL_U| | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | |MOUS_L|MOUS_D|MOUS_R|WHEL_D| | | | | LEFT | DOWN | UP |RIGHT | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | |MOUS_1|MOUS_2| | | | | | | | | | - * `------------------------------------------------' `------------------------------------------------' - */ [_NAV] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - XXXXXXX, XXXXXXX, KC_MS_U, XXXXXXX, KC_WH_U, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, XXXXXXX, _______, _______, KC_LEFT, KC_DOWN, KC_UP , KC_RIGHT,XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,KC_MS_U ,XXXXXXX ,KC_WH_U ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D ,XXXXXXX ,_______ , _______ ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_BTN1 , KC_BTN2 ,_______ , _______ ,_______ , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), [_ADJUST] = LAYOUT( - XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, - XXXXXXX, RESET , RGB_M_P, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, XXXXXXX, KC_DEL, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,RESET ,RGB_M_P ,RGB_TOG ,RGB_MOD ,RGB_HUD ,RGB_HUI , RGB_SAD ,RGB_SAI ,RGB_VAD ,RGB_VAI ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,XXXXXXX , XXXXXXX ,_______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ) }; diff --git a/keyboards/redox/keymaps/italian/config.h b/keyboards/redox/keymaps/italian/config.h index 22e26c0041b8..0670bf294fb6 100644 --- a/keyboards/redox/keymaps/italian/config.h +++ b/keyboards/redox/keymaps/italian/config.h @@ -15,10 +15,7 @@ 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 - -#include "../../config.h" +#pragma once /* Use I2C or Serial, not both */ @@ -37,5 +34,3 @@ along with this program. If not, see . #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 - -#endif diff --git a/keyboards/redox/keymaps/italian/keymap.c b/keyboards/redox/keymaps/italian/keymap.c index c590d2d2d8a8..1eb34ff10461 100644 --- a/keyboards/redox/keymaps/italian/keymap.c +++ b/keyboards/redox/keymaps/italian/keymap.c @@ -1,5 +1,7 @@ #include QMK_KEYBOARD_H +#include "keymap_italian.h" + extern keymap_config_t keymap_config; // Each layer gets a name for readability, which is then used in the keymap matrix below. @@ -18,99 +20,83 @@ enum custom_keycodes { ADJUST, }; -// Fillers to make layering more clear -#define KC_ KC_TRNS -#define _______ KC_TRNS -#define XXXXXXX KC_NO +// Shortcut to make keymap more readable +#define KC_BKSL KC_BSLASH +#define SYM_L MO(_SYMB) + +#define KC_ALAS LALT_T(KC_PAST) +#define KC_CTPL LCTL_T(KC_PSLS) + +#define KC_NAGR LT(_NAV, KC_GRV) +#define KC_NAMI LT(_NAV, KC_MINS) + +#define KC_ADEN LT(_ADJUST, KC_END) +#define KC_ADPU LT(_ADJUST, KC_PGUP) + +// Italian specific shortcuts +#define ALT_IACC RALT_T(IT_IACC) +#define GUI_LESS LGUI_T(IT_LESS) + +#define IT_SHSL RSFT_T(KC_SLSH) +#define IT_GRV RALT(KC_MINS) +#define IT_TILD RALT(KC_EQL) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* QWERTY - * ,------------------------------------------------. ,------------------------------------------------. - * |\-Lyr2| 1 | 2 | 3 | 4 | 5 | Lyr1 | | Lyr1 | 6 | 7 | 8 | 9 | 0 |'-Lyr2| - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | è | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Esc | A | S | D | F | G | PgUp | | End | H | J | K | L | ò | à | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | PgDn | | Home | N | M | , | . | ù |-(Sft)| - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * |<(Gui)| + | - |*(Alt)|/(Ctr)|Bcksp | Del | |Enter |Space |ì(AlG)| Left | Down | Up | Right| - * `------------------------------------------------' `------------------------------------------------' - */ [_QWERTY] = LAYOUT( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - LT(_NAV, KC_GRV) , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 ,MO(_SYMB), MO(_SYMB), KC_6 , KC_7 , KC_8 , KC_9 , KC_0 ,LT(_NAV, KC_MINS), - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T ,RALT(KC_LBRC), RALT(KC_RBRC) , KC_Y , KC_U , KC_I , KC_O , KC_P ,KC_LBRC, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_ESC , KC_A , KC_S , KC_D , KC_F , KC_G , LT(_ADJUST, KC_PGUP), LT( _ADJUST, KC_END) , 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_PGDN, KC_HOME , KC_N , KC_M ,KC_COMM,KC_DOT ,KC_BSLASH,RSFT_T(KC_SLSH), - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - LGUI_T(KC_NONUS_BSLASH),KC_PPLS,KC_PMNS,LALT_T(KC_PAST),LCTL_T(KC_PSLS),KC_BSPC,KC_DEL , KC_ENT , KC_SPC, RALT_T(KC_EQL),KC_LEFT,KC_DOWN, KC_UP ,KC_RGHT - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_NAGR ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_NAMI , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,SYM_L , SYM_L ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,IT_EACC , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_ESC ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,IT_LBRC , IT_RBRC ,KC_H ,KC_J ,KC_K ,KC_L ,IT_OACC ,IT_AACC , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,IT_UACC ,IT_SHSL , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + GUI_LESS,KC_PPLS ,KC_PMNS ,KC_ALAS , KC_CTPL , KC_BSPC ,KC_DEL , KC_ENT ,KC_SPC , ALT_IACC, KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Symbols - * ,------------------------------------------------. ,------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | ! | @ | { | } | | | | | | | 7 | 8 | 9 | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | # | $ | [ | ] | ~ | | | | | 4 | 5 | 6 | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | % | ^ | ( | ) | ` | | | | | 1 | 2 | 3 | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | 0 | 0 | . | | | - * `------------------------------------------------' `------------------------------------------------' - */ - [_SYMB] = LAYOUT( - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, - _______, KC_EXLM, RALT(KC_SCLN), RALT(KC_LCBR), RALT(KC_RCBR), KC_TILD, _______, _______, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, XXXXXXX, XXXXXXX, - _______, RALT(KC_QUOT), KC_DLR , RALT(KC_LBRC), RALT(KC_RBRC), RALT(KC_EQL), _______, _______, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, XXXXXXX, XXXXXXX, - _______, KC_PERC, LSFT(KC_EQL) , LSFT(KC_8), LSFT(KC_9), RALT(KC_MINS), _______, _______, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, XXXXXXX, XXXXXXX, - _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_0, KC_KP_0, KC_PDOT, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,IT_EXLM ,IT_AT ,IT_LCBR ,IT_RCBR ,IT_PIPE ,_______ , _______ ,XXXXXXX ,KC_KP_7 ,KC_KP_8 ,KC_KP_9 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,IT_SHRP ,IT_DLR ,IT_LBRC ,IT_RBRC ,IT_GRV ,_______ , _______ ,XXXXXXX ,KC_KP_4 ,KC_KP_5 ,KC_KP_6 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,IT_PERC ,IT_CRC ,IT_LPRN ,IT_RPRN ,IT_TILD ,_______ ,_______ , _______ ,_______ ,XXXXXXX ,KC_KP_1 ,KC_KP_2 ,KC_KP_3 ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , KC_KP_0 , KC_KP_0 ,KC_PDOT ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Navigation - * ,------------------------------------------------. ,------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | |MOUS_U| |WHEL_U| | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | |MOUS_L|MOUS_D|MOUS_R|WHEL_D| | | | | LEFT | DOWN | UP |RIGHT | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | |MOUS_1|MOUS_2| | | | | | | | | | - * `------------------------------------------------' `------------------------------------------------' - */ [_NAV] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - XXXXXXX, XXXXXXX, KC_MS_U, XXXXXXX, KC_WH_U, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, XXXXXXX, _______, _______, KC_LEFT, KC_DOWN, KC_UP , KC_RIGHT,XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,KC_MS_U ,XXXXXXX ,KC_WH_U ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D ,XXXXXXX ,_______ , _______ ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_BTN1 , KC_BTN2 ,_______ , _______ ,_______ , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), [_ADJUST] = LAYOUT( - XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, - XXXXXXX, RESET , RGB_M_P, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, XXXXXXX, KC_DEL, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,RESET ,RGB_M_P ,RGB_TOG ,RGB_MOD ,RGB_HUD ,RGB_HUI , RGB_SAD ,RGB_SAI ,RGB_VAD ,RGB_VAI ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,XXXXXXX , XXXXXXX ,_______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ) }; - -#ifdef AUDIO_ENABLE -float tone_qwerty[][2] = SONG(QWERTY_SOUND); -#endif - -void persistent_default_layer_set(uint16_t default_layer) { - eeconfig_update_default_layer(default_layer); - default_layer_set(default_layer); -} - diff --git a/keyboards/redox/keymaps/jeherve/keymap.c b/keyboards/redox/keymaps/jeherve/keymap.c index d298fa9a31c0..f8dfc4854c6e 100644 --- a/keyboards/redox/keymaps/jeherve/keymap.c +++ b/keyboards/redox/keymaps/jeherve/keymap.c @@ -28,11 +28,6 @@ enum custom_keycodes { NBSP }; -// Fillers to make layering more clear -#define KC_ KC_TRNS -#define _______ KC_TRNS -#define XXXXXXX KC_NO - // Make macros a bit simpler with this shortcut. #define TAP_ONCE(code) \ register_code (code); \ @@ -129,118 +124,98 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; }; +// Shortcut to make keymap more readable +#define KC_CTDN LCTL(KC_DOWN) +#define KC_SYQT LT(_SYMB,KC_QUOT) +#define SYM_L MO(_SYMB) +#define MO_INTR MO(_INTER) +#define TT_ADJ TT(_ADJUST) + +#define UC_00E0 UC(0x00E0) +#define UC_00FC UC(0x00FC) +#define UC_00E8 UC(0x00E8) +#define UC_00F6 UC(0x00F6) +#define UC_00E1 UC(0x00E1) +#define UC_00F9 UC(0x00F9) +#define UC_00E9 UC(0x00E9) +#define UC_00ED UC(0x00ED) +#define UC_00F3 UC(0x00F3) +#define UC_00E2 UC(0x00E2) +#define UC_00E7 UC(0x00E7) +#define UC_0171 UC(0x0171) +#define UC_00EA UC(0x00EA) +#define UC_0151 UC(0x0151) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -/* COLEMAK - * ,------------------------------------------------. ,------------------------------------------------. - * | ` | 1 | 2 | 3 | 4 | 5 | Esc | | Exp | 6 | 7 | 8 | 9 | 0 | = | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Tab | Q | W | F | P | G | ( | | ) | J | L | U | Y | ; | \ | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Lay1 | A | R | S | T | D | Lay2 | | Lay2 | H | N | E | I | O |'/Lay1| - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | Lay1 | | Lay1 | K | M | , | . | / |Shift | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | Lay3 | Ctrl | Hyper| Alt | Cmd |Bcksp | Ctrl | |Enter |Space | Cmd | Lay4 | Hyper| Ctrl | Lay3 | - * `------------------------------------------------' `------------------------------------------------' - */ [_COLEMAK] = LAYOUT( - //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----. - KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 ,KC_ESC, LCTL(KC_DOWN), KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_EQL, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_TAB , KC_Q , KC_W , KC_F , KC_P , KC_G , M_BRACKET_LEFT, M_BRACKET_RIGHT , KC_J , KC_L , KC_U , KC_Y , KC_SCLN , KC_BSLS, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - MO(_SYMB) , KC_A , KC_R , KC_S , KC_T , KC_D ,TT(_NAV), TT(_NAV) , KC_H , KC_N , KC_E , KC_I , KC_O , LT(_SYMB,KC_QUOT), - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B ,TT(_SYMB), TT(_SYMB) , KC_K , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_RSFT, - //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| - MO(_INTER),KC_LCTL,KC_HYPR,KC_LALT, KC_LCMD, KC_BSPC,KC_LCTL, KC_ENT,KC_SPC , KC_RCMD , TT(_ADJUST),KC_HYPR,KC_RCTL,MO(_INTER) - //`----+----+----+----+----+----+----' `----+----+----+----+----+----+----' + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_GRV ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_EQL , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_F ,KC_P ,KC_G ,KC_ESC , KC_CTDN ,KC_J ,KC_L ,KC_U ,KC_Y ,KC_SCLN ,KC_BSLS , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + SYM_L ,KC_A ,KC_R ,KC_S ,KC_T ,KC_D ,M_BRACKET_LEFT, M_BRACKET_RIGHT ,KC_H ,KC_N ,KC_E ,KC_I ,KC_O ,KC_SYQT , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,TT(_NAV),TT(_SYMB), TT(_SYMB),TT(_NAV),KC_K ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSFT , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + MO_INTR ,KC_LCTL ,KC_HYPR ,KC_LALT , KC_LCMD , KC_BSPC ,KC_LCTL , KC_ENT ,KC_SPC , KC_RCMD , TT_ADJ ,KC_HYPR ,KC_RCTL ,MO_INTR + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Symbols - * ,------------------------------------------------. ,------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | ! | @ | # | $ | % | | | | ^ | & | * | - | _ | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * `------------------------------------------------' `------------------------------------------------' - */ - [_SYMB] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_LCBR, KC_RCBR, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , _______, - _______, KC_EXLM, KC_AT , KC_HASH, KC_DLR , KC_PERC, _______, _______, KC_CIRC, KC_AMPR, KC_ASTR, KC_MINS, KC_UNDS, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_LCBR , KC_RCBR ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_EXLM ,KC_AT ,KC_HASH ,KC_DLR ,KC_PERC ,_______ , _______ ,KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_MINS ,KC_UNDS ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , _______ , _______ ,_______ ,_______ ,_______ + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Navigation - * ,------------------------------------------------. ,------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | |VOLDOW|VOL UP| MUTE | | | | LEFT | DOWN | UP |RIGHT | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * `------------------------------------------------' `------------------------------------------------' - */ [_NAV] = LAYOUT( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, _______, _______, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP , KC_RIGHT, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______ + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,KC_VOLD ,KC_VOLU ,KC_MUTE ,XXXXXXX ,_______ , _______ ,XXXXXXX ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,XXXXXXX , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* i18n + emoji -* ,------------------------------------------------. ,------------------------------------------------. -* | | | | | | | | | | | | | | | | -* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| -* | | à | 👋 | | | | | | | | ü | è | YOSHI| ö | | -* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| -* | | á | |SHRUG | 👍 | | | | | | ú | é | í | ó | | -* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| -* | | â | | ç | | | | | | | ű | ê | | ő | | -* |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| -* | | | | | | | | | | | | | | | | -* `------------------------------------------------' `------------------------------------------------' -*/ [_INTER] = LAYOUT( - XXXXXXX, _______ , _______, _______ , _______ , _______, _______, _______, _______, _______, _______, _______, _______, _______, - XXXXXXX, UC(0x00E0), WAVE , XXXXXXX , XXXXXXX , XXXXXXX, _______, _______, XXXXXXX, UC(0x00FC), UC(0x00E8), YOSHI, UC(0x00F6), XXXXXXX, - _______, UC(0x00E1), XXXXXXX, SHRUG , THUMB_UP, XXXXXXX, _______, _______, XXXXXXX, UC(0x00F9), UC(0x00E9), UC(0x00ED) , UC(0x00F3), _______, - XXXXXXX, UC(0x00E2), XXXXXXX, UC(0x00E7), XXXXXXX , XXXXXXX, _______, _______, XXXXXXX, UC(0x0171), UC(0x00EA), XXXXXXX, UC(0x0151), XXXXXXX, - _______, XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX , XXXXXXX, _______, _______, NBSP, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______ + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,UC_00E0 ,WAVE ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,UC_00FC ,UC_00E8 ,YOSHI ,UC_00F6 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,UC_00E1 ,XXXXXXX ,SHRUG ,THUMB_UP,XXXXXXX ,_______ , _______ ,XXXXXXX ,UC_00F9 ,UC_00E9 ,UC_00ED ,UC_00F3 ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,UC_00E2 ,XXXXXXX ,UC_00E7 ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,UC_0171 ,UC_00EA ,XXXXXXX ,UC_0151 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,NBSP , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), -/* Adjust keyboard settings - * ,------------------------------------------------. ,------------------------------------------------. - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | RGB- | RGB+ |RGB ON| | | | | | RESET| DEBUG|AUD ON| | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * |------+------+------+------+------+------+------| |------+------+------+------+------+------+------| - * | | | | | | | | | | | | | | | | - * `------------------------------------------------' `------------------------------------------------' - */ [_ADJUST] = LAYOUT( - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - _______, XXXXXXX, RGB_VAD, RGB_VAI, RGB_TOG, XXXXXXX, _______, _______, XXXXXXX, RESET , DEBUG , AU_TOG , XXXXXXX, _______, - XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, _______ + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,XXXXXXX ,RGB_VAD ,RGB_VAI ,RGB_TOG ,XXXXXXX ,_______ , _______ ,XXXXXXX ,RESET ,DEBUG ,AU_TOG ,XXXXXXX ,_______ , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,XXXXXXX , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ) }; diff --git a/keyboards/redox/readme.md b/keyboards/redox/readme.md index 8a2fc4b04c80..d237caf013a0 100644 --- a/keyboards/redox/readme.md +++ b/keyboards/redox/readme.md @@ -16,10 +16,14 @@ Make example for this keyboard (after setting up your build environment): - make redox/rev1:default +```sh +make redox/rev1:default +``` Example of flashing this keyboard: - make redox/rev1:default:avrdude +```sh +make redox/rev1:default:avrdude +``` -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/redox/redox.h b/keyboards/redox/redox.h index 73f5ab85aea1..2f08bddccc38 100644 --- a/keyboards/redox/redox.h +++ b/keyboards/redox/redox.h @@ -13,29 +13,11 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef REDOX_H -#define REDOX_H + +#pragma once #ifdef KEYBOARD_redox_rev1 #include "rev1.h" #endif -// Used to create a keymap using only KC_ prefixed keys -#define LAYOUT_kc( \ - L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \ - L10, L11, L12, L13, L14, L15, L16, R10, R11, R12, R13, R14, R15, R16, \ - L20, L21, L22, L23, L24, L25, L26, R20, R21, R22, R23, R24, R25, R26, \ - L30, L31, L32, L33, L34, L35, L36, R30, R31, R32, R33, R34, R35, R36, \ - L40, L41, L42, L43, L44, L45, L46, R40, R41, R42, R43, R44, R45, R46 \ - ) \ - KEYMAP( \ - KC_##L00, KC_##L01, KC_##L02, KC_##L03, KC_##L04, KC_##L05, KC_##L06, KC_##R00, KC_##R01, KC_##R02, KC_##R03, KC_##R04, KC_##R05, KC_##R06, \ - KC_##L10, KC_##L11, KC_##L12, KC_##L13, KC_##L14, KC_##L15, KC_##L16, KC_##R10, KC_##R11, KC_##R12, KC_##R13, KC_##R14, KC_##R15, KC_##R16, \ - KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##L26, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, KC_##R26, \ - KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##L34, KC_##L35, KC_##L36, KC_##R30, KC_##R31, KC_##R32, KC_##R33, KC_##R34, KC_##R35, KC_##R36, \ - KC_##L40, KC_##L41, KC_##L42, KC_##L43, KC_##L44, KC_##L45, KC_##L46, KC_##R40, KC_##R41, KC_##R42, KC_##R43, KC_##R44, KC_##R45, KC_##R46 \ - ) - #include "quantum.h" - -#endif diff --git a/keyboards/redox/rev1/config.h b/keyboards/redox/rev1/config.h index fe951f72261e..f4ccbd2fd52d 100644 --- a/keyboards/redox/rev1/config.h +++ b/keyboards/redox/rev1/config.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef REV1_CONFIG_H -#define REV1_CONFIG_H +#pragma once #include "config_common.h" @@ -82,5 +81,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - -#endif diff --git a/keyboards/redox/rev1/rev1.h b/keyboards/redox/rev1/rev1.h index be62247500b8..1bc1531eed99 100644 --- a/keyboards/redox/rev1/rev1.h +++ b/keyboards/redox/rev1/rev1.h @@ -1,66 +1,34 @@ -#ifndef REV1_H -#define REV1_H +#pragma once #include "../redox.h" -//void promicro_bootloader_jmp(bool program); #include "quantum.h" #ifdef USE_I2C #include #ifdef __AVR__ - #include - #include + #include + #include #endif #endif -//void promicro_bootloader_jmp(bool program); - -#ifndef FLIP_HALF -// Standard Keymap -// (TRRS jack on the left half is to the right, TRRS jack on the right half is to the left) -#define LAYOUT( \ - L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \ - L10, L11, L12, L13, L14, L15, L16, R10, R11, R12, R13, R14, R15, R16, \ - L20, L21, L22, L23, L24, L25, L26, R20, R21, R22, R23, R24, R25, R26, \ - L30, L31, L32, L33, L34, L35, L36, R30, R31, R32, R33, R34, R35, R36, \ - L40, L41, L42, L43, L44, L45, L46, R40, R41, R42, R43, R44, R45, R46 \ - ) \ - { \ - { L00, L01, L02, L03, L04, L05, L06 }, \ - { L10, L11, L12, L13, L14, L15, L16 }, \ - { L20, L21, L22, L23, L24, L25, L26 }, \ - { L30, L31, L32, L33, L34, L35, L36 }, \ - { L40, L41, L42, L43, L44, L45, L46 }, \ - { R06, R05, R04, R03, R02, R01, R00 }, \ - { R16, R15, R14, R13, R12, R11, R10 }, \ - { R26, R25, R24, R23, R22, R21, R20 }, \ - { R36, R35, R34, R33, R32, R31, R30 }, \ - { R46, R45, R44, R43, R42, R41, R40 } \ - } -#else -// Keymap with right side flipped -// (TRRS jack on both halves are to the right) #define LAYOUT( \ - L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \ - L10, L11, L12, L13, L14, L15, L16, R10, R11, R12, R13, R14, R15, R16, \ - L20, L21, L22, L23, L24, L25, L26, R20, R21, R22, R23, R24, R25, R26, \ - L30, L31, L32, L33, L34, L35, L36, R30, R31, R32, R33, R34, R35, R36, \ - L40, L41, L42, L43, L44, L45, L46, R40, R41, R42, R43, R44, R45, R46 \ - ) \ - { \ - { L00, L01, L02, L03, L04, L05, L06 }, \ - { L10, L11, L12, L13, L14, L15, L16 }, \ - { L20, L21, L22, L23, L24, L25, L26 }, \ - { L30, L31, L32, L33, L34, L35, L36 }, \ - { L40, L41, L42, L43, L44, L45, L46 }, \ - { R00, R01, R02, R03, R04, R05, R06 }, \ - { R10, R11, R12, R13, R14, R15, R16 }, \ - { R20, R21, R22, R23, R24, R25, R26 }, \ - { R30, R31, R32, R33, R34, R35, R36 }, \ - { R40, R41, R42, R43, R44, R45, R46 } \ - } -#endif - -#endif + k00, k01, k02, k03, k04, k05, k08, k09, k10, k11, k12, k13, \ + k14, k15, k16, k17, k18, k19, k06, k07, k22, k23, k24, k25, k26, k27, \ + k28, k29, k30, k31, k32, k33, k20, k21, k36, k37, k38, k39, k40, k41, \ + k42, k43, k44, k45, k46, k47, k34, k48, k49, k35, k50, k51, k52, k53, k54, k55, \ + k56, k57, k58, k59, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69 \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, k06 }, \ + { k14, k15, k16, k17, k18, k19, k20 }, \ + { k28, k29, k30, k31, k32, k33, k34 }, \ + { k42, k43, k44, k45, k46, k47, k48 }, \ + { k56, k57, k58, k59, k60, k61, k62 }, \ + { k13, k12, k11, k10, k09, k08, k07 }, \ + { k27, k26, k25, k24, k23, k22, k21 }, \ + { k41, k40, k39, k38, k37, k36, k35 }, \ + { k55, k54, k53, k52, k51, k50, k49 }, \ + { k69, k68, k67, k66, k65, k64, k63 } \ +} From 5be438f03d0ae3ebdb9e24d249fdfd7f5c573634 Mon Sep 17 00:00:00 2001 From: akrob Date: Sat, 27 Oct 2018 10:41:17 -0600 Subject: [PATCH 293/505] Keymap: update keymap transmogrified (#4241) * layer locked breathing, layer changed brighter leds * move config for tapping term into config.h * Respect LED off even with layer indicators, add readme and update config to new standard * update Readme with note about both sides of board being required to flash --- .../iris/keymaps/transmogrified/Readme.md | 9 + .../iris/keymaps/transmogrified/config.h | 22 +- .../iris/keymaps/transmogrified/keymap.c | 330 ++++++++++-------- 3 files changed, 214 insertions(+), 147 deletions(-) create mode 100644 keyboards/iris/keymaps/transmogrified/Readme.md diff --git a/keyboards/iris/keymaps/transmogrified/Readme.md b/keyboards/iris/keymaps/transmogrified/Readme.md new file mode 100644 index 000000000000..96e27411ddf3 --- /dev/null +++ b/keyboards/iris/keymaps/transmogrified/Readme.md @@ -0,0 +1,9 @@ +This layout is an attempt to make switching between the Iris and my laptop keyboard as seemless as possible. I switch caps lock and Ctrl/ESC on my laptop and I am able to adjust well with everything else... I still miss the Iris, but I am able to get work done. + +I use the following lighting queues to indicate layer changes. + +* Momentary toggled layer : LEDs brighten and dim when layer is released. +* Locked layer : LEDs breath. +* Config layer locked : LEDs off. + +NOTE you will need to flash both sides to update the brightness_levels so that breathing works on both sides as expected. diff --git a/keyboards/iris/keymaps/transmogrified/config.h b/keyboards/iris/keymaps/transmogrified/config.h index 8df0824b7a71..12f2d7d6d888 100644 --- a/keyboards/iris/keymaps/transmogrified/config.h +++ b/keyboards/iris/keymaps/transmogrified/config.h @@ -1,5 +1,5 @@ /* -Copyright 2017 Danny Nguyen +Copyright 2017 Adam Roberts 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 @@ -15,11 +15,7 @@ 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 - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -27,8 +23,7 @@ along with this program. If not, see . // #define USE_I2C /* Select hand configuration */ - -// #define MASTER_LEFT +//#define MASTER_LEFT #define MASTER_RIGHT // #define EE_HANDS @@ -39,4 +34,13 @@ along with this program. If not, see . #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 -#endif +#define NO_USB_STARTUP_CHECK //keep both sides on when pc is sleeping. +#define TAPPING_TERM 200 + +// Remove features i don't use +#define NO_ACTION_ONESHOT +#define NO_ACTION_MACRO + +// Override the rev2 config.h BACKLIGHT_LEVELS setting +#undef BACKLIGHT_LEVELS +#define BACKLIGHT_LEVELS 125 diff --git a/keyboards/iris/keymaps/transmogrified/keymap.c b/keyboards/iris/keymaps/transmogrified/keymap.c index 43d6cc60024e..67545f08e622 100644 --- a/keyboards/iris/keymaps/transmogrified/keymap.c +++ b/keyboards/iris/keymaps/transmogrified/keymap.c @@ -2,64 +2,55 @@ #include "action_layer.h" #include "eeconfig.h" -// config settings -#define TAPPING_TERM 250 -#define ONESHOT_TAP_TOGGLE 1 -#define ONESHOT_TIMEOUT 10000 - extern keymap_config_t keymap_config; #define _QWERTY 0 #define _COLEMAK 1 -#define _DVORAK 2 -#define _ONEHANDR 3 -#define _ONEHANDL 4 -#define _RLAYER 5 -#define _LLAYER 6 -#define _DUAL 7 -#define _CONFIG 8 +#define _RLAYER 2 +#define _LLAYER 3 +#define _DUAL 4 +#define _CONFIG 5 enum custom_keycodes { - QWERTY = SAFE_RANGE, - COLEMAK, - DVORAK, - ONEHANDR, - ONEHANDL, - RLAYER, - LLAYER, - RLOCK, - LLOCK, - DUAL, - CONFIG, + QWERTY = SAFE_RANGE, // qwerty base layer + COLEMAK, // colemak base layer + RLAYER, // right layer + LLAYER, // left layer + RLOCK, // right layer LOCK + LLOCK, // left layer LOCK + DUAL, // right and left combo layer + CONFIG, // config layer + LEDUP, // custom LED brightness increase keycode + LEDDOWN, // custom LED brightness decrease keycode }; /* Tap Dance */ enum { - TD_LGUIAPP, - TD_SHIFTCAPS, + TD_LGUIAPP, // LGUI x1, app/menu x2 + TD_SHIFTCAPS, // LSHIFT x1, CAPS x3 + TD_CTRLALTDL, // CTRL+ALT+DEL x3 + TD_SHIFTCLAT, // LSHIFT x1, LCRTL x2, LALT x3, CTRL+ALT x4 }; /* NOOP Key and Transparent */ #define KC_ KC_TRNS #define KC_XXXX KC_NO -/* LAYERS */ +/* LAYERS / CUSTOM KEYS */ #define KC_LLAY LLAYER #define KC_RLAY RLAYER #define KC_RLOK RLOCK #define KC_LLOK LLOCK #define KC_QWER QWERTY -#define KC_DVOR DVORAK #define KC_COLE COLEMAK -#define KC_ONER ONEHANDR -#define KC_ONEL ONEHANDL #define KC_DUAL DUAL #define KC_CONF CONFIG +#define KC_BLUP LEDUP +#define KC_BLDN LEDDOWN -/* Custom Shortened Keys */ +/* Custom Shortened Keys (4 digits so they fit in my grid) */ #define KC_MCTB LCTL(KC_TAB) #define KC_MCST LCTL(LSFT(KC_TAB)) -#define KC_MCAD LALT(LCTL(KC_DEL)) #define KC_CTEC CTL_T(KC_ESC) #define KC_SINS LSFT(KC_INS) #define KC_LGU1 LGUI(KC_1) @@ -72,27 +63,27 @@ enum { #define KC_LGU8 LGUI(KC_8) #define KC_LGU9 LGUI(KC_9) #define KC_LGU0 LGUI(KC_0) -#define KC_BLUP BL_INC -#define KC_BLDN BL_DEC #define KC_SYSR KC_SYSREQ #define KC_REST RESET /* Tap Dance */ #define KC_LGUA TD(TD_LGUIAPP) -#define KC_SHCL TD(TD_SHIFTCAPS) +#define KC_SHCP TD(TD_SHIFTCAPS) +#define KC_CADL TD(TD_CTRLALTDL) +#define KC_SHCA TD(TD_SHIFTCLAT) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = LAYOUT_kc( //,----+----+----+----+----+----. ,----+----+----+----+----+----. - XXXX, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC, + CADL, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC, //|----+----+----+----+----+----| |----+----+----+----+----+----| TAB , Q , W , E , R , T , Y , U , I , O , P ,DEL , //|----+----+----+----+----+----| |----+----+----+----+----+----| CTEC, A , S , D , F , G , H , J , K , L ,SCLN,ENT , //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| - SHCL, Z , X , C , V , B ,LLOK, RLOK, N , M ,COMM,DOT ,SLSH,RSFT, + SHCP, Z , X , C , V , B ,LLOK, RLOK, N , M ,COMM,DOT ,SLSH,SHCA, //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' LALT,LLAY,TAB , SPC ,RLAY,LGUA // `----+----+----' `----+----+----' @@ -100,60 +91,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_COLEMAK] = LAYOUT_kc( //,----+----+----+----+----+----. ,----+----+----+----+----+----. - XXXX, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC, + CADL, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC, //|----+----+----+----+----+----| |----+----+----+----+----+----| TAB , Q , W , F , P , G , J , L , U , Y ,SCLN,DEL , //|----+----+----+----+----+----| |----+----+----+----+----+----| CTEC, A , R , S , T , D , H , N , E , I , O ,ENT , //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| - SHCL, Z , X , C , V , B ,LLOK, RLOK, K , M ,COMM,DOT ,SLSH,RSFT, - //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' - LALT,LLAY,TAB , SPC ,RLAY,LGUA - // `----+----+----' `----+----+----' - ), - - [_DVORAK] = LAYOUT_kc( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - XXXX, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - TAB ,QUOT,COMM,DOT , P , Y , F , G , C , R , L ,SLSH, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - CTEC, A , O , E , U , I , D , H , T , N , S ,ENT , - //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| - SHCL,SCLN, Q , J , K , X ,LLOK, RLOK, B , M , W , V , Z ,EQL , + SHCP, Z , X , C , V , B ,LLOK, RLOK, K , M ,COMM,DOT ,SLSH,SHCA, //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' LALT,LLAY,TAB , SPC ,RLAY,LGUA // `----+----+----' `----+----+----' ), - [_ONEHANDR] = LAYOUT_kc( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, 6 , 7 , 8 , 9 , 0 ,BSPC, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, Y , U , I , O , P ,DEL , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, H , J , K , L ,SCLN,QUOT, - //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| - XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,QWER, XXXX, N , M ,COMM,DOT ,SLSH,RSFT, - //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' - XXXX,XXXX,XXXX, SPC ,ONEL,ENT - // `----+----+----' `----+----+----' - ), - - [_ONEHANDL] = LAYOUT_kc( - //,----+----+----+----+----+----. ,----+----+----+----+----+----. - XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, 5 , 4 , 3 , 2 , 1 ,XXXX, - //|----+----+----+----+----+----| |----+----+----+----+----+----| - XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, T , R , E , W , Q ,TAB , - //|----+----+----+----+----+----| |----+----+----+----+----+----| - XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, G , F , D , S , A ,ENT , - //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| - XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, XXXX, B , V , C , X , Z ,SHCL, - //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' - XXXX,XXXX,XXXX, SPC ,ONEL,ENT - // `----+----+----' `----+----+----' - ), - [_RLAYER] = LAYOUT_kc( //,----+----+----+----+----+----. ,----+----+----+----+----+----. ,SLCK,SYSR,PSCR,INS ,PAUS, MUTE,VOLD,VOLU,BLDN,BLUP, , @@ -163,7 +112,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ,EXLM,PIPE,DLR ,LPRN,RPRN, AMPR,LEFT,DOWN,RGHT,MINS,QUOT, //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| , AT ,HASH,PERC,LCBR,RCBR, , ,CIRC,END ,UNDS,PGDN,BSLS, , - //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' + //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' , , , , , // `----+----+----' `----+----+----' ), @@ -186,7 +135,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,----+----+----+----+----+----. ,----+----+----+----+----+----. ,XXXX,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, //|----+----+----+----+----+----| |----+----+----+----+----+----| - ,XXXX,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,MS_U,XXXX,XXXX,MCAD, + ,XXXX,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,MS_U,XXXX,XXXX,XXXX, //|----+----+----+----+----+----| |----+----+----+----+----+----| ,XXXX,XXXX,XXXX,XXXX,XXXX, BTN2,MS_L,MS_D,MS_R,BTN1,XXXX, //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| @@ -200,9 +149,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,----+----+----+----+----+----. ,----+----+----+----+----+----. REST,XXXX,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, //|----+----+----+----+----+----| |----+----+----+----+----+----| - XXXX,QWER,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,XXXX,ONER,XXXX,XXXX, + XXXX,QWER,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, //|----+----+----+----+----+----| |----+----+----+----+----+----| - XXXX,XXXX,XXXX,DVOR,XXXX,XXXX, XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, + XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| XXXX,XXXX,XXXX,COLE,XXXX,XXXX, , ,XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----' @@ -212,6 +161,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; +/* VARIABLES */ +// Configurable Variables for layer toggled light +int layerBLStep = 20; // change how much the brightness changes when holding layer key +int breathPulse = 5; // timing of the breathing +int breathPulseStall = 3; // time to pause at top and bottom of breath cycle +int blSteps = 6; // blSteps + 1 is the amount of brightness settings when manually adjusting + +// Variables needed for layer locked breathing and layer toggling lighting to work +int counter = 0; +bool breathUp = true; +bool resetBL = false; +bool rlocked = false; +bool llocked = false; +bool configOn = false; +int lockedBLLevel; +int momentaryLBLLevel; +int momentaryRBLLevel; +int currentBL; +/* END VARIABLES */ + /* TAP DANCE */ void shift_caps_down (qk_tap_dance_state_t *state, void *user_data) { if (state->count >= 3) { @@ -220,7 +189,6 @@ void shift_caps_down (qk_tap_dance_state_t *state, void *user_data) { register_code (KC_LSFT); } } - void shift_caps_up (qk_tap_dance_state_t *state, void *user_data) { if (state->count >= 3) { unregister_code (KC_CAPS); @@ -228,54 +196,90 @@ void shift_caps_up (qk_tap_dance_state_t *state, void *user_data) { unregister_code (KC_LSFT); } } +void shift_ctrlalt_down (qk_tap_dance_state_t *state, void *user_data) { + if (state->count >= 4) { + register_code (KC_LCTL); + register_code (KC_LALT); + } else if (state->count == 3) { + register_code (KC_LALT); + } else if (state->count == 2) { + register_code (KC_LCTL); + } else { + register_code (KC_RSFT); + } +} +void shift_ctlalt_up (qk_tap_dance_state_t *state, void *user_data) { + if (state->count >= 4) { + unregister_code (KC_LALT); + unregister_code (KC_LCTL); + } else if (state->count == 3) { + unregister_code (KC_LALT); + } else if (state->count == 2) { + unregister_code (KC_LCTL); + } else { + unregister_code (KC_RSFT); + } +} +void ctrlaltdel_up (qk_tap_dance_state_t *state, void *user_data) { + if (state->count >= 3) { + unregister_code (KC_DEL); + unregister_code (KC_LALT); + unregister_code (KC_LCTL); + } else { + } +} +void ctrlaltdel_down (qk_tap_dance_state_t *state, void *user_data) { + if (state->count >= 3) { + register_code (KC_LCTL); + register_code (KC_LALT); + register_code (KC_DEL); + } else { + } +} qk_tap_dance_action_t tap_dance_actions[] = { [TD_LGUIAPP] = ACTION_TAP_DANCE_DOUBLE(KC_LGUI, KC_APP), - [TD_SHIFTCAPS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, shift_caps_down, shift_caps_up) + [TD_SHIFTCAPS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, shift_caps_down, shift_caps_up), + [TD_SHIFTCLAT] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, shift_ctrlalt_down, shift_ctlalt_up), + [TD_CTRLALTDL] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ctrlaltdel_down, ctrlaltdel_up) }; - /* END TAP DANCE */ + void persistent_default_layer_set(uint16_t default_layer) { eeconfig_update_default_layer(default_layer); default_layer_set(default_layer); } -/* Variables for layer light toggling */ -static uint16_t currentBL = 0; -static uint16_t rlocked = 0; -static uint16_t llocked = 0; - bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case QWERTY: if (record->event.pressed) { set_single_persistent_default_layer(_QWERTY); + configOn = false; + if (momentaryRBLLevel != 0 || momentaryLBLLevel != 0){ + backlight_toggle(); + } } return false; break; case COLEMAK: if (record->event.pressed) { set_single_persistent_default_layer(_COLEMAK); - } - return false; - break; - case ONEHANDR: - if (record->event.pressed) { - set_single_persistent_default_layer(_ONEHANDR); - } - return false; - break; - case DVORAK: - if (record->event.pressed) { - set_single_persistent_default_layer(_DVORAK); + configOn = false; + if (momentaryRBLLevel != 0 || momentaryLBLLevel != 0){ + backlight_toggle(); + } } return false; break; case CONFIG: if (record->event.pressed) { set_single_persistent_default_layer(_CONFIG); - backlight_toggle(); + configOn = true; + if (momentaryRBLLevel != 0 || momentaryLBLLevel != 0){ + backlight_toggle(); + } } return false; break; @@ -283,22 +287,23 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { layer_on(_RLAYER); update_tri_layer(_RLAYER, _LLAYER, _DUAL); - /* add logic to toggle backlight change when on a layer */ - currentBL = get_backlight_level(); - if ( currentBL == 0 || currentBL == 1 ) { - backlight_set(5); - } else { - backlight_set(0); + momentaryRBLLevel = get_backlight_level(); + if (momentaryRBLLevel != 0 || momentaryLBLLevel != 0){ + for (int i = 0; i < layerBLStep ; i++){ + backlight_increase(); + } } } else { unregister_code(KC_LGUI); - rlocked = 0; layer_off(_RLAYER); update_tri_layer(_RLAYER, _LLAYER, _DUAL); - if ( llocked == 0 ) { - backlight_set(currentBL); + if ( llocked == false && configOn == false ) { + for (int i = 0; i < layerBLStep ; i++){ + backlight_decrease(); + } } else { } + rlocked = false; } return false; break; @@ -306,21 +311,22 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { layer_on(_LLAYER); update_tri_layer(_RLAYER, _LLAYER, _DUAL); - /* add logic to toggle backlight change when on a layer */ - currentBL = get_backlight_level(); - if ( currentBL == 0 || currentBL == 1 ) { - backlight_set(5); - } else { - backlight_set(0); + momentaryLBLLevel = get_backlight_level(); + if (momentaryRBLLevel != 0 || momentaryLBLLevel != 0){ + for (int i = 0; i < layerBLStep ; i++){ + backlight_increase(); + } } } else { - llocked = 0; layer_off(_LLAYER); update_tri_layer(_RLAYER, _LLAYER, _DUAL); - if ( rlocked == 0 ) { - backlight_set(currentBL); + if ( rlocked == false && configOn == false ) { + for (int i = 0; i < layerBLStep ; i++){ + backlight_decrease(); + } } else { } + llocked = false; } return false; break; @@ -328,13 +334,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { layer_on(_RLAYER); /* add logic to toggle backlight change when on a layer */ - rlocked = 1; - currentBL = get_backlight_level(); - if ( currentBL == 0 || currentBL == 1 ) { - backlight_set(5); - } else { - backlight_set(0); + if (rlocked == false && llocked == false){ + lockedBLLevel = get_backlight_level(); } + rlocked = true; } else { } return false; @@ -343,25 +346,76 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { layer_on(_LLAYER); /* add logic to toggle backlight change when on a layer */ - llocked = 1; - currentBL = get_backlight_level(); - if ( currentBL == 0 || currentBL == 1 ) { - backlight_set(5); - } else { - backlight_set(0); + if (rlocked == false && llocked == false){ + lockedBLLevel = get_backlight_level(); + } + llocked = true; + } else { + } + return false; + break; + case LEDUP: + if (record->event.pressed) { + for (int i = 0; i < (BACKLIGHT_LEVELS / blSteps ) ; i++ ){ + backlight_increase(); } } else { } return false; break; - case ONEHANDL: + case LEDDOWN: if (record->event.pressed) { - layer_on(_ONEHANDL); + for (int i = 0; i < (BACKLIGHT_LEVELS / blSteps ) ; i++ ){ + backlight_decrease(); + } } else { - layer_off(_ONEHANDL); } return false; break; } return true; } + + +// LED breathing when a layer is locked +void matrix_scan_user(void) { + // Only breath if layer is locked + if (lockedBLLevel != 0 && (rlocked || llocked)){ + // counter to slow down the breathing + if (counter >= breathPulse) { + counter = 0; + // iterate brightness up or down + if (breathUp){ + backlight_increase(); + } else { + backlight_decrease(); + } + // figure out if we need to change directions + currentBL = get_backlight_level(); + if (currentBL >= BACKLIGHT_LEVELS){ + breathUp = false; + // make counter a big negative number to add some stall time + counter = ((BACKLIGHT_LEVELS * breathPulseStall) * (-1)); + } else if (currentBL == 0){ + breathUp = true; + // make counter a big negative number to add some stall time + counter = ((BACKLIGHT_LEVELS * breathPulseStall) * (-1)); + } + // make not that we need to change the brightness back to when we started the breathing + resetBL = true; + } else { + counter++; + } + } else { + // get the brightness back to the level it started at + if (resetBL){ + int i = 0; + // i is just there to make sure i don't get stuck in a loop if for some reason get_backlight_level isn't working as expected + while (get_backlight_level() != lockedBLLevel && i <= BACKLIGHT_LEVELS ){ + backlight_step(); + i++; + } + resetBL = false; + } + } +} From 4ffcacd92086870eb7a3102d54178a7af64edb0c Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 27 Oct 2018 11:53:50 -0700 Subject: [PATCH 294/505] Add Bootmagic Lite to QMK (#4215) * Preliminary additon of bootmagic lite functionality * Cleanup code * Clean up bootmagic code * Add documentation and clean up code * Make 'lite' an option for BOOTMAGIC_ENABLE * Update Templates with note about Bootmagic Lite option * Detect Debounce variable * Make sure debounce is a non-zero number * Capitalize Bootmagic * Capitalize bootmagic * Update wording * Re-add EEPROM reset, by popular demand And add eeprom-less version to drashna userspace for his sanity * Fix spacing * Set BOOTMAGIC_ENABLE to use full/lite/off And default yes to "full" for compatibility * Add Bootmagic lite info to templates * Remove text from makefiles * Cleanup of makefile * mention yes in bootmagic docs * Wordsmitthing the docs * Fix white spaces * Readd default bootmagic setting, because it's necessary --- docs/feature_bootmagic.md | 52 +++++++++++++++++++++++++++++- quantum/quantum.c | 34 ++++++++++++++++++- quantum/quantum.h | 9 ++++++ quantum/template/avr/config.h | 3 ++ quantum/template/ps2avrgb/config.h | 4 +++ tmk_core/common.mk | 14 +++++++- users/drashna/drashna.c | 16 +++++++++ 7 files changed, 129 insertions(+), 3 deletions(-) diff --git a/docs/feature_bootmagic.md b/docs/feature_bootmagic.md index 586b5d837082..20c76d9b745d 100644 --- a/docs/feature_bootmagic.md +++ b/docs/feature_bootmagic.md @@ -11,7 +11,15 @@ There are three separate but related features that allow you to change the behav On some keyboards Bootmagic is disabled by default. If this is the case, it must be explicitly enabled in your `rules.mk` with: ```make -BOOTMAGIC_ENABLE = yes +BOOTMAGIC_ENABLE = full +``` + +?> You may see `yes` being used in place of `full`, and this is okay. However, `yes` is deprecated, and ideally `full` (or `lite`) ideally should be used instead. + +Additionally, you can use [Bootmagic Lite](#bootmagic-lite) (a scaled down, very basic version of Bootmagic) by adding the following to your `rules.mk` file: + +```make +BOOTMAGIC_ENABLE = lite ``` ## Hotkeys @@ -99,3 +107,45 @@ If you would like to change the hotkey assignments for Bootmagic, `#define` thes |`BOOTMAGIC_KEY_DEFAULT_LAYER_5` |`KC_5` |Make layer 5 the default layer | |`BOOTMAGIC_KEY_DEFAULT_LAYER_6` |`KC_6` |Make layer 6 the default layer | |`BOOTMAGIC_KEY_DEFAULT_LAYER_7` |`KC_7` |Make layer 7 the default layer | + +# Bootmagic Lite + +In addition to the full blown Bootmagic feature, is the Bootmagic Lite feature that only handles jumping into the bootloader. This is great for boards that don't have a physical reset button but you need a way to jump into the bootloader, and don't want to deal with the headache that Bootmagic can cause. + +To enable this version of Bootmagic, you need to enable it in your `rules.mk` with: + +```make +BOOTMAGIC_ENABLE = lite +``` + +Additionally, you may want to specify which key to use. This is especially useful for keyboards that have unusual matrices. To do so, you need to specify the row and column of the key that you want to use. Add these entries to your `config.h` file: + +```c +#define BOOTMAGIC_LITE_ROW 0 +#define BOOTMAGIC_LITE_COLUMN 1 +``` + +By default, these are set to 0 and 0, which is usually the "ESC" key on a majority of keyboards. + +And to trigger the bootloader, you hold this key down when plugging the keyboard in. Just the single key. + +## Advanced Bootmagic Lite + +The `bootmagic_lite` function is defined weakly, so that you can replace this in your code, if you need. A great example of this is the Zeal60 boards that have some additional handling needed. + +To replace the function, all you need to do is add something like this to your code: + +```c +void bootmagic_lite(void) { + matrix_scan(); + wait_ms(DEBOUNCING_DELAY * 2); + matrix_scan(); + + if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) { + // Jump to bootloader. + bootloader_jump(); + } +} +``` + +You can additional feature here. For instance, resetting the eeprom or requiring additional keys to be pressed to trigger bootmagic. Keep in mind that `bootmagic_lite` is called before a majority of features are initialized in the firmware. diff --git a/quantum/quantum.c b/quantum/quantum.c index c9bec6740baa..5f1a691c8841 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -949,8 +949,40 @@ void tap_random_base64(void) { } } +__attribute__((weak)) +void bootmagic_lite(void) { + // The lite version of TMK's bootmagic based on Wilba. + // 100% less potential for accidentally making the + // keyboard do stupid things. + + // We need multiple scans because debouncing can't be turned off. + matrix_scan(); + #if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0 + wait_ms(DEBOUNCING_DELAY * 2); + #elif defined(DEBOUNCE) && DEBOUNCE > 0 + wait_ms(DEBOUNCE * 2); + #else + wait_ms(30); + #endif + matrix_scan(); + + // If the Esc and space bar are held down on power up, + // reset the EEPROM valid state and jump to bootloader. + // Assumes Esc is at [0,0]. + // This isn't very generalized, but we need something that doesn't + // rely on user's keymaps in firmware or EEPROM. + if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) { + eeconfig_disable(); + // Jump to bootloader. + bootloader_jump(); + } +} + void matrix_init_quantum() { - if (!eeconfig_is_enabled() && !eeconfig_is_disabled()) { + #ifdef BOOTMAGIC_LITE + bootmagic_lite(); + #endif + if (!eeconfig_is_enabled()) { eeconfig_init(); } #ifdef BACKLIGHT_ENABLE diff --git a/quantum/quantum.h b/quantum/quantum.h index 87a61356c7dc..1d3ee033fd09 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -224,6 +224,15 @@ bool process_action_kb(keyrecord_t *record); bool process_record_kb(uint16_t keycode, keyrecord_t *record); bool process_record_user(uint16_t keycode, keyrecord_t *record); +#ifndef BOOTMAGIC_LITE_COLUMN + #define BOOTMAGIC_LITE_COLUMN 0 +#endif +#ifndef BOOTMAGIC_LITE_ROW + #define BOOTMAGIC_LITE_ROW 0 +#endif + +void bootmagic_lite(void); + void reset_keyboard(void); void startup_user(void); diff --git a/quantum/template/avr/config.h b/quantum/template/avr/config.h index caa72af0c2f8..56395f376f65 100644 --- a/quantum/template/avr/config.h +++ b/quantum/template/avr/config.h @@ -222,3 +222,6 @@ along with this program. If not, see . #endif */ +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 diff --git a/quantum/template/ps2avrgb/config.h b/quantum/template/ps2avrgb/config.h index d2c83781fafb..4ff3513bc76a 100644 --- a/quantum/template/ps2avrgb/config.h +++ b/quantum/template/ps2avrgb/config.h @@ -44,3 +44,7 @@ along with this program. If not, see . /* key combination for command */ #define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) + +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 33bcc97b2ed1..3844b13d48db 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -61,14 +61,26 @@ endif # Option modules -ifeq ($(strip $(BOOTMAGIC_ENABLE)), yes) +BOOTMAGIC_ENABLE ?= no +VALID_MAGIC_TYPES := yes full lite +ifneq ($(strip $(BOOTMAGIC_ENABLE)), no) + ifeq ($(filter $(BOOTMAGIC_ENABLE),$(VALID_MAGIC_TYPES)),) + $(error BOOTMAGIC_ENABLE="$(BOOTMAGIC_ENABLE)" is not a valid type of magic) + endif + ifeq ($(strip $(BOOTMAGIC_ENABLE)), lite) + TMK_COMMON_DEFS += -DBOOTMAGIC_LITE + TMK_COMMON_DEFS += -DMAGIC_ENABLE + TMK_COMMON_SRC += $(COMMON_DIR)/magic.c + else TMK_COMMON_DEFS += -DBOOTMAGIC_ENABLE TMK_COMMON_SRC += $(COMMON_DIR)/bootmagic.c + endif else TMK_COMMON_DEFS += -DMAGIC_ENABLE TMK_COMMON_SRC += $(COMMON_DIR)/magic.c endif + ifeq ($(strip $(MOUSEKEY_ENABLE)), yes) TMK_COMMON_SRC += $(COMMON_DIR)/mousekey.c TMK_COMMON_DEFS += -DMOUSEKEY_ENABLE diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 5b6620cf33d6..7c280e2dddc4 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -424,3 +424,19 @@ void eeconfig_init_user(void) { userspace_config.raw = 0; eeconfig_update_user(userspace_config.raw); } + +void bootmagic_lite(void) { + matrix_scan(); + #if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0 + wait_ms(DEBOUNCING_DELAY * 2); + #elif defined(DEBOUNCE) && DEBOUNCE > 0 + wait_ms(DEBOUNCE * 2); + #else + wait_ms(30); + #endif + matrix_scan(); + + if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) { + bootloader_jump(); + } +} From 2abb29402a85675617d07111cbdf5502fd384572 Mon Sep 17 00:00:00 2001 From: Guido Bartolucci Date: Sun, 28 Oct 2018 11:29:37 -0400 Subject: [PATCH 295/505] Keymap: Updates to guidoism layout (#4262) * Initial commit of guidoism * created movement layer * movement layer works! * removed unnecessary layers * moved enter key up and recreated caps lock * cleaned up * num pad * checkpoint * checkpoint * checkpoint * Added num pad * changed max power draw so i can use this on ipad * move around quotes * added tri layer for a homed numpad * moved layout to new style * Update readme.md * Update readme.md * Update readme.md * Update readme.md * added keys to unicode conversion * removed adjust layer since its not used anymore * moved esc to seperate key * tweaked python * checkpoint * new code put into function * new code put into function * cleanup * cleanup * new code works perfect * removed old code * removed old code * generate_c.py now replaces code within keymap.c * added function layer * updated readme * updated readme * updated readme * updates readme * updates readme * updates readme * Tweaks based on CR * Remove old guidoism * Use MO(_FUNCTION) directly --- keyboards/planck/keymaps/guidoism/config.h | 42 --- keyboards/planck/keymaps/guidoism/keymap.c | 253 ------------------ keyboards/planck/keymaps/guidoism/readme.md | 2 - keyboards/planck/keymaps/guidoism/rules.mk | 0 .../community/ortho_4x12/guidoism/config.h | 22 +- .../ortho_4x12/guidoism/generate_c.py | 104 ++++--- .../ortho_4x12/guidoism/guidoism.json | 2 +- .../community/ortho_4x12/guidoism/keymap.c | 149 ++++++++--- .../community/ortho_4x12/guidoism/keys.json | 29 +- .../community/ortho_4x12/guidoism/readme.md | 63 +++-- 10 files changed, 242 insertions(+), 424 deletions(-) delete mode 100644 keyboards/planck/keymaps/guidoism/config.h delete mode 100644 keyboards/planck/keymaps/guidoism/keymap.c delete mode 100644 keyboards/planck/keymaps/guidoism/readme.md delete mode 100644 keyboards/planck/keymaps/guidoism/rules.mk diff --git a/keyboards/planck/keymaps/guidoism/config.h b/keyboards/planck/keymaps/guidoism/config.h deleted file mode 100644 index a1635f2bab5f..000000000000 --- a/keyboards/planck/keymaps/guidoism/config.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "config_common.h" - -#ifdef AUDIO_ENABLE - #define STARTUP_SONG SONG(PLANCK_SOUND) - // #define STARTUP_SONG SONG(NO_SOUND) - - #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ - SONG(COLEMAK_SOUND), \ - SONG(DVORAK_SOUND) \ - } -#endif - -#define MUSIC_MASK (keycode != KC_NO) - -/* - * 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/guidoism/keymap.c b/keyboards/planck/keymaps/guidoism/keymap.c deleted file mode 100644 index d644ac9709fa..000000000000 --- a/keyboards/planck/keymaps/guidoism/keymap.c +++ /dev/null @@ -1,253 +0,0 @@ -/* 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 . - */ - -#pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example" -#include "planck.h" -#include "action_layer.h" - -extern keymap_config_t keymap_config; - -enum planck_layers { - _QWERTY, - _LOWER, - _RAISE, - _MOVEMENT, - _NUMPAD, - _CODE, - _ADJUST -}; - -enum planck_keycodes { - QWERTY = SAFE_RANGE, - LOWER, - RAISE, - MOVEMENT, - NUMPAD, - CODE, - BACKLIT -}; - -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 | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Move |Numpad| 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, LT(MOVEMENT, KC_A), KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT}, - // {KC_ESC, MEH_T(KC_A), KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT}, - {KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT}, - {LSFT_T(KC_CAPS), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_QUOT}, - {MOVEMENT, NUMPAD, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LPRN, KC_RPRN, KC_LCBR, KC_RCBR} -}, - -/* Lower - * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | 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_HOME, KC_END, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, 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 / |Pg Up |Pg Dn | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | 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_PGUP, KC_PGDN, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY} -}, - -/* Movement - * ,-----------------------------------------------------------------------------------. - * | | | | | | | Home | PgUp | Up | PgDn | End | | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | | | | | | Left | Down | Right| | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_MOVEMENT] = { - {_______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_UP, KC_PGDN, KC_END, _______}, - {_______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -}, - -/* Numpad - * ,-----------------------------------------------------------------------------------. - * | | | | | | | | | 7 | 8 | 9 | / | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | | | | | | | 4 | 5 | 6 | * | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | 1 | 2 | 3 | - | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | 0 | = | + | - * `-----------------------------------------------------------------------------------' -[_NUMPAD] = { - {_______, _______, _______, _______, _______, _______, _______, _______, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_SLASH}, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_ASTERISK}, - {_______, _______, _______, _______, _______, _______, _______, _______, KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_MINUS}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_0, KC_KP_EQUAL, KC_KP_PLUS} -}, - */ - -/* Numpad - */ -[_NUMPAD] = { - {_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_7, KC_KP_8, KC_KP_9}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_4, KC_KP_5, KC_KP_6}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_1, KC_KP_2, KC_KP_3}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KP_0, KC_DOT} -}, - -/* Code - * ,-----------------------------------------------------------------------------------. - * | | | | | | | | | | | | | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | | | | | | | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_CODE] = { - {_______, _______, _______, _______, _______, _______, _______, KC_LCBR, KC_RCBR, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, KC_LPRN, KC_RPRN, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -}, - -/* Adjust (Lower + Raise) - * ,-----------------------------------------------------------------------------------. - * | | Reset| | | | | | | | | | Del | - * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty| | | | | - * |------+------+------+------+------+------|------+------+------+------+------+------| - * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' - */ -[_ADJUST] = { - {_______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL }, - {_______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______}, - {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, } - -} - -}; - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case QWERTY: - if (record->event.pressed) { - print("mode just switched to qwerty and this is a huge string\n"); - set_single_persistent_default_layer(_QWERTY); - } - 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 MOVEMENT: - if (record->event.pressed) { - layer_on(_MOVEMENT); - } else { - layer_off(_MOVEMENT); - } - return false; - break; - case NUMPAD: - if (record->event.pressed) { - layer_on(_NUMPAD); - } else { - layer_off(_NUMPAD); - } - return false; - break; - case CODE: - if (record->event.pressed) { - layer_on(_CODE); - } else { - layer_off(_CODE); - } - return false; - break; - case BACKLIT: - if (record->event.pressed) { - register_code(KC_RSFT); - #ifdef BACKLIGHT_ENABLE - backlight_step(); - #endif - PORTE &= ~(1<<6); - } else { - unregister_code(KC_RSFT); - PORTE |= (1<<6); - } - return false; - break; - } - return true; -} diff --git a/keyboards/planck/keymaps/guidoism/readme.md b/keyboards/planck/keymaps/guidoism/readme.md deleted file mode 100644 index de9680b49851..000000000000 --- a/keyboards/planck/keymaps/guidoism/readme.md +++ /dev/null @@ -1,2 +0,0 @@ -# The Default Planck Layout - diff --git a/keyboards/planck/keymaps/guidoism/rules.mk b/keyboards/planck/keymaps/guidoism/rules.mk deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/layouts/community/ortho_4x12/guidoism/config.h b/layouts/community/ortho_4x12/guidoism/config.h index 19b71b07ee6f..e22f29803567 100644 --- a/layouts/community/ortho_4x12/guidoism/config.h +++ b/layouts/community/ortho_4x12/guidoism/config.h @@ -18,27 +18,7 @@ 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 - -#include QMK_KEYBOARD_CONFIG_H +#pragma once #define IGNORE_MOD_TAP_INTERRUPT #define USB_MAX_POWER_CONSUMPTION 50 - -#ifndef LAYOUT_planck_mit -#define LAYOUT_planck_mit( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ - k30, k31, k32, k33, k34, k35, k37, k38, k39, k3a, k3b \ -) \ - LAYOUT_ortho_4x12( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \ - k30, k31, k32, k33, k34, k35, k35, k37, k38, k39, k3a, k3b \ - ) -#endif - -#endif diff --git a/layouts/community/ortho_4x12/guidoism/generate_c.py b/layouts/community/ortho_4x12/guidoism/generate_c.py index 7876bee68b93..5bee5760847c 100644 --- a/layouts/community/ortho_4x12/guidoism/generate_c.py +++ b/layouts/community/ortho_4x12/guidoism/generate_c.py @@ -1,38 +1,29 @@ import itertools import json -from pprint import pprint as pp +import os.path +import re -layers = dict(enumerate(['_QWERTY', '_LOWER', '_RAISE', '_MOVEMENT', '_NUMPAD'])) -key_names = {('MO(%d)' % i): layers.get(i).strip('_') for i in layers.keys()} +KEYMAP_C = """/* {0} +{1} +*/ +[{2}] = {3}( + {4}) +""" -unicodes = { - "": "next", - "": "vol-", - "": "vol+", - "": "play", -} +README_MD = """## {0} +``` +{1} +``` +""" -d = json.load(open('layouts/community/ortho_4x12/guidoism/guidoism.json')) +base = os.path.dirname(__file__) -def grouper(iterable, n): - args = [iter(iterable)] * n - return itertools.zip_longest(*args, fillvalue='') +layer_names = dict(enumerate(['_QWERTY', '_LOWER', '_RAISE', '_MOVEMENT', '_NUMPAD', '_FUNCTION'])) +layer_name = {('MO(%d)' % i): layer_names.get(i).strip('_') for i in layer_names.keys()} -def truthy(s): - return [a for a in s if a] +keys = json.load(open(os.path.join(base, 'keys.json'))) -def just(s, n): - return [a.center(n*2+1 if len(s) == 11 and i == 5 else n) for i, a in enumerate(s)] - -def replace(s): - return [key_names.get(a, a) for a in s] - -def layer(i, l): - n = max(len(s) for s in l) - rows = [', '.join(replace(truthy(row))) for row in grouper(l, 12)] - return '[%s] = %s(\n%s)' % (layers[i], d['layout'], ',\n'.join(rows)) - -print(',\n\n'.join(layer(i, l) for i, l in enumerate(d['layers']))) +d = json.load(open(os.path.join(base, 'guidoism.json'))) def surround(s, a, b, c): return a + b.join(s) + c @@ -40,20 +31,45 @@ def surround(s, a, b, c): def pattern(cell, table): return ['─'*cell for i in range(table)] -keys = json.load(open('layouts/community/ortho_4x12/guidoism/keys.json')) - -def layer2(i, l): - def replace(s): - s = [keys.get(a, a) for a in s] - return [unicodes.get(a, a) for a in s] - n = max(len(s) for s in l) - return [surround(just(replace(truthy(row)), 5), '│', '│', '│') for row in grouper(l, 12)] - -for i, l in enumerate(d['layers']): - print(surround(pattern(5, 12), '┌', '┬', '┐')) - for n, row in enumerate(layer2(i, l)): - print(row) - if n < 3: - print(surround(pattern(5, 12), '├', '┼', '┤')) - else: - print(surround(pattern(5, 12), '└', '┴', '┘')) +top = surround(pattern(5, 12), '┌', '┬', '┐') +mid = surround(pattern(5, 12), '├', '┼', '┤') +bottom = surround(pattern(5, 12), '└', '┴', '┘') + +from more_itertools import chunked, intersperse, interleave_longest + +def uni(k): + return keys.get(k, k).lower().center(5) + +def c_layout(i, definition, template): + c_name = layer_names[i] + pretty_name = c_name.strip('_').capitalize() + layout = d['layout'] + + surround = lambda s: ''.join(interleave_longest(['│']*(len(s)+1), s)) + layer = list(map(uni, definition)) + layer[41] = layer[41].center(11) + layer = chunked(layer, 12) + rows = intersperse(mid, map(surround, layer)) + pretty = '\n'.join(itertools.chain([top], rows, [bottom])) + + surround = lambda s: ', '.join(s) + layer = list(map(lambda k: layer_name.get(k, k), definition)) + layer = chunked(layer, 12) + rows = map(surround, layer) + c_layer = ',\n '.join(itertools.chain([], rows, [])) + + return template.format(pretty_name, pretty, c_name, layout, c_layer) + +start = '// START_REPLACEMENT\n' +end = '// END_REPLACEMENT\n' +replacement = start + ',\n\n'.join(c_layout(i, l, KEYMAP_C) for i, l in enumerate(d['layers'])) + end +keymap = os.path.join(base, 'keymap.c') +existing = open(keymap).read() +r = re.compile(r'// START_REPLACEMENT.*// END_REPLACEMENT', re.DOTALL) +open(keymap, 'w').write(r.sub(replacement, existing)) + +replacement = '## Current Configuration\n\n' + '\n\n'.join(c_layout(i, l, README_MD) for i, l in enumerate(d['layers'])) +keymap = os.path.join(base, 'readme.md') +existing = open(keymap).read() +r = re.compile(r'## Current Configuration.*', re.DOTALL) +open(keymap, 'w').write(r.sub(replacement, existing)) diff --git a/layouts/community/ortho_4x12/guidoism/guidoism.json b/layouts/community/ortho_4x12/guidoism/guidoism.json index fd287cf60e7c..6a4364c6be16 100644 --- a/layouts/community/ortho_4x12/guidoism/guidoism.json +++ b/layouts/community/ortho_4x12/guidoism/guidoism.json @@ -1 +1 @@ -{"keyboard":"planck/rev4","keymap":"guidoism","layout":"LAYOUT_planck_mit","layers":[["KC_TAB","KC_Q","KC_W","KC_E","KC_R","KC_T","KC_Y","KC_U","KC_I","KC_O","KC_P","KC_BSPC","LCTL_T(KC_ESC)","KC_A","KC_S","KC_D","KC_F","KC_G","KC_H","KC_J","KC_K","KC_L","KC_COLN","KC_ENT","LSFT_T(KC_CAPS)","KC_Z","KC_X","KC_C","KC_V","KC_B","KC_N","KC_M","KC_COMM","KC_DOT","KC_SLSH","KC_NO","MO(3)","KC_NO","KC_LALT","KC_LGUI","MO(1)","LSFT_T(KC_SPC)","MO(2)","KC_RGUI","KC_RALT","KC_SCLN","KC_NO"],["KC_TILD","KC_EXLM","KC_AT","KC_HASH","KC_DLR","KC_PERC","KC_CIRC","KC_AMPR","KC_ASTR","KC_NO","KC_NO","KC_UNDO","KC_TRNS","KC_NO","KC_CUT","KC_COPY","KC_PSTE","KC_NO","KC_NO","KC_UNDS","KC_PLUS","KC_DQUO","KC_QUOT","KC_PIPE","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_MNXT","KC_VOLD","KC_VOLU","KC_MPLY"],["KC_GRV","KC_P1","KC_P2","KC_P3","KC_P4","KC_P5","KC_P6","KC_P7","KC_P8","KC_P9","KC_P0","KC_TRNS","KC_TRNS","KC_LBRC","KC_RBRC","KC_LPRN","KC_RPRN","KC_NO","KC_NO","KC_PMNS","KC_PEQL","KC_NO","KC_NO","KC_BSLS","KC_TRNS","KC_LT","KC_GT","KC_LCBR","KC_RCBR","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_TRNS","KC_TRNS"],["RESET","DEBUG","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_PGUP","KC_UP","KC_PGDN","KC_NO","KC_TRNS","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_LEFT","KC_DOWN","KC_RGHT","KC_NO","KC_TRNS","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_HOME","KC_NO","KC_END","KC_NO","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS"],["KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_P7","KC_P8","KC_P9","KC_PSLS","KC_TRNS","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_P4","KC_P5","KC_P6","KC_PAST","KC_TRNS","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_P1","KC_P2","KC_P3","KC_PMNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_PCMM","KC_P0","KC_PDOT","KC_PPLS","KC_TRNS"]]} +{"keyboard":"planck/rev4","keymap":"guidoism","layout":"LAYOUT_planck_mit","layers":[["KC_TAB","KC_Q","KC_W","KC_E","KC_R","KC_T","KC_Y","KC_U","KC_I","KC_O","KC_P","KC_BSPC","KC_LCTL","KC_A","KC_S","KC_D","KC_F","KC_G","KC_H","KC_J","KC_K","KC_L","KC_COLN","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","MO(3)","KC_ESC","KC_LALT","KC_LGUI","MO(1)","LSFT_T(KC_SPC)","MO(2)","KC_RGUI","KC_RALT","KC_SCLN","MO(5)"],["KC_TILD","KC_EXLM","KC_AT","KC_HASH","KC_DLR","KC_PERC","KC_CIRC","KC_AMPR","KC_ASTR","KC_NO","KC_NO","KC_UNDO","KC_TRNS","KC_NO","KC_CUT","KC_COPY","KC_PSTE","KC_NO","KC_NO","KC_UNDS","KC_PLUS","KC_DQUO","KC_QUOT","KC_PIPE","KC_CAPS","KC_NO","KC_NO","KC_NO","KC_NO","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_MNXT","KC_VOLD","KC_VOLU","KC_MPLY"],["KC_GRV","KC_P1","KC_P2","KC_P3","KC_P4","KC_P5","KC_P6","KC_P7","KC_P8","KC_P9","KC_P0","KC_TRNS","KC_TRNS","KC_LBRC","KC_RBRC","KC_LPRN","KC_RPRN","KC_NO","KC_NO","KC_PMNS","KC_PEQL","KC_NO","KC_NO","KC_BSLS","KC_TRNS","KC_LT","KC_GT","KC_LCBR","KC_RCBR","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_TRNS","KC_TRNS"],["RESET","DEBUG","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_PGUP","KC_UP","KC_PGDN","KC_NO","KC_TRNS","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_LEFT","KC_DOWN","KC_RGHT","KC_NO","KC_TRNS","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_HOME","KC_NO","KC_END","KC_NO","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS"],["KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_PERC","KC_P7","KC_P8","KC_P9","KC_P0","KC_TRNS","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_DLR","KC_P4","KC_P5","KC_P6","KC_PDOT","KC_TRNS","KC_TRNS","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_P0","KC_P1","KC_P2","KC_P3","KC_PCMM","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_TRNS","KC_NO","KC_P0","KC_NO","KC_NO","KC_TRNS"],["KC_NO","KC_F1","KC_F2","KC_F3","KC_F4","KC_F5","KC_F6","KC_F7","KC_F8","KC_F9","KC_F10","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_NO","KC_TRNS"]]} \ No newline at end of file diff --git a/layouts/community/ortho_4x12/guidoism/keymap.c b/layouts/community/ortho_4x12/guidoism/keymap.c index 093fe140b0aa..2027e2bfa49a 100644 --- a/layouts/community/ortho_4x12/guidoism/keymap.c +++ b/layouts/community/ortho_4x12/guidoism/keymap.c @@ -1,6 +1,4 @@ #include QMK_KEYBOARD_H -#include "action_layer.h" -#include "eeconfig.h" extern keymap_config_t keymap_config; @@ -10,6 +8,7 @@ enum planck_layers { _RAISE, _MOVEMENT, _NUMPAD, + _FUNCTION, }; enum planck_keycodes { @@ -20,37 +19,125 @@ enum planck_keycodes { NUMPAD, }; +#define FUNCTION MO(_FUNCTION) + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_QWERTY] = LAYOUT_planck_mit( -KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, -LCTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_COLN, KC_ENT, -LSFT_T(KC_CAPS), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, -MOVEMENT, KC_NO, KC_LALT, KC_LGUI, LOWER, LSFT_T(KC_SPC), RAISE, KC_RGUI, KC_RALT, KC_SCLN, KC_NO), - - [_LOWER] = LAYOUT_planck_mit( -KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_NO, KC_NO, KC_UNDO, -KC_TRNS, KC_NO, KC_CUT, KC_COPY, KC_PSTE, KC_NO, KC_NO, KC_UNDS, KC_PLUS, KC_DQUO, KC_QUOT, KC_PIPE, -KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, -KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY), - - [_RAISE] = LAYOUT_planck_mit( -KC_GRV, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6, KC_P7, KC_P8, KC_P9, KC_P0, KC_TRNS, -KC_TRNS, KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_NO, KC_NO, KC_PMNS, KC_PEQL, KC_NO, KC_NO, KC_BSLS, -KC_TRNS, KC_LT, KC_GT, KC_LCBR, KC_RCBR, 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_TRNS, KC_TRNS), - - [_MOVEMENT] = LAYOUT_planck_mit( -RESET, DEBUG, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGUP, KC_UP, KC_PGDN, KC_NO, KC_TRNS, -KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_TRNS, -KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_HOME, KC_NO, KC_END, KC_NO, KC_TRNS, -KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), - - [_NUMPAD] = LAYOUT_planck_mit( -KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_P7, KC_P8, KC_P9, KC_PSLS, KC_TRNS, -KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_P4, KC_P5, KC_P6, KC_PAST, KC_TRNS, -KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_P1, KC_P2, KC_P3, KC_PMNS, KC_TRNS, -KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PCMM, KC_P0, KC_PDOT, KC_PPLS, KC_TRNS) +// START_REPLACEMENT +/* Qwerty +┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ +│ ⇥ │ q │ w │ e │ r │ t │ y │ u │ i │ o │ p │ ⌫ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ ctrl│ a │ s │ d │ f │ g │ h │ j │ k │ l │ : │ ⏎ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ ⇧ │ z │ x │ c │ v │ b │ n │ m │ , │ . │ / │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ mov │ ⎋ │ ⌥ │ ⌘ │lower│ sp/sh │raise│ ⌘ │ ⌥ │ ; │ fn │ +└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ +*/ +[_QWERTY] = LAYOUT_planck_mit( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_COLN, 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, + MOVEMENT, KC_ESC, KC_LALT, KC_LGUI, LOWER, LSFT_T(KC_SPC), RAISE, KC_RGUI, KC_RALT, KC_SCLN, FUNCTION) +, + +/* Lower +┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ +│ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ │ │ undo│ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ cut │ copy│paste│ │ │ _ │ + │ " │ ' │ | │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ caps│ │ │ │ │ │ │ │ │ │ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ next│ vol-│ vol+│ play│ +└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ +*/ +[_LOWER] = LAYOUT_planck_mit( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_NO, KC_NO, KC_UNDO, + KC_TRNS, KC_NO, KC_CUT, KC_COPY, KC_PSTE, KC_NO, KC_NO, KC_UNDS, KC_PLUS, KC_DQUO, KC_QUOT, KC_PIPE, + KC_CAPS, KC_NO, KC_NO, KC_NO, KC_NO, 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_MNXT, KC_VOLD, KC_VOLU, KC_MPLY) +, + +/* Raise +┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ +│ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ [ │ ] │ ( │ ) │ │ │ - │ = │ │ │ \ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ < │ > │ { │ } │ │ │ │ │ │ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ │ │ │ │ +└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ +*/ +[_RAISE] = LAYOUT_planck_mit( + KC_GRV, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6, KC_P7, KC_P8, KC_P9, KC_P0, KC_TRNS, + KC_TRNS, KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_NO, KC_NO, KC_PMNS, KC_PEQL, KC_NO, KC_NO, KC_BSLS, + KC_TRNS, KC_LT, KC_GT, KC_LCBR, KC_RCBR, 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_TRNS, KC_TRNS) +, + +/* Movement +┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ +│reset│debug│ │ │ │ │ │ pgup│ ↑ │ pgdn│ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ ← │ ↓ │ → │ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ home│ │ end │ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ │ │ │ │ +└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ +*/ +[_MOVEMENT] = LAYOUT_planck_mit( + RESET, DEBUG, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGUP, KC_UP, KC_PGDN, KC_NO, KC_TRNS, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_TRNS, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_HOME, KC_NO, KC_END, KC_NO, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +, + +/* Numpad +┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ +│ │ │ │ │ │ │ % │ 7 │ 8 │ 9 │ 0 │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ $ │ 4 │ 5 │ 6 │ . │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ 0 │ 1 │ 2 │ 3 │ , │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ 0 │ │ │ │ +└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ +*/ +[_NUMPAD] = LAYOUT_planck_mit( + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PERC, KC_P7, KC_P8, KC_P9, KC_P0, KC_TRNS, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_DLR, KC_P4, KC_P5, KC_P6, KC_PDOT, KC_TRNS, + KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_P0, KC_P1, KC_P2, KC_P3, KC_PCMM, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_P0, KC_NO, KC_NO, KC_TRNS) +, + +/* Function +┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ +│ │ f1 │ f2 │ f3 │ f4 │ f5 │ f6 │ f7 │ f8 │ f9 │ f10 │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ │ │ │ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ │ │ │ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ │ │ │ │ +└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ +*/ +[_FUNCTION] = LAYOUT_planck_mit( + KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS) +// END_REPLACEMENT + + + + + + + }; diff --git a/layouts/community/ortho_4x12/guidoism/keys.json b/layouts/community/ortho_4x12/guidoism/keys.json index 762deb706281..791119b4f298 100644 --- a/layouts/community/ortho_4x12/guidoism/keys.json +++ b/layouts/community/ortho_4x12/guidoism/keys.json @@ -102,8 +102,8 @@ "KC_SLASH": "/", "KC_NUBS": "/", "KC_NUHS": "#", - "KC_CAPSLOCK": "Caps Lock", - "KC_CAPS": "Caps Lock", + "KC_CAPSLOCK": "Caps", + "KC_CAPS": "Caps", "KC_LCTRL": "Ctrl", "KC_LCTL": "Ctrl", "KC_LSHIFT": "\u21e7", @@ -181,26 +181,26 @@ "KC_WAKE": "System Wake", "KC_STOP": "Stop", "KC__MUTE": "Mute (macOS)", - "KC__VOLUP": "", - "KC__VOLDOWN": "", + "KC__VOLUP": "vol+", + "KC__VOLDOWN": "vol-", "KC_AUDIO_MUTE": "Mute", "KC_MUTE": "Mute", - "KC_AUDIO_VOL_UP": "", - "KC_VOLU": "", - "KC_AUDIO_VOL_DOWN": "", - "KC_VOLD": "", - "KC_MEDIA_NEXT_TRACK": "", - "KC_MNXT": "", + "KC_AUDIO_VOL_UP": "vol+", + "KC_VOLU": "vol+", + "KC_AUDIO_VOL_DOWN": "vol-", + "KC_VOLD": "vol-", + "KC_MEDIA_NEXT_TRACK": "next", + "KC_MNXT": "next", "KC_MEDIA_PREV_TRACK": "Previous Track (Windows)", "KC_MPRV": "Previous Track (Windows)", - "KC_MEDIA_FAST_FORWARD": "", - "KC_MFFD": "", + "KC_MEDIA_FAST_FORWARD": "next", + "KC_MFFD": "next", "KC_MEDIA_REWIND": "Previous Track (macOS)", "KC_MRWD": "Previous Track (macOS)", "KC_MEDIA_STOP": "Stop Track", "KC_MSTP": "Stop Track", - "KC_MEDIA_PLAY_PAUSE": "", - "KC_MPLY": "", + "KC_MEDIA_PLAY_PAUSE": "play", + "KC_MPLY": "play", "KC_NUMLOCK": "Keypad Num Lock and Clear", "KC_NLCK": "Keypad Num Lock and Clear", "KC_SLSH": "/", @@ -295,6 +295,7 @@ "MO(3)": "mov", "MO(1)": "lower", "MO(2)": "raise", + "MO(5)": "fn", "LSFT_T(KC_SPC)": "sp/sh", "KC_TRNS": "", "KC_PSTE": "Paste", diff --git a/layouts/community/ortho_4x12/guidoism/readme.md b/layouts/community/ortho_4x12/guidoism/readme.md index 7137ffd141d4..540db64e850c 100644 --- a/layouts/community/ortho_4x12/guidoism/readme.md +++ b/layouts/community/ortho_4x12/guidoism/readme.md @@ -1,37 +1,56 @@ # Guido's Planck Keyboard Layout +I've written a script to convert the json file from the +[QMK Configurator](https://config.qmk.fm) to the C macros +and a pretty form the comments. + +First import the json file in this directory into the configurator, +make any changes, export the file and then run this: + + mv ~/Downloads/guidoism.json layouts/community/ortho_4x12/guidoism/ && python3 layouts/community/ortho_4x12/guidoism/generate_c.py && make planck:guidoism:dfu + +TODO: Move running of generate_c.py to makefile so I just need to run `make planck:guidoism:dfu` + +Note that the pretty forms of the keys are defined in another json +file and are made for my specific board. You made need to update this +file to get the pretty forms to look right. + * Left palm to the `mov` key gets you the `Move` layer * Right thumb on the `raise` key gets you the various programming brackets and parens on your left hand * Left palm on `mov` key and left thumb on `lower` key gets you a numpad on your right hand * Shift with the spacebar * Left pinky is control on hold and escape on tap -* Left shift is caps lock on double-tap +## Current Configuration + +## Qwerty ``` ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ ⇥ │ q │ w │ e │ r │ t │ y │ u │ i │ o │ p │ ⌫ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│ c/e │ a │ s │ d │ f │ g │ h │ j │ k │ l │ : │ ⏎ │ +│ ctrl│ a │ s │ d │ f │ g │ h │ j │ k │ l │ : │ ⏎ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │ ⇧ │ z │ x │ c │ v │ b │ n │ m │ , │ . │ / │ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│ mov │ │ ⌥ │ ⌘ │lower│ sp/sh │raise│ ⌘ │ ⌥ │ ; │ │ +│ mov │ ⎋ │ ⌥ │ ⌘ │lower│ sp/sh │raise│ ⌘ │ ⌥ │ ; │ fn │ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ ``` + ## Lower ``` ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ -│ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ │ │ Undo│ +│ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ │ │ undo│ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│ │ │ Cut │ Copy│Paste│ │ │ _ │ + │ " │ ' │ | │ +│ │ │ cut │ copy│paste│ │ │ _ │ + │ " │ ' │ | │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│ │ │ │ │ │ │ │ │ │ │ │ │ +│ caps│ │ │ │ │ │ │ │ │ │ │ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │ │ │ │ │ │ │ │ next│ vol-│ vol+│ play│ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ ``` + ## Raise ``` ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ @@ -45,32 +64,44 @@ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ ``` -## Move + +## Movement ``` ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ -│RESET│DEBUG│ │ │ │ │ │ PgUp│ ↑ │ PgDn│ │ │ +│reset│debug│ │ │ │ │ │ pgup│ ↑ │ pgdn│ │ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │ │ │ │ │ │ │ │ ← │ ↓ │ → │ │ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│ │ │ │ │ │ │ │ Home│ │ End │ │ │ +│ │ │ │ │ │ │ │ home│ │ end │ │ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │ │ │ │ │ │ │ │ │ │ │ │ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ ``` + ## Numpad ``` ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ -│ │ │ │ │ │ │ │ 7 │ 8 │ 9 │ / │ │ +│ │ │ │ │ │ │ % │ 7 │ 8 │ 9 │ 0 │ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│ │ │ │ │ │ │ │ 4 │ 5 │ 6 │ * │ │ +│ │ │ │ │ │ │ $ │ 4 │ 5 │ 6 │ . │ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│ │ │ │ │ │ │ │ 1 │ 2 │ 3 │ - │ │ +│ │ │ │ │ │ │ 0 │ 1 │ 2 │ 3 │ , │ │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ -│ │ │ │ │ │ │ , │ 0 │ . │ + │ │ +│ │ │ │ │ │ │ │ 0 │ │ │ │ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ ``` -Use the [QMK Configurator](https://config.qmk.fm/#/planck/rev4/LAYOUT_planck_mit) -to edit the guidoism.json file. Then update it and run `python3 layouts/community/ortho_4x12/guidoism/generate_c.py` -to get the update C structs and Markdown for this file. + +## Function +``` +┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ +│ │ f1 │ f2 │ f3 │ f4 │ f5 │ f6 │ f7 │ f8 │ f9 │ f10 │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ │ │ │ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ │ │ │ │ │ +├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ +│ │ │ │ │ │ │ │ │ │ │ │ +└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ +``` From 3d15038dd40721a992606705cdac5c5e381f5bba Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 16 Oct 2018 07:30:12 -0700 Subject: [PATCH 296/505] Make RGB init write to eeprom once --- users/drashna/rgb_stuff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/users/drashna/rgb_stuff.c b/users/drashna/rgb_stuff.c index dc6075320e51..9ad94c0c3d26 100644 --- a/users/drashna/rgb_stuff.c +++ b/users/drashna/rgb_stuff.c @@ -273,7 +273,7 @@ void matrix_init_rgb(void) { default: rgblight_sethsv_noeeprom_cyan(); break; } - rgblight_mode_noeeprom(1); + rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); } } From 2776b9ee90d84b8a6c97e3e9395a8a87f499c5a9 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 16 Oct 2018 08:22:37 -0700 Subject: [PATCH 297/505] Update readme for userspace --- users/drashna/readme.md | 97 +++++++++++++---------------------------- 1 file changed, 31 insertions(+), 66 deletions(-) diff --git a/users/drashna/readme.md b/users/drashna/readme.md index 179960322a81..ffc60060f455 100644 --- a/users/drashna/readme.md +++ b/users/drashna/readme.md @@ -1,11 +1,8 @@ -Overview -======== +# Overview -This is my personal userspace file. Most of my code exists here, as it's heavily shared. +This is my personal userspace file. Most of my code exists here, as it's heavily shared. - -Custom userspace handlers -------------------------- +## Custom userspace handlers Specifically QMK works by using customized handlers for everything. This allows for multiple levels of customization. @@ -15,29 +12,26 @@ The same goes for `matrix_init`, `layer_state_set`, `led_set`, and a few other f All (most) `_user` functions are handled here instead. To allow keyboard specific configuration, I've created `_keymap` functions that can be called by the keymap.c files instead. -This allows for keyboard specific configuration while maintaining the ability to customize the board. - -My [Ergodox EZ Keymap](https://github.com/qmk/qmk_firmware/blob/master/keyboards/ergodox_ez/keymaps/drashna/keymap.c#L399) is a good example of this, as it uses the LEDs as modifier indicators. +This allows for keyboard specific configuration while maintaining the ability to customize the board. +My [Ergodox EZ Keymap](https://github.com/qmk/qmk_firmware/blob/master/layouts/community/ergodox/drashna/keymap.c#L297) is a good example of this, as it uses the LEDs as modifier indicators. -Keyboard Layout Templates -------------------------- +## Keyboard Layout Templates -This borrows from @jola5's "Not quite neo" code. This allows me to maintain blocks of keymaps in the userspace, so that I can modify the userspace, and this is reflected in all of the keyboards that use it, at once. +This borrows from @jola5's "Not quite neo" code. This allows me to maintain blocks of keymaps in the userspace, so that I can modify the userspace, and this is reflected in all of the keyboards that use it, at once. This makes adding tap/hold mods, or other special keycodes or functions to all keyboards super easy, as it's done to all of them at once. -The caveat here is that the keymap needs a processor/wrapper, as it doesn't like the substitutions. However, this is as simple as just pushing it through a define. For instance: +The caveat here is that the keymap needs a processor/wrapper, as it doesn't like the substitutions. However, this is as simple as just pushing it through a define. For instance: `#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)` -Once that's been done and you've switched the keymaps to use the "wrapper", it will read the substitution blocks just fine. +Once that's been done and you've switched the keymaps to use the "wrapper", it will read the substitution blocks just fine. Credit goes to @jola5 for first implementing this awesome idea. -Custom Keycodes ---------------- +## Custom Keycodes Keycodes are defined in the drashna.h file and need to be included in the keymap.c files, so that they can be used there. @@ -45,10 +39,9 @@ A bunch of macros are present and are only included on boards that are not the E Included is a custom macro for compiling my keyboards. This includes the bootloader target (`:teensy`, `:avrdude`, or `:dfu`), and keeps RGBLIGHT, AUDIO and/or FAUXCLICKY enabled, if it previously was (regardless of the rules file). -This also includes a modified RESET keycode as well, that sets the underglow to red. +This also includes a modified RESET keycode as well, that sets the underglow to red. -Layer Indication ----------------- +## Layer Indication This uses the `layer_state_set_*` command to change the layer color, to indicate which layer it is on. This includes the default keymap, as well. @@ -58,9 +51,7 @@ Additionally, there is a custom keycode to toggle layer indication. And all RGB Also. I use `rgblight_sethsv` since it works with animation modes (that support it). - -Diablo Layer ------------- +## Diablo Layer This layer has some special handling. @@ -72,8 +63,7 @@ Tappind once disables this, and switching layers temporarily disables this, unti For critics that think this is cheating, search "diablo 3 num lock auto cast". This is just a simpler method, since I no longer own a normal (non QMK) numpad. -Secret Macros -------------- +## Secret Macros With help from gitter and Colinta, this adds the ability to add hidden macros from other users. @@ -82,7 +72,8 @@ First, I have several files that are hidden/excluded from Git/GitHub. These con And this requires `KC_SECRET_1` through `KC_SECRET_5` to be defined in your `.h` file to define the keycodes for the new macros. -###### .git/info/exclude +### .git/info/exclude + ``` # git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. @@ -96,7 +87,7 @@ And this requires `KC_SECRET_1` through `KC_SECRET_5` to be defined in your `.c` file, you will want to add this to the top: +In the `.c` file, you will want to add this to the top: ```c __attribute__ ((weak)) @@ -152,64 +144,37 @@ bool process_record_secrets(uint16_t keycode, keyrecord_t *record) { return true; } ``` -This is so that the function can be called here, and replaced in the `secrets.c` file, and so it won't error out if it doesn't exist. +This is so that the function can be called here, and replaced in the `secrets.c` file, and so it won't error out if it doesn't exist. And then, in the `process_record_user` function, assuming you have `return process_record_keymap(keycode, record)` here, you'll want to replace the "final" return with the following. Otherwise, you want to replace the `return true;` with `return process_record_secrets(keycode, record);` + ```c return process_record_keymap(keycode, record) && process_record_secrets(keycode, record); } ``` -###### rules.mk +### rules.mk -Here, you want your `/users//rules.mk` file to "detect" the existence of the `secrets.c` file, and only add it if the file exists. To do so, add this block: -```c +Here, you want your `/users//rules.mk` file to "detect" the existence of the `secrets.c` file, and only add it if the file exists. To do so, add this block: + +```make ifneq ("$(wildcard $(USER_PATH)/secrets.c)","") SRC += secrets.c endif ``` Additionally, if you want to make sure that you can disable the function without messing with the file, you need to add this to your `/users//rules.mk`, so that it catches the flag: -```c + +```make ifeq ($(strip $(NO_SECRETS)), yes) OPT_DEFS += -DNO_SECRETS endif ``` -Then, if you run `make keyboard:name NO_SECRETS=yes`, it will default to the test strings in your `.c` file, rather than reading from your file. - - -Userspace EEPROM config ------------------------ - -This adds EEPROM support fo the userspace, so that certain values are configurable in such a way that persists when power is lost. Namely, just the clicky feature and the Overwatch macro option ("is_overwatch"). This is done by reading and saving the structure from EEPROM. - -To implement this, first you need to specify the location: - -```c -#define EECONFIG_USERSPACE (uint8_t *)20 -``` -This tells us where in the EEPROM that the data structure is located, and this specifies that it's a byte (8 bits). However, to maximize it's usage, we want to specify a data structure here, so that we can use multiple settings. To do that: - -```c -typedef union { - uint8_t raw; - struct { - bool clicky_enable :1; - bool is_overwatch :1; - }; -} userspace_config_t; -``` -Then, in your C file, you want to add: `userspace_config_t userspace_config;`, and in your `matrix_init_*` function, you want to add `userspace_config.raw = eeprom_read_byte(EECONFIG_USERSPACE);` - -From there, you'd want to use the data structure (such as `userspace_config.is_overwatch`) when you want to check this value. - -And if you want to update it, update directly and then use `eeprom_update_byte(EECONFIG_USERSPACE, userspace_config.raw);` to write the value back to the EEPROM. - +Then, if you run `make keyboard:name NO_SECRETS=yes`, it will default to the test strings in your `.c` file, rather than reading from your file. -Pro Micro Hacking ------------------ +## Pro Micro Hacking Well, you can get the QMK DFU bootloader working on the ProMicro. But you need to change fuses. From 76b5ac621d3f5f5e809de2bc9479d54b99a2f89f Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 16 Oct 2018 20:33:55 -0700 Subject: [PATCH 298/505] Update to Corne Keyboard (crkbd) keymap --- keyboards/crkbd/keymaps/drashna/keymap.c | 63 ++++++++++++++---------- keyboards/crkbd/keymaps/drashna/rules.mk | 2 +- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/keyboards/crkbd/keymaps/drashna/keymap.c b/keyboards/crkbd/keymaps/drashna/keymap.c index a293d5337403..49db492c4e2e 100644 --- a/keyboards/crkbd/keymaps/drashna/keymap.c +++ b/keyboards/crkbd/keymaps/drashna/keymap.c @@ -113,12 +113,47 @@ const char *read_logo(void); void set_keylog(uint16_t keycode, keyrecord_t *record); const char *read_keylog(void); const char *read_keylogs(void); - +char layer_state_str[24]; // const char *read_mode_icon(bool swap); -// const char *read_host_led_state(void); +const char *read_host_led_state(void); // void set_timelog(void); // const char *read_timelog(void); + +const char* read_layer_state(void) { + switch (layer_state) { + case _QWERTY: + switch (default_layer_state) { + case _QWERTY: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: QWERTY"); + break; + case _COLEMAK: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Colemak"); + break; + case _DVORAK: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Dvorak"); + break; + case _WORKMAN: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Workman"); + break; + } + break; + case _RAISE: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Raise"); + break; + case _LOWER: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Lower"); + break; + case _ADJUST: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Adjust"); + break; + default: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Undef-%ld", layer_state); + } + + return layer_state_str; +} + void matrix_scan_keymap(void) { iota_gfx_task(); } @@ -130,7 +165,7 @@ void matrix_render_user(struct CharacterMatrix *matrix) { matrix_write_ln(matrix, read_keylog()); matrix_write_ln(matrix, read_keylogs()); //matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui)); - //matrix_write_ln(matrix, read_host_led_state()); + matrix_write_ln(matrix, read_host_led_state()); //matrix_write_ln(matrix, read_timelog()); } else { matrix_write(matrix, read_logo()); @@ -156,28 +191,6 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { set_keylog(keycode, record); // set_timelog(); } - - switch (keycode) { - case RGB_MOD: - #ifdef RGBLIGHT_ENABLE - if (record->event.pressed) { - rgblight_mode_noeeprom(RGB_current_mode); - rgblight_step(); - RGB_current_mode = rgblight_config.mode; - } - #endif - return false; - break; - case RGBRST: - #ifdef RGBLIGHT_ENABLE - if (record->event.pressed) { - eeconfig_update_rgblight_default(); - rgblight_enable(); - RGB_current_mode = rgblight_config.mode; - } - #endif - break; - } return true; } diff --git a/keyboards/crkbd/keymaps/drashna/rules.mk b/keyboards/crkbd/keymaps/drashna/rules.mk index 8f69cba72f6d..a4e1deba867f 100644 --- a/keyboards/crkbd/keymaps/drashna/rules.mk +++ b/keyboards/crkbd/keymaps/drashna/rules.mk @@ -26,6 +26,6 @@ SRC += ./lib/glcdfont.c \ ./lib/layer_state_reader.c \ ./lib/logo_reader.c \ ./lib/keylogger.c \ + ./lib/host_led_state_reader.c \ # ./lib/mode_icon_reader.c \ - # ./lib/host_led_state_reader.c \ # ./lib/timelogger.c \ From 6ed925103fcc80add200760b5e725f100b3597ab Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 23 Oct 2018 09:00:41 -0700 Subject: [PATCH 299/505] Change user EEPROM defaults --- users/drashna/drashna.c | 1 + 1 file changed, 1 insertion(+) diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 7c280e2dddc4..cd7afe768799 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -422,6 +422,7 @@ void led_set_user(uint8_t usb_led) { void eeconfig_init_user(void) { userspace_config.raw = 0; + userspace_config.rgb_layer_change = true; eeconfig_update_user(userspace_config.raw); } From 796bce5ab23108558e3eb06d485d3468b89e80f6 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 24 Oct 2018 08:22:36 -0700 Subject: [PATCH 300/505] Cleanup KC_MAKE command --- users/drashna/drashna.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index cd7afe768799..5329d36e2e47 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -254,17 +254,15 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { clear_mods(); send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), 10); if (temp_mod & MODS_SHIFT_MASK) { - send_string_with_delay_P(PSTR( -#if defined(__ARM__) - ":dfu-util" -#elif defined(BOOTLOADER_DFU) - ":dfu" -#elif defined(BOOTLOADER_HALFKAY) - ":teensy" -#elif defined(BOOTLOADER_CATERINA) - ":avrdude" -#endif // bootloader options - ), 10); + #if defined(__ARM__) + send_string_with_delay_P(PSTR(":dfu-util"), 10); + #elif defined(BOOTLOADER_DFU) + send_string_with_delay_P(PSTR(":dfu"), 10); + #elif defined(BOOTLOADER_HALFKAY) + send_string_with_delay_P(PSTR(":teensy"), 10); + #elif defined(BOOTLOADER_CATERINA) + send_string_with_delay_P(PSTR(":avrdude"), 10); + #endif // bootloader options } if (temp_mod & MODS_CTRL_MASK) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10); } send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10); From 4df74f6058043cf37d997e8e93fc3526b29a13b3 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 24 Oct 2018 13:45:39 -0700 Subject: [PATCH 301/505] Minor updates to keymaps --- keyboards/crkbd/keymaps/drashna/keymap.c | 4 ++-- keyboards/crkbd/keymaps/drashna/rules.mk | 4 ++-- keyboards/iris/keymaps/drashna/keymap.c | 3 +-- keyboards/orthodox/keymaps/drashna/keymap.c | 2 +- layouts/community/ergodox/drashna/keymap.c | 3 +-- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/keyboards/crkbd/keymaps/drashna/keymap.c b/keyboards/crkbd/keymaps/drashna/keymap.c index 49db492c4e2e..99dcdb4e1736 100644 --- a/keyboards/crkbd/keymaps/drashna/keymap.c +++ b/keyboards/crkbd/keymaps/drashna/keymap.c @@ -28,8 +28,8 @@ enum crkbd_keycodes { LAYOUT_wrapper( \ KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \ KC_TAB, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ - KC_MLSF, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ - LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE \ + OS_LSFT, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, CTL_T(K2A), OS_RSFT, \ + LT(_LOWER,KC_GRV), KC_SPC, LALT_T(KC_BSPC), KC_DEL, KC_ENT, RAISE \ ) #define LAYOUT_crkbd_base_wrapper(...) LAYOUT_crkbd_base(__VA_ARGS__) diff --git a/keyboards/crkbd/keymaps/drashna/rules.mk b/keyboards/crkbd/keymaps/drashna/rules.mk index a4e1deba867f..ccf8e2b7c8d1 100644 --- a/keyboards/crkbd/keymaps/drashna/rules.mk +++ b/keyboards/crkbd/keymaps/drashna/rules.mk @@ -14,7 +14,7 @@ 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. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SWAP_HANDS_ENABLE = no # Enable one-hand typing # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE @@ -23,9 +23,9 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # If you want to change the display of OLED, you need to change here SRC += ./lib/glcdfont.c \ ./lib/rgb_state_reader.c \ - ./lib/layer_state_reader.c \ ./lib/logo_reader.c \ ./lib/keylogger.c \ ./lib/host_led_state_reader.c \ + # ./lib/layer_state_reader.c \ # ./lib/mode_icon_reader.c \ # ./lib/timelogger.c \ diff --git a/keyboards/iris/keymaps/drashna/keymap.c b/keyboards/iris/keymaps/drashna/keymap.c index 60f41f9d98e2..21e3151c0fe1 100644 --- a/keyboards/iris/keymaps/drashna/keymap.c +++ b/keyboards/iris/keymaps/drashna/keymap.c @@ -12,7 +12,7 @@ KC_ESC, ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_MINS, \ KC_TAB , K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSLS, \ KC_C1R3, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ - KC_MLSF, CTL_T(K21), K22, K23, K24, K25, ALT_APP, OS_RGUI, K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ + OS_LSFT, CTL_T(K21), K22, K23, K24, K25, OS_LALT, OS_RGUI, K26, K27, K28, K29, CTL_T(K2A), OS_RSFT, \ LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE \ ) #define LAYOUT_iris_base_wrapper(...) LAYOUT_iris_base(__VA_ARGS__) @@ -95,4 +95,3 @@ void matrix_init_keymap(void) { DDRB &= ~(1<<0); PORTB &= ~(1<<0); } - diff --git a/keyboards/orthodox/keymaps/drashna/keymap.c b/keyboards/orthodox/keymaps/drashna/keymap.c index 25296ca4fdd2..545ad25dcd30 100644 --- a/keyboards/orthodox/keymaps/drashna/keymap.c +++ b/keyboards/orthodox/keymaps/drashna/keymap.c @@ -38,7 +38,7 @@ uint8_t last_osm; ) \ LAYOUT_wrapper( \ KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \ - KC_TAB, K11, K12, K13, K14, K15, ALT_APP, OS_LGUI, KC_LALT, OS_RGUI, K16, K17, K18, K19, K1A, KC_QUOT, \ + KC_TAB, K11, K12, K13, K14, K15, OS_LALT, OS_LGUI, OS_RALT, OS_RGUI, K16, K17, K18, K19, K1A, KC_QUOT, \ KC_MLSF, CTL_T(K21), K22, K23, K24, K25, LOWER, KC_SPACE,KC_BSPC, KC_DEL, KC_ENT, RAISE, K26, K27, K28, K29, CTL_T(K2A), KC_MRSF \ ) #define LAYOUT_orthodox_base_wrapper(...) LAYOUT_orthodox_base(__VA_ARGS__) diff --git a/layouts/community/ergodox/drashna/keymap.c b/layouts/community/ergodox/drashna/keymap.c index b9a2eb7a8f92..518eaf0348b0 100644 --- a/layouts/community/ergodox/drashna/keymap.c +++ b/layouts/community/ergodox/drashna/keymap.c @@ -41,7 +41,7 @@ bool skip_leds = false; KC_C1R3, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ KC_MLSF, CTL_T(K21), K22, K23, K24, K25, TG(_GAMEPAD), TG(_GAMEPAD), K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ KC_GRV, OSM(MOD_MEH),OSM(MOD_LGUI),KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, UC_IRNY, \ - ALT_T(KC_APP), OSM(MOD_LGUI), OSM(MOD_RGUI), CTL_T(KC_ESCAPE), \ + OS_LALT, OS_LGUI, OS_RGUI, CTL_T(KC_ESCAPE), \ KC_HOME, KC_PGUP, \ LT(_LOWER, KC_SPACE),KC_BSPC, KC_END, KC_PGDN, KC_DEL, LT(_RAISE, KC_ENTER) \ ) @@ -335,4 +335,3 @@ bool indicator_is_this_led_used_keyboard(uint8_t index) { return false; } } - From 7b3ead01339bcf75eecfa2c2c704159906995986 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 25 Oct 2018 08:56:05 -0700 Subject: [PATCH 302/505] Remove 'return false' in macros since it's not needed And it produces better handling overall. --- users/drashna/drashna.c | 29 +++++------------------------ 1 file changed, 5 insertions(+), 24 deletions(-) diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 5329d36e2e47..5b9957c3da74 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -226,25 +226,21 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { set_single_persistent_default_layer(_QWERTY); } - return false; break; case KC_COLEMAK: if (record->event.pressed) { set_single_persistent_default_layer(_COLEMAK); } - return false; break; case KC_DVORAK: if (record->event.pressed) { set_single_persistent_default_layer(_DVORAK); } - return false; break; case KC_WORKMAN: if (record->event.pressed) { set_single_persistent_default_layer(_WORKMAN); } - return false; break; @@ -264,36 +260,26 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { send_string_with_delay_P(PSTR(":avrdude"), 10); #endif // bootloader options } + #if defined(KEYBOARD_viterbi) + send_string_with_delay_P(PSTR(":dfu"), 10); + #endif if (temp_mod & MODS_CTRL_MASK) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10); } send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10); set_mods(temp_mod); } - return false; break; case EPRM: // Resets EEPROM if (record->event.pressed) { eeconfig_init(); } - return false; break; case VRSN: // Prints firmware version if (record->event.pressed) { send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), MACRO_TIMER); } - return false; break; -/* Code has been depreciated - case KC_SECRET_1 ... KC_SECRET_5: // Secrets! Externally defined strings, not stored in repo - if (!record->event.pressed) { - clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED); - send_string(decoy_secret[keycode - KC_SECRET_1]); - } - return false; - break; -*/ - // These are a serious of gaming macros. // Only enables for the viterbi, basically, // to save on firmware space, since it's limited. @@ -303,7 +289,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #ifdef RGBLIGHT_ENABLE userspace_config.is_overwatch ? rgblight_mode_noeeprom(17) : rgblight_mode_noeeprom(18); #endif //RGBLIGHT_ENABLE - return false; break; + break; case KC_SALT: return send_game_macro("Salt, salt, salt...", record, false); case KC_MORESALT: @@ -339,7 +325,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } } #endif // TAP_DANCE_ENABLE - return false; break; + break; case KC_CCCV: // One key copy/paste @@ -356,32 +342,27 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { unregister_code(KC_LCTL); } } - return false; break; #ifdef UNICODE_ENABLE case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻ if (record->event.pressed) { send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B"); } - return false; break; case UC_TABL: // ┬─┬ノ( º _ ºノ) if (record->event.pressed) { send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029"); } - return false; break; case UC_SHRG: // ¯\_(ツ)_/¯ if (record->event.pressed) { send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF"); } - return false; break; case UC_DISA: // ಠ_ಠ if (record->event.pressed) { send_unicode_hex_string("0CA0 005F 0CA0"); } - return false; break; #endif } From ba7a1e89769049ba24de92e6538875803079a702 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 25 Oct 2018 22:08:22 -0700 Subject: [PATCH 303/505] Update old iris config --- keyboards/iris/keymaps/drashna_old/config.h | 9 ++------- keyboards/iris/keymaps/drashna_old/rules.mk | 5 ++--- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/keyboards/iris/keymaps/drashna_old/config.h b/keyboards/iris/keymaps/drashna_old/config.h index 6152ca5b6eca..e452f695a0d0 100644 --- a/keyboards/iris/keymaps/drashna_old/config.h +++ b/keyboards/iris/keymaps/drashna_old/config.h @@ -15,10 +15,7 @@ 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 - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -34,7 +31,7 @@ along with this program. If not, see . #ifdef RGBLIGHT_ENABLE #undef RGBLED_NUM #define RGBLED_NUM 16 // Number of LEDs -#define RGBLIGHT_ANIMATIONS + #define RGBLIGHT_HUE_STEP 12 #define RGBLIGHT_SAT_STEP 12 #define RGBLIGHT_VAL_STEP 12 @@ -70,5 +67,3 @@ along with this program. If not, see . #define ALT_LED1 7 #define GUI_LED1 8 - -#endif diff --git a/keyboards/iris/keymaps/drashna_old/rules.mk b/keyboards/iris/keymaps/drashna_old/rules.mk index f6ec9d1e5adb..441d15a54c2b 100644 --- a/keyboards/iris/keymaps/drashna_old/rules.mk +++ b/keyboards/iris/keymaps/drashna_old/rules.mk @@ -1,4 +1,5 @@ USER_NAME := drashna +SRC += ../drashna/keymap.c BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = no # Mouse keys(+4700) @@ -10,12 +11,10 @@ RGBLIGHT_ENABLE = yes AUDIO_ENABLE = yes NKRO_ENABLE = yes BACKLIGHT_ENABLE = no -SWAP_HANDS_ENABLE = no +SWAP_HANDS_ENABLE = yes INDICATOR_LIGHTS = yes MACROS_ENABLED = no RGBLIGHT_TWINKLE = yes -SRC += ../drashna/keymap.c - BOOTLOADER = qmk-dfu From d29a61e9ce39947cc2618c5d19d36f063bb0255b Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Thu, 25 Oct 2018 22:08:49 -0700 Subject: [PATCH 304/505] Add Bootmagic Lite for now --- users/drashna/config.h | 9 ++++++++- users/drashna/drashna.c | 19 +++++++++++++++++++ users/drashna/drashna.h | 1 - 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/users/drashna/config.h b/users/drashna/config.h index 4545b34ef67d..0d41359cca6d 100644 --- a/users/drashna/config.h +++ b/users/drashna/config.h @@ -73,4 +73,11 @@ #define MACRO_TIMER 5 - +#if !defined(BOOTMAGIC_LITE) && !defined(BOOTMAGIC_ENABLE) +#ifndef BOOTMAGIC_LITE_COLUMN + #define BOOTMAGIC_LITE_COLUMN 0 +#endif +#ifndef BOOTMAGIC_LITE_ROW + #define BOOTMAGIC_LITE_ROW 0 +#endif +#endif diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 5b9957c3da74..35fa15be4721 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -81,6 +81,21 @@ bool mod_key_press (uint16_t code, uint16_t mod_code, bool pressed, uint16_t thi return false; } +void bootmagic_lite(void) { + matrix_scan(); + #if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0 + wait_ms(DEBOUNCING_DELAY * 2); + #elif defined(DEBOUNCE) && DEBOUNCE > 0 + wait_ms(DEBOUNCE * 2); + #else + wait_ms(30); + #endif + matrix_scan(); + if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) { + bootloader_jump(); + } +} + // Add reconfigurable functions here, for keymap customization // This allows for a global, userspace functions, and continued // customization of the keymap. Use _keymap instead of _user @@ -133,6 +148,10 @@ void eeconfig_init_keymap(void) {} // Call user matrix init, set default RGB colors and then // call the keymap's init function void matrix_init_user(void) { + #if !defined(BOOTMAGIC_LITE) && !defined(BOOTMAGIC_ENABLE) + bootmagic_lite(); + #endif + userspace_config.raw = eeconfig_read_user(); #ifdef BOOTLOADER_CATERINA diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h index 7e69a9f8d9f4..221a8e413e2d 100644 --- a/users/drashna/drashna.h +++ b/users/drashna/drashna.h @@ -353,4 +353,3 @@ NOTE: These are all the same length. If you do a search/replace #define _________________ADJUST_R1_________________ KC_SEC1, KC_SEC2, KC_SEC3, KC_SEC4, KC_SEC5 #define _________________ADJUST_R2_________________ AG_SWAP, QWERTY, COLEMAK, DVORAK, WORKMAN #define _________________ADJUST_R3_________________ MG_NKRO, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT - From 9d27bb512f86757607a1e7a46688568198e7ce7d Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 27 Oct 2018 12:17:15 -0700 Subject: [PATCH 305/505] Fix userspace config.h --- users/drashna/config.h | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/users/drashna/config.h b/users/drashna/config.h index 0d41359cca6d..9d7d20add034 100644 --- a/users/drashna/config.h +++ b/users/drashna/config.h @@ -69,15 +69,4 @@ #define NO_ACTION_MACRO #define NO_ACTION_FUNCTION -#define DISABLE_LEADER - #define MACRO_TIMER 5 - -#if !defined(BOOTMAGIC_LITE) && !defined(BOOTMAGIC_ENABLE) -#ifndef BOOTMAGIC_LITE_COLUMN - #define BOOTMAGIC_LITE_COLUMN 0 -#endif -#ifndef BOOTMAGIC_LITE_ROW - #define BOOTMAGIC_LITE_ROW 0 -#endif -#endif From 214241853a7b52d64e5cc702b107f264160f6880 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 27 Oct 2018 12:20:10 -0700 Subject: [PATCH 306/505] Fix Bootmagic_lite function --- users/drashna/drashna.c | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index 35fa15be4721..b2219e9aa745 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -423,19 +423,3 @@ void eeconfig_init_user(void) { userspace_config.rgb_layer_change = true; eeconfig_update_user(userspace_config.raw); } - -void bootmagic_lite(void) { - matrix_scan(); - #if defined(DEBOUNCING_DELAY) && DEBOUNCING_DELAY > 0 - wait_ms(DEBOUNCING_DELAY * 2); - #elif defined(DEBOUNCE) && DEBOUNCE > 0 - wait_ms(DEBOUNCE * 2); - #else - wait_ms(30); - #endif - matrix_scan(); - - if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) { - bootloader_jump(); - } -} From 0f086e488954dcfac49c1c27aa972441b944c68c Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 27 Oct 2018 12:32:53 -0700 Subject: [PATCH 307/505] Add Alternate DVORAK layout --- users/drashna/drashna.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h index 221a8e413e2d..573cb26fd0cf 100644 --- a/users/drashna/drashna.h +++ b/users/drashna/drashna.h @@ -255,6 +255,14 @@ NOTE: These are all the same length. If you do a search/replace #define _________________DVORAK_R3_________________ KC_B, KC_M, KC_W, KC_V, KC_Z +#define ________________DVORAK_AU_L1_______________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y +#define ________________DVORAK_AU_L2_______________ KC_O, KC_A, KC_E, KC_I, KC_U +#define ________________DVORAK_AU_L3_______________ KC_SCLN, KC_Q, KC_J, KC_K, KC_X + +#define ________________DVORAK_AU_R1_______________ KC_F, KC_G, KC_C, KC_R, KC_L +#define ________________DVORAK_AU_R2_______________ KC_D, KC_H, KC_T, KC_N, KC_S +#define ________________DVORAK_AU_R3_______________ KC_B, KC_M, KC_W, KC_V, KC_Z + #define _________________WORKMAN_L1________________ KC_Q, KC_D, KC_R, KC_W, KC_B #define _________________WORKMAN_L2________________ KC_A, KC_S, KC_H, KC_T, KC_G #define _________________WORKMAN_L3________________ KC_Z, KC_X, KC_M, KC_C, KC_V From b9811fd7e79b409138d733f5544a29d13906cccf Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 27 Oct 2018 12:40:15 -0700 Subject: [PATCH 308/505] Make old keymap super compatible --- keyboards/iris/keymaps/drashna_old/rules.mk | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/keyboards/iris/keymaps/drashna_old/rules.mk b/keyboards/iris/keymaps/drashna_old/rules.mk index 441d15a54c2b..73f37c6c558b 100644 --- a/keyboards/iris/keymaps/drashna_old/rules.mk +++ b/keyboards/iris/keymaps/drashna_old/rules.mk @@ -1,20 +1,4 @@ USER_NAME := drashna SRC += ../drashna/keymap.c -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 -TAP_DANCE_ENABLE = no -RGBLIGHT_ENABLE = yes -AUDIO_ENABLE = yes -NKRO_ENABLE = yes -BACKLIGHT_ENABLE = no -SWAP_HANDS_ENABLE = yes - -INDICATOR_LIGHTS = yes -MACROS_ENABLED = no -RGBLIGHT_TWINKLE = yes - -BOOTLOADER = qmk-dfu +include $(KEYBOARD_PATH_2)/keymaps/drashna/rules.mk From c60a312ba99f4ece511f36bc25c5f63410313b5b Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 27 Oct 2018 14:52:57 -0700 Subject: [PATCH 309/505] Further unify old iris keymap --- keyboards/iris/keymaps/drashna/config.h | 2 + keyboards/iris/keymaps/drashna_old/config.h | 41 +++++---------------- 2 files changed, 11 insertions(+), 32 deletions(-) diff --git a/keyboards/iris/keymaps/drashna/config.h b/keyboards/iris/keymaps/drashna/config.h index 0274867153fe..dd247a42a7fe 100644 --- a/keyboards/iris/keymaps/drashna/config.h +++ b/keyboards/iris/keymaps/drashna/config.h @@ -68,3 +68,5 @@ along with this program. If not, see . #define ALT_LED1 8 #define GUI_LED1 9 +#define BOOTMAGIC_LITE_ROW 4 +#define BOOTMAGIC_LITE_COLUMN 3 diff --git a/keyboards/iris/keymaps/drashna_old/config.h b/keyboards/iris/keymaps/drashna_old/config.h index e452f695a0d0..b985c4dfc12c 100644 --- a/keyboards/iris/keymaps/drashna_old/config.h +++ b/keyboards/iris/keymaps/drashna_old/config.h @@ -18,52 +18,29 @@ along with this program. If not, see . #pragma once /* Use I2C or Serial, not both */ - -#define USE_SERIAL -#undef USE_I2C - -/* Select hand configuration */ - -// #define MASTER_LEFT -// #define MASTER_RIGHT -#define EE_HANDS +#include "../drashna/config.h" #ifdef RGBLIGHT_ENABLE #undef RGBLED_NUM #define RGBLED_NUM 16 // Number of LEDs - -#define RGBLIGHT_HUE_STEP 12 -#define RGBLIGHT_SAT_STEP 12 -#define RGBLIGHT_VAL_STEP 12 -#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 2 -#define RGBLIGHT_EFFECT_SNAKE_LENGTH 2 -#define RGBLIGHT_EFFECT_BREATHE_CENTER 1 - -#define RGBLIGHT_LIMIT_VAL 225 -#endif // RGBLIGHT_ENABLE - -#ifdef AUDIO_ENABLE -#define C6_AUDIO -#ifdef RGBLIGHT_ENABLE -#define NO_MUSIC_MODE -#endif //RGBLIGHT_ENABLE -#endif //AUDIO_ENABLE - -#define QMK_ESC_OUTPUT F6 // usually COL -#define QMK_ESC_INPUT D7 // usually ROW -#define QMK_LED B0 -#define QMK_SPEAKER C6 +#endif #undef PRODUCT #ifdef KEYBOARD_iris_rev2 -#define PRODUCT Drashna Hacked Iris Rev.2 +#define PRODUCT Drashna Hacked Iris Rev.2 (16 LED) #endif +#undef SHFT_LED1 #define SHFT_LED1 5 +#undef SHFT_LED2 #define SHFT_LED2 10 +#undef CTRL_LED1 #define CTRL_LED1 6 +#undef CTRL_LED2 #define CTRL_LED2 9 +#undef ALT_LED1 #define ALT_LED1 7 +#undef GUI_LED1 #define GUI_LED1 8 From 8517f8a6606d092014edf23ac9874d6a47fe1178 Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Mon, 29 Oct 2018 02:12:44 +0900 Subject: [PATCH 310/505] Helix serial.c re-adjust compiler depend value of delay (#4269) * Helix serial.c add debug code * re-adjust READ_WRITE_WIDTH_ADJUST values * re-adjust READ_WRITE_START_ADJUST values * re-adjust TID_SEND_ADJUST value * Helix serial.c: remove debug code --- keyboards/helix/rev2/split_scomm.c | 3 -- keyboards/helix/serial.c | 54 ++++++++++++++++++++++++------ 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/keyboards/helix/rev2/split_scomm.c b/keyboards/helix/rev2/split_scomm.c index 50d233ce9afd..ada7867960b9 100644 --- a/keyboards/helix/rev2/split_scomm.c +++ b/keyboards/helix/rev2/split_scomm.c @@ -7,9 +7,6 @@ #include #include #include "serial.h" -#ifdef SERIAL_DEBUG_MODE -#include -#endif #ifdef CONSOLE_ENABLE #include #endif diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c index 830f86b55a68..c813b6b9ae0d 100644 --- a/keyboards/helix/serial.c +++ b/keyboards/helix/serial.c @@ -136,38 +136,68 @@ int serial_update_buffers() // 5: about 20kbps #endif -#define TID_SEND_ADJUST 2 +#if __GNUC__ < 6 + #define TID_SEND_ADJUST 14 +#else + #define TID_SEND_ADJUST 2 +#endif #if SELECT_SOFT_SERIAL_SPEED == 0 // Very High speed #define SERIAL_DELAY 4 // micro sec - #define READ_WRITE_START_ADJUST 33 // cycles - #define READ_WRITE_WIDTH_ADJUST 6 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 34 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 1 // High speed #define SERIAL_DELAY 6 // micro sec - #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 2 // Middle speed #define SERIAL_DELAY 12 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 3 // Low speed #define SERIAL_DELAY 24 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 4 // Very Low speed #define SERIAL_DELAY 36 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 5 // Ultra Low speed #define SERIAL_DELAY 48 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #else #error invalid SELECT_SOFT_SERIAL_SPEED value #endif /* SELECT_SOFT_SERIAL_SPEED */ @@ -187,16 +217,19 @@ int serial_update_buffers() static SSTD_t *Transaction_table = NULL; static uint8_t Transaction_table_size = 0; +inline static void serial_delay(void) ALWAYS_INLINE; inline static void serial_delay(void) { _delay_us(SERIAL_DELAY); } +inline static void serial_delay_half1(void) ALWAYS_INLINE; inline static void serial_delay_half1(void) { _delay_us(SERIAL_DELAY_HALF1); } +inline static void serial_delay_half2(void) ALWAYS_INLINE; inline static void serial_delay_half2(void) { _delay_us(SERIAL_DELAY_HALF2); @@ -216,6 +249,7 @@ void serial_input_with_pullup(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } +inline static uint8_t serial_read_pin(void) ALWAYS_INLINE; inline static uint8_t serial_read_pin(void) { return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); @@ -270,7 +304,7 @@ void sync_recv(void) { } // Used by the reciver to send a synchronization signal to the sender. -static void sync_send(void)NO_INLINE; +static void sync_send(void) NO_INLINE; static void sync_send(void) { serial_low(); From d63fb6f716b865fe1cede22787aa15834aecd868 Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Mon, 29 Oct 2018 02:23:48 +0900 Subject: [PATCH 311/505] helix serial.c: add some comment --- keyboards/helix/serial.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c index c813b6b9ae0d..24b889d30b28 100644 --- a/keyboards/helix/serial.c +++ b/keyboards/helix/serial.c @@ -1,5 +1,10 @@ /* * WARNING: be careful changing this code, it is very timing dependent + * + * 2018-10-28 checked + * avr-gcc 4.9.2 + * avr-gcc 5.4.0 + * avr-gcc 7.3.0 */ #ifndef F_CPU From cd87a8a323f0a522624550117d8a7a0249a72017 Mon Sep 17 00:00:00 2001 From: R4WBIT Date: Mon, 29 Oct 2018 13:32:36 +0100 Subject: [PATCH 312/505] fixed broken linebreak in fedora part, and indentation in arch-part --- util/linux_install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/linux_install.sh b/util/linux_install.sh index 5186e31f2bf6..2c6cba53d139 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -8,7 +8,7 @@ if grep ID /etc/os-release | grep -qE "fedora"; then sudo dnf install \ arm-none-eabi-binutils-cs \ arm-none-eabi-gcc-cs \ - arm-none-eabi-newlib + arm-none-eabi-newlib \ avr-binutils \ avr-gcc \ avr-libc \ @@ -59,7 +59,7 @@ elif grep ID /etc/os-release | grep -q 'arch\|manjaro'; then avr-binutils \ avr-libc \ avr-gcc \ - base-devel \ + base-devel \ dfu-util \ diff-utils \ gcc \ From cd23984afcee9a8dd2b1b44876b77141d692de45 Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Mon, 29 Oct 2018 10:04:52 -0400 Subject: [PATCH 313/505] Fix undefined reference to `console_printf` for CTRL and ALT keyboards Fix undefined reference to `console_printf` for CTRL and ALT keyboards when enabling CONSOLE_ENABLE --- tmk_core/common/arm_atsam/printf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tmk_core/common/arm_atsam/printf.c b/tmk_core/common/arm_atsam/printf.c index d49d234de20f..7f298d1fda5c 100644 --- a/tmk_core/common/arm_atsam/printf.c +++ b/tmk_core/common/arm_atsam/printf.c @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifdef CONSOLE_PRINT +#ifdef CONSOLE_ENABLE #include "samd51j18a.h" #include "arm_atsam_protocol.h" @@ -63,4 +63,4 @@ void console_printf(char *fmt, ...) { } } -#endif //CONSOLE_PRINT +#endif //CONSOLE_ENABLE From 6a629e5d0d4ed5903afa361568da8daeddc1b090 Mon Sep 17 00:00:00 2001 From: jshuf <44121348+jshuf@users.noreply.github.com> Date: Mon, 29 Oct 2018 13:33:07 -0400 Subject: [PATCH 314/505] Keyboard: add support for kbd19x (#4272) * 60_ansi keymap for DZ60 * 60_ansi keymap for DZ60 Amend author * 60_ansi keymap for DZ60 * Merge new phantom layout from dev branch * Initial util/new_project files * Progress checkpoint (compiles, but untested) * Progress snapshot, still working on layout graphics * Add layer images * Tidy up formatting * First cut at info.json for kbd19x default layout * Add default keymap * add all-keys layout * clean up documentation * Update keyboards/kbd19x/info.json Co-Authored-By: jshuf <44121348+jshuf@users.noreply.github.com> * Update keyboards/kbd19x/rules.mk Co-Authored-By: jshuf <44121348+jshuf@users.noreply.github.com> * Change layout name from default to ansi --- keyboards/kbd19x/config.h | 224 +++++++++++++++++++++ keyboards/kbd19x/info.json | 218 ++++++++++++++++++++ keyboards/kbd19x/kbd19x.c | 63 ++++++ keyboards/kbd19x/kbd19x.h | 103 ++++++++++ keyboards/kbd19x/keymaps/default/config.h | 20 ++ keyboards/kbd19x/keymaps/default/keymap.c | 52 +++++ keyboards/kbd19x/keymaps/default/readme.md | 13 ++ keyboards/kbd19x/readme.md | 19 ++ keyboards/kbd19x/rules.mk | 80 ++++++++ 9 files changed, 792 insertions(+) create mode 100644 keyboards/kbd19x/config.h create mode 100644 keyboards/kbd19x/info.json create mode 100644 keyboards/kbd19x/kbd19x.c create mode 100644 keyboards/kbd19x/kbd19x.h create mode 100644 keyboards/kbd19x/keymaps/default/config.h create mode 100644 keyboards/kbd19x/keymaps/default/keymap.c create mode 100644 keyboards/kbd19x/keymaps/default/readme.md create mode 100644 keyboards/kbd19x/readme.md create mode 100644 keyboards/kbd19x/rules.mk diff --git a/keyboards/kbd19x/config.h b/keyboards/kbd19x/config.h new file mode 100644 index 000000000000..47cfd7484a7a --- /dev/null +++ b/keyboards/kbd19x/config.h @@ -0,0 +1,224 @@ +/* +Copyright 2018 Jeff Shufelt @jshuf + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER KBDFans +#define PRODUCT kbd19x +#define DESCRIPTION A compact-1800 keyboard kit. + +/* key matrix size */ +#define MATRIX_ROWS 8 +#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 { B7, B3, E6, F0, D5, D4, D6, C7 } +#define MATRIX_COL_PINS { C6, F1, F4, F5, F6, F7, D7, B4, B5, D0, D1, D2, D3 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B6 +// #define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 + +#define RGB_DI_PIN E2 +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 18 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + diff --git a/keyboards/kbd19x/info.json b/keyboards/kbd19x/info.json new file mode 100644 index 000000000000..dd5cc700ccdf --- /dev/null +++ b/keyboards/kbd19x/info.json @@ -0,0 +1,218 @@ +{ + "keyboard_name": "KBD19x", + "url": "https://github.com/qmk/qmk_firmware/tree/master/keyboards/kbd19x", + "maintainer": "qmk", + "width": 19.5, + "height": 6.75, + "layouts": { + "LAYOUT_ansi": { + "key_count": 99, + "layout": [{"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":1.25, "y":0}, + {"label":"F2", "x":2.25, "y":0}, + {"label":"F3", "x":3.25, "y":0}, + {"label":"F4", "x":4.25, "y":0}, + {"label":"F5", "x":5.5, "y":0}, + {"label":"F6", "x":6.5, "y":0}, + {"label":"F7", "x":7.5, "y":0}, + {"label":"F8", "x":8.5, "y":0}, + {"label":"F9", "x":9.75, "y":0}, + {"label":"F10", "x":10.75, "y":0}, + {"label":"F11", "x":11.75, "y":0}, + {"label":"F12", "x":12.75, "y":0}, + {"label":"BkLgt Step", "x":14, "y":0}, + {"label":"Print Screen", "x":15.5, "y":0}, + {"label":"Scroll Lock", "x":16.5, "y":0}, + {"label":"Pause Break", "x":17.5, "y":0}, + {"label":"PgDn", "x":18.5, "y":0}, + {"label":"~", "x":0, "y":1.5}, + {"label":"!", "x":1, "y":1.5}, + {"label":"@", "x":2, "y":1.5}, + {"label":"#", "x":3, "y":1.5}, + {"label":"$", "x":4, "y":1.5}, + {"label":"%", "x":5, "y":1.5}, + {"label":"^", "x":6, "y":1.5}, + {"label":"&", "x":7, "y":1.5}, + {"label":"*", "x":8, "y":1.5}, + {"label":"(", "x":9, "y":1.5}, + {"label":")", "x":10, "y":1.5}, + {"label":"_", "x":11, "y":1.5}, + {"label":"+", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Num Lock", "x":15.5, "y":1.5}, + {"label":"/", "x":16.5, "y":1.5}, + {"label":"*", "x":17.5, "y":1.5}, + {"label":"-", "x":18.5, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"{", "x":11.5, "y":2.5}, + {"label":"}", "x":12.5, "y":2.5}, + {"label":"|", "x":13.5, "y":2.5, "w":1.5}, + {"label":"7", "x":15.5, "y":2.5}, + {"label":"8", "x":16.5, "y":2.5}, + {"label":"9", "x":17.5, "y":2.5}, + {"label":"+", "x":18.5, "y":2.5, "h":2}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75},\ + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":":", "x":10.75, "y":3.5}, + {"label":"\"", "x":11.75, "y":3.5}, + {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, + {"label":"4", "x":15.5, "y":3.5}, + {"label":"5", "x":16.5, "y":3.5}, + {"label":"6", "x":17.5, "y":3.5}, + {"label":"Shift", "x":0, "y":4.5, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":"<", "x":9.25, "y":4.5}, + {"label":">", "x":10.25, "y":4.5}, + {"label":"?", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":1.75}, + {"label":"1", "x":15.5, "y":4.5}, + {"label":"2", "x":16.5, "y":4.5}, + {"label":"3", "x":17.5, "y":4.5}, + {"label":"Enter", "x":18.5, "y":4.5, "h":2}, + {"label":"\u2191", "x":14.25, "y":4.75}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"Win", "x":1.25, "y":5.5}, + {"label":"Alt", "x":2.25, "y":5.5, "w":1.25}, + {"x":3.5, "y":5.5, "w":6.25}, + {"label":"Alt", "x":9.75, "y":5.5}, + {"label":"MO(1)", "x":10.75, "y":5.5}, + {"label":"Ctrl", "x":11.75, "y":5.5, "w":1.25}, + {"label":"0", "x":16.5, "y":5.5}, + {"label":".", "x":17.5, "y":5.5}, + {"label":"\u2190", "x":13.25, "y":5.75}, + {"label":"\u2193", "x":14.25, "y":5.75}, + {"label":"\u2192", "x":15.25, "y":5.75}] + }, + "LAYOUT_all": { + "key_count": 103, + "layout": [{"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":1.25, "y":0}, + {"label":"F2", "x":2.25, "y":0}, + {"label":"F3", "x":3.25, "y":0}, + {"label":"F4", "x":4.25, "y":0}, + {"label":"F5", "x":5.5, "y":0}, + {"label":"F6", "x":6.5, "y":0}, + {"label":"F7", "x":7.5, "y":0}, + {"label":"F8", "x":8.5, "y":0}, + {"label":"F9", "x":9.75, "y":0}, + {"label":"F10", "x":10.75, "y":0}, + {"label":"F11", "x":11.75, "y":0}, + {"label":"F12", "x":12.75, "y":0}, + {"label":"BkLgt Step", "x":14, "y":0}, + {"label":"Print Screen", "x":15.5, "y":0}, + {"label":"Scroll Lock", "x":16.5, "y":0}, + {"label":"Pause Break", "x":17.5, "y":0}, + {"label":"PgDn", "x":18.5, "y":0}, + {"label":"~", "x":0, "y":1.5}, + {"label":"!", "x":1, "y":1.5}, + {"label":"@", "x":2, "y":1.5}, + {"label":"#", "x":3, "y":1.5}, + {"label":"$", "x":4, "y":1.5}, + {"label":"%", "x":5, "y":1.5}, + {"label":"^", "x":6, "y":1.5}, + {"label":"&", "x":7, "y":1.5}, + {"label":"*", "x":8, "y":1.5}, + {"label":"(", "x":9, "y":1.5}, + {"label":")", "x":10, "y":1.5}, + {"label":"_", "x":11, "y":1.5}, + {"label":"+", "x":12, "y":1.5}, + {"x":13, "y":1.5}, + {"label":"BS", "x":14, "y":1.5}, + {"label":"Num Lock", "x":15.5, "y":1.5}, + {"label":"/", "x":16.5, "y":1.5}, + {"label":"*", "x":17.5, "y":1.5}, + {"label":"-", "x":18.5, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"{", "x":11.5, "y":2.5}, + {"label":"}", "x":12.5, "y":2.5}, + {"label":"|", "x":13.5, "y":2.5, "w":1.5}, + {"label":"7", "x":15.5, "y":2.5}, + {"label":"8", "x":16.5, "y":2.5}, + {"label":"9", "x":17.5, "y":2.5}, + {"label":"+", "x":18.5, "y":2.5}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":":", "x":10.75, "y":3.5}, + {"label":"\"", "x":11.75, "y":3.5}, + {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, + {"label":"4", "x":15.5, "y":3.5}, + {"label":"5", "x":16.5, "y":3.5}, + {"label":"6", "x":17.5, "y":3.5}, + {"x":18.5, "y":3.5}, + {"label":"Shift", "x":0, "y":4.5, "w":1.25}, + {"x":1.25, "y":4.5}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":"<", "x":9.25, "y":4.5}, + {"label":">", "x":10.25, "y":4.5}, + {"label":"?", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":1.75}, + {"label":"1", "x":15.5, "y":4.5}, + {"label":"2", "x":16.5, "y":4.5}, + {"label":"3", "x":17.5, "y":4.5}, + {"label":"Enter", "x":18.5, "y":4.5}, + {"label":"\u2191", "x":14.25, "y":4.75}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"Win", "x":1.25, "y":5.5}, + {"label":"Alt", "x":2.25, "y":5.5, "w":1.25}, + {"x":3.5, "y":5.5, "w":6.25}, + {"label":"Alt", "x":9.75, "y":5.5}, + {"label":"Menu", "x":10.75, "y":5.5}, + {"label":"Ctrl", "x":11.75, "y":5.5, "w":1.25}, + {"label":"0", "x":16.5, "y":5.5}, + {"label":".", "x":17.5, "y":5.5}, + {"x":18.5, "y":5.5}, + {"label":"\u2190", "x":13.25, "y":5.75}, + {"label":"\u2193", "x":14.25, "y":5.75}, + {"label":"\u2192", "x":15.25, "y":5.75}] + } + } +} + diff --git a/keyboards/kbd19x/kbd19x.c b/keyboards/kbd19x/kbd19x.c new file mode 100644 index 000000000000..360345600d02 --- /dev/null +++ b/keyboards/kbd19x/kbd19x.c @@ -0,0 +1,63 @@ +/* +Copyright 2018 Jeff Shufelt @jshuf + +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 "kbd19x.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 + + if (usb_led & (1< @jshuf + +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 KBD19X_H +#define KBD19X_H + +#include "quantum.h" +#include "led.h" + +inline void kbd19x_caps_led_on(void) { DDRB |= (1<<0); PORTB &= ~(1<<0); } +inline void kbd19x_caps_led_off(void) { DDRB &= ~(1<<0); PORTB &= ~(1<<0); } + +inline void kbd19x_sclk_led_on(void) { DDRB |= (1<<1); PORTB &= ~(1<<1); } +inline void kbd19x_sclk_led_off(void) { DDRB &= ~(1<<1); PORTB &= ~(1<<1); } + +inline void kbd19x_nmlk_led_on(void) { DDRB |= (1<<2); PORTB &= ~(1<<2); } +inline void kbd19x_nmlk_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); } + +// readability +#define XXX KC_NO + +/* This is a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ + +// 2u backspace: XXX, k1e +// split backspace: k1d, k1e + +// 2u numpad +: k2i, XXX +// split numpad +: k2i, k3i + +// 2u numpad enter: k4i, XXX +// split numpad enter: k4i, k5i + +// 2.25u lshift: k40, XXX +// split (1.25u, 1u) lshift: k40, k41 + +// ANSI enter or ISO enter: k3e +// backslash or NUHS: k2e + +// left winkey: k50, k51, k52 +// left WKL: k50, XXX, k52 + +// right winkey: k59, k5a, k5b +// right WKL: k59, XXX, k5b + +#define LAYOUT_all( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, k0f, k0g, k0h, k0i, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k1g, k1h, k1i, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2e, k2f, k2g, k2h, k2i, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3e, k3f, k3g, k3h, k3i, \ + k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4e, k4f, k4g, k4h, k4i, \ + k50, k51, k52, k56, k59, k5a, k5b, k5d, k5e, k5f, k5g, k5h, k5i \ +)\ +{\ + {k00, k01, k02, k03, k04, k09, k0a, k0b, k0c, k0f, k0g, k0h, k0i},\ + {k10, k11, k12, k13, k14, k19, k1a, k1b, k1c, k1f, k1g, k1h, k1i},\ + {k20, k21, k22, k23, k24, k29, k2a, k2b, k2c, k2f, k2g, k2h, k2i},\ + {k30, k32, k33, k34, k35, k3a, k3b, k3c, k3e, k3f, k3g, k3h, k3i},\ + {k40, k41, k42, k43, k44, k49, k4a, k4b, k4c, k4f, k4g, k4h, k4i},\ + {k50, k51, k52, k5e, k5f, k59, k5a, k5b, k5d, k56, k5g, k5h, k5i},\ + {k05, k06, k07, k08, k15, k16, k17, k18, k25, k26, k27, k28, k36},\ + {k1d, k1e, k0e, k2e, k4e, k37, k38, k39, k45, k46, k47, k48, XXX},\ +} + +#define LAYOUT_ansi( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, k0f, k0g, k0h, k0i, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1e, k1f, k1g, k1h, k1i, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2e, k2f, k2g, k2h, k2i, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3e, k3f, k3g, k3h, \ + k40, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4e, k4f, k4g, k4h, k4i, \ + k50, k51, k52, k56, k59, k5a, k5b, k5d, k5e, k5f, k5g, k5h \ +)\ +{\ + {k00, k01, k02, k03, k04, k09, k0a, k0b, k0c, k0f, k0g, k0h, k0i},\ + {k10, k11, k12, k13, k14, k19, k1a, k1b, k1c, k1f, k1g, k1h, k1i},\ + {k20, k21, k22, k23, k24, k29, k2a, k2b, k2c, k2f, k2g, k2h, k2i},\ + {k30, k32, k33, k34, k35, k3a, k3b, k3c, k3e, k3f, k3g, k3h, XXX},\ + {k40, XXX, k42, k43, k44, k49, k4a, k4b, k4c, k4f, k4g, k4h, k4i},\ + {k50, k51, k52, k5e, k5f, k59, k5a, k5b, k5d, k56, k5g, k5h, XXX},\ + {k05, k06, k07, k08, k15, k16, k17, k18, k25, k26, k27, k28, k36},\ + {XXX, k1e, k0e, k2e, k4e, k37, k38, k39, k45, k46, k47, k48, XXX},\ +} +#endif diff --git a/keyboards/kbd19x/keymaps/default/config.h b/keyboards/kbd19x/keymaps/default/config.h new file mode 100644 index 000000000000..70028a525cfb --- /dev/null +++ b/keyboards/kbd19x/keymaps/default/config.h @@ -0,0 +1,20 @@ +/* +Copyright 2018 Jeff Shufelt @jshuf + +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 + +// place overrides here diff --git a/keyboards/kbd19x/keymaps/default/keymap.c b/keyboards/kbd19x/keymaps/default/keymap.c new file mode 100644 index 000000000000..c806072114d4 --- /dev/null +++ b/keyboards/kbd19x/keymaps/default/keymap.c @@ -0,0 +1,52 @@ +/* +Copyright 2018 Jeff Shufelt @jshuf + +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 QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ansi( /* Base */ + 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, BL_STEP, KC_PSCR, KC_SLCK, KC_PAUS, KC_PGDN, \ + 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_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_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_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, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \ + ), + [1] = LAYOUT_ansi( /* Func */ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, \ + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/kbd19x/keymaps/default/readme.md b/keyboards/kbd19x/keymaps/default/readme.md new file mode 100644 index 000000000000..504a3ed02ea0 --- /dev/null +++ b/keyboards/kbd19x/keymaps/default/readme.md @@ -0,0 +1,13 @@ +# Default KBD19x Layout + +This is the default KBD19x layout, consisting of the base layer and the function layer. Backlighting and RGB controls are accessible on the function layer. + +**Base layer** + +![kbd19x default base layer](https://i.imgur.com/XhT980a.png) + +**Function layer** + +![kbd19x default function layer](https://i.imgur.com/3w3PXN2.png) + + diff --git a/keyboards/kbd19x/readme.md b/keyboards/kbd19x/readme.md new file mode 100644 index 000000000000..ee4969b00d5b --- /dev/null +++ b/keyboards/kbd19x/readme.md @@ -0,0 +1,19 @@ +# kbd19x + +![kbd19x](https://i.imgur.com/0hWTEnh.jpg) + +**Layout possibilities for the KBD19x** + +![kbd19x](https://i.imgur.com/pVaR2zY.png) + +The KBD19x is a compact-1800 keyboard kit produced by KBDfans, offering a number of layout options. + +Keyboard Maintainer: [jshuf](https://github.com/jshuf) +Hardware Supported: KBD19x PCB +Hardware Availability: [KBDfans](https://kbdfans.cn) + +Make example for this keyboard (after setting up your build environment): + + make kbd19x:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/kbd19x/rules.mk b/keyboards/kbd19x/rules.mk new file mode 100644 index 000000000000..8e50962afafb --- /dev/null +++ b/keyboards/kbd19x/rules.mk @@ -0,0 +1,80 @@ +# 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 + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = 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 +# 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 = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From 1e96346f289ea235fc418ddc45203a599fd00c08 Mon Sep 17 00:00:00 2001 From: Bramver Date: Mon, 29 Oct 2018 18:45:17 +0100 Subject: [PATCH 315/505] Keymap: Added personal Contra layout. (#4235) * Added personal Contra layout. * Update keyboards/contra/keymaps/bramver/rules.mk Co-Authored-By: BramVer * Update keyboards/contra/keymaps/bramver/keymap.c Co-Authored-By: BramVer * Update keyboards/contra/keymaps/bramver/keymap.c Co-Authored-By: BramVer * Reformatted layers to use the layout format. --- keyboards/contra/keymaps/bramver/README.md | 35 ++++++ keyboards/contra/keymaps/bramver/config.h | 9 ++ keyboards/contra/keymaps/bramver/keymap.c | 126 +++++++++++++++++++++ keyboards/contra/keymaps/bramver/rules.mk | 6 + 4 files changed, 176 insertions(+) create mode 100644 keyboards/contra/keymaps/bramver/README.md create mode 100755 keyboards/contra/keymaps/bramver/config.h create mode 100644 keyboards/contra/keymaps/bramver/keymap.c create mode 100755 keyboards/contra/keymaps/bramver/rules.mk diff --git a/keyboards/contra/keymaps/bramver/README.md b/keyboards/contra/keymaps/bramver/README.md new file mode 100644 index 000000000000..5327beba7cbb --- /dev/null +++ b/keyboards/contra/keymaps/bramver/README.md @@ -0,0 +1,35 @@ +# Contra layout + +My current setup consists of a very simple base layer, numbers layer, mouse layer and emoji layer. +Still many options, but time will tell if changes are needed. + +## Keymap + +``` +#define SP_MSE LT(_MOUSE, KC_SPC) + + +BASE layer + { KC_GESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSPC }, + { KC_TAB , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN , KC_ENT }, + { KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_QUOT }, + { KC_LCTL , KC_GRV , KC_LALT , KC_LGUI , MO(1) , SP_MSE , SP_MSE , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , MO(2) }, + +LOWER layer + { _______ , 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_LBRC , KC_MINS , KC_EQL , KC_RBRC , KC_F7 , KC_F8 , KC_F9 , _______ }, + { _______ , KC_F4 , KC_F5 , KC_F6 , KC_HOME , KC_BSLS , KC_MPLY , KC_END , KC_F10 , KC_F11 , KC_F12 , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + +EMOJI layer + { _______ , X(CLAP) , X(CUM) , X(BNIS) , X(BUTT) , X(CAR) , X(FIRE) , X(REDB) , X(MONY) , X(HNDR) , X(SOS) , _______ }, + { _______ , X(CELE) , X(PRAY) , X(NAIL) , X(OK) , X(THNK) , X(UNAM) , X(HEYE) , X(COOL) , X(EYES) , X(SMIR) , _______ }, + { _______ , X(TRIU) , X(SCRM) , X(VOMI) , X(DTIV) , X(EXPL) , X(HAIR) , X(DANC) , X(STRN) , X(LEFT) , X(RGHT) , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, + +MOUSE layer + { _______ , KC_WH_L , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_U , KC_WH_U , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_L , _______ }, + { _______ , KC_WH_R , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_D , KC_WH_D , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_R , _______ }, + { _______ , KC_VOLD , KC_VOLU , KC_MPRV , KC_MNXT , KC_MPLY , KC_MPLY , KC_MPRV , KC_MNXT , KC_VOLD , KC_VOLU , _______ }, + { _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ }, +``` \ No newline at end of file diff --git a/keyboards/contra/keymaps/bramver/config.h b/keyboards/contra/keymaps/bramver/config.h new file mode 100755 index 000000000000..de2a9b0ee147 --- /dev/null +++ b/keyboards/contra/keymaps/bramver/config.h @@ -0,0 +1,9 @@ +#pragma once + +#define MOUSEKEY_DELAY 0 +#define MOUSEKEY_INTERVAL 16 +#define MOUSEKEY_MAX_SPEED 7 +#define MOUSEKEY_TIME_TO_MAX 60 +#define MOUSEKEY_WHEEL_MAX_SPEED 8 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 40 +#define MOUSEKEY_WHEEL_DELAY 0 diff --git a/keyboards/contra/keymaps/bramver/keymap.c b/keyboards/contra/keymaps/bramver/keymap.c new file mode 100644 index 000000000000..8ccaf686bd4c --- /dev/null +++ b/keyboards/contra/keymaps/bramver/keymap.c @@ -0,0 +1,126 @@ +/* Copyright 2018 darm + * + * 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 QMK_KEYBOARD_H + +enum emoji_map { + UNAM, // unamused 😒 + HEYE, // smiling face with heart shaped eyes 😍 + OK, // ok hand sign 👌 + SMIR, // smirk 😏 + PRAY, // pray 🙏 + CELE, // celebration 🙌 + COOL, // smile with sunglasses 😎 + EYES, // eyes + THNK, // BIG THONK + NAIL, // Nailcare + SOS, // Vuile sos + REDB, // Red B + HNDR, // 100 + MONY, + FIRE, + CAR, + BUTT, + BNIS, + CUM, + CLAP, + TRIU, // Fart from nose + SCRM, + VOMI, + DTIV, // Detective + EXPL, // Brainsplosion + HAIR, // Haircut + DANC, // Salsa dancer + STRN, // Stronk + LEFT, // Point Left + RGHT, // Point Right +}; + +const uint32_t PROGMEM unicode_map[] = { + [UNAM] = 0x1F612, + [HEYE] = 0x1f60d, + [OK] = 0x1F44C, + [SMIR] = 0x1F60F, + [PRAY] = 0x1F64F, + [CELE] = 0x1F64C, + [COOL] = 0x1F60E, + [EYES] = 0x1F440, + [THNK] = 0x1F914, + [NAIL] = 0x1F485, + [SOS] = 0x1F198, + [REDB] = 0x1F171, + [HNDR] = 0x1F4AF, + [MONY] = 0x1F480, + [FIRE] = 0x1F525, + [CAR] = 0x1F697, + [BUTT] = 0x1F351, + [BNIS] = 0x1F346, + [CUM] = 0x1F4A6, + [CLAP] = 0x1F44F, + [TRIU] = 0x1F624, + [SCRM] = 0x1F631, + [VOMI] = 0x1F92E, + [DTIV] = 0x1F575, + [EXPL] = 0x1F92F, + [HAIR] = 0x2640, + [DANC] = 0x1F483, + [STRN] = 0x1F4AA, + [LEFT] = 0x1F448, + [RGHT] = 0x1F449, +}; + +// Layer shorthand +#define _BASE 0 +#define _LOWER 1 +#define _EMOJI 2 +#define _MOUSE 3 + +#define SP_MSE LT(_MOUSE, KC_SPC) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_BASE] = LAYOUT_ortho_4x12( + KC_GESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSPC , + KC_TAB , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN , KC_ENT , + KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM , KC_DOT , KC_SLSH , KC_QUOT , + KC_LCTL , KC_GRV , KC_LALT , KC_LGUI , MO(1) , SP_MSE , SP_MSE , KC_LEFT , KC_DOWN , KC_UP , KC_RGHT , MO(2) + ), + + [_LOWER] = LAYOUT_ortho_4x12( + _______ , 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_LBRC , KC_MINS , KC_EQL , KC_RBRC , KC_F7 , KC_F8 , KC_F9 , _______ , + _______ , KC_F4 , KC_F5 , KC_F6 , KC_HOME , KC_BSLS , KC_MPLY , KC_END , KC_F10 , KC_F11 , KC_F12 , _______ , + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ), + + [_EMOJI] = LAYOUT_ortho_4x12( + _______ , X(CLAP) , X(CUM) , X(BNIS) , X(BUTT) , X(CAR) , X(FIRE) , X(REDB) , X(MONY) , X(HNDR) , X(SOS) , _______ , + _______ , X(CELE) , X(PRAY) , X(NAIL) , X(OK) , X(THNK) , X(UNAM) , X(HEYE) , X(COOL) , X(EYES) , X(SMIR) , _______ , + _______ , X(TRIU) , X(SCRM) , X(VOMI) , X(DTIV) , X(EXPL) , X(HAIR) , X(DANC) , X(STRN) , X(LEFT) , X(RGHT) , _______ , + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ), + + [_MOUSE] = LAYOUT_ortho_4x12( + _______ , KC_WH_L , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_U , KC_WH_U , KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_L , _______ , + _______ , KC_WH_R , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_D , KC_WH_D , KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_R , _______ , + _______ , KC_VOLD , KC_VOLU , KC_MPRV , KC_MNXT , KC_MPLY , KC_MPLY , KC_MPRV , KC_MNXT , KC_VOLD , KC_VOLU , _______ , + _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ , _______ + ) + +}; + +void matrix_init_user(void) { + set_unicode_input_mode(UC_LNX); +} diff --git a/keyboards/contra/keymaps/bramver/rules.mk b/keyboards/contra/keymaps/bramver/rules.mk new file mode 100755 index 000000000000..925b1c2b26fc --- /dev/null +++ b/keyboards/contra/keymaps/bramver/rules.mk @@ -0,0 +1,6 @@ +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +NKRO_ENABLE = yes # USB Nkey Rollover +UNICODEMAP_ENABLE = yes # Unicode +BOOTLOADER = atmel-dfu + From 1fa6c1d818add2c72381639a836180af5aa86738 Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Mon, 29 Oct 2018 20:48:24 +0000 Subject: [PATCH 316/505] Make linux_install.sh work with openSUSE Leap 15.0 (#4218) --- util/linux_install.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/util/linux_install.sh b/util/linux_install.sh index 2c6cba53d139..d3b9328d79c9 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -96,9 +96,13 @@ elif grep ID /etc/os-release | grep -q gentoo; then fi elif grep ID /etc/os-release | grep -qE "opensuse|tumbleweed"; then + CROSS_AVR_GCC=cross-avr-gcc8 + if grep ID /etc/os-release | grep -q "15.0"; then + CROSS_AVR_GCC=cross-avr-gcc7 + fi sudo zypper install \ avr-libc \ - cross-avr-gcc8 \ + $CROSS_AVR_GCC \ cross-avr-binutils \ cross-arm-none-newlib-devel \ cross-arm-binutils cross-arm-none-newlib-devel \ From 34f102de7df093525ca310e265a3406e831bf4c6 Mon Sep 17 00:00:00 2001 From: Michael Pio Date: Tue, 30 Oct 2018 13:00:40 +0800 Subject: [PATCH 317/505] Keyboard: Vinta (#4283) * added initial config files for vinta * added readme * changed product id and device ver * fixed keymap illustration * updated rules.mk to enable more commands * removed a bunch of pre-code text; changed some grammar woopsies * removed bootmagic lite * updated developer's note * updated readme.md --- .../vinta/boards/GENERIC_STM32_F042X6/board.c | 101 ++ .../vinta/boards/GENERIC_STM32_F042X6/board.h | 896 ++++++++++++++++++ .../boards/GENERIC_STM32_F042X6/board.mk | 5 + keyboards/vinta/bootloader_defs.h | 7 + keyboards/vinta/chconf.h | 521 ++++++++++ keyboards/vinta/config.h | 70 ++ keyboards/vinta/halconf.h | 350 +++++++ keyboards/vinta/keymaps/default/keymap.c | 51 + keyboards/vinta/mcuconf.h | 168 ++++ keyboards/vinta/readme.md | 22 + keyboards/vinta/rules.mk | 47 + keyboards/vinta/vinta.c | 18 + keyboards/vinta/vinta.h | 25 + 13 files changed, 2281 insertions(+) create mode 100644 keyboards/vinta/boards/GENERIC_STM32_F042X6/board.c create mode 100644 keyboards/vinta/boards/GENERIC_STM32_F042X6/board.h create mode 100644 keyboards/vinta/boards/GENERIC_STM32_F042X6/board.mk create mode 100644 keyboards/vinta/bootloader_defs.h create mode 100644 keyboards/vinta/chconf.h create mode 100644 keyboards/vinta/config.h create mode 100644 keyboards/vinta/halconf.h create mode 100644 keyboards/vinta/keymaps/default/keymap.c create mode 100644 keyboards/vinta/mcuconf.h create mode 100644 keyboards/vinta/readme.md create mode 100644 keyboards/vinta/rules.mk create mode 100644 keyboards/vinta/vinta.c create mode 100644 keyboards/vinta/vinta.h diff --git a/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.c b/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.c new file mode 100644 index 000000000000..19adfb933e52 --- /dev/null +++ b/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.c @@ -0,0 +1,101 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include "hal.h" + +#if HAL_USE_PAL || defined(__DOXYGEN__) +/** + * @brief PAL setup. + * @details Digital I/O ports static configuration as defined in @p board.h. + * This variable is used by the HAL when initializing the PAL driver. + */ +const PALConfig pal_default_config = { +#if STM32_HAS_GPIOA + {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, + VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, +#endif +#if STM32_HAS_GPIOB + {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, + VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, +#endif +#if STM32_HAS_GPIOC + {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, + VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, +#endif +#if STM32_HAS_GPIOD + {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, + VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, +#endif +#if STM32_HAS_GPIOE + {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, + VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, +#endif +#if STM32_HAS_GPIOF + {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, + VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, +#endif +#if STM32_HAS_GPIOG + {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, + VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, +#endif +#if STM32_HAS_GPIOH + {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, + VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, +#endif +#if STM32_HAS_GPIOI + {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, + VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} +#endif +}; +#endif + +void enter_bootloader_mode_if_requested(void); + +/** + * @brief Early initialization code. + * @details This initialization must be performed just after stack setup + * and before any other initialization. + */ +void __early_init(void) { + enter_bootloader_mode_if_requested(); + stm32_clock_init(); +} + +#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) +/** + * @brief MMC_SPI card detection. + */ +bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { + + (void)mmcp; + /* TODO: Fill the implementation.*/ + return true; +} + +/** + * @brief MMC_SPI card write protection detection. + */ +bool mmc_lld_is_write_protected(MMCDriver *mmcp) { + + (void)mmcp; + /* TODO: Fill the implementation.*/ + return false; +} +#endif + +/** + * @brief Board-specific initialization code. + * @todo Add your board-specific code, if any. + */ +void boardInit(void) { +} diff --git a/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.h b/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.h new file mode 100644 index 000000000000..241d566afa27 --- /dev/null +++ b/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.h @@ -0,0 +1,896 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +#ifndef _BOARD_H +#define _BOARD_H + +/* + * Setup for STMicroelectronics STM32 Nucleo32-F042K6 board. + */ + +/* + * Board identifier. + */ +#define BOARD_GENERIC_STM32_F042X6 +#define BOARD_NAME "Vinta PCB" + +/* + * Board oscillators-related settings. + * NOTE: LSE not fitted. + * NOTE: HSE not fitted. + */ +#if !defined(STM32_LSECLK) +#define STM32_LSECLK 0U +#endif + +#define STM32_LSEDRV (3U << 3U) + +#if !defined(STM32_HSECLK) +#define STM32_HSECLK 0U +#endif + +/* + * MCU type as defined in the ST header. + */ +#define STM32F042x6 + +/* + * IO pins assignments. + */ +#define GPIOA_PIN0 0U +#define GPIOA_PIN1 1U +#define GPIOA_PIN2 2U +#define GPIOA_PIN3 3U +#define GPIOA_PIN4 4U +#define GPIOA_PIN5 5U +#define GPIOA_PIN6 6U +#define GPIOA_PIN7 7U +#define GPIOA_PIN8 8U +#define GPIOA_PIN9 9U +#define GPIOA_PIN10 10U +#define GPIOA_PIN11 11U +#define GPIOA_PIN12 12U +#define GPIOA_PIN13 13U +#define GPIOA_PIN14 14U +#define GPIOA_PIN15 15U + +#define GPIOB_PIN0 0U +#define GPIOB_PIN1 1U +#define GPIOB_PIN2 2U +#define GPIOB_PIN3 3U +#define GPIOB_PIN4 4U +#define GPIOB_PIN5 5U +#define GPIOB_PIN6 6U +#define GPIOB_PIN7 7U +#define GPIOB_PIN8 8U +#define GPIOB_PIN9 9U +#define GPIOB_PIN10 10U +#define GPIOB_PIN11 11U +#define GPIOB_PIN12 12U +#define GPIOB_PIN13 13U +#define GPIOB_PIN14 14U +#define GPIOB_PIN15 15U + +#define GPIOC_PIN0 0U +#define GPIOC_PIN1 1U +#define GPIOC_PIN2 2U +#define GPIOC_PIN3 3U +#define GPIOC_PIN4 4U +#define GPIOC_PIN5 5U +#define GPIOC_PIN6 6U +#define GPIOC_PIN7 7U +#define GPIOC_PIN8 8U +#define GPIOC_PIN9 9U +#define GPIOC_PIN10 10U +#define GPIOC_PIN11 11U +#define GPIOC_PIN12 12U +#define GPIOC_PIN13 13U +#define GPIOC_PIN14 14U +#define GPIOC_PIN15 15U + +#define GPIOD_PIN0 0U +#define GPIOD_PIN1 1U +#define GPIOD_PIN2 2U +#define GPIOD_PIN3 3U +#define GPIOD_PIN4 4U +#define GPIOD_PIN5 5U +#define GPIOD_PIN6 6U +#define GPIOD_PIN7 7U +#define GPIOD_PIN8 8U +#define GPIOD_PIN9 9U +#define GPIOD_PIN10 10U +#define GPIOD_PIN11 11U +#define GPIOD_PIN12 12U +#define GPIOD_PIN13 13U +#define GPIOD_PIN14 14U +#define GPIOD_PIN15 15U + +#define GPIOE_PIN0 0U +#define GPIOE_PIN1 1U +#define GPIOE_PIN2 2U +#define GPIOE_PIN3 3U +#define GPIOE_PIN4 4U +#define GPIOE_PIN5 5U +#define GPIOE_PIN6 6U +#define GPIOE_PIN7 7U +#define GPIOE_PIN8 8U +#define GPIOE_PIN9 9U +#define GPIOE_PIN10 10U +#define GPIOE_PIN11 11U +#define GPIOE_PIN12 12U +#define GPIOE_PIN13 13U +#define GPIOE_PIN14 14U +#define GPIOE_PIN15 15U + +#define GPIOF_PIN0 0U +#define GPIOF_PIN1 1U +#define GPIOF_PIN2 2U +#define GPIOF_PIN3 3U +#define GPIOF_PIN4 4U +#define GPIOF_PIN5 5U +#define GPIOF_PIN6 6U +#define GPIOF_PIN7 7U +#define GPIOF_PIN8 8U +#define GPIOF_PIN9 9U +#define GPIOF_PIN10 10U +#define GPIOF_PIN11 11U +#define GPIOF_PIN12 12U +#define GPIOF_PIN13 13U +#define GPIOF_PIN14 14U +#define GPIOF_PIN15 15U + +/* + * IO lines assignments. + */ + +#define LINE_BOOT0 PAL_LINE(GPIOB, 8U) +#define LINE_SWCLK PAL_LINE(GPIOA, 14U) +#define LINE_SWDIO PAL_LINE(GPIOA, 13U) + +/* + * I/O ports initial setup, this configuration is established soon after reset + * in the initialization code. + * Please refer to the STM32 Reference Manual for details. + */ +#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) +#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) +#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) +#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) +#define PIN_ODR_LOW(n) (0U << (n)) +#define PIN_ODR_HIGH(n) (1U << (n)) +#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) +#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) +#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) +#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) +#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) +#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) +#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) +#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) +#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) +#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) + +/* + * GPIOA setup: + * + * PA0 - COL5 + * PA1 - COL4 + * PA2 - COL3 + * PA3 - COL2 + * PA4 - COL1 + * PA5 - COL0 + * PA6 - ROW4 + * PA7 - ROW3 + * PA8 - NC + * PA9 - ROW1 + * PA10 - ROW0 + * PA11 - USB_DM + * PA12 - USB_DP + * PA13 - COL15/SWDIO (for now, COL15) + * PA14 - COL14/SWCLK (for now, COL14) + * PA15 - COL13 + */ +#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_PIN0) | \ + PIN_MODE_INPUT(GPIOA_PIN1) | \ + PIN_MODE_INPUT(GPIOA_PIN2) | \ + PIN_MODE_INPUT(GPIOA_PIN3) | \ + PIN_MODE_INPUT(GPIOA_PIN4) | \ + PIN_MODE_INPUT(GPIOA_PIN5) | \ + PIN_MODE_INPUT(GPIOA_PIN6) | \ + PIN_MODE_INPUT(GPIOA_PIN7) | \ + PIN_MODE_INPUT(GPIOA_PIN8) | \ + PIN_MODE_INPUT(GPIOA_PIN9) | \ + PIN_MODE_INPUT(GPIOA_PIN10) | \ + PIN_MODE_INPUT(GPIOA_PIN11) | \ + PIN_MODE_INPUT(GPIOA_PIN12) | \ + PIN_MODE_INPUT(GPIOA_PIN13) | \ + PIN_MODE_INPUT(GPIOA_PIN14) | \ + PIN_MODE_INPUT(GPIOA_PIN15)) +#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) +#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \ + PIN_OSPEED_HIGH(GPIOA_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN15)) +#define VAL_GPIOA_PUPDR (PIN_PUPDR_PULLUP(GPIOA_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN10) | \ + PIN_PUPDR_FLOATING(GPIOA_PIN11) | \ + PIN_PUPDR_FLOATING(GPIOA_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN15)) +#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | \ + PIN_ODR_HIGH(GPIOA_PIN1) | \ + PIN_ODR_HIGH(GPIOA_PIN2) | \ + PIN_ODR_HIGH(GPIOA_PIN3) | \ + PIN_ODR_HIGH(GPIOA_PIN4) | \ + PIN_ODR_HIGH(GPIOA_PIN5) | \ + PIN_ODR_HIGH(GPIOA_PIN6) | \ + PIN_ODR_HIGH(GPIOA_PIN7) | \ + PIN_ODR_HIGH(GPIOA_PIN8) | \ + PIN_ODR_HIGH(GPIOA_PIN9) | \ + PIN_ODR_HIGH(GPIOA_PIN10) | \ + PIN_ODR_HIGH(GPIOA_PIN11) | \ + PIN_ODR_HIGH(GPIOA_PIN12) | \ + PIN_ODR_HIGH(GPIOA_PIN13) | \ + PIN_ODR_HIGH(GPIOA_PIN14) | \ + PIN_ODR_HIGH(GPIOA_PIN15)) +#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN7, 0U)) +#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOA_PIN15, 0U)) + +/* + * GPIOB setup: + * + * PB0 - ROW2 + * PB1 - RGB_D + * PB2 - PIN2 (input pullup). + * PB3 - COL12 + * PB4 - COL11 + * PB5 - COL10 + * PB6 - COL9 + * PB7 - COL8 + * PB8 - BOOT0 (set as output for STM32F042) + * PB9 - PIN9 (input pullup). + * PB10 - PIN10 (input pullup). + * PB11 - PIN11 (input pullup). + * PB12 - PIN12 (input pullup). + * PB13 - PIN13 (input pullup). + * PB14 - PIN14 (input pullup). + * PB15 - PIN15 (input pullup). + */ +#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ + PIN_MODE_OUTPUT(GPIOB_PIN1) | \ + PIN_MODE_INPUT(GPIOB_PIN2) | \ + PIN_MODE_INPUT(GPIOB_PIN3) | \ + PIN_MODE_INPUT(GPIOB_PIN4) | \ + PIN_MODE_INPUT(GPIOB_PIN5) | \ + PIN_MODE_INPUT(GPIOB_PIN6) | \ + PIN_MODE_INPUT(GPIOB_PIN7) | \ + PIN_MODE_OUTPUT(GPIOB_PIN8) | \ + PIN_MODE_INPUT(GPIOB_PIN9) | \ + PIN_MODE_INPUT(GPIOB_PIN10) | \ + PIN_MODE_INPUT(GPIOB_PIN11) | \ + PIN_MODE_INPUT(GPIOB_PIN12) | \ + PIN_MODE_INPUT(GPIOB_PIN13) | \ + PIN_MODE_INPUT(GPIOB_PIN14) | \ + PIN_MODE_INPUT(GPIOB_PIN15)) +#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) +#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \ + PIN_OSPEED_HIGH(GPIOB_PIN1) | \ + PIN_OSPEED_HIGH(GPIOB_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \ + PIN_OSPEED_HIGH(GPIOB_PIN9) | \ + PIN_OSPEED_HIGH(GPIOB_PIN10) | \ + PIN_OSPEED_HIGH(GPIOB_PIN11) | \ + PIN_OSPEED_HIGH(GPIOB_PIN12) | \ + PIN_OSPEED_HIGH(GPIOB_PIN13) | \ + PIN_OSPEED_HIGH(GPIOB_PIN14) | \ + PIN_OSPEED_HIGH(GPIOB_PIN15)) +#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \ + PIN_PUPDR_FLOATING(GPIOB_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN7) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN15)) +#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ + PIN_ODR_HIGH(GPIOB_PIN1) | \ + PIN_ODR_HIGH(GPIOB_PIN2) | \ + PIN_ODR_HIGH(GPIOB_PIN3) | \ + PIN_ODR_HIGH(GPIOB_PIN4) | \ + PIN_ODR_HIGH(GPIOB_PIN5) | \ + PIN_ODR_HIGH(GPIOB_PIN6) | \ + PIN_ODR_HIGH(GPIOB_PIN7) | \ + PIN_ODR_HIGH(GPIOB_PIN8) | \ + PIN_ODR_HIGH(GPIOB_PIN9) | \ + PIN_ODR_HIGH(GPIOB_PIN10) | \ + PIN_ODR_HIGH(GPIOB_PIN11) | \ + PIN_ODR_HIGH(GPIOB_PIN12) | \ + PIN_ODR_HIGH(GPIOB_PIN13) | \ + PIN_ODR_HIGH(GPIOB_PIN14) | \ + PIN_ODR_HIGH(GPIOB_PIN15)) +#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN7, 0U)) +#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOB_PIN15, 0U)) + +/* + * GPIOC setup: + * + * PC0 - PIN0 (input pullup). + * PC1 - PIN1 (input pullup). + * PC2 - PIN2 (input pullup). + * PC3 - PIN3 (input pullup). + * PC4 - PIN4 (input pullup). + * PC5 - PIN5 (input pullup). + * PC6 - PIN6 (input pullup). + * PC7 - PIN7 (input pullup). + * PC8 - PIN8 (input pullup). + * PC9 - PIN9 (input pullup). + * PC10 - PIN10 (input pullup). + * PC11 - PIN11 (input pullup). + * PC12 - PIN12 (input pullup). + * PC13 - PIN13 (input pullup). + * PC14 - PIN14 (input pullup). + * PC15 - PIN15 (input pullup). + */ +#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ + PIN_MODE_INPUT(GPIOC_PIN1) | \ + PIN_MODE_INPUT(GPIOC_PIN2) | \ + PIN_MODE_INPUT(GPIOC_PIN3) | \ + PIN_MODE_INPUT(GPIOC_PIN4) | \ + PIN_MODE_INPUT(GPIOC_PIN5) | \ + PIN_MODE_INPUT(GPIOC_PIN6) | \ + PIN_MODE_INPUT(GPIOC_PIN7) | \ + PIN_MODE_INPUT(GPIOC_PIN8) | \ + PIN_MODE_INPUT(GPIOC_PIN9) | \ + PIN_MODE_INPUT(GPIOC_PIN10) | \ + PIN_MODE_INPUT(GPIOC_PIN11) | \ + PIN_MODE_INPUT(GPIOC_PIN12) | \ + PIN_MODE_INPUT(GPIOC_PIN13) | \ + PIN_MODE_INPUT(GPIOC_PIN14) | \ + PIN_MODE_INPUT(GPIOC_PIN15)) +#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) +#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_PIN0) | \ + PIN_OSPEED_HIGH(GPIOC_PIN1) | \ + PIN_OSPEED_HIGH(GPIOC_PIN2) | \ + PIN_OSPEED_HIGH(GPIOC_PIN3) | \ + PIN_OSPEED_HIGH(GPIOC_PIN4) | \ + PIN_OSPEED_HIGH(GPIOC_PIN5) | \ + PIN_OSPEED_HIGH(GPIOC_PIN6) | \ + PIN_OSPEED_HIGH(GPIOC_PIN7) | \ + PIN_OSPEED_HIGH(GPIOC_PIN8) | \ + PIN_OSPEED_HIGH(GPIOC_PIN9) | \ + PIN_OSPEED_HIGH(GPIOC_PIN10) | \ + PIN_OSPEED_HIGH(GPIOC_PIN11) | \ + PIN_OSPEED_HIGH(GPIOC_PIN12) | \ + PIN_OSPEED_HIGH(GPIOC_PIN13) | \ + PIN_OSPEED_HIGH(GPIOC_PIN14) | \ + PIN_OSPEED_HIGH(GPIOC_PIN15)) +#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN15)) +#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ + PIN_ODR_HIGH(GPIOC_PIN1) | \ + PIN_ODR_HIGH(GPIOC_PIN2) | \ + PIN_ODR_HIGH(GPIOC_PIN3) | \ + PIN_ODR_HIGH(GPIOC_PIN4) | \ + PIN_ODR_HIGH(GPIOC_PIN5) | \ + PIN_ODR_HIGH(GPIOC_PIN6) | \ + PIN_ODR_HIGH(GPIOC_PIN7) | \ + PIN_ODR_HIGH(GPIOC_PIN8) | \ + PIN_ODR_HIGH(GPIOC_PIN9) | \ + PIN_ODR_HIGH(GPIOC_PIN10) | \ + PIN_ODR_HIGH(GPIOC_PIN11) | \ + PIN_ODR_HIGH(GPIOC_PIN12) | \ + PIN_ODR_HIGH(GPIOC_PIN13) | \ + PIN_ODR_HIGH(GPIOC_PIN14) | \ + PIN_ODR_HIGH(GPIOC_PIN15)) +#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN7, 0U)) +#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOC_PIN15, 0U)) + +/* + * GPIOD setup: + * + * PD0 - PIN0 (input pullup). + * PD1 - PIN1 (input pullup). + * PD2 - PIN2 (input pullup). + * PD3 - PIN3 (input pullup). + * PD4 - PIN4 (input pullup). + * PD5 - PIN5 (input pullup). + * PD6 - PIN6 (input pullup). + * PD7 - PIN7 (input pullup). + * PD8 - PIN8 (input pullup). + * PD9 - PIN9 (input pullup). + * PD10 - PIN10 (input pullup). + * PD11 - PIN11 (input pullup). + * PD12 - PIN12 (input pullup). + * PD13 - PIN13 (input pullup). + * PD14 - PIN14 (input pullup). + * PD15 - PIN15 (input pullup). + */ +#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ + PIN_MODE_INPUT(GPIOD_PIN1) | \ + PIN_MODE_INPUT(GPIOD_PIN2) | \ + PIN_MODE_INPUT(GPIOD_PIN3) | \ + PIN_MODE_INPUT(GPIOD_PIN4) | \ + PIN_MODE_INPUT(GPIOD_PIN5) | \ + PIN_MODE_INPUT(GPIOD_PIN6) | \ + PIN_MODE_INPUT(GPIOD_PIN7) | \ + PIN_MODE_INPUT(GPIOD_PIN8) | \ + PIN_MODE_INPUT(GPIOD_PIN9) | \ + PIN_MODE_INPUT(GPIOD_PIN10) | \ + PIN_MODE_INPUT(GPIOD_PIN11) | \ + PIN_MODE_INPUT(GPIOD_PIN12) | \ + PIN_MODE_INPUT(GPIOD_PIN13) | \ + PIN_MODE_INPUT(GPIOD_PIN14) | \ + PIN_MODE_INPUT(GPIOD_PIN15)) +#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) +#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_HIGH(GPIOD_PIN0) | \ + PIN_OSPEED_HIGH(GPIOD_PIN1) | \ + PIN_OSPEED_HIGH(GPIOD_PIN2) | \ + PIN_OSPEED_HIGH(GPIOD_PIN3) | \ + PIN_OSPEED_HIGH(GPIOD_PIN4) | \ + PIN_OSPEED_HIGH(GPIOD_PIN5) | \ + PIN_OSPEED_HIGH(GPIOD_PIN6) | \ + PIN_OSPEED_HIGH(GPIOD_PIN7) | \ + PIN_OSPEED_HIGH(GPIOD_PIN8) | \ + PIN_OSPEED_HIGH(GPIOD_PIN9) | \ + PIN_OSPEED_HIGH(GPIOD_PIN10) | \ + PIN_OSPEED_HIGH(GPIOD_PIN11) | \ + PIN_OSPEED_HIGH(GPIOD_PIN12) | \ + PIN_OSPEED_HIGH(GPIOD_PIN13) | \ + PIN_OSPEED_HIGH(GPIOD_PIN14) | \ + PIN_OSPEED_HIGH(GPIOD_PIN15)) +#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN15)) +#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ + PIN_ODR_HIGH(GPIOD_PIN1) | \ + PIN_ODR_HIGH(GPIOD_PIN2) | \ + PIN_ODR_HIGH(GPIOD_PIN3) | \ + PIN_ODR_HIGH(GPIOD_PIN4) | \ + PIN_ODR_HIGH(GPIOD_PIN5) | \ + PIN_ODR_HIGH(GPIOD_PIN6) | \ + PIN_ODR_HIGH(GPIOD_PIN7) | \ + PIN_ODR_HIGH(GPIOD_PIN8) | \ + PIN_ODR_HIGH(GPIOD_PIN9) | \ + PIN_ODR_HIGH(GPIOD_PIN10) | \ + PIN_ODR_HIGH(GPIOD_PIN11) | \ + PIN_ODR_HIGH(GPIOD_PIN12) | \ + PIN_ODR_HIGH(GPIOD_PIN13) | \ + PIN_ODR_HIGH(GPIOD_PIN14) | \ + PIN_ODR_HIGH(GPIOD_PIN15)) +#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN7, 0U)) +#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOD_PIN15, 0U)) + +/* + * GPIOE setup: + * + * PE0 - PIN0 (input pullup). + * PE1 - PIN1 (input pullup). + * PE2 - PIN2 (input pullup). + * PE3 - PIN3 (input pullup). + * PE4 - PIN4 (input pullup). + * PE5 - PIN5 (input pullup). + * PE6 - PIN6 (input pullup). + * PE7 - PIN7 (input pullup). + * PE8 - PIN8 (input pullup). + * PE9 - PIN9 (input pullup). + * PE10 - PIN10 (input pullup). + * PE11 - PIN11 (input pullup). + * PE12 - PIN12 (input pullup). + * PE13 - PIN13 (input pullup). + * PE14 - PIN14 (input pullup). + * PE15 - PIN15 (input pullup). + */ +#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ + PIN_MODE_INPUT(GPIOE_PIN1) | \ + PIN_MODE_INPUT(GPIOE_PIN2) | \ + PIN_MODE_INPUT(GPIOE_PIN3) | \ + PIN_MODE_INPUT(GPIOE_PIN4) | \ + PIN_MODE_INPUT(GPIOE_PIN5) | \ + PIN_MODE_INPUT(GPIOE_PIN6) | \ + PIN_MODE_INPUT(GPIOE_PIN7) | \ + PIN_MODE_INPUT(GPIOE_PIN8) | \ + PIN_MODE_INPUT(GPIOE_PIN9) | \ + PIN_MODE_INPUT(GPIOE_PIN10) | \ + PIN_MODE_INPUT(GPIOE_PIN11) | \ + PIN_MODE_INPUT(GPIOE_PIN12) | \ + PIN_MODE_INPUT(GPIOE_PIN13) | \ + PIN_MODE_INPUT(GPIOE_PIN14) | \ + PIN_MODE_INPUT(GPIOE_PIN15)) +#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) +#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_HIGH(GPIOE_PIN0) | \ + PIN_OSPEED_HIGH(GPIOE_PIN1) | \ + PIN_OSPEED_HIGH(GPIOE_PIN2) | \ + PIN_OSPEED_HIGH(GPIOE_PIN3) | \ + PIN_OSPEED_HIGH(GPIOE_PIN4) | \ + PIN_OSPEED_HIGH(GPIOE_PIN5) | \ + PIN_OSPEED_HIGH(GPIOE_PIN6) | \ + PIN_OSPEED_HIGH(GPIOE_PIN7) | \ + PIN_OSPEED_HIGH(GPIOE_PIN8) | \ + PIN_OSPEED_HIGH(GPIOE_PIN9) | \ + PIN_OSPEED_HIGH(GPIOE_PIN10) | \ + PIN_OSPEED_HIGH(GPIOE_PIN11) | \ + PIN_OSPEED_HIGH(GPIOE_PIN12) | \ + PIN_OSPEED_HIGH(GPIOE_PIN13) | \ + PIN_OSPEED_HIGH(GPIOE_PIN14) | \ + PIN_OSPEED_HIGH(GPIOE_PIN15)) +#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN15)) +#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ + PIN_ODR_HIGH(GPIOE_PIN1) | \ + PIN_ODR_HIGH(GPIOE_PIN2) | \ + PIN_ODR_HIGH(GPIOE_PIN3) | \ + PIN_ODR_HIGH(GPIOE_PIN4) | \ + PIN_ODR_HIGH(GPIOE_PIN5) | \ + PIN_ODR_HIGH(GPIOE_PIN6) | \ + PIN_ODR_HIGH(GPIOE_PIN7) | \ + PIN_ODR_HIGH(GPIOE_PIN8) | \ + PIN_ODR_HIGH(GPIOE_PIN9) | \ + PIN_ODR_HIGH(GPIOE_PIN10) | \ + PIN_ODR_HIGH(GPIOE_PIN11) | \ + PIN_ODR_HIGH(GPIOE_PIN12) | \ + PIN_ODR_HIGH(GPIOE_PIN13) | \ + PIN_ODR_HIGH(GPIOE_PIN14) | \ + PIN_ODR_HIGH(GPIOE_PIN15)) +#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN7, 0U)) +#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOE_PIN15, 0U)) + +/* + * GPIOF setup: + * + * PF0 - COL7 + * PF1 - COL6 + * PF2 - PIN2 (input pullup). + * PF3 - PIN3 (input pullup). + * PF4 - PIN4 (input pullup). + * PF5 - PIN5 (input pullup). + * PF6 - PIN6 (input pullup). + * PF7 - PIN7 (input pullup). + * PF8 - PIN8 (input pullup). + * PF9 - PIN9 (input pullup). + * PF10 - PIN10 (input pullup). + * PF11 - PIN11 (input pullup). + * PF12 - PIN12 (input pullup). + * PF13 - PIN13 (input pullup). + * PF14 - PIN14 (input pullup). + * PF15 - PIN15 (input pullup). + */ +#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_PIN0) | \ + PIN_MODE_INPUT(GPIOF_PIN1) | \ + PIN_MODE_INPUT(GPIOF_PIN2) | \ + PIN_MODE_INPUT(GPIOF_PIN3) | \ + PIN_MODE_INPUT(GPIOF_PIN4) | \ + PIN_MODE_INPUT(GPIOF_PIN5) | \ + PIN_MODE_INPUT(GPIOF_PIN6) | \ + PIN_MODE_INPUT(GPIOF_PIN7) | \ + PIN_MODE_INPUT(GPIOF_PIN8) | \ + PIN_MODE_INPUT(GPIOF_PIN9) | \ + PIN_MODE_INPUT(GPIOF_PIN10) | \ + PIN_MODE_INPUT(GPIOF_PIN11) | \ + PIN_MODE_INPUT(GPIOF_PIN12) | \ + PIN_MODE_INPUT(GPIOF_PIN13) | \ + PIN_MODE_INPUT(GPIOF_PIN14) | \ + PIN_MODE_INPUT(GPIOF_PIN15)) +#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) +#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOF_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN1) | \ + PIN_OSPEED_HIGH(GPIOF_PIN2) | \ + PIN_OSPEED_HIGH(GPIOF_PIN3) | \ + PIN_OSPEED_HIGH(GPIOF_PIN4) | \ + PIN_OSPEED_HIGH(GPIOF_PIN5) | \ + PIN_OSPEED_HIGH(GPIOF_PIN6) | \ + PIN_OSPEED_HIGH(GPIOF_PIN7) | \ + PIN_OSPEED_HIGH(GPIOF_PIN8) | \ + PIN_OSPEED_HIGH(GPIOF_PIN9) | \ + PIN_OSPEED_HIGH(GPIOF_PIN10) | \ + PIN_OSPEED_HIGH(GPIOF_PIN11) | \ + PIN_OSPEED_HIGH(GPIOF_PIN12) | \ + PIN_OSPEED_HIGH(GPIOF_PIN13) | \ + PIN_OSPEED_HIGH(GPIOF_PIN14) | \ + PIN_OSPEED_HIGH(GPIOF_PIN15)) +#define VAL_GPIOF_PUPDR (PIN_PUPDR_PULLUP(GPIOF_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN15)) +#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_PIN0) | \ + PIN_ODR_HIGH(GPIOF_PIN1) | \ + PIN_ODR_HIGH(GPIOF_PIN2) | \ + PIN_ODR_HIGH(GPIOF_PIN3) | \ + PIN_ODR_HIGH(GPIOF_PIN4) | \ + PIN_ODR_HIGH(GPIOF_PIN5) | \ + PIN_ODR_HIGH(GPIOF_PIN6) | \ + PIN_ODR_HIGH(GPIOF_PIN7) | \ + PIN_ODR_HIGH(GPIOF_PIN8) | \ + PIN_ODR_HIGH(GPIOF_PIN9) | \ + PIN_ODR_HIGH(GPIOF_PIN10) | \ + PIN_ODR_HIGH(GPIOF_PIN11) | \ + PIN_ODR_HIGH(GPIOF_PIN12) | \ + PIN_ODR_HIGH(GPIOF_PIN13) | \ + PIN_ODR_HIGH(GPIOF_PIN14) | \ + PIN_ODR_HIGH(GPIOF_PIN15)) +#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_PIN0, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN1, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN2, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN3, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN4, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN5, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN6, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN7, 0U)) +#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN9, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN10, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN11, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN12, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN13, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN14, 0U) | \ + PIN_AFIO_AF(GPIOF_PIN15, 0U)) + +#if !defined(_FROM_ASM_) +#ifdef __cplusplus +extern "C" { +#endif + void boardInit(void); +#ifdef __cplusplus +} +#endif +#endif /* _FROM_ASM_ */ + +#endif /* _BOARD_H */ diff --git a/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.mk b/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.mk new file mode 100644 index 000000000000..bbeb5bbff728 --- /dev/null +++ b/keyboards/vinta/boards/GENERIC_STM32_F042X6/board.mk @@ -0,0 +1,5 @@ +# List of all the board related files. +BOARDSRC = $(BOARD_PATH)/boards/GENERIC_STM32_F042X6/board.c + +# Required include directories +BOARDINC = $(BOARD_PATH)/boards/GENERIC_STM32_F042X6 diff --git a/keyboards/vinta/bootloader_defs.h b/keyboards/vinta/bootloader_defs.h new file mode 100644 index 000000000000..4994be9c24c3 --- /dev/null +++ b/keyboards/vinta/bootloader_defs.h @@ -0,0 +1,7 @@ +/* Address for jumping to bootloader on STM32 chips. */ +/* It is chip dependent, the correct number can be looked up here: + * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf + * This also requires a patch to chibios: + * /tmk_core/tool/chibios/ch-bootloader-jump.patch + */ +#define STM32_BOOTLOADER_ADDRESS 0x1FFFC400 \ No newline at end of file diff --git a/keyboards/vinta/chconf.h b/keyboards/vinta/chconf.h new file mode 100644 index 000000000000..b836a3b99cdd --- /dev/null +++ b/keyboards/vinta/chconf.h @@ -0,0 +1,521 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16 or 32 bits. + */ +#define CH_CFG_ST_RESOLUTION 32 + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#define CH_CFG_ST_FREQUENCY 10000 + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#define CH_CFG_ST_TIMEDELTA 2 + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#define CH_CFG_TIME_QUANTUM 0 + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#define CH_CFG_MEMCORE_SIZE 0 + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#define CH_CFG_NO_IDLE_THREAD FALSE + +/* Use __WFI in the idle thread for waiting. Does lower the power + * consumption. */ +#define CORTEX_ENABLE_WFI_IDLE TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#define CH_CFG_OPTIMIZE_SPEED TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_TM FALSE + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_REGISTRY TRUE + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_WAITEXIT TRUE + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_SEMAPHORES TRUE + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MUTEXES TRUE + +/** + * @brief Enables recursive behavior on mutexes. + * @note Recursive mutexes are heavier and have an increased + * memory footprint. + * + * @note The default is @p FALSE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_CONDVARS TRUE + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_CONDVARS. + */ +#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_EVENTS TRUE + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_EVENTS. + */ +#define CH_CFG_USE_EVENTS_TIMEOUT TRUE + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MESSAGES TRUE + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_MESSAGES. + */ +#define CH_CFG_USE_MESSAGES_PRIORITY FALSE + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_MAILBOXES TRUE + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMCORE TRUE + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#define CH_CFG_USE_HEAP TRUE + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMPOOLS TRUE + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_WAITEXIT. + * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. + */ +#define CH_CFG_USE_DYNAMIC TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, kernel statistics. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_STATISTICS FALSE + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_SYSTEM_STATE_CHECK FALSE + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_CHECKS FALSE + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_ASSERTS FALSE + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the trace buffer is activated. + * + * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_BUFFER_SIZE 128 + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#define CH_DBG_ENABLE_STACK_CHECK FALSE + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_FILL_THREADS FALSE + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p thread_t structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. + */ +#define CH_DBG_THREADS_PROFILING FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p thread_t structure. + */ +#define CH_CFG_THREAD_EXTRA_FIELDS \ + /* Add threads custom fields here.*/ + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + */ +#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* Context switch code here.*/ \ +} + +/** + * @brief ISR enter hook. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ + /* IRQ prologue code here.*/ \ +} + +/** + * @brief ISR exit hook. + */ +#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ + /* IRQ epilogue code here.*/ \ +} + +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#define CH_CFG_IDLE_ENTER_HOOK() { \ + /* Idle-enter code here.*/ \ +} + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#define CH_CFG_IDLE_LEAVE_HOOK() { \ + /* Idle-leave code here.*/ \ +} + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#define CH_CFG_IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#define CH_CFG_SYSTEM_TICK_HOOK() { \ + /* System tick event code here.*/ \ +} + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ + /* System halt code here.*/ \ +} + +/** + * @brief Trace hook. + * @details This hook is invoked each time a new record is written in the + * trace buffer. + */ +#define CH_CFG_TRACE_HOOK(tep) { \ + /* Trace code here.*/ \ +} + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* CHCONF_H */ + +/** @} */ \ No newline at end of file diff --git a/keyboards/vinta/config.h b/keyboards/vinta/config.h new file mode 100644 index 000000000000..5f6ea7f06b30 --- /dev/null +++ b/keyboards/vinta/config.h @@ -0,0 +1,70 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0C61 +#define DEVICE_VER 0x00C6 +#define MANUFACTURER PeiorisBoards +#define PRODUCT Vinta R1 +#define DESCRIPTION Tada68 Replacement PCB + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +#define MATRIX_ROW_PINS { A10, A9, B0, A7, A6 } +#define MATRIX_COL_PINS { A5, A4, A3, A2, A1, A0, F1, F0, B7, B6, B5, B4, B3, A15, A14, A13 } + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 0 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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)) \ +) diff --git a/keyboards/vinta/halconf.h b/keyboards/vinta/halconf.h new file mode 100644 index 000000000000..bc2b66f2e1e1 --- /dev/null +++ b/keyboards/vinta/halconf.h @@ -0,0 +1,350 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef _HALCONF_H_ +#define _HALCONF_H_ + +#include "mcuconf.h" + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the DAC subsystem. + */ +#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) +#define HAL_USE_DAC FALSE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT FALSE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C FALSE +#endif + +/** + * @brief Enables the I2S subsystem. + */ +#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) +#define HAL_USE_I2S FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM FALSE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL FALSE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB TRUE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI FALSE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB TRUE +#endif + +/** + * @brief Enables the WDG subsystem. + */ +#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) +#define HAL_USE_WDG FALSE +#endif + +/*===========================================================================*/ +/* ADC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) +#define ADC_USE_WAIT FALSE +#endif + +/** + * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define ADC_USE_MUTUAL_EXCLUSION FALSE +#endif + +/*===========================================================================*/ +/* CAN driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Sleep mode related APIs inclusion switch. + */ +#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) +#define CAN_USE_SLEEP_MODE TRUE +#endif + +/*===========================================================================*/ +/* I2C driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the mutual exclusion APIs on the I2C bus. + */ +#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define I2C_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* MAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) +#define MAC_USE_ZERO_COPY FALSE +#endif + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) +#define MAC_USE_EVENTS TRUE +#endif + +/*===========================================================================*/ +/* MMC_SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + * This option is recommended also if the SPI driver does not + * use a DMA channel and heavily loads the CPU. + */ +#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) +#define MMC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SDC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Number of initialization attempts before rejecting the card. + * @note Attempts are performed at 10mS intervals. + */ +#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) +#define SDC_INIT_RETRY 100 +#endif + +/** + * @brief Include support for MMC cards. + * @note MMC support is not yet implemented so this option must be kept + * at @p FALSE. + */ +#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) +#define SDC_MMC_SUPPORT FALSE +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + */ +#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) +#define SDC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SERIAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Default bit rate. + * @details Configuration parameter, this is the baud rate selected for the + * default configuration. + */ +#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) +#define SERIAL_DEFAULT_BITRATE 38400 +#endif + +/** + * @brief Serial buffers size. + * @details Configuration parameter, you can change the depth of the queue + * buffers depending on the requirements of your application. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_BUFFERS_SIZE 16 +#endif + +/*===========================================================================*/ +/* SERIAL_USB driver related setting. */ +/*===========================================================================*/ + +/** + * @brief Serial over USB buffers size. + * @details Configuration parameter, the buffer size must be a multiple of + * the USB data endpoint maximum packet size. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_SIZE 256 +#endif + +/*===========================================================================*/ +/* SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) +#define SPI_USE_WAIT FALSE +#endif + +/** + * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define SPI_USE_MUTUAL_EXCLUSION FALSE +#endif + +/*===========================================================================*/ +/* USB driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) +#define USB_USE_WAIT TRUE +#endif + +#endif /* _HALCONF_H_ */ + +/** @} */ \ No newline at end of file diff --git a/keyboards/vinta/keymaps/default/keymap.c b/keyboards/vinta/keymaps/default/keymap.c new file mode 100644 index 000000000000..4e55ec308f2f --- /dev/null +++ b/keyboards/vinta/keymaps/default/keymap.c @@ -0,0 +1,51 @@ +/* Copyright 2018 Peioris + * + * 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 QMK_KEYBOARD_H + +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| -| =| \ | ` |Del | + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Bspc|PgUp| + * |----------------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return |PgDn| + * |----------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|End | + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |Alt|RST|Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + */ +[0] = LAYOUT_69_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_BSLS, KC_GRV, 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_BSPC, KC_PGUP,\ + 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_SPC, KC_RALT, RESET, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), +}; + +void matrix_init_user(void) { + //user initialization +} + +void matrix_scan_user(void) { + //user matrix +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} \ No newline at end of file diff --git a/keyboards/vinta/mcuconf.h b/keyboards/vinta/mcuconf.h new file mode 100644 index 000000000000..4643e9f92e8f --- /dev/null +++ b/keyboards/vinta/mcuconf.h @@ -0,0 +1,168 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef _MCUCONF_H_ +#define _MCUCONF_H_ + +/* + * STM32F0xx drivers configuration. + * The following settings override the default settings present in + * the various device driver implementation headers. + * Note that the settings for each driver only have effect if the whole + * driver is enabled in halconf.h. + * + * IRQ priorities: + * 3...0 Lowest...Highest. + * + * DMA priorities: + * 0...3 Lowest...Highest. + */ + +#define STM32F0xx_MCUCONF + +/* + * HAL driver system settings. + */ +#define STM32_NO_INIT FALSE +#define STM32_PVD_ENABLE FALSE +#define STM32_PLS STM32_PLS_LEV0 +#define STM32_HSI_ENABLED TRUE +#define STM32_HSI14_ENABLED TRUE +#define STM32_HSI48_ENABLED FALSE +#define STM32_LSI_ENABLED TRUE +#define STM32_HSE_ENABLED FALSE +#define STM32_LSE_ENABLED FALSE +#define STM32_SW STM32_SW_PLL +#define STM32_PLLSRC STM32_PLLSRC_HSI_DIV2 +#define STM32_PREDIV_VALUE 1 +#define STM32_PLLMUL_VALUE 12 +#define STM32_HPRE STM32_HPRE_DIV1 +#define STM32_PPRE STM32_PPRE_DIV1 +#define STM32_ADCSW STM32_ADCSW_HSI14 +#define STM32_ADCPRE STM32_ADCPRE_DIV4 +#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK +#define STM32_ADCPRE STM32_ADCPRE_DIV4 +#define STM32_ADCSW STM32_ADCSW_HSI14 +#define STM32_USBSW STM32_USBSW_HSI48 +#define STM32_CECSW STM32_CECSW_HSI +#define STM32_I2C1SW STM32_I2C1SW_HSI +#define STM32_USART1SW STM32_USART1SW_PCLK +#define STM32_RTCSEL STM32_RTCSEL_LSI + +/* + * ADC driver system settings. + */ +#define STM32_ADC_USE_ADC1 FALSE +#define STM32_ADC_ADC1_DMA_PRIORITY 2 +#define STM32_ADC_IRQ_PRIORITY 2 +#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2 + +/* + * EXT driver system settings. + */ +#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3 +#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3 +#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3 +#define STM32_EXT_EXTI16_IRQ_PRIORITY 3 +#define STM32_EXT_EXTI17_IRQ_PRIORITY 3 + +/* + * GPT driver system settings. + */ +#define STM32_GPT_USE_TIM1 FALSE +#define STM32_GPT_USE_TIM2 FALSE +#define STM32_GPT_USE_TIM3 FALSE +#define STM32_GPT_USE_TIM14 FALSE +#define STM32_GPT_TIM1_IRQ_PRIORITY 2 +#define STM32_GPT_TIM2_IRQ_PRIORITY 2 +#define STM32_GPT_TIM3_IRQ_PRIORITY 2 +#define STM32_GPT_TIM14_IRQ_PRIORITY 2 + +/* + * I2C driver system settings. + */ +#define STM32_I2C_USE_I2C1 FALSE +#define STM32_I2C_USE_I2C2 FALSE +#define STM32_I2C_BUSY_TIMEOUT 50 +#define STM32_I2C_I2C1_IRQ_PRIORITY 3 +#define STM32_I2C_I2C2_IRQ_PRIORITY 3 +#define STM32_I2C_USE_DMA TRUE +#define STM32_I2C_I2C1_DMA_PRIORITY 1 +#define STM32_I2C_I2C2_DMA_PRIORITY 1 +#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") + +/* + * ICU driver system settings. + */ +#define STM32_ICU_USE_TIM1 FALSE +#define STM32_ICU_USE_TIM2 FALSE +#define STM32_ICU_USE_TIM3 FALSE +#define STM32_ICU_TIM1_IRQ_PRIORITY 3 +#define STM32_ICU_TIM2_IRQ_PRIORITY 3 +#define STM32_ICU_TIM3_IRQ_PRIORITY 3 + +/* + * PWM driver system settings. + */ +#define STM32_PWM_USE_ADVANCED FALSE +#define STM32_PWM_USE_TIM1 FALSE +#define STM32_PWM_USE_TIM2 FALSE +#define STM32_PWM_USE_TIM3 FALSE +#define STM32_PWM_TIM1_IRQ_PRIORITY 3 +#define STM32_PWM_TIM2_IRQ_PRIORITY 3 +#define STM32_PWM_TIM3_IRQ_PRIORITY 3 + +/* + * SERIAL driver system settings. + */ +#define STM32_SERIAL_USE_USART1 FALSE +#define STM32_SERIAL_USE_USART2 FALSE +#define STM32_SERIAL_USART1_PRIORITY 3 +#define STM32_SERIAL_USART2_PRIORITY 3 + +/* + * SPI driver system settings. + */ +#define STM32_SPI_USE_SPI1 FALSE +#define STM32_SPI_USE_SPI2 FALSE +#define STM32_SPI_SPI1_DMA_PRIORITY 1 +#define STM32_SPI_SPI2_DMA_PRIORITY 1 +#define STM32_SPI_SPI1_IRQ_PRIORITY 2 +#define STM32_SPI_SPI2_IRQ_PRIORITY 2 +#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") + +/* + * ST driver system settings. + */ +#define STM32_ST_IRQ_PRIORITY 2 +#define STM32_ST_USE_TIMER 2 + +/* + * UART driver system settings. + */ +#define STM32_UART_USE_USART1 FALSE +#define STM32_UART_USE_USART2 FALSE +#define STM32_UART_USART1_IRQ_PRIORITY 3 +#define STM32_UART_USART2_IRQ_PRIORITY 3 +#define STM32_UART_USART1_DMA_PRIORITY 0 +#define STM32_UART_USART2_DMA_PRIORITY 0 +#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") + +/* + * USB driver system settings. + */ +#define STM32_USB_USE_USB1 TRUE +#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE +#define STM32_USB_USB1_LP_IRQ_PRIORITY 3 + +#endif /* _MCUCONF_H_ */ \ No newline at end of file diff --git a/keyboards/vinta/readme.md b/keyboards/vinta/readme.md new file mode 100644 index 000000000000..193f3612160c --- /dev/null +++ b/keyboards/vinta/readme.md @@ -0,0 +1,22 @@ +Vinta +========= + +[Vinta](https://i.imgur.com/huX3lff.jpg) + + +This is an ARM-powered 65% keyboard PCB with USB Mini B connector and breakout for optional RGB underglow. + +Keyboard Maintainer: [Peioris](http://peioris.space/) and on [github](https://github.com/coarse) +Hardware Supported: Vinta with STM32F042K6T6 +Hardware Availability: Private Groupbuy (will post on Reddit once QMK has RGB underglow working) + +Make example for this keyboard (after setting up your build environment): + + make vinta:default + +See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. + +#### Developer's Note + +STM32F042xx chips does not allow jumping to bootloader without BOOT0 being set to high, therefore it is impossible to enter the bootloader from sending a `RESET` keycode nor using bootmagic or bootmagic lite. +The only way to enter bootloader is to hold the BOOT0 button while the keyboard is powering up or after a power reset (done by pressing the reset switch or sending a `RESET` keycode). \ No newline at end of file diff --git a/keyboards/vinta/rules.mk b/keyboards/vinta/rules.mk new file mode 100644 index 000000000000..bf3eecbe2102 --- /dev/null +++ b/keyboards/vinta/rules.mk @@ -0,0 +1,47 @@ +# project specific files + +## chip/board settings +# - the next two should match the directories in +# /os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) +MCU_FAMILY = STM32 +MCU_SERIES = STM32F0xx + +# Linker script to use +# - it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/ +# or /ld/ +MCU_LDSCRIPT = STM32F042x6 + +# Startup code to use +# - it should exist in /os/common/ports/ARMCMx/compilers/GCC/mk/ +MCU_STARTUP = stm32f0xx + +# Board: it should exist either in /os/hal/boards/ +# or /boards +BOARD = GENERIC_STM32_F042X6 + +# Cortex version +MCU = cortex-m0 + +# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 +ARMV = 6 + +# Vector table for application +# 0x00000000-0x00001000 area is occupied by bootlaoder.*/ +# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB +#OPT_DEFS = -DCORTEX_VTOR_INIT=0x00001000 +OPT_DEFS = + +# Options to pass to dfu-util when flashing +DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000 + +# Build Options +# comment out to disable the options. +# +BACKLIGHT_ENABLE = no +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # USB Nkey Rollover +NO_USB_STARTUP_CHECK = no # Disable initialization only when usb is plugged in \ No newline at end of file diff --git a/keyboards/vinta/vinta.c b/keyboards/vinta/vinta.c new file mode 100644 index 000000000000..b5d40a160924 --- /dev/null +++ b/keyboards/vinta/vinta.c @@ -0,0 +1,18 @@ +#include "vinta.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) { + + matrix_scan_user(); +} + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + + return process_record_user(keycode, record); +} \ No newline at end of file diff --git a/keyboards/vinta/vinta.h b/keyboards/vinta/vinta.h new file mode 100644 index 000000000000..7f21157eeeaf --- /dev/null +++ b/keyboards/vinta/vinta.h @@ -0,0 +1,25 @@ +#ifndef VINTA_H +#define VINTA_H + +#define XXX KC_NO + +#include "quantum.h" + +// This a shortcut to help you visually see your layout. + +#define LAYOUT_69_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, K1F, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2E, K2F, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3C, K3E, K3F, \ + K40, K41, K42, K45, K49, K4A, K4C, K4D, K4E, K4F \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, XXX, K1E, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, XXX, XXX, K2E, K2F }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, XXX, K3C, XXX, K3E, K3F }, \ + { K40, K41, K42, XXX, XXX, K45, XXX, XXX, XXX, K49, K4A, XXX, K4C, K4D, K4E, K4F } \ +} + +#endif \ No newline at end of file From a9c5e75437be7dbfb399d21f738feb9a07c4017d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=BDan=20Pevec?= Date: Tue, 30 Oct 2018 06:21:07 +0100 Subject: [PATCH 318/505] Planck keyboard layout update (#4279) * Personal dz60 keymap * Replacing unused macros Co-Authored-By: pevecyan * Fixes on keymap * Planck keyboard layout update --- keyboards/planck/keymaps/pevecyan/keymap.c | 34 +++++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/keyboards/planck/keymaps/pevecyan/keymap.c b/keyboards/planck/keymaps/pevecyan/keymap.c index 7bc43a373cd1..4d76f09b0a53 100644 --- a/keyboards/planck/keymaps/pevecyan/keymap.c +++ b/keyboards/planck/keymaps/pevecyan/keymap.c @@ -28,7 +28,9 @@ enum planck_layers { _RAISE, _ADJUST, _ALTGR, - _CAPS + _CAPS, + _MEMA, + _CARON }; enum planck_keycodes { @@ -39,6 +41,8 @@ enum planck_keycodes { #define RAISE MO(_RAISE) #define CAPS MO(_CAPS) #define ALTGR MO(_ALTGR) +#define MEMA MO(_MEMA) +#define CARON LT(_CARON, SI_QOT) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -55,14 +59,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_QWERTY] = LAYOUT_planck_grid( KC_TAB, SI_Q, SI_W, SI_E, SI_R, SI_T, SI_Z, SI_U, SI_I, SI_O, SI_P, KC_BSPC, - CAPS, SI_A, SI_S, SI_D, SI_F, SI_G, SI_H, SI_J, SI_K, SI_L, KC_SCLN, KC_ENT, + CAPS, SI_A, SI_S, SI_D, SI_F, SI_G, SI_H, SI_J, SI_K, SI_L, CARON, KC_ENT, KC_LSFT, SI_Y, SI_X, SI_C, SI_V, SI_B, SI_N, SI_M, SI_COMM, SI_DOT, SI_MINS, KC_RSFT , - KC_LCTL, KC_LGUI, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, ALTGR, KC_DOWN, KC_UP, KC_F5 + KC_LCTL, KC_LALT, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, ALTGR, MEMA, KC_F12, KC_F5 ), /* Lower * ,-----------------------------------------------------------------------------------. - * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | + * | ~ | ! | " | # | $ | % | & | / | ( | ) | = | Bksp | * |------+------+------+------+------+-------------+------+------+------+------+------| * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | * |------+------+------+------+------+------|------+------+------+------+------+------| @@ -72,8 +76,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_LOWER] = LAYOUT_planck_grid( - 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_MINS, KC_PPLS , KC_ENT, + SI_TILD, SI_EXLM, SI_DQOT, KC_HASH, SI_DLR, SI_PERC, SI_AMPR, SI_SLSH, SI_LPRN, SI_RPRN, SI_EQL, _______, + KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_MINS, KC_PPLS, KC_ENT, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ), @@ -100,7 +104,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------------------------------------------------. * | | Reset| | | | | | | | | | Del | * |------+------+------+------+------+-------------+------+------+------+------+------| - * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover| | + * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty| | | | | * |------+------+------+------+------+------|------+------+------+------+------+------| * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof| | | | | | * |------+------+------+------+------+------+------+------+------+------+------+------| @@ -126,7 +130,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ -) +), + +[_MEMA] = LAYOUT_planck_grid( + _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, KC_MPLY, KC_VOLU, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +[_CARON] = LAYOUT_planck_grid( + _______, _______, _______, _______, _______, _______, SI_ZV , _______, _______, _______, _______, _______, + _______, _______, SI_SV, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, SI_CV, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), }; From 9315172190f86a6bc40bcdf9867a827e9fa72021 Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Tue, 30 Oct 2018 04:05:28 +0900 Subject: [PATCH 319/505] helix serial.c: Add the version of gcc used for adjustment to the comment. --- keyboards/helix/serial.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c index 24b889d30b28..325c29a3f704 100644 --- a/keyboards/helix/serial.c +++ b/keyboards/helix/serial.c @@ -70,6 +70,7 @@ #error serial.c now support ATmega32U4 only #endif +//////////////// for backward compatibility //////////////////////////////// #ifndef SERIAL_USE_MULTI_TRANSACTION /* --- USE Simple API (OLD API, compatible with let's split serial.c) */ #if SERIAL_SLAVE_BUFFER_LENGTH > 0 @@ -111,7 +112,8 @@ int serial_update_buffers() return result; } -#endif // Simple API (OLD API, compatible with let's split serial.c) +#endif // end of Simple API (OLD API, compatible with let's split serial.c) +//////////////////////////////////////////////////////////////////////////// #define ALWAYS_INLINE __attribute__((always_inline)) #define NO_INLINE __attribute__((noinline)) @@ -575,7 +577,14 @@ int soft_serial_get_and_clean_status(int sstd_index) { #endif // Helix serial.c history -// 2018-1-29 fork from let's split (#2308) -// 2018-6-28 bug fix master to slave comm (#3255) -// 2018-8-11 improvements (#3608) -// 2018-10-21 fix serial and RGB animation conflict (#4191) +// 2018-1-29 fork from let's split and add PD2, modify sync_recv() (#2308, bceffdefc) +// 2018-6-28 bug fix master to slave comm and speed up (#3255, 1038bbef4) +// (adjusted with avr-gcc 4.9.2) +// 2018-7-13 remove USE_SERIAL_PD2 macro (#3374, f30d6dd78) +// (adjusted with avr-gcc 4.9.2) +// 2018-8-11 add support multi-type transaction (#3608, feb5e4aae) +// (adjusted with avr-gcc 4.9.2) +// 2018-10-21 fix serial and RGB animation conflict (#4191, 4665e4fff) +// (adjusted with avr-gcc 7.3.0) +// 2018-10-28 re-adjust compiler depend value of delay (#4269, 8517f8a66) +// (adjusted with avr-gcc 5.4.0, 7.3.0) From 31ff5f219ddcbdac183c7f3ad6cea8eca1b9d398 Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Tue, 30 Oct 2018 08:22:25 -0700 Subject: [PATCH 320/505] Move grave to top layer (caps is esc) (#4288) --- keyboards/dz60/keymaps/crd/keymap.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/dz60/keymaps/crd/keymap.c b/keyboards/dz60/keymaps/crd/keymap.c index 2aedc0b7288a..148b03b995b9 100644 --- a/keyboards/dz60/keymaps/crd/keymap.c +++ b/keyboards/dz60/keymaps/crd/keymap.c @@ -4,7 +4,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Qwerty * ,-----------------------------------------------------------------------------------------. - * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc | + * | ` ~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc | * |-----------------------------------------------------------------------------------------+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | * |-----------------------------------------------------------------------------------------+ @@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ LAYOUT_directional( - KC_GESC, 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, 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, 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, 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_UP, KC_DEL, @@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* FN1 Layer * ,-----------------------------------------------------------------------------------------. - * | ` ~ | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | + * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | * |-----------------------------------------------------------------------------------------+ * | | | | | | | | | | | | | | | * |-----------------------------------------------------------------------------------------+ @@ -39,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ LAYOUT_directional( - 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_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, From 7373d5b394d9c75cd2b91d77984145606bf31a04 Mon Sep 17 00:00:00 2001 From: Leah Date: Tue, 30 Oct 2018 16:37:08 +0100 Subject: [PATCH 321/505] Update feature_bootmagic.md (#4290) Fix typo --- docs/feature_bootmagic.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature_bootmagic.md b/docs/feature_bootmagic.md index 20c76d9b745d..504fb90f451b 100644 --- a/docs/feature_bootmagic.md +++ b/docs/feature_bootmagic.md @@ -14,7 +14,7 @@ On some keyboards Bootmagic is disabled by default. If this is the case, it must BOOTMAGIC_ENABLE = full ``` -?> You may see `yes` being used in place of `full`, and this is okay. However, `yes` is deprecated, and ideally `full` (or `lite`) ideally should be used instead. +?> You may see `yes` being used in place of `full`, and this is okay. However, `yes` is deprecated, and ideally `full` (or `lite`) should be used instead. Additionally, you can use [Bootmagic Lite](#bootmagic-lite) (a scaled down, very basic version of Bootmagic) by adding the following to your `rules.mk` file: From 7fc9170ea7271e2931c7e0f854b635f0954fbbe1 Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Tue, 30 Oct 2018 09:10:53 -0700 Subject: [PATCH 322/505] Add crd's AEK layout for ALPS64 board (#4292) --- keyboards/alps64/keymaps/crd/keymap.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 keyboards/alps64/keymaps/crd/keymap.c diff --git a/keyboards/alps64/keymaps/crd/keymap.c b/keyboards/alps64/keymaps/crd/keymap.c new file mode 100644 index 000000000000..a47ad865040f --- /dev/null +++ b/keyboards/alps64/keymaps/crd/keymap.c @@ -0,0 +1,22 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* 0: qwerty */ + LAYOUT_all( + 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_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_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, KC_ENT, + 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, + MO(1), KC_LALT, KC_LGUI, KC_SPC, _______, KC_RGUI, KC_RALT, MO(2) + ), + /* 1: fn1 */ + LAYOUT_all( + _______, 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_HOME, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_END, KC_PGDOWN, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), +}; + +const uint16_t PROGMEM fn_actions[] = {}; From 426c18b8c6fac83620de9ccedb4668dbb3a1ff40 Mon Sep 17 00:00:00 2001 From: Elliot Powell <32494740+e11i0t23@users.noreply.github.com> Date: Tue, 30 Oct 2018 21:55:22 +0000 Subject: [PATCH 323/505] Keyboard: add ep40 qmk support (#4291) * add initial ep40 files * fixed issues * updated keymap * Added media control * Update keyboards/handwired/ep40/rules.mk Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * Fixed requested changes * Fixed more requested changes --- keyboards/handwired/ep40/config.h | 114 ++++++++++++++++++ keyboards/handwired/ep40/ep40.c | 43 +++++++ keyboards/handwired/ep40/ep40.h | 44 +++++++ keyboards/handwired/ep40/info.json | 12 ++ .../handwired/ep40/keymaps/default/keymap.c | 39 ++++++ .../handwired/ep40/keymaps/default/readme.md | 1 + keyboards/handwired/ep40/readme.md | 15 +++ keyboards/handwired/ep40/rules.mk | 80 ++++++++++++ 8 files changed, 348 insertions(+) create mode 100644 keyboards/handwired/ep40/config.h create mode 100644 keyboards/handwired/ep40/ep40.c create mode 100644 keyboards/handwired/ep40/ep40.h create mode 100644 keyboards/handwired/ep40/info.json create mode 100644 keyboards/handwired/ep40/keymaps/default/keymap.c create mode 100644 keyboards/handwired/ep40/keymaps/default/readme.md create mode 100644 keyboards/handwired/ep40/readme.md create mode 100644 keyboards/handwired/ep40/rules.mk diff --git a/keyboards/handwired/ep40/config.h b/keyboards/handwired/ep40/config.h new file mode 100644 index 000000000000..90630cd68d4d --- /dev/null +++ b/keyboards/handwired/ep40/config.h @@ -0,0 +1,114 @@ +/* +Copyright 2018 Elliot Powell + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x4040 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Elliot Powell +#define PRODUCT ep40 +#define DESCRIPTION A simple 40% keyboard + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 12 + +/* + * 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 { C7, C6, B6, B5 } +#define MATRIX_COL_PINS { F6, F5, F4, F1, F0, D2, D3, D5, D4, D6, D7, B4 } + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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)) \ +) +/* + * 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 diff --git a/keyboards/handwired/ep40/ep40.c b/keyboards/handwired/ep40/ep40.c new file mode 100644 index 000000000000..257f9fa807d1 --- /dev/null +++ b/keyboards/handwired/ep40/ep40.c @@ -0,0 +1,43 @@ +/* Copyright 2018 Elliot Powell + * + * 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 "ep40.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/handwired/ep40/ep40.h b/keyboards/handwired/ep40/ep40.h new file mode 100644 index 000000000000..30f3d15b4fb9 --- /dev/null +++ b/keyboards/handwired/ep40/ep40.h @@ -0,0 +1,44 @@ +/* Copyright 2018 Elliot Powell + * + * 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 EP40_H +#define EP40_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define xxx KC_NO + +#define LAYOUT(\ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b,\ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1b,\ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b,\ + k30, k31, k32, k34, k36, k38, k39, k3a, k3b \ +) \ +{ \ + {k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b},\ + {k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, xxx, k1b},\ + {k20, xxx, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b},\ + {k30, k31, k32, xxx, k34, xxx, k36, xxx, k38, k39, k3a, k3b} \ +} + +#endif diff --git a/keyboards/handwired/ep40/info.json b/keyboards/handwired/ep40/info.json new file mode 100644 index 000000000000..1c57ac674999 --- /dev/null +++ b/keyboards/handwired/ep40/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name":"ep40", + "url":null, + "maintainer":"e11i0t23", + "width":12, + "hight":4, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":0, "y":1, "w":1.25}, {"x":1.25, "y":1}, {"x":2.25, "y":1}, {"x":3.25, "y":1}, {"x":4.25, "y":1}, {"x":5.25, "y":1}, {"x":6.25, "y":1}, {"x":7.25, "y":1}, {"x":8.25, "y":1}, {"x":9.25, "y":1}, {"x":10.25, "y":1, "w":1.75}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2, "w":1.25}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3, "w":2.25}, {"x":5.25, "y":3, "w":2.75}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}] + } + } +} diff --git a/keyboards/handwired/ep40/keymaps/default/keymap.c b/keyboards/handwired/ep40/keymaps/default/keymap.c new file mode 100644 index 000000000000..2d8a5d0592e4 --- /dev/null +++ b/keyboards/handwired/ep40/keymaps/default/keymap.c @@ -0,0 +1,39 @@ +/* Copyright 2018 Elliot Powell + * + * 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 QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( /* Base */ + KC_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,\ + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_RSFT,\ + LCTL_T(KC_LBRC), KC_LGUI, KC_LALT, KC_SPC, LT(1, KC_SPC), KC_RGUI, MO(2), RCTL_T(KC_RBRC), KC_RALT \ + ), + + [1] = LAYOUT( /* Base */ + KC_TRNS, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0, KC_DEL ,\ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_UP, KC_DOWN, KC_RIGHT, KC_TRNS,\ + KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_TRNS,\ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + + [2] = LAYOUT( /* Base */ + KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 ,\ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SCLN, KC_QUOT, KC_NUHS, KC_TRNS,\ + KC_TRNS, KC_NUBS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SLSH, KC_TRNS, KC_TRNS,\ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET \ + ), +}; diff --git a/keyboards/handwired/ep40/keymaps/default/readme.md b/keyboards/handwired/ep40/keymaps/default/readme.md new file mode 100644 index 000000000000..242c0afb93c4 --- /dev/null +++ b/keyboards/handwired/ep40/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for ep40 \ No newline at end of file diff --git a/keyboards/handwired/ep40/readme.md b/keyboards/handwired/ep40/readme.md new file mode 100644 index 000000000000..5acd8892dd53 --- /dev/null +++ b/keyboards/handwired/ep40/readme.md @@ -0,0 +1,15 @@ +# ep40 + +![ep40](https://i.imgur.com/Jl7w6I9.jpg) + +A simple 40% keyboard + +Keyboard Maintainer: [Elliot Powell](https://reddit.com/u/e11i0t23, https://github.com/e11i0t23) +Hardware Supported: EP40 PCB +Hardware Availability: None at the moment + +Make example for this keyboard (after setting up your build environment): + + make ep40:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/handwired/ep40/rules.mk b/keyboards/handwired/ep40/rules.mk new file mode 100644 index 000000000000..9ddf9717e942 --- /dev/null +++ b/keyboards/handwired/ep40/rules.mk @@ -0,0 +1,80 @@ +# 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 + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = 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 +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From 685cec47bb4d10de2642690a71cb2566bceffccb Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Tue, 30 Oct 2018 17:30:09 -0700 Subject: [PATCH 324/505] Configurator info.json fix for KBD19x The info.json had a random backslash, which invalidated the JSON structure. This commit fixes that issue. --- keyboards/kbd19x/info.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/keyboards/kbd19x/info.json b/keyboards/kbd19x/info.json index dd5cc700ccdf..31f2f9cf57eb 100644 --- a/keyboards/kbd19x/info.json +++ b/keyboards/kbd19x/info.json @@ -1,9 +1,9 @@ { - "keyboard_name": "KBD19x", - "url": "https://github.com/qmk/qmk_firmware/tree/master/keyboards/kbd19x", - "maintainer": "qmk", - "width": 19.5, - "height": 6.75, + "keyboard_name": "KBD19x", + "url": "https://github.com/qmk/qmk_firmware/tree/master/keyboards/kbd19x", + "maintainer": "qmk", + "width": 19.5, + "height": 6.75, "layouts": { "LAYOUT_ansi": { "key_count": 99, @@ -61,7 +61,7 @@ {"label":"8", "x":16.5, "y":2.5}, {"label":"9", "x":17.5, "y":2.5}, {"label":"+", "x":18.5, "y":2.5, "h":2}, - {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75},\ + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, {"label":"A", "x":1.75, "y":3.5}, {"label":"S", "x":2.75, "y":3.5}, {"label":"D", "x":3.75, "y":3.5}, From d147cf5ecefe9846d6d6b68ced498a4444754b03 Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Wed, 31 Oct 2018 14:07:34 +0000 Subject: [PATCH 325/505] Add support for planck/rev6 to dshields keymap. (#4304) --- keyboards/planck/keymaps/dshields/rules.mk | 24 ++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/keyboards/planck/keymaps/dshields/rules.mk b/keyboards/planck/keymaps/dshields/rules.mk index 033e3c9c4e62..300a8279041a 100644 --- a/keyboards/planck/keymaps/dshields/rules.mk +++ b/keyboards/planck/keymaps/dshields/rules.mk @@ -9,12 +9,20 @@ EXTRAKEY_ENABLE = no SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend API_SYSEX_ENABLE = no -ifneq (,$(findstring planck/light,$(KEYBOARD))) - AUDIO_ENABLE = yes - BACKLIGHT_ENABLE = no - RGB_MATRIX_ENABLE = yes -else - AUDIO_ENABLE = no - BACKLIGHT_ENABLE = yes - RGB_MATRIX_ENABLE = no +ifeq ($(strip $(KEYBOARD)), planck/rev3) + AUDIO_ENABLE = no + BACKLIGHT_ENABLE = yes + RGB_MATRIX_ENABLE = no endif +ifeq ($(strip $(KEYBOARD)), planck/rev6) + EXTRALDFLAGS = -Wl,--build-id=none + AUDIO_ENABLE = yes + BACKLIGHT_ENABLE = no + RGB_MATRIX_ENABLE = no +endif +ifeq ($(strip $(KEYBOARD)), planck/light) + AUDIO_ENABLE = yes + BACKLIGHT_ENABLE = no + RGB_MATRIX_ENABLE = yes +endif + From 75d657b5251c80b4d5a3de583d4ba97c10ac619f Mon Sep 17 00:00:00 2001 From: noroadsleft Date: Tue, 30 Oct 2018 18:22:30 -0700 Subject: [PATCH 326/505] Configurator info.json fix for XD87 --- keyboards/xd87/info.json | 291 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 291 insertions(+) diff --git a/keyboards/xd87/info.json b/keyboards/xd87/info.json index e69de29bb2d1..3837358cd320 100644 --- a/keyboards/xd87/info.json +++ b/keyboards/xd87/info.json @@ -0,0 +1,291 @@ +{ + "keyboard_name": "XD87", + "url": "", + "maintainer": "qmk", + "width": 18.25, + "height": 7.25, + "layouts": { + "LAYOUT_all": { + "layout": [ + { "label": "K00", "x": 0, "y": 0 }, + { "label": "K01", "x": 1, "y": 0 }, + { "label": "K02", "x": 2, "y": 0 }, + { "label": "K03", "x": 3, "y": 0 }, + { "label": "K04", "x": 4, "y": 0 }, + { "label": "K05", "x": 5, "y": 0 }, + { "label": "K06", "x": 6.5, "y": 0 }, + { "label": "K07", "x": 7.5, "y": 0 }, + { "label": "K08", "x": 8.5, "y": 0 }, + { "label": "K09", "x": 9.5, "y": 0 }, + { "label": "K0A", "x": 11, "y": 0 }, + { "label": "K0B", "x": 12, "y": 0 }, + { "label": "K0C", "x": 13, "y": 0 }, + { "label": "K0D", "x": 14, "y": 0 }, + { "label": "K0E", "x": 15.25, "y": 0 }, + { "label": "K0F", "x": 16.25, "y": 0 }, + { "label": "K0G", "x": 17.25, "y": 0 }, + { "label": "K10", "x": 0, "y": 1.25 }, + { "label": "K11", "x": 1, "y": 1.25 }, + { "label": "K12", "x": 2, "y": 1.25 }, + { "label": "K13", "x": 3, "y": 1.25 }, + { "label": "K14", "x": 4, "y": 1.25 }, + { "label": "K15", "x": 5, "y": 1.25 }, + { "label": "K16", "x": 6, "y": 1.25 }, + { "label": "K17", "x": 7, "y": 1.25 }, + { "label": "K18", "x": 8, "y": 1.25 }, + { "label": "K19", "x": 9, "y": 1.25 }, + { "label": "K1A", "x": 10, "y": 1.25 }, + { "label": "K1B", "x": 11, "y": 1.25 }, + { "label": "K1C", "x": 12, "y": 1.25 }, + { "label": "K1D", "x": 13, "y": 1.25 }, + { "label": "K3E", "x": 14, "y": 1.25 }, + { "label": "K1E", "x": 15.25, "y": 1.25 }, + { "label": "K1F", "x": 16.25, "y": 1.25 }, + { "label": "K1G", "x": 17.25, "y": 1.25 }, + { "label": "K20", "x": 0, "y": 2.25, "w": 1.5 }, + { "label": "K21", "x": 1.5, "y": 2.25 }, + { "label": "K22", "x": 2.5, "y": 2.25 }, + { "label": "K23", "x": 3.5, "y": 2.25 }, + { "label": "K24", "x": 4.5, "y": 2.25 }, + { "label": "K25", "x": 5.5, "y": 2.25 }, + { "label": "K26", "x": 6.5, "y": 2.25 }, + { "label": "K27", "x": 7.5, "y": 2.25 }, + { "label": "K28", "x": 8.5, "y": 2.25 }, + { "label": "K29", "x": 9.5, "y": 2.25 }, + { "label": "K2A", "x": 10.5, "y": 2.25 }, + { "label": "K2B", "x": 11.5, "y": 2.25 }, + { "label": "K2C", "x": 12.5, "y": 2.25 }, + { "label": "K2D", "x": 13.5, "y": 2.25, "w": 1.5 }, + { "label": "K2E", "x": 15.25, "y": 2.25 }, + { "label": "K2F", "x": 16.25, "y": 2.25 }, + { "label": "K2G", "x": 17.25, "y": 2.25 }, + { "label": "K30", "x": 0, "y": 3.25, "w": 1.75 }, + { "label": "K31", "x": 1.75, "y": 3.25 }, + { "label": "K32", "x": 2.75, "y": 3.25 }, + { "label": "K33", "x": 3.75, "y": 3.25 }, + { "label": "K34", "x": 4.75, "y": 3.25 }, + { "label": "K35", "x": 5.75, "y": 3.25 }, + { "label": "K36", "x": 6.75, "y": 3.25 }, + { "label": "K37", "x": 7.75, "y": 3.25 }, + { "label": "K38", "x": 8.75, "y": 3.25 }, + { "label": "K39", "x": 9.75, "y": 3.25 }, + { "label": "K3A", "x": 10.75, "y": 3.25 }, + { "label": "K3B", "x": 11.75, "y": 3.25 }, + { "label": "K3C", "x": 12.75, "y": 3.25 }, + { "label": "K3D", "x": 13.75, "y": 3.25, "w": 1.25 }, + { "label": "K40", "x": 0, "y": 4.25, "w": 1.25 }, + { "label": "K41", "x": 1.25, "y": 4.25 }, + { "label": "K42", "x": 2.25, "y": 4.25 }, + { "label": "K43", "x": 3.25, "y": 4.25 }, + { "label": "K44", "x": 4.25, "y": 4.25 }, + { "label": "K45", "x": 5.25, "y": 4.25 }, + { "label": "K46", "x": 6.25, "y": 4.25 }, + { "label": "K47", "x": 7.25, "y": 4.25 }, + { "label": "K48", "x": 8.25, "y": 4.25 }, + { "label": "K49", "x": 9.25, "y": 4.25 }, + { "label": "K4A", "x": 10.25, "y": 4.25 }, + { "label": "K4B", "x": 11.25, "y": 4.25 }, + { "label": "K4C", "x": 12.25, "y": 4.25, "w": 1.75 }, + { "label": "K4D", "x": 14, "y": 4.25 }, + { "label": "K4E", "x": 15.25, "y": 4.25 }, + { "label": "K4F", "x": 16.25, "y": 4.25 }, + { "label": "K4G", "x": 17.25, "y": 4.25 }, + { "label": "K50", "x": 0, "y": 5.25, "w": 1.5 }, + { "label": "K51", "x": 1.5, "y": 5.25 }, + { "label": "K52", "x": 2.5, "y": 5.25, "w": 1.5 }, + { "label": "K55", "x": 4, "y": 5.25, "w": 3 }, + { "label": "K58", "x": 7, "y": 5.25, "w": 3 }, + { "label": "K5A", "x": 10, "y": 5.25, "w": 1.25 }, + { "label": "K5B", "x": 11.25, "y": 5.25, "w": 1.25 }, + { "label": "K5C", "x": 12.5, "y": 5.25, "w": 1.25 }, + { "label": "K5D", "x": 13.75, "y": 5.25, "w": 1.25 }, + { "label": "K5E", "x": 15.25, "y": 5.25 }, + { "label": "K5F", "x": 16.25, "y": 5.25 }, + { "label": "K5G", "x": 17.25, "y": 5.25 } + ] + }, + "LAYOUT_tkl_ansi": { + "layout": [ + { "label": "Esc", "x": 0, "y": 0 }, + { "label": "F1", "x": 2, "y": 0 }, + { "label": "F2", "x": 3, "y": 0 }, + { "label": "F3", "x": 4, "y": 0 }, + { "label": "F4", "x": 5, "y": 0 }, + { "label": "F5", "x": 6.5, "y": 0 }, + { "label": "F6", "x": 7.5, "y": 0 }, + { "label": "F7", "x": 8.5, "y": 0 }, + { "label": "F8", "x": 9.5, "y": 0 }, + { "label": "F9", "x": 11, "y": 0 }, + { "label": "F10", "x": 12, "y": 0 }, + { "label": "F11", "x": 13, "y": 0 }, + { "label": "F12", "x": 14, "y": 0 }, + { "label": "Print Screen", "x": 15.25, "y": 0 }, + { "label": "Scroll Lock", "x": 16.25, "y": 0 }, + { "label": "Pause", "x": 17.25, "y": 0 }, + { "label": "`", "x": 0, "y": 1.25 }, + { "label": "1", "x": 1, "y": 1.25 }, + { "label": "2", "x": 2, "y": 1.25 }, + { "label": "3", "x": 3, "y": 1.25 }, + { "label": "4", "x": 4, "y": 1.25 }, + { "label": "5", "x": 5, "y": 1.25 }, + { "label": "6", "x": 6, "y": 1.25 }, + { "label": "7", "x": 7, "y": 1.25 }, + { "label": "8", "x": 8, "y": 1.25 }, + { "label": "9", "x": 9, "y": 1.25 }, + { "label": "0", "x": 10, "y": 1.25 }, + { "label": "-", "x": 11, "y": 1.25 }, + { "label": "=", "x": 12, "y": 1.25 }, + { "label": "Backspace", "x": 13, "y": 1.25, "w": 2 }, + { "label": "Insert", "x": 15.25, "y": 1.25 }, + { "label": "Home", "x": 16.25, "y": 1.25 }, + { "label": "PgUp", "x": 17.25, "y": 1.25 }, + { "label": "Tab", "x": 0, "y": 2.25, "w": 1.5 }, + { "label": "Q", "x": 1.5, "y": 2.25 }, + { "label": "W", "x": 2.5, "y": 2.25 }, + { "label": "E", "x": 3.5, "y": 2.25 }, + { "label": "R", "x": 4.5, "y": 2.25 }, + { "label": "T", "x": 5.5, "y": 2.25 }, + { "label": "Y", "x": 6.5, "y": 2.25 }, + { "label": "U", "x": 7.5, "y": 2.25 }, + { "label": "I", "x": 8.5, "y": 2.25 }, + { "label": "O", "x": 9.5, "y": 2.25 }, + { "label": "P", "x": 10.5, "y": 2.25 }, + { "label": "[", "x": 11.5, "y": 2.25 }, + { "label": "]", "x": 12.5, "y": 2.25 }, + { "label": "\\", "x": 13.5, "y": 2.25, "w": 1.5 }, + { "label": "Delete", "x": 15.25, "y": 2.25 }, + { "label": "End", "x": 16.25, "y": 2.25 }, + { "label": "PgDn", "x": 17.25, "y": 2.25 }, + { "label": "Caps Lock", "x": 0, "y": 3.25, "w": 1.75 }, + { "label": "A", "x": 1.75, "y": 3.25 }, + { "label": "S", "x": 2.75, "y": 3.25 }, + { "label": "D", "x": 3.75, "y": 3.25 }, + { "label": "F", "x": 4.75, "y": 3.25 }, + { "label": "G", "x": 5.75, "y": 3.25 }, + { "label": "H", "x": 6.75, "y": 3.25 }, + { "label": "J", "x": 7.75, "y": 3.25 }, + { "label": "K", "x": 8.75, "y": 3.25 }, + { "label": "L", "x": 9.75, "y": 3.25 }, + { "label": ";", "x": 10.75, "y": 3.25 }, + { "label": "'", "x": 11.75, "y": 3.25 }, + { "label": "Enter", "x": 12.75, "y": 3.25, "w": 2.25 }, + { "label": "Shift", "x": 0, "y": 4.25, "w": 2.25 }, + { "label": "Z", "x": 2.25, "y": 4.25 }, + { "label": "X", "x": 3.25, "y": 4.25 }, + { "label": "C", "x": 4.25, "y": 4.25 }, + { "label": "V", "x": 5.25, "y": 4.25 }, + { "label": "B", "x": 6.25, "y": 4.25 }, + { "label": "N", "x": 7.25, "y": 4.25 }, + { "label": "M", "x": 8.25, "y": 4.25 }, + { "label": ",", "x": 9.25, "y": 4.25 }, + { "label": ".", "x": 10.25, "y": 4.25 }, + { "label": "/", "x": 11.25, "y": 4.25 }, + { "label": "Shift", "x": 12.25, "y": 4.25, "w": 2.75 }, + { "label": "Up", "x": 16.25, "y": 4.25 }, + { "label": "Ctrl", "x": 0, "y": 5.25, "w": 1.25 }, + { "label": "Win", "x": 1.25, "y": 5.25, "w": 1.25 }, + { "label": "Alt", "x": 2.5, "y": 5.25, "w": 1.25 }, + { "label": "Space", "x": 3.75, "y": 5.25, "w": 6.25 }, + { "label": "Alt", "x": 10, "y": 5.25, "w": 1.25 }, + { "label": "Win", "x": 11.25, "y": 5.25, "w": 1.25 }, + { "label": "Menu", "x": 12.5, "y": 5.25, "w": 1.25 }, + { "label": "Ctrl", "x": 13.75, "y": 5.25, "w": 1.25 }, + { "label": "Left", "x": 15.25, "y": 5.25 }, + { "label": "Down", "x": 16.25, "y": 5.25 }, + { "label": "Right", "x": 17.25, "y": 5.25 } + ] + }, + "LAYOUT_tkl_iso": { + "layout": [ + { "label": "Esc", "x": 0, "y": 0 }, + { "label": "F1", "x": 2, "y": 0 }, + { "label": "F2", "x": 3, "y": 0 }, + { "label": "F3", "x": 4, "y": 0 }, + { "label": "F4", "x": 5, "y": 0 }, + { "label": "F5", "x": 6.5, "y": 0 }, + { "label": "F6", "x": 7.5, "y": 0 }, + { "label": "F7", "x": 8.5, "y": 0 }, + { "label": "F8", "x": 9.5, "y": 0 }, + { "label": "F9", "x": 11, "y": 0 }, + { "label": "F10", "x": 12, "y": 0 }, + { "label": "F11", "x": 13, "y": 0 }, + { "label": "F12", "x": 14, "y": 0 }, + { "label": "Print Screen", "x": 15.25, "y": 0 }, + { "label": "Scroll Lock", "x": 16.25, "y": 0 }, + { "label": "Pause", "x": 17.25, "y": 0 }, + { "label": "`", "x": 0, "y": 1.25 }, + { "label": "1", "x": 1, "y": 1.25 }, + { "label": "2", "x": 2, "y": 1.25 }, + { "label": "3", "x": 3, "y": 1.25 }, + { "label": "4", "x": 4, "y": 1.25 }, + { "label": "5", "x": 5, "y": 1.25 }, + { "label": "6", "x": 6, "y": 1.25 }, + { "label": "7", "x": 7, "y": 1.25 }, + { "label": "8", "x": 8, "y": 1.25 }, + { "label": "9", "x": 9, "y": 1.25 }, + { "label": "0", "x": 10, "y": 1.25 }, + { "label": "-", "x": 11, "y": 1.25 }, + { "label": "=", "x": 12, "y": 1.25 }, + { "label": "Backspace", "x": 13, "y": 1.25, "w": 2 }, + { "label": "Insert", "x": 15.25, "y": 1.25 }, + { "label": "Home", "x": 16.25, "y": 1.25 }, + { "label": "PgUp", "x": 17.25, "y": 1.25 }, + { "label": "Tab", "x": 0, "y": 2.25, "w": 1.5 }, + { "label": "Q", "x": 1.5, "y": 2.25 }, + { "label": "W", "x": 2.5, "y": 2.25 }, + { "label": "E", "x": 3.5, "y": 2.25 }, + { "label": "R", "x": 4.5, "y": 2.25 }, + { "label": "T", "x": 5.5, "y": 2.25 }, + { "label": "Y", "x": 6.5, "y": 2.25 }, + { "label": "U", "x": 7.5, "y": 2.25 }, + { "label": "I", "x": 8.5, "y": 2.25 }, + { "label": "O", "x": 9.5, "y": 2.25 }, + { "label": "P", "x": 10.5, "y": 2.25 }, + { "label": "[", "x": 11.5, "y": 2.25 }, + { "label": "]", "x": 12.5, "y": 2.25 }, + { "label": "Delete", "x": 15.25, "y": 2.25 }, + { "label": "End", "x": 16.25, "y": 2.25 }, + { "label": "PgDn", "x": 17.25, "y": 2.25 }, + { "label": "Caps Lock", "x": 0, "y": 3.25, "w": 1.75 }, + { "label": "A", "x": 1.75, "y": 3.25 }, + { "label": "S", "x": 2.75, "y": 3.25 }, + { "label": "D", "x": 3.75, "y": 3.25 }, + { "label": "F", "x": 4.75, "y": 3.25 }, + { "label": "G", "x": 5.75, "y": 3.25 }, + { "label": "H", "x": 6.75, "y": 3.25 }, + { "label": "J", "x": 7.75, "y": 3.25 }, + { "label": "K", "x": 8.75, "y": 3.25 }, + { "label": "L", "x": 9.75, "y": 3.25 }, + { "label": ";", "x": 10.75, "y": 3.25 }, + { "label": "'", "x": 11.75, "y": 3.25 }, + { "label": "#", "x": 12.75, "y": 3.25 }, + { "label": "Enter", "x": 13.75, "y": 2.25, "w": 1.25, "h": 2 }, + { "label": "Shift", "x": 0, "y": 4.25, "w": 1.25 }, + { "label": "\\", "x": 1.25, "y": 4.25 }, + { "label": "Z", "x": 2.25, "y": 4.25 }, + { "label": "X", "x": 3.25, "y": 4.25 }, + { "label": "C", "x": 4.25, "y": 4.25 }, + { "label": "V", "x": 5.25, "y": 4.25 }, + { "label": "B", "x": 6.25, "y": 4.25 }, + { "label": "N", "x": 7.25, "y": 4.25 }, + { "label": "M", "x": 8.25, "y": 4.25 }, + { "label": ",", "x": 9.25, "y": 4.25 }, + { "label": ".", "x": 10.25, "y": 4.25 }, + { "label": "/", "x": 11.25, "y": 4.25 }, + { "label": "Shift", "x": 12.25, "y": 4.25, "w": 2.75 }, + { "label": "Up", "x": 16.25, "y": 4.25 }, + { "label": "Ctrl", "x": 0, "y": 5.25, "w": 1.25 }, + { "label": "Win", "x": 1.25, "y": 5.25, "w": 1.25 }, + { "label": "Alt", "x": 2.5, "y": 5.25, "w": 1.25 }, + { "label": "Space", "x": 3.75, "y": 5.25, "w": 6.25 }, + { "label": "AltGr", "x": 10, "y": 5.25, "w": 1.25 }, + { "label": "Win", "x": 11.25, "y": 5.25, "w": 1.25 }, + { "label": "Menu", "x": 12.5, "y": 5.25, "w": 1.25 }, + { "label": "Ctrl", "x": 13.75, "y": 5.25, "w": 1.25 }, + { "label": "Left", "x": 15.25, "y": 5.25 }, + { "label": "Down", "x": 16.25, "y": 5.25 }, + { "label": "Right", "x": 17.25, "y": 5.25 } + ] + } + } +} From 5630ad7604f7a8243ef9b643a4409fc8f9f96ed0 Mon Sep 17 00:00:00 2001 From: That-Canadian Date: Wed, 31 Oct 2018 17:42:15 -0400 Subject: [PATCH 327/505] Added JTAG disable code to the split_common (#4309) Added JTAG disable code to the split_common slave code since the slave never calls keyboard_init(). In the future the slave should likely be modified to call keyboard_init() in some way, but without calling any of the unnecessary USB initialization code. --- quantum/split_common/split_util.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index 7c87de4d9bde..7ca68c56cdb5 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -93,6 +93,10 @@ void split_keyboard_setup(void) { } void keyboard_slave_loop(void) { + // Disable JTAG since we skip calling keyboard_init() on the slave side + // Future fix will possible call keyboard_init() on the slave to remove this need + disable_JTAG(); + matrix_init(); //Init RGB @@ -152,3 +156,13 @@ void matrix_setup(void) { keyboard_slave_loop(); } } + +// Temporary code to disable JTAG on the slave board +void disable_JTAG(void) { + /* Copied from tmk_core/common/keybaord.c */ + // To use PORTF disable JTAG with writing JTD bit twice within four cycles. + #if (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) || defined(__AVR_ATmega32U4__)) + MCUCR |= _BV(JTD); + MCUCR |= _BV(JTD); + #endif +} From bd6d6d93f26578baf7ef1d05d51963d8c38ee7c9 Mon Sep 17 00:00:00 2001 From: Danny Date: Wed, 31 Oct 2018 17:43:39 -0400 Subject: [PATCH 328/505] Update iris 3 (#4307) * Fix incorrect LED pin assignment * Strip out extra newline --- keyboards/iris/rev1/config.h | 1 - keyboards/iris/rev1_led/config.h | 1 - keyboards/iris/rev2/config.h | 1 - keyboards/iris/rev3/config.h | 3 +-- 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/keyboards/iris/rev1/config.h b/keyboards/iris/rev1/config.h index 3c088f671125..7f76df54ba1a 100644 --- a/keyboards/iris/rev1/config.h +++ b/keyboards/iris/rev1/config.h @@ -63,7 +63,6 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 - #define RGBLED_NUM 12 // Number of LEDs /* diff --git a/keyboards/iris/rev1_led/config.h b/keyboards/iris/rev1_led/config.h index d8571f8daf01..b58b11836a1e 100644 --- a/keyboards/iris/rev1_led/config.h +++ b/keyboards/iris/rev1_led/config.h @@ -63,7 +63,6 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 - #define RGBLED_NUM 12 // Number of LEDs /* diff --git a/keyboards/iris/rev2/config.h b/keyboards/iris/rev2/config.h index 087e0f69e585..266c29b9c99e 100644 --- a/keyboards/iris/rev2/config.h +++ b/keyboards/iris/rev2/config.h @@ -63,7 +63,6 @@ along with this program. If not, see . /* ws2812 RGB LED */ #define RGB_DI_PIN D3 - #define RGBLED_NUM 12 // Number of LEDs /* diff --git a/keyboards/iris/rev3/config.h b/keyboards/iris/rev3/config.h index 3329a4edb2f2..1032231d8982 100644 --- a/keyboards/iris/rev3/config.h +++ b/keyboards/iris/rev3/config.h @@ -58,12 +58,11 @@ along with this program. If not, see . keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) -#define BACKLIGHT_PIN B5 +#define BACKLIGHT_PIN B6 #define BACKLIGHT_LEVELS 5 /* ws2812 RGB LED */ #define RGB_DI_PIN F7 - #define RGBLED_NUM 12 // Number of LEDs /* From f63c0b784490a04069b59f1b77355d5982f55ceb Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 31 Oct 2018 15:14:59 -0700 Subject: [PATCH 329/505] Add pointer(?) to disable_JTAG to prevent compiler errors (#4310) --- quantum/split_common/split_util.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index 7ca68c56cdb5..8d39329d460f 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -92,13 +92,14 @@ void split_keyboard_setup(void) { sei(); } +void disable_JTAG(void); void keyboard_slave_loop(void) { // Disable JTAG since we skip calling keyboard_init() on the slave side // Future fix will possible call keyboard_init() on the slave to remove this need disable_JTAG(); - + matrix_init(); - + //Init RGB #ifdef RGBLIGHT_ENABLE rgblight_init(); @@ -107,7 +108,7 @@ void keyboard_slave_loop(void) { while (1) { // Matrix Slave Scan matrix_slave_scan(); - + // Read Backlight Info #ifdef BACKLIGHT_ENABLE #ifdef USE_I2C @@ -126,14 +127,14 @@ void keyboard_slave_loop(void) { // Disable interupts (RGB data is big) cli(); // Create new DWORD for RGB data - uint32_t dword; - + uint32_t dword; + // Fill the new DWORD with the data that was sent over uint8_t *dword_dat = (uint8_t *)(&dword); for (int i = 0; i < 4; i++) { dword_dat[i] = i2c_slave_buffer[I2C_RGB_START+i]; } - + // Update the RGB now with the new data and set RGB_DIRTY to false rgblight_update_dword(dword); RGB_DIRTY = false; From 99740c670a4ece47095ec91d2ca71e56d7dd244c Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Wed, 31 Oct 2018 22:27:57 -0700 Subject: [PATCH 330/505] Add some more useful features to my alps64 AEK layout (#4312) * Add mod-tap to right mods and shift * Add del to fn1 layer and add fn2 layer for media and pcb debug --- keyboards/alps64/keymaps/crd/keymap.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/keyboards/alps64/keymaps/crd/keymap.c b/keyboards/alps64/keymaps/crd/keymap.c index a47ad865040f..4f3ea446eced 100644 --- a/keyboards/alps64/keymaps/crd/keymap.c +++ b/keyboards/alps64/keymaps/crd/keymap.c @@ -6,17 +6,26 @@ 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, 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, 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, KC_ENT, - 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, - MO(1), KC_LALT, KC_LGUI, KC_SPC, _______, KC_RGUI, KC_RALT, MO(2) + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RSFT_T(KC_UP), _______, + MO(1), KC_LALT, KC_LGUI, KC_SPC, _______, RGUI_T(KC_LEFT), RALT_T(KC_DOWN), LT(2, KC_RIGHT) ), /* 1: fn1 */ LAYOUT_all( - _______, 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_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_PGUP, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_END, KC_PGDOWN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -}; + /* 2: fn2 */ + LAYOUT_all( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, + _______, _______, _______, DEBUG, _______, _______, _______, _______, _______, _______, KC_SCROLLLOCK, KC_PAUSE, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), +} +; const uint16_t PROGMEM fn_actions[] = {}; From 153d1ecfcc60ad84139cd95a03d08e0e4b7d11ec Mon Sep 17 00:00:00 2001 From: Jason Yamada-Hanff Date: Thu, 1 Nov 2018 16:52:47 -0700 Subject: [PATCH 331/505] Keymap: add jyh levinson keymaps (#4284) * Keymap: add jyh levinson keymaps remove tap dance number keys due to sluggish responses simplify I2C configuration reverse hyper and meh positions reduce tapping term to allow fast typing with mod tap space keys remove Alt hold on right space key. too many false touches. add vim-style arrows (hjkl) on asdf; semicolon/quote on raise correct documentation string for jyh levinson layout add alternative levinson layout for jyh more inspiration from atreus keyboard. keeps shift in the expected places. reduces number of layers. puts numpad layout easily accessible. places important keys on palms and meta keys on top corners for xmonad. correct layer switching in jyh2 levinson layout I was getting stuck on the numpad layer because the numpad hold key was remapped once the layer was activated. Bad idea. Minor other refinements. use curly bracket { instead of brace [ on raise layer add RGB keys on adjust layer bootmagic key is confusing. turn it off. try out permissive hold setting to make mod-tap better remove hold for right control on quote key. too many mistakes turn off permissive hold. it was causing unexpected behavior enable rgb underglow animations add make it pink/blue key to levinson layout prevent stuck modifiers in jyh2 levinson keymap * fix up deprecated code after code review * remove PREVENT_STUCK_MODIFIERS because it is default Co-Authored-By: yamad --- keyboards/levinson/keymaps/jyh/config.h | 29 +++ keyboards/levinson/keymaps/jyh/keymap.c | 215 +++++++++++++++++++++ keyboards/levinson/keymaps/jyh/readme.md | 32 ++++ keyboards/levinson/keymaps/jyh/rules.mk | 1 + keyboards/levinson/keymaps/jyh2/config.h | 33 ++++ keyboards/levinson/keymaps/jyh2/keymap.c | 222 ++++++++++++++++++++++ keyboards/levinson/keymaps/jyh2/readme.md | 32 ++++ keyboards/levinson/keymaps/jyh2/rules.mk | 2 + 8 files changed, 566 insertions(+) create mode 100644 keyboards/levinson/keymaps/jyh/config.h create mode 100644 keyboards/levinson/keymaps/jyh/keymap.c create mode 100644 keyboards/levinson/keymaps/jyh/readme.md create mode 100644 keyboards/levinson/keymaps/jyh/rules.mk create mode 100644 keyboards/levinson/keymaps/jyh2/config.h create mode 100644 keyboards/levinson/keymaps/jyh2/keymap.c create mode 100644 keyboards/levinson/keymaps/jyh2/readme.md create mode 100644 keyboards/levinson/keymaps/jyh2/rules.mk diff --git a/keyboards/levinson/keymaps/jyh/config.h b/keyboards/levinson/keymaps/jyh/config.h new file mode 100644 index 000000000000..d3e598bd09ae --- /dev/null +++ b/keyboards/levinson/keymaps/jyh/config.h @@ -0,0 +1,29 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +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 . +*/ +#pragma once + +/* Select hand configuration */ +#define MASTER_LEFT + +/* Tap Dance timing */ +#define TAPPING_TERM 150 + +/* Toggling layer requires # taps */ +#define TAPPING_TOGGLE 2 diff --git a/keyboards/levinson/keymaps/jyh/keymap.c b/keyboards/levinson/keymaps/jyh/keymap.c new file mode 100644 index 000000000000..d8cfa7e06b1d --- /dev/null +++ b/keyboards/levinson/keymaps/jyh/keymap.c @@ -0,0 +1,215 @@ +#include QMK_KEYBOARD_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 _LOWER 3 /* Symbols, Media */ +#define _RAISE 4 /* Numbers, Arrows */ +#define _FUNC 5 /* Function Keys */ +#define _NUMS 6 /* Numpad */ +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, +}; + +// Fillers to make layering more clear +#define KC_ KC_TRNS + +// tap toggle numpad on +#define NUMPAD TT(_NUMS) + +// Mod Tap Definitions +// ------------------- + // Tap Hold + // ------------------ +#define CTL_ESC MT(MOD_LCTL, KC_ESC) // Esc Left Control +#define SFT_ENT MT(MOD_RSFT, KC_ENT) // Enter Right Shift +#define CTL_SPC MT(MOD_LCTL, KC_SPC) // Space Left Control +#define ALT_SPC MT(MOD_LALT, KC_SPC) // Space Left Alt +#define ALT_BSP MT(MOD_LALT, KC_BSPC) // Bkspace Left Alt +#define HPR_TAB MT(MOD_HYPR, KC_TAB) // Tab Hyper (Super+Ctrl+Alt+Shift) +#define HPR_GRV MT(MOD_HYPR, KC_GRV) // ` Hyper +#define HPR_TIL MT(MOD_HYPR, KC_TILD) // ~ Hyper +#define MEH_TIL MT(MOD_MEH, KC_GRV) // ` Meh (Ctrl+Alt+Shift) +#define SFT_MIN MT(MOD_LSFT, KC_MINS) // - Left Shift +#define NPD_UND LT(_NUMS, KC_UNDS) // _ Layer Numpad +#define FNC_PIP LT(_FUNC, KC_PIPE) // | Layer Function Keys + +#define CTL_DEL MT(MOD_LCTL, KC_DEL) // Del Left Control +#define CTL_QOT MT(MOD_RCTL, KC_QUOT) // ' Right Control +#define CTL_BSL MT(MOD_RCTL, KC_BSLS) // \ Right Control +#define CTL_PIP MT(MOD_RCTL, KC_PIPE) // | Right Control + +// Redefine for LAYOUT_kc +#define KC_CTL_BSL CTL_BSL +#define KC_CTL_PIP CTL_PIP +#define KC_CTL_DEL CTL_DEL +#define KC_HPR_TIL HPR_TIL +#define KC_HPR_GRV HPR_GRV + + +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 | ; | ' | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | - | Z | X | C | V | B | | N | M | , | . | / | Enter| + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Numpd| Meh | Meta | Alt | Lower| Space| | Space| Raise| Alt | Meta | Hyper| Func | + * `-----------------------------------------' `-----------------------------------------' + * + * with Hold (Emacs-oriented) + * ,-----------------------------------------. ,-----------------------------------------. + * | Hyper| | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | | | | | | | | | | | Ctrl | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| | | | | | | | | | | | Shift| + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * `-----------------------------------------' `-----------------------------------------' + */ + [_QWERTY] = LAYOUT_ortho_4x12( + 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, CTL_QOT, + SFT_MIN, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, SFT_ENT, + NUMPAD , KC_MEH , KC_LGUI, KC_LALT, LOWER, CTL_SPC, KC_SPC, RAISE, KC_RALT, KC_RGUI, KC_HYPR, MO(_FUNC) + ), + + +/* Raise + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | Left | Up | Down | Right| ( | | ) | - | = | [ | ] | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | ; | ' | * | , | { | | } | _ | + | . | / | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * `-----------------------------------------' `-----------------------------------------' + */ + [_RAISE] = LAYOUT_kc_ortho_4x12( + HPR_GRV, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , , + ,LEFT, UP ,DOWN,RGHT,LPRN, RPRN,MINS, EQL,LBRC,RBRC,CTL_PIP, + ,COLN,QUOT,ASTR,COMM,LCBR, RCBR,UNDS,PLUS, , , , + , , , , , , , , , , , + ), + +/* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Del | Vol+ | Mute | Play | PgUp | : | | ' | - | = | [ | ] | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | Vol- | < M | M > | PgDn | ; | | " | | | , | . | / | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * `-----------------------------------------' `-----------------------------------------' + */ + [_LOWER] = LAYOUT_kc_ortho_4x12( + HPR_TIL,EXLM, AT ,HASH,DLR , PERC , CIRC,AMPR,ASTR,LPRN,RPRN, , + CTL_DEL,VOLU,MUTE,MPLY,PGUP, COLN , QUOT,MINS, EQL,LBRC,RBRC,CTL_BSL, + ,VOLD,MPRV,MNXT,PGDN, SCLN , DQUO,PIPE,COMM, DOT,SLSH, , + , , , , , , , , , , , + ), + + [_FUNC] = LAYOUT_kc_ortho_4x12( +// ,----+----+----+----+----+----. ,----+----+----+----+----+----. + , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 , F10, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + , F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + , F21, F22, F23, F24, NO , NO , NO , NO , NO , NO , , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , +// `----+----+----+----+----+----' `----+----+----+----+----+----' + ), + + [_NUMS] = LAYOUT_kc_ortho_4x12( +// ,----+----+----+----+----+----. ,----+----+----+----+----+----. + , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,SLSH, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + ,CAPS, INS,HOME,PGUP,LPRN, RPRN, 4 , 5 , 6 ,ASTR, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + ,NLCK, DEL, END,PGDN,SCLN, COMM, 1 , 2 , 3 ,MINS, , +// |----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , 0 ,DOT ,EQL ,PLUS, +// `----+----+----+----+----+----' `----+----+----+----+----+----' + ), + + [_ADJUST] = LAYOUT_ortho_4x12( +// ,-------+--------+--------+--------+--------+--------. ,-------+--------+--------+--------+--------+--------. + RESET , XXXXXXX, KC_UP , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DEL , \ +// |-------+--------+--------+--------+--------+--------| |-------+--------+--------+--------+--------+--------| + _______, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, BL_TOGG, BL_STEP, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ +// |-------+--------+--------+--------+--------+--------| |-------+--------+--------+--------+--------+--------| + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, \ +// |-------+--------+--------+--------+--------+--------| |-------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ +// `-------+--------+--------+--------+--------+--------' `-------+--------+--------+--------+--------+--------, + ) + +/* + * ,-----------------------------------------. ,-----------------------------------------. + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * `-----------------------------------------' `-----------------------------------------' + */ +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + 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; +} diff --git a/keyboards/levinson/keymaps/jyh/readme.md b/keyboards/levinson/keymaps/jyh/readme.md new file mode 100644 index 000000000000..e20424e51809 --- /dev/null +++ b/keyboards/levinson/keymaps/jyh/readme.md @@ -0,0 +1,32 @@ +# jyh's levinson layout + +[Levinson](https://keeb.io/products/levinson-lets-split-w-led-backlight) +built on rev2 PCBs. A split 4x12 keyboard with LED backlights. + +The layout is oriented towards needs for programming, Emacs, XMonad, +and experience with 60% keyboards with no base layer arrow keys +(Poker). It makes heavy use of modifiers and layers. + +## Layout features + + * Extensive use of _Mod Tap_, e.g. + * Tap sends Esc, Hold sends Left Control + * Tap sends Enter, Hold sends Right Shift + * ... and many more + * Hyper and Meh keys + * Right modifier keys in place of arrow keys + * Arrows are instead available in two alternate locations: + * WASD arrows on _Adjust_ + * Arrow cluster on _Raise_ (inspired by hexwire) + * Centered symbol/bracket cluster on _Lower/Raise_ + * Inspired by hexwire layout + * Programming-oriented + * Spacebar sends modifier keys on hold (_this is finicky in practice. may shut off completely_) + * Control ~~and Alt/Meta~~ on left ~~and right~~ space, respectively + * Strict space available on _Function_ and _Numpad_ layers + * For Emacs keychords + * Extra dedicated layers + * Numpad (available with tap toggle) + * Function key (F01-24) + * Redunant keys where it is convenient to have characters together + on one layer diff --git a/keyboards/levinson/keymaps/jyh/rules.mk b/keyboards/levinson/keymaps/jyh/rules.mk new file mode 100644 index 000000000000..66110cfcc0f1 --- /dev/null +++ b/keyboards/levinson/keymaps/jyh/rules.mk @@ -0,0 +1 @@ +BACKLIGHT_ENABLE=yes diff --git a/keyboards/levinson/keymaps/jyh2/config.h b/keyboards/levinson/keymaps/jyh2/config.h new file mode 100644 index 000000000000..f50674bb88e4 --- /dev/null +++ b/keyboards/levinson/keymaps/jyh2/config.h @@ -0,0 +1,33 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +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 . +*/ +#pragma once + +/* Select hand configuration */ +#define MASTER_LEFT + +/* Tap Dance timing */ +#define TAPPING_TERM 150 + +/* Toggling layer requires # taps */ +#define TAPPING_TOGGLE 3 + +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 12 + diff --git a/keyboards/levinson/keymaps/jyh2/keymap.c b/keyboards/levinson/keymaps/jyh2/keymap.c new file mode 100644 index 000000000000..4b7442928e4e --- /dev/null +++ b/keyboards/levinson/keymaps/jyh2/keymap.c @@ -0,0 +1,222 @@ +#include QMK_KEYBOARD_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 _LOWER 3 /* Symbols, Media */ +#define _RAISE 4 /* Numbers, Arrows */ +#define _FUNC 5 /* Function Keys */ +#define _NUMS 6 /* Numpad */ +#define _ADJUST 16 + +/* short layer aliases */ +#define _QW _QWERTY +#define _LW _LOWER +#define _RS _RAISE +#define _NM _NUMS +#define _AD _ADJUST + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, + MKITPNK, + DYNAMIC_MACRO_RANGE +}; + +#include "dynamic_macro.h" + +#define DREC_1 DYN_REC_START1 +#define DREC_2 DYN_REC_START2 +#define DPLAY_1 DYN_MACRO_PLAY1 +#define DPLAY_2 DYN_MACRO_PLAY2 +#define DSTOP DYN_REC_STOP + + +// Mod Tap Definitions +// ------------------- + // Tap Hold + // ------------------ +#define GUI_GRV MT(MOD_LGUI, KC_GRV) // ` Meta +#define CTL_ESC MT(MOD_LCTL, KC_ESC) // Esc Left Control +#define SFT_MIN MT(MOD_LSFT, KC_MINS) // - Left Shift +#define MEH_LBC MT(MOD_MEH, KC_LBRC) // [ Meh +#define CTL_BSP MT(MOD_LCTL, KC_BSPC) // Bkspce Left Control +#define HPR_RBC MT(MOD_HYPR, KC_RBRC) // ] Hyper +#define SFT_EQL MT(MOD_RSFT, KC_EQL) // = Right Shift +#define GUI_BSL MT(MOD_RGUI, KC_BSLS) // \ Meta + +#define NUM_TAB LT(_NUMS, KC_TAB) // Tab Layer Numpad + +#define CTL_DEL MT(MOD_LCTL, KC_DEL) // Del Left Control + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,-----------------------------------------. ,-----------------------------------------. + * | ` | Q | W | E | R | T | | Y | U | I | O | P | \ | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Esc | A | S | D | F | G | | H | J | K | L | ; | ' | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | - | Z | X | C | V | B | | N | M | , | . | / | = | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Tab | [ | Meta | Alt | Lower| Bksp | | Space| Raise| Alt | Meta | ] | Enter| + * `-----------------------------------------' `-----------------------------------------' + * with Hold (Emacs-oriented) + * ,-----------------------------------------. ,-----------------------------------------. + * | Meta | | | | | | | | | | | | Meta | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Ctrl | | | | | | | | | | | | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Shift| | | | | | | | | | | | Shift| + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Numpd| Meh | | | | Ctrl | | | | | | Hyper| | + * `-----------------------------------------' `-----------------------------------------' + */ + [_QW] = LAYOUT_ortho_4x12( + GUI_GRV, KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , GUI_BSL, + CTL_ESC, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT, + SFT_MIN, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, SFT_EQL, + NUM_TAB, MEH_LBC, KC_LGUI, KC_LALT, LOWER , CTL_BSP, KC_SPC , RAISE , KC_RALT, KC_RGUI, HPR_RBC, KC_ENT + ), + +/* Raise + * ,-----------------------------------------. ,-----------------------------------------. + * | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | Left | Up | Down | Right| ; | | ' | 4 | 5 | 6 | * | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | { | } | ( | ) | , | | - | 1 | 2 | 3 | / | = | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | |Adjust| | | | RAISE| . | 0 | + | Enter| + * `-----------------------------------------' `-----------------------------------------' + */ + [_RS] = LAYOUT_ortho_4x12( + _______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , _______, + _______, KC_LEFT, KC_UP , KC_DOWN, KC_RGHT, KC_SCLN, KC_QUOT, KC_4 , KC_5 , KC_6 , KC_ASTR, _______, + _______, KC_LCBR, KC_RCBR, KC_LPRN, KC_RPRN, KC_COMM, KC_MINS, KC_1 , KC_2 , KC_3 , KC_SLSH, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_DOT , KC_0 , KC_PLUS, _______ + ), + +/* Lower + * ,-----------------------------------------. ,-----------------------------------------. + * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Del | Vol+ | Mute | Play | PgUp | Home | | F1 | F2 | F3 | F4 | F5 | F6 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | Vol- | < M | M > | PgDn | End | | F7 | F8 | F9 | F10 | F11 | F12 | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | |LOWER | | | |Adjust| | | | Enter| + * `-----------------------------------------' `-----------------------------------------' + */ + [_LW] = LAYOUT_ortho_4x12( + _______, KC_EXLM, KC_AT , KC_HASH, KC_DLR , KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, + CTL_DEL, KC_VOLU, KC_MUTE, KC_MPLY, KC_PGUP, KC_HOME, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , + _______, KC_VOLD, KC_MPRV, KC_MNXT, KC_PGDN, KC_END , KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +/* Numpad + * ,-----------------------------------------. ,-----------------------------------------. + * | | | PrSc | ScrLk| Pause| | | | 7 | 8 | 9 | 0 | Lock | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | Ins | Home | PgUp | | | | 4 | 5 | 6 | / | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | Del | End | PgDn | | | | 1 | 2 | 3 | * | = | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * |NUMPAD| | | | | | | | 0 | . | + | - | Enter| + * `-----------------------------------------' `-----------------------------------------' + */ + [_NM] = LAYOUT_ortho_4x12( + XXXXXXX, XXXXXXX, KC_PSCR, KC_SLCK, KC_PAUS, XXXXXXX, XXXXXXX, KC_7 , KC_8 , KC_9 , KC_0 , TO(_NM), + XXXXXXX, XXXXXXX, KC_INS , KC_HOME, KC_PGUP, XXXXXXX, XXXXXXX, KC_4 , KC_5 , KC_6 , KC_SLSH, XXXXXXX, + XXXXXXX, XXXXXXX, KC_DEL , KC_END , KC_PGDN, XXXXXXX, XXXXXXX, KC_1 , KC_2 , KC_3 , KC_ASTR, KC_EQL , + _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, KC_0 , KC_DOT , KC_PLUS, KC_MINS, _______ + ), + +/* Adjust + * ,-----------------------------------------. ,-----------------------------------------. + * | Reset| | Up | | | Rec1 | | Rec2 | Plain| Snake|Gradnt| | Del | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | Caps | Left | Down | Right|MkItPk| Play1| | Play2| RGB | HUE+ | SAT+ | BRI+ | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | Stop1| | Stop2| MODE | HUE- | SAT- | BRI- | | + * |------+------+------+------+------+------| |------+------+------+------+------+------| + * | | | | | | | | | | | | | | + * `-----------------------------------------' `-----------------------------------------' + */ + [_ADJUST] = LAYOUT_ortho_4x12( + RESET , XXXXXXX, KC_UP , XXXXXXX, XXXXXXX, DREC_1 , DREC_2 , RGB_M_P, RGB_M_SN,RGB_M_G, XXXXXXX, KC_DEL , + KC_CAPS, KC_LEFT, KC_DOWN, KC_RGHT, MKITPNK, DPLAY_1, DPLAY_2, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, _______, + _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DSTOP , DSTOP , RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; + +void make_it_pink_blue(void) { + uint16_t blue_hue = 210; + uint16_t pink_hue = 315; + + /* key is pressed */ + uint16_t hue = rgblight_get_hue(); + uint8_t sat = rgblight_get_sat(); + uint8_t val = rgblight_get_val(); + + if (hue != blue_hue) + rgblight_sethsv(blue_hue, sat, val); + else + rgblight_sethsv(pink_hue, sat, val); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (!process_record_dynamic_macro(keycode, record)) + return false; + + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + 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; + case MKITPNK: + if (record->event.pressed) + make_it_pink_blue(); + return false; + break; + } + return true; +} diff --git a/keyboards/levinson/keymaps/jyh2/readme.md b/keyboards/levinson/keymaps/jyh2/readme.md new file mode 100644 index 000000000000..45ca956922a9 --- /dev/null +++ b/keyboards/levinson/keymaps/jyh2/readme.md @@ -0,0 +1,32 @@ +# jyh's levinson layout + +[Levinson](https://keeb.io/products/levinson-lets-split-w-led-backlight) +built on rev2 PCBs. A split 4x12 keyboard with LED backlights. + +The layout is oriented towards needs for programming, Emacs, XMonad, +and experience with 60% keyboards with no base layer arrow keys +(Poker). It makes heavy use of modifiers and layers. It is influenced +by good ideas from the Atreus keyboard layout. + +## Layout features + + * Extensive use of _Mod Tap_, e.g. + * Tap sends Esc, Hold sends Left Control + * Tap sends Tab, Hold activates Numpad layer + * Tap sends - , Hold sends Shift + * ... and many more + * Places Tab and Enter on bottom corners, for hitting with palm + * Meta is available on top corners, for controlling XMonad + * Control on center key, for Emacs (among other things) + * Backspace (Control Hold) and Space on center keys + * All 60% keys available on base layer, except for numbers + * Hyper and Meh keys + * Right modifier keys in place of arrow keys + * Arrows are instead available in two alternate locations: + * WASD arrows on _Adjust_ + * Arrow cluster on _Raise_ (inspired by hexwire) + * Numpad and Numrow on _Raise_ layer. Each is faster in some contexts + * Function keys on _Lower_ + * Dynamic macros from QMK firmware on _Adjust_ + * Redunant keys where it is convenient to have characters together + on one layer diff --git a/keyboards/levinson/keymaps/jyh2/rules.mk b/keyboards/levinson/keymaps/jyh2/rules.mk new file mode 100644 index 000000000000..fbb3b49d6bfc --- /dev/null +++ b/keyboards/levinson/keymaps/jyh2/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_ENABLE=yes +BOOTMAGIC_ENABLE=no From e08266129eba8f26b86b571b7f654e0d9311db25 Mon Sep 17 00:00:00 2001 From: Jason Yamada-Hanff Date: Thu, 1 Nov 2018 17:26:43 -0700 Subject: [PATCH 332/505] Keymap: port atreus layout to levinson keyboard (#4285) * Keymap: port atreus layout to levinson keyboard * fix (mostly deprecation) issues after review --- keyboards/levinson/keymaps/atreus/config.h | 22 +++++++++++ keyboards/levinson/keymaps/atreus/keymap.c | 41 +++++++++++++++++++++ keyboards/levinson/keymaps/atreus/readme.md | 8 ++++ 3 files changed, 71 insertions(+) create mode 100644 keyboards/levinson/keymaps/atreus/config.h create mode 100644 keyboards/levinson/keymaps/atreus/keymap.c create mode 100644 keyboards/levinson/keymaps/atreus/readme.md diff --git a/keyboards/levinson/keymaps/atreus/config.h b/keyboards/levinson/keymaps/atreus/config.h new file mode 100644 index 000000000000..a82c15238a19 --- /dev/null +++ b/keyboards/levinson/keymaps/atreus/config.h @@ -0,0 +1,22 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +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 . +*/ +#pragma once + +#define MASTER_LEFT diff --git a/keyboards/levinson/keymaps/atreus/keymap.c b/keyboards/levinson/keymaps/atreus/keymap.c new file mode 100644 index 000000000000..61ad04ef7443 --- /dev/null +++ b/keyboards/levinson/keymaps/atreus/keymap.c @@ -0,0 +1,41 @@ +#include QMK_KEYBOARD_H + +#define _QW 0 +#define _RS 1 +#define _LW 2 + +/* + * q w e r t || y u i o p + * a s d f g || h j k l ; + * z x c v b || n m , . / + * esc tab gui shift bksp ctrl || alt space raise - ' enter + */ +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[_QW] = LAYOUT_ortho_4x12( /* Qwerty */ + KC_Q, KC_W, KC_E, KC_R, KC_T, KC_NO, KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_P, + KC_A, KC_S, KC_D, KC_F, KC_G, KC_NO, KC_NO, KC_H, KC_J, KC_K, KC_L, KC_SCLN , + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_NO, KC_NO, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH , + KC_ESC, KC_TAB, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, MO(_RS), KC_MINS, KC_QUOT, KC_ENT ), +/* + * ! @ up { } || pgup 7 8 9 * + * # left down right $ || pgdn 4 5 6 + + * [ ] ( ) & || ` 1 2 3 \ + * lower insert super shift bksp ctrl || alt space fn . 0 = + */ +[_RS] = LAYOUT_ortho_4x12( /* [> RAISE <] */ + KC_EXLM, KC_AT, KC_UP, KC_LCBR, KC_RCBR, KC_NO, KC_NO, KC_PGUP, KC_7, KC_8, KC_9, KC_ASTR , + KC_HASH, KC_LEFT, KC_DOWN, KC_RGHT, KC_DLR, KC_NO, KC_NO, KC_PGDN, KC_4, KC_5, KC_6, KC_PLUS , + KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_AMPR, KC_NO, KC_NO, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS , + TG(_LW), KC_INS, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, KC_TRNS, KC_DOT, KC_0, KC_EQL ), +/* + * insert home up end pgup || up F7 F8 F9 F10 + * del left down right pgdn || down F4 F5 F6 F11 + * volup reset || F1 F2 F3 F12 + * voldn super shift bksp ctrl || alt space L0 prtsc scroll pause + */ +[_LW] = LAYOUT_ortho_4x12( /* [> LOWER <] */ + KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_NO, KC_NO, KC_UP, KC_F7, KC_F8, KC_F9, KC_F10 , + KC_DELT, KC_LEFT, KC_DOWN, KC_RGHT, KC_DOWN, KC_NO, KC_NO, KC_DOWN, KC_F4, KC_F5, KC_F6, KC_F11 , + KC_NO, KC_VOLU, KC_NO, KC_NO, RESET, KC_NO, KC_NO, KC_NO, KC_F1, KC_F2, KC_F3, KC_F12 , + KC_NO, KC_VOLD, KC_LGUI, KC_LSFT, KC_BSPC, KC_LCTL, KC_LALT, KC_SPC, TO(_QW), KC_PSCR, KC_SLCK, KC_PAUS ) +}; diff --git a/keyboards/levinson/keymaps/atreus/readme.md b/keyboards/levinson/keymaps/atreus/readme.md new file mode 100644 index 000000000000..0b548ace171f --- /dev/null +++ b/keyboards/levinson/keymaps/atreus/readme.md @@ -0,0 +1,8 @@ +# Atreus layout port + +Port the default Atreus layout to the Levinson/Let's Split. + +The purpose is to try out the layout to get a sense of what works in it. + +The 'extra' keys on the Levinson are dead in this version, to make a +more faithful emulation of the atreus layout. From 7a22da9f0573711be586915c763621027e285e81 Mon Sep 17 00:00:00 2001 From: Michael Pio Date: Fri, 2 Nov 2018 08:28:01 +0800 Subject: [PATCH 333/505] Update rules.mk for Vinta (#4317) changed dfu args to exit to application mode after flashing --- keyboards/vinta/rules.mk | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboards/vinta/rules.mk b/keyboards/vinta/rules.mk index bf3eecbe2102..9d89d9663635 100644 --- a/keyboards/vinta/rules.mk +++ b/keyboards/vinta/rules.mk @@ -29,10 +29,10 @@ ARMV = 6 # 0x00000000-0x00001000 area is occupied by bootlaoder.*/ # The CORTEX_VTOR... is needed only for MCHCK/Infinity KB #OPT_DEFS = -DCORTEX_VTOR_INIT=0x00001000 -OPT_DEFS = +OPT_DEFS = # Options to pass to dfu-util when flashing -DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000 +DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave # Build Options # comment out to disable the options. @@ -44,4 +44,4 @@ EXTRAKEY_ENABLE = yes # Audio control and System control CONSOLE_ENABLE = no # Console for debug COMMAND_ENABLE = no # Commands for debug and configuration NKRO_ENABLE = yes # USB Nkey Rollover -NO_USB_STARTUP_CHECK = no # Disable initialization only when usb is plugged in \ No newline at end of file +NO_USB_STARTUP_CHECK = no # Disable initialization only when usb is plugged in From 6eb7501eb0ab0ee1711f7f1275501ab53bcae8e2 Mon Sep 17 00:00:00 2001 From: Alex Mayer Date: Fri, 2 Nov 2018 01:21:28 -0400 Subject: [PATCH 334/505] Four Banger: Clean Up Indentation (#4322) Make indentation consistent and match project standards --- keyboards/four_banger/config.h | 2 +- keyboards/four_banger/four_banger.h | 10 +++---- .../four_banger/keymaps/default/keymap.c | 26 +++++++++---------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/keyboards/four_banger/config.h b/keyboards/four_banger/config.h index 8dceff5db5dc..761ddba71516 100644 --- a/keyboards/four_banger/config.h +++ b/keyboards/four_banger/config.h @@ -40,7 +40,7 @@ /* key combination for command */ #define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ ) #define RGB_DI_PIN E6 diff --git a/keyboards/four_banger/four_banger.h b/keyboards/four_banger/four_banger.h index b0de731b9199..a6da8dd0b7fa 100644 --- a/keyboards/four_banger/four_banger.h +++ b/keyboards/four_banger/four_banger.h @@ -4,11 +4,11 @@ #include "quantum.h" #define LAYOUT_ortho_2x2( \ - K00, K01, \ - K10, K11 \ + K00, K01, \ + K10, K11 \ ) { \ - { K00, K01 }, \ - { K10, K11 } \ + { K00, K01 }, \ + { K10, K11 } \ } -#endif \ No newline at end of file +#endif diff --git a/keyboards/four_banger/keymaps/default/keymap.c b/keyboards/four_banger/keymaps/default/keymap.c index 6c5f7c8a55f8..3fea0afd4fa3 100644 --- a/keyboards/four_banger/keymaps/default/keymap.c +++ b/keyboards/four_banger/keymaps/default/keymap.c @@ -5,20 +5,20 @@ enum custom_keycodes { }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - LAYOUT_ortho_2x2( - KC_1, KC_U, - KC_P, UP_URL - ), + LAYOUT_ortho_2x2( + KC_1, KC_U, + KC_P, UP_URL + ), }; bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case UP_URL: - if (record->event.pressed) { - SEND_STRING("http://1upkeyboards.com"); - } - return false; - break; - } - return true; + switch (keycode) { + case UP_URL: + if (record->event.pressed) { + SEND_STRING("http://1upkeyboards.com"); + } + return false; + break; + } + return true; } From 5909d8aef1126357899b687155bfe377914891df Mon Sep 17 00:00:00 2001 From: ENDO Katsuhiro Date: Fri, 2 Nov 2018 14:55:29 +0900 Subject: [PATCH 335/505] Keyboard: Add MiniAxe (#4314) * Add a new keyboard MiniAxe. * Fix readme foramt. Co-Authored-By: ka2hiro * Fix readme format. Co-Authored-By: ka2hiro * Remove unnecessary keycode aliases. * Remove unnecessary param. Co-Authored-By: ka2hiro --- keyboards/miniaxe/config.h | 245 ++++++++ keyboards/miniaxe/info.json | 12 + keyboards/miniaxe/keymaps/default/keymap.c | 159 +++++ keyboards/miniaxe/keymaps/underglow/keymap.c | 159 +++++ keyboards/miniaxe/keymaps/underglow/rules.mk | 2 + keyboards/miniaxe/matrix.c | 596 +++++++++++++++++++ keyboards/miniaxe/miniaxe.c | 43 ++ keyboards/miniaxe/miniaxe.h | 50 ++ keyboards/miniaxe/readme.md | 16 + keyboards/miniaxe/rules.mk | 88 +++ 10 files changed, 1370 insertions(+) create mode 100644 keyboards/miniaxe/config.h create mode 100644 keyboards/miniaxe/info.json create mode 100644 keyboards/miniaxe/keymaps/default/keymap.c create mode 100644 keyboards/miniaxe/keymaps/underglow/keymap.c create mode 100644 keyboards/miniaxe/keymaps/underglow/rules.mk create mode 100644 keyboards/miniaxe/matrix.c create mode 100644 keyboards/miniaxe/miniaxe.c create mode 100644 keyboards/miniaxe/miniaxe.h create mode 100644 keyboards/miniaxe/readme.md create mode 100644 keyboards/miniaxe/rules.mk diff --git a/keyboards/miniaxe/config.h b/keyboards/miniaxe/config.h new file mode 100644 index 000000000000..13608feab25c --- /dev/null +++ b/keyboards/miniaxe/config.h @@ -0,0 +1,245 @@ +/* +Copyright 2018 ENDO Katsuhiro + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x3939 +#define DEVICE_VER 0x0001 +#define MANUFACTURER ENDO Katsuhiro +#define PRODUCT MiniAxe +#define DESCRIPTION Yet another split keyboard + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 5 + +/* + * 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) + * NO_DIODE = switches are directly connected to AVR pins + * +*/ +// #define MATRIX_ROW_PINS { D0, D5 } +// #define MATRIX_COL_PINS { F1, F0, B0 } +#define NO_PIN 0xFF +#define MATRIX_ROW_COL_PINS { \ + { F1, E6, B0, B2, B3 }, \ + { F5, F0, B1, B7, D2 }, \ + { F6, F7, C7, D5, D3 }, \ + { B5, C6, B6, NO_PIN, NO_PIN } \ +} +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION CUSTOM_MATRIX + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + +/* Uncomment below if use underglow */ +#define RGB_DI_PIN F4 +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 6 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 + +/* Serial settings */ +#define USE_SERIAL +//#define EE_HANDS +#define I2C_MASTER_LEFT +//#define I2C_MASTER_RIGHT + +#define DISABLE_JTAG + diff --git a/keyboards/miniaxe/info.json b/keyboards/miniaxe/info.json new file mode 100644 index 000000000000..5fee787b55ae --- /dev/null +++ b/keyboards/miniaxe/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "MiniAxe", + "url": "", + "maintainer": "ka2hiro", + "width": 11, + "height": 4, + "layouts": { + "LAYOUT": { + "layout": [{"label":"Q", "x":0, "y":0}, {"label":"W", "x":1, "y":0}, {"label":"E", "x":2, "y":0}, {"label":"R", "x":3, "y":0}, {"label":"T", "x":4, "y":0}, {"label":"Y", "x":6, "y":0}, {"label":"U", "x":7, "y":0}, {"label":"I", "x":8, "y":0}, {"label":"O", "x":9, "y":0}, {"label":"P", "x":10, "y":0}, {"label":"A", "x":0, "y":1}, {"label":"S", "x":1, "y":1}, {"label":"D", "x":2, "y":1}, {"label":"F", "x":3, "y":1}, {"label":"G", "x":4, "y":1}, {"label":"J", "x":6, "y":1}, {"label":"J", "x":7, "y":1}, {"label":"K", "x":8, "y":1}, {"label":"L", "x":9, "y":1}, {"label":";", "x":10, "y":1}, {"label":"Z", "x":0, "y":2}, {"label":"X", "x":1, "y":2}, {"label":"C", "x":2, "y":2}, {"label":"V", "x":3, "y":2}, {"label":"B", "x":4, "y":2}, {"label":"N", "x":6, "y":2}, {"label":"M", "x":7, "y":2}, {"label":",", "x":8, "y":2}, {"label":".", "x":9, "y":2}, {"label":"/", "x":10, "y":2}, {"label":"Cmd", "x":2, "y":3}, {"label":"⇓", "x":3, "y":3}, {"label":"Ctrl", "x":4, "y":3}, {"x":6, "y":3}, {"label":"⇑", "x":7, "y":3}, {"label":"Opt", "x":8, "y":3}] + } + } +} diff --git a/keyboards/miniaxe/keymaps/default/keymap.c b/keyboards/miniaxe/keymaps/default/keymap.c new file mode 100644 index 000000000000..4b405e202948 --- /dev/null +++ b/keyboards/miniaxe/keymaps/default/keymap.c @@ -0,0 +1,159 @@ +/* Copyright 2018 ENDO Katsuhiro + * + * 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 QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * + * ,----------------------------------. ,----------------------------------. + * | Q | W | E | R | T | | Y | U | I | O | P | + * |------+------+------+------+------| |------+------+------+------+------| + * | A | S | D | F | G | | H | J | K | L | ; | + * |------+------+------+------+------| |------+------+------+------+------| + * | Z | X | C | V | B | | N | M | , | . | / | + * `-------------+------+------+------| |------+------+------+------+------' + * | GUI | LOWER|Ctrl/Esc| |Spc/Sft| RAISE|Alt/BkSp | + * `--------------------' `--------------------' + */ +[_QWERTY] = LAYOUT( \ + 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_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, \ + KC_LGUI, LOWER, MT(MOD_LCTL, KC_ESC), MT(MOD_LSFT, KC_SPC), RAISE, MT(MOD_LALT, KC_BSPC) \ +), + +/* Raise + * + * ,----------------------------------. ,----------------------------------. + * | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + * |------+------+------+------+------| |------+------+------+------+------| + * | Tab | _ | + | | | ~ | | : | " | > | { | } | + * |------+------+------+------+------| |------+------+------+------+------| + * | Caps| - | = | \ | ` | | ; | ' | < | [ | ] | + * `-------------+------+------+------| |------+------+------+------+------' + * | | LOWER| | | Esc | RAISE| | + * `--------------------' `--------------------' + */ +[_RAISE] = LAYOUT( \ + KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, \ + KC_TAB, KC_UNDS, KC_PLUS, KC_PIPE, KC_TILD, KC_COLN, KC_DQUO, KC_GT, KC_LCBR, KC_RCBR, \ + KC_CAPS, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_SCLN, KC_QUOT, KC_LT, KC_LBRC, KC_RBRC, \ + _______, _______, _______, _______, _______, _______\ +), + +/* Lower + * + * ,----------------------------------. ,----------------------------------. + * | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | + * |------+------+------+------+------| |------+------+------+------+------| + * | Tab | | | | | | Left | Down | Up | Right| Enter| + * |------+------+------+------+------| |------+------+------+------+------| + * | Ctrl| ` | GUI | Alt | Del | | BkSp | PgUp | PgDn | \ | ' | + * `-------------+------+------+------| |------+------+------+------+------' + * | | LOWER| | | | RAISE| | + * `--------------------' `--------------------' + */ +[_LOWER] = LAYOUT( \ + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \ + KC_TAB, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_ENT, \ + KC_LCTL, KC_GRV, KC_LGUI, KC_LALT, KC_DEL, KC_BSPC, KC_PGUP, KC_PGDN, KC_BSLS, KC_QUOT, \ + _______, _______, _______, _______, _______, _______ \ +), + + +/* Adjust (Lower + Raise) + * + * ,----------------------------------. ,----------------------------------. + * | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | + * |------+------+------+------+------| |------+------+------+------+------| + * | F11 | F12 | | | | | | | | | | + * |------+------+------+------+------| |------+------+------+------+------| + * | Reset| | | | | | Prev | Next | Vol- | Vol+ | Play | + * `-------------+------+------+------| |------+------+------+------+------' + * | | LOWER| | | | RAISE| | + * `--------------------' `--------------------' + */ +[_ADJUST] = LAYOUT( \ + 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_MPRV, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, \ + _______, _______, _______, _______, _______, _______ \ +) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + // persistant_default_layer_set(1UL<<_QWERTY); + set_single_persistent_default_layer(_QWERTY); + } + 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; +} + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +void led_set_user(uint8_t usb_led) { +} diff --git a/keyboards/miniaxe/keymaps/underglow/keymap.c b/keyboards/miniaxe/keymaps/underglow/keymap.c new file mode 100644 index 000000000000..6325b205654f --- /dev/null +++ b/keyboards/miniaxe/keymaps/underglow/keymap.c @@ -0,0 +1,159 @@ +/* Copyright 2018 ENDO Katsuhiro + * + * 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 QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +#define _QWERTY 0 +#define _LOWER 1 +#define _RAISE 2 +#define _ADJUST 16 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, + RAISE, + ADJUST, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * + * ,----------------------------------. ,----------------------------------. + * | Q | W | E | R | T | | Y | U | I | O | P | + * |------+------+------+------+------| |------+------+------+------+------| + * | A | S | D | F | G | | H | J | K | L | ; | + * |------+------+------+------+------| |------+------+------+------+------| + * | Z | X | C | V | B | | N | M | , | . | / | + * `-------------+------+------+------| |------+------+------+------+------' + * | GUI | LOWER|Ctrl/Esc| |Spc/Sft| RAISE|Alt/BkSp | + * `--------------------' `--------------------' + */ +[_QWERTY] = LAYOUT( \ + 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_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, \ + KC_LGUI, LOWER, MT(MOD_LCTL, KC_ESC), MT(MOD_LSFT, KC_SPC), RAISE, MT(MOD_LALT, KC_BSPC) \ +), + +/* Raise + * + * ,----------------------------------. ,----------------------------------. + * | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + * |------+------+------+------+------| |------+------+------+------+------| + * | Tab | _ | + | | | ~ | | : | " | > | { | } | + * |------+------+------+------+------| |------+------+------+------+------| + * | Caps| - | = | \ | ` | | ; | ' | < | [ | ] | + * `-------------+------+------+------| |------+------+------+------+------' + * | | LOWER| | | Esc | RAISE| | + * `--------------------' `--------------------' + */ +[_RAISE] = LAYOUT( \ + KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, \ + KC_TAB, KC_UNDS, KC_PLUS, KC_PIPE, KC_TILD, KC_COLN, KC_DQUO, KC_GT, KC_LCBR, KC_RCBR, \ + KC_CAPS, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_SCLN, KC_QUOT, KC_LT, KC_LBRC, KC_RBRC, \ + _______, _______, _______, _______, _______, _______\ +), + +/* Lower + * + * ,----------------------------------. ,----------------------------------. + * | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | + * |------+------+------+------+------| |------+------+------+------+------| + * | Tab | | | | Play | | Left | Down | Up | Right| Enter| + * |------+------+------+------+------| |------+------+------+------+------| + * | Ctrl| ` | GUI | Alt | Del | | BkSp | PgUp | PgDn | \ | ' | + * `-------------+------+------+------| |------+------+------+------+------' + * | | LOWER| | | | RAISE| | + * `--------------------' `--------------------' + */ +[_LOWER] = LAYOUT( \ + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \ + KC_TAB, _______, _______, _______, KC_MPLY, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_ENT, \ + KC_LCTL, KC_GRV, KC_LGUI, KC_LALT, KC_DEL, KC_BSPC, KC_PGUP, KC_PGDN, KC_BSLS, KC_QUOT, \ + _______, _______, _______, _______, _______, _______ \ +), + + +/* Adjust (Lower + Raise) + * + * ,----------------------------------. ,----------------------------------. + * | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | + * |------+------+------+------+------| |------+------+------+------+------| + * | F11 | F12 | |RGBSAI|RGBSAD| |RGBVAI|RGBVAD| | | | + * |------+------+------+------+------| |------+------+------+------+------| + * | Reset|RGBTOG|RGBMOD|RGBHUI|RGBHUD| | Prev | Next | Vol- | Vol+ | Play | + * `-------------+------+------+------| |------+------+------+------+------' + * | | LOWER| | | | RAISE| | + * `--------------------' `--------------------' + */ +[_ADJUST] = LAYOUT( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, \ + KC_F11, KC_F12, RGB_RMOD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, \ + RESET, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, KC_MPRV, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, \ + _______, _______, _______, _______, _______, _______ \ +) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + // persistant_default_layer_set(1UL<<_QWERTY); + set_single_persistent_default_layer(_QWERTY); + } + 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; +} + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +void led_set_user(uint8_t usb_led) { +} diff --git a/keyboards/miniaxe/keymaps/underglow/rules.mk b/keyboards/miniaxe/keymaps/underglow/rules.mk new file mode 100644 index 000000000000..64fa91dedac9 --- /dev/null +++ b/keyboards/miniaxe/keymaps/underglow/rules.mk @@ -0,0 +1,2 @@ +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow + diff --git a/keyboards/miniaxe/matrix.c b/keyboards/miniaxe/matrix.c new file mode 100644 index 000000000000..55c458e1fb7b --- /dev/null +++ b/keyboards/miniaxe/matrix.c @@ -0,0 +1,596 @@ +/* +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 . +*/ + +/* + * scan matrix + */ +#include +#include +#include +#include "wait.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "split_util.h" +#include "pro_micro.h" +#include "config.h" +#include "timer.h" +#include "split_flags.h" + +#ifdef RGBLIGHT_ENABLE +# include "rgblight.h" +#endif +#ifdef BACKLIGHT_ENABLE +# include "backlight.h" + extern backlight_config_t backlight_config; +#endif + +#if defined(USE_I2C) || defined(EH) +# include "i2c.h" +#else // USE_SERIAL +# include "serial.h" +#endif + +#ifndef DEBOUNCING_DELAY +# define DEBOUNCING_DELAY 5 +#endif + +#if (DEBOUNCING_DELAY > 0) + static uint16_t debouncing_time; + static bool debouncing = false; +#endif + +#if (MATRIX_COLS <= 8) +# define print_matrix_header() print("\nr/c 01234567\n") +# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) +# define matrix_bitpop(i) bitpop(matrix[i]) +# define ROW_SHIFTER ((uint8_t)1) +#else +# error "Currently only supports 8 COLS" +#endif +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +#define ERROR_DISCONNECT_COUNT 5 + +#define ROWS_PER_HAND (MATRIX_ROWS/2) + +static uint8_t error_count = 0; + +#if ((DIODE_DIRECTION == COL2ROW) || (DIODE_DIRECTION == ROW2COL)) +static uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; +static uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; +#elif (DIODE_DIRECTION == CUSTOM_MATRIX) +static uint8_t row_col_pins[MATRIX_ROWS][MATRIX_COLS] = MATRIX_ROW_COL_PINS; +#endif + +/* matrix state(1:on, 0:off) */ +static matrix_row_t matrix[MATRIX_ROWS]; +static matrix_row_t matrix_debouncing[MATRIX_ROWS]; + +#if (DIODE_DIRECTION == COL2ROW) + static void init_cols(void); + static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row); + static void unselect_rows(void); + static void select_row(uint8_t row); + static void unselect_row(uint8_t row); +#elif (DIODE_DIRECTION == ROW2COL) + static void init_rows(void); + static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); + static void unselect_cols(void); + static void unselect_col(uint8_t col); + static void select_col(uint8_t col); +#elif (DIODE_DIRECTION == CUSTOM_MATRIX) + static void init_cols_rows(void); + static bool read_cols(matrix_row_t current_matrix[], uint8_t current_row); +#endif + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +__attribute__ ((weak)) +void matrix_slave_scan_user(void) { +} + +inline +uint8_t matrix_rows(void) +{ + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) +{ + return MATRIX_COLS; +} + +void matrix_init(void) +{ +#ifdef DISABLE_JTAG + // JTAG disable for PORT F. write JTD bit twice within four cycles. + MCUCR |= (1< 0) + bool matrix_changed = read_cols_on_row(matrix_debouncing+offset, current_row); + + if (matrix_changed) { + debouncing = true; + debouncing_time = timer_read(); + } + +# else + read_cols_on_row(matrix+offset, current_row); +# endif + + } + +#elif (DIODE_DIRECTION == ROW2COL) + // Set col, read rows + for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { +# if (DEBOUNCING_DELAY > 0) + bool matrix_changed = read_rows_on_col(matrix_debouncing+offset, current_col); + if (matrix_changed) { + debouncing = true; + debouncing_time = timer_read(); + } +# else + read_rows_on_col(matrix+offset, current_col); +# endif + + } + +#elif (DIODE_DIRECTION == CUSTOM_MATRIX) + // Set row, read cols + for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) { +# if (DEBOUNCING_DELAY > 0) + bool matrix_changed = read_cols(matrix_debouncing+offset, current_row); + if (matrix_changed) { + debouncing = true; + debouncing_time = timer_read(); + } +# else + read_cols(matrix+offset, current_row); +# endif + } +#endif + +# if (DEBOUNCING_DELAY > 0) + if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { + for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { + matrix[i+offset] = matrix_debouncing[i+offset]; + } + debouncing = false; + } +# endif + + return 1; +} + +#if defined(USE_I2C) || defined(EH) + +// Get rows from other half over i2c +int i2c_transaction(void) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + int err = 0; + + // write backlight info + #ifdef BACKLIGHT_ENABLE + if (BACKLIT_DIRTY) { + err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); + if (err) goto i2c_error; + + // Backlight location + err = i2c_master_write(I2C_BACKLIT_START); + if (err) goto i2c_error; + + // Write backlight + i2c_master_write(get_backlight_level()); + + BACKLIT_DIRTY = false; + } + #endif + + err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); + if (err) goto i2c_error; + + // start of matrix stored at I2C_KEYMAP_START + err = i2c_master_write(I2C_KEYMAP_START); + if (err) goto i2c_error; + + // Start read + err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); + if (err) goto i2c_error; + + if (!err) { + int i; + for (i = 0; i < ROWS_PER_HAND-1; ++i) { + matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); + } + matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); + i2c_master_stop(); + } else { +i2c_error: // the cable is disconnceted, or something else went wrong + i2c_reset_state(); + return err; + } + + #ifdef RGBLIGHT_ENABLE + if (RGB_DIRTY) { + err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); + if (err) goto i2c_error; + + // RGB Location + err = i2c_master_write(I2C_RGB_START); + if (err) goto i2c_error; + + uint32_t dword = eeconfig_read_rgblight(); + + // Write RGB + err = i2c_master_write_data(&dword, 4); + if (err) goto i2c_error; + + RGB_DIRTY = false; + i2c_master_stop(); + } + #endif + + return 0; +} + +#else // USE_SERIAL + +int serial_transaction(void) { + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + + if (serial_update_buffers()) { + return 1; + } + + for (int i = 0; i < ROWS_PER_HAND; ++i) { + matrix[slaveOffset+i] = serial_slave_buffer[i]; + } + + #ifdef RGBLIGHT_ENABLE + // Code to send RGB over serial goes here (not implemented yet) + #endif + + #ifdef BACKLIGHT_ENABLE + // Write backlight level for slave to read + serial_master_buffer[SERIAL_BACKLIT_START] = backlight_config.enable ? backlight_config.level : 0; + #endif + + return 0; +} +#endif + +uint8_t matrix_scan(void) +{ + uint8_t ret = _matrix_scan(); + +#if defined(USE_I2C) || defined(EH) + if( i2c_transaction() ) { +#else // USE_SERIAL + if( serial_transaction() ) { +#endif + + error_count++; + + if (error_count > ERROR_DISCONNECT_COUNT) { + // reset other half if disconnected + int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; + for (int i = 0; i < ROWS_PER_HAND; ++i) { + matrix[slaveOffset+i] = 0; + } + } + } else { + error_count = 0; + } + matrix_scan_quantum(); + return ret; +} + +void matrix_slave_scan(void) { + _matrix_scan(); + + int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; + +#if defined(USE_I2C) || defined(EH) + for (int i = 0; i < ROWS_PER_HAND; ++i) { + i2c_slave_buffer[I2C_KEYMAP_START+i] = matrix[offset+i]; + } +#else // USE_SERIAL + for (int i = 0; i < ROWS_PER_HAND; ++i) { + serial_slave_buffer[i] = matrix[offset+i]; + } +#endif + matrix_slave_scan_user(); +} + +bool matrix_is_modified(void) +{ + if (debouncing) return false; + return true; +} + +inline +bool matrix_is_on(uint8_t row, uint8_t col) +{ + return (matrix[row] & ((matrix_row_t)1<> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) +{ + // Store last value of row prior to reading + matrix_row_t last_row_value = current_matrix[current_row]; + + // Clear data in matrix row + current_matrix[current_row] = 0; + + // Select row and wait for row selecton to stabilize + select_row(current_row); + wait_us(30); + + // For each col... + for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { + + // Select the col pin to read (active low) + uint8_t pin = col_pins[col_index]; + uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); + + // Populate the matrix row with the state of the col pin + current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); + } + + // Unselect row + unselect_row(current_row); + + return (last_row_value != current_matrix[current_row]); +} + +static void select_row(uint8_t row) +{ + uint8_t pin = row_pins[row]; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW +} + +static void unselect_row(uint8_t row) +{ + uint8_t pin = row_pins[row]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI +} + +static void unselect_rows(void) +{ + for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { + uint8_t pin = row_pins[x]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +#elif (DIODE_DIRECTION == ROW2COL) + +static void init_rows(void) +{ + for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { + uint8_t pin = row_pins[x]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) +{ + bool matrix_changed = false; + + // Select col and wait for col selecton to stabilize + select_col(current_col); + wait_us(30); + + // For each row... + for(uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) + { + + // Store last value of row prior to reading + matrix_row_t last_row_value = current_matrix[row_index]; + + // Check row pin state + if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) + { + // Pin LO, set col bit + current_matrix[row_index] |= (ROW_SHIFTER << current_col); + } + else + { + // Pin HI, clear col bit + current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); + } + + // Determine if the matrix changed state + if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) + { + matrix_changed = true; + } + } + + // Unselect col + unselect_col(current_col); + + return matrix_changed; +} + +static void select_col(uint8_t col) +{ + uint8_t pin = col_pins[col]; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW +} + +static void unselect_col(uint8_t col) +{ + uint8_t pin = col_pins[col]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI +} + +static void unselect_cols(void) +{ + for(uint8_t x = 0; x < MATRIX_COLS; x++) { + uint8_t pin = col_pins[x]; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } +} + +#elif (DIODE_DIRECTION == CUSTOM_MATRIX) + +static void init_cols_rows(void) +{ + for(int row = 0; row < MATRIX_ROWS; row++) { + for(int col = 0; col < MATRIX_COLS; col++) { + uint8_t pin = row_col_pins[row][col]; + if(pin == NO_PIN) { + continue; + } + // DDxn set 0 for input + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); + // PORTxn set 1 for input/pullup + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); + } + } +} + +static bool read_cols(matrix_row_t current_matrix[], uint8_t current_row) +{ + matrix_row_t last_row_value = current_matrix[current_row]; + current_matrix[current_row] = 0; + + for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { + uint8_t pin = row_col_pins[current_row][col_index]; + if(pin == NO_PIN) { + current_matrix[current_row] |= 0; + } + else { + uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); + current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); + } + } + + return (last_row_value != current_matrix[current_row]); +} + +#endif diff --git a/keyboards/miniaxe/miniaxe.c b/keyboards/miniaxe/miniaxe.c new file mode 100644 index 000000000000..965ada9a1887 --- /dev/null +++ b/keyboards/miniaxe/miniaxe.c @@ -0,0 +1,43 @@ +/* Copyright 2018 ENDO Katsuhiro + * + * 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 "miniaxe.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/miniaxe/miniaxe.h b/keyboards/miniaxe/miniaxe.h new file mode 100644 index 000000000000..a0130ad28008 --- /dev/null +++ b/keyboards/miniaxe/miniaxe.h @@ -0,0 +1,50 @@ +/* Copyright 2018 ENDO Katsuhiro + * + * 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 MINIAXE_H +#define MINIAXE_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ + +// readability +#define ___ KC_NO + +#define LAYOUT( \ + L01, L02, L03, L04, L05, R01, R02, R03, R04, R05, \ + L06, L07, L08, L09, L10, R06, R07, R08, R09, R10, \ + L11, L12, L13, L14, L15, R11, R12, R13, R14, R15, \ + L16, L17, L18, R16, R17, R18 \ + ) \ + { \ + { L01, L02, L03, L04, L05 }, \ + { L06, L07, L08, L09, L10 }, \ + { L11, L12, L13, L14, L15 }, \ + { L16, L17, L18, ___, ___ }, \ + { R01, R02, R03, R04, R05 }, \ + { R06, R07, R08, R09, R10 }, \ + { R11, R12, R13, R14, R15 }, \ + { R16, R17, R18, ___, ___ } \ + } + +#endif diff --git a/keyboards/miniaxe/readme.md b/keyboards/miniaxe/readme.md new file mode 100644 index 000000000000..57ed01a91773 --- /dev/null +++ b/keyboards/miniaxe/readme.md @@ -0,0 +1,16 @@ +MiniAxe +=== + +![MiniAxe](https://i.imgur.com/1ApzrCz.jpg) + +Yet another split ortholinear keyboard with 3x5+3 keys. + +Keyboard Maintainer: [ka2hiro](https://github.com/ka2hiro) [@ka2hiro](https://twitter.com/ka2hiro) +Hardware Supported: MiniAxe PCB, ATMEGA32U4 +Hardware Availability: [@ka2hiro](https://twitter.com/ka2hiro) + +Make example for this keyboard (after setting up your build environment): + + make miniaxe:default:dfu + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/miniaxe/rules.mk b/keyboards/miniaxe/rules.mk new file mode 100644 index 000000000000..96e27686b8d8 --- /dev/null +++ b/keyboards/miniaxe/rules.mk @@ -0,0 +1,88 @@ +SRC += matrix.c + +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = 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 +# 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 +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +DEBUG_ENABLE = no +CUSTOM_MATRIX = yes # Use custom matrix code +SPLIT_KEYBOARD = yes # Use shared split_common code + From 15f6278aa623ceda4c220daee1cbedb9e38e6a97 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 2 Nov 2018 12:31:40 -0400 Subject: [PATCH 336/505] Add support for Atmega32A to pin declarations and universal matrix (#4015) * add computed pins from mcu type * update for atmega32a * doc typo * add atmega16 chips, link to references * remove avr include from config * exclude assembler in config.h includes * consolodate options, add 646 * fix typo in pindef --- docs/internals_gpio_control.md | 2 +- quantum/config_common.h | 156 ++++++++++++++-------- quantum/quantum.h | 20 +-- tmk_core/protocol/vusb/usbdrv/usbdrvasm.S | 8 +- 4 files changed, 118 insertions(+), 68 deletions(-) diff --git a/docs/internals_gpio_control.md b/docs/internals_gpio_control.md index 21643d30c961..083e696648f6 100644 --- a/docs/internals_gpio_control.md +++ b/docs/internals_gpio_control.md @@ -12,7 +12,7 @@ The following functions can provide basic control of GPIOs and are found in `qua |`setPinInputHigh(pin)`|Set pin as input with build in pull-up | |`setPinInputLow(pin)` |Set pin as input with build in pull-down (Supported only on STM32)| |`setPinOutput(pin)` |Set pin as output | -|`writePinHige(pin)` |Set pin level as high, assuming it is an output | +|`writePinHigh(pin)` |Set pin level as high, assuming it is an output | |`writePinLow(pin)` |Set pin level as low, assuming it is an output | |`writePin(pin, level)`|Set pin level, assuming it is an output | |`readPin(pin)` |Returns the level of the pin | diff --git a/quantum/config_common.h b/quantum/config_common.h index 288617255f51..cbff372eaf36 100644 --- a/quantum/config_common.h +++ b/quantum/config_common.h @@ -1,4 +1,4 @@ -/* Copyright 2015-2017 Jack Humbert +/* Copyright 2015-2018 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 @@ -14,8 +14,7 @@ * along with this program. If not, see . */ -#ifndef CONFIG_DEFINITIONS_H -#define CONFIG_DEFINITIONS_H +#pragma once /* diode directions */ #define COL2ROW 0 @@ -23,57 +22,108 @@ #define CUSTOM_MATRIX 2 /* Disables built-in matrix scanning code */ #ifdef __AVR__ + #ifndef __ASSEMBLER__ + #include + #endif + #define PORT_SHIFTER 4 // this may be 4 for all AVR chips + + // If you want to add more to this list, reference the PINx definitions in these header + // files: https://github.com/vancegroup-mirrors/avr-libc/tree/master/avr-libc/include/avr + + #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__) + #define ADDRESS_BASE 0x00 + #define PINB_ADDRESS 0x3 + #define PINC_ADDRESS 0x6 + #define PIND_ADDRESS 0x9 + #define PINE_ADDRESS 0xC + #define PINF_ADDRESS 0xF + #elif defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__) + #define ADDRESS_BASE 0x00 + #define PINB_ADDRESS 0x3 + #define PINC_ADDRESS 0x6 + #define PIND_ADDRESS 0x9 + #elif defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) + #define ADDRESS_BASE 0x00 + #define PINA_ADDRESS 0x0 + #define PINB_ADDRESS 0x3 + #define PINC_ADDRESS 0x6 + #define PIND_ADDRESS 0x9 + #define PINE_ADDRESS 0xC + #define PINF_ADDRESS 0xF + #elif defined(__AVR_ATmega32A__) + #define ADDRESS_BASE 0x10 + #define PIND_ADDRESS 0x0 + #define PINC_ADDRESS 0x3 + #define PINB_ADDRESS 0x6 + #define PINA_ADDRESS 0x9 + #else + #error "Pins are not defined" + #endif + /* I/O pins */ - #ifndef F0 - #define B0 0x30 - #define B1 0x31 - #define B2 0x32 - #define B3 0x33 - #define B4 0x34 - #define B5 0x35 - #define B6 0x36 - #define B7 0x37 - #define C0 0x60 - #define C1 0x61 - #define C2 0x62 - #define C3 0x63 - #define C4 0x64 - #define C5 0x65 - #define C6 0x66 - #define C7 0x67 - #define D0 0x90 - #define D1 0x91 - #define D2 0x92 - #define D3 0x93 - #define D4 0x94 - #define D5 0x95 - #define D6 0x96 - #define D7 0x97 - #define E0 0xC0 - #define E1 0xC1 - #define E2 0xC2 - #define E3 0xC3 - #define E4 0xC4 - #define E5 0xC5 - #define E6 0xC6 - #define E7 0xC7 - #define F0 0xF0 - #define F1 0xF1 - #define F2 0xF2 - #define F3 0xF3 - #define F4 0xF4 - #define F5 0xF5 - #define F6 0xF6 - #define F7 0xF7 - #define A0 0x00 - #define A1 0x01 - #define A2 0x02 - #define A3 0x03 - #define A4 0x04 - #define A5 0x05 - #define A6 0x06 - #define A7 0x07 + #define PINDEF(port, pin) ((PIN##port##_ADDRESS << PORT_SHIFTER) | pin) + + #ifdef PORTA + #define A0 PINDEF(A, 0) + #define A1 PINDEF(A, 1) + #define A2 PINDEF(A, 2) + #define A3 PINDEF(A, 3) + #define A4 PINDEF(A, 4) + #define A5 PINDEF(A, 5) + #define A6 PINDEF(A, 6) + #define A7 PINDEF(A, 7) + #endif + #ifdef PORTB + #define B0 PINDEF(B, 0) + #define B1 PINDEF(B, 1) + #define B2 PINDEF(B, 2) + #define B3 PINDEF(B, 3) + #define B4 PINDEF(B, 4) + #define B5 PINDEF(B, 5) + #define B6 PINDEF(B, 6) + #define B7 PINDEF(B, 7) #endif + #ifdef PORTC + #define C0 PINDEF(C, 0) + #define C1 PINDEF(C, 1) + #define C2 PINDEF(C, 2) + #define C3 PINDEF(C, 3) + #define C4 PINDEF(C, 4) + #define C5 PINDEF(C, 5) + #define C6 PINDEF(C, 6) + #define C7 PINDEF(C, 7) + #endif + #ifdef PORTD + #define D0 PINDEF(D, 0) + #define D1 PINDEF(D, 1) + #define D2 PINDEF(D, 2) + #define D3 PINDEF(D, 3) + #define D4 PINDEF(D, 4) + #define D5 PINDEF(D, 5) + #define D6 PINDEF(D, 6) + #define D7 PINDEF(D, 7) + #endif + #ifdef PORTE + #define E0 PINDEF(E, 0) + #define E1 PINDEF(E, 1) + #define E2 PINDEF(E, 2) + #define E3 PINDEF(E, 3) + #define E4 PINDEF(E, 4) + #define E5 PINDEF(E, 5) + #define E6 PINDEF(E, 6) + #define E7 PINDEF(E, 7) + #endif + #ifdef PORTF + #define F0 PINDEF(F, 0) + #define F1 PINDEF(F, 1) + #define F2 PINDEF(F, 2) + #define F3 PINDEF(F, 3) + #define F4 PINDEF(F, 4) + #define F5 PINDEF(F, 5) + #define F6 PINDEF(F, 6) + #define F7 PINDEF(F, 7) + #endif + #elif defined(PROTOCOL_CHIBIOS) #define A0 PAL_LINE(GPIOA, 0) #define A1 PAL_LINE(GPIOA, 1) @@ -200,5 +250,3 @@ #define API_SYSEX_MAX_SIZE 32 #include "song_list.h" - -#endif diff --git a/quantum/quantum.h b/quantum/quantum.h index 1d3ee033fd09..fe670c8eb458 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -140,26 +140,28 @@ extern uint32_t default_layer_state; //Function substitutions to ease GPIO manipulation #ifdef __AVR__ + #define PIN_ADDRESS(p, offset) _SFR_IO8(ADDRESS_BASE + (p >> PORT_SHIFTER) + offset) + #define pin_t uint8_t - #define setPinInput(pin) _SFR_IO8((pin >> 4) + 1) &= ~ _BV(pin & 0xF) + #define setPinInput(pin) PIN_ADDRESS(pin, 1) &= ~ _BV(pin & 0xF) #define setPinInputHigh(pin) ({\ - _SFR_IO8((pin >> 4) + 1) &= ~ _BV(pin & 0xF);\ - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF);\ + PIN_ADDRESS(pin, 1) &= ~ _BV(pin & 0xF);\ + PIN_ADDRESS(pin, 2) |= _BV(pin & 0xF);\ }) #define setPinInputLow(pin) _Static_assert(0, "AVR Processors cannot impliment an input as pull low") - #define setPinOutput(pin) _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF) + #define setPinOutput(pin) PIN_ADDRESS(pin, 1) |= _BV(pin & 0xF) - #define writePinHigh(pin) _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF) - #define writePinLow(pin) _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF) + #define writePinHigh(pin) PIN_ADDRESS(pin, 2) |= _BV(pin & 0xF) + #define writePinLow(pin) PIN_ADDRESS(pin, 2) &= ~_BV(pin & 0xF) static inline void writePin(pin_t pin, uint8_t level){ if (level){ - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); + PIN_ADDRESS(pin, 2) |= _BV(pin & 0xF); } else { - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); + PIN_ADDRESS(pin, 2) &= ~_BV(pin & 0xF); } } - #define readPin(pin) (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)) + #define readPin(pin) (PIN_ADDRESS(pin, 0) & _BV(pin & 0xF)) #elif defined(PROTOCOL_CHIBIOS) #define pin_t ioline_t #define setPinInput(pin) palSetLineMode(pin, PAL_MODE_INPUT) diff --git a/tmk_core/protocol/vusb/usbdrv/usbdrvasm.S b/tmk_core/protocol/vusb/usbdrv/usbdrvasm.S index 45fcf1831573..2e8097da9c46 100644 --- a/tmk_core/protocol/vusb/usbdrv/usbdrvasm.S +++ b/tmk_core/protocol/vusb/usbdrv/usbdrvasm.S @@ -118,7 +118,7 @@ RTMODEL "__rt_version", "3" # define polyH r21 # define scratch r23 -#else /* __IAR_SYSTEMS_ASM__ */ +#else /* __IAR_SYSTEMS_ASM__ */ /* Register assignments for usbCrc16 on gcc */ /* Calling conventions on gcc: * First parameter passed in r24/r25, second in r22/23 and so on. @@ -151,7 +151,7 @@ RTMODEL "__rt_version", "3" ; unsigned table(unsigned char x) ; { ; unsigned value; -; +; ; value = (unsigned)x << 6; ; value ^= (unsigned)x << 7; ; if(parity(x)) @@ -161,7 +161,7 @@ RTMODEL "__rt_version", "3" ; unsigned usbCrc16(unsigned char *argPtr, unsigned char argLen) ; { ; unsigned crc = 0xffff; -; +; ; while(argLen--) ; crc = table(lo8(crc) ^ *argPtr++) ^ hi8(crc); ; return ~crc; @@ -299,7 +299,7 @@ usbCrc16Append: # define cnt16H r31 # define cntH r18 -#else /* __IAR_SYSTEMS_ASM__ */ +#else /* __IAR_SYSTEMS_ASM__ */ /* Register assignments for usbMeasureFrameLength on gcc */ /* Calling conventions on gcc: * First parameter passed in r24/r25, second in r22/23 and so on. From 34112dac36482edbd5331eac3dfe436752ff7653 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 2 Nov 2018 12:44:57 -0400 Subject: [PATCH 337/505] Adds the Proton C base project (#4224) * adds proton c base * fixes custom matrix include * adds readme.md * usable pins, readme update --- common_features.mk | 2 +- .../boards/GENERIC_STM32_F303XC/board.c | 126 ++ .../boards/GENERIC_STM32_F303XC/board.h | 1187 +++++++++++++++++ .../boards/GENERIC_STM32_F303XC/board.mk | 5 + keyboards/proton_c/bootloader_defs.h | 7 + keyboards/proton_c/chconf.h | 520 ++++++++ keyboards/proton_c/config.h | 121 ++ keyboards/proton_c/halconf.h | 388 ++++++ keyboards/proton_c/keymaps/default/keymap.c | 21 + keyboards/proton_c/mcuconf.h | 257 ++++ keyboards/proton_c/proton_c.c | 25 + keyboards/proton_c/proton_c.h | 18 + keyboards/proton_c/readme.md | 16 + keyboards/proton_c/rules.mk | 51 + 14 files changed, 2743 insertions(+), 1 deletion(-) create mode 100644 keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.c create mode 100644 keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.h create mode 100644 keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.mk create mode 100644 keyboards/proton_c/bootloader_defs.h create mode 100644 keyboards/proton_c/chconf.h create mode 100644 keyboards/proton_c/config.h create mode 100644 keyboards/proton_c/halconf.h create mode 100644 keyboards/proton_c/keymaps/default/keymap.c create mode 100644 keyboards/proton_c/mcuconf.h create mode 100644 keyboards/proton_c/proton_c.c create mode 100644 keyboards/proton_c/proton_c.h create mode 100644 keyboards/proton_c/readme.md create mode 100644 keyboards/proton_c/rules.mk diff --git a/common_features.mk b/common_features.mk index 3fd8361a526c..f44dfc47de1f 100644 --- a/common_features.mk +++ b/common_features.mk @@ -244,7 +244,7 @@ QUANTUM_SRC:= \ $(QUANTUM_DIR)/keymap_common.c \ $(QUANTUM_DIR)/keycode_config.c -ifndef CUSTOM_MATRIX +ifneq ($(strip $(CUSTOM_MATRIX)), yes) ifeq ($(strip $(SPLIT_KEYBOARD)), yes) QUANTUM_SRC += $(QUANTUM_DIR)/split_common/matrix.c else diff --git a/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.c b/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.c new file mode 100644 index 000000000000..4331155df4b6 --- /dev/null +++ b/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.c @@ -0,0 +1,126 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include "hal.h" + +#if HAL_USE_PAL || defined(__DOXYGEN__) +/** + * @brief PAL setup. + * @details Digital I/O ports static configuration as defined in @p board.h. + * This variable is used by the HAL when initializing the PAL driver. + */ +const PALConfig pal_default_config = { +#if STM32_HAS_GPIOA + {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR, + VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH}, +#endif +#if STM32_HAS_GPIOB + {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR, + VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH}, +#endif +#if STM32_HAS_GPIOC + {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR, + VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH}, +#endif +#if STM32_HAS_GPIOD + {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR, + VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH}, +#endif +#if STM32_HAS_GPIOE + {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR, + VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH}, +#endif +#if STM32_HAS_GPIOF + {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR, + VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH}, +#endif +#if STM32_HAS_GPIOG + {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR, + VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH}, +#endif +#if STM32_HAS_GPIOH + {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR, + VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH}, +#endif +#if STM32_HAS_GPIOI + {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR, + VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH} +#endif +}; +#endif + +void enter_bootloader_mode_if_requested(void); + +/** + * @brief Early initialization code. + * @details This initialization must be performed just after stack setup + * and before any other initialization. + */ +void __early_init(void) { + enter_bootloader_mode_if_requested(); + stm32_clock_init(); +} + +#if HAL_USE_SDC || defined(__DOXYGEN__) +/** + * @brief SDC card detection. + */ +bool sdc_lld_is_card_inserted(SDCDriver *sdcp) { + + (void)sdcp; + /* TODO: Fill the implementation.*/ + return true; +} + +/** + * @brief SDC card write protection detection. + */ +bool sdc_lld_is_write_protected(SDCDriver *sdcp) { + + (void)sdcp; + /* TODO: Fill the implementation.*/ + return false; +} +#endif /* HAL_USE_SDC */ + +#if HAL_USE_MMC_SPI || defined(__DOXYGEN__) +/** + * @brief MMC_SPI card detection. + */ +bool mmc_lld_is_card_inserted(MMCDriver *mmcp) { + + (void)mmcp; + /* TODO: Fill the implementation.*/ + return true; +} + +/** + * @brief MMC_SPI card write protection detection. + */ +bool mmc_lld_is_write_protected(MMCDriver *mmcp) { + + (void)mmcp; + /* TODO: Fill the implementation.*/ + return false; +} +#endif + +/** + * @brief Board-specific initialization code. + * @todo Add your board-specific code, if any. + */ +void boardInit(void) { +} diff --git a/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.h b/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.h new file mode 100644 index 000000000000..ec26557f3a62 --- /dev/null +++ b/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.h @@ -0,0 +1,1187 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +/* + * Setup for Clueboard 60% Keyboard + */ + +/* + * Board identifier. + */ +#define BOARD_GENERIC_STM32_F303XC +#define BOARD_NAME "Planck PCB" + +/* + * Board oscillators-related settings. + * NOTE: LSE not fitted. + */ +#if !defined(STM32_LSECLK) +#define STM32_LSECLK 0U +#endif + +#define STM32_LSEDRV (3U << 3U) + +#if !defined(STM32_HSECLK) +#define STM32_HSECLK 8000000U +#endif + +// #define STM32_HSE_BYPASS + +/* + * MCU type as defined in the ST header. + */ +#define STM32F303xC + +/* + * IO pins assignments. + */ +#define GPIOA_PIN0 0U +#define GPIOA_PIN1 1U +#define GPIOA_PIN2 2U +#define GPIOA_PIN3 3U +#define GPIOA_PIN4 4U +#define GPIOA_PIN5 5U +#define GPIOA_PIN6 6U +#define GPIOA_PIN7 7U +#define GPIOA_PIN8 8U +#define GPIOA_PIN9 9U +#define GPIOA_PIN10 10U +#define GPIOA_USB_DM 11U +#define GPIOA_USB_DP 12U +#define GPIOA_SWDIO 13U +#define GPIOA_SWCLK 14U +#define GPIOA_PIN15 15U + +#define GPIOB_PIN0 0U +#define GPIOB_PIN1 1U +#define GPIOB_PIN2 2U +#define GPIOB_PIN3 3U +#define GPIOB_PIN4 4U +#define GPIOB_PIN5 5U +#define GPIOB_PIN6 6U +#define GPIOB_PIN7 7U +#define GPIOB_PIN8 8U +#define GPIOB_PIN9 9U +#define GPIOB_PIN10 10U +#define GPIOB_PIN11 11U +#define GPIOB_PIN12 12U +#define GPIOB_PIN13 13U +#define GPIOB_PIN14 14U +#define GPIOB_PIN15 15U + +#define GPIOC_PIN0 0U +#define GPIOC_PIN1 1U +#define GPIOC_PIN2 2U +#define GPIOC_PIN3 3U +#define GPIOC_PIN4 4U +#define GPIOC_PIN5 5U +#define GPIOC_PIN6 6U +#define GPIOC_PIN7 7U +#define GPIOC_PIN8 8U +#define GPIOC_PIN9 9U +#define GPIOC_PIN10 10U +#define GPIOC_PIN11 11U +#define GPIOC_PIN12 12U +#define GPIOC_PIN13 13U +#define GPIOC_PIN14 14U +#define GPIOC_PIN15 15U + +#define GPIOD_PIN0 0U +#define GPIOD_PIN1 1U +#define GPIOD_PIN2 2U +#define GPIOD_PIN3 3U +#define GPIOD_PIN4 4U +#define GPIOD_PIN5 5U +#define GPIOD_PIN6 6U +#define GPIOD_PIN7 7U +#define GPIOD_PIN8 8U +#define GPIOD_PIN9 9U +#define GPIOD_PIN10 10U +#define GPIOD_PIN11 11U +#define GPIOD_PIN12 12U +#define GPIOD_PIN13 13U +#define GPIOD_PIN14 14U +#define GPIOD_PIN15 15U + +#define GPIOE_PIN0 0U +#define GPIOE_PIN1 1U +#define GPIOE_PIN2 2U +#define GPIOE_PIN3 3U +#define GPIOE_PIN4 4U +#define GPIOE_PIN5 5U +#define GPIOE_PIN6 6U +#define GPIOE_PIN7 7U +#define GPIOE_PIN8 8U +#define GPIOE_PIN9 9U +#define GPIOE_PIN10 10U +#define GPIOE_PIN11 11U +#define GPIOE_PIN12 12U +#define GPIOE_PIN13 13U +#define GPIOE_PIN14 14U +#define GPIOE_PIN15 15U + +#define GPIOF_I2C2_SDA 0U +#define GPIOF_I2C2_SCL 1U +#define GPIOF_PIN2 2U +#define GPIOF_PIN3 3U +#define GPIOF_PIN4 4U +#define GPIOF_PIN5 5U +#define GPIOF_PIN6 6U +#define GPIOF_PIN7 7U +#define GPIOF_PIN8 8U +#define GPIOF_PIN9 9U +#define GPIOF_PIN10 10U +#define GPIOF_PIN11 11U +#define GPIOF_PIN12 12U +#define GPIOF_PIN13 13U +#define GPIOF_PIN14 14U +#define GPIOF_PIN15 15U + +#define GPIOG_PIN0 0U +#define GPIOG_PIN1 1U +#define GPIOG_PIN2 2U +#define GPIOG_PIN3 3U +#define GPIOG_PIN4 4U +#define GPIOG_PIN5 5U +#define GPIOG_PIN6 6U +#define GPIOG_PIN7 7U +#define GPIOG_PIN8 8U +#define GPIOG_PIN9 9U +#define GPIOG_PIN10 10U +#define GPIOG_PIN11 11U +#define GPIOG_PIN12 12U +#define GPIOG_PIN13 13U +#define GPIOG_PIN14 14U +#define GPIOG_PIN15 15U + +#define GPIOH_PIN0 0U +#define GPIOH_PIN1 1U +#define GPIOH_PIN2 2U +#define GPIOH_PIN3 3U +#define GPIOH_PIN4 4U +#define GPIOH_PIN5 5U +#define GPIOH_PIN6 6U +#define GPIOH_PIN7 7U +#define GPIOH_PIN8 8U +#define GPIOH_PIN9 9U +#define GPIOH_PIN10 10U +#define GPIOH_PIN11 11U +#define GPIOH_PIN12 12U +#define GPIOH_PIN13 13U +#define GPIOH_PIN14 14U +#define GPIOH_PIN15 15U + +/* + * IO lines assignments. + */ +#define LINE_L3GD20_SDI PAL_LINE(GPIOA, 7U) +#define LINE_USB_DM PAL_LINE(GPIOA, 11U) +#define LINE_USB_DP PAL_LINE(GPIOA, 12U) +#define LINE_SWDIO PAL_LINE(GPIOA, 13U) +#define LINE_SWCLK PAL_LINE(GPIOA, 14U) + +#define LINE_PIN6 PAL_LINE(GPIOF, 0U) +#define LINE_PIN7 PAL_LINE(GPIOF, 1U) + +#define LINE_CAPS_LOCK PAL_LINE(GPIOB, 7U) + + +/* + * I/O ports initial setup, this configuration is established soon after reset + * in the initialization code. + * Please refer to the STM32 Reference Manual for details. + */ +#define PIN_MODE_INPUT(n) (0U << ((n) * 2U)) +#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U)) +#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U)) +#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U)) +#define PIN_ODR_LOW(n) (0U << (n)) +#define PIN_ODR_HIGH(n) (1U << (n)) +#define PIN_OTYPE_PUSHPULL(n) (0U << (n)) +#define PIN_OTYPE_OPENDRAIN(n) (1U << (n)) +#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U)) +#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U)) +#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U)) +#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U)) +#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U)) +#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U)) +#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U)) +#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U)) + +/* + * GPIOA setup: + * + * PA0 - NC + * PA1 - NC + * PA2 - COL1 + * PA3 - COL2 + * PA4 - SPEAKER1 + * PA5 - SPEAKER2 + * PA6 - COL3 + * PA7 - COL8 + * PA8 - COL6 + * PA9 - COL7 + * PA10 - ROW5 + * PA11 - USB_DM (alternate 14). + * PA12 - USB_DP (alternate 14). + * PA13 - SWDIO (alternate 0). + * PA14 - SWCLK (alternate 0). + * PA15 - ROW4 + */ +#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_PIN0) | \ + PIN_MODE_ALTERNATE(GPIOA_PIN1) | \ + PIN_MODE_INPUT(GPIOA_PIN2) | \ + PIN_MODE_INPUT(GPIOA_PIN3) | \ + PIN_MODE_INPUT(GPIOA_PIN4) | \ + PIN_MODE_INPUT(GPIOA_PIN5) | \ + PIN_MODE_INPUT(GPIOA_PIN6) | \ + PIN_MODE_INPUT(GPIOA_PIN7) | \ + PIN_MODE_INPUT(GPIOA_PIN8) | \ + PIN_MODE_INPUT(GPIOA_PIN9) | \ + PIN_MODE_INPUT(GPIOA_PIN10) | \ + PIN_MODE_ALTERNATE(GPIOA_USB_DM) | \ + PIN_MODE_ALTERNATE(GPIOA_USB_DP) | \ + PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \ + PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \ + PIN_MODE_INPUT(GPIOA_PIN15)) +#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | \ + PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | \ + PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \ + PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \ + PIN_OTYPE_PUSHPULL(GPIOA_PIN15)) +#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_PIN0) | \ + PIN_OSPEED_HIGH(GPIOA_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \ + PIN_OSPEED_HIGH(GPIOA_USB_DM) | \ + PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | \ + PIN_OSPEED_HIGH(GPIOA_SWDIO) | \ + PIN_OSPEED_HIGH(GPIOA_SWCLK) | \ + PIN_OSPEED_VERYLOW(GPIOA_PIN15)) +#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_PIN0) | \ + PIN_PUPDR_FLOATING(GPIOA_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN6) | \ + PIN_PUPDR_FLOATING(GPIOA_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN10) | \ + PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \ + PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \ + PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \ + PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \ + PIN_PUPDR_PULLUP(GPIOA_PIN15)) +#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_PIN0) | \ + PIN_ODR_HIGH(GPIOA_PIN1) | \ + PIN_ODR_HIGH(GPIOA_PIN2) | \ + PIN_ODR_HIGH(GPIOA_PIN3) | \ + PIN_ODR_HIGH(GPIOA_PIN4) | \ + PIN_ODR_HIGH(GPIOA_PIN5) | \ + PIN_ODR_HIGH(GPIOA_PIN6) | \ + PIN_ODR_HIGH(GPIOA_PIN7) | \ + PIN_ODR_HIGH(GPIOA_PIN8) | \ + PIN_ODR_HIGH(GPIOA_PIN9) | \ + PIN_ODR_HIGH(GPIOA_PIN10) | \ + PIN_ODR_HIGH(GPIOA_USB_DM) | \ + PIN_ODR_HIGH(GPIOA_USB_DP) | \ + PIN_ODR_HIGH(GPIOA_SWDIO) | \ + PIN_ODR_HIGH(GPIOA_SWCLK) | \ + PIN_ODR_HIGH(GPIOA_PIN15)) +#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_PIN0, 0) | \ + PIN_AFIO_AF(GPIOA_PIN1, 1) | \ + PIN_AFIO_AF(GPIOA_PIN2, 0) | \ + PIN_AFIO_AF(GPIOA_PIN3, 0) | \ + PIN_AFIO_AF(GPIOA_PIN4, 0) | \ + PIN_AFIO_AF(GPIOA_PIN5, 5) | \ + PIN_AFIO_AF(GPIOA_PIN6, 5) | \ + PIN_AFIO_AF(GPIOA_PIN7, 5)) +#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0) | \ + PIN_AFIO_AF(GPIOA_PIN9, 0) | \ + PIN_AFIO_AF(GPIOA_PIN10, 0) | \ + PIN_AFIO_AF(GPIOA_USB_DM, 14) | \ + PIN_AFIO_AF(GPIOA_USB_DP, 14) | \ + PIN_AFIO_AF(GPIOA_SWDIO, 0) | \ + PIN_AFIO_AF(GPIOA_SWCLK, 0) | \ + PIN_AFIO_AF(GPIOA_PIN15, 0)) + +/* + * GPIOB setup: + * + * PB0 - PIN0 (input pullup). + * PB1 - PIN1 (input pullup). + * PB2 - PIN2 (input pullup). + * PB3 - PIN3 (alternate 0). + * PB4 - PIN4 (input pullup). + * PB5 - PIN5 (input pullup). + * PB6 - PIN6 LSM303DLHC_SCL (alternate 4). + * PB7 - PIN7 LSM303DLHC_SDA (alternate 4). + * PB8 - PIN8 (input pullup). + * PB9 - PIN9 (input pullup). + * PB10 - PIN10 (input pullup). + * PB11 - PIN11 (input pullup). + * PB12 - PIN12 (input pullup). + * PB13 - PIN13 (input pullup). + * PB14 - PIN14 (input pullup). + * PB15 - PIN15 (input pullup). + */ +#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \ + PIN_MODE_INPUT(GPIOB_PIN1) | \ + PIN_MODE_INPUT(GPIOB_PIN2) | \ + PIN_MODE_ALTERNATE(GPIOB_PIN3) | \ + PIN_MODE_INPUT(GPIOB_PIN4) | \ + PIN_MODE_INPUT(GPIOB_PIN5) | \ + PIN_MODE_ALTERNATE(GPIOB_PIN6) | \ + PIN_MODE_OUTPUT(GPIOB_PIN7) | \ + PIN_MODE_INPUT(GPIOB_PIN8) | \ + PIN_MODE_INPUT(GPIOB_PIN9) | \ + PIN_MODE_INPUT(GPIOB_PIN10) | \ + PIN_MODE_INPUT(GPIOB_PIN11) | \ + PIN_MODE_INPUT(GPIOB_PIN12) | \ + PIN_MODE_INPUT(GPIOB_PIN13) | \ + PIN_MODE_INPUT(GPIOB_PIN14) | \ + PIN_MODE_INPUT(GPIOB_PIN15)) +#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \ + PIN_OTYPE_OPENDRAIN(GPIOB_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOB_PIN15)) +#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN2) | \ + PIN_OSPEED_HIGH(GPIOB_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \ + PIN_OSPEED_HIGH(GPIOB_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOB_PIN15)) +#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN2) | \ + PIN_PUPDR_FLOATING(GPIOB_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN5) | \ + PIN_PUPDR_FLOATING(GPIOB_PIN6) | \ + PIN_PUPDR_PULLDOWN(GPIOB_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOB_PIN15)) +#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \ + PIN_ODR_HIGH(GPIOB_PIN1) | \ + PIN_ODR_HIGH(GPIOB_PIN2) | \ + PIN_ODR_HIGH(GPIOB_PIN3) | \ + PIN_ODR_HIGH(GPIOB_PIN4) | \ + PIN_ODR_HIGH(GPIOB_PIN5) | \ + PIN_ODR_HIGH(GPIOB_PIN6) | \ + PIN_ODR_LOW(GPIOB_PIN7) | \ + PIN_ODR_HIGH(GPIOB_PIN8) | \ + PIN_ODR_HIGH(GPIOB_PIN9) | \ + PIN_ODR_HIGH(GPIOB_PIN10) | \ + PIN_ODR_HIGH(GPIOB_PIN11) | \ + PIN_ODR_HIGH(GPIOB_PIN12) | \ + PIN_ODR_HIGH(GPIOB_PIN13) | \ + PIN_ODR_HIGH(GPIOB_PIN14) | \ + PIN_ODR_HIGH(GPIOB_PIN15)) +#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0) | \ + PIN_AFIO_AF(GPIOB_PIN1, 0) | \ + PIN_AFIO_AF(GPIOB_PIN2, 0) | \ + PIN_AFIO_AF(GPIOB_PIN3, 0) | \ + PIN_AFIO_AF(GPIOB_PIN4, 0) | \ + PIN_AFIO_AF(GPIOB_PIN5, 0) | \ + PIN_AFIO_AF(GPIOB_PIN6, 4) | \ + PIN_AFIO_AF(GPIOB_PIN7, 0)) +#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0) | \ + PIN_AFIO_AF(GPIOB_PIN9, 0) | \ + PIN_AFIO_AF(GPIOB_PIN10, 0) | \ + PIN_AFIO_AF(GPIOB_PIN11, 0) | \ + PIN_AFIO_AF(GPIOB_PIN12, 0) | \ + PIN_AFIO_AF(GPIOB_PIN13, 0) | \ + PIN_AFIO_AF(GPIOB_PIN14, 0) | \ + PIN_AFIO_AF(GPIOB_PIN15, 0)) + +/* + * GPIOC setup: + * + * PC0 - PIN0 (input pullup). + * PC1 - PIN1 (input pullup). + * PC2 - PIN2 (input pullup). + * PC3 - PIN3 (input pullup). + * PC4 - PIN4 (input pullup). + * PC5 - PIN5 (input pullup). + * PC6 - PIN6 (input pullup). + * PC7 - PIN7 (input pullup). + * PC8 - PIN8 (input pullup). + * PC9 - PIN9 (input pullup). + * PC10 - PIN10 (input pullup). + * PC11 - PIN11 (input pullup). + * PC12 - PIN12 (input pullup). + * PC13 - PIN13 (input pullup). + * PC14 - PIN14 (input floating). + * PC15 - PIN15 (input floating). + */ +#define VAL_GPIOC_MODER (PIN_MODE_INPUT(GPIOC_PIN0) | \ + PIN_MODE_INPUT(GPIOC_PIN1) | \ + PIN_MODE_INPUT(GPIOC_PIN2) | \ + PIN_MODE_INPUT(GPIOC_PIN3) | \ + PIN_MODE_INPUT(GPIOC_PIN4) | \ + PIN_MODE_INPUT(GPIOC_PIN5) | \ + PIN_MODE_INPUT(GPIOC_PIN6) | \ + PIN_MODE_INPUT(GPIOC_PIN7) | \ + PIN_MODE_INPUT(GPIOC_PIN8) | \ + PIN_MODE_INPUT(GPIOC_PIN9) | \ + PIN_MODE_INPUT(GPIOC_PIN10) | \ + PIN_MODE_INPUT(GPIOC_PIN11) | \ + PIN_MODE_INPUT(GPIOC_PIN12) | \ + PIN_MODE_INPUT(GPIOC_PIN13) | \ + PIN_MODE_INPUT(GPIOC_PIN14) | \ + PIN_MODE_INPUT(GPIOC_PIN15)) +#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN15)) +#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOC_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOC_PIN13) | \ + PIN_OSPEED_HIGH(GPIOC_PIN14) | \ + PIN_OSPEED_HIGH(GPIOC_PIN15)) +#define VAL_GPIOC_PUPDR (PIN_PUPDR_PULLUP(GPIOC_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOC_PIN13) | \ + PIN_PUPDR_FLOATING(GPIOC_PIN14) | \ + PIN_PUPDR_FLOATING(GPIOC_PIN15)) +#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_PIN0) | \ + PIN_ODR_HIGH(GPIOC_PIN1) | \ + PIN_ODR_HIGH(GPIOC_PIN2) | \ + PIN_ODR_HIGH(GPIOC_PIN3) | \ + PIN_ODR_HIGH(GPIOC_PIN4) | \ + PIN_ODR_HIGH(GPIOC_PIN5) | \ + PIN_ODR_HIGH(GPIOC_PIN6) | \ + PIN_ODR_HIGH(GPIOC_PIN7) | \ + PIN_ODR_HIGH(GPIOC_PIN8) | \ + PIN_ODR_HIGH(GPIOC_PIN9) | \ + PIN_ODR_HIGH(GPIOC_PIN10) | \ + PIN_ODR_HIGH(GPIOC_PIN11) | \ + PIN_ODR_HIGH(GPIOC_PIN12) | \ + PIN_ODR_HIGH(GPIOC_PIN13) | \ + PIN_ODR_HIGH(GPIOC_PIN14) | \ + PIN_ODR_HIGH(GPIOC_PIN15)) +#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_PIN0, 0) | \ + PIN_AFIO_AF(GPIOC_PIN1, 0) | \ + PIN_AFIO_AF(GPIOC_PIN2, 0) | \ + PIN_AFIO_AF(GPIOC_PIN3, 0) | \ + PIN_AFIO_AF(GPIOC_PIN4, 0) | \ + PIN_AFIO_AF(GPIOC_PIN5, 0) | \ + PIN_AFIO_AF(GPIOC_PIN6, 0) | \ + PIN_AFIO_AF(GPIOC_PIN7, 0)) +#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_PIN8, 0) | \ + PIN_AFIO_AF(GPIOC_PIN9, 0) | \ + PIN_AFIO_AF(GPIOC_PIN10, 0) | \ + PIN_AFIO_AF(GPIOC_PIN11, 0) | \ + PIN_AFIO_AF(GPIOC_PIN12, 0) | \ + PIN_AFIO_AF(GPIOC_PIN13, 0) | \ + PIN_AFIO_AF(GPIOC_PIN14, 0) | \ + PIN_AFIO_AF(GPIOC_PIN15, 0)) + +/* + * GPIOD setup: + * + * PD0 - PIN0 (input pullup). + * PD1 - PIN1 (input pullup). + * PD2 - PIN2 (input pullup). + * PD3 - PIN3 (input pullup). + * PD4 - PIN4 (input pullup). + * PD5 - PIN5 (input pullup). + * PD6 - PIN6 (input pullup). + * PD7 - PIN7 (input pullup). + * PD8 - PIN8 (input pullup). + * PD9 - PIN9 (input pullup). + * PD11 - PIN10 (input pullup). + * PD11 - PIN11 (input pullup). + * PD12 - PIN12 (input pullup). + * PD13 - PIN13 (input pullup). + * PD14 - PIN14 (input pullup). + * PD15 - PIN15 (input pullup). + */ +#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \ + PIN_MODE_INPUT(GPIOD_PIN1) | \ + PIN_MODE_INPUT(GPIOD_PIN2) | \ + PIN_MODE_INPUT(GPIOD_PIN3) | \ + PIN_MODE_INPUT(GPIOD_PIN4) | \ + PIN_MODE_INPUT(GPIOD_PIN5) | \ + PIN_MODE_INPUT(GPIOD_PIN6) | \ + PIN_MODE_INPUT(GPIOD_PIN7) | \ + PIN_MODE_INPUT(GPIOD_PIN8) | \ + PIN_MODE_INPUT(GPIOD_PIN9) | \ + PIN_MODE_INPUT(GPIOD_PIN10) | \ + PIN_MODE_INPUT(GPIOD_PIN11) | \ + PIN_MODE_INPUT(GPIOD_PIN12) | \ + PIN_MODE_INPUT(GPIOD_PIN13) | \ + PIN_MODE_INPUT(GPIOD_PIN14) | \ + PIN_MODE_INPUT(GPIOD_PIN15)) +#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN15)) +#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOD_PIN15)) +#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN15)) +#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \ + PIN_ODR_HIGH(GPIOD_PIN1) | \ + PIN_ODR_HIGH(GPIOD_PIN2) | \ + PIN_ODR_HIGH(GPIOD_PIN3) | \ + PIN_ODR_HIGH(GPIOD_PIN4) | \ + PIN_ODR_HIGH(GPIOD_PIN5) | \ + PIN_ODR_HIGH(GPIOD_PIN6) | \ + PIN_ODR_HIGH(GPIOD_PIN7) | \ + PIN_ODR_HIGH(GPIOD_PIN8) | \ + PIN_ODR_HIGH(GPIOD_PIN9) | \ + PIN_ODR_HIGH(GPIOD_PIN10) | \ + PIN_ODR_HIGH(GPIOD_PIN11) | \ + PIN_ODR_HIGH(GPIOD_PIN12) | \ + PIN_ODR_HIGH(GPIOD_PIN13) | \ + PIN_ODR_HIGH(GPIOD_PIN14) | \ + PIN_ODR_HIGH(GPIOD_PIN15)) +#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0) | \ + PIN_AFIO_AF(GPIOD_PIN1, 0) | \ + PIN_AFIO_AF(GPIOD_PIN2, 0) | \ + PIN_AFIO_AF(GPIOD_PIN3, 0) | \ + PIN_AFIO_AF(GPIOD_PIN4, 0) | \ + PIN_AFIO_AF(GPIOD_PIN5, 0) | \ + PIN_AFIO_AF(GPIOD_PIN6, 0) | \ + PIN_AFIO_AF(GPIOD_PIN7, 0)) +#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0) | \ + PIN_AFIO_AF(GPIOD_PIN9, 0) | \ + PIN_AFIO_AF(GPIOD_PIN10, 0) | \ + PIN_AFIO_AF(GPIOD_PIN11, 0) | \ + PIN_AFIO_AF(GPIOD_PIN12, 0) | \ + PIN_AFIO_AF(GPIOD_PIN13, 0) | \ + PIN_AFIO_AF(GPIOD_PIN14, 0) | \ + PIN_AFIO_AF(GPIOD_PIN15, 0)) + +/* + * GPIOE setup: + * + * PE0 - PIN0 (input pullup). + * PE1 - PIN1 (input pullup). + * PE2 - PIN2 (input pullup). + * PE3 - PIN3 L3GD20_CS (output pushpull maximum). + * PE4 - PIN4 (input pullup). + * PE5 - PIN5 (input pullup). + * PE6 - PIN6 (input pullup). + * PE7 - PIN7 (input pullup). + * PE8 - PIN8 (output pushpull maximum). + * PE9 - PIN9 (output pushpull maximum). + * PE10 - PIN10 (output pushpull maximum). + * PE11 - PIN11 (output pushpull maximum). + * PE12 - PIN12 (output pushpull maximum). + * PE13 - PIN13 (output pushpull maximum). + * PE14 - PIN14 (output pushpull maximum). + * PE15 - PIN15 (output pushpull maximum). + */ +#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \ + PIN_MODE_INPUT(GPIOE_PIN1) | \ + PIN_MODE_INPUT(GPIOE_PIN2) |\ + PIN_MODE_OUTPUT(GPIOE_PIN3) | \ + PIN_MODE_INPUT(GPIOE_PIN4) |\ + PIN_MODE_INPUT(GPIOE_PIN5) |\ + PIN_MODE_INPUT(GPIOE_PIN6) | \ + PIN_MODE_INPUT(GPIOE_PIN7) | \ + PIN_MODE_OUTPUT(GPIOE_PIN8) | \ + PIN_MODE_OUTPUT(GPIOE_PIN9) | \ + PIN_MODE_OUTPUT(GPIOE_PIN10) | \ + PIN_MODE_OUTPUT(GPIOE_PIN11) | \ + PIN_MODE_OUTPUT(GPIOE_PIN12) | \ + PIN_MODE_OUTPUT(GPIOE_PIN13) | \ + PIN_MODE_OUTPUT(GPIOE_PIN14) | \ + PIN_MODE_OUTPUT(GPIOE_PIN15)) +#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN1) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN2) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN4) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN5) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN10) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN14) |\ + PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) +#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN1) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN2) |\ + PIN_OSPEED_HIGH(GPIOE_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN4) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN5) |\ + PIN_OSPEED_VERYLOW(GPIOE_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOE_PIN7) | \ + PIN_OSPEED_HIGH(GPIOE_PIN8) | \ + PIN_OSPEED_HIGH(GPIOE_PIN9) | \ + PIN_OSPEED_HIGH(GPIOE_PIN10) | \ + PIN_OSPEED_HIGH(GPIOE_PIN11) | \ + PIN_OSPEED_HIGH(GPIOE_PIN12) | \ + PIN_OSPEED_HIGH(GPIOE_PIN13) | \ + PIN_OSPEED_HIGH(GPIOE_PIN14) | \ + PIN_OSPEED_HIGH(GPIOE_PIN15)) +#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN2) |\ + PIN_PUPDR_FLOATING(GPIOE_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN4) |\ + PIN_PUPDR_PULLUP(GPIOE_PIN5) |\ + PIN_PUPDR_PULLUP(GPIOE_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN10) | \ + PIN_PUPDR_FLOATING(GPIOE_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOE_PIN12) | \ + PIN_PUPDR_FLOATING(GPIOE_PIN13) | \ + PIN_PUPDR_FLOATING(GPIOE_PIN14) |\ + PIN_PUPDR_FLOATING(GPIOE_PIN15)) +#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ + PIN_ODR_HIGH(GPIOE_PIN1) | \ + PIN_ODR_HIGH(GPIOE_PIN2) | \ + PIN_ODR_HIGH(GPIOE_PIN3) | \ + PIN_ODR_HIGH(GPIOE_PIN4) | \ + PIN_ODR_HIGH(GPIOE_PIN5) | \ + PIN_ODR_HIGH(GPIOE_PIN6) | \ + PIN_ODR_HIGH(GPIOE_PIN7) | \ + PIN_ODR_LOW(GPIOE_PIN8) | \ + PIN_ODR_LOW(GPIOE_PIN9) | \ + PIN_ODR_LOW(GPIOE_PIN10) | \ + PIN_ODR_LOW(GPIOE_PIN11) | \ + PIN_ODR_LOW(GPIOE_PIN12) | \ + PIN_ODR_LOW(GPIOE_PIN13) | \ + PIN_ODR_LOW(GPIOE_PIN14) | \ + PIN_ODR_LOW(GPIOE_PIN15)) +#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0) | \ + PIN_AFIO_AF(GPIOE_PIN1, 0) | \ + PIN_AFIO_AF(GPIOE_PIN2, 0) |\ + PIN_AFIO_AF(GPIOE_PIN3, 0) | \ + PIN_AFIO_AF(GPIOE_PIN4, 0) |\ + PIN_AFIO_AF(GPIOE_PIN5, 0) |\ + PIN_AFIO_AF(GPIOE_PIN6, 0) | \ + PIN_AFIO_AF(GPIOE_PIN7, 0)) +#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0) | \ + PIN_AFIO_AF(GPIOE_PIN9, 0) | \ + PIN_AFIO_AF(GPIOE_PIN10, 0) | \ + PIN_AFIO_AF(GPIOE_PIN11, 0) | \ + PIN_AFIO_AF(GPIOE_PIN12, 0) | \ + PIN_AFIO_AF(GPIOE_PIN13, 0) | \ + PIN_AFIO_AF(GPIOE_PIN14, 0) | \ + PIN_AFIO_AF(GPIOE_PIN15, 0)) + +/* + * GPIOF setup: + * + * PF0 - I2C2_SDA (input floating). + * PF1 - I2C2_SCL (input floating). + * PF2 - PIN2 (input pullup). + * PF3 - PIN3 (input pullup). + * PF4 - PIN4 (input pullup). + * PF5 - PIN5 (input pullup). + * PF6 - PIN6 (input pullup). + * PF7 - PIN7 (input pullup). + * PF8 - PIN8 (input pullup). + * PF9 - PIN9 (input pullup). + * PF10 - PIN10 (input pullup). + * PF11 - PIN11 (input pullup). + * PF12 - PIN12 (input pullup). + * PF13 - PIN13 (input pullup). + * PF14 - PIN14 (input pullup). + * PF15 - PIN15 (input pullup). + */ +#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_I2C2_SDA) | \ + PIN_MODE_INPUT(GPIOF_I2C2_SCL) | \ + PIN_MODE_INPUT(GPIOF_PIN2) | \ + PIN_MODE_INPUT(GPIOF_PIN3) | \ + PIN_MODE_INPUT(GPIOF_PIN4) | \ + PIN_MODE_INPUT(GPIOF_PIN5) | \ + PIN_MODE_INPUT(GPIOF_PIN6) | \ + PIN_MODE_INPUT(GPIOF_PIN7) | \ + PIN_MODE_INPUT(GPIOF_PIN8) | \ + PIN_MODE_INPUT(GPIOF_PIN9) | \ + PIN_MODE_INPUT(GPIOF_PIN10) | \ + PIN_MODE_INPUT(GPIOF_PIN11) | \ + PIN_MODE_INPUT(GPIOF_PIN12) | \ + PIN_MODE_INPUT(GPIOF_PIN13) | \ + PIN_MODE_INPUT(GPIOF_PIN14) | \ + PIN_MODE_INPUT(GPIOF_PIN15)) +#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SDA) | \ + PIN_OTYPE_PUSHPULL(GPIOF_I2C2_SCL) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOF_PIN15)) +#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_HIGH(GPIOF_I2C2_SDA) | \ + PIN_OSPEED_HIGH(GPIOF_I2C2_SCL) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOF_PIN15)) +#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_I2C2_SDA) | \ + PIN_PUPDR_FLOATING(GPIOF_I2C2_SCL) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOF_PIN15)) +#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_I2C2_SDA) | \ + PIN_ODR_HIGH(GPIOF_I2C2_SCL) | \ + PIN_ODR_HIGH(GPIOF_PIN2) | \ + PIN_ODR_HIGH(GPIOF_PIN3) | \ + PIN_ODR_HIGH(GPIOF_PIN4) | \ + PIN_ODR_HIGH(GPIOF_PIN5) | \ + PIN_ODR_HIGH(GPIOF_PIN6) | \ + PIN_ODR_HIGH(GPIOF_PIN7) | \ + PIN_ODR_HIGH(GPIOF_PIN8) | \ + PIN_ODR_HIGH(GPIOF_PIN9) | \ + PIN_ODR_HIGH(GPIOF_PIN10) | \ + PIN_ODR_HIGH(GPIOF_PIN11) | \ + PIN_ODR_HIGH(GPIOF_PIN12) | \ + PIN_ODR_HIGH(GPIOF_PIN13) | \ + PIN_ODR_HIGH(GPIOF_PIN14) | \ + PIN_ODR_HIGH(GPIOF_PIN15)) +#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_I2C2_SDA, 0) | \ + PIN_AFIO_AF(GPIOF_I2C2_SCL, 0) | \ + PIN_AFIO_AF(GPIOF_PIN2, 0) | \ + PIN_AFIO_AF(GPIOF_PIN3, 0) | \ + PIN_AFIO_AF(GPIOF_PIN4, 0) | \ + PIN_AFIO_AF(GPIOF_PIN5, 0) | \ + PIN_AFIO_AF(GPIOF_PIN6, 0) | \ + PIN_AFIO_AF(GPIOF_PIN7, 0)) +#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0) | \ + PIN_AFIO_AF(GPIOF_PIN9, 0) | \ + PIN_AFIO_AF(GPIOF_PIN10, 0) | \ + PIN_AFIO_AF(GPIOF_PIN11, 0) | \ + PIN_AFIO_AF(GPIOF_PIN12, 0) | \ + PIN_AFIO_AF(GPIOF_PIN13, 0) | \ + PIN_AFIO_AF(GPIOF_PIN14, 0) | \ + PIN_AFIO_AF(GPIOF_PIN15, 0)) + +/* + * GPIOG setup: + * + * PG0 - PIN0 (input pullup). + * PG1 - PIN1 (input pullup). + * PG2 - PIN2 (input pullup). + * PG3 - PIN3 (input pullup). + * PG4 - PIN4 (input pullup). + * PG5 - PIN5 (input pullup). + * PG6 - PIN6 (input pullup). + * PG7 - PIN7 (input pullup). + * PG8 - PIN8 (input pullup). + * PG9 - PIN9 (input pullup). + * PG10 - PIN10 (input pullup). + * PG11 - PIN11 (input pullup). + * PG12 - PIN12 (input pullup). + * PG13 - PIN13 (input pullup). + * PG14 - PIN14 (input pullup). + * PG15 - PIN15 (input pullup). + */ +#define VAL_GPIOG_MODER (PIN_MODE_INPUT(GPIOG_PIN0) | \ + PIN_MODE_INPUT(GPIOG_PIN1) | \ + PIN_MODE_INPUT(GPIOG_PIN2) | \ + PIN_MODE_INPUT(GPIOG_PIN3) | \ + PIN_MODE_INPUT(GPIOG_PIN4) | \ + PIN_MODE_INPUT(GPIOG_PIN5) | \ + PIN_MODE_INPUT(GPIOG_PIN6) | \ + PIN_MODE_INPUT(GPIOG_PIN7) | \ + PIN_MODE_INPUT(GPIOG_PIN8) | \ + PIN_MODE_INPUT(GPIOG_PIN9) | \ + PIN_MODE_INPUT(GPIOG_PIN10) | \ + PIN_MODE_INPUT(GPIOG_PIN11) | \ + PIN_MODE_INPUT(GPIOG_PIN12) | \ + PIN_MODE_INPUT(GPIOG_PIN13) | \ + PIN_MODE_INPUT(GPIOG_PIN14) | \ + PIN_MODE_INPUT(GPIOG_PIN15)) +#define VAL_GPIOG_OTYPER (PIN_OTYPE_PUSHPULL(GPIOG_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOG_PIN15)) +#define VAL_GPIOG_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOG_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOG_PIN15)) +#define VAL_GPIOG_PUPDR (PIN_PUPDR_PULLUP(GPIOG_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOG_PIN15)) +#define VAL_GPIOG_ODR (PIN_ODR_HIGH(GPIOG_PIN0) | \ + PIN_ODR_HIGH(GPIOG_PIN1) | \ + PIN_ODR_HIGH(GPIOG_PIN2) | \ + PIN_ODR_HIGH(GPIOG_PIN3) | \ + PIN_ODR_HIGH(GPIOG_PIN4) | \ + PIN_ODR_HIGH(GPIOG_PIN5) | \ + PIN_ODR_HIGH(GPIOG_PIN6) | \ + PIN_ODR_HIGH(GPIOG_PIN7) | \ + PIN_ODR_HIGH(GPIOG_PIN8) | \ + PIN_ODR_HIGH(GPIOG_PIN9) | \ + PIN_ODR_HIGH(GPIOG_PIN10) | \ + PIN_ODR_HIGH(GPIOG_PIN11) | \ + PIN_ODR_HIGH(GPIOG_PIN12) | \ + PIN_ODR_HIGH(GPIOG_PIN13) | \ + PIN_ODR_HIGH(GPIOG_PIN14) | \ + PIN_ODR_HIGH(GPIOG_PIN15)) +#define VAL_GPIOG_AFRL (PIN_AFIO_AF(GPIOG_PIN0, 0) | \ + PIN_AFIO_AF(GPIOG_PIN1, 0) | \ + PIN_AFIO_AF(GPIOG_PIN2, 0) | \ + PIN_AFIO_AF(GPIOG_PIN3, 0) | \ + PIN_AFIO_AF(GPIOG_PIN4, 0) | \ + PIN_AFIO_AF(GPIOG_PIN5, 0) | \ + PIN_AFIO_AF(GPIOG_PIN6, 0) | \ + PIN_AFIO_AF(GPIOG_PIN7, 0)) +#define VAL_GPIOG_AFRH (PIN_AFIO_AF(GPIOG_PIN8, 0) | \ + PIN_AFIO_AF(GPIOG_PIN9, 0) | \ + PIN_AFIO_AF(GPIOG_PIN10, 0) | \ + PIN_AFIO_AF(GPIOG_PIN11, 0) | \ + PIN_AFIO_AF(GPIOG_PIN12, 0) | \ + PIN_AFIO_AF(GPIOG_PIN13, 0) | \ + PIN_AFIO_AF(GPIOG_PIN14, 0) | \ + PIN_AFIO_AF(GPIOG_PIN15, 0)) + +/* + * GPIOH setup: + * + * PH0 - PIN0 (input pullup). + * PH1 - PIN1 (input pullup). + * PH2 - PIN2 (input pullup). + * PH3 - PIN3 (input pullup). + * PH4 - PIN4 (input pullup). + * PH5 - PIN5 (input pullup). + * PH6 - PIN6 (input pullup). + * PH7 - PIN7 (input pullup). + * PH8 - PIN8 (input pullup). + * PH9 - PIN9 (input pullup). + * PH10 - PIN10 (input pullup). + * PH11 - PIN11 (input pullup). + * PH12 - PIN12 (input pullup). + * PH13 - PIN13 (input pullup). + * PH14 - PIN14 (input pullup). + * PH15 - PIN15 (input pullup). + */ +#define VAL_GPIOH_MODER (PIN_MODE_INPUT(GPIOH_PIN0) | \ + PIN_MODE_INPUT(GPIOH_PIN1) | \ + PIN_MODE_INPUT(GPIOH_PIN2) | \ + PIN_MODE_INPUT(GPIOH_PIN3) | \ + PIN_MODE_INPUT(GPIOH_PIN4) | \ + PIN_MODE_INPUT(GPIOH_PIN5) | \ + PIN_MODE_INPUT(GPIOH_PIN6) | \ + PIN_MODE_INPUT(GPIOH_PIN7) | \ + PIN_MODE_INPUT(GPIOH_PIN8) | \ + PIN_MODE_INPUT(GPIOH_PIN9) | \ + PIN_MODE_INPUT(GPIOH_PIN10) | \ + PIN_MODE_INPUT(GPIOH_PIN11) | \ + PIN_MODE_INPUT(GPIOH_PIN12) | \ + PIN_MODE_INPUT(GPIOH_PIN13) | \ + PIN_MODE_INPUT(GPIOH_PIN14) | \ + PIN_MODE_INPUT(GPIOH_PIN15)) +#define VAL_GPIOH_OTYPER (PIN_OTYPE_PUSHPULL(GPIOH_PIN0) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN1) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN2) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN3) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN4) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN5) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN6) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN11) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN13) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOH_PIN15)) +#define VAL_GPIOH_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOH_PIN0) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN1) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN2) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN3) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN4) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN5) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN6) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN7) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN8) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN9) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN10) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN11) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN12) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN13) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN14) | \ + PIN_OSPEED_VERYLOW(GPIOH_PIN15)) +#define VAL_GPIOH_PUPDR (PIN_PUPDR_PULLUP(GPIOH_PIN0) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN1) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN2) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN3) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN4) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN5) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN6) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN7) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN10) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN11) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN12) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN13) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN14) | \ + PIN_PUPDR_PULLUP(GPIOH_PIN15)) +#define VAL_GPIOH_ODR (PIN_ODR_HIGH(GPIOH_PIN0) | \ + PIN_ODR_HIGH(GPIOH_PIN1) | \ + PIN_ODR_HIGH(GPIOH_PIN2) | \ + PIN_ODR_HIGH(GPIOH_PIN3) | \ + PIN_ODR_HIGH(GPIOH_PIN4) | \ + PIN_ODR_HIGH(GPIOH_PIN5) | \ + PIN_ODR_HIGH(GPIOH_PIN6) | \ + PIN_ODR_HIGH(GPIOH_PIN7) | \ + PIN_ODR_HIGH(GPIOH_PIN8) | \ + PIN_ODR_HIGH(GPIOH_PIN9) | \ + PIN_ODR_HIGH(GPIOH_PIN10) | \ + PIN_ODR_HIGH(GPIOH_PIN11) | \ + PIN_ODR_HIGH(GPIOH_PIN12) | \ + PIN_ODR_HIGH(GPIOH_PIN13) | \ + PIN_ODR_HIGH(GPIOH_PIN14) | \ + PIN_ODR_HIGH(GPIOH_PIN15)) +#define VAL_GPIOH_AFRL (PIN_AFIO_AF(GPIOH_PIN0, 0) | \ + PIN_AFIO_AF(GPIOH_PIN1, 0) | \ + PIN_AFIO_AF(GPIOH_PIN2, 0) | \ + PIN_AFIO_AF(GPIOH_PIN3, 0) | \ + PIN_AFIO_AF(GPIOH_PIN4, 0) | \ + PIN_AFIO_AF(GPIOH_PIN5, 0) | \ + PIN_AFIO_AF(GPIOH_PIN6, 0) | \ + PIN_AFIO_AF(GPIOH_PIN7, 0)) +#define VAL_GPIOH_AFRH (PIN_AFIO_AF(GPIOH_PIN8, 0) | \ + PIN_AFIO_AF(GPIOH_PIN9, 0) | \ + PIN_AFIO_AF(GPIOH_PIN10, 0) | \ + PIN_AFIO_AF(GPIOH_PIN11, 0) | \ + PIN_AFIO_AF(GPIOH_PIN12, 0) | \ + PIN_AFIO_AF(GPIOH_PIN13, 0) | \ + PIN_AFIO_AF(GPIOH_PIN14, 0) | \ + PIN_AFIO_AF(GPIOH_PIN15, 0)) + + +/* + * USB bus activation macro, required by the USB driver. + */ +// #define usb_lld_connect_bus(usbp) +#define usb_lld_connect_bus(usbp) (palSetPadMode(GPIOA, GPIOA_USB_DP, PAL_MODE_ALTERNATE(14))) +// #define usb_lld_connect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_INPUT) +/* + * USB bus de-activation macro, required by the USB driver. + */ +// #define usb_lld_disconnect_bus(usbp) +#define usb_lld_disconnect_bus(usbp) (palSetPadMode(GPIOA, GPIOA_USB_DP, PAL_MODE_OUTPUT_PUSHPULL)); palClearPad(GPIOA, GPIOA_USB_DP) +// #define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12) + +#if !defined(_FROM_ASM_) +#ifdef __cplusplus +extern "C" { +#endif + void boardInit(void); +#ifdef __cplusplus +} +#endif +#endif /* _FROM_ASM_ */ + +#endif /* _BOARD_H_ */ diff --git a/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.mk b/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.mk new file mode 100644 index 000000000000..43377629a3cc --- /dev/null +++ b/keyboards/proton_c/boards/GENERIC_STM32_F303XC/board.mk @@ -0,0 +1,5 @@ +# List of all the board related files. +BOARDSRC = $(BOARD_PATH)/boards/GENERIC_STM32_F303XC/board.c + +# Required include directories +BOARDINC = $(BOARD_PATH)/boards/GENERIC_STM32_F303XC diff --git a/keyboards/proton_c/bootloader_defs.h b/keyboards/proton_c/bootloader_defs.h new file mode 100644 index 000000000000..3b0e9d20a6ab --- /dev/null +++ b/keyboards/proton_c/bootloader_defs.h @@ -0,0 +1,7 @@ +/* Address for jumping to bootloader on STM32 chips. */ +/* It is chip dependent, the correct number can be looked up here: + * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf + * This also requires a patch to chibios: + * /tmk_core/tool/chibios/ch-bootloader-jump.patch + */ +#define STM32_BOOTLOADER_ADDRESS 0x1FFFD800 diff --git a/keyboards/proton_c/chconf.h b/keyboards/proton_c/chconf.h new file mode 100644 index 000000000000..1d9f12ff1f8b --- /dev/null +++ b/keyboards/proton_c/chconf.h @@ -0,0 +1,520 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16 or 32 bits. + */ +#define CH_CFG_ST_RESOLUTION 32 + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#define CH_CFG_ST_FREQUENCY 100000 + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#define CH_CFG_ST_TIMEDELTA 2 + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#define CH_CFG_TIME_QUANTUM 0 + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#define CH_CFG_MEMCORE_SIZE 0 + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#define CH_CFG_NO_IDLE_THREAD FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#define CH_CFG_OPTIMIZE_SPEED TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_TM TRUE + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_REGISTRY TRUE + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_WAITEXIT TRUE + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_SEMAPHORES TRUE + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MUTEXES TRUE + +/** + * @brief Enables recursive behavior on mutexes. + * @note Recursive mutexes are heavier and have an increased + * memory footprint. + * + * @note The default is @p FALSE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_CONDVARS TRUE + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_CONDVARS. + */ +#define CH_CFG_USE_CONDVARS_TIMEOUT TRUE + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_EVENTS TRUE + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_EVENTS. + */ +#define CH_CFG_USE_EVENTS_TIMEOUT TRUE + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MESSAGES TRUE + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_MESSAGES. + */ +#define CH_CFG_USE_MESSAGES_PRIORITY TRUE + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_MAILBOXES TRUE + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMCORE TRUE + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#define CH_CFG_USE_HEAP TRUE + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMPOOLS TRUE + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_WAITEXIT. + * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. + */ +#define CH_CFG_USE_DYNAMIC TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, kernel statistics. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_STATISTICS FALSE + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_SYSTEM_STATE_CHECK FALSE + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_CHECKS FALSE + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_ASSERTS FALSE + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the trace buffer is activated. + * + * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_BUFFER_SIZE 128 + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#define CH_DBG_ENABLE_STACK_CHECK TRUE + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_FILL_THREADS FALSE + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p thread_t structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. + */ +#define CH_DBG_THREADS_PROFILING FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p thread_t structure. + */ +#define CH_CFG_THREAD_EXTRA_FIELDS \ + /* Add threads custom fields here.*/ + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + */ +#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* Context switch code here.*/ \ +} + +/** + * @brief ISR enter hook. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ + /* IRQ prologue code here.*/ \ +} + +/** + * @brief ISR exit hook. + */ +#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ + /* IRQ epilogue code here.*/ \ +} + +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#define CH_CFG_IDLE_ENTER_HOOK() { \ + /* Idle-enter code here.*/ \ +} + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#define CH_CFG_IDLE_LEAVE_HOOK() { \ + /* Idle-leave code here.*/ \ +} + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#define CH_CFG_IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#define CH_CFG_SYSTEM_TICK_HOOK() { \ + /* System tick event code here.*/ \ +} + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ + /* System halt code here.*/ \ +} + +/** + * @brief Trace hook. + * @details This hook is invoked each time a new record is written in the + * trace buffer. + */ +#define CH_CFG_TRACE_HOOK(tep) { \ + /* Trace code here.*/ \ +} + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* CHCONF_H */ + +/** @} */ diff --git a/keyboards/proton_c/config.h b/keyboards/proton_c/config.h new file mode 100644 index 000000000000..1a2346d415d0 --- /dev/null +++ b/keyboards/proton_c/config.h @@ -0,0 +1,121 @@ +/* Copyright 2018 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 . + */ + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0006 +#define MANUFACTURER QMK +#define PRODUCT Proton C +#define DESCRIPTION A compact ortholinear keyboard + +/* key matrix size */ +#define MATRIX_ROWS 1 +#define MATRIX_COLS 1 + +#define MATRIX_ROW_PINS { B9 } +#define MATRIX_COL_PINS { B0 } + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 6 + +/* 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 + +/* 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 + +/* + * 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 1 + +// #define WS2812_LED_N 2 +// #define RGBLED_NUM WS2812_LED_N +// #define WS2812_TIM_N 2 +// #define WS2812_TIM_CH 2 +// #define PORT_WS2812 GPIOA +// #define PIN_WS2812 1 +// #define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA stream for TIMx_UP (look up in reference manual under DMA Channel selection) +//#define WS2812_DMA_CHANNEL 7 // DMA channel for TIMx_UP +//#define WS2812_EXTERNAL_PULLUP + diff --git a/keyboards/proton_c/halconf.h b/keyboards/proton_c/halconf.h new file mode 100644 index 000000000000..8fe8e0c6f586 --- /dev/null +++ b/keyboards/proton_c/halconf.h @@ -0,0 +1,388 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef HALCONF_H +#define HALCONF_H + +#include "mcuconf.h" + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the DAC subsystem. + */ +#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) +#define HAL_USE_DAC TRUE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT TRUE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C FALSE +#endif + +/** + * @brief Enables the I2S subsystem. + */ +#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) +#define HAL_USE_I2S FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM FALSE +#endif + +/** + * @brief Enables the QSPI subsystem. + */ +#if !defined(HAL_USE_QSPI) || defined(__DOXYGEN__) +#define HAL_USE_QSPI FALSE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL FALSE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB TRUE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI FALSE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB TRUE +#endif + +/** + * @brief Enables the WDG subsystem. + */ +#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) +#define HAL_USE_WDG FALSE +#endif + +/*===========================================================================*/ +/* ADC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) +#define ADC_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define ADC_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* CAN driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Sleep mode related APIs inclusion switch. + */ +#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) +#define CAN_USE_SLEEP_MODE TRUE +#endif + +/*===========================================================================*/ +/* I2C driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the mutual exclusion APIs on the I2C bus. + */ +#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define I2C_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* MAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) +#define MAC_USE_ZERO_COPY FALSE +#endif + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) +#define MAC_USE_EVENTS TRUE +#endif + +/*===========================================================================*/ +/* MMC_SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + * This option is recommended also if the SPI driver does not + * use a DMA channel and heavily loads the CPU. + */ +#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) +#define MMC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SDC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Number of initialization attempts before rejecting the card. + * @note Attempts are performed at 10mS intervals. + */ +#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) +#define SDC_INIT_RETRY 100 +#endif + +/** + * @brief Include support for MMC cards. + * @note MMC support is not yet implemented so this option must be kept + * at @p FALSE. + */ +#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) +#define SDC_MMC_SUPPORT FALSE +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + */ +#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) +#define SDC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SERIAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Default bit rate. + * @details Configuration parameter, this is the baud rate selected for the + * default configuration. + */ +#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) +#define SERIAL_DEFAULT_BITRATE 38400 +#endif + +/** + * @brief Serial buffers size. + * @details Configuration parameter, you can change the depth of the queue + * buffers depending on the requirements of your application. + * @note The default is 16 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_BUFFERS_SIZE 16 +#endif + +/*===========================================================================*/ +/* SERIAL_USB driver related setting. */ +/*===========================================================================*/ + +/** + * @brief Serial over USB buffers size. + * @details Configuration parameter, the buffer size must be a multiple of + * the USB data endpoint maximum packet size. + * @note The default is 256 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_SIZE 1 +#endif + +/** + * @brief Serial over USB number of buffers. + * @note The default is 2 buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_NUMBER 2 +#endif + +/*===========================================================================*/ +/* SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) +#define SPI_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define SPI_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* UART driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__) +#define UART_USE_WAIT FALSE +#endif + +/** + * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define UART_USE_MUTUAL_EXCLUSION FALSE +#endif + +/*===========================================================================*/ +/* USB driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) +#define USB_USE_WAIT TRUE +#endif + +#endif /* HALCONF_H */ + +/** @} */ diff --git a/keyboards/proton_c/keymaps/default/keymap.c b/keyboards/proton_c/keymaps/default/keymap.c new file mode 100644 index 000000000000..a3103432fa7c --- /dev/null +++ b/keyboards/proton_c/keymaps/default/keymap.c @@ -0,0 +1,21 @@ +/* Copyright 2018 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 QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = {{ KC_A }} +}; diff --git a/keyboards/proton_c/mcuconf.h b/keyboards/proton_c/mcuconf.h new file mode 100644 index 000000000000..7c3c6e570cec --- /dev/null +++ b/keyboards/proton_c/mcuconf.h @@ -0,0 +1,257 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef MCUCONF_H +#define MCUCONF_H + +/* + * STM32F3xx drivers configuration. + * The following settings override the default settings present in + * the various device driver implementation headers. + * Note that the settings for each driver only have effect if the whole + * driver is enabled in halconf.h. + * + * IRQ priorities: + * 15...0 Lowest...Highest. + * + * DMA priorities: + * 0...3 Lowest...Highest. + */ + +#define STM32F3xx_MCUCONF + +/* + * HAL driver system settings. + */ +#define STM32_NO_INIT FALSE +#define STM32_PVD_ENABLE FALSE +#define STM32_PLS STM32_PLS_LEV0 +#define STM32_HSI_ENABLED TRUE +#define STM32_LSI_ENABLED TRUE +#define STM32_HSE_ENABLED TRUE +#define STM32_LSE_ENABLED FALSE +#define STM32_SW STM32_SW_PLL +#define STM32_PLLSRC STM32_PLLSRC_HSE +#define STM32_PREDIV_VALUE 1 +#define STM32_PLLMUL_VALUE 9 +#define STM32_HPRE STM32_HPRE_DIV1 +#define STM32_PPRE1 STM32_PPRE1_DIV2 +#define STM32_PPRE2 STM32_PPRE2_DIV2 +#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK +#define STM32_ADC12PRES STM32_ADC12PRES_DIV1 +#define STM32_ADC34PRES STM32_ADC34PRES_DIV1 +#define STM32_USART1SW STM32_USART1SW_PCLK +#define STM32_USART2SW STM32_USART2SW_PCLK +#define STM32_USART3SW STM32_USART3SW_PCLK +#define STM32_UART4SW STM32_UART4SW_PCLK +#define STM32_UART5SW STM32_UART5SW_PCLK +#define STM32_I2C1SW STM32_I2C1SW_SYSCLK +#define STM32_I2C2SW STM32_I2C2SW_SYSCLK +#define STM32_TIM1SW STM32_TIM1SW_PCLK2 +#define STM32_TIM8SW STM32_TIM8SW_PCLK2 +#define STM32_RTCSEL STM32_RTCSEL_LSI +#define STM32_USB_CLOCK_REQUIRED TRUE +#define STM32_USBPRE STM32_USBPRE_DIV1P5 + +#undef STM32_HSE_BYPASS +// #error "oh no" +// #endif + +/* + * ADC driver system settings. + */ +#define STM32_ADC_DUAL_MODE FALSE +#define STM32_ADC_COMPACT_SAMPLES FALSE +#define STM32_ADC_USE_ADC1 FALSE +#define STM32_ADC_USE_ADC2 FALSE +#define STM32_ADC_USE_ADC3 FALSE +#define STM32_ADC_USE_ADC4 FALSE +#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(1, 1) +#define STM32_ADC_ADC2_DMA_STREAM STM32_DMA_STREAM_ID(2, 1) +#define STM32_ADC_ADC3_DMA_STREAM STM32_DMA_STREAM_ID(2, 5) +#define STM32_ADC_ADC4_DMA_STREAM STM32_DMA_STREAM_ID(2, 2) +#define STM32_ADC_ADC1_DMA_PRIORITY 2 +#define STM32_ADC_ADC2_DMA_PRIORITY 2 +#define STM32_ADC_ADC3_DMA_PRIORITY 2 +#define STM32_ADC_ADC4_DMA_PRIORITY 2 +#define STM32_ADC_ADC12_IRQ_PRIORITY 5 +#define STM32_ADC_ADC3_IRQ_PRIORITY 5 +#define STM32_ADC_ADC4_IRQ_PRIORITY 5 +#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 5 +#define STM32_ADC_ADC2_DMA_IRQ_PRIORITY 5 +#define STM32_ADC_ADC3_DMA_IRQ_PRIORITY 5 +#define STM32_ADC_ADC4_DMA_IRQ_PRIORITY 5 +#define STM32_ADC_ADC12_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 +#define STM32_ADC_ADC34_CLOCK_MODE ADC_CCR_CKMODE_AHB_DIV1 + +/* + * CAN driver system settings. + */ +#define STM32_CAN_USE_CAN1 FALSE +#define STM32_CAN_CAN1_IRQ_PRIORITY 11 + +/* + * DAC driver system settings. + */ +#define STM32_DAC_DUAL_MODE FALSE +#define STM32_DAC_USE_DAC1_CH1 TRUE +#define STM32_DAC_USE_DAC1_CH2 TRUE +#define STM32_DAC_DAC1_CH1_IRQ_PRIORITY 10 +#define STM32_DAC_DAC1_CH2_IRQ_PRIORITY 10 +#define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 +#define STM32_DAC_DAC1_CH2_DMA_PRIORITY 2 + +/* + * EXT driver system settings. + */ +#define STM32_EXT_EXTI0_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI1_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI2_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI3_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI4_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI16_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI17_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI18_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI19_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI20_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI21_22_29_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI30_32_IRQ_PRIORITY 6 +#define STM32_EXT_EXTI33_IRQ_PRIORITY 6 + +/* + * GPT driver system settings. + */ +#define STM32_GPT_USE_TIM1 FALSE +#define STM32_GPT_USE_TIM2 FALSE +#define STM32_GPT_USE_TIM3 FALSE +#define STM32_GPT_USE_TIM4 FALSE +#define STM32_GPT_USE_TIM6 TRUE +#define STM32_GPT_USE_TIM7 TRUE +#define STM32_GPT_USE_TIM8 TRUE +#define STM32_GPT_TIM1_IRQ_PRIORITY 7 +#define STM32_GPT_TIM2_IRQ_PRIORITY 7 +#define STM32_GPT_TIM3_IRQ_PRIORITY 7 +#define STM32_GPT_TIM4_IRQ_PRIORITY 7 +#define STM32_GPT_TIM6_IRQ_PRIORITY 7 +#define STM32_GPT_TIM7_IRQ_PRIORITY 7 +#define STM32_GPT_TIM8_IRQ_PRIORITY 7 + +/* + * I2C driver system settings. + */ +#define STM32_I2C_USE_I2C1 FALSE +#define STM32_I2C_USE_I2C2 FALSE +#define STM32_I2C_BUSY_TIMEOUT 50 +#define STM32_I2C_I2C1_IRQ_PRIORITY 10 +#define STM32_I2C_I2C2_IRQ_PRIORITY 10 +#define STM32_I2C_USE_DMA TRUE +#define STM32_I2C_I2C1_DMA_PRIORITY 1 +#define STM32_I2C_I2C2_DMA_PRIORITY 1 +#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure") + +/* + * ICU driver system settings. + */ +#define STM32_ICU_USE_TIM1 FALSE +#define STM32_ICU_USE_TIM2 FALSE +#define STM32_ICU_USE_TIM3 FALSE +#define STM32_ICU_USE_TIM4 FALSE +#define STM32_ICU_USE_TIM8 FALSE +#define STM32_ICU_TIM1_IRQ_PRIORITY 7 +#define STM32_ICU_TIM2_IRQ_PRIORITY 7 +#define STM32_ICU_TIM3_IRQ_PRIORITY 7 +#define STM32_ICU_TIM4_IRQ_PRIORITY 7 +#define STM32_ICU_TIM8_IRQ_PRIORITY 7 + +/* + * PWM driver system settings. + */ +#define STM32_PWM_USE_ADVANCED FALSE +#define STM32_PWM_USE_TIM1 FALSE +#define STM32_PWM_USE_TIM2 TRUE +#define STM32_PWM_USE_TIM3 TRUE +#define STM32_PWM_USE_TIM4 FALSE +#define STM32_PWM_USE_TIM8 FALSE +#define STM32_PWM_TIM1_IRQ_PRIORITY 7 +#define STM32_PWM_TIM2_IRQ_PRIORITY 7 +#define STM32_PWM_TIM3_IRQ_PRIORITY 7 +#define STM32_PWM_TIM4_IRQ_PRIORITY 7 +#define STM32_PWM_TIM8_IRQ_PRIORITY 7 + +/* + * SERIAL driver system settings. + */ +#define STM32_SERIAL_USE_USART1 FALSE +#define STM32_SERIAL_USE_USART2 TRUE +#define STM32_SERIAL_USE_USART3 FALSE +#define STM32_SERIAL_USE_UART4 FALSE +#define STM32_SERIAL_USE_UART5 FALSE +#define STM32_SERIAL_USART1_PRIORITY 12 +#define STM32_SERIAL_USART2_PRIORITY 12 +#define STM32_SERIAL_USART3_PRIORITY 12 +#define STM32_SERIAL_UART4_PRIORITY 12 +#define STM32_SERIAL_UART5_PRIORITY 12 + +/* + * SPI driver system settings. + */ +#define STM32_SPI_USE_SPI1 FALSE +#define STM32_SPI_USE_SPI2 FALSE +#define STM32_SPI_USE_SPI3 FALSE +#define STM32_SPI_SPI1_DMA_PRIORITY 1 +#define STM32_SPI_SPI2_DMA_PRIORITY 1 +#define STM32_SPI_SPI3_DMA_PRIORITY 1 +#define STM32_SPI_SPI1_IRQ_PRIORITY 10 +#define STM32_SPI_SPI2_IRQ_PRIORITY 10 +#define STM32_SPI_SPI3_IRQ_PRIORITY 10 +#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure") + +/* + * ST driver system settings. + */ +#define STM32_ST_IRQ_PRIORITY 8 +#define STM32_ST_USE_TIMER 2 + +/* + * UART driver system settings. + */ +#define STM32_UART_USE_USART1 FALSE +#define STM32_UART_USE_USART2 FALSE +#define STM32_UART_USE_USART3 FALSE +#define STM32_UART_USART1_IRQ_PRIORITY 12 +#define STM32_UART_USART2_IRQ_PRIORITY 12 +#define STM32_UART_USART3_IRQ_PRIORITY 12 +#define STM32_UART_USART1_DMA_PRIORITY 0 +#define STM32_UART_USART2_DMA_PRIORITY 0 +#define STM32_UART_USART3_DMA_PRIORITY 0 +#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure") + +/* + * USB driver system settings. + */ +#define STM32_USB_USE_USB1 TRUE +#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE +#define STM32_USB_USB1_HP_IRQ_PRIORITY 13 +#define STM32_USB_USB1_LP_IRQ_PRIORITY 14 + +/* + * WDG driver system settings. + */ +#define STM32_WDG_USE_IWDG FALSE + +#endif /* MCUCONF_H */ diff --git a/keyboards/proton_c/proton_c.c b/keyboards/proton_c/proton_c.c new file mode 100644 index 000000000000..5256343478f4 --- /dev/null +++ b/keyboards/proton_c/proton_c.c @@ -0,0 +1,25 @@ +/* Copyright 2018 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 "proton_c.h" + +void matrix_init_kb(void) { + // Turn status LED on + setPinOutput(C13); + writePinHigh(C13); + + matrix_init_user(); +} diff --git a/keyboards/proton_c/proton_c.h b/keyboards/proton_c/proton_c.h new file mode 100644 index 000000000000..159f9975a320 --- /dev/null +++ b/keyboards/proton_c/proton_c.h @@ -0,0 +1,18 @@ +/* Copyright 2018 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 . + */ + +#pragma once +#include "quantum.h" diff --git a/keyboards/proton_c/readme.md b/keyboards/proton_c/readme.md new file mode 100644 index 000000000000..5f27795aec4a --- /dev/null +++ b/keyboards/proton_c/readme.md @@ -0,0 +1,16 @@ +Proton C +=== + +![Proton C](https://i.imgur.com/xZrjIqa.jpg) + +A Pro Micro drop-in replacement. + +Keyboard Maintainer: [Jack Humbert](https://github.com/jackhumbert) +Hardware Supported: QMK Proton C +Hardware Availability: [List of vendors](https://qmk.fm/proton-c) + +Make example for this keyboard (after setting up your build environment): + + make proton_c:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/proton_c/rules.mk b/keyboards/proton_c/rules.mk new file mode 100644 index 000000000000..f682c1fd6b0f --- /dev/null +++ b/keyboards/proton_c/rules.mk @@ -0,0 +1,51 @@ +## chip/board settings +# - the next two should match the directories in +# /os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) +MCU_FAMILY = STM32 +MCU_SERIES = STM32F3xx + +# Linker script to use +# - it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/ +# or /ld/ +MCU_LDSCRIPT = STM32F303xC + +# Startup code to use +# - it should exist in /os/common/startup/ARMCMx/compilers/GCC/mk/ +MCU_STARTUP = stm32f3xx + +# Board: it should exist either in /os/hal/boards/ +# or /boards +BOARD = GENERIC_STM32_F303XC + +# Cortex version +MCU = cortex-m4 + +# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 +ARMV = 7 + +USE_FPU = yes + +# Vector table for application +# 0x00000000-0x00001000 area is occupied by bootlaoder.*/ +# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB +# OPT_DEFS = -DCORTEX_VTOR_INIT=0x08005000 +OPT_DEFS = + +# Options to pass to dfu-util when flashing +DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave + +# Build Options +# comment out to disable the options. +# +BACKLIGHT_ENABLE = no +BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration +## (Note that for BOOTMAGIC on Teensy LC you have to use a custom .ld script.) +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = yes # Console for debug +COMMAND_ENABLE = yes # Commands for debug and configuration +#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover +AUDIO_ENABLE = yes +RGBLIGHT_ENABLE = no +# SERIAL_LINK_ENABLE = yes From 5779ffb59a2e36fd45c3d4000d41ad73ad140de3 Mon Sep 17 00:00:00 2001 From: Fredric Silberberg Date: Thu, 1 Nov 2018 21:49:18 -0700 Subject: [PATCH 338/505] Set the executable bit for sh scripts under util. --- util/activate_msys2.sh | 0 util/activate_wsl.sh | 0 util/freebsd_install.sh | 0 util/generate_internal_docs.sh | 0 util/msys2_install.sh | 0 util/travis_build.sh | 0 util/travis_compiled_push.sh | 0 util/travis_docs.sh | 0 util/travis_push.sh | 0 util/win_shared_install.sh | 0 util/wsl_install.sh | 0 11 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 util/activate_msys2.sh mode change 100644 => 100755 util/activate_wsl.sh mode change 100644 => 100755 util/freebsd_install.sh mode change 100644 => 100755 util/generate_internal_docs.sh mode change 100644 => 100755 util/msys2_install.sh mode change 100644 => 100755 util/travis_build.sh mode change 100644 => 100755 util/travis_compiled_push.sh mode change 100644 => 100755 util/travis_docs.sh mode change 100644 => 100755 util/travis_push.sh mode change 100644 => 100755 util/win_shared_install.sh mode change 100644 => 100755 util/wsl_install.sh diff --git a/util/activate_msys2.sh b/util/activate_msys2.sh old mode 100644 new mode 100755 diff --git a/util/activate_wsl.sh b/util/activate_wsl.sh old mode 100644 new mode 100755 diff --git a/util/freebsd_install.sh b/util/freebsd_install.sh old mode 100644 new mode 100755 diff --git a/util/generate_internal_docs.sh b/util/generate_internal_docs.sh old mode 100644 new mode 100755 diff --git a/util/msys2_install.sh b/util/msys2_install.sh old mode 100644 new mode 100755 diff --git a/util/travis_build.sh b/util/travis_build.sh old mode 100644 new mode 100755 diff --git a/util/travis_compiled_push.sh b/util/travis_compiled_push.sh old mode 100644 new mode 100755 diff --git a/util/travis_docs.sh b/util/travis_docs.sh old mode 100644 new mode 100755 diff --git a/util/travis_push.sh b/util/travis_push.sh old mode 100644 new mode 100755 diff --git a/util/win_shared_install.sh b/util/win_shared_install.sh old mode 100644 new mode 100755 diff --git a/util/wsl_install.sh b/util/wsl_install.sh old mode 100644 new mode 100755 From a5fa75fcb3de822f4e43dcf29cee6eb9f945a992 Mon Sep 17 00:00:00 2001 From: Danny Nguyen Date: Fri, 2 Nov 2018 15:28:16 -0400 Subject: [PATCH 339/505] Move disable JTAG code from `keyboard_init` to `keyboard_setup` This way all split keyboards are using that code instead of just those using split_common with the fix --- quantum/split_common/matrix.c | 6 ------ quantum/split_common/split_util.c | 14 -------------- tmk_core/common/keyboard.c | 14 +++++++++----- tmk_core/common/keyboard.h | 2 ++ 4 files changed, 11 insertions(+), 25 deletions(-) diff --git a/quantum/split_common/matrix.c b/quantum/split_common/matrix.c index ff6738b58f4c..d6359b51fb3a 100644 --- a/quantum/split_common/matrix.c +++ b/quantum/split_common/matrix.c @@ -128,12 +128,6 @@ uint8_t matrix_cols(void) void matrix_init(void) { -#ifdef DISABLE_JTAG - // JTAG disable for PORT F. write JTD bit twice within four cycles. - MCUCR |= (1< Date: Fri, 2 Nov 2018 15:55:54 -0400 Subject: [PATCH 340/505] Remove old declaration Co-Authored-By: nooges --- quantum/split_common/split_util.c | 1 - 1 file changed, 1 deletion(-) diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index 7d1d7ee0473a..56077e4f2023 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -92,7 +92,6 @@ void split_keyboard_setup(void) { sei(); } -void disable_JTAG(void); void keyboard_slave_loop(void) { matrix_init(); From 563fe23e53fb747f509b8558bb29bde0baf2d6a8 Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Tue, 30 Oct 2018 12:23:57 -0400 Subject: [PATCH 341/505] Fix CTRL/ALT keyboard does not wake computer from sleep Fix for Massdrop CTRL and ALT keyboards not waking computer from sleep --- tmk_core/protocol/arm_atsam/main_arm_atsam.c | 30 +++++++++++++------- tmk_core/protocol/arm_atsam/usb/udc.h | 2 +- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c index 54d056a14ea1..d3dc272ee0eb 100644 --- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c +++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c @@ -62,6 +62,12 @@ void send_keyboard(report_keyboard_t *report) { uint32_t irqflags; + if (usb_state == USB_STATE_POWERDOWN) + { + udc_remotewakeup(); + return; + } + #ifdef NKRO_ENABLE if (!keymap_config.nkro) { @@ -156,25 +162,27 @@ void send_consumer(uint16_t data) } uint8_t g_drvid; +uint8_t g_usb_sleeping = 0; void main_subtask_usb_state(void) { if (usb_state == USB_STATE_POWERDOWN) { - uint32_t timer_led = timer_read32(); - - led_on; - if (led_enabled) + if (!g_usb_sleeping) { - for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++) + g_usb_sleeping = 1; + if (led_enabled) { - I2C3733_Control_Set(0); + for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++) + { + I2C3733_Control_Set(0); + } } } - while (usb_state == USB_STATE_POWERDOWN) - { - if (timer_read32() - timer_led > 1000) led_off; //Good to indicate went to sleep, but only for a second - } + } + else if (g_usb_sleeping) + { + g_usb_sleeping = 0; if (led_enabled) { for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++) @@ -182,12 +190,12 @@ void main_subtask_usb_state(void) I2C3733_Control_Set(1); } } - led_off; } } void main_subtask_led(void) { + if (g_usb_sleeping) return; led_matrix_task(); } diff --git a/tmk_core/protocol/arm_atsam/usb/udc.h b/tmk_core/protocol/arm_atsam/usb/udc.h index c88a442cb65a..33335d1869fb 100644 --- a/tmk_core/protocol/arm_atsam/usb/udc.h +++ b/tmk_core/protocol/arm_atsam/usb/udc.h @@ -210,7 +210,7 @@ static inline void udc_detach(void) /*! \brief The USB driver sends a resume signal called \e "Upstream Resume" * This is authorized only when the remote wakeup feature is enabled by host. */ -static inline void udc_remotewakeup(void) +inline void udc_remotewakeup(void) { udd_send_remotewakeup(); } From cec203ea80c8e9365bb5f43418fba5971dd4091f Mon Sep 17 00:00:00 2001 From: patrickmt <40182064+patrickmt@users.noreply.github.com> Date: Fri, 2 Nov 2018 15:30:51 -0400 Subject: [PATCH 342/505] USB Suspend for arm_atsam protocol Rewrote USB state tracking for implementation of suspend state. Updated suspend.c in entirety. Main subtasks (generally hardware related) are now run prior to keyboard task. --- tmk_core/common/arm_atsam/suspend.c | 90 +++++++++++++++++--- tmk_core/protocol/arm_atsam/i2c_master.c | 5 +- tmk_core/protocol/arm_atsam/main_arm_atsam.c | 80 ++++++++++------- tmk_core/protocol/arm_atsam/usb/ui.c | 8 +- tmk_core/protocol/arm_atsam/usb/ui.h | 6 -- 5 files changed, 136 insertions(+), 53 deletions(-) diff --git a/tmk_core/common/arm_atsam/suspend.c b/tmk_core/common/arm_atsam/suspend.c index 01d1930ea502..e34965df64e1 100644 --- a/tmk_core/common/arm_atsam/suspend.c +++ b/tmk_core/common/arm_atsam/suspend.c @@ -1,17 +1,85 @@ -/* Copyright 2017 Fred Sundvik +#include "matrix.h" +#include "i2c_master.h" +#include "led_matrix.h" +#include "suspend.h" + +/** \brief Suspend idle * - * 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. + * FIXME: needs doc + */ +void suspend_idle(uint8_t time) { + /* Note: Not used anywhere currently */ +} + +/** \brief Run user level Power down * - * 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. + * FIXME: needs doc + */ +__attribute__ ((weak)) +void suspend_power_down_user (void) { + +} + +/** \brief Run keyboard level Power down + * + * FIXME: needs doc + */ +__attribute__ ((weak)) +void suspend_power_down_kb(void) { + suspend_power_down_user(); +} + +/** \brief Suspend power down + * + * FIXME: needs doc + */ +void suspend_power_down(void) +{ + I2C3733_Control_Set(0); //Disable LED driver + + suspend_power_down_kb(); +} + +__attribute__ ((weak)) void matrix_power_up(void) {} +__attribute__ ((weak)) void matrix_power_down(void) {} +bool suspend_wakeup_condition(void) { + matrix_power_up(); + matrix_scan(); + matrix_power_down(); + for (uint8_t r = 0; r < MATRIX_ROWS; r++) { + if (matrix_get_row(r)) return true; + } + return false; +} + +/** \brief run user level code immediately after wakeup + * + * FIXME: needs doc + */ +__attribute__ ((weak)) +void suspend_wakeup_init_user(void) { + +} + +/** \brief run keyboard level code immediately after wakeup + * + * FIXME: needs doc + */ +__attribute__ ((weak)) +void suspend_wakeup_init_kb(void) { + suspend_wakeup_init_user(); +} + +/** \brief run immediately after wakeup * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * FIXME: needs doc */ +void suspend_wakeup_init(void) { + /* If LEDs are set to enabled, enable the hardware */ + if (led_enabled) { + I2C3733_Control_Set(1); + } + suspend_wakeup_init_kb(); +} diff --git a/tmk_core/protocol/arm_atsam/i2c_master.c b/tmk_core/protocol/arm_atsam/i2c_master.c index 4f5a79e89f04..ece9ee5db8a8 100644 --- a/tmk_core/protocol/arm_atsam/i2c_master.c +++ b/tmk_core/protocol/arm_atsam/i2c_master.c @@ -261,8 +261,9 @@ uint8_t I2C3733_Init_Control(void) { DBGC(DC_I2C3733_INIT_CONTROL_BEGIN); - srdata.bit.SDB_N = 1; - SPI_WriteSRData(); + //Hardware state shutdown on boot + //USB state machine will enable driver when communication is ready + I2C3733_Control_Set(0); CLK_delay_ms(1); diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c index d3dc272ee0eb..13034a05d19b 100644 --- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c +++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c @@ -31,6 +31,8 @@ along with this program. If not, see . //From keyboard's directory #include "config_led.h" +uint8_t g_usb_state = USB_FSMSTATUS_FSMSTATE_OFF_Val; //Saved USB state from hardware value to detect changes + void main_subtasks(void); uint8_t keyboard_leds(void); void send_keyboard(report_keyboard_t *report); @@ -62,12 +64,6 @@ void send_keyboard(report_keyboard_t *report) { uint32_t irqflags; - if (usb_state == USB_STATE_POWERDOWN) - { - udc_remotewakeup(); - return; - } - #ifdef NKRO_ENABLE if (!keymap_config.nkro) { @@ -161,41 +157,56 @@ void send_consumer(uint16_t data) #endif //EXTRAKEY_ENABLE } -uint8_t g_drvid; -uint8_t g_usb_sleeping = 0; - void main_subtask_usb_state(void) { - if (usb_state == USB_STATE_POWERDOWN) + static uint32_t fsmstate_on_delay = 0; //Delay timer to be sure USB is actually operating before bringing up hardware + uint8_t fsmstate_now = USB->DEVICE.FSMSTATUS.reg; //Current state from hardware register + + if (fsmstate_now == USB_FSMSTATUS_FSMSTATE_SUSPEND_Val) //If USB SUSPENDED { - if (!g_usb_sleeping) + fsmstate_on_delay = 0; //Clear ON delay timer + + if (g_usb_state != USB_FSMSTATUS_FSMSTATE_SUSPEND_Val) //If previously not SUSPENDED { - g_usb_sleeping = 1; - if (led_enabled) - { - for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++) - { - I2C3733_Control_Set(0); - } - } + suspend_power_down(); //Run suspend routine + g_usb_state = fsmstate_now; //Save current USB state } } - else if (g_usb_sleeping) + else if (fsmstate_now == USB_FSMSTATUS_FSMSTATE_SLEEP_Val) //Else if USB SLEEPING { - g_usb_sleeping = 0; - if (led_enabled) + fsmstate_on_delay = 0; //Clear ON delay timer + + if (g_usb_state != USB_FSMSTATUS_FSMSTATE_SLEEP_Val) //If previously not SLEEPING { - for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++) + suspend_power_down(); //Run suspend routine + g_usb_state = fsmstate_now; //Save current USB state + } + } + else if (fsmstate_now == USB_FSMSTATUS_FSMSTATE_ON_Val) //Else if USB ON + { + if (g_usb_state != USB_FSMSTATUS_FSMSTATE_ON_Val) //If previously not ON + { + if (fsmstate_on_delay == 0) //If ON delay timer is cleared { - I2C3733_Control_Set(1); + fsmstate_on_delay = CLK_get_ms() + 250; //Set ON delay timer + } + else if (CLK_get_ms() > fsmstate_on_delay) //Else if ON delay timer is active and timed out + { + suspend_wakeup_init(); //Run wakeup routine + g_usb_state = fsmstate_now; //Save current USB state } } } + else //Else if USB is in a state not being tracked + { + fsmstate_on_delay = 0; //Clear ON delay timer + } } void main_subtask_led(void) { - if (g_usb_sleeping) return; + if (g_usb_state != USB_FSMSTATUS_FSMSTATE_ON_Val) return; //Only run LED tasks if USB is operating + led_matrix_task(); } @@ -275,8 +286,8 @@ int main(void) i2c_led_q_init(); - for (g_drvid = 0; g_drvid < ISSI3733_DRIVER_COUNT; g_drvid++) - I2C_LED_Q_ONOFF(g_drvid); //Queue data + for (uint8_t drvid = 0; drvid < ISSI3733_DRIVER_COUNT; drvid++) + I2C_LED_Q_ONOFF(drvid); //Queue data keyboard_setup(); @@ -294,10 +305,21 @@ int main(void) while (1) { - keyboard_task(); - main_subtasks(); //Note these tasks will also be run while waiting for USB keyboard polling intervals + if (g_usb_state == USB_FSMSTATUS_FSMSTATE_SUSPEND_Val || g_usb_state == USB_FSMSTATUS_FSMSTATE_SLEEP_Val) + { + if (suspend_wakeup_condition()) + { + udc_remotewakeup(); //Send remote wakeup signal + wait_ms(50); + } + + continue; + } + + keyboard_task(); + #ifdef CONSOLE_ENABLE if (CLK_get_ms() > next_print) { diff --git a/tmk_core/protocol/arm_atsam/usb/ui.c b/tmk_core/protocol/arm_atsam/usb/ui.c index 031678b64327..70a6191098ab 100644 --- a/tmk_core/protocol/arm_atsam/usb/ui.c +++ b/tmk_core/protocol/arm_atsam/usb/ui.c @@ -52,8 +52,6 @@ #include "samd51j18a.h" #include "ui.h" -volatile uint8_t usb_state; - //! Sequence process running each \c SEQUENCE_PERIOD ms #define SEQUENCE_PERIOD 150 @@ -72,12 +70,12 @@ static void ui_wakeup_handler(void) void ui_init(void) { - usb_state = USB_STATE_POWERUP; + } void ui_powerdown(void) { - usb_state = USB_STATE_POWERDOWN; + } void ui_wakeup_enable(void) @@ -92,7 +90,7 @@ void ui_wakeup_disable(void) void ui_wakeup(void) { - usb_state = USB_STATE_POWERUP; + } void ui_process(uint16_t framenumber) diff --git a/tmk_core/protocol/arm_atsam/usb/ui.h b/tmk_core/protocol/arm_atsam/usb/ui.h index 3d899e6694dc..d1c767d45764 100644 --- a/tmk_core/protocol/arm_atsam/usb/ui.h +++ b/tmk_core/protocol/arm_atsam/usb/ui.h @@ -47,12 +47,6 @@ #ifndef _UI_H_ #define _UI_H_ -extern volatile uint8_t usb_state; - -#define USB_STATE_UNKNOWN 0 -#define USB_STATE_POWERDOWN 1 -#define USB_STATE_POWERUP 2 - //! \brief Initializes the user interface void ui_init(void); From 6dec3550e0540ec979e11f7f310478877b3764b7 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Fri, 2 Nov 2018 14:48:44 -0700 Subject: [PATCH 343/505] Niu keymap (#4273) * Add modified planck layout * Update rules --- keyboards/niu_mini/keymaps/abhixec/keymap.c | 183 +++++++++++++++++++ keyboards/niu_mini/keymaps/abhixec/readme.md | 5 + keyboards/niu_mini/keymaps/abhixec/rules.mk | 1 + 3 files changed, 189 insertions(+) create mode 100644 keyboards/niu_mini/keymaps/abhixec/keymap.c create mode 100644 keyboards/niu_mini/keymaps/abhixec/readme.md create mode 100644 keyboards/niu_mini/keymaps/abhixec/rules.mk diff --git a/keyboards/niu_mini/keymaps/abhixec/keymap.c b/keyboards/niu_mini/keymaps/abhixec/keymap.c new file mode 100644 index 000000000000..6d3ff8a37680 --- /dev/null +++ b/keyboards/niu_mini/keymaps/abhixec/keymap.c @@ -0,0 +1,183 @@ +/* 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 . + */ + +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +enum layers { + _QWERTY, + _COLEMAK, + _LOWER, + _RAISE, + _ADJUST +}; + +enum keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + LOWER, + RAISE, + BACKLIT, + EXT_PLV +}; + +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] = LAYOUT_planck_mit( + 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_LCTL, KC_LALT, KC_LGUI, LOWER, 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] = LAYOUT_planck_mit( + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, + KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , + _______, KC_LCTL, KC_LALT, KC_LGUI, LOWER, 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 | | Home | End | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_LOWER] = LAYOUT_planck_mit( + 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_HOME, KC_END, _______, + _______, _______, _______, _______, _______, _______, _______, 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 / |Pg Up |Pg Dn | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | Next | Vol- | Vol+ | Play | + * `-----------------------------------------------------------------------------------' + */ +[_RAISE] = LAYOUT_planck_mit( + 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_PGUP, KC_PGDN, _______, + _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY +), + +/* Adjust (Lower + Raise) + * ,-----------------------------------------------------------------------------------. + * | | Reset| | | | | | | | | | Del | + * |------+------+------+------+------+-------------+------+------+------+------+------| + * | | | | |AG_NRM|AG_SWP|Qwerty|Colemk| | | | | + * |------+------+------+------+------+------|------+------+------+------+------+------| + * | | | | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | | + * `-----------------------------------------------------------------------------------' + */ +[_ADJUST] = LAYOUT_planck_mit( + _______, RESET, DEBUG, _______, _______, _______, _______, TERM_ON, TERM_OFF,_______, _______, KC_DEL , + _______, _______, _______, _______, _______, AG_NORM, AG_SWAP, QWERTY, COLEMAK, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + + +}; + + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + print("mode just switched to qwerty and this is a huge string\n"); + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + 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; +} diff --git a/keyboards/niu_mini/keymaps/abhixec/readme.md b/keyboards/niu_mini/keymaps/abhixec/readme.md new file mode 100644 index 000000000000..1bc312a0393e --- /dev/null +++ b/keyboards/niu_mini/keymaps/abhixec/readme.md @@ -0,0 +1,5 @@ +# Abhixec's Layout + +This is inspired by planck but removed most of the unwanted and extra features of planck that is not there in this keyboard. + + diff --git a/keyboards/niu_mini/keymaps/abhixec/rules.mk b/keyboards/niu_mini/keymaps/abhixec/rules.mk new file mode 100644 index 000000000000..3bf3f2731452 --- /dev/null +++ b/keyboards/niu_mini/keymaps/abhixec/rules.mk @@ -0,0 +1 @@ +AUDIO_ENABLE = no From cd544e10a98b4bfd7f988d713dea446be9eb1b83 Mon Sep 17 00:00:00 2001 From: Elliot Powell <32494740+e11i0t23@users.noreply.github.com> Date: Fri, 2 Nov 2018 23:41:26 +0000 Subject: [PATCH 344/505] Keymap: Fixed poor layout of EP40 default keymap (#4330) * add initial ep40 files * fixed issues * updated keymap * Added media control * Update keyboards/handwired/ep40/rules.mk Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * Fixed requested changes * Fixed more requested changes * Added delete key to layor 1 * Updated defualt keympap to have a Backspace mod del key * removed place holder Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * removed obsolete code Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> --- .../handwired/ep40/keymaps/default/keymap.c | 38 +++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/keyboards/handwired/ep40/keymaps/default/keymap.c b/keyboards/handwired/ep40/keymaps/default/keymap.c index 2d8a5d0592e4..1ac66bc0126b 100644 --- a/keyboards/handwired/ep40/keymaps/default/keymap.c +++ b/keyboards/handwired/ep40/keymaps/default/keymap.c @@ -15,16 +15,22 @@ */ #include QMK_KEYBOARD_H +static bool bsdel_mods = false; + +enum custom_keycodes { + M_BSDEL = SAFE_RANGE, // ensure these codes start after the highest keycode defined in Quantum +}; + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( /* Base */ - KC_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,\ + KC_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, M_BSDEL,\ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT, \ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_RSFT,\ - LCTL_T(KC_LBRC), KC_LGUI, KC_LALT, KC_SPC, LT(1, KC_SPC), KC_RGUI, MO(2), RCTL_T(KC_RBRC), KC_RALT \ + LCTL_T(KC_LBRC), KC_LGUI, KC_LALT, KC_SPC, LT(1, KC_SPC), KC_RALT, MO(2), RCTL_T(KC_RBRC), KC_F5 \ ), [1] = LAYOUT( /* Base */ - KC_TRNS, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0, KC_DEL ,\ + KC_TRNS, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0, KC_TRNS,\ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_UP, KC_DOWN, KC_RIGHT, KC_TRNS,\ KC_TRNS, KC_VOLD, KC_MUTE, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_TRNS,\ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ @@ -37,3 +43,29 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET \ ), }; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case M_BSDEL: { + uint8_t kc = KC_BSPC; + + if (record->event.pressed) { + if (keyboard_report->mods) { + kc = KC_DEL; + } + register_code (kc); + bsdel_mods = keyboard_report->mods; + } + else { + if (bsdel_mods) { + kc = KC_DEL; + } + unregister_code (kc); + } + + return false; + break; + } + } + return true; +} From 0633eb027308f08331cb33f27ddbe7cb3a08cda8 Mon Sep 17 00:00:00 2001 From: Josh Date: Sat, 3 Nov 2018 12:22:57 -0400 Subject: [PATCH 345/505] Increasing square wave buffer to max volume. (#4296) * Increasing square wave buffer to max volume. * Using range designated initializers for square waves; defining DAC_SAMPLE_MAX. --- quantum/audio/audio_arm.c | 133 +++----------------------------------- 1 file changed, 9 insertions(+), 124 deletions(-) diff --git a/quantum/audio/audio_arm.c b/quantum/audio/audio_arm.c index d38184f323b3..18e8a8c66db6 100644 --- a/quantum/audio/audio_arm.c +++ b/quantum/audio/audio_arm.c @@ -80,6 +80,7 @@ float startup_song[][2] = STARTUP_SONG; static void gpt_cb8(GPTDriver *gptp); #define DAC_BUFFER_SIZE 720 +#define DAC_SAMPLE_MAX 65535U #define START_CHANNEL_1() gptStart(&GPTD6, &gpt6cfg1); \ gptStartContinuous(&GPTD6, 2U) @@ -202,132 +203,16 @@ GPTConfig gpt8cfg1 = { // squarewave static const dacsample_t dac_buffer[DAC_BUFFER_SIZE] = { - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + // First half is max, second half is 0 + [0 ... DAC_BUFFER_SIZE/2-1] = DAC_SAMPLE_MAX, + [DAC_BUFFER_SIZE/2 ... DAC_BUFFER_SIZE -1] = 0, }; // squarewave static const dacsample_t dac_buffer_2[DAC_BUFFER_SIZE] = { - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, - 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047, 2047 + // opposite of dac_buffer above + [0 ... DAC_BUFFER_SIZE/2-1] = 0, + [DAC_BUFFER_SIZE/2 ... DAC_BUFFER_SIZE -1] = DAC_SAMPLE_MAX, }; /* @@ -363,7 +248,7 @@ static void error_cb1(DACDriver *dacp, dacerror_t err) { } static const DACConfig dac1cfg1 = { - .init = 2047U, + .init = DAC_SAMPLE_MAX, .datamode = DAC_DHRM_12BIT_RIGHT }; @@ -375,7 +260,7 @@ static const DACConversionGroup dacgrpcfg1 = { }; static const DACConfig dac1cfg2 = { - .init = 2047U, + .init = DAC_SAMPLE_MAX, .datamode = DAC_DHRM_12BIT_RIGHT }; From 292a87ad0442293aadfe6910c9e5f19a53e54a81 Mon Sep 17 00:00:00 2001 From: Michael Pio Date: Sun, 4 Nov 2018 01:08:05 +0800 Subject: [PATCH 346/505] Instructions on how to flash via STM32 bootloader (#4316) * Add instructions on flashing ARM keyboards with default STM32 bootloader * fixed typo; added note suggestion to step 4 --- docs/flashing.md | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/docs/flashing.md b/docs/flashing.md index 1edbe2225364..bc418c415060 100644 --- a/docs/flashing.md +++ b/docs/flashing.md @@ -71,8 +71,8 @@ Flashing sequence: 1. Press the `RESET` keycode, or short RST to GND quickly (you only have 7 seconds to flash once it enters) 2. Wait for the OS to detect the device -4. Flash a .hex file -5. Wait for the device to reset automatically +3. Flash a .hex file +4. Wait for the device to reset automatically or @@ -106,5 +106,28 @@ Flashing sequence: 1. Press the `RESET` keycode, or short RST to GND quickly (you only have 7 seconds to flash once it enters) 2. Wait for the OS to detect the device -4. Flash a .hex file -5. Reset the device into application mode (may be done automatically) +3. Flash a .hex file +4. Reset the device into application mode (may be done automatically) + +## STM32 + +All STM32 chips come preloaded with a factory bootloader that cannot be modified nor deleted. Some STM32 chips have bootloaders that do not come with USB programming (e.g. STM32F103) but the process is still the same. + +At the moment, no `BOOTLOADER` variable is needed on `rules.mk` for STM32. + +Compatible flashers: + +* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI) +* [dfu-util](https://github.com/Stefan-Schmidt/dfu-util) / `:dfu-util` (recommended command line) + +Flashing sequence: + +1. Enter the bootloader using any of the following methods: + * Tap the `RESET` keycode (may not work on STM32F042 devices) + * If a reset circuit is present, tap the RESET button + * Otherwise, you need to bridge BOOT0 to VCC (via BOOT0 button or bridge), short RESET to GND (via RESET button or bridge), and then let go of the BOOT0 bridge +2. Wait for the OS to detect the device +3. Flash a .bin file + * You will receive a warning about the DFU signature; Just ignore it +4. Reset the device into application mode (may be done automatically) + * If you are building from command line (e.g. `make planck/rev6:default:dfu-util`), make sure that `:leave` is passed to the `DFU_ARGS` variable inside your `rules.mk` (e.g. `DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave`) so that your device resets after flashing From bdc72740cb5f9d7d6d5df574b39721ec479dc733 Mon Sep 17 00:00:00 2001 From: BK Date: Sat, 3 Nov 2018 13:38:37 -0400 Subject: [PATCH 347/505] Add distro support for sabayon (#4320) * Add distro support for sabayon Sabayon is a gentoo based distro with a different package manager. Does not need any use flags or masking for the required packages. * Add missing backslash * Put echo string in quotes, remove extra newline * Order gentoo/sabayon packages alphabetically. --- util/linux_install.sh | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/util/linux_install.sh b/util/linux_install.sh index d3b9328d79c9..8dc28be6efa5 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -86,15 +86,28 @@ elif grep ID /etc/os-release | grep -q gentoo; then app-arch/unzip \ app-arch/zip \ app-mobilephone/dfu-util \ + dev-embedded/avrdude \ net-misc/wget \ sys-devel/gcc \ - sys-devel/crossdev dev-embedded/avrdude + sys-devel/crossdev sudo crossdev -s4 --stable --g =4.9.4 --portage --verbose --target avr - echo Done! + echo "Done!" else echo "Quitting..." fi +elif grep ID /etc/os-release | grep -q sabayon; then + sudo equo install \ + app-arch/unzip \ + app-arch/zip \ + app-mobilephone/dfu-util \ + dev-embedded/avrdude \ + net-misc/wget \ + sys-devel/gcc \ + sys-devel/crossdev + sudo crossdev -s4 --stable --g =4.9.4 --portage --verbose --target avr + echo "Done!" + elif grep ID /etc/os-release | grep -qE "opensuse|tumbleweed"; then CROSS_AVR_GCC=cross-avr-gcc8 if grep ID /etc/os-release | grep -q "15.0"; then From 80c04b29194a0023b8e47f3ac49ea248c8ec953d Mon Sep 17 00:00:00 2001 From: wanleg <32079073+wanleg@users.noreply.github.com> Date: Sat, 3 Nov 2018 10:39:40 -0700 Subject: [PATCH 348/505] 5x5bt (#4333) * got bluetooth working * get rid of description on bluetooth * get rid of commented code used for testing * Update config.h --- layouts/community/ortho_4x12/wanleg/config.h | 7 ++---- layouts/community/ortho_5x15/wanleg/config.h | 20 +++++++++++----- layouts/community/ortho_5x15/wanleg/keymap.c | 25 +++++++++++++------- layouts/community/ortho_5x15/wanleg/rules.mk | 9 ++++++- users/wanleg/rules.mk | 6 +++++ 5 files changed, 47 insertions(+), 20 deletions(-) diff --git a/layouts/community/ortho_4x12/wanleg/config.h b/layouts/community/ortho_4x12/wanleg/config.h index 2444b8b97617..2b2072db2214 100644 --- a/layouts/community/ortho_4x12/wanleg/config.h +++ b/layouts/community/ortho_4x12/wanleg/config.h @@ -1,5 +1,4 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once //QMK DFU settings (ProMicro boards with QMK bootloader) // set top left key as bootloader mode escape key on Lets Split rev2 @@ -30,8 +29,6 @@ #undef MATRIX_ROW_PINS #undef MATRIX_COL_PINS #define MATRIX_ROW_PINS { D1, D0, D4, C6 } -//last 4 elements of the column array are are not broken out on a ProMicro (included only to preserve array structure) +//last 4 elements of the column array are not broken out on a ProMicro (included only to preserve array structure) #define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, B6, B5, B4, E6, D7, F0, B7, D6, F1 } #endif - -#endif diff --git a/layouts/community/ortho_5x15/wanleg/config.h b/layouts/community/ortho_5x15/wanleg/config.h index 1043986f7a66..1aeda2db4e16 100644 --- a/layouts/community/ortho_5x15/wanleg/config.h +++ b/layouts/community/ortho_5x15/wanleg/config.h @@ -1,8 +1,16 @@ #pragma once -// set top left key as bootloader mode escape key on 5x5 75key layout -#if defined(KEYBOARD_5x5) && !defined(PRO_MICRO) -#define QMK_LED B0 -#define QMK_ESC_OUTPUT D7 // usually COL -#define QMK_ESC_INPUT B2 // usually ROW -#endif \ No newline at end of file +//5x5 powered by Adafruit Feather 32u4 Bluefruit LE +#if defined(KEYBOARD_5x5) && defined(BLUEFRUIT) + +//need to undefine standard 5x5 array before defining alternate Bluefruit array +#undef MATRIX_ROW_PINS +#undef MATRIX_COL_PINS +#define MATRIX_ROW_PINS { F7, F6, F5, D1, D0 } +//last 5 elements not tested +#define MATRIX_COL_PINS { C6, D7, B5, B6, B7, D6, C7, F0, F1, F4, B1, B2, B3, D2, D3 } + +//get rid of description - too long to show properly in Windows +#undef DESCRIPTION +#define DESCRIPTION +#endif diff --git a/layouts/community/ortho_5x15/wanleg/keymap.c b/layouts/community/ortho_5x15/wanleg/keymap.c index df7424115705..66b3ce018dce 100644 --- a/layouts/community/ortho_5x15/wanleg/keymap.c +++ b/layouts/community/ortho_5x15/wanleg/keymap.c @@ -15,14 +15,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TD(RST_TAP_DANCE), GHERKIN50, KC_LALT, NUMPAD, NUMBER75, ETCETERA75, KC_SPC,DIRECTION75, KC_RGUI, KC_RALT, KC_DEL, KC_RCTL, KC_KP_0, KC_KP_0, KC_KP_DOT ), -[PAD] = LAYOUT_ortho_5x5_wrapper( - _______, _______, _______, _______, _______, - _______________NUMPAD_Row__0_______________, _______, - _______________NUMPAD_Row__1_______________, _______, - _______________NUMPAD_Row__2_______________, _______, - KC_KP_0, TD(LYR50_TAP_DANCE), KC_KP_DOT, KC_PMNS, _______ -), - [GK50] = LAYOUT_ortho_5x10_wrapper( KC_ESC, _______, _______, _______, _______, _______, _______, _______, _______, KC_BSPC, _______________Gherkin_Row_0_______________, @@ -31,6 +23,23 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { TD(RST_TAP_DANCE), GHERKIN75, NUMPAD, gNUMBER, gETCETERA, KC_SPC,gDIRECTION, KC_RGUI, KC_RALT, KC_RGUI ), +#if defined(BLUEFRUIT) +[PAD] = LAYOUT_ortho_5x5_wrapper( + _______, _______, _______, OUT_BT, OUT_USB, + _______________NUMPAD_Row__0_______________, _______, + _______________NUMPAD_Row__1_______________, _______, + _______________NUMPAD_Row__2_______________, _______, + KC_KP_0, TD(LYR50_TAP_DANCE), KC_KP_DOT, KC_PMNS, _______ +), +#else + [PAD] = LAYOUT_ortho_5x5_wrapper( + _______, _______, _______, _______, _______, + _______________NUMPAD_Row__0_______________, _______, + _______________NUMPAD_Row__1_______________, _______, + _______________NUMPAD_Row__2_______________, _______, + KC_KP_0, TD(LYR50_TAP_DANCE), KC_KP_DOT, KC_PMNS, _______ +), +#endif #else /* Gherkin 75 * .--------------------------------------------------------------------------------------------------------------------------------------. diff --git a/layouts/community/ortho_5x15/wanleg/rules.mk b/layouts/community/ortho_5x15/wanleg/rules.mk index e36226fb2eef..bfc4c69d99ad 100644 --- a/layouts/community/ortho_5x15/wanleg/rules.mk +++ b/layouts/community/ortho_5x15/wanleg/rules.mk @@ -1 +1,8 @@ -SWAP_HANDS_ENABLE = no \ No newline at end of file +ifeq (,$(findstring yes,$(BLUEFRUIT))) + BLUETOOTH = AdafruitBLE + BLUETOOTH_ENABLE = yes + F_CPU = 8000000 + CONSOLE_ENABLE = no # Console for debug(+400) + COMMAND_ENABLE = no # Commands for debug and configuration + RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +endif \ No newline at end of file diff --git a/users/wanleg/rules.mk b/users/wanleg/rules.mk index 2a2a65cfea5c..e3e802b4a7a4 100644 --- a/users/wanleg/rules.mk +++ b/users/wanleg/rules.mk @@ -14,3 +14,9 @@ endif ifeq ($(strip $(PM)), yes) OPT_DEFS += -DPRO_MICRO endif + +#use alternate settings for boards using "Adafruit Feather 32u4 Bluefruit LE" instead of Micro +#example usage: make 5x5:wanleg BT=yes +ifeq ($(strip $(BT)), yes) + OPT_DEFS += -DBLUEFRUIT +endif \ No newline at end of file From 60ed0b7c3045d9511c28495f4d8c65240434c952 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Sat, 3 Nov 2018 15:09:32 -0700 Subject: [PATCH 349/505] Keyboard: Port over the x268 Noxary Firmware (#4339) * port over Rozakiin https://github.com/Rozakiin/Noxary_Firmware/tree/master/noxary_x268 * rename LAYOUT to LAYOUT_65_ansi default layout * add configurator support * add community layout support * put Rozakiin's name everywhere * update readme * problems with the 65_ansi keymap to be diagnosed later --- keyboards/noxary/README.md | 4 +- keyboards/noxary/x268/config.h | 230 ++++++++++++++++++ keyboards/noxary/x268/info.json | 12 + .../noxary/x268/keymaps/default/config.h | 19 ++ .../noxary/x268/keymaps/default/keymap.c | 83 +++++++ .../noxary/x268/keymaps/default/readme.md | 1 + keyboards/noxary/x268/readme.md | 18 ++ keyboards/noxary/x268/rules.mk | 80 ++++++ keyboards/noxary/x268/x268.c | 53 ++++ keyboards/noxary/x268/x268.h | 35 +++ 10 files changed, 534 insertions(+), 1 deletion(-) create mode 100644 keyboards/noxary/x268/config.h create mode 100644 keyboards/noxary/x268/info.json create mode 100644 keyboards/noxary/x268/keymaps/default/config.h create mode 100644 keyboards/noxary/x268/keymaps/default/keymap.c create mode 100644 keyboards/noxary/x268/keymaps/default/readme.md create mode 100644 keyboards/noxary/x268/readme.md create mode 100644 keyboards/noxary/x268/rules.mk create mode 100644 keyboards/noxary/x268/x268.c create mode 100644 keyboards/noxary/x268/x268.h diff --git a/keyboards/noxary/README.md b/keyboards/noxary/README.md index 81e525506a38..bd4b4b591f5f 100644 --- a/keyboards/noxary/README.md +++ b/keyboards/noxary/README.md @@ -1,7 +1,9 @@ # Noxary Firmware -All files related to firmware of Noxary Keyboards designed by Rozakiin. +All files related to firmware of Noxary Keyboards designed by [Rozakiin](https://github.com/rozakiin). ### Keyboards - [268](./268/): Original repo [here](https://github.com/Rozakiin/Noxary_Firmware). Imported by kind [permission](https://github.com/Rozakiin/Noxary_Firmware/issues/1) of @rozakiin + +- [x268](./x268/): Original repo [here](https://github.com/Rozakiin/Noxary_Firmware). Imported by kind [permission](https://github.com/Rozakiin/Noxary_Firmware/issues/1) of @rozakiin diff --git a/keyboards/noxary/x268/config.h b/keyboards/noxary/x268/config.h new file mode 100644 index 000000000000..5c4f6cdad7ce --- /dev/null +++ b/keyboards/noxary/x268/config.h @@ -0,0 +1,230 @@ +/* +Copyright 2018 Rozakiin + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x4E58 +#define PRODUCT_ID 0x0044 +#define DEVICE_VER 0x00F2 +#define MANUFACTURER Noxary +#define PRODUCT x268 +#define DESCRIPTION QMK keyboard firmware for x268 + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +/* + * 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 { F7, F6, F5, F0, B4 } +#define MATRIX_COL_PINS { C6, B6, C7, F4, E6, B2, D6, D0, D1, D7, D4, D5, D3, F1, D2, B1 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B7 +#ifdef BACKLIGHT_PIN +#define BACKLIGHT_LEVELS 3 +#endif + +/* ws2812b options */ +#define RGB_DI_PIN B5 +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 16 +#define RGBLIGHT_HUE_STEP 16 +#define RGBLIGHT_SAT_STEP 16 +#define RGBLIGHT_VAL_STEP 16 +/*#define RGBLIGHT_LIMIT_VAL 255 */ +#endif + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 diff --git a/keyboards/noxary/x268/info.json b/keyboards/noxary/x268/info.json new file mode 100644 index 000000000000..047c39f04415 --- /dev/null +++ b/keyboards/noxary/x268/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Noxary x268", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":15, "y":2}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}] + } + } +} diff --git a/keyboards/noxary/x268/keymaps/default/config.h b/keyboards/noxary/x268/keymaps/default/config.h new file mode 100644 index 000000000000..9c4c2b63081f --- /dev/null +++ b/keyboards/noxary/x268/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 Rozakiin + * + * 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 + +// place overrides here diff --git a/keyboards/noxary/x268/keymaps/default/keymap.c b/keyboards/noxary/x268/keymaps/default/keymap.c new file mode 100644 index 000000000000..cb37407a7b6c --- /dev/null +++ b/keyboards/noxary/x268/keymaps/default/keymap.c @@ -0,0 +1,83 @@ +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL1 1 +#define _FL2 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* _BL: Base Layer(Default) - For ISO enter use ANSI enter + * ,----------------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \|BSpc| Grv| + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | Del| + * |----------------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '| #| Ent|PgUp| + * |----------------------------------------------------------------| + * |Shift| \| Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |Alt|Mo(1)|Ctrl|Lef|Dow|Rght| + * `----------------------------------------------------------------' + */ + [_BL] = LAYOUT_65_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_BSLS, KC_BSPC, 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_BSLS, KC_DEL, + 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_NUHS, KC_ENT, KC_PGUP, + 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_PGDN, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, MO(_FL1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + /* _FL1: Function Layer 1 - For ISO enter use ANSI enter + * ,----------------------------------------------------------------. + * | `|F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| |PScr| | + * |----------------------------------------------------------------| + * | | | | |RST| | | | | | | | | | Ins| + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | |Home| + * |----------------------------------------------------------------| + * | | | | | | | | | |Bl-|Bl+| |Mute|Vol+| End| + * |----------------------------------------------------------------| + * | | | | BL_Toggle | | | | |Vol-| | + * `----------------------------------------------------------------' + */ + [_FL1] = LAYOUT_65_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_PSCR, _______, + RGB_TOG, RGB_VAI, RGB_SAI, RGB_HUI, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, + _______, RGB_VAD, RGB_SAD, RGB_HUD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, + _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, BL_INC, _______, KC_MUTE, KC_VOLU, KC_END, + _______, _______, _______, BL_TOGG, _______, _______, _______, _______, KC_VOLD, _______), + /* _FL2: Function Layer 2 - For ISO enter use ANSI enter + * ,----------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | + * `----------------------------------------------------------------' + */ + [_FL2] = LAYOUT_65_ansi( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + +}; + + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + diff --git a/keyboards/noxary/x268/keymaps/default/readme.md b/keyboards/noxary/x268/keymaps/default/readme.md new file mode 100644 index 000000000000..5d5bd69592ca --- /dev/null +++ b/keyboards/noxary/x268/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for x268 diff --git a/keyboards/noxary/x268/readme.md b/keyboards/noxary/x268/readme.md new file mode 100644 index 000000000000..c1c05c34d584 --- /dev/null +++ b/keyboards/noxary/x268/readme.md @@ -0,0 +1,18 @@ +# Noxary x268 + +![x268](https://geekhack.org/index.php?action=dlattach;topic=96377.0;attach=198826;image) + +A fully customizable 65% keyboard. + +* Keyboard Maintainer: [Rozakiin](https://github.com/rozakiin) +* Hardware Supported: x268 PCB + * rev1 +* Hardware Availability: + * [Noxary - 268](https://geekhack.org/index.php?topic=92066.0) + * [LZ - CLS ms](https://geekhack.org/index.php?topic=96377) + +Make example for this keyboard (after setting up your build environment): + + make noxary/x268:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/noxary/x268/rules.mk b/keyboards/noxary/x268/rules.mk new file mode 100644 index 000000000000..3c4a26ad1aa9 --- /dev/null +++ b/keyboards/noxary/x268/rules.mk @@ -0,0 +1,80 @@ +# 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 + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = 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 +# 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 = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) diff --git a/keyboards/noxary/x268/x268.c b/keyboards/noxary/x268/x268.c new file mode 100644 index 000000000000..3921270acc6f --- /dev/null +++ b/keyboards/noxary/x268/x268.c @@ -0,0 +1,53 @@ +/* Copyright 2018 Rozakiin + * + * 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 "x268.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); +} + +void led_set_user(uint8_t usb_led) { + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRB |= (1 << 0); PORTB |= (1 << 0); + } + else { + DDRB &= ~(1 << 0); PORTB &= ~(1 << 0); + } +} diff --git a/keyboards/noxary/x268/x268.h b/keyboards/noxary/x268/x268.h new file mode 100644 index 000000000000..53855e206045 --- /dev/null +++ b/keyboards/noxary/x268/x268.h @@ -0,0 +1,35 @@ +/* Copyright 2018 Rozakiin + * + * 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 X268_H +#define X268_H + +#include "quantum.h" + +#define LAYOUT_65_ansi( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K114, K115, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K215, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K314, K315, \ + K400, K401, K402, K406, K409, K410, K411, K412, K414, K415 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO, K114, K115 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, KC_NO, K214, K215 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, KC_NO, K314, K315 }, \ + { K400, K401, K402, KC_NO, KC_NO, KC_NO, K406, KC_NO, KC_NO, K409, K410, K411, K412, KC_NO, K414, K415 } \ +} + +#endif From b5d7bb6154f848e4f3fd3e5d3cc8bbb16a18e093 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 3 Nov 2018 23:57:42 -0700 Subject: [PATCH 350/505] converter/usb_usb Refactor and Configurator support (#4345) * converter/usb_usb: layout macro refactor - KEYMAP_ALL renamed to LAYOUT_all - KEYMAP renamed to LAYOUT_ansi - KEYMAP_ISO renamed to LAYOUT_iso - KEYMAP_JIS renamed to LAYOUT_jis * converter/usb_usb: keymap refactor - all keymaps now use #include QMK_KEYBOARD_H - layout macro names updated - removed deprecated TMK macro/function code * Add info.json file for Configurator support --- keyboards/converter/usb_usb/info.json | 485 ++++++++++++++++++ .../converter/usb_usb/keymaps/ble/keymap.c | 18 +- .../usb_usb/keymaps/coloneljesus/keymap.c | 44 +- .../usb_usb/keymaps/default/keymap.c | 22 +- keyboards/converter/usb_usb/usb_usb.h | 56 +- 5 files changed, 537 insertions(+), 88 deletions(-) create mode 100644 keyboards/converter/usb_usb/info.json diff --git a/keyboards/converter/usb_usb/info.json b/keyboards/converter/usb_usb/info.json new file mode 100644 index 000000000000..af3dd0b5e418 --- /dev/null +++ b/keyboards/converter/usb_usb/info.json @@ -0,0 +1,485 @@ +{ + "keyboard_name": "converter/usb_usb", + "url": "", + "maintainer": "qmk", + "width": 22.5, + "height": 6.5, + "layouts": { + "LAYOUT_all": { + "layout": [ + {"label":"F13", "x":2, "y":0}, + {"label":"F14", "x":3, "y":0}, + {"label":"F15", "x":4, "y":0}, + {"label":"F16", "x":5, "y":0}, + {"label":"F17", "x":6.5, "y":0}, + {"label":"F18", "x":7.5, "y":0}, + {"label":"F19", "x":8.5, "y":0}, + {"label":"F20", "x":9.5, "y":0}, + {"label":"F21", "x":11, "y":0}, + {"label":"F22", "x":12, "y":0}, + {"label":"F23", "x":13, "y":0}, + {"label":"F24", "x":14, "y":0}, + {"label":"Esc", "x":0, "y":1}, + {"label":"F1", "x":2, "y":1}, + {"label":"F2", "x":3, "y":1}, + {"label":"F3", "x":4, "y":1}, + {"label":"F4", "x":5, "y":1}, + {"label":"F5", "x":6.5, "y":1}, + {"label":"F6", "x":7.5, "y":1}, + {"label":"F7", "x":8.5, "y":1}, + {"label":"F8", "x":9.5, "y":1}, + {"label":"F9", "x":11, "y":1}, + {"label":"F10", "x":12, "y":1}, + {"label":"F11", "x":13, "y":1}, + {"label":"F12", "x":14, "y":1}, + {"label":"Print Screen", "x":15.25, "y":1}, + {"label":"Scroll Lock", "x":16.25, "y":1}, + {"label":"Pause", "x":17.25, "y":1}, + {"label":"Volume Down", "x":18.5, "y":1}, + {"label":"Vol Up", "x":19.5, "y":1}, + {"label":"Mute", "x":20.5, "y":1}, + {"label":"Power", "x":21.5, "y":1}, + {"label":"Help", "x":22.75, "y":1}, + {"label":"`", "x":0, "y":2.5}, + {"label":"1", "x":1, "y":2.5}, + {"label":"2", "x":2, "y":2.5}, + {"label":"3", "x":3, "y":2.5}, + {"label":"4", "x":4, "y":2.5}, + {"label":"5", "x":5, "y":2.5}, + {"label":"6", "x":6, "y":2.5}, + {"label":"7", "x":7, "y":2.5}, + {"label":"8", "x":8, "y":2.5}, + {"label":"9", "x":9, "y":2.5}, + {"label":"0", "x":10, "y":2.5}, + {"label":"-", "x":11, "y":2.5}, + {"label":"=", "x":12, "y":2.5}, + {"label":"Yen", "x":13, "y":2.5}, + {"label":"Back Space", "x":14, "y":2.5}, + {"label":"Insert", "x":15.25, "y":2.5}, + {"label":"Home", "x":16.25, "y":2.5}, + {"label":"Page Up", "x":17.25, "y":2.5}, + {"label":"Num Lock", "x":18.5, "y":2.5}, + {"label":"Num /", "x":19.5, "y":2.5}, + {"label":"Num *", "x":20.5, "y":2.5}, + {"label":"Num -", "x":21.5, "y":2.5}, + {"label":"Stop", "x":22.75, "y":2.5}, + {"label":"Again", "x":23.75, "y":2.5}, + {"label":"Tab", "x":0, "y":3.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":3.5}, + {"label":"W", "x":2.5, "y":3.5}, + {"label":"E", "x":3.5, "y":3.5}, + {"label":"R", "x":4.5, "y":3.5}, + {"label":"T", "x":5.5, "y":3.5}, + {"label":"Y", "x":6.5, "y":3.5}, + {"label":"U", "x":7.5, "y":3.5}, + {"label":"I", "x":8.5, "y":3.5}, + {"label":"O", "x":9.5, "y":3.5}, + {"label":"P", "x":10.5, "y":3.5}, + {"label":"[", "x":11.5, "y":3.5}, + {"label":"]", "x":12.5, "y":3.5}, + {"label":"\\", "x":13.5, "y":3.5, "w":1.5}, + {"label":"Delete", "x":15.25, "y":3.5}, + {"label":"End", "x":16.25, "y":3.5}, + {"label":"Page Down", "x":17.25, "y":3.5}, + {"label":"Num 7", "x":18.5, "y":3.5}, + {"label":"Num 8", "x":19.5, "y":3.5}, + {"label":"Num 9", "x":20.5, "y":3.5}, + {"label":"Num +", "x":21.5, "y":3.5}, + {"label":"Menu", "x":22.75, "y":3.5}, + {"label":"Undo", "x":23.75, "y":3.5}, + {"label":"Caps Lock", "x":0, "y":4.5, "w":1.75}, + {"label":"A", "x":1.75, "y":4.5}, + {"label":"S", "x":2.75, "y":4.5}, + {"label":"D", "x":3.75, "y":4.5}, + {"label":"F", "x":4.75, "y":4.5}, + {"label":"G", "x":5.75, "y":4.5}, + {"label":"H", "x":6.75, "y":4.5}, + {"label":"J", "x":7.75, "y":4.5}, + {"label":"K", "x":8.75, "y":4.5}, + {"label":"L", "x":9.75, "y":4.5}, + {"label":";", "x":10.75, "y":4.5}, + {"label":"\"", "x":11.75, "y":4.5}, + {"label":"ISO #", "x":12.75, "y":4.5}, + {"label":"Enter", "x":13.75, "y":4.5, "w":1.25}, + {"label":"Num 4", "x":18.5, "y":4.5}, + {"label":"Num 5", "x":19.5, "y":4.5}, + {"label":"Num 6", "x":20.5, "y":4.5}, + {"label":"Num , ", "x":21.5, "y":4.5}, + {"label":"Select", "x":22.75, "y":4.5}, + {"label":"Copy", "x":23.75, "y":4.5}, + {"label":"Shift", "x":0, "y":5.5, "w":1.25}, + {"label":"ISO \\", "x":1.25, "y":5.5}, + {"label":"Z", "x":2.25, "y":5.5}, + {"label":"X", "x":3.25, "y":5.5}, + {"label":"C", "x":4.25, "y":5.5}, + {"label":"V", "x":5.25, "y":5.5}, + {"label":"B", "x":6.25, "y":5.5}, + {"label":"N", "x":7.25, "y":5.5}, + {"label":"M", "x":8.25, "y":5.5}, + {"label":",", "x":9.25, "y":5.5}, + {"label":".", "x":10.25, "y":5.5}, + {"label":"/", "x":11.25, "y":5.5}, + {"label":"JIS \\", "x":12.25, "y":5.5}, + {"label":"Shift", "x":13.25, "y":5.5, "w":1.75}, + {"label":"Up", "x":16.25, "y":5.5}, + {"label":"Num 1", "x":18.5, "y":5.5}, + {"label":"Num 2", "x":19.5, "y":5.5}, + {"label":"Num 3", "x":20.5, "y":5.5}, + {"label":"Num =", "x":21.5, "y":5.5}, + {"label":"Exec", "x":22.75, "y":5.5}, + {"label":"Paste", "x":23.75, "y":5.5}, + {"label":"Ctrl", "x":0, "y":6.5}, + {"label":"GUI", "x":1, "y":6.5}, + {"label":"Alt", "x":2, "y":6.5}, + {"label":"JIS Muhenkan", "x":3, "y":6.5}, + {"label":"Hanja", "x":4, "y":6.5}, + {"label":"Space", "x":5, "y":6.5, "w":3}, + {"label":"Hangul/English", "x":8, "y":6.5}, + {"label":"JIS Henkan", "x":9, "y":6.5}, + {"label":"JIS Katakana/Hiragana", "x":10, "y":6.5}, + {"label":"Alt", "x":11, "y":6.5}, + {"label":"GUI", "x":12, "y":6.5}, + {"label":"App", "x":13, "y":6.5}, + {"label":"Ctrl", "x":14, "y":6.5}, + {"label":"Left", "x":15.25, "y":6.5}, + {"label":"Down", "x":16.25, "y":6.5}, + {"label":"Right", "x":17.25, "y":6.5}, + {"label":"Num 0", "x":18.5, "y":6.5, "w":2}, + {"label":"Num .", "x":20.5, "y":6.5}, + {"label":"Num Enter", "x":21.5, "y":6.5}, + {"label":"Find", "x":22.75, "y":6.5}, + {"label":"Cut", "x":23.75, "y":6.5} + ] + }, + "LAYOUT_ansi": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"PrtSc", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"`", "x":0, "y":1.5}, + {"label":"1", "x":1, "y":1.5}, + {"label":"2", "x":2, "y":1.5}, + {"label":"3", "x":3, "y":1.5}, + {"label":"4", "x":4, "y":1.5}, + {"label":"5", "x":5, "y":1.5}, + {"label":"6", "x":6, "y":1.5}, + {"label":"7", "x":7, "y":1.5}, + {"label":"8", "x":8, "y":1.5}, + {"label":"9", "x":9, "y":1.5}, + {"label":"0", "x":10, "y":1.5}, + {"label":"-", "x":11, "y":1.5}, + {"label":"=", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"Page Up", "x":17.25, "y":1.5}, + {"label":"Num Lock", "x":18.5, "y":1.5}, + {"label":"Num /", "x":19.5, "y":1.5}, + {"label":"Num *", "x":20.5, "y":1.5}, + {"label":"Num -", "x":21.5, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"[", "x":11.5, "y":2.5}, + {"label":"]", "x":12.5, "y":2.5}, + {"label":"\\", "x":13.5, "y":2.5, "w":1.5}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"Page Down", "x":17.25, "y":2.5}, + {"label":"Num 7", "x":18.5, "y":2.5}, + {"label":"Num 8", "x":19.5, "y":2.5}, + {"label":"Num 9", "x":20.5, "y":2.5}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":":", "x":10.75, "y":3.5}, + {"label":"\"", "x":11.75, "y":3.5}, + {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, + {"label":"Num 4", "x":18.5, "y":3.5}, + {"label":"Num 5", "x":19.5, "y":3.5}, + {"label":"Num 6", "x":20.5, "y":3.5}, + {"label":"Num +", "x":21.5, "y":2.5, "h":2}, + {"label":"Shift", "x":0, "y":4.5, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":",", "x":9.25, "y":4.5}, + {"label":".", "x":10.25, "y":4.5}, + {"label":"/", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":2.75}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"Num 1", "x":18.5, "y":4.5}, + {"label":"Num 2", "x":19.5, "y":4.5}, + {"label":"Num 3", "x":20.5, "y":4.5}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5.5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5.5, "w":6.25}, + {"label":"Alt", "x":10, "y":5.5, "w":1.25}, + {"label":"GUI", "x":11.25, "y":5.5, "w":1.25}, + {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5}, + {"label":"Num 0", "x":18.5, "y":5.5, "w":2}, + {"label":"Num .", "x":20.5, "y":5.5}, + {"label":"Num Enter", "x":21.5, "y":4.5, "h":2} + ] + }, + "LAYOUT_iso": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"Print Screen", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"`", "x":0, "y":1.5}, + {"label":"1", "x":1, "y":1.5}, + {"label":"2", "x":2, "y":1.5}, + {"label":"3", "x":3, "y":1.5}, + {"label":"4", "x":4, "y":1.5}, + {"label":"5", "x":5, "y":1.5}, + {"label":"6", "x":6, "y":1.5}, + {"label":"7", "x":7, "y":1.5}, + {"label":"8", "x":8, "y":1.5}, + {"label":"9", "x":9, "y":1.5}, + {"label":"0", "x":10, "y":1.5}, + {"label":"-", "x":11, "y":1.5}, + {"label":"=", "x":12, "y":1.5}, + {"label":"Backspace", "x":13, "y":1.5, "w":2}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"Page Up", "x":17.25, "y":1.5}, + {"label":"Num Lock", "x":18.5, "y":1.5}, + {"label":"Num /", "x":19.5, "y":1.5}, + {"label":"Num *", "x":20.5, "y":1.5}, + {"label":"Num -", "x":21.5, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"[", "x":11.5, "y":2.5}, + {"label":"]", "x":12.5, "y":2.5}, + {"label":"Enter", "x":13.75, "y":2.5, "w":1.25, "h":2}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"Page Down", "x":17.25, "y":2.5}, + {"label":"Num 7", "x":18.5, "y":2.5}, + {"label":"Num 8", "x":19.5, "y":2.5}, + {"label":"Num 9", "x":20.5, "y":2.5}, + {"label":"Num +", "x":21.5, "y":2.5, "h":2}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":";", "x":10.75, "y":3.5}, + {"label":"'", "x":11.75, "y":3.5}, + {"label":"ISO #", "x":12.75, "y":3.5}, + {"label":"Num 4", "x":18.5, "y":3.5}, + {"label":"Num 5", "x":19.5, "y":3.5}, + {"label":"Num 6", "x":20.5, "y":3.5}, + {"label":"Shift", "x":0, "y":4.5, "w":1.25}, + {"label":"ISO \\", "x":1.25, "y":4.5}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":",", "x":9.25, "y":4.5}, + {"label":".", "x":10.25, "y":4.5}, + {"label":"/", "x":11.25, "y":4.5}, + {"label":"Shift", "x":12.25, "y":4.5, "w":2.75}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"Num 1", "x":18.5, "y":4.5}, + {"label":"Num 2", "x":19.5, "y":4.5}, + {"label":"Num 3", "x":20.5, "y":4.5}, + {"label":"Num Enter", "x":21.5, "y":4.5, "h":2}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5.5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5.5, "w":6.25}, + {"label":"AltGr", "x":10, "y":5.5, "w":1.25}, + {"label":"GUI", "x":11.25, "y":5.5, "w":1.25}, + {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5}, + {"label":"Num 0", "x":18.5, "y":5.5, "w":2}, + {"label":"Num .", "x":20.5, "y":5.5} + ] + }, + "LAYOUT_jis": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"Print Screen", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"JIS Hankaku / Zenkaku", "x":0, "y":1.5}, + {"label":"1", "x":1, "y":1.5}, + {"label":"2", "x":2, "y":1.5}, + {"label":"3", "x":3, "y":1.5}, + {"label":"4", "x":4, "y":1.5}, + {"label":"5", "x":5, "y":1.5}, + {"label":"6", "x":6, "y":1.5}, + {"label":"7", "x":7, "y":1.5}, + {"label":"8", "x":8, "y":1.5}, + {"label":"9", "x":9, "y":1.5}, + {"label":"0", "x":10, "y":1.5}, + {"label":"-", "x":11, "y":1.5}, + {"label":"ˆ", "x":12, "y":1.5}, + {"label":"JIS Yen", "x":13, "y":1.5}, + {"label":"Back Space", "x":14, "y":1.5}, + {"label":"Insert", "x":15.25, "y":1.5}, + {"label":"Home", "x":16.25, "y":1.5}, + {"label":"Page Up", "x":17.25, "y":1.5}, + {"label":"Num Lock", "x":18.5, "y":1.5}, + {"label":"Num /", "x":19.5, "y":1.5}, + {"label":"Num *", "x":20.5, "y":1.5}, + {"label":"Num -", "x":21.5, "y":1.5}, + {"label":"Tab", "x":0, "y":2.5, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.5}, + {"label":"W", "x":2.5, "y":2.5}, + {"label":"E", "x":3.5, "y":2.5}, + {"label":"R", "x":4.5, "y":2.5}, + {"label":"T", "x":5.5, "y":2.5}, + {"label":"Y", "x":6.5, "y":2.5}, + {"label":"U", "x":7.5, "y":2.5}, + {"label":"I", "x":8.5, "y":2.5}, + {"label":"O", "x":9.5, "y":2.5}, + {"label":"P", "x":10.5, "y":2.5}, + {"label":"@", "x":11.5, "y":2.5}, + {"label":"[", "x":12.5, "y":2.5}, + {"label":"Enter", "x":13.75, "y":2.5, "w":1.25, "h":2}, + {"label":"Delete", "x":15.25, "y":2.5}, + {"label":"End", "x":16.25, "y":2.5}, + {"label":"Page Down", "x":17.25, "y":2.5}, + {"label":"Num 7", "x":18.5, "y":2.5}, + {"label":"Num 8", "x":19.5, "y":2.5}, + {"label":"Num 9", "x":20.5, "y":2.5}, + {"label":"Num +", "x":21.5, "y":2.5, "h":2}, + {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, + {"label":"A", "x":1.75, "y":3.5}, + {"label":"S", "x":2.75, "y":3.5}, + {"label":"D", "x":3.75, "y":3.5}, + {"label":"F", "x":4.75, "y":3.5}, + {"label":"G", "x":5.75, "y":3.5}, + {"label":"H", "x":6.75, "y":3.5}, + {"label":"J", "x":7.75, "y":3.5}, + {"label":"K", "x":8.75, "y":3.5}, + {"label":"L", "x":9.75, "y":3.5}, + {"label":";", "x":10.75, "y":3.5}, + {"label":":", "x":11.75, "y":3.5}, + {"label":"]", "x":12.75, "y":3.5}, + {"label":"Num 4", "x":18.5, "y":3.5}, + {"label":"Num 5", "x":19.5, "y":3.5}, + {"label":"Num 6", "x":20.5, "y":3.5}, + {"label":"Shift", "x":0, "y":4.5, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.5}, + {"label":"X", "x":3.25, "y":4.5}, + {"label":"C", "x":4.25, "y":4.5}, + {"label":"V", "x":5.25, "y":4.5}, + {"label":"B", "x":6.25, "y":4.5}, + {"label":"N", "x":7.25, "y":4.5}, + {"label":"M", "x":8.25, "y":4.5}, + {"label":",", "x":9.25, "y":4.5}, + {"label":".", "x":10.25, "y":4.5}, + {"label":"/", "x":11.25, "y":4.5}, + {"label":"JIS \\", "x":12.25, "y":4.5}, + {"label":"Shift", "x":13.25, "y":4.5, "w":1.75}, + {"label":"Up", "x":16.25, "y":4.5}, + {"label":"Num 1", "x":18.5, "y":4.5}, + {"label":"Num 2", "x":19.5, "y":4.5}, + {"label":"Num 3", "x":20.5, "y":4.5}, + {"label":"Num Enter", "x":21.5, "y":4.5, "h":2}, + {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5.5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, + {"label":"JIS Muhenkan", "x":3.75, "y":5.5, "w":1.25}, + {"label":"Space", "x":5, "y":5.5, "w":2.5}, + {"label":"JIS Henkan", "x":7.5, "y":5.5, "w":1.25}, + {"label":"JIS Hiragana / Katakana", "x":8.75, "y":5.5, "w":1.25}, + {"label":"Alt", "x":10, "y":5.5, "w":1.25}, + {"label":"GUI", "x":11.25, "y":5.5, "w":1.25}, + {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, + {"label":"Left", "x":15.25, "y":5.5}, + {"label":"Down", "x":16.25, "y":5.5}, + {"label":"Right", "x":17.25, "y":5.5}, + {"label":"Num 0", "x":18.5, "y":5.5, "w":2}, + {"label":"Num .", "x":20.5, "y":5.5} + ] + } + } +} diff --git a/keyboards/converter/usb_usb/keymaps/ble/keymap.c b/keyboards/converter/usb_usb/keymaps/ble/keymap.c index 094bd95693f9..190b3319fe9b 100644 --- a/keyboards/converter/usb_usb/keymaps/ble/keymap.c +++ b/keyboards/converter/usb_usb/keymaps/ble/keymap.c @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include "usb_usb.h" +#include QMK_KEYBOARD_H const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { /* 0: plain Qwerty without layer switching @@ -36,9 +36,9 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * |Ctl|Gui|Alt|MHEN|HNJ| Space |H/E|HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| |Fnd|Cut| * `-----------------------------------------------------------' `-----------' `---------------' `-------' */ - [0] = KEYMAP_ALL( + [0] = LAYOUT_all( KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, - 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_VOLD, KC_VOLU, KC_MUTE, KC_PWR, KC_HELP, + 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_VOLD, KC_VOLU, KC_MUTE, KC_PWR, KC_HELP, 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_JYEN, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, KC_STOP, KC_AGIN, 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_MENU, KC_UNDO, 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_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PCMM, KC_SLCT, KC_COPY, @@ -47,18 +47,6 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { ), }; -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch(id) { - default: - return MACRO_NONE; - } -}; - - void matrix_init_user(void) { } diff --git a/keyboards/converter/usb_usb/keymaps/coloneljesus/keymap.c b/keyboards/converter/usb_usb/keymaps/coloneljesus/keymap.c index 0cc66fd53dca..6dfd1ad79e60 100644 --- a/keyboards/converter/usb_usb/keymaps/coloneljesus/keymap.c +++ b/keyboards/converter/usb_usb/keymaps/coloneljesus/keymap.c @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include "usb_usb.h" +#include QMK_KEYBOARD_H const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { /* 0: plain Qwerty without layer switching @@ -36,7 +36,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * |Ctl|Gui|Alt|MHEN|HNJ| Space |H/E|HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| |Fnd|Cut| * `-----------------------------------------------------------' `-----------' `---------------' `-------' */ - // KEYMAP_ALL( + // LAYOUT_all( // F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, // ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, // GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, @@ -45,17 +45,17 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { // LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PEQL, EXEC,PSTE, // LCTL,LGUI,LALT,MHEN,HANJ, SPC, HAEN,HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT,PENT, FIND,CUT // ), - KEYMAP_ALL( + LAYOUT_all( KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, - 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_VOLD, KC_VOLU, KC_MUTE, KC_PWR, KC_HELP, + 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_VOLD, KC_VOLU, KC_MUTE, KC_PWR, KC_HELP, 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_JYEN, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, KC_STOP, KC_AGIN, 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_MENU, KC_UNDO, MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PCMM, KC_SLCT, KC_COPY, 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_RO, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PEQL, KC_EXEC, KC_PSTE, KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_HANJ, KC_SPC, KC_HAEN, KC_HENK, KC_KANA, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT, KC_FIND, KC_CUT ), - KEYMAP_ALL( - ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, + LAYOUT_all( + ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,______,______, ______,______,______,______, ______, KC_GRV, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,______,______, ______,______,______,______, ______,______, KC_CAPS, KC_MPRV, KC_VOLU, KC_MNXT, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,______,______, ______,______,______,______, ______,______, @@ -65,18 +65,6 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { ), }; -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch(id) { - default: - return MACRO_NONE; - } -}; - - void matrix_init_user(void) { } @@ -113,7 +101,7 @@ void led_set_user(uint8_t usb_led) { * |Ctl|Gui|Alt| Space |Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .|Ent| * `-----------------------------------------------------------' `-----------' `---------------' */ - KEYMAP( + LAYOUT_ansi( ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, DEL, END, PGDN, P7, P8, P9, @@ -138,13 +126,13 @@ void led_set_user(uint8_t usb_led) { * |Ctl|Gui|Alt| Space |HNK|KNA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .| | * `-----------------------------------------------------------' `-----------' `---------------' */ - KEYMAP_ISO( + LAYOUT_iso( ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,ENT, DEL, END, PGDN, P7, P8, P9, PPLS, LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS, P4, P5, P6, LSFT,NUBS,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RSFT, UP, P1, P2, P3, PENT, - LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT + LCTL,LGUI,LALT, SPC, RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT ), /* JIS layout @@ -163,13 +151,13 @@ void led_set_user(uint8_t usb_led) { * |Ctl|Gui|Alt|MHEN| Space |HENK|KNA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .| | * `-----------------------------------------------------------' `-----------' `---------------' */ - KEYMAP_JIS( + LAYOUT_jis( ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,BRK, GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JPY, BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC, ENT, DEL, END, PGDN, P7, P8, P9, PPLS, LCTL,A, S, D, F, G, H, J, K, L, SCLN,QUOT,NUHS, P4, P5, P6, LSFT,Z, X, C, V, B, N, M, COMM,DOT, SLSH, RO, RSFT, UP, P1, P2, P3, PENT, - LCTL,LGUI,LALT,MHEN, SPC, HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT + LCTL,LGUI,LALT,MHEN, SPC, HENK,KANA,RALT,RGUI,APP, RCTL, LEFT,DOWN,RGHT, P0, PDOT ), /* Colemak http://colemak.com @@ -185,7 +173,7 @@ void led_set_user(uint8_t usb_led) { * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| * `----------------------------------------------------------' */ - KEYMAP_ALL( + LAYOUT_all( F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, @@ -208,7 +196,7 @@ void led_set_user(uint8_t usb_led) { * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| * `-----------------------------------------------------------' */ - KEYMAP_ALL( + LAYOUT_all( F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, LBRC,RBRC,JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, @@ -231,7 +219,7 @@ void led_set_user(uint8_t usb_led) { * |Ctrl |Gui |Alt | Space |Alt |Gui |Menu|Ctrl| * `-----------------------------------------------------------' */ - KEYMAP_ALL( + LAYOUT_all( F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, @@ -265,7 +253,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |Ctl|Gui|Alt|MHEN|HNJ| Space |H/E|HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| |Fnd|Cut| * `-----------------------------------------------------------' `-----------' `---------------' `-------' */ - [0] = KEYMAP_ALL( + [0] = LAYOUT_all( F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23, F24, ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PSCR,SLCK,PAUS, VOLD,VOLU,MUTE,PWR, HELP, ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, JYEN,BSPC, INS, HOME,PGUP, NLCK,PSLS,PAST,PMNS, STOP,AGIN, @@ -288,7 +276,7 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | * `-----------------------------------------------------------' */ - [1] = KEYMAP_ALL( + [1] = LAYOUT_all( TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS, GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS, diff --git a/keyboards/converter/usb_usb/keymaps/default/keymap.c b/keyboards/converter/usb_usb/keymaps/default/keymap.c index 9817a607d38b..170ed31ef878 100644 --- a/keyboards/converter/usb_usb/keymaps/default/keymap.c +++ b/keyboards/converter/usb_usb/keymaps/default/keymap.c @@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include "usb_usb.h" +#include QMK_KEYBOARD_H const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { /* 0: plain Qwerty without layer switching @@ -36,17 +36,17 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { * |Ctl|Gui|Alt|MHEN|HNJ| Space |H/E|HENK|KANA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0 | .|Ent| |Fnd|Cut| * `-----------------------------------------------------------' `-----------' `---------------' `-------' */ - [0] = KEYMAP_ALL( + [0] = LAYOUT_all( KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, - 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_VOLD, KC_VOLU, KC_MUTE, KC_PWR, KC_HELP, + 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_VOLD, KC_VOLU, KC_MUTE, KC_PWR, KC_HELP, 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_JYEN, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, KC_STOP, KC_AGIN, 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_MENU, KC_UNDO, 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_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PCMM, KC_SLCT, KC_COPY, 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_RO, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PEQL, KC_EXEC, KC_PSTE, KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_HANJ, KC_SPC, KC_HAEN, KC_HENK, KC_KANA, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT, KC_FIND, KC_CUT ), - [1] = KEYMAP_ALL( - ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, + [1] = LAYOUT_all( + ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,______,______, ______,______,______,______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,______,______, ______,______,______,______, ______,______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,______,______, ______,______,______,______, ______,______, @@ -56,18 +56,6 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] PROGMEM = { ), }; -const uint16_t PROGMEM fn_actions[] = { - -}; - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - switch(id) { - default: - return MACRO_NONE; - } -}; - - void matrix_init_user(void) { } diff --git a/keyboards/converter/usb_usb/usb_usb.h b/keyboards/converter/usb_usb/usb_usb.h index c31fae1d0fa3..e0c7c9c0d452 100644 --- a/keyboards/converter/usb_usb/usb_usb.h +++ b/keyboards/converter/usb_usb/usb_usb.h @@ -62,7 +62,7 @@ along with this program. If not, see . * * TODO: use same keycode to pass through instead of KC_NO? */ -#define KEYMAP_ALL( \ +#define LAYOUT_all( \ K68,K69,K6A,K6B,K6C,K6D,K6E,K6F,K70,K71,K72,K73, \ K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, K81,K80,K7F,K66, K75, \ K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K89,K2A, K49,K4A,K4B, K53,K54,K55,K56, K78,K79, \ @@ -120,21 +120,21 @@ along with this program. If not, see . * |Ctl|Gui|Alt| Space |Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .|Ent| * `-----------------------------------------------------------' `-----------' `---------------' */ -#define KEYMAP( \ +#define LAYOUT_ansi( \ K29,K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, \ K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K2A, K49,K4A,K4B, K53,K54,K55,K56, \ K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30,K31, K4C,K4D,K4E, K5F,K60,K61, \ K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K28, K5C,K5D,K5E,K57, \ KE1,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, KE5, K52, K59,K5A,K5B, \ KE0,KE3,KE2, K2C, KE6,KE7,K65,KE4, K50,K51,K4F, K62, K63,K58 \ -) KEYMAP_ALL( \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,KC_NO, K2A, K49,K4A,K4B, K53,K54,K55,K56, KC_NO, KC_NO, \ - K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K31, K4C,K4D,K4E, K5F,K60,K61,K57, KC_NO, KC_NO, \ - K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, KC_NO, K28, K5C,K5D,K5E,KC_NO, KC_NO, KC_NO, \ - KE1,KC_NO, K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, KC_NO, KE5, K52, K59,K5A,K5B,KC_NO, KC_NO, KC_NO, \ - KE0,KE3,KE2,KC_NO, KC_NO, K2C, KC_NO, KC_NO, KC_NO, KE6,KE7,K65,KE4, K50,K51,K4F, K62, K63,K58, KC_NO, KC_NO \ +) LAYOUT_all( \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + K29, K3A, K3B, K3C, K3D, K3E, K3F, K40, K41, K42, K43, K44, K45, K46, K47, K48, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + K35, K1E, K1F, K20, K21, K22, K23, K24, K25, K26, K27, K2D, K2E, KC_NO, K2A, K49, K4A, K4B, K53, K54, K55, K56, KC_NO, KC_NO, \ + K2B, K14, K1A, K08, K15, K17, K1C, K18, K0C, K12, K13, K2F, K30, K31, K4C, K4D, K4E, K5F, K60, K61, K57, KC_NO, KC_NO, \ + K39, K04, K16, K07, K09, K0A, K0B, K0D, K0E, K0F, K33, K34, KC_NO, K28, K5C, K5D, K5E, KC_NO, KC_NO, KC_NO, \ + KE1, KC_NO, K1D, K1B, K06, K19, K05, K11, K10, K36, K37, K38, KC_NO, KE5, K52, K59, K5A, K5B, KC_NO, KC_NO, KC_NO, \ + KE0, KE3, KE2, KC_NO, KC_NO, K2C, KC_NO, KC_NO, KC_NO, KE6, KE7, K65, KE4, K50, K51, K4F, K62, K63, K58, KC_NO, KC_NO \ ) /* ,---. ,---------------. ,---------------. ,---------------. ,-----------. @@ -152,21 +152,21 @@ along with this program. If not, see . * |Ctl|Gui|Alt| Space |Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .| | * `-----------------------------------------------------------' `-----------' `---------------' */ -#define KEYMAP_ISO( \ +#define LAYOUT_iso( \ K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, \ K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K2A, K49,K4A,K4B, K53,K54,K55,K56, \ K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30,K28, K4C,K4D,K4E, K5F,K60,K61,K57, \ K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34,K32, K5C,K5D,K5E, \ KE1,K64,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, KE5, K52, K59,K5A,K5B,K58, \ KE0,KE3,KE2, K2C, KE6,KE7,K65,KE4, K50,K51,K4F, K62, K63 \ -) KEYMAP_ALL( \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,KC_NO, K2A, K49,K4A,K4B, K53,K54,K55,K56, KC_NO, KC_NO, \ - K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K32, K4C,K4D,K4E, K5F,K60,K61,K57, KC_NO, KC_NO, \ - K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K32,K28, K5C,K5D,K5E,KC_NO, KC_NO, KC_NO, \ - KE1,K64,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, KC_NO, KE5, K52, K59,K5A,K5B,KC_NO, KC_NO, KC_NO, \ - KE0,KE3,KE2,KC_NO, KC_NO, K2C, KC_NO, KC_NO, KC_NO, KE6,KE7,K65,KE4, K50,K51,K4F, K62, K63,K58, KC_NO, KC_NO \ +) LAYOUT_all( \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + K29, K3A, K3B, K3C, K3D, K3E, K3F, K40, K41, K42, K43, K44, K45, K46, K47, K48, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + K35, K1E, K1F, K20, K21, K22, K23, K24, K25, K26, K27, K2D, K2E, KC_NO, K2A, K49, K4A, K4B, K53, K54, K55, K56, KC_NO, KC_NO, \ + K2B, K14, K1A, K08, K15, K17, K1C, K18, K0C, K12, K13, K2F, K30, K32, K4C, K4D, K4E, K5F, K60, K61, K57, KC_NO, KC_NO, \ + K39, K04, K16, K07, K09, K0A, K0B, K0D, K0E, K0F, K33, K34, K32, K28, K5C, K5D, K5E, KC_NO, KC_NO, KC_NO, \ + KE1, K64, K1D, K1B, K06, K19, K05, K11, K10, K36, K37, K38, KC_NO, KE5, K52, K59, K5A, K5B, KC_NO, KC_NO, KC_NO, \ + KE0, KE3, KE2, KC_NO, KC_NO, K2C, KC_NO, KC_NO, KC_NO, KE6, KE7, K65, KE4, K50, K51, K4F, K62, K63, K58, KC_NO, KC_NO \ ) /* ,---. ,---------------. ,---------------. ,---------------. ,-----------. @@ -184,20 +184,20 @@ along with this program. If not, see . * |Ctl|Gui|Alt|MHEN| Space |HENK|KNA|Alt|Gui|App|Ctl| |Lef|Dow|Rig| | 0| .| | * `-----------------------------------------------------------' `-----------' `---------------' */ -#define KEYMAP_JIS( \ +#define LAYOUT_jis( \ K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, \ K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K89,K2A, K49,K4A,K4B, K53,K54,K55,K56, \ K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K28, K4C,K4D,K4E, K5F,K60,K61,K57, \ K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34,K32, K5C,K5D,K5E, \ KE1,K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, K87,KE5, K52, K59,K5A,K5B,K58, \ KE0,KE3,KE2,K8B, K2C, K8A,K88,KE6,KE7,K65,KE4, K50,K51,K4F, K62, K63 \ -) KEYMAP_ALL( \ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - K29, K3A,K3B,K3C,K3D,K3E,K3F,K40,K41,K42,K43,K44,K45, K46,K47,K48, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ - K35,K1E,K1F,K20,K21,K22,K23,K24,K25,K26,K27,K2D,K2E,K89,K2A, K49,K4A,K4B, K53,K54,K55,K56, KC_NO, KC_NO, \ - K2B,K14,K1A,K08,K15,K17,K1C,K18,K0C,K12,K13,K2F,K30, K32, K4C,K4D,K4E, K5F,K60,K61,K57, KC_NO, KC_NO, \ - K39,K04,K16,K07,K09,K0A,K0B,K0D,K0E,K0F,K33,K34, K32,K28, K5C,K5D,K5E,KC_NO, KC_NO, KC_NO, \ - KE1,KC_NO, K1D,K1B,K06,K19,K05,K11,K10,K36,K37,K38, K87,KE5, K52, K59,K5A,K5B,KC_NO, KC_NO, KC_NO, \ - KE0,KE3,KE2,K8B,KC_NO, K2C, KC_NO, K8A,K88,KE6,KE7,K65,KE4, K50,K51,K4F, K62, K63,K58, KC_NO, KC_NO \ +) LAYOUT_all( \ + KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + K29, K3A, K3B, K3C, K3D, K3E, K3F, K40, K41, K42, K43, K44, K45, K46, K47, K48, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ + K35, K1E, K1F, K20, K21, K22, K23, K24, K25, K26, K27, K2D, K2E, K89, K2A, K49, K4A, K4B, K53, K54, K55, K56, KC_NO, KC_NO, \ + K2B, K14, K1A, K08, K15, K17, K1C, K18, K0C, K12, K13, K2F, K30, K32, K4C, K4D, K4E, K5F, K60, K61, K57, KC_NO, KC_NO, \ + K39, K04, K16, K07, K09, K0A, K0B, K0D, K0E, K0F, K33, K34, K32, K28, K5C, K5D, K5E, KC_NO, KC_NO, KC_NO, \ + KE1, KC_NO, K1D, K1B, K06, K19, K05, K11, K10, K36, K37, K38, K87, KE5, K52, K59, K5A, K5B, KC_NO, KC_NO, KC_NO, \ + KE0, KE3, KE2, K8B, KC_NO, K2C, KC_NO, K8A, K88, KE6, KE7, K65, KE4, K50, K51, K4F, K62, K63, K58, KC_NO, KC_NO \ ) #endif From 3946ea21413b56ad50e55482ff5c43b576adc1d7 Mon Sep 17 00:00:00 2001 From: TurboMech <32869044+TurboMech@users.noreply.github.com> Date: Sun, 4 Nov 2018 10:39:58 -0500 Subject: [PATCH 351/505] Keyboard: adding Espectro (#4343) * added Espectro Added Espectro keyboard from MechKeys.ca * Update keyboards/espectro/config.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/config.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/config.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/espectro.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/espectro.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/espectro.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/espectro.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/espectro.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/espectro.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/espectro.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/espectro.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/default/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/default/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/config.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/config.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/config.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/config.h Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/keymaps/mac/keymap.c Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/readme.md Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/readme.md Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/readme.md Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/readme.md Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * Update keyboards/espectro/rules.mk Co-Authored-By: TurboMech <32869044+TurboMech@users.noreply.github.com> * fixing Espectro pull request * fixing macros in mac keymap --- keyboards/espectro/config.h | 70 ++++++++ keyboards/espectro/espectro.c | 76 +++++++++ keyboards/espectro/espectro.h | 91 +++++++++++ keyboards/espectro/keymaps/default/keymap.c | 89 +++++++++++ keyboards/espectro/keymaps/mac/config.h | 22 +++ keyboards/espectro/keymaps/mac/keymap.c | 167 ++++++++++++++++++++ keyboards/espectro/keymaps/mac/readme.md | 56 +++++++ keyboards/espectro/readme.md | 15 ++ keyboards/espectro/rules.mk | 61 +++++++ 9 files changed, 647 insertions(+) create mode 100755 keyboards/espectro/config.h create mode 100755 keyboards/espectro/espectro.c create mode 100755 keyboards/espectro/espectro.h create mode 100755 keyboards/espectro/keymaps/default/keymap.c create mode 100644 keyboards/espectro/keymaps/mac/config.h create mode 100644 keyboards/espectro/keymaps/mac/keymap.c create mode 100644 keyboards/espectro/keymaps/mac/readme.md create mode 100644 keyboards/espectro/readme.md create mode 100755 keyboards/espectro/rules.mk diff --git a/keyboards/espectro/config.h b/keyboards/espectro/config.h new file mode 100755 index 000000000000..34852df43b75 --- /dev/null +++ b/keyboards/espectro/config.h @@ -0,0 +1,70 @@ +/* Copyright 2018 @TurboMech /u/TurboMech @A9entOran9e#6134 + * + * 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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0xCA96 +#define DEVICE_VER 0x0001 +#define MANUFACTURER MECHKEYS +#define PRODUCT Espectro +#define DESCRIPTION 96% keyboard + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 13 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { B7, B3, E6, F0, D5, D4, D6, C7 } +#define MATRIX_COL_PINS { C6, F1, F4, F5, F6, F7, D7, B4, B5, D0, D1, D2, D3} +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* number of backlight levels */ +#define BACKLIGHT_PIN B6 +#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)) \ +) + +#define RGB_DI_PIN E2 +#ifdef RGB_DI_PIN +#define RGBLED_NUM 16 +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 10 +#define RGBLIGHT_VAL_STEP 10 + +#define RGBLIGHT_ANIMATIONS + +#endif + diff --git a/keyboards/espectro/espectro.c b/keyboards/espectro/espectro.c new file mode 100755 index 000000000000..13030cdd4148 --- /dev/null +++ b/keyboards/espectro/espectro.c @@ -0,0 +1,76 @@ +/* Copyright 2018 @TurboMech /u/TurboMech @A9entOran9e#6134 + * + * 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 QMK_KEYBOARD_H +#include "quantum.h" + + +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); +} + +__attribute__ ((weak)) +void led_set_user(uint8_t usb_led) { + + if (usb_led & (1 << USB_LED_NUM_LOCK)) { + DDRB |= (1 << 0); PORTB &= ~(1 << 0); + } else { + DDRB &= ~(1 << 0); PORTB &= ~(1 << 0); + } + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRB |= (1 << 2); PORTB &= ~(1 << 2); + } else { + DDRB &= ~(1 << 2); PORTB &= ~(1 << 2); + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + DDRB |= (1 << 1); PORTB &= ~(1 << 1); + } else { + DDRB &= ~(1 << 1); PORTB &= ~(1 << 1); + } + + if (usb_led & (1 << USB_LED_COMPOSE)) { + + } else { + + } + + if (usb_led & (1 << USB_LED_KANA)) { + + } else { + + } + +} + diff --git a/keyboards/espectro/espectro.h b/keyboards/espectro/espectro.h new file mode 100755 index 000000000000..3d6ea466d302 --- /dev/null +++ b/keyboards/espectro/espectro.h @@ -0,0 +1,91 @@ +/* Copyright 2018 @TurboMech /u/TurboMech @A9entOran9e#6134 + * + * 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 ESPECTRO_H +#define ESPECTRO_H + +#include "quantum.h" + + +//Arrow keys and 1.75u shift +#define LAYOUT_default( \ +K000, K001, K002, K003, K004, K600, K601, K602, K603, K005, K006, K007, K008, K702, K009, K010, K011, K012, K712, \ +K100, K101, K102, K103, K104, K604, K605, K606, K607, K105, K106, K107, K108, K701, K109, K110, K111, K112, \ + K200, K201, K202, K203, K204, K608, K609, K610, K611, K205, K206, K207, K208, K703, K209, K210, K211, K212, \ + K300, K301, K302, K303, K304, K612, K705, K706, K707, K305, K306, K307, K308, K309, K310, K311, \ + K400, K402, K403, K404, K708, K709, K710, K711, K405, K406, K407, K408, K704, K409, K410, K411, K412, \ +K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO }, \ + { K400, KC_NO, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412 }, \ + { K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, KC_NO }, \ + { K600, K601, K602, K603, K604, K605, K606, K607, K608, K609, K610, K611, K612 }, \ + { KC_NO, K701, K702, K703, K704, K705, K706, K707, K708, K709, K710, K711, K712 }, \ +} + +// Split numpad (enter, 0), split shifts (right, left), split backspace +// This is more of an example of every possible keycode placement +#define LAYOUT_split_shift_and_bs( \ +K000, K001, K002, K003, K004, K600, K601, K602, K603, K005, K006, K007, K008, K702, K009, K010, K011, K012, K712, \ +K100, K101, K102, K103, K104, K604, K605, K606, K607, K105, K106, K107, K108, K700, K701, K109, K110, K111, K112, \ + K200, K201, K202, K203, K204, K608, K609, K610, K611, K205, K206, K207, K208, K703, K209, K210, K211, K212, \ + K300, K301, K302, K303, K304, K612, K705, K706, K707, K305, K306, K307, K308, K309, K310, K311, K312, \ + K400, K401, K402, K403, K404, K708, K709, K710, K711, K405, K406, K407, K408, K704, K409, K410, K411, K412, \ +K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, K512 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312 }, \ + { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412 }, \ + { K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, K512 }, \ + { K600, K601, K602, K603, K604, K605, K606, K607, K608, K609, K610, K611, K612 }, \ + { K701, K701, K702, K703, K704, K705, K706, K707, K708, K709, K710, K711, K712 }, \ +} + + + + +/* +Placement of every possible switch defined below. +x2 means the diode allows two possible positions for the switch + +#define LAYOUT_all( \ +K000, K001, K002, K003, K004, K600, K601, K602, K603, K005, K006, K007, K008, K702, K009, K010, K011, K012, K712, \ +K100, K101, K102, K103, K104, K604, K605, K606, K607, K105, K106, K107, K108, K700, K701x2, K109, K110, K111, K112, \ +K200, K201, K202, K203, K204, K608, K609, K610, K611, K205, K206, K207, K208, K703, K209, K210, K211, K212, \ + K308, K212, \ +K300, K300, K301, K302, K304, K612, K705, K706, K707, K305, K306, K307, K703, K308, K309, K310, K311, K312, \ +K400x2, K401, K402, K403, K404, K708, K709, K710, K711, K405, K406, K407, K408, K408, K704, K409, K410, K411, K412, \ + K412, \ +K500x2, K501x2, K502, K503x3, K504x3, K505x2, K506x2, K507x2, K508x2, K509, K510x2, K511, K512 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312 }, \ + { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412 }, \ + { K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, K512 }, \ + { K600, K601, K602, K603, K604, K605, K606, K607, K608, K609, K610, K611, K612 }, \ + { K700, K701, K702, K703, K704, K705, K706, K707, K708, K709, K710, K711, K712 }, \ +} +*/ + +#endif diff --git a/keyboards/espectro/keymaps/default/keymap.c b/keyboards/espectro/keymaps/default/keymap.c new file mode 100755 index 000000000000..aeff733fc13a --- /dev/null +++ b/keyboards/espectro/keymaps/default/keymap.c @@ -0,0 +1,89 @@ +/* Copyright 2018 @TurboMech /u/TurboMech @A9entOran9e#6134 + * + * 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 QMK_KEYBOARD_H +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +#define _BL 0 //Base layer +#define _FN1 1 //Function layer + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* BL +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | | | | | | +| ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | P SCN | HOME | END | P UP | P DOWN | DEL | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | | | BACK | NUM | | | | +| ~` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ - | = + | SPACE | LOCK | / | * | - | +|________|________|________|________|________|________|________|________|________|________|________|________|________|_________________|________|________|________|________| +| | | | | | | | | | | | [ | ] | | | | | | +| TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | | \ | 7 | 8 | 9 | | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|_____________|________|________|________| + | +| | | | | | | | | | | ; | ' | | | | | | +| CAPS LOCK | A | S | D | F | G | H | J | K | L | : | " | ENTER | 4 | 5 | 6 | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | , | . | / | | | | | | | +| SHIFT | Z | X | C | V | B | N | M | < | > | ? | SHIFT | UP | 1 | 2 | 3 | | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| ENTER | +| | | | | | | MO | | | | | | | +| CTRL | LGUI | L ALT | SPACE | R ALT | R CTRL | _FN | LEFT | DOWN | RIGHT | 0 | . | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| + */ + + [_BL] = LAYOUT_default( + 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_DEL, KC_PSCR, KC_SLCK, KC_PAUS, KC_PGUP, KC_PGDN, + 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_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_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_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT + ), + +/* FN_1 +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | VOL | VOL | NEXT | | | +| RESET | | | | | | | | | | | | | MUTE | DOWN | UP | TRACK | HOME | END | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | RGB | RGB | RGB | RGB | RGB | RGB | RGB | RGB | | | | | | | | | | +| | TOGGLE | MODE |INCREASE|DECREASE| HUE | HUE | SAT | | | | | | DELETE | | | | | +|________|________|________|________|________|INCREASE|DECREASE|INCREASE|DECREASE|________|________|________|________|_________________|________|________|________|________| +| | BACK | BACK | | | | | | | | | | | | | | | | +| | LIGHT | LIGHT | | | | | | | | | | | | | | | | +|____________| TOGGLE |INCREASE|DECREASE|________|________|________|________|________|________|________|________|________|_____________|________|________|________| | +| | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| | +| | | | | | | | | | | | | | +| | | | | | | | | | | | | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| + */ + + [_FN1] = LAYOUT_default( + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT, KC_HOME, KC_END, + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, + _______, BL_TOGG, BL_INC, BL_DEC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +}; + diff --git a/keyboards/espectro/keymaps/mac/config.h b/keyboards/espectro/keymaps/mac/config.h new file mode 100644 index 000000000000..a18495221b04 --- /dev/null +++ b/keyboards/espectro/keymaps/mac/config.h @@ -0,0 +1,22 @@ +/* Copyright 2018 @TurboMech /u/TurboMech @A9entOran9e#6134 + * + * 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 + +#define TAPPING_TOGGLE 2 + +// place overrides here + diff --git a/keyboards/espectro/keymaps/mac/keymap.c b/keyboards/espectro/keymaps/mac/keymap.c new file mode 100644 index 000000000000..4b72ff0aacb7 --- /dev/null +++ b/keyboards/espectro/keymaps/mac/keymap.c @@ -0,0 +1,167 @@ +/* Copyright 2018 @TurboMech /u/TurboMech @A9entOran9e#6134 + * + * 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 QMK_KEYBOARD_H + +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +#define _QWERTY 0 //BASE layer +#define _FUNCTION 1 //Function layer +#define _WINDOWS 2 //Windows layer + +enum custom_keycodes { + PLACEHOLDER = SAFE_RANGE, // can always be here + EXPOSE, // Expose (LCTRL + UP) + LAUNCH, + DOCK, + SCRCAP, + CS1, + CS2, + QALL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Base Layer +____________________________________________________________________________________________________________________________________________________________________________ +| | SCREEN | SCREEN | | |SHOW | TOGGLE |SCREEN |CUSTOM |CUSTOM |PREVIOUS| PLAY/ | NEXT | | | | | | | +| ESC |BRIGHTEN| DIM | EXPOSE |LAUNCHPA|DESKTOP | DOCK |CAPTURE |SHORTCUT|SHORTCUT| TRACK | PAUSE | TRACK | MUTE | VOL DN | VOL UP | PG UP |PG DOWN | POWER | +|________|________|________|________|________|________|________|________|___1____|___2____|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | | | BACK | | | | | +| ~` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ - | = + | SPACE | DELETE | / | * | - | +|________|________|________|________|________|________|________|________|________|________|________|________|________|_________________|________|________|________|________| +| | | | | | | | | | | | [ | ] | | | | | | +| TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | | \ | 7 | 8 | 9 | | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|_____________|________|________|________| + | +| | | | | | | | | | | ; | ' | | | | | | +| CAPS LOCK | A | S | D | F | G | H | J | K | L | : | " | ENTER | 4 | 5 | 6 | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | , | . | / | | | | | | | +| SHIFT | Z | X | C | V | B | N | M | < | > | ? | SHIFT | UP | 1 | 2 | 3 | | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| ENTER | +| | | | | | | TT | | | | | | | +| CTRL | L ALT | L GUI | SPACE | R GUI | R CTRL | _FN | LEFT | DOWN | RIGHT | 0 | . | | +|__________|__________| COMMAND |________________________________________________________|COMMAND |________|________|________|________|________|________|________|________| + */ + + [_QWERTY] = LAYOUT_default( + KC_ESC, KC_F14, KC_F15, EXPOSE, LAUNCH, KC_F11, DOCK, SCRCAP, CS1, CS2, KC_MRWD, KC_MPLY, KC_MFFD, KC_MUTE, KC_VOLD, KC_VOLU, KC_PGUP, KC_PGDN, KC_POWER, + 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_DEL, 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_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_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RCTL, TT(1), KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT + ), +/* FN1 - SEE readme.md +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | | | | | | +| QUIT | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | | | HOME | END | RESET | +|_ALL____|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | RGB | RGB | RGB | RGB | RGB | RGB | RGB | RGB | | | | | | | | | | +| | TOGGLE | MODE |INCREASE|DECREASE| HUE | HUE | SAT | | | | | | DELETE | | | | | +|________|________|________|________|________|INCREASE|DECREASE|INCREASE|DECREASE|________|________|________|________|_________________|________|________|________|________| +| | BACK | BACK | | | | | | | | | | | | | | | | +| | LIGHT | LIGHT | | | | | | | | | | | | | | | | +|____________| TOGGLE |INCREASE|DECREASE|________|________|________|________|________|________|________|________|________|_____________|________|________|________| | +| | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| | +| | | | | | | | | | | | | | +| | | | | | | | | | | | | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| + */ + + + [_FUNCTION] = LAYOUT_default( + QALL, 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_HOME, KC_END, RESET, + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, + _______, BL_TOGG, BL_INC, BL_DEC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, TO(2), _______, _______, _______, _______, _______, _______ + + ), + +/* Windows layer +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | | | | | | +| ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DELETE | HOME | END | P UP | P DOWN | MENU | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | | | BACK | NUM | | | | +| ~` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ - | = + | SPACE | LOCK | / | * | - | +|________|________|________|________|________|________|________|________|________|________|________|________|________|_________________|________|________|________|________| +| | | | | | | | | | | | [ | ] | | | | | | +| TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | | \ | 7 | 8 | 9 | | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|_____________|________|________|________| + | +| | | | | | | | | | | ; | ' | | | | | | +| CAPS LOCK | A | S | D | F | G | H | J | K | L | : | " | ENTER | 4 | 5 | 6 | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | , | . | / | | | | | | | +| SHIFT | Z | X | C | V | B | N | M | < | > | ? | SHIFT | UP | 1 | 2 | 3 | | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| ENTER | +| | | | | | | TO | | | | | | | +| L GUI | L ALT | L CTL | SPACE | R CTL | R ALT |LAYER 0 | LEFT | DOWN | RIGHT | 0 | . | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| + */ + + + [_WINDOWS] = LAYOUT_default( + 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_DEL, KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_MENU, + 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_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_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_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LGUI, KC_LALT, KC_LCTL, KC_SPC, KC_RCTL, KC_RALT, TO(0), KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT + ), +}; + + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch (keycode) { + // dynamically generate these. + case EXPOSE: + SEND_STRING(SS_DOWN(X_LCTRL) SS_TAP(X_UP) SS_UP(X_LCTRL)); + return false; + case LAUNCH: + SEND_STRING(SS_DOWN(X_LCTRL) SS_TAP(X_L) SS_UP(X_LCTRL)); + return false; + case DOCK: + SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_LGUI) SS_TAP(X_D) SS_UP(X_LGUI) SS_UP(X_LALT)); + return false; + case SCRCAP: //screen capture + SEND_STRING(SS_DOWN(X_LCTRL) SS_TAP(X_S) SS_UP(X_LCTRL)); + return false; + case CS1: //custom shortcut 1 + SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_LGUI) SS_TAP(X_1) SS_UP(X_LGUI) SS_UP(X_LALT)); + return false; + case CS2: //custom shortcut 2 + SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_LGUI) SS_TAP(X_2) SS_UP(X_LGUI) SS_UP(X_LALT)); + return false; + case QALL: //quit all applications + SEND_STRING(SS_DOWN(X_LALT) SS_DOWN(X_LGUI) SS_TAP(X_Q) SS_UP(X_LGUI) SS_UP(X_LALT)); + return false; + } + return false; + } + return true; +}; + diff --git a/keyboards/espectro/keymaps/mac/readme.md b/keyboards/espectro/keymaps/mac/readme.md new file mode 100644 index 000000000000..fb62260181cf --- /dev/null +++ b/keyboards/espectro/keymaps/mac/readme.md @@ -0,0 +1,56 @@ +# This is u/TurboMech's keyboard layout for Espectro. + +## It is designed for Mac OS, due to the specific functions created. + +### Here is the layout found in the keymap.c file. +##### I use shortcuts for the Function row (above number row) listed below + - Scrn Bright Up: F14 + - Scrn Bright Down: F15 + - Expose: LCTRL + Up + - Launchpad: LCTRL + L + - Show Desktop: F11 + - Show/Hide Dock: LALT + LGUI + D + - Screen Capture: LCTRL + S + - Custom Shortcut 1: LCTRL + LGUI + 1 + - Custom Shortcut 2: LCTRL + LGUI + 2 + - use the custom shortcuts for whatever you want: launch an application, a macro, etc. + - Play/Pause: exactly that + - Mute / Volume Up / Volume Down: exactly what it says + - QALL: Quit all applications + + ##### Going down the right side from Vol Down: + - POWER: this serves as the power button on Mac's only. Press and hold the button as you would on your Macbook or iMac keyboard. + - Menu: this slides the notification bar on the right side (its the same as on iPhones/ iPads) + +### See below keymaps for how to setup shortcuts on Mac + +#### Base Layer +``` +Needs updating. +``` +#### Function Layer 1 - See above for shortcuts +``` +Needs updating +``` + +#### How to use/ setup shortcuts on Mac +- First navigate to System Preferences > Keyboard > Shortcuts + - You can use any of them in here + - Just set them to the shortcut keys listed above + +#### How to make your own (to launch applications, quit all, etc.) +- Navigate to Automator > New Document > click Service > Choose +- Now we have to setup our shortcut + - Here's how to setup the Quit All Shortcut + - In the right window select the Service recieves dropdown > select No Input + - At the top left click the Name (Search) > type quit > click and hold Quit All Applications > drag to the right hand box (under the Service Recieves) + - **IMPORTANT** You have to click the Run button at the upper right hand corner in order for these to actually work. + - Now click File > Save > save it as Quit All Apps (or whatever you want) / you can also just exit out and it'll ask you if you want to save +- Navigate back to System Preferences > Keyboard > Shortcuts + - The new shortcut can be found under services, set it to one of the shortcuts I listed above and done +- The same applies for applications in the Name (search) just type the application you want to have as shortcut. Don't forget to run it, then do the same steps + to set it up as a shortcut. + + + + diff --git a/keyboards/espectro/readme.md b/keyboards/espectro/readme.md new file mode 100644 index 000000000000..c4c0edc7f74c --- /dev/null +++ b/keyboards/espectro/readme.md @@ -0,0 +1,15 @@ +# Espectro + +![Espectro](https://cdn.shopify.com/s/files/1/1697/5323/products/IMG_0162_53a5ca83-3ce5-4741-92e8-10f769cf5ee1_1024x1024.jpg?v=1540701787) + +A 96% keyboard made and sold by MECHKEYS [More info on MECHKEYS](https://mechkeys.ca). + +Keyboard Maintainer: [TurboMech](https://github.com/TurboMech) +Hardware Supported: Espectro +Hardware Availability: [MECHKEYS](https://mechkeys.ca) + +Make example for this keyboard (after setting up your build environment): + + make espectro:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/espectro/rules.mk b/keyboards/espectro/rules.mk new file mode 100755 index 000000000000..2c28fe8504eb --- /dev/null +++ b/keyboards/espectro/rules.mk @@ -0,0 +1,61 @@ +# 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) + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = atmel-dfu + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Boot Section Size in *bytes* + + +# Build Options +# comment out to disable the options. +# +BOOTMAGIC_ENABLE = yes # 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 = yes # Commands for debug and configuration +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality +AUDIO_ENABLE = no +RGBLIGHT_ENABLE = yes From e9fd42df71ebc367fccbbf918a1794498aa57914 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sun, 4 Nov 2018 09:32:42 -0800 Subject: [PATCH 352/505] converter/adb_usb Configurator support and adb_usb.h cleanup (#4348) * converter/adb_usb: Configurator support Note: LAYOUT_ext_ansi has a blank space between the Spacebar and the Right Alt/Option key when loaded in the Configurator. This is deliberate. Stock Apple Extended Keyboards and AEK IIs send the scan code for Left Command when either Command key is used. (This is noted already in the readme.) That being the case, the Command keys cannot be assigned to different functions. Whichever keycode is placed on Left Command will be used for both Command keys. * converter/adb_usb: adb_usb.h cleanup - replaced KEYMAP_COMMON_H with ADB_USB_H - white space changes for visual alignment in LAYOUT_ext_ansi macro --- keyboards/converter/adb_usb/adb_usb.h | 12 +- keyboards/converter/adb_usb/info.json | 204 ++++++++++++++++++++++++++ 2 files changed, 210 insertions(+), 6 deletions(-) create mode 100644 keyboards/converter/adb_usb/info.json diff --git a/keyboards/converter/adb_usb/adb_usb.h b/keyboards/converter/adb_usb/adb_usb.h index 491db95f1c93..8691adcc65ea 100644 --- a/keyboards/converter/adb_usb/adb_usb.h +++ b/keyboards/converter/adb_usb/adb_usb.h @@ -17,8 +17,8 @@ along with this program. If not, see . Ported to QMK by Peter Roe */ -#ifndef KEYMAP_COMMON_H -#define KEYMAP_COMMON_H +#ifndef ADB_USB_H +#define ADB_USB_H #include "quantum.h" @@ -58,10 +58,10 @@ Ported to QMK by Peter Roe { KC_NO, KC_NO, KC_NO, K4B, K4C, KC_NO, K4E, KC_NO, }, \ { KC_NO, KC_NO, K52, K53, K54, K55, K56, K57 }, \ { K58, K59, KC_NO, K5B, K5C, KC_NO, KC_NO, KC_NO, }, \ - { K60, K61, K62, K63, K64, K65, KC_NO, K67 }, \ - { KC_NO, K69, KC_NO, K6B, KC_NO, K6D, KC_NO, K6F }, \ - { KC_NO, K71, K72, K73, K74, K75, K76, K77 }, \ - { K78, K79, K7A, K7B, K7C, K7D, KC_NO, K7F } \ + { K60, K61, K62, K63, K64, K65, KC_NO, K67 }, \ + { KC_NO, K69, KC_NO, K6B, KC_NO, K6D, KC_NO, K6F }, \ + { KC_NO, K71, K72, K73, K74, K75, K76, K77 }, \ + { K78, K79, K7A, K7B, K7C, K7D, KC_NO, K7F } \ } /* M0116 Apple Standard Keyboard ANSI diff --git a/keyboards/converter/adb_usb/info.json b/keyboards/converter/adb_usb/info.json new file mode 100644 index 000000000000..e06f9c1adb6d --- /dev/null +++ b/keyboards/converter/adb_usb/info.json @@ -0,0 +1,204 @@ +{ + "keyboard_name": "ADB to USB Keyboard Converter", + "url": "", + "maintainer": "qmk", + "width": 22.5, + "height": 7, + "layouts": { + "LAYOUT_ext_ansi": { + "layout": [ + {"label":"Escape", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"Print Screen", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"Eject", "x":21.5, "y":0}, + {"label":"`", "x":0, "y":2}, + {"label":"1", "x":1, "y":2}, + {"label":"2", "x":2, "y":2}, + {"label":"3", "x":3, "y":2}, + {"label":"4", "x":4, "y":2}, + {"label":"5", "x":5, "y":2}, + {"label":"6", "x":6, "y":2}, + {"label":"7", "x":7, "y":2}, + {"label":"8", "x":8, "y":2}, + {"label":"9", "x":9, "y":2}, + {"label":"0", "x":10, "y":2}, + {"label":"-", "x":11, "y":2}, + {"label":"=", "x":12, "y":2}, + {"label":"Backspace", "x":13, "y":2, "w":2}, + {"label":"Insert", "x":15.25, "y":2}, + {"label":"Home", "x":16.25, "y":2}, + {"label":"Page Up", "x":17.25, "y":2}, + {"label":"Num Lock", "x":18.5, "y":2}, + {"label":"Num =", "x":19.5, "y":2}, + {"label":"Num /", "x":20.5, "y":2}, + {"label":"Num *", "x":21.5, "y":2}, + {"label":"Tab", "x":0, "y":3, "w":1.5}, + {"label":"Q", "x":1.5, "y":3}, + {"label":"W", "x":2.5, "y":3}, + {"label":"E", "x":3.5, "y":3}, + {"label":"R", "x":4.5, "y":3}, + {"label":"T", "x":5.5, "y":3}, + {"label":"Y", "x":6.5, "y":3}, + {"label":"U", "x":7.5, "y":3}, + {"label":"I", "x":8.5, "y":3}, + {"label":"O", "x":9.5, "y":3}, + {"label":"P", "x":10.5, "y":3}, + {"label":"[", "x":11.5, "y":3}, + {"label":"]", "x":12.5, "y":3}, + {"label":"\\", "x":13.5, "y":3, "w":1.5}, + {"label":"Delete", "x":15.25, "y":3}, + {"label":"End", "x":16.25, "y":3}, + {"label":"Page Down", "x":17.25, "y":3}, + {"label":"Num 7", "x":18.5, "y":3}, + {"label":"Num 8", "x":19.5, "y":3}, + {"label":"Num 9", "x":20.5, "y":3}, + {"label":"Num -", "x":21.5, "y":3}, + {"label":"Lcap", "x":0, "y":4, "w":1.75}, + {"label":"A", "x":1.75, "y":4}, + {"label":"S", "x":2.75, "y":4}, + {"label":"D", "x":3.75, "y":4}, + {"label":"F", "x":4.75, "y":4}, + {"label":"G", "x":5.75, "y":4}, + {"label":"H", "x":6.75, "y":4}, + {"label":"J", "x":7.75, "y":4}, + {"label":"K", "x":8.75, "y":4}, + {"label":"L", "x":9.75, "y":4}, + {"label":";", "x":10.75, "y":4}, + {"label":"\"", "x":11.75, "y":4}, + {"label":"Enter", "x":12.75, "y":4, "w":2.25}, + {"label":"Num 4", "x":18.5, "y":4}, + {"label":"Num 5", "x":19.5, "y":4}, + {"label":"Num 6", "x":20.5, "y":4}, + {"label":"Num +", "x":21.5, "y":4}, + {"label":"Shift", "x":0, "y":5, "w":2.25}, + {"label":"Z", "x":2.25, "y":5}, + {"label":"X", "x":3.25, "y":5}, + {"label":"C", "x":4.25, "y":5}, + {"label":"V", "x":5.25, "y":5}, + {"label":"B", "x":6.25, "y":5}, + {"label":"N", "x":7.25, "y":5}, + {"label":"M", "x":8.25, "y":5}, + {"label":",", "x":9.25, "y":5}, + {"label":".", "x":10.25, "y":5}, + {"label":"/", "x":11.25, "y":5}, + {"label":"Shift", "x":12.25, "y":5, "w":2.75}, + {"label":"Up", "x":16.25, "y":5}, + {"label":"Num 1", "x":18.5, "y":5}, + {"label":"Num 2", "x":19.5, "y":5}, + {"label":"Num 3", "x":20.5, "y":5}, + {"label":"Ctrl", "x":0, "y":6, "w":1.5}, + {"label":"Alt", "x":1.5, "y":6, "w":1.25}, + {"label":"Command", "x":2.75, "y":6, "w":1.5}, + {"label":"Space", "x":4.25, "y":6, "w":6.5}, + {"label":"Alt", "x":12.25, "y":6, "w":1.25}, + {"label":"Ctrl", "x":13.5, "y":6, "w":1.5}, + {"label":"Left", "x":15.25, "y":6}, + {"label":"Down", "x":16.25, "y":6}, + {"label":"Right", "x":17.25, "y":6}, + {"label":"Num 0", "x":18.5, "y":6, "w":2}, + {"label":"Num .", "x":20.5, "y":6}, + {"label":"Num Enter", "x":21.5, "y":5, "h":2} + ] + }, + "LAYOUT_m0116_ansi": { + "width": 19.5, + "height": 6.25, + "layout": [ + {"label":"Power", "x":5, "y":0, "w":2}, + {"label":"Esc", "x":0, "y":1.25}, + {"label":"1", "x":1, "y":1.25}, + {"label":"2", "x":2, "y":1.25}, + {"label":"3", "x":3, "y":1.25}, + {"label":"4", "x":4, "y":1.25}, + {"label":"5", "x":5, "y":1.25}, + {"label":"6", "x":6, "y":1.25}, + {"label":"7", "x":7, "y":1.25}, + {"label":"8", "x":8, "y":1.25}, + {"label":"9", "x":9, "y":1.25}, + {"label":"0", "x":10, "y":1.25}, + {"label":"-", "x":11, "y":1.25}, + {"label":"=", "x":12, "y":1.25}, + {"label":"Delete", "x":13, "y":1.25, "w":1.5}, + {"label":"Clear", "x":15.5, "y":1.25}, + {"label":"Num =", "x":16.5, "y":1.25}, + {"label":"Num /", "x":17.5, "y":1.25}, + {"label":"Num *", "x":18.5, "y":1.25}, + {"label":"Tab", "x":0, "y":2.25, "w":1.5}, + {"label":"Q", "x":1.5, "y":2.25}, + {"label":"W", "x":2.5, "y":2.25}, + {"label":"E", "x":3.5, "y":2.25}, + {"label":"R", "x":4.5, "y":2.25}, + {"label":"T", "x":5.5, "y":2.25}, + {"label":"Y", "x":6.5, "y":2.25}, + {"label":"U", "x":7.5, "y":2.25}, + {"label":"I", "x":8.5, "y":2.25}, + {"label":"O", "x":9.5, "y":2.25}, + {"label":"P", "x":10.5, "y":2.25}, + {"label":"[", "x":11.5, "y":2.25}, + {"label":"]", "x":12.5, "y":2.25}, + {"label":"Num 7", "x":15.5, "y":2.25}, + {"label":"Num 8", "x":16.5, "y":2.25}, + {"label":"Num 9", "x":17.5, "y":2.25}, + {"label":"Num +", "x":18.5, "y":2.25}, + {"label":"Ctrl", "x":0, "y":3.25, "w":1.75}, + {"label":"A", "x":1.75, "y":3.25}, + {"label":"S", "x":2.75, "y":3.25}, + {"label":"D", "x":3.75, "y":3.25}, + {"label":"F", "x":4.75, "y":3.25}, + {"label":"G", "x":5.75, "y":3.25}, + {"label":"H", "x":6.75, "y":3.25}, + {"label":"J", "x":7.75, "y":3.25}, + {"label":"K", "x":8.75, "y":3.25}, + {"label":"L", "x":9.75, "y":3.25}, + {"label":";", "x":10.75, "y":3.25}, + {"label":"'", "x":11.75, "y":3.25}, + {"label":"Return", "x":12.75, "y":3.25, "w":1.75}, + {"label":"Num 4", "x":15.5, "y":3.25}, + {"label":"Num 5", "x":16.5, "y":3.25}, + {"label":"Num 6", "x":17.5, "y":3.25}, + {"label":"Num -", "x":18.5, "y":3.25}, + {"label":"Shift", "x":0, "y":4.25, "w":2.25}, + {"label":"Z", "x":2.25, "y":4.25}, + {"label":"X", "x":3.25, "y":4.25}, + {"label":"C", "x":4.25, "y":4.25}, + {"label":"V", "x":5.25, "y":4.25}, + {"label":"B", "x":6.25, "y":4.25}, + {"label":"N", "x":7.25, "y":4.25}, + {"label":"M", "x":8.25, "y":4.25}, + {"label":",", "x":9.25, "y":4.25}, + {"label":".", "x":10.25, "y":4.25}, + {"label":"/", "x":11.25, "y":4.25}, + {"label":"Shift", "x":12.25, "y":4.25, "w":2.25}, + {"label":"Num 1", "x":15.5, "y":4.25}, + {"label":"Num 2", "x":16.5, "y":4.25}, + {"label":"Num 3", "x":17.5, "y":4.25}, + {"label":"Caps Lock", "x":0, "y":5.25}, + {"label":"Option", "x":1, "y":5.25}, + {"label":"Command", "x":2, "y":5.25, "w":1.75}, + {"label":"`", "x":3.75, "y":5.25}, + {"label":"Space", "x":4.75, "y":5.25, "w":4.75}, + {"label":"\\", "x":9.5, "y":5.25}, + {"label":"Left", "x":10.5, "y":5.25}, + {"label":"Right", "x":11.5, "y":5.25}, + {"label":"Down", "x":12.5, "y":5.25}, + {"label":"Up", "x":13.5, "y":5.25}, + {"label":"Num 0", "x":15.5, "y":5.25, "w":2}, + {"label":"Num .", "x":17.5, "y":5.25}, + {"label":"Num Enter", "x":18.5, "y":4.25, "h":2} + ] + } + } +} From 756d92c1a071b6c481b67a44671308fc9d680afe Mon Sep 17 00:00:00 2001 From: Kosuke Adachi Date: Mon, 5 Nov 2018 03:46:26 +0900 Subject: [PATCH 353/505] Keyboard: Update the serial.c of crkbd based on the helix-serial.c (#4349) --- keyboards/crkbd/rev1/serial_config.h | 12 +- keyboards/crkbd/rev1/split_scomm.c | 49 +++-- keyboards/crkbd/rev1/split_scomm.h | 5 +- keyboards/crkbd/rev1/split_util.h | 5 +- keyboards/crkbd/serial.c | 284 ++++++++++++++++++++------- keyboards/crkbd/serial.h | 27 ++- 6 files changed, 277 insertions(+), 105 deletions(-) diff --git a/keyboards/crkbd/rev1/serial_config.h b/keyboards/crkbd/rev1/serial_config.h index 671ed821d24e..4fab8e8ddfcf 100644 --- a/keyboards/crkbd/rev1/serial_config.h +++ b/keyboards/crkbd/rev1/serial_config.h @@ -1,10 +1,4 @@ -#pragma once - -/* Soft Serial defines */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD2) -#define SERIAL_PIN_INTERRUPT INT2_vect - +#ifndef SOFT_SERIAL_PIN +#define SOFT_SERIAL_PIN D2 #define SERIAL_USE_MULTI_TRANSACTION +#endif diff --git a/keyboards/crkbd/rev1/split_scomm.c b/keyboards/crkbd/rev1/split_scomm.c index 9719eb22ea19..ada7867960b9 100644 --- a/keyboards/crkbd/rev1/split_scomm.c +++ b/keyboards/crkbd/rev1/split_scomm.c @@ -7,8 +7,8 @@ #include #include #include "serial.h" -#ifdef SERIAL_DEBUG_MODE -#include +#ifdef CONSOLE_ENABLE + #include #endif uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; @@ -17,6 +17,7 @@ uint8_t volatile status_com = 0; uint8_t volatile status1 = 0; uint8_t slave_buffer_change_count = 0; uint8_t s_change_old = 0xff; +uint8_t s_change_new = 0xff; SSTD_t transactions[] = { #define GET_SLAVE_STATUS 0 @@ -41,12 +42,12 @@ SSTD_t transactions[] = { void serial_master_init(void) { - soft_serial_initiator_init(transactions); + soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } void serial_slave_init(void) { - soft_serial_target_init(transactions); + soft_serial_target_init(transactions, TID_LIMIT(transactions)); } // 0 => no error @@ -54,19 +55,37 @@ void serial_slave_init(void) // 2 => checksum error int serial_update_buffers(int master_update) { - int status; + int status, smatstatus; static int need_retry = 0; - if( s_change_old != slave_buffer_change_count ) { - status = soft_serial_transaction(GET_SLAVE_BUFFER); - if( status == TRANSACTION_END ) - s_change_old = slave_buffer_change_count; + + if( s_change_old != s_change_new ) { + smatstatus = soft_serial_transaction(GET_SLAVE_BUFFER); + if( smatstatus == TRANSACTION_END ) { + s_change_old = s_change_new; +#ifdef CONSOLE_ENABLE + uprintf("slave matrix = %b %b %b %b %b\n", + serial_slave_buffer[0], serial_slave_buffer[1], + serial_slave_buffer[2], serial_slave_buffer[3], + serial_slave_buffer[4] ); +#endif + } + } else { + // serial_slave_buffer dosen't change + smatstatus = TRANSACTION_END; // dummy status + } + + if( !master_update && !need_retry) { + status = soft_serial_transaction(GET_SLAVE_STATUS); + } else { + status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS); + } + if( status == TRANSACTION_END ) { + s_change_new = slave_buffer_change_count; + need_retry = 0; + } else { + need_retry = 1; } - if( !master_update && !need_retry) - status = soft_serial_transaction(GET_SLAVE_STATUS); - else - status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS); - need_retry = ( status == TRANSACTION_END ) ? 0 : 1; - return status; + return smatstatus; } #endif // SERIAL_USE_MULTI_TRANSACTION diff --git a/keyboards/crkbd/rev1/split_scomm.h b/keyboards/crkbd/rev1/split_scomm.h index 16887eb74f7b..873d8939d81f 100644 --- a/keyboards/crkbd/rev1/split_scomm.h +++ b/keyboards/crkbd/rev1/split_scomm.h @@ -1,4 +1,5 @@ -#pragma once +#ifndef SPLIT_COMM_H +#define SPLIT_COMM_H #ifndef SERIAL_USE_MULTI_TRANSACTION /* --- USE Simple API (OLD API, compatible with let's split serial.c) --- */ @@ -19,3 +20,5 @@ void serial_slave_init(void); int serial_update_buffers(int master_changed); #endif + +#endif /* SPLIT_COMM_H */ diff --git a/keyboards/crkbd/rev1/split_util.h b/keyboards/crkbd/rev1/split_util.h index f593047560a4..687ca19bd3e5 100644 --- a/keyboards/crkbd/rev1/split_util.h +++ b/keyboards/crkbd/rev1/split_util.h @@ -1,4 +1,5 @@ -#pragma once +#ifndef SPLIT_KEYBOARD_UTIL_H +#define SPLIT_KEYBOARD_UTIL_H #include #include "eeconfig.h" @@ -14,3 +15,5 @@ void split_keyboard_setup(void); bool has_usb(void); void matrix_master_OLED_init (void); + +#endif diff --git a/keyboards/crkbd/serial.c b/keyboards/crkbd/serial.c index 11ceff0b37cd..325c29a3f704 100644 --- a/keyboards/crkbd/serial.c +++ b/keyboards/crkbd/serial.c @@ -1,5 +1,10 @@ /* * WARNING: be careful changing this code, it is very timing dependent + * + * 2018-10-28 checked + * avr-gcc 4.9.2 + * avr-gcc 5.4.0 + * avr-gcc 7.3.0 */ #ifndef F_CPU @@ -14,8 +19,58 @@ #include "serial.h" //#include -#ifdef USE_SERIAL +#ifdef SOFT_SERIAL_PIN +#ifdef __AVR_ATmega32U4__ + // if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial. + #ifdef USE_I2C + #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 + #error Using ATmega32U4 I2C, so can not use PD0, PD1 + #endif + #endif + + #if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3 + #define SERIAL_PIN_DDR DDRD + #define SERIAL_PIN_PORT PORTD + #define SERIAL_PIN_INPUT PIND + #if SOFT_SERIAL_PIN == D0 + #define SERIAL_PIN_MASK _BV(PD0) + #define EIMSK_BIT _BV(INT0) + #define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01))) + #define SERIAL_PIN_INTERRUPT INT0_vect + #elif SOFT_SERIAL_PIN == D1 + #define SERIAL_PIN_MASK _BV(PD1) + #define EIMSK_BIT _BV(INT1) + #define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11))) + #define SERIAL_PIN_INTERRUPT INT1_vect + #elif SOFT_SERIAL_PIN == D2 + #define SERIAL_PIN_MASK _BV(PD2) + #define EIMSK_BIT _BV(INT2) + #define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21))) + #define SERIAL_PIN_INTERRUPT INT2_vect + #elif SOFT_SERIAL_PIN == D3 + #define SERIAL_PIN_MASK _BV(PD3) + #define EIMSK_BIT _BV(INT3) + #define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31))) + #define SERIAL_PIN_INTERRUPT INT3_vect + #endif + #elif SOFT_SERIAL_PIN == E6 + #define SERIAL_PIN_DDR DDRE + #define SERIAL_PIN_PORT PORTE + #define SERIAL_PIN_INPUT PINE + #define SERIAL_PIN_MASK _BV(PE6) + #define EIMSK_BIT _BV(INT6) + #define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) + #define SERIAL_PIN_INTERRUPT INT6_vect + #else + #error invalid SOFT_SERIAL_PIN value + #endif + +#else + #error serial.c now support ATmega32U4 only +#endif + +//////////////// for backward compatibility //////////////////////////////// #ifndef SERIAL_USE_MULTI_TRANSACTION /* --- USE Simple API (OLD API, compatible with let's split serial.c) */ #if SERIAL_SLAVE_BUFFER_LENGTH > 0 @@ -42,56 +97,118 @@ SSTD_t transactions[] = { }; void serial_master_init(void) -{ soft_serial_initiator_init(transactions); } +{ soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } void serial_slave_init(void) -{ soft_serial_target_init(transactions); } +{ soft_serial_target_init(transactions, TID_LIMIT(transactions)); } // 0 => no error // 1 => slave did not respond // 2 => checksum error int serial_update_buffers() -{ return soft_serial_transaction(); } +{ + int result; + result = soft_serial_transaction(); + return result; +} -#endif // Simple API (OLD API, compatible with let's split serial.c) +#endif // end of Simple API (OLD API, compatible with let's split serial.c) +//////////////////////////////////////////////////////////////////////////// #define ALWAYS_INLINE __attribute__((always_inline)) #define NO_INLINE __attribute__((noinline)) #define _delay_sub_us(x) __builtin_avr_delay_cycles(x) -// Serial pulse period in microseconds. -#define TID_SEND_ADJUST 14 +// parity check +#define ODD_PARITY 1 +#define EVEN_PARITY 0 +#define PARITY EVEN_PARITY + +#ifdef SERIAL_DELAY + // custom setup in config.h + // #define TID_SEND_ADJUST 2 + // #define SERIAL_DELAY 6 // micro sec + // #define READ_WRITE_START_ADJUST 30 // cycles + // #define READ_WRITE_WIDTH_ADJUST 8 // cycles +#else +// ============ Standard setups ============ + +#ifndef SELECT_SOFT_SERIAL_SPEED +#define SELECT_SOFT_SERIAL_SPEED 1 +// 0: about 189kbps +// 1: about 137kbps (default) +// 2: about 75kbps +// 3: about 39kbps +// 4: about 26kbps +// 5: about 20kbps +#endif -#define SELECT_SERIAL_SPEED 1 -#if SELECT_SERIAL_SPEED == 0 +#if __GNUC__ < 6 + #define TID_SEND_ADJUST 14 +#else + #define TID_SEND_ADJUST 2 +#endif + +#if SELECT_SOFT_SERIAL_SPEED == 0 // Very High speed #define SERIAL_DELAY 4 // micro sec - #define READ_WRITE_START_ADJUST 33 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 1 + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 34 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 1 // High speed #define SERIAL_DELAY 6 // micro sec - #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 2 + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 2 // Middle speed #define SERIAL_DELAY 12 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 3 + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 3 // Low speed #define SERIAL_DELAY 24 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 4 + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 4 // Very Low speed - #define SERIAL_DELAY 50 // micro sec + #define SERIAL_DELAY 36 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 5 + // Ultra Low speed + #define SERIAL_DELAY 48 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #else -#error Illegal Serial Speed -#endif - +#error invalid SELECT_SOFT_SERIAL_SPEED value +#endif /* SELECT_SOFT_SERIAL_SPEED */ +#endif /* SERIAL_DELAY */ #define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) #define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) @@ -105,17 +222,21 @@ int serial_update_buffers() #endif static SSTD_t *Transaction_table = NULL; +static uint8_t Transaction_table_size = 0; +inline static void serial_delay(void) ALWAYS_INLINE; inline static void serial_delay(void) { _delay_us(SERIAL_DELAY); } +inline static void serial_delay_half1(void) ALWAYS_INLINE; inline static void serial_delay_half1(void) { _delay_us(SERIAL_DELAY_HALF1); } +inline static void serial_delay_half2(void) ALWAYS_INLINE; inline static void serial_delay_half2(void) { _delay_us(SERIAL_DELAY_HALF2); @@ -135,6 +256,7 @@ void serial_input_with_pullup(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } +inline static uint8_t serial_read_pin(void) ALWAYS_INLINE; inline static uint8_t serial_read_pin(void) { return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); @@ -152,30 +274,28 @@ void serial_high(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } -void soft_serial_initiator_init(SSTD_t *sstd_table) +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size) { Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; serial_output(); serial_high(); } -void soft_serial_target_init(SSTD_t *sstd_table) +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size) { Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; serial_input_with_pullup(); -#if SERIAL_PIN_MASK == _BV(PD0) - // Enable INT0 - EIMSK |= _BV(INT0); - // Trigger on falling edge of INT0 - EICRA &= ~(_BV(ISC00) | _BV(ISC01)); -#elif SERIAL_PIN_MASK == _BV(PD2) - // Enable INT2 - EIMSK |= _BV(INT2); - // Trigger on falling edge of INT2 - EICRA &= ~(_BV(ISC20) | _BV(ISC21)); + // Enable INT0-INT3,INT6 + EIMSK |= EIMSK_BIT; +#if SERIAL_PIN_MASK == _BV(PE6) + // Trigger on falling edge of INT6 + EICRB &= EICRx_BIT; #else - #error unknown SERIAL_PIN_MASK value + // Trigger on falling edge of INT0-INT3 + EICRA &= EICRx_BIT; #endif } @@ -191,7 +311,7 @@ void sync_recv(void) { } // Used by the reciver to send a synchronization signal to the sender. -static void sync_send(void)NO_INLINE; +static void sync_send(void) NO_INLINE; static void sync_send(void) { serial_low(); @@ -205,12 +325,12 @@ static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { uint8_t byte, i, p, pb; _delay_sub_us(READ_WRITE_START_ADJUST); - for( i = 0, byte = 0, p = 0; i < bit; i++ ) { + for( i = 0, byte = 0, p = PARITY; i < bit; i++ ) { serial_delay_half1(); // read the middle of pulses if( serial_read_pin() ) { - byte = (byte << 1) | 1; p ^= 1; + byte = (byte << 1) | 1; p ^= 1; } else { - byte = (byte << 1) | 0; p ^= 0; + byte = (byte << 1) | 0; p ^= 0; } _delay_sub_us(READ_WRITE_WIDTH_ADJUST); serial_delay_half2(); @@ -230,13 +350,13 @@ static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE; void serial_write_chunk(uint8_t data, uint8_t bit) { uint8_t b, p; - for( p = 0, b = 1<<(bit-1); b ; b >>= 1) { - if(data & b) { - serial_high(); p ^= 1; - } else { - serial_low(); p ^= 0; - } - serial_delay(); + for( p = PARITY, b = 1<<(bit-1); b ; b >>= 1) { + if(data & b) { + serial_high(); p ^= 1; + } else { + serial_low(); p ^= 0; + } + serial_delay(); } /* send parity bit */ if(p & 1) { serial_high(); } @@ -288,6 +408,13 @@ void change_reciver2sender(void) { serial_delay_half1(); //4 } +static inline uint8_t nibble_bits_count(uint8_t bits) +{ + bits = (bits & 0x5) + (bits >> 1 & 0x5); + bits = (bits & 0x3) + (bits >> 2 & 0x3); + return bits; +} + // interrupt handle to be used by the target device ISR(SERIAL_PIN_INTERRUPT) { @@ -297,12 +424,15 @@ ISR(SERIAL_PIN_INTERRUPT) { SSTD_t *trans = Transaction_table; #else // recive transaction table index - uint8_t tid; + uint8_t tid, bits; uint8_t pecount = 0; sync_recv(); - tid = serial_read_chunk(&pecount,4); - if(pecount> 0) + bits = serial_read_chunk(&pecount,7); + tid = bits>>3; + bits = (bits&7) != nibble_bits_count(tid); + if( bits || pecount> 0 || tid > Transaction_table_size ) { return; + } serial_delay_half1(); serial_high(); // response step1 low->high @@ -315,17 +445,17 @@ ISR(SERIAL_PIN_INTERRUPT) { // target send phase if( trans->target2initiator_buffer_size > 0 ) serial_send_packet((uint8_t *)trans->target2initiator_buffer, - trans->target2initiator_buffer_size); + trans->target2initiator_buffer_size); // target switch to input change_sender2reciver(); // target recive phase if( trans->initiator2target_buffer_size > 0 ) { if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer, - trans->initiator2target_buffer_size) ) { - *trans->status = TRANSACTION_ACCEPTED; + trans->initiator2target_buffer_size) ) { + *trans->status = TRANSACTION_ACCEPTED; } else { - *trans->status = TRANSACTION_DATA_ERROR; + *trans->status = TRANSACTION_DATA_ERROR; } } else { *trans->status = TRANSACTION_ACCEPTED; @@ -349,6 +479,8 @@ int soft_serial_transaction(void) { SSTD_t *trans = Transaction_table; #else int soft_serial_transaction(int sstd_index) { + if( sstd_index > Transaction_table_size ) + return TRANSACTION_TYPE_ERROR; SSTD_t *trans = &Transaction_table[sstd_index]; #endif cli(); @@ -375,9 +507,10 @@ int soft_serial_transaction(int sstd_index) { #else // send transaction table index + int tid = (sstd_index<<3) | (7 & nibble_bits_count(sstd_index)); sync_send(); _delay_sub_us(TID_SEND_ADJUST); - serial_write_chunk(sstd_index, 4); + serial_write_chunk(tid, 7); serial_delay_half1(); // wait for the target response (step1 low->high) @@ -389,12 +522,12 @@ int soft_serial_transaction(int sstd_index) { // check if the target is present (step2 high->low) for( int i = 0; serial_read_pin(); i++ ) { if (i > SLAVE_INT_ACK_WIDTH + 1) { - // slave failed to pull the line low, assume not present - serial_output(); - serial_high(); - *trans->status = TRANSACTION_NO_RESPONSE; - sei(); - return TRANSACTION_NO_RESPONSE; + // slave failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; + sei(); + return TRANSACTION_NO_RESPONSE; } _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT); } @@ -404,12 +537,12 @@ int soft_serial_transaction(int sstd_index) { // if the target is present syncronize with it if( trans->target2initiator_buffer_size > 0 ) { if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer, - trans->target2initiator_buffer_size) ) { - serial_output(); - serial_high(); - *trans->status = TRANSACTION_DATA_ERROR; - sei(); - return TRANSACTION_DATA_ERROR; + trans->target2initiator_buffer_size) ) { + serial_output(); + serial_high(); + *trans->status = TRANSACTION_DATA_ERROR; + sei(); + return TRANSACTION_DATA_ERROR; } } @@ -419,7 +552,7 @@ int soft_serial_transaction(int sstd_index) { // initiator send phase if( trans->initiator2target_buffer_size > 0 ) { serial_send_packet((uint8_t *)trans->initiator2target_buffer, - trans->initiator2target_buffer_size); + trans->initiator2target_buffer_size); } // always, release the line when not in use @@ -442,3 +575,16 @@ int soft_serial_get_and_clean_status(int sstd_index) { #endif #endif + +// Helix serial.c history +// 2018-1-29 fork from let's split and add PD2, modify sync_recv() (#2308, bceffdefc) +// 2018-6-28 bug fix master to slave comm and speed up (#3255, 1038bbef4) +// (adjusted with avr-gcc 4.9.2) +// 2018-7-13 remove USE_SERIAL_PD2 macro (#3374, f30d6dd78) +// (adjusted with avr-gcc 4.9.2) +// 2018-8-11 add support multi-type transaction (#3608, feb5e4aae) +// (adjusted with avr-gcc 4.9.2) +// 2018-10-21 fix serial and RGB animation conflict (#4191, 4665e4fff) +// (adjusted with avr-gcc 7.3.0) +// 2018-10-28 re-adjust compiler depend value of delay (#4269, 8517f8a66) +// (adjusted with avr-gcc 5.4.0, 7.3.0) diff --git a/keyboards/crkbd/serial.h b/keyboards/crkbd/serial.h index 76c6aaa04345..7e0c0847a431 100644 --- a/keyboards/crkbd/serial.h +++ b/keyboards/crkbd/serial.h @@ -1,16 +1,19 @@ -#pragma once +#ifndef SOFT_SERIAL_H +#define SOFT_SERIAL_H #include // ///////////////////////////////////////////////////////////////// -// Need Soft Serial defines in serial_config.h +// Need Soft Serial defines in config.h // ///////////////////////////////////////////////////////////////// // ex. -// #define SERIAL_PIN_DDR DDRD -// #define SERIAL_PIN_PORT PORTD -// #define SERIAL_PIN_INPUT PIND -// #define SERIAL_PIN_MASK _BV(PD?) ?=0,2 -// #define SERIAL_PIN_INTERRUPT INT?_vect ?=0,2 +// #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6 +// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5 +// // 1: about 137kbps (default) +// // 2: about 75kbps +// // 3: about 39kbps +// // 4: about 26kbps +// // 5: about 20kbps // // //// USE Simple API (OLD API, compatible with let's split serial.c) // ex. @@ -46,16 +49,18 @@ typedef struct _SSTD_t { uint8_t target2initiator_buffer_size; uint8_t *target2initiator_buffer; } SSTD_t; +#define TID_LIMIT( table ) (sizeof(table) / sizeof(SSTD_t)) // initiator is transaction start side -void soft_serial_initiator_init(SSTD_t *sstd_table); +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size); // target is interrupt accept side -void soft_serial_target_init(SSTD_t *sstd_table); +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size); // initiator resullt #define TRANSACTION_END 0 #define TRANSACTION_NO_RESPONSE 0x1 #define TRANSACTION_DATA_ERROR 0x2 +#define TRANSACTION_TYPE_ERROR 0x4 #ifndef SERIAL_USE_MULTI_TRANSACTION int soft_serial_transaction(void); #else @@ -71,7 +76,9 @@ int soft_serial_transaction(int sstd_index); // target: // TRANSACTION_DATA_ERROR // or TRANSACTION_ACCEPTED -#define TRANSACTION_ACCEPTED 0x4 +#define TRANSACTION_ACCEPTED 0x8 #ifdef SERIAL_USE_MULTI_TRANSACTION int soft_serial_get_and_clean_status(int sstd_index); #endif + +#endif /* SOFT_SERIAL_H */ From f28a4e39fc97e22a2e547c60d9ffce188d3a6495 Mon Sep 17 00:00:00 2001 From: TurboMech <32869044+TurboMech@users.noreply.github.com> Date: Sun, 4 Nov 2018 19:00:33 -0500 Subject: [PATCH 354/505] Fix Espectro build (#4353) After further testing and feedback from others, the bottom row matrix was incorrect. Also RGB number was incorrect (I was tired when building this, really shouldn't do that). --- keyboards/espectro/config.h | 2 +- keyboards/espectro/espectro.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/espectro/config.h b/keyboards/espectro/config.h index 34852df43b75..294091d58226 100755 --- a/keyboards/espectro/config.h +++ b/keyboards/espectro/config.h @@ -59,7 +59,7 @@ #define RGB_DI_PIN E2 #ifdef RGB_DI_PIN -#define RGBLED_NUM 16 +#define RGBLED_NUM 18 #define RGBLIGHT_HUE_STEP 10 #define RGBLIGHT_SAT_STEP 10 #define RGBLIGHT_VAL_STEP 10 diff --git a/keyboards/espectro/espectro.h b/keyboards/espectro/espectro.h index 3d6ea466d302..6f9e4b7f7b3e 100755 --- a/keyboards/espectro/espectro.h +++ b/keyboards/espectro/espectro.h @@ -28,7 +28,7 @@ K100, K101, K102, K103, K104, K604, K605, K606, K607, K105, K106, K107, K108, K200, K201, K202, K203, K204, K608, K609, K610, K611, K205, K206, K207, K208, K703, K209, K210, K211, K212, \ K300, K301, K302, K303, K304, K612, K705, K706, K707, K305, K306, K307, K308, K309, K310, K311, \ K400, K402, K403, K404, K708, K709, K710, K711, K405, K406, K407, K408, K704, K409, K410, K411, K412, \ -K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511 \ +K500, K501, K502, K509, K505, K506, K507, K508, K503, K504, K510, K511 \ ) { \ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012 }, \ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \ @@ -48,7 +48,7 @@ K100, K101, K102, K103, K104, K604, K605, K606, K607, K105, K106, K107, K108, K7 K200, K201, K202, K203, K204, K608, K609, K610, K611, K205, K206, K207, K208, K703, K209, K210, K211, K212, \ K300, K301, K302, K303, K304, K612, K705, K706, K707, K305, K306, K307, K308, K309, K310, K311, K312, \ K400, K401, K402, K403, K404, K708, K709, K710, K711, K405, K406, K407, K408, K704, K409, K410, K411, K412, \ -K500, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, K512 \ +K500, K501, K502, K509, K505, K506, K507, K508, K503, K504, K510, K511, K512 \ ) { \ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012 }, \ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \ @@ -75,7 +75,7 @@ K200, K201, K202, K203, K204, K608, K609, K610, K611, K205, K206, K207, K208, K300, K300, K301, K302, K304, K612, K705, K706, K707, K305, K306, K307, K703, K308, K309, K310, K311, K312, \ K400x2, K401, K402, K403, K404, K708, K709, K710, K711, K405, K406, K407, K408, K408, K704, K409, K410, K411, K412, \ K412, \ -K500x2, K501x2, K502, K503x3, K504x3, K505x2, K506x2, K507x2, K508x2, K509, K510x2, K511, K512 \ +K500x2, K501x2, K502, K509x3, K505x3, K506x2, K507x2, K508x2, K503x2, K504, K510x2, K511, K512 \ ) { \ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012 }, \ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \ From f2fda1bd56c97019777fb2a028d088ae37693b0f Mon Sep 17 00:00:00 2001 From: Jarred Steenvoorden Date: Mon, 5 Nov 2018 19:05:48 +1100 Subject: [PATCH 355/505] Keymap update Adding RGB underglow controls. (#4358) * Update userspace with common config.h * Add my dz60, satan and xd75 keyboard keymaps * Fixing executable bits changed during last upstream merge * Cleanup unnecessary files and defines * Remove unnecessary defines from userspace config * Add underglow controls to dz60 function layer * Fixing merge conflicts * Fixing exectable bits changed during merge --- keyboards/dz60/keymaps/jarred/keymap.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/keyboards/dz60/keymaps/jarred/keymap.c b/keyboards/dz60/keymaps/jarred/keymap.c index 9e6850683177..2ef6794934d9 100644 --- a/keyboards/dz60/keymaps/jarred/keymap.c +++ b/keyboards/dz60/keymaps/jarred/keymap.c @@ -13,9 +13,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT,KC_RGUI, XXXXXXX,KC_APP, KC_RCTL), [_NV] = LAYOUT( - 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_BSPC,_______,KC_HOME,KC_UP ,KC_END ,KC_INS ,_______,_______,_______, - _______,_______,_______,KC_LSFT,KC_LCTL,KC_ENT ,_______,KC_LEFT,KC_DOWN,KC_RGHT,KC_DEL ,KC_DEL , _______, - _______,_______,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_PGDN,_______,_______,_______,_______, - _______,_______,_______, _______,_______,_______, _______,_______,_______, RESET, _______) + KC_GRV ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,XXXXXXX,_______, + _______,RGB_TOG,RGB_MOD,_______,KC_DEL ,KC_BSPC,_______,KC_HOME,KC_UP ,KC_END ,KC_INS ,_______,_______,_______, + _______,RGB_HUI,RGB_HUD,KC_LSFT,KC_LCTL,KC_ENT ,_______,KC_LEFT,KC_DOWN,KC_RGHT,KC_DEL ,KC_DEL , _______, + _______,XXXXXXX,RGB_SAD,RGB_SAI,_______,_______,_______,_______,KC_PGUP,KC_PGDN,_______,_______,_______,XXXXXXX, + _______,RGB_VAD,RGB_VAI, _______,_______,_______, _______,_______,XXXXXXX, RESET,_______) }; From d1d5f200787f70bb853e32d5e5e2ce7b35ef7a54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Mon, 5 Nov 2018 15:04:14 +0100 Subject: [PATCH 356/505] Update whitefox/konstantin keymap (#4363) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Use Magic+Esc for entering bootloader mode * Expand rules.mk * Improve FN_RCTL tap dance * Avoid one-line if statements * Add PROGMEM to keymaps definition * td_fn_rctl_* → td_fn_rctrl_* * Fix FN_RCTL tap dance bug when count is 4, 8, 12 etc. * Add ACTION_TAP_DANCE_DOUBLE_MODS * Rearrange/rename keycode defines * Use RAL_RGU and RCT_RSF in keymaps * Replace keymap ASCII art with box drawing characters * Add FN_FNLK and use it * Set Unicode input mode in eeconfig_init_user instead of matrix_init_user --- .../whitefox/keymaps/konstantin/config.h | 9 +- .../whitefox/keymaps/konstantin/keymap.c | 202 +++++++++++------- .../whitefox/keymaps/konstantin/rules.mk | 6 + 3 files changed, 142 insertions(+), 75 deletions(-) diff --git a/keyboards/whitefox/keymaps/konstantin/config.h b/keyboards/whitefox/keymaps/konstantin/config.h index 39450d680268..d1c3002d270c 100644 --- a/keyboards/whitefox/keymaps/konstantin/config.h +++ b/keyboards/whitefox/keymaps/konstantin/config.h @@ -2,6 +2,12 @@ #define FORCE_NKRO +#undef IS_COMMAND +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL))) + +#define MAGIC_KEY_LAYER0_ALT1 BSLS +#define MAGIC_KEY_BOOTLOADER ESC + #define MOUSEKEY_DELAY 50 #define MOUSEKEY_INTERVAL 15 #define MOUSEKEY_MAX_SPEED 4 @@ -12,6 +18,3 @@ #define PERMISSIVE_HOLD #define TAPPING_TERM 200 #define TAPPING_TOGGLE 2 - -#undef IS_COMMAND -#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL))) diff --git a/keyboards/whitefox/keymaps/konstantin/keymap.c b/keyboards/whitefox/keymaps/konstantin/keymap.c index edb049287c2c..6732d9a01e94 100644 --- a/keyboards/whitefox/keymaps/konstantin/keymap.c +++ b/keyboards/whitefox/keymaps/konstantin/keymap.c @@ -1,25 +1,29 @@ #include QMK_KEYBOARD_H -#define FN MO(L_FN) -#define FN_CAPS LT(L_FN, KC_CAPS) -#define FN_RCTL TD(TD_FN_RCTL) // Unused -#define RLALT TD(TD_RLALT) // Unused -#define DESKTOP TD(TD_DESKTOP) - -#define DESKT_L LCTL(LGUI(KC_LEFT)) -#define DESKT_R LCTL(LGUI(KC_RGHT)) #define TOP LCTL(KC_HOME) #define BOTTOM LCTL(KC_END) +#define DSKTP_L LCTL(LGUI(KC_LEFT)) +#define DSKTP_R LCTL(LGUI(KC_RGHT)) -#define UC_COMM UC(0x002C) -#define UC_LPRN UC(0x0028) -#define UC_RPRN UC(0x0029) -#define UC_EQLS UC(0x003D) -#define UC_MULS UC(0x00D7) -#define UC_DIVS UC(0x00F7) -#define UC_MINS UC(0x2212) +#define FN MO(L_FN) +#define FN_CAPS LT(L_FN, KC_CAPS) +#define FN_FNLK TT(L_FN) -void matrix_init_user(void) { +#define DESKTOP TD(TD_DESKTOP) +#define FN_RCTL TD(TD_FN_RCTL) +#define RAL_LAL TD(TD_RAL_LAL) +#define RAL_RGU TD(TD_RAL_RGU) +#define RCT_RSF TD(TD_RCT_RSF) + +#define COMMA UC(0x002C) +#define L_PAREN UC(0x0028) +#define R_PAREN UC(0x0029) +#define EQUALS UC(0x003D) +#define TIMES UC(0x00D7) +#define DIVIDE UC(0x00F7) +#define MINUS UC(0x2212) + +void eeconfig_init_user(void) { set_unicode_input_mode(UC_WINC); } @@ -37,7 +41,9 @@ enum custom_keycodes { bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { case CLEAR: - if (record->event.pressed) { SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); } + if (record->event.pressed) { + SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); + } return false; case NUMPAD: @@ -55,90 +61,142 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } } -enum tap_dance { - TD_FN_RCTL, - TD_RLALT, - TD_DESKTOP, -}; +struct { + bool fn_on; // Layer state when tap dance started + bool started; +} td_fn_rctrl_data; + +void td_fn_rctrl_each(qk_tap_dance_state_t *state, void *user_data) { + if (!td_fn_rctrl_data.started) { + td_fn_rctrl_data.fn_on = IS_LAYER_ON(L_FN); + td_fn_rctrl_data.started = true; + } + // Single tap → Fn, double tap → RCtrl, triple tap etc. → Fn+RCtrl + if (state->count == 1 || state->count == 3) { + layer_on(L_FN); + } else if (state->count == 2) { + if (!td_fn_rctrl_data.fn_on) { + layer_off(L_FN); + } + register_code(KC_RCTL); + } +} + +void td_fn_rctrl_reset(qk_tap_dance_state_t *state, void *user_data) { + if ((state->count == 1 || state->count > 2) && !td_fn_rctrl_data.fn_on) { + layer_off(L_FN); + } + if (state->count >= 2) { + unregister_code(KC_RCTL); + } + td_fn_rctrl_data.started = false; +} + +#define ACTION_TAP_DANCE_DOUBLE_MODS(mod1, mod2) { \ + .fn = { td_double_mods_each, NULL, td_double_mods_reset }, \ + .user_data = &(qk_tap_dance_pair_t){ mod1, mod2 }, \ + } -void td_fn_rctl_finished(qk_tap_dance_state_t *state, void *user_data) { - // Single tap → Fn, double tap → RCtrl, triple tap → Fn+RCtrl etc. - if (state->count & 1) { layer_on(L_FN); } - if (state->count & 2) { register_code(KC_RCTL); } +void td_double_mods_each(qk_tap_dance_state_t *state, void *user_data) { + qk_tap_dance_pair_t *mods = (qk_tap_dance_pair_t *)user_data; + // Single tap → mod1, double tap → mod2, triple tap etc. → mod1+mod2 + if (state->count == 1 || state->count == 3) { + register_code(mods->kc1); + } else if (state->count == 2) { + unregister_code(mods->kc1); + register_code(mods->kc2); + } + // Prevent tap dance from sending kc1 and kc2 as weak mods + state->weak_mods &= ~(MOD_BIT(mods->kc1) | MOD_BIT(mods->kc2)); } -void td_fn_rctl_reset(qk_tap_dance_state_t *state, void *user_data) { - if (state->count & 1) { layer_off(L_FN); } - if (state->count & 2) { unregister_code(KC_RCTL); } +void td_double_mods_reset(qk_tap_dance_state_t *state, void *user_data) { + qk_tap_dance_pair_t *mods = (qk_tap_dance_pair_t *)user_data; + if (state->count == 1 || state->count > 2) { + unregister_code(mods->kc1); + } + if (state->count >= 2) { + unregister_code(mods->kc2); + } } +enum tap_dance { + TD_DESKTOP, + TD_FN_RCTL, + TD_RAL_LAL, + TD_RAL_RGU, + TD_RCT_RSF, +}; + qk_tap_dance_action_t tap_dance_actions[] = { - [TD_FN_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, td_fn_rctl_finished, td_fn_rctl_reset), - [TD_RLALT] = ACTION_TAP_DANCE_DOUBLE(KC_RALT, KC_LALT), [TD_DESKTOP] = ACTION_TAP_DANCE_DOUBLE(LCTL(LGUI(KC_D)), LCTL(LGUI(KC_F4))), // Add/close virtual desktop + [TD_FN_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(td_fn_rctrl_each, NULL, td_fn_rctrl_reset), + [TD_RAL_LAL] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RALT, KC_LALT), + [TD_RAL_RGU] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RALT, KC_RGUI), + [TD_RCT_RSF] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RCTL, KC_RSFT), }; -const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Base layer - * ,---------------------------------------------------------------. - * |Esc| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |PSc| - * |---------------------------------------------------------------| - * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] |Bspc |Del| - * |---------------------------------------------------------------| - * |FnCaps| A | S | D | F | G | H | J | K | L | ; | ' | Enter |PgU| - * |---------------------------------------------------------------| - * | LShift | Z | X | C | V | B | N | M | , | . | / |RCtrl | ↑ |PgD| - * |---------------------------------------------------------------| - * |LCtl|LGui|LAlt| Space |RAlt| Fn | | ← | ↓ | → | - * `---------------------------------------------------------------' + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ \ │ ` │PSc│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │Bspc │Del│ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ + * │FnCaps│ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │PgU│ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ + * │ LShift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │CtlSft│ ↑ │PgD│ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤ + * │LCtl│LGui│LAlt│ Space │AlGu│FnLk│ │ ← │ ↓ │ → │ + * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ */ [L_BASE] = LAYOUT_truefox( \ 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_PSCR, \ 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_DEL, \ FN_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_RCTL, KC_UP, KC_PGDN, \ - KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,FN, KC_LEFT,KC_DOWN,KC_RGHT \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,RCT_RSF, KC_UP, KC_PGDN, \ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, RAL_RGU,FN_FNLK, KC_LEFT,KC_DOWN,KC_RGHT \ ), /* Function layer - * ,---------------------------------------------------------------. - * | |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Num|Scr|Pau| - * |---------------------------------------------------------------| - * | M4 |M2 |M↑ |M1 |M3 |M5 | | | |Stp|Ply|Prv|Nxt|Clear|Ins| - * |---------------------------------------------------------------| - * | |M← |M↓ |M→ |MW↑| | | | | | | | |Top| - * |---------------------------------------------------------------| - * | |MA0|MA2|MW←|MW→| | | |VoD|VoU|Mut| App |PgU|Btm| - * |---------------------------------------------------------------| - * | |Dstp|Dst←| MW↓ |Dst→| | |Hom|PgD|End| - * `---------------------------------------------------------------' + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │ │F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11│F12│Num│Scr│Pau│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ + * │ M4 │M2 │M↑ │M1 │M3 │M5 │ │ │ │Stp│Ply│Prv│Nxt│Clear│Ins│ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ + * │ │M← │M↓ │M→ │MW↑│ │ │ │ │ │ │ │ │Top│ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ + * │ │MA0│MA2│MW←│MW→│ │ │ │VoD│VoU│Mut│ App │PgU│Btm│ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤ + * │ │Dstp│Dst←│ MW↓ │Dst→│ │ │Hom│PgD│End│ + * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ */ [L_FN] = LAYOUT_truefox( \ _______,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, NUMPAD, KC_SLCK,KC_PAUS, \ KC_BTN4,KC_BTN2,KC_MS_U,KC_BTN1,KC_BTN3,KC_BTN5,_______,_______,_______,KC_MSTP,KC_MPLY,KC_MPRV,KC_MNXT,CLEAR, KC_INS, \ _______,KC_MS_L,KC_MS_D,KC_MS_R,KC_WH_U,_______,_______,_______,_______,_______,_______,_______, _______, TOP, \ _______, KC_ACL0,KC_ACL2,KC_WH_L,KC_WH_R,_______,_______,_______,KC_VOLD,KC_VOLU,KC_MUTE,KC_APP, KC_PGUP,BOTTOM, \ - _______,DESKTOP,DESKT_L, KC_WH_D, DESKT_R,_______, KC_HOME,KC_PGDN,KC_END \ + _______,DESKTOP,DSKTP_L, KC_WH_D, DSKTP_R,_______, KC_HOME,KC_PGDN,KC_END \ ), /* Numpad layer - * ,---------------------------------------------------------------. - * |Num| | | | | | |P7 |P8 |P9 |P- | − | = |Num| | | - * |---------------------------------------------------------------| - * | | | | | | | |P4 |P5 |P6 |P+ | ( | ) | | | - * |---------------------------------------------------------------| - * | | | | | | | |P1 |P2 |P3 |P* | × | PEnter | | - * |---------------------------------------------------------------| - * | | | | | | |P0 |P0 | , |P. |P/ | ÷ | | | - * |---------------------------------------------------------------| - * | | | | | | | | | | | - * `---------------------------------------------------------------' + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │Num│ │ │ │ │ │ │P7 │P8 │P9 │P- │ − │ = │Num│ │ │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ + * │ │ │ │ │ │ │ │P4 │P5 │P6 │P+ │ ( │ ) │ │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ + * │ │ │ │ │ │ │ │P1 │P2 │P3 │P* │ × │ PEnter │ │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ + * │ │ │ │ │ │ │P0 │P0 │ , │P. │P/ │ ÷ │ │ │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤ + * │ │ │ │ │ │ │ │ │ │ │ + * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ */ [L_NUMPAD] = LAYOUT_truefox( \ - NUMPAD, _______,_______,_______,_______,_______,_______,KC_P7, KC_P8, KC_P9, KC_PMNS,UC_MINS,UC_EQLS,NUMPAD, _______,_______, \ - _______,_______,_______,_______,_______,_______,_______,KC_P4, KC_P5, KC_P6, KC_PPLS,UC_LPRN,UC_RPRN,_______, _______, \ - _______,_______,_______,_______,_______,_______,_______,KC_P1, KC_P2, KC_P3, KC_PAST,UC_MULS, KC_PENT, _______, \ - _______, _______,_______,_______,_______,_______,KC_P0, KC_P0, UC_COMM,KC_PDOT,KC_PSLS,UC_DIVS, _______,_______, \ + NUMPAD, _______,_______,_______,_______,_______,_______,KC_P7, KC_P8, KC_P9, KC_PMNS,MINUS, EQUALS, NUMPAD, _______,_______, \ + _______,_______,_______,_______,_______,_______,_______,KC_P4, KC_P5, KC_P6, KC_PPLS,L_PAREN,R_PAREN,_______, _______, \ + _______,_______,_______,_______,_______,_______,_______,KC_P1, KC_P2, KC_P3, KC_PAST,TIMES, KC_PENT, _______, \ + _______, _______,_______,_______,_______,_______,KC_P0, KC_P0, COMMA, KC_PDOT,KC_PSLS,DIVIDE, _______,_______, \ _______,_______,_______, _______, _______,_______, _______,_______,_______ \ ), }; diff --git a/keyboards/whitefox/keymaps/konstantin/rules.mk b/keyboards/whitefox/keymaps/konstantin/rules.mk index f1f3d2378e6e..abf92c2c4651 100644 --- a/keyboards/whitefox/keymaps/konstantin/rules.mk +++ b/keyboards/whitefox/keymaps/konstantin/rules.mk @@ -1,4 +1,10 @@ +BACKLIGHT_ENABLE = no BOOTMAGIC_ENABLE = no +COMMAND_ENABLE = yes CONSOLE_ENABLE = yes +EXTRAKEY_ENABLE = yes +MOUSEKEY_ENABLE = yes +NKRO_ENABLE = yes TAP_DANCE_ENABLE = yes UNICODE_ENABLE = yes +VISUALIZER_ENABLE = no From a95fc388fd85ffddcaf07e56ce5a147458fad47c Mon Sep 17 00:00:00 2001 From: Jeremy Herve Date: Mon, 5 Nov 2018 15:04:52 +0100 Subject: [PATCH 357/505] Redox: move curly brackets one row down. (#4364) In #4258, the 2 curly brackets were inadvertently moved one row up. This fixes that. --- keyboards/redox/keymaps/jeherve/keymap.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/keyboards/redox/keymaps/jeherve/keymap.c b/keyboards/redox/keymaps/jeherve/keymap.c index f8dfc4854c6e..c2852f312c8e 100644 --- a/keyboards/redox/keymaps/jeherve/keymap.c +++ b/keyboards/redox/keymaps/jeherve/keymap.c @@ -158,7 +158,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,TT(_NAV),TT(_SYMB), TT(_SYMB),TT(_NAV),KC_K ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSFT , //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ - MO_INTR ,KC_LCTL ,KC_HYPR ,KC_LALT , KC_LCMD , KC_BSPC ,KC_LCTL , KC_ENT ,KC_SPC , KC_RCMD , TT_ADJ ,KC_HYPR ,KC_RCTL ,MO_INTR + MO_INTR ,KC_LCTL ,KC_HYPR ,KC_LALT , KC_LCMD , KC_BSPC ,KC_LCTL , KC_ENT ,KC_SPC , KC_RCMD , TT_ADJ ,KC_HYPR ,KC_RCTL ,MO_INTR //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), @@ -166,13 +166,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ _______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ , //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - _______ ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_LCBR , KC_RCBR ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,_______ , + _______ ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,_______ , _______ ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,_______ , //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ - _______ ,KC_EXLM ,KC_AT ,KC_HASH ,KC_DLR ,KC_PERC ,_______ , _______ ,KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_MINS ,KC_UNDS ,_______ , + _______ ,KC_EXLM ,KC_AT ,KC_HASH ,KC_DLR ,KC_PERC ,KC_LCBR , KC_RCBR ,KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_MINS ,KC_UNDS ,_______ , //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ - _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , _______ , _______ ,_______ ,_______ ,_______ + _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , _______ , _______ ,_______ ,_______ ,_______ //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), @@ -186,7 +186,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ - _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,XXXXXXX , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ + _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,XXXXXXX , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), @@ -200,7 +200,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ XXXXXXX ,UC_00E2 ,XXXXXXX ,UC_00E7 ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,UC_0171 ,UC_00EA ,XXXXXXX ,UC_0151 ,XXXXXXX , //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ - _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,NBSP , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ + _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,NBSP , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ), @@ -214,7 +214,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ , _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ - _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,XXXXXXX , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ + _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,_______ , _______ ,XXXXXXX , XXXXXXX , _______ ,XXXXXXX ,XXXXXXX ,_______ //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ ) From a49d0a1e83d686a6c7a0673ffbd691f80908ea6f Mon Sep 17 00:00:00 2001 From: Danny Date: Mon, 5 Nov 2018 14:00:38 -0500 Subject: [PATCH 358/505] Keyboard: Add Nyquist Rev 3 (#4287) * Add Nyquist Rev 3 * Switch to split_common --- keyboards/nyquist/eeprom-lefthand.eep | 2 - keyboards/nyquist/eeprom-righthand.eep | 2 - keyboards/nyquist/i2c.c | 162 ------- keyboards/nyquist/i2c.h | 49 -- keyboards/nyquist/info.json | 3 + keyboards/nyquist/keymaps/default/config.h | 7 +- keyboards/nyquist/keymaps/default/rules.mk | 4 - keyboards/nyquist/keymaps/hexwire/config.h | 7 +- keyboards/nyquist/keymaps/hexwire/rules.mk | 3 - keyboards/nyquist/matrix.c | 497 --------------------- keyboards/nyquist/nyquist.h | 8 +- keyboards/nyquist/rev1/config.h | 7 +- keyboards/nyquist/rev1/rev1.h | 5 +- keyboards/nyquist/rev2/config.h | 7 +- keyboards/nyquist/rev2/rev2.h | 5 +- keyboards/nyquist/rev3/config.h | 81 ++++ keyboards/nyquist/rev3/rev3.c | 21 + keyboards/nyquist/rev3/rev3.h | 63 +++ keyboards/nyquist/rev3/rules.mk | 1 + keyboards/nyquist/rules.mk | 20 +- keyboards/nyquist/serial.c | 228 ---------- keyboards/nyquist/serial.h | 26 -- keyboards/nyquist/split_util.c | 86 ---- keyboards/nyquist/split_util.h | 20 - 24 files changed, 188 insertions(+), 1126 deletions(-) delete mode 100644 keyboards/nyquist/eeprom-lefthand.eep delete mode 100644 keyboards/nyquist/eeprom-righthand.eep delete mode 100644 keyboards/nyquist/i2c.c delete mode 100644 keyboards/nyquist/i2c.h delete mode 100644 keyboards/nyquist/matrix.c create mode 100644 keyboards/nyquist/rev3/config.h create mode 100644 keyboards/nyquist/rev3/rev3.c create mode 100644 keyboards/nyquist/rev3/rev3.h create mode 100644 keyboards/nyquist/rev3/rules.mk delete mode 100644 keyboards/nyquist/serial.c delete mode 100644 keyboards/nyquist/serial.h delete mode 100644 keyboards/nyquist/split_util.c delete mode 100644 keyboards/nyquist/split_util.h diff --git a/keyboards/nyquist/eeprom-lefthand.eep b/keyboards/nyquist/eeprom-lefthand.eep deleted file mode 100644 index b9666a74c01f..000000000000 --- a/keyboards/nyquist/eeprom-lefthand.eep +++ /dev/null @@ -1,2 +0,0 @@ -:0B0000000000000000000000000001F4 -:00000001FF diff --git a/keyboards/nyquist/eeprom-righthand.eep b/keyboards/nyquist/eeprom-righthand.eep deleted file mode 100644 index 94cc5be7fc68..000000000000 --- a/keyboards/nyquist/eeprom-righthand.eep +++ /dev/null @@ -1,2 +0,0 @@ -:0B0000000000000000000000000000F5 -:00000001FF diff --git a/keyboards/nyquist/i2c.c b/keyboards/nyquist/i2c.c deleted file mode 100644 index 084c890c405f..000000000000 --- a/keyboards/nyquist/i2c.c +++ /dev/null @@ -1,162 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "i2c.h" - -#ifdef USE_I2C - -// Limits the amount of we wait for any one i2c transaction. -// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is -// 9 bits, a single transaction will take around 90μs to complete. -// -// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit -// poll loop takes at least 8 clock cycles to execute -#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8 - -#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE) - -volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; - -static volatile uint8_t slave_buffer_pos; -static volatile bool slave_has_register_set = false; - -// Wait for an i2c operation to finish -inline static -void i2c_delay(void) { - uint16_t lim = 0; - while(!(TWCR & (1<10. - // Check datasheets for more info. - TWBR = ((F_CPU/SCL_CLOCK)-16)/2; -} - -// Start a transaction with the given i2c slave address. The direction of the -// transfer is set with I2C_READ and I2C_WRITE. -// returns: 0 => success -// 1 => error -uint8_t i2c_master_start(uint8_t address) { - TWCR = (1< slave ACK -// 1 => slave NACK -uint8_t i2c_master_write(uint8_t data) { - TWDR = data; - TWCR = (1<= SLAVE_BUFFER_SIZE ) { - ack = 0; - slave_buffer_pos = 0; - } - slave_has_register_set = true; - } else { - i2c_slave_buffer[slave_buffer_pos] = TWDR; - BUFFER_POS_INC(); - } - break; - - case TW_ST_SLA_ACK: - case TW_ST_DATA_ACK: - // master has addressed this device as a slave transmitter and is - // requesting data. - TWDR = i2c_slave_buffer[slave_buffer_pos]; - BUFFER_POS_INC(); - break; - - case TW_BUS_ERROR: // something went wrong, reset twi state - TWCR = 0; - default: - break; - } - // Reset everything, so we are ready for the next TWI interrupt - TWCR |= (1< - -#ifndef F_CPU -#define F_CPU 16000000UL -#endif - -#define I2C_READ 1 -#define I2C_WRITE 0 - -#define I2C_ACK 1 -#define I2C_NACK 0 - -#define SLAVE_BUFFER_SIZE 0x10 - -// i2c SCL clock frequency -#define SCL_CLOCK 100000L - -extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE]; - -void i2c_master_init(void); -uint8_t i2c_master_start(uint8_t address); -void i2c_master_stop(void); -uint8_t i2c_master_write(uint8_t data); -uint8_t i2c_master_read(int); -void i2c_reset_state(void); -void i2c_slave_init(uint8_t address); - - -static inline unsigned char i2c_start_read(unsigned char addr) { - return i2c_master_start((addr << 1) | I2C_READ); -} - -static inline unsigned char i2c_start_write(unsigned char addr) { - return i2c_master_start((addr << 1) | I2C_WRITE); -} - -// from SSD1306 scrips -extern unsigned char i2c_rep_start(unsigned char addr); -extern void i2c_start_wait(unsigned char addr); -extern unsigned char i2c_readAck(void); -extern unsigned char i2c_readNak(void); -extern unsigned char i2c_read(unsigned char ack); - -#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak(); - -#endif diff --git a/keyboards/nyquist/info.json b/keyboards/nyquist/info.json index 0a038f6dd2eb..295864cfc98c 100644 --- a/keyboards/nyquist/info.json +++ b/keyboards/nyquist/info.json @@ -7,6 +7,9 @@ "layouts": { "LAYOUT": { "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4}, {"x":5, "y":4}, {"x":7, "y":4}, {"x":8, "y":4}, {"x":9, "y":4}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}] + }, + "LAYOUT_ortho_5x12": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4}, {"x":5, "y":4}, {"x":7, "y":4}, {"x":8, "y":4}, {"x":9, "y":4}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}] } } } diff --git a/keyboards/nyquist/keymaps/default/config.h b/keyboards/nyquist/keymaps/default/config.h index c4604af436f9..0fa606f29653 100644 --- a/keyboards/nyquist/keymaps/default/config.h +++ b/keyboards/nyquist/keymaps/default/config.h @@ -15,10 +15,7 @@ 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 - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -37,5 +34,3 @@ along with this program. If not, see . #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 - -#endif diff --git a/keyboards/nyquist/keymaps/default/rules.mk b/keyboards/nyquist/keymaps/default/rules.mk index 1e5761278801..1e3cebb14515 100644 --- a/keyboards/nyquist/keymaps/default/rules.mk +++ b/keyboards/nyquist/keymaps/default/rules.mk @@ -1,5 +1 @@ RGBLIGHT_ENABLE = yes - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/nyquist/keymaps/hexwire/config.h b/keyboards/nyquist/keymaps/hexwire/config.h index 8b9c3ea2bdf0..4f1901b5dd20 100644 --- a/keyboards/nyquist/keymaps/hexwire/config.h +++ b/keyboards/nyquist/keymaps/hexwire/config.h @@ -15,10 +15,7 @@ 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 - -#include "config_common.h" +#pragma once /* Use I2C or Serial, not both */ @@ -39,5 +36,3 @@ along with this program. If not, see . #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 - -#endif diff --git a/keyboards/nyquist/keymaps/hexwire/rules.mk b/keyboards/nyquist/keymaps/hexwire/rules.mk index 1e5761278801..a81250cdf6d9 100644 --- a/keyboards/nyquist/keymaps/hexwire/rules.mk +++ b/keyboards/nyquist/keymaps/hexwire/rules.mk @@ -1,5 +1,2 @@ RGBLIGHT_ENABLE = yes -ifndef QUANTUM_DIR - include ../../../../Makefile -endif diff --git a/keyboards/nyquist/matrix.c b/keyboards/nyquist/matrix.c deleted file mode 100644 index 3cdad4adb8ef..000000000000 --- a/keyboards/nyquist/matrix.c +++ /dev/null @@ -1,497 +0,0 @@ -/* -Copyright 2017 Danny Nguyen - -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 . -*/ - -/* - * scan matrix - */ -#include -#include -#include -#include "wait.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "matrix.h" -#include "split_util.h" -#include "pro_micro.h" -#include "config.h" -#include "timer.h" - -#ifdef BACKLIGHT_ENABLE - #include "backlight.h" - extern backlight_config_t backlight_config; -#endif - -#ifdef USE_I2C -# include "i2c.h" -#else // USE_SERIAL -# include "serial.h" -#endif - -#ifndef DEBOUNCING_DELAY -# define DEBOUNCING_DELAY 5 -#endif - -#if (DEBOUNCING_DELAY > 0) - static uint16_t debouncing_time; - static bool debouncing = false; -#endif - -#if (MATRIX_COLS <= 8) -# define print_matrix_header() print("\nr/c 01234567\n") -# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) -# define matrix_bitpop(i) bitpop(matrix[i]) -# define ROW_SHIFTER ((uint8_t)1) -#else -# error "Currently only supports 8 COLS" -#endif -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -#define ERROR_DISCONNECT_COUNT 5 - -#define SERIAL_LED_ADDR 0x00 - -#define ROWS_PER_HAND (MATRIX_ROWS/2) - -static uint8_t error_count = 0; - -static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS; -static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS; - -/* matrix state(1:on, 0:off) */ -static matrix_row_t matrix[MATRIX_ROWS]; -static matrix_row_t matrix_debouncing[MATRIX_ROWS]; - -#if (DIODE_DIRECTION == COL2ROW) - static void init_cols(void); - static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row); - static void unselect_rows(void); - static void select_row(uint8_t row); - static void unselect_row(uint8_t row); -#elif (DIODE_DIRECTION == ROW2COL) - static void init_rows(void); - static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col); - static void unselect_cols(void); - static void unselect_col(uint8_t col); - static void select_col(uint8_t col); -#endif - -__attribute__ ((weak)) -void matrix_init_kb(void) { - matrix_init_user(); -} - -__attribute__ ((weak)) -void matrix_scan_kb(void) { - matrix_scan_user(); -} - -__attribute__ ((weak)) -void matrix_init_user(void) { -} - -__attribute__ ((weak)) -void matrix_scan_user(void) { -} - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - -void matrix_init(void) -{ -#ifdef DISABLE_JTAG - // JTAG disable for PORT F. write JTD bit twice within four cycles. - MCUCR |= (1< 0) - bool matrix_changed = read_cols_on_row(matrix_debouncing+offset, current_row); - - if (matrix_changed) { - debouncing = true; - debouncing_time = timer_read(); - } - -# else - read_cols_on_row(matrix+offset, current_row); -# endif - - } - -#elif (DIODE_DIRECTION == ROW2COL) - // Set col, read rows - for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) { -# if (DEBOUNCING_DELAY > 0) - bool matrix_changed = read_rows_on_col(matrix_debouncing+offset, current_col); - if (matrix_changed) { - debouncing = true; - debouncing_time = timer_read(); - } -# else - read_rows_on_col(matrix+offset, current_col); -# endif - - } -#endif - -# if (DEBOUNCING_DELAY > 0) - if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { - for (uint8_t i = 0; i < ROWS_PER_HAND; i++) { - matrix[i+offset] = matrix_debouncing[i+offset]; - } - debouncing = false; - } -# endif - - return 1; -} - -#ifdef USE_I2C - -// Get rows from other half over i2c -int i2c_transaction(void) { - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - - int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE); - if (err) goto i2c_error; - - // start of matrix stored at 0x00 - err = i2c_master_write(0x00); - if (err) goto i2c_error; - -#ifdef BACKLIGHT_ENABLE - // Write backlight level for slave to read - err = i2c_master_write(backlight_config.enable ? backlight_config.level : 0); -#else - // Write zero, so our byte index is the same - err = i2c_master_write(0x00); -#endif - if (err) goto i2c_error; - - // Start read - err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ); - if (err) goto i2c_error; - - if (!err) { - int i; - for (i = 0; i < ROWS_PER_HAND-1; ++i) { - matrix[slaveOffset+i] = i2c_master_read(I2C_ACK); - } - matrix[slaveOffset+i] = i2c_master_read(I2C_NACK); - i2c_master_stop(); - } else { -i2c_error: // the cable is disconnceted, or something else went wrong - i2c_reset_state(); - return err; - } - - return 0; -} - -#else // USE_SERIAL - -int serial_transaction(void) { - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - - if (serial_update_buffers()) { - return 1; - } - - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = serial_slave_buffer[i]; - } - -#ifdef BACKLIGHT_ENABLE - // Write backlight level for slave to read - serial_master_buffer[SERIAL_LED_ADDR] = backlight_config.enable ? backlight_config.level : 0; -#endif - return 0; -} -#endif - -uint8_t matrix_scan(void) -{ - uint8_t ret = _matrix_scan(); - -#ifdef USE_I2C - if( i2c_transaction() ) { -#else // USE_SERIAL - if( serial_transaction() ) { -#endif - // turn on the indicator led when halves are disconnected - TXLED1; - - error_count++; - - if (error_count > ERROR_DISCONNECT_COUNT) { - // reset other half if disconnected - int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; - for (int i = 0; i < ROWS_PER_HAND; ++i) { - matrix[slaveOffset+i] = 0; - } - } - } else { - // turn off the indicator led on no error - TXLED0; - error_count = 0; - } - matrix_scan_quantum(); - return ret; -} - -void matrix_slave_scan(void) { - _matrix_scan(); - - int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; - -#ifdef USE_I2C -#ifdef BACKLIGHT_ENABLE - // Read backlight level sent from master and update level on slave - backlight_set(i2c_slave_buffer[0]); -#endif - for (int i = 0; i < ROWS_PER_HAND; ++i) { - i2c_slave_buffer[i+1] = matrix[offset+i]; - } -#else // USE_SERIAL - for (int i = 0; i < ROWS_PER_HAND; ++i) { - serial_slave_buffer[i] = matrix[offset+i]; - } - -#ifdef BACKLIGHT_ENABLE - // Read backlight level sent from master and update level on slave - backlight_set(serial_master_buffer[SERIAL_LED_ADDR]); -#endif -#endif -} - -bool matrix_is_modified(void) -{ -#if (DEBOUNCING_DELAY > 0) - if (debouncing) return false; -#endif - return true; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & ((matrix_row_t)1<> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) -{ - // Store last value of row prior to reading - matrix_row_t last_row_value = current_matrix[current_row]; - - // Clear data in matrix row - current_matrix[current_row] = 0; - - // Select row and wait for row selecton to stabilize - select_row(current_row); - wait_us(30); - - // For each col... - for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { - - // Select the col pin to read (active low) - uint8_t pin = col_pins[col_index]; - uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF)); - - // Populate the matrix row with the state of the col pin - current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index); - } - - // Unselect row - unselect_row(current_row); - - return (last_row_value != current_matrix[current_row]); -} - -static void select_row(uint8_t row) -{ - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW -} - -static void unselect_row(uint8_t row) -{ - uint8_t pin = row_pins[row]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI -} - -static void unselect_rows(void) -{ - for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -#elif (DIODE_DIRECTION == ROW2COL) - -static void init_rows(void) -{ - for(uint8_t x = 0; x < ROWS_PER_HAND; x++) { - uint8_t pin = row_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) -{ - bool matrix_changed = false; - - // Select col and wait for col selecton to stabilize - select_col(current_col); - wait_us(30); - - // For each row... - for(uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) - { - - // Store last value of row prior to reading - matrix_row_t last_row_value = current_matrix[row_index]; - - // Check row pin state - if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0) - { - // Pin LO, set col bit - current_matrix[row_index] |= (ROW_SHIFTER << current_col); - } - else - { - // Pin HI, clear col bit - current_matrix[row_index] &= ~(ROW_SHIFTER << current_col); - } - - // Determine if the matrix changed state - if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) - { - matrix_changed = true; - } - } - - // Unselect col - unselect_col(current_col); - - return matrix_changed; -} - -static void select_col(uint8_t col) -{ - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT - _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW -} - -static void unselect_col(uint8_t col) -{ - uint8_t pin = col_pins[col]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI -} - -static void unselect_cols(void) -{ - for(uint8_t x = 0; x < MATRIX_COLS; x++) { - uint8_t pin = col_pins[x]; - _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN - _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI - } -} - -#endif diff --git a/keyboards/nyquist/nyquist.h b/keyboards/nyquist/nyquist.h index d401a45f78fa..9a3e996476f4 100644 --- a/keyboards/nyquist/nyquist.h +++ b/keyboards/nyquist/nyquist.h @@ -1,5 +1,4 @@ -#ifndef NYQUIST_H -#define NYQUIST_H +#pragma once #ifdef KEYBOARD_nyquist_rev1 #include "rev1.h" @@ -7,6 +6,9 @@ #ifdef KEYBOARD_nyquist_rev2 #include "rev2.h" #endif +#ifdef KEYBOARD_nyquist_rev3 + #include "rev3.h" +#endif #include "quantum.h" @@ -26,4 +28,4 @@ KC_##L40, KC_##L41, KC_##L42, KC_##L43, KC_##L44, KC_##L45, KC_##R40, KC_##R41, KC_##R42, KC_##R43, KC_##R44, KC_##R45 \ ) -#endif +#define LAYOUT_kc_ortho_5x12 LAYOUT_kc diff --git a/keyboards/nyquist/rev1/config.h b/keyboards/nyquist/rev1/config.h index eec084eccd21..35fbaffb96d7 100644 --- a/keyboards/nyquist/rev1/config.h +++ b/keyboards/nyquist/rev1/config.h @@ -15,10 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef REV1_CONFIG_H -#define REV1_CONFIG_H - -#include QMK_KEYBOARD_CONFIG_H +#pragma once /* USB Device descriptor parameter */ #define VENDOR_ID 0xCB10 @@ -81,5 +78,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - -#endif diff --git a/keyboards/nyquist/rev1/rev1.h b/keyboards/nyquist/rev1/rev1.h index 2d4c9f73ee4d..6d3a23383bfe 100644 --- a/keyboards/nyquist/rev1/rev1.h +++ b/keyboards/nyquist/rev1/rev1.h @@ -1,5 +1,4 @@ -#ifndef REV1_H -#define REV1_H +#pragma once #include "nyquist.h" @@ -64,5 +63,3 @@ #endif #define LAYOUT_ortho_5x12 LAYOUT - -#endif diff --git a/keyboards/nyquist/rev2/config.h b/keyboards/nyquist/rev2/config.h index ab062c9209c1..7dc743b275ec 100644 --- a/keyboards/nyquist/rev2/config.h +++ b/keyboards/nyquist/rev2/config.h @@ -15,10 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef REV2_CONFIG_H -#define REV2_CONFIG_H - -#include QMK_KEYBOARD_CONFIG_H +#pragma once /* USB Device descriptor parameter */ #define VENDOR_ID 0xCB10 @@ -82,5 +79,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - -#endif diff --git a/keyboards/nyquist/rev2/rev2.h b/keyboards/nyquist/rev2/rev2.h index 1eec5d2beb8c..6d3a23383bfe 100644 --- a/keyboards/nyquist/rev2/rev2.h +++ b/keyboards/nyquist/rev2/rev2.h @@ -1,5 +1,4 @@ -#ifndef REV2_H -#define REV2_H +#pragma once #include "nyquist.h" @@ -64,5 +63,3 @@ #endif #define LAYOUT_ortho_5x12 LAYOUT - -#endif diff --git a/keyboards/nyquist/rev3/config.h b/keyboards/nyquist/rev3/config.h new file mode 100644 index 000000000000..6c51bc9a8052 --- /dev/null +++ b/keyboards/nyquist/rev3/config.h @@ -0,0 +1,81 @@ +/* +Copyright 2017 Danny Nguyen + +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 + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xCB10 +#define PRODUCT_ID 0x1156 +#define DEVICE_VER 0x0300 +#define MANUFACTURER Keebio +#define PRODUCT The Nyquist Keyboard +#define DESCRIPTION Split 60 percent ortholinear keyboard + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 10 +#define MATRIX_COLS 6 + +// wiring of each half +#define MATRIX_ROW_PINS { F0, F5, D7, F6, F7 } +#define MATRIX_COL_PINS { F1, F4, B7, D2, D3, D4 } + +/* 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)) \ +) + +/* ws2812 RGB LED */ +#define RGB_DI_PIN B4 +#define RGBLIGHT_TIMER +#define RGBLED_NUM 12 + +/* Backlight LEDs */ +#define BACKLIGHT_PIN D5 +#define BACKLIGHT_LEVELS 7 + +/* + * 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 diff --git a/keyboards/nyquist/rev3/rev3.c b/keyboards/nyquist/rev3/rev3.c new file mode 100644 index 000000000000..34500fb104d1 --- /dev/null +++ b/keyboards/nyquist/rev3/rev3.c @@ -0,0 +1,21 @@ +#include "rev3.h" + +#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) { + + // // green led on + // DDRD |= (1<<5); + // PORTD &= ~(1<<5); + + // // orange led on + // DDRB |= (1<<0); + // PORTB &= ~(1<<0); + + matrix_init_user(); +}; diff --git a/keyboards/nyquist/rev3/rev3.h b/keyboards/nyquist/rev3/rev3.h new file mode 100644 index 000000000000..3a3141f6e05f --- /dev/null +++ b/keyboards/nyquist/rev3/rev3.h @@ -0,0 +1,63 @@ +#pragma once + +#include "nyquist.h" +#include "quantum.h" + +#ifdef USE_I2C +#include +#ifdef __AVR__ + #include + #include +#endif +#endif + +//void promicro_bootloader_jmp(bool program); + +#ifndef FLIP_HALF +// Standard Keymap +// (TRRS jack on the left half is to the right, TRRS jack on the right half is to the left) +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35, \ + L40, L41, L42, L43, L44, L45, R40, R41, R42, R43, R44, R45 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05 }, \ + { L10, L11, L12, L13, L14, L15 }, \ + { L20, L21, L22, L23, L24, L25 }, \ + { L30, L31, L32, L33, L34, L35 }, \ + { L40, L41, L42, L43, L44, L45 }, \ + { R05, R04, R03, R02, R01, R00 }, \ + { R15, R14, R13, R12, R11, R10 }, \ + { R25, R24, R23, R22, R21, R20 }, \ + { R35, R34, R33, R32, R31, R30 }, \ + { R45, R44, R43, R42, R41, R40 } \ + } +#else +// Keymap with right side flipped +// (TRRS jack on both halves are to the right) +#define LAYOUT( \ + L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \ + L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \ + L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \ + L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35, \ + L40, L41, L42, L43, L44, L45, R40, R41, R42, R43, R44, R45 \ + ) \ + { \ + { L00, L01, L02, L03, L04, L05 }, \ + { L10, L11, L12, L13, L14, L15 }, \ + { L20, L21, L22, L23, L24, L25 }, \ + { L30, L31, L32, L33, L34, L35 }, \ + { L40, L41, L42, L43, L44, L45 }, \ + { R00, R01, R02, R03, R04, R05 }, \ + { R10, R11, R12, R13, R14, R15 }, \ + { R20, R21, R22, R23, R24, R25 }, \ + { R30, R31, R32, R33, R34, R35 }, \ + { R40, R41, R42, R43, R44, R45 } \ + } +#endif + +#define LAYOUT_ortho_5x12 LAYOUT + diff --git a/keyboards/nyquist/rev3/rules.mk b/keyboards/nyquist/rev3/rules.mk new file mode 100644 index 000000000000..bd518d8f273f --- /dev/null +++ b/keyboards/nyquist/rev3/rules.mk @@ -0,0 +1 @@ +BACKLIGHT_ENABLE = yes diff --git a/keyboards/nyquist/rules.mk b/keyboards/nyquist/rules.mk index 74d5625f8553..5313b85022fb 100644 --- a/keyboards/nyquist/rules.mk +++ b/keyboards/nyquist/rules.mk @@ -1,8 +1,3 @@ -SRC += matrix.c \ - i2c.c \ - split_util.c \ - serial.c - # MCU name #MCU = at90usb1287 MCU = atmega32u4 @@ -41,9 +36,13 @@ F_USB = $(F_CPU) # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. -BOOTLOADER = caterina +ifeq ($(strip $(KEYBOARD)), nyquist/rev3) + BOOTLOADER = dfu +else + BOOTLOADER = caterina +endif # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT @@ -63,13 +62,10 @@ 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 -USE_I2C = yes -RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -CUSTOM_MATRIX = yes - +SPLIT_KEYBOARD = yes LAYOUTS = ortho_5x12 - DEFAULT_FOLDER = nyquist/rev2 diff --git a/keyboards/nyquist/serial.c b/keyboards/nyquist/serial.c deleted file mode 100644 index 74bcbb6bf6e2..000000000000 --- a/keyboards/nyquist/serial.c +++ /dev/null @@ -1,228 +0,0 @@ -/* - * WARNING: be careful changing this code, it is very timing dependent - */ - -#ifndef F_CPU -#define F_CPU 16000000 -#endif - -#include -#include -#include -#include -#include "serial.h" - -#ifndef USE_I2C - -// Serial pulse period in microseconds. Its probably a bad idea to lower this -// value. -#define SERIAL_DELAY 24 - -uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; -uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0}; - -#define SLAVE_DATA_CORRUPT (1<<0) -volatile uint8_t status = 0; - -inline static -void serial_delay(void) { - _delay_us(SERIAL_DELAY); -} - -inline static -void serial_output(void) { - SERIAL_PIN_DDR |= SERIAL_PIN_MASK; -} - -// make the serial pin an input with pull-up resistor -inline static -void serial_input(void) { - SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK; - SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -inline static -uint8_t serial_read_pin(void) { - return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); -} - -inline static -void serial_low(void) { - SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK; -} - -inline static -void serial_high(void) { - SERIAL_PIN_PORT |= SERIAL_PIN_MASK; -} - -void serial_master_init(void) { - serial_output(); - serial_high(); -} - -void serial_slave_init(void) { - serial_input(); - - // Enable INT0 - EIMSK |= _BV(INT0); - // Trigger on falling edge of INT0 - EICRA &= ~(_BV(ISC00) | _BV(ISC01)); -} - -// Used by the master to synchronize timing with the slave. -static -void sync_recv(void) { - serial_input(); - // This shouldn't hang if the slave disconnects because the - // serial line will float to high if the slave does disconnect. - while (!serial_read_pin()); - serial_delay(); -} - -// Used by the slave to send a synchronization signal to the master. -static -void sync_send(void) { - serial_output(); - - serial_low(); - serial_delay(); - - serial_high(); -} - -// Reads a byte from the serial line -static -uint8_t serial_read_byte(void) { - uint8_t byte = 0; - serial_input(); - for ( uint8_t i = 0; i < 8; ++i) { - byte = (byte << 1) | serial_read_pin(); - serial_delay(); - _delay_us(1); - } - - return byte; -} - -// Sends a byte with MSB ordering -static -void serial_write_byte(uint8_t data) { - uint8_t b = 8; - serial_output(); - while( b-- ) { - if(data & (1 << b)) { - serial_high(); - } else { - serial_low(); - } - serial_delay(); - } -} - -// interrupt handle to be used by the slave device -ISR(SERIAL_PIN_INTERRUPT) { - sync_send(); - - uint8_t checksum = 0; - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_slave_buffer[i]); - sync_send(); - checksum += serial_slave_buffer[i]; - } - serial_write_byte(checksum); - sync_send(); - - // wait for the sync to finish sending - serial_delay(); - - // read the middle of pulses - _delay_us(SERIAL_DELAY/2); - - uint8_t checksum_computed = 0; - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_master_buffer[i] = serial_read_byte(); - sync_send(); - checksum_computed += serial_master_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_send(); - - serial_input(); // end transaction - - if ( checksum_computed != checksum_received ) { - status |= SLAVE_DATA_CORRUPT; - } else { - status &= ~SLAVE_DATA_CORRUPT; - } -} - -inline -bool serial_slave_DATA_CORRUPT(void) { - return status & SLAVE_DATA_CORRUPT; -} - -// Copies the serial_slave_buffer to the master and sends the -// serial_master_buffer to the slave. -// -// Returns: -// 0 => no error -// 1 => slave did not respond -int serial_update_buffers(void) { - // this code is very time dependent, so we need to disable interrupts - cli(); - - // signal to the slave that we want to start a transaction - serial_output(); - serial_low(); - _delay_us(1); - - // wait for the slaves response - serial_input(); - serial_high(); - _delay_us(SERIAL_DELAY); - - // check if the slave is present - if (serial_read_pin()) { - // slave failed to pull the line low, assume not present - sei(); - return 1; - } - - // if the slave is present syncronize with it - sync_recv(); - - uint8_t checksum_computed = 0; - // receive data from the slave - for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) { - serial_slave_buffer[i] = serial_read_byte(); - sync_recv(); - checksum_computed += serial_slave_buffer[i]; - } - uint8_t checksum_received = serial_read_byte(); - sync_recv(); - - if (checksum_computed != checksum_received) { - sei(); - return 1; - } - - uint8_t checksum = 0; - // send data to the slave - for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) { - serial_write_byte(serial_master_buffer[i]); - sync_recv(); - checksum += serial_master_buffer[i]; - } - serial_write_byte(checksum); - sync_recv(); - - // always, release the line when not in use - serial_output(); - serial_high(); - - sei(); - return 0; -} - -#endif diff --git a/keyboards/nyquist/serial.h b/keyboards/nyquist/serial.h deleted file mode 100644 index 15fe4db7b4c6..000000000000 --- a/keyboards/nyquist/serial.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef MY_SERIAL_H -#define MY_SERIAL_H - -#include "config.h" -#include - -/* TODO: some defines for interrupt setup */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD0) -#define SERIAL_PIN_INTERRUPT INT0_vect - -#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 -#define SERIAL_MASTER_BUFFER_LENGTH 1 - -// Buffers for master - slave communication -extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; -extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; - -void serial_master_init(void); -void serial_slave_init(void); -int serial_update_buffers(void); -bool serial_slave_data_corrupt(void); - -#endif diff --git a/keyboards/nyquist/split_util.c b/keyboards/nyquist/split_util.c deleted file mode 100644 index 346cbc908949..000000000000 --- a/keyboards/nyquist/split_util.c +++ /dev/null @@ -1,86 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "split_util.h" -#include "matrix.h" -#include "keyboard.h" -#include "config.h" -#include "timer.h" - -#ifdef USE_I2C -# include "i2c.h" -#else -# include "serial.h" -#endif - -volatile bool isLeftHand = true; - -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) - isLeftHand = !has_usb(); - #else - isLeftHand = has_usb(); - #endif - #endif -} - -static void keyboard_master_setup(void) { -#ifdef USE_I2C - i2c_master_init(); -#ifdef SSD1306OLED - matrix_master_OLED_init (); -#endif -#else - serial_master_init(); -#endif -} - -static void keyboard_slave_setup(void) { - timer_init(); -#ifdef USE_I2C - i2c_slave_init(SLAVE_I2C_ADDRESS); -#else - serial_slave_init(); -#endif -} - -bool has_usb(void) { - USBCON |= (1 << OTGPADE); //enables VBUS pad - _delay_us(5); - return (USBSTA & (1< -#include "eeconfig.h" - -#define SLAVE_I2C_ADDRESS 0x32 - -extern volatile bool isLeftHand; - -// slave version of matix scan, defined in matrix.c -void matrix_slave_scan(void); - -void split_keyboard_setup(void); -bool has_usb(void); -void keyboard_slave_loop(void); - -void matrix_master_OLED_init (void); - -#endif From a3bb8c05c9ac6e6e4e5334caba1a816fa309d414 Mon Sep 17 00:00:00 2001 From: zvecr Date: Tue, 6 Nov 2018 03:00:54 +0000 Subject: [PATCH 359/505] Keyboard: Initial foobar port (#4367) --- keyboards/foobar/config.h | 230 +++++++++++++++++++++ keyboards/foobar/foobar.c | 55 +++++ keyboards/foobar/foobar.h | 66 ++++++ keyboards/foobar/info.json | 25 +++ keyboards/foobar/keymaps/default/config.h | 19 ++ keyboards/foobar/keymaps/default/keymap.c | 49 +++++ keyboards/foobar/keymaps/default/readme.md | 1 + keyboards/foobar/keymaps/macro/config.h | 19 ++ keyboards/foobar/keymaps/macro/keymap.c | 40 ++++ keyboards/foobar/keymaps/macro/readme.md | 1 + keyboards/foobar/readme.md | 17 ++ keyboards/foobar/rules.mk | 83 ++++++++ 12 files changed, 605 insertions(+) create mode 100644 keyboards/foobar/config.h create mode 100644 keyboards/foobar/foobar.c create mode 100644 keyboards/foobar/foobar.h create mode 100644 keyboards/foobar/info.json create mode 100644 keyboards/foobar/keymaps/default/config.h create mode 100644 keyboards/foobar/keymaps/default/keymap.c create mode 100644 keyboards/foobar/keymaps/default/readme.md create mode 100644 keyboards/foobar/keymaps/macro/config.h create mode 100644 keyboards/foobar/keymaps/macro/keymap.c create mode 100644 keyboards/foobar/keymaps/macro/readme.md create mode 100644 keyboards/foobar/readme.md create mode 100644 keyboards/foobar/rules.mk diff --git a/keyboards/foobar/config.h b/keyboards/foobar/config.h new file mode 100644 index 000000000000..89219c460745 --- /dev/null +++ b/keyboards/foobar/config.h @@ -0,0 +1,230 @@ +/* Copyright 2018 + * + * 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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0A0C +#define DEVICE_VER 0x0F00 +#define MANUFACTURER di0ib +#define PRODUCT The foobar Keyboard +#define DESCRIPTION A split 30 key keyboard + +#define USE_SERIAL + +/* Select hand configuration */ +#define MASTER_LEFT +//#define MASTER_RIGHT +//#define EE_HANDS + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 3*2 +#define MATRIX_COLS 5 + +/* + * 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 { D7, E6, B4 } +#define MATRIX_COL_PINS { F6, F7, B1, B3, B2 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + +// #define RGB_DI_PIN E2 +// #ifdef RGB_DI_PIN +// #define RGBLIGHT_ANIMATIONS +// #define RGBLED_NUM 16 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 +// #endif + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ diff --git a/keyboards/foobar/foobar.c b/keyboards/foobar/foobar.c new file mode 100644 index 000000000000..c032056a155f --- /dev/null +++ b/keyboards/foobar/foobar.c @@ -0,0 +1,55 @@ +/* Copyright 2018 + * + * 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 "foobar.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); +} + +#ifdef SWAP_HANDS_ENABLE +__attribute__ ((weak)) +const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { + {{4, 3}, {3, 3}, {2, 3}, {1, 3}, {0, 3}}, + {{4, 4}, {3, 4}, {2, 4}, {1, 4}, {0, 4}}, + {{4, 5}, {3, 5}, {2, 5}, {1, 5}, {0, 5}}, + {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}}, + {{0, 1}, {1, 1}, {2, 1}, {3, 1}, {4, 1}}, + {{0, 2}, {1, 2}, {2, 2}, {3, 2}, {4, 2}}, +}; +#endif diff --git a/keyboards/foobar/foobar.h b/keyboards/foobar/foobar.h new file mode 100644 index 000000000000..fc49c72aaf2a --- /dev/null +++ b/keyboards/foobar/foobar.h @@ -0,0 +1,66 @@ +/* Copyright 2018 + * + * 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 + +#include "quantum.h" +#define ___ KC_NO + +#ifndef FLIP_HALF +#define LAYOUT_split( \ + L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \ + L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \ + L20, L21, L22, L23, L24, R20, R21, R22, R23, R24 \ +) { \ + { L00, L01, L02, L03, L04 }, \ + { L10, L11, L12, L13, L14 }, \ + { L20, L21, L22, L23, L24 }, \ + { R04, R03, R02, R01, R00 }, \ + { R14, R13, R12, R11, R10 }, \ + { R24, R23, R22, R21, R20 } \ +} +#else +#define LAYOUT_split( \ + L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \ + L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \ + L20, L21, L22, L23, L24, R20, R21, R22, R23, R24 \ +) { \ + { L00, L01, L02, L03, L04 }, \ + { L10, L11, L12, L13, L14 }, \ + { L20, L21, L22, L23, L24 }, \ + { R00, R01, R02, R03, R04 }, \ + { R10, R11, R12, R13, R14 }, \ + { R20, R21, R22, R23, R24 } \ +} +#endif + +#define LAYOUT_macro( \ + L00, L01, L02, L03, L04, \ + L10, L11, L12, L13, L14, \ + L20, L21, L22, L23, L24 \ +) { \ + { L00, L01, L02, L03, L04 }, \ + { L10, L11, L12, L13, L14 }, \ + { L20, L21, L22, L23, L24 }, \ + { ___, ___, ___, ___, ___ }, \ + { ___, ___, ___, ___, ___ }, \ + { ___, ___, ___, ___, ___ } \ +} + +#define LAYOUT LAYOUT_macro + +#ifdef USE_I2C + #error "I2C not Supported" +#endif diff --git a/keyboards/foobar/info.json b/keyboards/foobar/info.json new file mode 100644 index 000000000000..cb7f29b25613 --- /dev/null +++ b/keyboards/foobar/info.json @@ -0,0 +1,25 @@ +{ + "keyboard_name": "foobar", + "url": "", + "maintainer": "qmk", + "width": 6, + "height": 2, + "layouts": { + "LAYOUT_macro": { + "key_count": 15, + "layout": [ + {"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, + {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, + {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2} + ] + }, + "LAYOUT_split": { + "key_count": 30, + "layout": [ + {"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, + {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, + {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2} + ] + } + } +} diff --git a/keyboards/foobar/keymaps/default/config.h b/keyboards/foobar/keymaps/default/config.h new file mode 100644 index 000000000000..6173b63272f6 --- /dev/null +++ b/keyboards/foobar/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 + * + * 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 + +// place overrides here diff --git a/keyboards/foobar/keymaps/default/keymap.c b/keyboards/foobar/keymaps/default/keymap.c new file mode 100644 index 000000000000..b750c6185145 --- /dev/null +++ b/keyboards/foobar/keymaps/default/keymap.c @@ -0,0 +1,49 @@ +/* Copyright 2018 + * + * 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 QMK_KEYBOARD_H + +#define _______ KC_TRNS +#define FN1_Q LT(1, KC_Q) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_split( + FN1_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_ESC, + KC_Z, KC_X, KC_C, KC_V, KC_BSPC, KC_SPC, KC_B, KC_N, KC_M, KC_ENT + ), + + [1] = LAYOUT_split( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, RESET, _______, _______, _______ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/foobar/keymaps/default/readme.md b/keyboards/foobar/keymaps/default/readme.md new file mode 100644 index 000000000000..7113469e7ec0 --- /dev/null +++ b/keyboards/foobar/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default split keymap for foobar diff --git a/keyboards/foobar/keymaps/macro/config.h b/keyboards/foobar/keymaps/macro/config.h new file mode 100644 index 000000000000..6173b63272f6 --- /dev/null +++ b/keyboards/foobar/keymaps/macro/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 + * + * 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 + +// place overrides here diff --git a/keyboards/foobar/keymaps/macro/keymap.c b/keyboards/foobar/keymaps/macro/keymap.c new file mode 100644 index 000000000000..1e7ec905fda4 --- /dev/null +++ b/keyboards/foobar/keymaps/macro/keymap.c @@ -0,0 +1,40 @@ +/* Copyright 2018 + * + * 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 QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_macro( /* Base */ + KC_F13, KC_F14, KC_F15, KC_F16, KC_INT1, \ + KC_F17, KC_F18, KC_F19, KC_F20, KC_INT2, \ + KC_F21, KC_F22, KC_F23, KC_F14, KC_INT5 \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/foobar/keymaps/macro/readme.md b/keyboards/foobar/keymaps/macro/readme.md new file mode 100644 index 000000000000..4cc59e7e5d35 --- /dev/null +++ b/keyboards/foobar/keymaps/macro/readme.md @@ -0,0 +1 @@ +# The default single board macro keymap for foobar diff --git a/keyboards/foobar/readme.md b/keyboards/foobar/readme.md new file mode 100644 index 000000000000..3898d4bb1a08 --- /dev/null +++ b/keyboards/foobar/readme.md @@ -0,0 +1,17 @@ +# foobar + +![foobar](https://2.bp.blogspot.com/-rr8TK6xg2N0/WbwVL2O7EfI/AAAAAAACDc8/209wN69ju0wAFICYYPNLIEGQhat5-5MbwCLcBGAs/s640/a.JPG) + +Split 30% keyboard that fits within the 100mm x 100mm PCB size. Can be used together as a split keyboard or as a single 15 key macropad. + +* [The original TMK firmware](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/foobar) + +Keyboard Maintainer: QMK Community +Hardware Supported: foobar PCB +Hardware Availability: [foobar project on 40% Keyboards](http://www.40percent.club/2017/09/foobar-10.html) + +Make example for this keyboard (after setting up your build environment): + + make foobar:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/foobar/rules.mk b/keyboards/foobar/rules.mk new file mode 100644 index 000000000000..3275651650c3 --- /dev/null +++ b/keyboards/foobar/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 + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = lite # 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 +# 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 = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +# Enable generic behavior for split boards +SPLIT_KEYBOARD = yes From 5729380530ca28049a193f84b0199e77ba3e8edd Mon Sep 17 00:00:00 2001 From: zvecr Date: Tue, 6 Nov 2018 03:01:13 +0000 Subject: [PATCH 360/505] Keyboard: Initial 6lit port (#4355) * Initial 6lit port * Pull request review changes * Switch to bootmagic lite --- keyboards/6lit/6lit.c | 53 ++++++ keyboards/6lit/6lit.h | 55 ++++++ keyboards/6lit/config.h | 230 +++++++++++++++++++++++ keyboards/6lit/info.json | 23 +++ keyboards/6lit/keymaps/default/config.h | 19 ++ keyboards/6lit/keymaps/default/keymap.c | 39 ++++ keyboards/6lit/keymaps/default/readme.md | 1 + keyboards/6lit/keymaps/macro/config.h | 19 ++ keyboards/6lit/keymaps/macro/keymap.c | 39 ++++ keyboards/6lit/keymaps/macro/readme.md | 1 + keyboards/6lit/readme.md | 17 ++ keyboards/6lit/rules.mk | 83 ++++++++ 12 files changed, 579 insertions(+) create mode 100644 keyboards/6lit/6lit.c create mode 100644 keyboards/6lit/6lit.h create mode 100644 keyboards/6lit/config.h create mode 100644 keyboards/6lit/info.json create mode 100644 keyboards/6lit/keymaps/default/config.h create mode 100644 keyboards/6lit/keymaps/default/keymap.c create mode 100644 keyboards/6lit/keymaps/default/readme.md create mode 100644 keyboards/6lit/keymaps/macro/config.h create mode 100644 keyboards/6lit/keymaps/macro/keymap.c create mode 100644 keyboards/6lit/keymaps/macro/readme.md create mode 100644 keyboards/6lit/readme.md create mode 100644 keyboards/6lit/rules.mk diff --git a/keyboards/6lit/6lit.c b/keyboards/6lit/6lit.c new file mode 100644 index 000000000000..fd3ae7d00977 --- /dev/null +++ b/keyboards/6lit/6lit.c @@ -0,0 +1,53 @@ +/* Copyright 2018 + * + * 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 "6lit.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); +} + +#ifdef SWAP_HANDS_ENABLE +__attribute__ ((weak)) +const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { + {{2, 2}, {1, 2}, {0, 2}}, + {{2, 3}, {1, 3}, {0, 3}}, + {{0, 0}, {1, 0}, {2, 0}}, + {{0, 1}, {1, 1}, {2, 1}}, +}; +#endif diff --git a/keyboards/6lit/6lit.h b/keyboards/6lit/6lit.h new file mode 100644 index 000000000000..ae0beea35d0e --- /dev/null +++ b/keyboards/6lit/6lit.h @@ -0,0 +1,55 @@ +/* Copyright 2018 + * + * 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 + +#include "quantum.h" +#define ________ KC_NO + +#ifndef FLIP_HALF +#define LAYOUT_split( \ + L00, L01, L02, R00, R01, R02, \ + L10, L11, L12, R10, R11, R12 \ +) { \ + { L00, L01, L02 }, \ + { L10, L11, L12 }, \ + { R02, R01, R00 }, \ + { R12, R11, R10 }, \ +} +#else +#define LAYOUT_split( \ + L00, L01, L02, R00, R01, R02, \ + L10, L11, L12, R10, R11, R12 \ +) { \ + { L00, L01, L02 }, \ + { L10, L11, L12 }, \ + { R00, R01, R02 }, \ + { R10, R11, R12 }, \ +} +#endif + +#define LAYOUT_macro( \ + L00, L01, L02, \ + L10, L11, L12 \ +) { \ + { L00, L01, L02 }, \ + { L10, L11, L12 }, \ +} + +#define LAYOUT LAYOUT_macro + +#ifdef USE_I2C + #error "I2C not Supported" +#endif diff --git a/keyboards/6lit/config.h b/keyboards/6lit/config.h new file mode 100644 index 000000000000..8397818a6156 --- /dev/null +++ b/keyboards/6lit/config.h @@ -0,0 +1,230 @@ +/* Copyright 2018 + * + * 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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0A0C +#define DEVICE_VER 0x0F61 +#define MANUFACTURER di0ib +#define PRODUCT The 6lit Macropad +#define DESCRIPTION A split 12 key Macropad + +#define USE_SERIAL + +/* Select hand configuration */ +#define MASTER_LEFT +//#define MASTER_RIGHT +//#define EE_HANDS + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 2*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 { D7, E6 } +#define MATRIX_COL_PINS { F6, F7, B1 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + +// #define RGB_DI_PIN E2 +// #ifdef RGB_DI_PIN +// #define RGBLIGHT_ANIMATIONS +// #define RGBLED_NUM 16 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 +// #endif + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ diff --git a/keyboards/6lit/info.json b/keyboards/6lit/info.json new file mode 100644 index 000000000000..ce1a7d6e16cc --- /dev/null +++ b/keyboards/6lit/info.json @@ -0,0 +1,23 @@ +{ + "keyboard_name": "6lit", + "url": "", + "maintainer": "qmk", + "width": 6, + "height": 2, + "layouts": { + "LAYOUT_macro": { + "key_count": 6, + "layout": [ + {"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, + {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1} + ] + }, + "LAYOUT_split": { + "key_count": 12, + "layout": [ + {"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, + {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1} + ] + } + } +} diff --git a/keyboards/6lit/keymaps/default/config.h b/keyboards/6lit/keymaps/default/config.h new file mode 100644 index 000000000000..6173b63272f6 --- /dev/null +++ b/keyboards/6lit/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 + * + * 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 + +// place overrides here diff --git a/keyboards/6lit/keymaps/default/keymap.c b/keyboards/6lit/keymaps/default/keymap.c new file mode 100644 index 000000000000..6864c72f7863 --- /dev/null +++ b/keyboards/6lit/keymaps/default/keymap.c @@ -0,0 +1,39 @@ +/* Copyright 2018 + * + * 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 QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_split( /* Base */ + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, \ + KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24 \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/6lit/keymaps/default/readme.md b/keyboards/6lit/keymaps/default/readme.md new file mode 100644 index 000000000000..b3acc3f58a93 --- /dev/null +++ b/keyboards/6lit/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default split keymap for 6lit diff --git a/keyboards/6lit/keymaps/macro/config.h b/keyboards/6lit/keymaps/macro/config.h new file mode 100644 index 000000000000..6173b63272f6 --- /dev/null +++ b/keyboards/6lit/keymaps/macro/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 + * + * 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 + +// place overrides here diff --git a/keyboards/6lit/keymaps/macro/keymap.c b/keyboards/6lit/keymaps/macro/keymap.c new file mode 100644 index 000000000000..6b10ac1330cc --- /dev/null +++ b/keyboards/6lit/keymaps/macro/keymap.c @@ -0,0 +1,39 @@ +/* Copyright 2018 + * + * 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 QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_macro( /* Base */ + KC_F19, KC_F20, KC_F21, \ + KC_F22, KC_F23, KC_F24 \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/6lit/keymaps/macro/readme.md b/keyboards/6lit/keymaps/macro/readme.md new file mode 100644 index 000000000000..9f883b821c8d --- /dev/null +++ b/keyboards/6lit/keymaps/macro/readme.md @@ -0,0 +1 @@ +# The default single board macro keymap for 6lit diff --git a/keyboards/6lit/readme.md b/keyboards/6lit/readme.md new file mode 100644 index 000000000000..d5b210028550 --- /dev/null +++ b/keyboards/6lit/readme.md @@ -0,0 +1,17 @@ +# 6lit + +![6lit](https://1.bp.blogspot.com/-Pa8RgYZ0hy8/Wbmr4bjuV0I/AAAAAAACDbI/WLKQMDlcDVAVf1lAIRMN51usR1XcCCVNgCLcBGAs/s1600/a.JPG) + +6 key macropad that fits within the 100mm x 100mm PCB size. Can be used singly as a regular 6 key macropad as well. + +* [The original TMK firmware](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/6lit) + +Keyboard Maintainer: QMK Community +Hardware Supported: 6lit PCB +Hardware Availability: [6lit project on 40% Keyboards](http://www.40percent.club/2017/09/6lit.html) + +Make example for this keyboard (after setting up your build environment): + + make 6lit:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/6lit/rules.mk b/keyboards/6lit/rules.mk new file mode 100644 index 000000000000..3275651650c3 --- /dev/null +++ b/keyboards/6lit/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 + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = lite # 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 +# 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 = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +# Enable generic behavior for split boards +SPLIT_KEYBOARD = yes From 4636f0f623c71f1eda8628cbae4784fe08a8faf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Tue, 6 Nov 2018 06:34:54 +0100 Subject: [PATCH 361/505] Remove ALTG(kc) as it's misleading and is not actually AltGr (#4338) * Remove ALTG(kc) as it's misleading and is not actually AltGr * Add temporary alias for ALGR in keyboards/planck/keymaps/pevecyan/keymap.c --- docs/feature_advanced_keycodes.md | 1 - docs/keycodes.md | 1 - keyboards/planck/keymaps/pevecyan/keymap.c | 2 ++ quantum/keymap_extras/keymap_slovenian.h | 30 ++++++++++++---------- quantum/quantum_keycodes.h | 1 - 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index f2e4909d861b..f9a5c3980625 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -73,7 +73,6 @@ These allow you to combine a modifier with a keycode. When pressed, the keydown |`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc`| |`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` | |`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` | -|`ALTG(kc)`| |Hold Right Control and Alt and press `kc` | |`SGUI(kc)`|`SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and GUI and press `kc` | |`LCA(kc)` | |Hold Left Control and Alt and press `kc` | diff --git a/docs/keycodes.md b/docs/keycodes.md index 6676bb53c9f5..e5d35b2b4af3 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -333,7 +333,6 @@ This is a reference only. Each group of keys links to the page documenting their |`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI and press `kc`| |`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` | |`LCAG(kc)`| |Hold Left Control, Alt and GUI and press `kc` | -|`ALTG(kc)`| |Hold Right Control and Alt and press `kc` | |`SGUI(kc)`|`SCMD(kc)`, `SWIN(kc)`|Hold Left Shift and GUI and press `kc` | |`LCA(kc)` | |Hold Left Control and Alt and press `kc` | diff --git a/keyboards/planck/keymaps/pevecyan/keymap.c b/keyboards/planck/keymaps/pevecyan/keymap.c index 4d76f09b0a53..57f9f0e7f9c9 100644 --- a/keyboards/planck/keymaps/pevecyan/keymap.c +++ b/keyboards/planck/keymaps/pevecyan/keymap.c @@ -20,6 +20,8 @@ #include "muse.h" #include "keymap_slovenian.h" +#define ALTG(kc) ALGR(kc) // FIXME: Remove this + extern keymap_config_t keymap_config; enum planck_layers { diff --git a/quantum/keymap_extras/keymap_slovenian.h b/quantum/keymap_extras/keymap_slovenian.h index a9db17becd8f..f27123c2a2ba 100644 --- a/quantum/keymap_extras/keymap_slovenian.h +++ b/quantum/keymap_extras/keymap_slovenian.h @@ -17,8 +17,12 @@ #ifndef KEYMAP_SLOVENIAN #define KEYMAP_SLOVENIAN + #include "keymap.h" +// Alt gr +#define ALGR(kc) RALT(kc) +#define SI_ALGR KC_RALT //Swapped Z and Y #define SI_Z KC_Y @@ -90,18 +94,18 @@ #define SI_UNDS LSFT(SI_MINS) // _ // Alt Gr-ed characters -#define SI_CIRC ALTG(KC_3) // ^ -#define SI_DEG ALTG(KC_5) // ° -#define SI_GRV ALTG(KC_7) // ` -#define SI_ACCU ALTG(KC_9) // ´ -#define SI_LCBR ALTG(KC_B) // { -#define SI_RCBR ALTG(KC_N) // } -#define SI_LBRC ALTG(KC_F) // [ -#define SI_RBRC ALTG(KC_G) // ] -#define SI_BSLS ALTG(KC_Q) // backslash -#define SI_AT ALTG(KC_V) // @ -#define SI_EURO ALTG(KC_E) // € -#define SI_TILD ALTG(KC_1) // ~ -#define SI_PIPE ALTG(KC_W) // | +#define SI_CIRC ALGR(KC_3) // ^ +#define SI_DEG ALGR(KC_5) // ° +#define SI_GRV ALGR(KC_7) // ` +#define SI_ACCU ALGR(KC_9) // ´ +#define SI_LCBR ALGR(KC_B) // { +#define SI_RCBR ALGR(KC_N) // } +#define SI_LBRC ALGR(KC_F) // [ +#define SI_RBRC ALGR(KC_G) // ] +#define SI_BSLS ALGR(KC_Q) // backslash +#define SI_AT ALGR(KC_V) // @ +#define SI_EURO ALGR(KC_E) // € +#define SI_TILD ALGR(KC_1) // ~ +#define SI_PIPE ALGR(KC_W) // | #endif diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index e983798f2ba6..53fece21cce2 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -475,7 +475,6 @@ enum quantum_keycodes { #define HYPR(kc) (QK_LCTL | QK_LSFT | QK_LALT | QK_LGUI | (kc)) #define MEH(kc) (QK_LCTL | QK_LSFT | QK_LALT | (kc)) #define LCAG(kc) (QK_LCTL | QK_LALT | QK_LGUI | (kc)) -#define ALTG(kc) (QK_RCTL | QK_RALT | (kc)) #define SGUI(kc) (QK_LGUI | QK_LSFT | (kc)) #define SCMD(kc) SGUI(kc) #define SWIN(kc) SGUI(kc) From 672926562519c1ee7370b3ef188c11525de326e5 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 5 Nov 2018 21:35:16 -0800 Subject: [PATCH 362/505] Clarify the Mod Tap defines in documentation (#4352) * Fix up Mod Tap settings keys * Change link names * permissive hold wordsmith Co-Authored-By: drashna * ignore mod tap wordsmithing Co-Authored-By: drashna * grammar fix Co-Authored-By: drashna * wordsmithing Co-Authored-By: drashna * word smithing Co-Authored-By: drashna --- docs/config_options.md | 9 +++-- docs/feature_advanced_keycodes.md | 62 +++++++++++++++++++++++-------- 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/docs/config_options.md b/docs/config_options.md index 19861c9d23c2..c4921c21d762 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -132,14 +132,15 @@ If you define these options you will enable the associated feature, which may in * `#define TAPPING_TOGGLE 2` * how many taps before triggering the toggle * `#define PERMISSIVE_HOLD` - * makes tap and hold keys work better for fast typers who don't want tapping term set above 500 + * makes tap and hold keys trigger the hold if another key is pressed before releasing, even if it hasn't hit the `TAPPING_TERM` * See [Permissive Hold](feature_advanced_keycodes.md#permissive-hold) for details * `#define IGNORE_MOD_TAP_INTERRUPT` - * makes it possible to do rolling combos (zx) with keys that convert to other keys on hold - * See [Mod tap interrupt](feature_advanced_keycodes.md#mod-tap-interrupt) for details + * makes it possible to do rolling combos (zx) with keys that convert to other keys on hold, by enforcing the `TAPPING_TERM` for both keys. + * See [Mod tap interrupt](feature_advanced_keycodes.md#ignore-mod-tap-interrupt) for details * `#define TAPPING_FORCE_HOLD` * makes it possible to use a dual role key as modifier shortly after having been tapped - * See [Hold after tap](feature_advanced_keycodes.md#hold-after-tap) + * See [Hold after tap](feature_advanced_keycodes.md#tapping-force-hold) + * Breaks any Tap Toggle functionality (`TT` or the One Shot Tap Toggle) * `#define LEADER_TIMEOUT 300` * how long before the leader key times out * `#define ONESHOT_TIMEOUT 300` diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md index f9a5c3980625..bb5cb7419b4a 100644 --- a/docs/feature_advanced_keycodes.md +++ b/docs/feature_advanced_keycodes.md @@ -170,30 +170,56 @@ As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new #define PERMISSIVE_HOLD ``` -This makes it easier for fast typists to use dual-function keys. Without this, if you let go of a held key inside the tapping term, it won't register. +This makes tap and hold keys (like Mod Tap) work better for fast typist, or for high `TAPPING_TERM` settings. -Example: (Tapping Term = 200ms) +If you press a Mod Tap key, tap another key (press and release) and then release the Mod Tap key, all within the tapping term, it will output the "tapping" function for both keys. -- SHFT_T(KC_A) Down -- KC_X Down -- KC_X Up -- SHFT_T(KC_A) Up +For Instance: + +- `SHFT_T(KC_A)` Down +- `KC_X` Down +- `KC_X` Up +- `SHFT_T(KC_A)` Up + +Normally, if you do all this within the `TAPPING_TERM` (default: 200ms) this will be registered as `ax` by the firmware and host system. With permissive hold enabled, this modifies how this is handled by considering the Mod Tap keys as a Mod if another key is tapped, and would registered as `X` (`SHIFT`+`x`). + +?> If you have `Ignore Mod Tap Interrupt` enabled, as well, this will modify how both work. The regular key has the modifier added if the first key is released first or if both keys are held longer than the `TAPPING_TERM`. + +# Ignore Mod Tap Interrupt + +To enable this setting, add this to your `config.h`: + +```c +#define IGNORE_MOD_TAP_INTERRUPT +``` -With defaults, if above is typed within tapping term, this will emit `ax`. With permissive hold, if above is typed within tapping term, this will emit `X` (so, Shift+X). +Similar to Permissive Hold, this alters how the firmware processes input for fast typist. If you press a Mod Tap key, press another key, release the Mod Tap key, and then release the normal key, it would normally output the "tapping" function for both keys. This may not be desirable for rolling combo keys. -# Mod tap interrupt +Setting `Ignore Mod Tap Interrupt` requires holding both keys for the `TAPPING_TERM` to trigger the hold function (the mod). -When a dual role key used for a modifier is quickly followed by another keys, it is interpreted as held even before the tapping term elapsed. This is a problem if a key is used for example inside a rolling combo because the second key will be pressed before the first key is released. +For Instance: -For example, when trying to type the rolling combo "zx" and z being configured to send Ctrl when hold, z rapidly followed by x actually sends Ctrl-x. That's bad. +- `SHFT_T(KC_A)` Down +- `KC_X` Down +- `SHFT_T(KC_A)` Up +- `KC_X` Up -You can disable this behavior by defining `IGNORE_MOD_TAP_INTERRUPT` in `config.h`. +Normally, this would send `X` (`SHIFT`+`x`). With `Ignore Mod Tap Interrupt` enabled, holding both keys are required for the `TAPPING_TERM` to register the hold action. A quick tap will output `ax` in this case, while a hold on both will still output `X` (`SHIFT`+`x`). -Note that this only concerns modifiers and not layer switching keys. -# Hold after tap +?> __Note__: This only concerns modifiers and not layer switching keys. -When the user holds a key after tap, this repeats the tapped key rather to hold a modifier key. This allows to use auto repeat for the tapped key. If you prefer to hold a modifier instead, define `TAPPING_FORCE_HOLD` in `config.h`. +?> If you have `Permissive Hold` enabled, as well, this will modify how both work. The regular key has the modifier added if the first key is released first or if both keys are held longer than the `TAPPING_TERM`. + +# Tapping Force Hold + +To enable `tapping force hold`, add the following to your `config.h`: + +```c +#define TAPPING_FORCE_HOLD +``` + +When the user holds a key after tap, this repeats the tapped key rather to hold a modifier key. This allows to use auto repeat for the tapped key. Example: @@ -211,6 +237,12 @@ With `TAPPING_FORCE_HOLD`, the second press will be interpreted as a Shift, allo # Retro Tapping +To enable `retro tapping`, add the following to your `config.h`: + +```c +#define RETRO_TAPPING +``` + Holding and releasing a dual function key without pressing another key will result in nothing happening. With retro tapping enabled, releasing the key without pressing another will send the original keycode even if it is outside the tapping term. -For instance, holding and releasing `LT(2, KC_SPACE)` without hitting another key will result in nothing happening. With `RETRO_TAPPING` defined in your `config.h`, it will send `KC_SPACE`. +For instance, holding and releasing `LT(2, KC_SPACE)` without hitting another key will result in nothing happening. With this enabled, it will send `KC_SPACE` instead. From f2101cfb6a2270345fe6235d4c36e2e0d49db528 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 5 Nov 2018 21:36:26 -0800 Subject: [PATCH 363/505] Update to drashna keymaps (#4365) * Consistency fixes and more eeprom defaults * Handle setting Unicode mode on eeprom reset better * Unicode EEPROM hack * Re-enable permissive hold and ignore mod tap * Set unicode input mode * More unicode stuff * more haaaaaacks * Attempted RGB Cleanup * Fix compiler issue * Add GitLab CI config for personal compiling * Add avr gcc version to GitLab CI script * Add rgblight init to matrix init --- layouts/community/ergodox/drashna/keymap.c | 2 +- layouts/community/ortho_4x12/drashna/config.h | 2 +- layouts/community/ortho_4x12/drashna/keymap.c | 52 ++++++++++++------- users/drashna/.gitlab-ci.yml | 26 ++++++++++ users/drashna/config.h | 4 +- users/drashna/drashna.c | 40 +++++++++----- users/drashna/rgb_stuff.c | 35 ++++--------- 7 files changed, 98 insertions(+), 63 deletions(-) create mode 100644 users/drashna/.gitlab-ci.yml diff --git a/layouts/community/ergodox/drashna/keymap.c b/layouts/community/ergodox/drashna/keymap.c index 518eaf0348b0..360a2d9c6d05 100644 --- a/layouts/community/ergodox/drashna/keymap.c +++ b/layouts/community/ergodox/drashna/keymap.c @@ -40,7 +40,7 @@ bool skip_leds = false; KC_TAB, K01, K02, K03, K04, K05, TG(_DIABLO), TG(_DIABLO), K06, K07, K08, K09, K0A, KC_BSLS, \ KC_C1R3, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ KC_MLSF, CTL_T(K21), K22, K23, K24, K25, TG(_GAMEPAD), TG(_GAMEPAD), K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ - KC_GRV, OSM(MOD_MEH),OSM(MOD_LGUI),KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, UC_IRNY, \ + KC_GRV, OSM(MOD_MEH),OSM(MOD_LGUI),KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, UC_SHRG, \ OS_LALT, OS_LGUI, OS_RGUI, CTL_T(KC_ESCAPE), \ KC_HOME, KC_PGUP, \ LT(_LOWER, KC_SPACE),KC_BSPC, KC_END, KC_PGDN, KC_DEL, LT(_RAISE, KC_ENTER) \ diff --git a/layouts/community/ortho_4x12/drashna/config.h b/layouts/community/ortho_4x12/drashna/config.h index b4c780cc1163..f279651b63fb 100644 --- a/layouts/community/ortho_4x12/drashna/config.h +++ b/layouts/community/ortho_4x12/drashna/config.h @@ -18,7 +18,7 @@ #define RGB_MATRIX_KEYPRESSES // reacts to keypresses (will slow down matrix scan by a lot) // #define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (not recommened) // #define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects -#define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended +// #define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended // #define RGB_MATRIX_SKIP_FRAMES 1 // number of frames to skip when displaying animations (0 is full effect) if not defined defaults to 1 // #define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255 // #define EECONFIG_RGB_MATRIX (uint32_t *)16 diff --git a/layouts/community/ortho_4x12/drashna/keymap.c b/layouts/community/ortho_4x12/drashna/keymap.c index 108df693157d..2a9e32cc886f 100644 --- a/layouts/community/ortho_4x12/drashna/keymap.c +++ b/layouts/community/ortho_4x12/drashna/keymap.c @@ -17,6 +17,10 @@ #include QMK_KEYBOARD_H #include "drashna.h" +#ifdef RGB_MATRIX_ENABLE +extern bool g_suspend_state; +#endif + #ifdef BACKLIGHT_ENABLE enum planck_keycodes { BACKLIT = NEW_SAFE_RANGE, @@ -135,6 +139,15 @@ bool music_mask_user(uint16_t keycode) { #ifdef RGB_MATRIX_ENABLE +void suspend_power_down_keymap(void) +{ + rgb_matrix_set_suspend_state(true); +} + +void suspend_wakeup_init_keymap(void) +{ + rgb_matrix_set_suspend_state(false); +} void rgb_matrix_layer_helper (uint8_t red, uint8_t green, uint8_t blue, bool default_layer) { rgb_led led; @@ -152,25 +165,26 @@ void rgb_matrix_indicators_user(void) { uint8_t this_mod = get_mods(); uint8_t this_led = host_keyboard_leds(); uint8_t this_osm = get_oneshot_mods(); - - switch (biton32(layer_state)) { - case _RAISE: - rgb_matrix_layer_helper(0xFF, 0xFF, 0x00, false); break; - case _LOWER: - rgb_matrix_layer_helper(0x00, 0xFF, 0x00, false); break; - case _ADJUST: - rgb_matrix_layer_helper(0xFF, 0x00, 0x00, false); break; - default: - switch (biton32(default_layer_state)) { - case _QWERTY: - rgb_matrix_layer_helper(0x00, 0xFF, 0xFF, true); break; - case _COLEMAK: - rgb_matrix_layer_helper(0xFF, 0x00, 0xFF, true); break; - case _DVORAK: - rgb_matrix_layer_helper(0x00, 0xFF, 0x00, true); break; - case _WORKMAN: - rgb_matrix_layer_helper(0xD9, 0xA5, 0x21, true); break; - } + if (!g_suspend_state) { + switch (biton32(layer_state)) { + case _RAISE: + rgb_matrix_layer_helper(0xFF, 0xFF, 0x00, false); break; + case _LOWER: + rgb_matrix_layer_helper(0x00, 0xFF, 0x00, false); break; + case _ADJUST: + rgb_matrix_layer_helper(0xFF, 0x00, 0x00, false); break; + default: + switch (biton32(default_layer_state)) { + case _QWERTY: + rgb_matrix_layer_helper(0x00, 0xFF, 0xFF, true); break; + case _COLEMAK: + rgb_matrix_layer_helper(0xFF, 0x00, 0xFF, true); break; + case _DVORAK: + rgb_matrix_layer_helper(0x00, 0xFF, 0x00, true); break; + case _WORKMAN: + rgb_matrix_layer_helper(0xD9, 0xA5, 0x21, true); break; + } + } } switch (biton32(default_layer_state)) { diff --git a/users/drashna/.gitlab-ci.yml b/users/drashna/.gitlab-ci.yml new file mode 100644 index 000000000000..3c95ad850730 --- /dev/null +++ b/users/drashna/.gitlab-ci.yml @@ -0,0 +1,26 @@ +stages: + - build + +qmk_firmware: + stage: build + variables: + GIT_SUBMODULE_STRATEGY: recursive + tags: + - linux + image: ubuntu + before_script: + - apt-get update -qy + - apt-get install -y build-essential avr-libc binutils-arm-none-eabi binutils-avr dfu-programmer dfu-util diffutils gcc gcc-arm-none-eabi gcc-avr git libnewlib-arm-none-eabi unzip wget zip + - avr-gcc --version + script: + - make iris/rev2:drashna iris/rev2:drashna_old ergodox_ez:drashna viterbi/rev1:drashna orthodox/rev1:drashna orthodox/rev3:drashna crkbd:drashna planck/light:drashna + artifacts: + name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG" + paths: + - ./*.hex + - ./*.bin + only: + - master + - drashna_keymaps + - merge-requests + - branches diff --git a/users/drashna/config.h b/users/drashna/config.h index 9d7d20add034..7e6a7d1c8152 100644 --- a/users/drashna/config.h +++ b/users/drashna/config.h @@ -44,8 +44,8 @@ // and when this option isn't enabled, z rapidly followed by x // actually sends Ctrl-x. That's bad.) #define IGNORE_MOD_TAP_INTERRUPT -#undef PERMISSIVE_HOLD -// #define TAPPING_FORCE_HOLD +#define PERMISSIVE_HOLD +//#define TAPPING_FORCE_HOLD //#define RETRO_TAPPING #define FORCE_NKRO diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c index b2219e9aa745..4111d29314de 100644 --- a/users/drashna/drashna.c +++ b/users/drashna/drashna.c @@ -20,6 +20,12 @@ along with this program. If not, see . #include "rgb_stuff.h" userspace_config_t userspace_config; +#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) + #define DRASHNA_UNICODE_MODE UC_WIN +#else + // set to 2 for UC_WIN, set to 4 for UC_WINC + #define DRASHNA_UNICODE_MODE 2 +#endif uint16_t copy_paste_timer; // Helper Functions @@ -154,19 +160,18 @@ void matrix_init_user(void) { userspace_config.raw = eeconfig_read_user(); -#ifdef BOOTLOADER_CATERINA - DDRD &= ~(1<<5); - PORTD &= ~(1<<5); + #ifdef BOOTLOADER_CATERINA + DDRD &= ~(1<<5); + PORTD &= ~(1<<5); - DDRB &= ~(1<<0); - PORTB &= ~(1<<0); -#endif + DDRB &= ~(1<<0); + PORTB &= ~(1<<0); + #endif -#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) - if (eeprom_read_byte(EECONFIG_UNICODEMODE) != UC_WIN) { - set_unicode_input_mode(UC_WIN); - } -#endif //UNICODE_ENABLE + #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) + set_unicode_input_mode(DRASHNA_UNICODE_MODE); + get_unicode_input_mode(); + #endif //UNICODE_ENABLE matrix_init_keymap(); } @@ -266,9 +271,10 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader if (!record->event.pressed) { uint8_t temp_mod = get_mods(); - clear_mods(); + uint8_t temp_osm = get_oneshot_mods(); + clear_mods(); clear_oneshot_mods(); send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), 10); - if (temp_mod & MODS_SHIFT_MASK) { + if (temp_mod & MODS_SHIFT_MASK || temp_osm & MODS_SHIFT_MASK) { #if defined(__ARM__) send_string_with_delay_P(PSTR(":dfu-util"), 10); #elif defined(BOOTLOADER_DFU) @@ -282,7 +288,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #if defined(KEYBOARD_viterbi) send_string_with_delay_P(PSTR(":dfu"), 10); #endif - if (temp_mod & MODS_CTRL_MASK) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10); } + if (temp_mod & MODS_CTRL_MASK || temp_osm & MODS_CTRL_MASK) { send_string_with_delay_P(PSTR(" -j8 --output-sync"), 10); } send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), 10); set_mods(temp_mod); } @@ -422,4 +428,10 @@ void eeconfig_init_user(void) { userspace_config.raw = 0; userspace_config.rgb_layer_change = true; eeconfig_update_user(userspace_config.raw); + #if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)) + set_unicode_input_mode(DRASHNA_UNICODE_MODE); + get_unicode_input_mode(); + #else + eeprom_update_byte(EECONFIG_UNICODEMODE, DRASHNA_UNICODE_MODE); + #endif } diff --git a/users/drashna/rgb_stuff.c b/users/drashna/rgb_stuff.c index 9ad94c0c3d26..b6de4d39e53a 100644 --- a/users/drashna/rgb_stuff.c +++ b/users/drashna/rgb_stuff.c @@ -12,14 +12,6 @@ void rgblight_sethsv_default_helper(uint8_t index) { #endif // RGBLIGHT_ENABLE #ifdef INDICATOR_LIGHTS -uint8_t last_mod; -uint8_t last_led; -uint8_t last_osm; -uint8_t current_mod; -uint8_t current_led; -uint8_t current_osm; - - void set_rgb_indicators(uint8_t this_mod, uint8_t this_led, uint8_t this_osm) { if (userspace_config.rgb_layer_change && biton32(layer_state) == 0) { if (this_mod & MODS_SHIFT_MASK || this_led & (1< Date: Mon, 5 Nov 2018 21:38:18 -0800 Subject: [PATCH 364/505] Add EEPROM_RESET keycode to core code (#4234) * Add EEPROM Reset keycode * Add keycode to docs * Move EEPROM Reset code to the end of the enum * Cleanup and naming change --- docs/quantum_keycodes.md | 25 +++++++++++++------------ quantum/quantum.c | 5 +++++ quantum/quantum_keycodes.h | 4 ++++ 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/docs/quantum_keycodes.md b/docs/quantum_keycodes.md index 1d7fc0e12706..90192e632410 100644 --- a/docs/quantum_keycodes.md +++ b/docs/quantum_keycodes.md @@ -8,15 +8,16 @@ On this page we have documented keycodes between `0x00FF` and `0xFFFF` which are ## QMK Keycodes -|Key |Aliases |Description | -|-------------|-----------|---------------------------------------------------------------------| -|`RESET` | |Put the keyboard into DFU mode for flashing | -|`DEBUG` | |Toggle debug mode | -|`KC_GESC` |`GRAVE_ESC`|Escape when tapped, ` when pressed with Shift or GUI| -|`KC_LSPO` | |Left Shift when held, `(` when tapped | -|`KC_RSPC` | |Right Shift when held, `)` when tapped | -|`KC_LEAD` | |The [Leader key](feature_leader_key.md) | -|`KC_LOCK` | |The [Lock key](feature_key_lock.md) | -|`FUNC(n)` |`F(n)` |Call `fn_action(n)` (deprecated) | -|`M(n)` | |Call macro `n` | -|`MACROTAP(n)`| |Macro-tap `n` idk FIXME | +|Key |Aliases |Description | +|---------------|-----------|---------------------------------------------------------------------| +|`RESET` | |Put the keyboard into DFU mode for flashing | +|`DEBUG` | |Toggle debug mode | +|`EEPROM_RESET` |`EEP_RST` |Resets EEPROM state by reinitializing it | +|`KC_GESC` |`GRAVE_ESC`|Escape when tapped, ` when pressed with Shift or GUI| +|`KC_LSPO` | |Left Shift when held, `(` when tapped | +|`KC_RSPC` | |Right Shift when held, `)` when tapped | +|`KC_LEAD` | |The [Leader key](feature_leader_key.md) | +|`KC_LOCK` | |The [Lock key](feature_key_lock.md) | +|`FUNC(n)` |`F(n)` |Call `fn_action(n)` (deprecated) | +|`M(n)` | |Call macro `n` | +|`MACROTAP(n)` | |Macro-tap `n` idk FIXME | diff --git a/quantum/quantum.c b/quantum/quantum.c index 5f1a691c8841..69692233ebe4 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -298,6 +298,11 @@ bool process_record_quantum(keyrecord_t *record) { print("DEBUG: enabled.\n"); } return false; + case EEPROM_RESET: + if (record->event.pressed) { + eeconfig_init(); + } + return false; #ifdef FAUXCLICKY_ENABLE case FC_TOG: if (record->event.pressed) { diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 53fece21cce2..14f8c2b812a9 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -454,6 +454,8 @@ enum quantum_keycodes { TERM_OFF, #endif + EEPROM_RESET, + // always leave at the end SAFE_RANGE }; @@ -569,6 +571,8 @@ enum quantum_keycodes { #define KC_GESC GRAVE_ESC +#define EEP_RST EEPROM_RESET + #define CK_TOGG CLICKY_TOGGLE #define CK_RST CLICKY_RESET #define CK_UP CLICKY_UP From 26a201e6875e82c623c136eccf937b511199c701 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sun, 28 Oct 2018 09:18:41 -0700 Subject: [PATCH 365/505] fix example to reflect caveat --- docs/feature_combo.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/feature_combo.md b/docs/feature_combo.md index 5bb73ef10677..05ffc0d72577 100644 --- a/docs/feature_combo.md +++ b/docs/feature_combo.md @@ -44,15 +44,15 @@ For a more complicated implementation, you can use the `process_combo_event` fun ```c enum combo_events { ZC_COPY, - ZV_PASTE + XV_PASTE }; const uint16_t PROGMEM copy_combo[] = {KC_Z, KC_C, COMBO_END}; -const uint16_t PROGMEM paste_combo[] = {KC_Z, KC_V, COMBO_END}; +const uint16_t PROGMEM paste_combo[] = {KC_X, KC_V, COMBO_END}; combo_t key_combos[COMBO_COUNT] = { [ZC_COPY] = COMBO_ACTION(copy_combo), - [ZV_PASTE] = COMBO_ACTION(paste_combo), + [XV_PASTE] = COMBO_ACTION(paste_combo), }; void process_combo_event(uint8_t combo_index, bool pressed) { @@ -66,7 +66,7 @@ void process_combo_event(uint8_t combo_index, bool pressed) { } break; - case ZV_PASTE: + case XV_PASTE: if (pressed) { register_code(KC_LCTL); register_code(KC_V); @@ -78,7 +78,7 @@ void process_combo_event(uint8_t combo_index, bool pressed) { } ``` -This will send Ctrl+C if you hit Z and C, and Ctrl+V if you hit Z and V. But you could change this to do stuff like change layers, play sounds, or change settings. +This will send Ctrl+C if you hit Z and C, and Ctrl+V if you hit X and V. But you could change this to do stuff like change layers, play sounds, or change settings. ## Additional Configuration From 4a033641dff0cbf430a5005d6d6c1e5b8c4b540c Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sun, 28 Oct 2018 09:29:18 -0700 Subject: [PATCH 366/505] Update Features page to reflect all of the features linked in the sidebar/summary --- docs/features.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/features.md b/docs/features.md index 537e1061cdd3..43d972e68961 100644 --- a/docs/features.md +++ b/docs/features.md @@ -8,13 +8,17 @@ QMK has a staggering number of features for building your keyboard. It can take * [Auto Shift](feature_auto_shift.md) - Tap for the normal key, hold slightly longer for its shifted state. * [Backlight](feature_backlight.md) - LED lighting support for your keyboard. * [Bootmagic](feature_bootmagic.md) - Adjust the behavior of your keyboard using hotkeys. +* [Combos](feature_combos.md) - Custom actions for multiple key holds. +* [Command](feature_command.md) - Runtime version of bootmagic (Formerly known as "Magic"). * [Dynamic Macros](feature_dynamic_macros.md) - Record and playback macros from the keyboard itself. +* [Grave Escape](feature_grave_esc.md) - Lets you use a single key for Esc and Grave. * [HD44780 LCD Display](feature_hd44780.md) - Support for LCD character displays using the HD44780 standard. * [Key Lock](feature_key_lock.md) - Lock a key in the "down" state. * [Layouts](feature_layouts.md) - Use one keymap with any keyboard that supports your layout. * [Leader Key](feature_leader_key.md) - Tap the leader key followed by a sequence to trigger custom behavior. * [Macros](feature_macros.md) - Send multiple key presses when pressing only one physical key. * [Mouse keys](feature_mouse_keys.md) - Control your mouse pointer from your keyboard. +* [One Shot Keys](feature_advanced_keycodes.md#one-shot-keys) - Sticky Keys, lets hit a key rather than holding it. * [Pointing Device](feature_pointing_device.md) - Framework for connecting your custom pointing device to your keyboard. * [PS2 Mouse](feature_ps2_mouse.md) - Driver for connecting a PS/2 mouse directly to your keyboard. * [RGB Light](feature_rgblight.md) - RGB lighting for your keyboard. From ec34b5386455a4170db97aad21dc50b77d6ddfdd Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 29 Oct 2018 15:07:38 -0700 Subject: [PATCH 367/505] Fixe line endings --- keyboards/qwertyydox/rules.mk | 138 +++++++++++++++++----------------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/keyboards/qwertyydox/rules.mk b/keyboards/qwertyydox/rules.mk index d04a4b9f3003..8c6171bc0057 100644 --- a/keyboards/qwertyydox/rules.mk +++ b/keyboards/qwertyydox/rules.mk @@ -1,69 +1,69 @@ -# 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) - -# Bootloader -# This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded -# automatically (+60). See bootloader.mk for all options. -BOOTLOADER = caterina - -# Interrupt driven control endpoint task(+60) -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT - -# 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 = no # 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 = 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. -SUBPROJECT_rev1 = yes -USE_I2C = yes # I2C is used between the sides -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend - -SPLIT_KEYBOARD = yes - -DEFAULT_FOLDER = qwertyydox/rev1 +# 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) + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = caterina + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# 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 = no # 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 = 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. +SUBPROJECT_rev1 = yes +USE_I2C = yes # I2C is used between the sides +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +SPLIT_KEYBOARD = yes + +DEFAULT_FOLDER = qwertyydox/rev1 From 40313cfa3b4a4f1643382f0446e0a889ef3e76dc Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 30 Oct 2018 18:00:43 -0700 Subject: [PATCH 368/505] Fix Terminal feature on ChibiOS --- common_features.mk | 1 + tmk_core/common.mk | 4 +++- tmk_core/common/print.h | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/common_features.mk b/common_features.mk index f44dfc47de1f..8f53a82aaeca 100644 --- a/common_features.mk +++ b/common_features.mk @@ -213,6 +213,7 @@ endif ifeq ($(strip $(TERMINAL_ENABLE)), yes) SRC += $(QUANTUM_DIR)/process_keycode/process_terminal.c OPT_DEFS += -DTERMINAL_ENABLE + OPT_DEFS += -DUSER_PRINT endif ifeq ($(strip $(USB_HID_ENABLE)), yes) diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 3844b13d48db..65dcf96f6614 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -43,9 +43,11 @@ ifeq ($(PLATFORM),CHIBIOS) TMK_COMMON_DEFS += -DSTM32_EEPROM_ENABLE else TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/eeprom_teensy.c -endif + endif ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes) TMK_COMMON_SRC += $(CHIBIOS)/os/various/syscalls.c + else ifeq($(strip $(TERMINAL_ENABLE)), yes) + TMK_COMMON_SRC += $(CHIBIOS)/os/various/syscalls.c endif endif diff --git a/tmk_core/common/print.h b/tmk_core/common/print.h index d9452765725d..06c6cbd7f166 100644 --- a/tmk_core/common/print.h +++ b/tmk_core/common/print.h @@ -73,7 +73,9 @@ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t)); #elif defined(PROTOCOL_CHIBIOS) /* PROTOCOL_CHIBIOS */ +#ifndef TERMINAL_ENABLE # include "chibios/printf.h" +#endif # ifdef USER_PRINT /* USER_PRINT */ From 73e634482ea8f57d1f1a5f1e16bc3ffd74f84b8e Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 30 Oct 2018 18:03:46 -0700 Subject: [PATCH 369/505] command.h include was not set correctly --- tmk_core/common/command.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tmk_core/common/command.h b/tmk_core/common/command.h index d9d89ba0f1ec..c38f2b9e809d 100644 --- a/tmk_core/common/command.h +++ b/tmk_core/common/command.h @@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef COMMAND_H -#define COMMAND +#pragma once /* FIXME: Add doxygen comments for the behavioral defines in here. */ @@ -155,5 +154,3 @@ bool command_proc(uint8_t code); #define XMAGIC_KC(key) KC_##key #define MAGIC_KC(key) XMAGIC_KC(key) - -#endif From 1b3ac77fec9817aad30f8d70f063d3b1eba42403 Mon Sep 17 00:00:00 2001 From: tcatkins99 Date: Tue, 6 Nov 2018 11:06:50 -0500 Subject: [PATCH 370/505] mapdev's Espectro layout (#4366) * Add mapdev layout to espectro * Add mapdev layout to espectro * - Update MO Co-Authored-By: tcatkins99 --- keyboards/espectro/keymaps/mapdev/keymap.c | 88 ++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 keyboards/espectro/keymaps/mapdev/keymap.c diff --git a/keyboards/espectro/keymaps/mapdev/keymap.c b/keyboards/espectro/keymaps/mapdev/keymap.c new file mode 100644 index 000000000000..bbd791582da5 --- /dev/null +++ b/keyboards/espectro/keymaps/mapdev/keymap.c @@ -0,0 +1,88 @@ +/* + * 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 QMK_KEYBOARD_H +#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)) + +#define _BL 0 //Base layer +#define _FN1 1 //Function layer + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* BL +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | | | | | | +| ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | P SCN | HOME | END | P UP | P DOWN | DEL | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | | | | | | | | | | | | | BACK | NUM | | | | +| ~` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ - | = + | SPACE | LOCK | / | * | - | +|________|________|________|________|________|________|________|________|________|________|________|________|________|_________________|________|________|________|________| +| | | | | | | | | | | | [ | ] | | | | | | +| TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | | \ | 7 | 8 | 9 | | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|_____________|________|________|________| + | +| | | | | | | | | | | ; | ' | | | | | | +| CAPS LOCK | A | S | D | F | G | H | J | K | L | : | " | ENTER | 4 | 5 | 6 | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | , | . | / | | | | | | | +| SHIFT | Z | X | C | V | B | N | M | < | > | ? | SHIFT | UP | 1 | 2 | 3 | | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| ENTER | +| | | | | | | MO | | | | | | | +| CTRL | LGUI | L ALT | SPACE | R ALT | R CTRL | _FN | LEFT | DOWN | RIGHT | 0 | . | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| + */ + + [_BL] = LAYOUT_default( + 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_HOME, KC_END, KC_PGUP, KC_PGDN, + 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_DEL, 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_P7, KC_P8, KC_P9, KC_PPLS, + 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_P4, KC_P5, KC_P6, + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, + MO(_FN1), KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, _______, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT + ), + +/* FN_1 +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | VOL | VOL | NEXT | | | +| RESET | | | | | | | | | | | | | MUTE | DOWN | UP | TRACK | HOME | END | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | RGB | RGB | RGB | RGB | RGB | RGB | RGB | RGB | | | | | | | | | | +| | TOGGLE | MODE |INCREASE|DECREASE| HUE | HUE | SAT | | | | | | DELETE | | | | | +|________|________|________|________|________|INCREASE|DECREASE|INCREASE|DECREASE|________|________|________|________|_________________|________|________|________|________| +| | BACK | BACK | | | | | | | | | | | | | | | | +| | LIGHT | LIGHT | | | | | | | | | | | | | | | | +|____________| TOGGLE |INCREASE|DECREASE|________|________|________|________|________|________|________|________|________|_____________|________|________|________| | +| | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | +|______________|________|________|________|________|________|________|________|________|________|________|________|____________________|________|________|________|________| +| | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | +|__________________|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| | +| | | | | | | | | | | | | | +| | | | | | | | | | | | | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| + */ + + [_FN1] = LAYOUT_default( + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, KC_END, _______, _______, _______, + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, + _______, BL_TOGG, BL_INC, BL_DEC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +}; + From 388df5359b913eaf1ce6fb0ef624e430ad010ea5 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 6 Nov 2018 01:31:56 -0800 Subject: [PATCH 371/505] Fix Spacing issue in makefile that breaks Terminal config --- tmk_core/common.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 65dcf96f6614..8eac1734f413 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -46,7 +46,7 @@ ifeq ($(PLATFORM),CHIBIOS) endif ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes) TMK_COMMON_SRC += $(CHIBIOS)/os/various/syscalls.c - else ifeq($(strip $(TERMINAL_ENABLE)), yes) + else ifeq ($(strip $(TERMINAL_ENABLE)), yes) TMK_COMMON_SRC += $(CHIBIOS)/os/various/syscalls.c endif endif From 63e212c0b78be664785433c11cd728f15f50cd6a Mon Sep 17 00:00:00 2001 From: Sean Dwyer Date: Tue, 6 Nov 2018 11:54:53 -0800 Subject: [PATCH 372/505] Add localized LED flash effect on keypress to Massdrop ALT (#4340) --- .../massdrop/alt/keymaps/reywood/keymap.c | 195 ++++++++++++++++++ .../alt/keymaps/reywood/rgb_matrix_user.c | 193 +++++++++++++++++ .../alt/keymaps/reywood/rgb_matrix_user.h | 3 + .../massdrop/alt/keymaps/reywood/rules.mk | 34 +++ tmk_core/protocol/arm_atsam/led_matrix.c | 14 +- tmk_core/protocol/arm_atsam/led_matrix.h | 3 +- 6 files changed, 438 insertions(+), 4 deletions(-) create mode 100644 keyboards/massdrop/alt/keymaps/reywood/keymap.c create mode 100644 keyboards/massdrop/alt/keymaps/reywood/rgb_matrix_user.c create mode 100644 keyboards/massdrop/alt/keymaps/reywood/rgb_matrix_user.h create mode 100644 keyboards/massdrop/alt/keymaps/reywood/rules.mk diff --git a/keyboards/massdrop/alt/keymaps/reywood/keymap.c b/keyboards/massdrop/alt/keymaps/reywood/keymap.c new file mode 100644 index 000000000000..8b69f0e8ebbb --- /dev/null +++ b/keyboards/massdrop/alt/keymaps/reywood/keymap.c @@ -0,0 +1,195 @@ +#include QMK_KEYBOARD_H +#include "rgb_matrix_user.h" + +enum alt_keycodes { + L_BRI = SAFE_RANGE, //LED Brightness Increase + L_BRD, //LED Brightness Decrease + L_PTN, //LED Pattern Select Next + L_PTP, //LED Pattern Select Previous + L_PSI, //LED Pattern Speed Increase + L_PSD, //LED Pattern Speed Decrease + L_T_MD, //LED Toggle Mode + L_T_ONF, //LED Toggle On / Off + L_ON, //LED On + L_OFF, //LED Off + L_T_BR, //LED Toggle Breath Effect + L_T_PTD, //LED Toggle Scrolling Pattern Direction + U_T_AUTO, //USB Extra Port Toggle Auto Detect / Always Active + U_T_AGCR, //USB Toggle Automatic GCR control + DBG_TOG, //DEBUG Toggle On / Off + DBG_MTRX, //DEBUG Toggle Matrix Prints + DBG_KBD, //DEBUG Toggle Keyboard Prints + DBG_MOU, //DEBUG Toggle Mouse Prints + MD_BOOT, //Restart into bootloader after hold timeout +}; + +#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode +#define ______ KC_TRNS + +keymap_config_t keymap_config; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + 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_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_HOME, \ + 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_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RGHT \ + ), + [1] = LAYOUT( + 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_MUTE, \ + _______, _______, _______, KC_UP, _______, _______, _______, U_T_AUTO,U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_END, \ + _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, MD_BOOT, TG_NKRO, _______, _______, _______, _______, _______, KC_VOLU, _______, \ + _______, _______, _______, KC_MPLY, MO(2), _______, KC_MRWD, KC_VOLD, KC_MFFD \ + ), + [2] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + L_T_BR, L_PSD, L_BRI, L_PSI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + L_T_PTD, L_PTP, L_BRD, L_PTN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, L_T_MD, L_T_ONF, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ), +}; + +const uint16_t PROGMEM fn_actions[] = { + +}; + +// 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) { +}; + +#define MODS_SHIFT (keyboard_report->mods & MOD_BIT(KC_LSHIFT) || keyboard_report->mods & MOD_BIT(KC_RSHIFT)) +#define MODS_CTRL (keyboard_report->mods & MOD_BIT(KC_LCTL) || keyboard_report->mods & MOD_BIT(KC_RCTRL)) +#define MODS_ALT (keyboard_report->mods & MOD_BIT(KC_LALT) || keyboard_report->mods & MOD_BIT(KC_RALT)) + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + static uint32_t key_timer; + + rgb_matrix_record_key_press(record); + + switch (keycode) { + case L_BRI: + if (record->event.pressed) { + if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX; + else gcr_desired += LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_BRD: + if (record->event.pressed) { + if (LED_GCR_STEP > gcr_desired) gcr_desired = 0; + else gcr_desired -= LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_PTN: + if (record->event.pressed) { + if (led_animation_id == led_setups_count - 1) led_animation_id = 0; + else led_animation_id++; + } + return false; + case L_PTP: + if (record->event.pressed) { + if (led_animation_id == 0) led_animation_id = led_setups_count - 1; + else led_animation_id--; + } + return false; + case L_PSI: + if (record->event.pressed) { + led_animation_speed += ANIMATION_SPEED_STEP; + } + return false; + case L_PSD: + if (record->event.pressed) { + led_animation_speed -= ANIMATION_SPEED_STEP; + if (led_animation_speed < 0) led_animation_speed = 0; + } + return false; + case L_T_MD: + if (record->event.pressed) { + led_lighting_mode++; + if (led_lighting_mode > LED_MODE_MAX_INDEX) led_lighting_mode = LED_MODE_NORMAL; + } + return false; + case L_T_ONF: + if (record->event.pressed) { + led_enabled = !led_enabled; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_ON: + if (record->event.pressed) { + led_enabled = 1; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_OFF: + if (record->event.pressed) { + led_enabled = 0; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_T_BR: + if (record->event.pressed) { + led_animation_breathing = !led_animation_breathing; + if (led_animation_breathing) { + gcr_breathe = gcr_desired; + led_animation_breathe_cur = BREATHE_MIN_STEP; + breathe_dir = 1; + } + } + return false; + case L_T_PTD: + if (record->event.pressed) { + led_animation_direction = !led_animation_direction; + } + return false; + case U_T_AUTO: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); + } + return false; + case U_T_AGCR: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); + } + return false; + case DBG_TOG: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); + } + return false; + case DBG_MTRX: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); + } + return false; + case DBG_KBD: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); + } + return false; + case DBG_MOU: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); + } + return false; + case MD_BOOT: + if (record->event.pressed) { + key_timer = timer_read32(); + } else { + if (timer_elapsed32(key_timer) >= 500) { + reset_keyboard(); + } + } + return false; + default: + return true; //Process all other keycodes normally + } +} diff --git a/keyboards/massdrop/alt/keymaps/reywood/rgb_matrix_user.c b/keyboards/massdrop/alt/keymaps/reywood/rgb_matrix_user.c new file mode 100644 index 000000000000..36131e20209b --- /dev/null +++ b/keyboards/massdrop/alt/keymaps/reywood/rgb_matrix_user.c @@ -0,0 +1,193 @@ +#include "quantum.h" +#include "led_matrix.h" + +extern issi3733_led_t *led_cur; +extern uint8_t led_per_run; +extern issi3733_led_t *lede; +extern issi3733_led_t led_map[]; + +static uint16_t last_boost_update; +static uint8_t led_boosts[ISSI3733_LED_COUNT]; +static uint8_t led_boost_index; +static uint8_t led_cur_index; + +#define LED_BOOST_REFRESH_INTERVAL_IN_MS 40 +#define LED_BOOST_DECAY 0.7 +#define LED_BOOST_PROPAGATE 0.5 +#define LED_BOOST_PEAK 100 + +#define MIN_RGB 0x050008 +#define MIN_R (MIN_RGB >> 16 & 0xff) +#define MIN_G (MIN_RGB >> 8 & 0xff) +#define MIN_B (MIN_RGB & 0xff) + +#define MAX_RGB 0xc26eff +#define MAX_R (MAX_RGB >> 16 & 0xff) +#define MAX_G (MAX_RGB >> 8 & 0xff) +#define MAX_B (MAX_RGB & 0xff) + +#define UNDERGLOW_RGB 0x4f002e +#define UNDERGLOW_R (UNDERGLOW_RGB >> 16 & 0xff) +#define UNDERGLOW_G (UNDERGLOW_RGB >> 8 & 0xff) +#define UNDERGLOW_B (UNDERGLOW_RGB & 0xff) + +#define UNDERGLOW_SCAN_CODE 255 + +#define max(a, b) (((a) > (b)) ? (a) : (b)) + +#define __ -1 +static const uint8_t KEY_TO_LED_MAP[MATRIX_ROWS][MATRIX_COLS] = { + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}, + {15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}, + {30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, __, 42, 43}, + {44, __, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57}, + {58, 59, 60, __, __, __, 61, __, __, __, 62, 63, 64, 65, 66}, +}; + +#define KEY_LED_COUNT 67 +#define KP(c, r) { .col = c, .row = r } // shorthand for keypos_t +static const keypos_t LED_TO_KEY_MAP[KEY_LED_COUNT] = { + KP(0, 0), KP(1, 0), KP(2, 0), KP(3, 0), KP(4, 0), KP(5, 0), KP(6, 0), KP(7, 0), KP(8, 0), KP(9, 0), KP(10, 0), KP(11, 0), KP(12, 0), KP(13, 0), KP(14, 0), + KP(0, 1), KP(1, 1), KP(2, 1), KP(3, 1), KP(4, 1), KP(5, 1), KP(6, 1), KP(7, 1), KP(8, 1), KP(9, 1), KP(10, 1), KP(11, 1), KP(12, 1), KP(13, 1), KP(14, 1), + KP(0, 2), KP(1, 2), KP(2, 2), KP(3, 2), KP(4, 2), KP(5, 2), KP(6, 2), KP(7, 2), KP(8, 2), KP(9, 2), KP(10, 2), KP(11, 2), KP(13, 2), KP(14, 2), + KP(0, 3), KP(2, 3), KP(3, 3), KP(4, 3), KP(5, 3), KP(6, 3), KP(7, 3), KP(8, 3), KP(9, 3), KP(10, 3), KP(11, 3), KP(12, 3), KP(13, 3), KP(14, 3), + KP(0, 4), KP(1, 4), KP(2, 4), KP(6, 4), KP(10, 4), KP(11, 4), KP(12, 4), KP(13, 4), KP(14, 4), +}; + + +static void update_led_boosts(void); +static void update_led_cur_rgb_values(void); +static void set_nearest_led_to_max(uint8_t col, uint8_t row); +static uint8_t calculate_new_color_component_value(uint8_t max, uint8_t min); +static void calculate_new_led_boosts(uint8_t new_led_boosts[]); +static uint8_t calculate_new_led_boost_at(int index); +static uint8_t get_propagated_boost_from_neighbors(int led_position); +static uint8_t get_led_boost_at_keypos(uint8_t row, uint8_t col); +static void set_new_led_boosts(uint8_t* new_led_boosts); +static uint8_t map_key_position_to_led_index(uint8_t col, uint8_t row); + + +void rgb_matrix_init_user(void) { + for (int i = 0; i < ISSI3733_LED_COUNT; i++) { + led_boosts[i] = 0; + } + last_boost_update = timer_read(); + led_boost_index = 0; + led_cur_index = 0; +} + +void led_matrix_run(void) { + uint8_t led_this_run = 0; + + if (led_cur == 0) { //Denotes start of new processing cycle in the case of chunked processing + led_cur = led_map; + led_cur_index = 0; + } + update_led_boosts(); + + while (led_cur < lede && led_this_run < led_per_run) { + update_led_cur_rgb_values(); + + led_cur++; + led_cur_index++; + led_this_run++; + } +} + +void rgb_matrix_record_key_press(keyrecord_t *record) { + if (record->event.pressed) { + keypos_t key = record->event.key; + set_nearest_led_to_max(key.col, key.row); + } +} + + +static void update_led_boosts(void) { + if (timer_elapsed(last_boost_update) > LED_BOOST_REFRESH_INTERVAL_IN_MS) { + last_boost_update = timer_read(); + + uint8_t new_led_boosts[ISSI3733_LED_COUNT]; + calculate_new_led_boosts(new_led_boosts); + set_new_led_boosts(new_led_boosts); + } +} + +static void update_led_cur_rgb_values(void) { + if (led_cur->scan == UNDERGLOW_SCAN_CODE) { + *led_cur->rgb.r = UNDERGLOW_R; + *led_cur->rgb.g = UNDERGLOW_G; + *led_cur->rgb.b = UNDERGLOW_B; + } else { + *led_cur->rgb.r = calculate_new_color_component_value(MAX_R, MIN_R); + *led_cur->rgb.g = calculate_new_color_component_value(MAX_G, MIN_G); + *led_cur->rgb.b = calculate_new_color_component_value(MAX_B, MIN_B); + } +} + +static void set_nearest_led_to_max(uint8_t col, uint8_t row) { + uint8_t led_index = map_key_position_to_led_index(col, row); + if (led_index >= 0 && led_index < ISSI3733_LED_COUNT) { + led_boosts[led_index] = LED_BOOST_PEAK; + } +} + +static uint8_t calculate_new_color_component_value(uint8_t max, uint8_t min) { + uint8_t current_boost = led_boosts[led_cur_index]; + return (float)(max - min) * current_boost / LED_BOOST_PEAK + min; +} + +static void calculate_new_led_boosts(uint8_t new_led_boosts[]) { + for (int i = 0; i < ISSI3733_LED_COUNT; i++) { + new_led_boosts[i] = calculate_new_led_boost_at(i); + } +} + +static uint8_t calculate_new_led_boost_at(int index) { + uint8_t decayed_boost = led_boosts[index] * LED_BOOST_DECAY; + uint8_t propagated_boost = get_propagated_boost_from_neighbors(index); + uint8_t new_boost = (propagated_boost > decayed_boost) ? propagated_boost : decayed_boost; + if (new_boost > LED_BOOST_PEAK) { + new_boost = LED_BOOST_PEAK; + } + return new_boost; +} + +static uint8_t get_propagated_boost_from_neighbors(int led_position) { + if (led_position < 0 || led_position >= KEY_LED_COUNT) { + return 0; + } + keypos_t led_keypos = LED_TO_KEY_MAP[led_position]; + uint8_t top_boost = get_led_boost_at_keypos(led_keypos.row - 1, led_keypos.col); + uint8_t bottom_boost = get_led_boost_at_keypos(led_keypos.row + 1, led_keypos.col); + uint8_t left_boost = get_led_boost_at_keypos(led_keypos.row, led_keypos.col - 1); + uint8_t right_boost = get_led_boost_at_keypos(led_keypos.row, led_keypos.col + 1); + uint8_t max_boost = max(max(top_boost, bottom_boost), max(left_boost, right_boost)); + if (max_boost > LED_BOOST_PEAK) { + max_boost = LED_BOOST_PEAK; + } + return max_boost * LED_BOOST_PROPAGATE; +} + +static uint8_t get_led_boost_at_keypos(uint8_t row, uint8_t col) { + if (row < 0 || row >= MATRIX_ROWS || col < 0 || col >= MATRIX_COLS) { + return 0; + } + uint8_t led_index = KEY_TO_LED_MAP[row][col]; + if (led_index < 0) { + return 0; + } + return led_boosts[led_index]; +} + +static void set_new_led_boosts(uint8_t* new_led_boosts) { + for (int i = 0; i < ISSI3733_LED_COUNT; i++) { + led_boosts[i] = new_led_boosts[i]; + } +} + +static uint8_t map_key_position_to_led_index(uint8_t col, uint8_t row) { + if (row >= 0 && row < MATRIX_ROWS && col >= 0 && col < MATRIX_COLS) { + return KEY_TO_LED_MAP[row][col]; + } + return -1; +} diff --git a/keyboards/massdrop/alt/keymaps/reywood/rgb_matrix_user.h b/keyboards/massdrop/alt/keymaps/reywood/rgb_matrix_user.h new file mode 100644 index 000000000000..4ffd202e9b87 --- /dev/null +++ b/keyboards/massdrop/alt/keymaps/reywood/rgb_matrix_user.h @@ -0,0 +1,3 @@ +#pragma once + +void rgb_matrix_record_key_press(keyrecord_t *record); diff --git a/keyboards/massdrop/alt/keymaps/reywood/rules.mk b/keyboards/massdrop/alt/keymaps/reywood/rules.mk new file mode 100644 index 000000000000..b5b961a0f3b2 --- /dev/null +++ b/keyboards/massdrop/alt/keymaps/reywood/rules.mk @@ -0,0 +1,34 @@ +# project specific files +SRC = led_programs.c +SRC += matrix.c +SRC += rgb_matrix_user.c + +#For platform and packs +ARM_ATSAM = SAMD51J18A +MCU = cortex-m4 + +CUSTOM_MATRIX = yes + +# Build Options +# comment out to disable the options. +# +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 +# 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 = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) +VIRTSER_ENABLE = no # USB Serial Driver +RAW_ENABLE = no # Raw device +AUTO_SHIFT_ENABLE = no # Auto Shift diff --git a/tmk_core/protocol/arm_atsam/led_matrix.c b/tmk_core/protocol/arm_atsam/led_matrix.c index 7ee1dad224fc..c328fdc4ceaf 100644 --- a/tmk_core/protocol/arm_atsam/led_matrix.c +++ b/tmk_core/protocol/arm_atsam/led_matrix.c @@ -257,13 +257,15 @@ issi3733_led_t *led_cur; uint8_t led_per_run = 15; float breathe_mult; -void led_matrix_run(led_setup_t *f) +__attribute__ ((weak)) +void led_matrix_run(void) { float ro; float go; float bo; float px; uint8_t led_this_run = 0; + led_setup_t *f = (led_setup_t*)led_setups[led_animation_id]; if (led_cur == 0) //Denotes start of new processing cycle in the case of chunked processing { @@ -459,13 +461,19 @@ uint8_t led_matrix_init(void) //Run led matrix code once for initial LED coloring led_cur = 0; - led_matrix_run((led_setup_t*)led_setups[led_animation_id]); + rgb_matrix_init_user(); + led_matrix_run(); DBGC(DC_LED_MATRIX_INIT_COMPLETE); return 0; } +__attribute__ ((weak)) +void rgb_matrix_init_user(void) { + +} + #define LED_UPDATE_RATE 10 //ms //led data processing can take time, so process data in chunks to free up the processor @@ -502,7 +510,7 @@ void led_matrix_task(void) if (led_cur != lede) { //m15_off; //debug profiling - led_matrix_run((led_setup_t*)led_setups[led_animation_id]); + led_matrix_run(); //m15_on; //debug profiling } } diff --git a/tmk_core/protocol/arm_atsam/led_matrix.h b/tmk_core/protocol/arm_atsam/led_matrix.h index 01b078b7112c..3f2b9cdb8684 100644 --- a/tmk_core/protocol/arm_atsam/led_matrix.h +++ b/tmk_core/protocol/arm_atsam/led_matrix.h @@ -86,6 +86,7 @@ typedef struct led_disp_s { } led_disp_t; uint8_t led_matrix_init(void); +void rgb_matrix_init_user(void); #define LED_MODE_NORMAL 0 //Must be 0 #define LED_MODE_KEYS_ONLY 1 @@ -134,7 +135,7 @@ extern void *led_setups[]; extern issi3733_led_t *led_cur; extern issi3733_led_t *lede; -void led_matrix_run(led_setup_t *f); +void led_matrix_run(void); void led_matrix_task(void); void gcr_compute(void); From f8d800583544bca258b9c10af3ba44de9764639e Mon Sep 17 00:00:00 2001 From: Monksoffunk Date: Wed, 7 Nov 2018 05:00:02 +0900 Subject: [PATCH 373/505] Zinc : Update to latest serial.c #4278 (#4361) * Add Zinc keyboard * Fix photo * Fix readme.md * Fix RGB LED init of monks/keymap.c * Fix default keymap and readme.jp * Fix change DEFS of RGB ANIMATIONS to LED_ANIMATIONS * Add EOL * Use serial_config_simpleapi.h * Fix comment char * Fix error handling in split_scomm.c : mtei works * Fix keymaps * Remove DISABLE_LEADER definition * Remove pro_micro.h * Add 2 spaces after Hardware name * Fix keymaps - remove audio codes - change LAYOUT to LAYOUT_ortho_4X12 - change "persistent_default_layer_set" to core function * Use the Community Layouts feature - with some clean up * Update latest serial.c #4278 --- keyboards/zinc/serial.c | 78 +++++++++++++++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 15 deletions(-) diff --git a/keyboards/zinc/serial.c b/keyboards/zinc/serial.c index 830f86b55a68..325c29a3f704 100644 --- a/keyboards/zinc/serial.c +++ b/keyboards/zinc/serial.c @@ -1,5 +1,10 @@ /* * WARNING: be careful changing this code, it is very timing dependent + * + * 2018-10-28 checked + * avr-gcc 4.9.2 + * avr-gcc 5.4.0 + * avr-gcc 7.3.0 */ #ifndef F_CPU @@ -65,6 +70,7 @@ #error serial.c now support ATmega32U4 only #endif +//////////////// for backward compatibility //////////////////////////////// #ifndef SERIAL_USE_MULTI_TRANSACTION /* --- USE Simple API (OLD API, compatible with let's split serial.c) */ #if SERIAL_SLAVE_BUFFER_LENGTH > 0 @@ -106,7 +112,8 @@ int serial_update_buffers() return result; } -#endif // Simple API (OLD API, compatible with let's split serial.c) +#endif // end of Simple API (OLD API, compatible with let's split serial.c) +//////////////////////////////////////////////////////////////////////////// #define ALWAYS_INLINE __attribute__((always_inline)) #define NO_INLINE __attribute__((noinline)) @@ -136,38 +143,68 @@ int serial_update_buffers() // 5: about 20kbps #endif -#define TID_SEND_ADJUST 2 +#if __GNUC__ < 6 + #define TID_SEND_ADJUST 14 +#else + #define TID_SEND_ADJUST 2 +#endif #if SELECT_SOFT_SERIAL_SPEED == 0 // Very High speed #define SERIAL_DELAY 4 // micro sec - #define READ_WRITE_START_ADJUST 33 // cycles - #define READ_WRITE_WIDTH_ADJUST 6 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 34 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 1 // High speed #define SERIAL_DELAY 6 // micro sec - #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 2 // Middle speed #define SERIAL_DELAY 12 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 3 // Low speed #define SERIAL_DELAY 24 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 4 // Very Low speed #define SERIAL_DELAY 36 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #elif SELECT_SOFT_SERIAL_SPEED == 5 // Ultra Low speed #define SERIAL_DELAY 48 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #else #error invalid SELECT_SOFT_SERIAL_SPEED value #endif /* SELECT_SOFT_SERIAL_SPEED */ @@ -187,16 +224,19 @@ int serial_update_buffers() static SSTD_t *Transaction_table = NULL; static uint8_t Transaction_table_size = 0; +inline static void serial_delay(void) ALWAYS_INLINE; inline static void serial_delay(void) { _delay_us(SERIAL_DELAY); } +inline static void serial_delay_half1(void) ALWAYS_INLINE; inline static void serial_delay_half1(void) { _delay_us(SERIAL_DELAY_HALF1); } +inline static void serial_delay_half2(void) ALWAYS_INLINE; inline static void serial_delay_half2(void) { _delay_us(SERIAL_DELAY_HALF2); @@ -216,6 +256,7 @@ void serial_input_with_pullup(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } +inline static uint8_t serial_read_pin(void) ALWAYS_INLINE; inline static uint8_t serial_read_pin(void) { return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); @@ -270,7 +311,7 @@ void sync_recv(void) { } // Used by the reciver to send a synchronization signal to the sender. -static void sync_send(void)NO_INLINE; +static void sync_send(void) NO_INLINE; static void sync_send(void) { serial_low(); @@ -536,7 +577,14 @@ int soft_serial_get_and_clean_status(int sstd_index) { #endif // Helix serial.c history -// 2018-1-29 fork from let's split (#2308) -// 2018-6-28 bug fix master to slave comm (#3255) -// 2018-8-11 improvements (#3608) -// 2018-10-21 fix serial and RGB animation conflict (#4191) +// 2018-1-29 fork from let's split and add PD2, modify sync_recv() (#2308, bceffdefc) +// 2018-6-28 bug fix master to slave comm and speed up (#3255, 1038bbef4) +// (adjusted with avr-gcc 4.9.2) +// 2018-7-13 remove USE_SERIAL_PD2 macro (#3374, f30d6dd78) +// (adjusted with avr-gcc 4.9.2) +// 2018-8-11 add support multi-type transaction (#3608, feb5e4aae) +// (adjusted with avr-gcc 4.9.2) +// 2018-10-21 fix serial and RGB animation conflict (#4191, 4665e4fff) +// (adjusted with avr-gcc 7.3.0) +// 2018-10-28 re-adjust compiler depend value of delay (#4269, 8517f8a66) +// (adjusted with avr-gcc 5.4.0, 7.3.0) From 8f5ac39fb90e9036a9df60f286888e02daf3fd1b Mon Sep 17 00:00:00 2001 From: TheOneTrueTrench <38593283+TheOneTrueTrench@users.noreply.github.com> Date: Tue, 6 Nov 2018 20:01:18 +0000 Subject: [PATCH 374/505] separated all my changes into separate files, working on generalizing my relativity macros. (#4368) * Updating to my local changes. * Added auto-complete for joins. * Added lights to imply current state better --- keyboards/dz60/keymaps/marianas/customLogic.c | 138 +++++ keyboards/dz60/keymaps/marianas/customLogic.h | 10 + .../dz60/keymaps/marianas/keyDefinitions.h | 124 +++++ keyboards/dz60/keymaps/marianas/keymap.c | 521 +----------------- keyboards/dz60/keymaps/marianas/keymap.h | 114 +--- keyboards/dz60/keymaps/marianas/relativity.c | 510 +++++++++++++++++ keyboards/dz60/keymaps/marianas/relativity.h | 32 ++ keyboards/dz60/keymaps/marianas/rules.mk | 4 + 8 files changed, 839 insertions(+), 614 deletions(-) create mode 100644 keyboards/dz60/keymaps/marianas/customLogic.c create mode 100644 keyboards/dz60/keymaps/marianas/customLogic.h create mode 100644 keyboards/dz60/keymaps/marianas/keyDefinitions.h create mode 100644 keyboards/dz60/keymaps/marianas/relativity.c create mode 100644 keyboards/dz60/keymaps/marianas/relativity.h diff --git a/keyboards/dz60/keymaps/marianas/customLogic.c b/keyboards/dz60/keymaps/marianas/customLogic.c new file mode 100644 index 000000000000..b7dbcac95b79 --- /dev/null +++ b/keyboards/dz60/keymaps/marianas/customLogic.c @@ -0,0 +1,138 @@ +#include QMK_KEYBOARD_H +#include "customLogic.h" +#include "keymap.h" +#include "keyDefinitions.h" +#include "relativity.h" +#include "timer.h" + +static int16_t fnTimer = 0; + + + +uint32_t layer_state_set_user(uint32_t state) +{ + switch (biton32(state)) + { + case QWERTY: + rgblight_mode(9); + break; + case NAV_CLUSTER: + rgblight_mode(29); + break; + case GAMING: + rgblight_mode(26); + break; + case SQLMACROS: + rgblight_mode(1); + break; + case FN_LAYER: + rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL+5); + break; + } + return state; +} + + + +bool printSqlVerbs(uint16_t keycode, keyrecord_t *record) +{ + if (record->event.pressed) + { + switch (keycode) + { + case S_LFTJN: + SEND_STRING("LEFT JOIN"); + activateRelativity(); + return false; + case S_INRJN: + SEND_STRING("INNER JOIN "); + activateRelativity(); + return false; + case S_SLCT: + SEND_STRING("SELECT "); return + false; + case S_FROM: + SEND_STRING("FROM "); return + false; + case S_DSNCT: + SEND_STRING("DISTINCT "); return + false; + case S_ORDER: + SEND_STRING("ORDER BY "); return + false; + case S_WHERE: + SEND_STRING("WHERE "); return + false; + case S_ALTER: + SEND_STRING("ALTER SESSION SET CURRENT_SCHEMA = SUPPLY;"); return false; + case S_ASTRK: + SEND_STRING("* "); return false; + + } + } + return true; +} + + +bool isFn = false; +bool didFn = false; + + +bool updateLayerState(uint16_t keycode, keyrecord_t *record) +{ + + if (record->event.pressed) + { + switch (keycode) + { + case FN_QT: + fnTimer = timer_read(); + layer_on(FN_LAYER); + isFn = true; + return false; + } + if (isFn) + { + didFn = true; + return true; + } + } + else + { + switch(keycode) + { + case FN_QT: + layer_off(FN_LAYER); + if (!didFn) + { + #if fnTimeout + if (TIMER_DIFF_16(timer_read(), fnTimer) <= fnTimeout) + { + activateRelativity(); + } + else + { + deactivateRelativity(); + } + #else + activateRelativity(); + #endif + } + didFn = false; + isFn = false; + return false; + } + } + return true; +} + + + +bool process_record_user(uint16_t keycode, keyrecord_t *record) +{ + return + storeShiftState(keycode, record) && + printSqlVerbs(keycode, record) && + updateLayerState(keycode, record) && + handleSmartMacros(keycode, record); +} diff --git a/keyboards/dz60/keymaps/marianas/customLogic.h b/keyboards/dz60/keymaps/marianas/customLogic.h new file mode 100644 index 000000000000..f0e6ecdcac1c --- /dev/null +++ b/keyboards/dz60/keymaps/marianas/customLogic.h @@ -0,0 +1,10 @@ +#define fnTimeout 500 + + +uint32_t layer_state_set_user(uint32_t state); + +bool printSqlVerbs(uint16_t keycode, keyrecord_t *record); + +bool updateLayerState(uint16_t keycode, keyrecord_t *record); + +bool process_record_user(uint16_t keycode, keyrecord_t *record); diff --git a/keyboards/dz60/keymaps/marianas/keyDefinitions.h b/keyboards/dz60/keymaps/marianas/keyDefinitions.h new file mode 100644 index 000000000000..010ace769473 --- /dev/null +++ b/keyboards/dz60/keymaps/marianas/keyDefinitions.h @@ -0,0 +1,124 @@ + +//Control +#define MO_FNLR MO(FN_LAYER) +#define BACKSPC KC_BSPC +#define ENTER_OR_SQL LT(SQLMACROS,KC_ENT) +#define ESCAP KC_ESC +#define PSCR KC_PSCREEN +#define SCRL KC_SCROLLLOCK +#define PAUS KC_PAUSE +#define NSRT KC_INSERT +#define HOME KC_HOME +#define PGUP KC_PGUP +#define PGDN KC_PGDN +#define END_ KC_END +#define DELT KC_DELETE +#define UPUP KC_UP +#define D_WN KC_DOWN +#define LEFT KC_LEFT +#define RGHT KC_RIGHT + +//KEYPAD +#define KP_1 KC_KP_1 +#define KP_2 KC_KP_2 +#define KP_3 KC_KP_3 +#define KP_4 KC_KP_4 +#define KP_5 KC_KP_5 +#define KP_6 KC_KP_6 +#define KP_7 KC_KP_7 +#define KP_8 KC_KP_8 +#define KP_9 KC_KP_9 +#define KP_0 KC_KP_0 +#define NMLK KC_NUMLOCK +#define STAR KC_KP_ASTERISK +#define KSSH KC_KP_SLASH +#define KMIN KC_KP_MINUS +#define PLUS KC_KP_PLUS +#define KNTR KC_KP_ENTER +#define KDOT KC_KP_DOT + +//Modifiers +#define CTLL KC_LCTL +#define LEFTSHFT KC_LSPO +#define WINL KC_LGUI +#define ALTL KC_LALT +#define CTLR KC_RCTL +#define RIGHT_SHIFT__PAREN KC_RSPC +#define WINR KC_RGUI +#define ALTR KC_RALT +#define APPR KC_APP + + +//Punctuation +#define CMMA KC_COMM +#define PRRD KC_DOT +#define SLSH KC_SLSH +#define QUOT KC_QUOT +#define COLN KC_SCLN +#define LBRC KC_LBRC +#define RBRC KC_RBRC +#define EQUL KC_EQL +#define MNUS KC_MINS +#define BSLASH KC_BSLS + +//Layers +#define QWRTY TO(QWERTY) +#define NAVS TO(NAV_CLUSTER) +#define GAME TO(GAMING) + +//Space +#define ____ KC_TRNS +#define _____ KC_TRNS +#define ______ KC_TRNS +#define _______ KC_TRNS +#define ________ KC_TRNS +#define ___________ KC_TRNS +#define _________________ KC_TRNS +#define SPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACE KC_SPC +#define KCNO KC_NO + +enum sql_macros { + S_LFTJN = SAFE_RANGE, // L + S_INRJN, // I + S_SLCT, // S + S_FROM, // F + S_DSNCT, // D + S_ORDER, // O + S_WHERE, // W + S_ALTER, // Esc + S_ASTRK, // * + + TD_A, + TD_B, + TD_C, // Corp, Corporation, Company + TD_D, // Distribution, Dist, Distributor + TD_E, + TD_F, + TD_G, // GlobalLookup + TD_H, + TD_I, // Instance, Item + TD_J, + TD_K, + TD_L, + TD_M, + TD_N, // NadRate + TD_O, + TD_P, // Product, Person, + TD_Q, // Darden + TD_R, + TD_S, // Supplier, Step + TD_T, // Task, Type + TD_U, + TD_V, + TD_W, // Workflow, + TD_X, + TD_Y, + TD_Z, + TD_BSPC, + TD_ENT, + TD_ESC, + + FN_QT +}; + +bool isShifted(void); diff --git a/keyboards/dz60/keymaps/marianas/keymap.c b/keyboards/dz60/keymaps/marianas/keymap.c index e40bc6897b78..f86074b9c244 100644 --- a/keyboards/dz60/keymaps/marianas/keymap.c +++ b/keyboards/dz60/keymaps/marianas/keymap.c @@ -1,505 +1,10 @@ #include QMK_KEYBOARD_H #include "keymap.h" +#include "relativity.h" +#include "keyDefinitions.h" +#include "customLogic.h" -enum marianas_layers { - QWERTY, -/* - COLEMAK, - DVORAK, -*/ - NAV_CLUSTER, - GAMING, - SQLMACROS, - SQLNAMES, - FN_LAYER -}; - -enum sql_macros { - S_LFTJN = SAFE_RANGE, // L - S_INRJN, // I - S_SLCT, // S - S_FROM, // F - S_DSNCT, // D - S_ORDER, // O - S_WHERE, // W - S_ALTER, // Esc - S_ASTRK, // * - - TD_A, - TD_B, - TD_C, // Corp, Corporation, Company - TD_D, // Distribution, Dist, Distributor - TD_E, - TD_F, - TD_G, // GlobalLookup - TD_H, - TD_I, // Instance, Item - TD_J, - TD_K, - TD_L, - TD_M, - TD_N, // NadRate - TD_O, - TD_P, // Product, Person, - TD_Q, // Darden - TD_R, - TD_S, // Supplier, Step - TD_T, // Task, Type - TD_U, - TD_V, - TD_W, // Workflow, - TD_X, - TD_Y, - TD_Z, - TD_BSPC, - TD_ENT, - TD_ESC -}; - -uint16_t *macroTaps = 0; - -char *tableNameList = 0; - -uint8_t *charCount = 0; -uint8_t countPointer = 0; - -bool shifted = false; - -bool sendAbbr = false; - - -void initStringData(void) -{ - if (macroTaps == 0) - { - macroTaps = malloc(macroTapsLen*sizeof(uint16_t)); - for(int i = 0; i < macroTapsLen; i++) - { - macroTaps[i] = 0; - } - } - if (tableNameList == 0) - { - tableNameList = malloc(tableNameListLen*sizeof(char)); - for(int i = 0; i < tableNameListLen; i++) - { - tableNameList[i] = 0; - } - } - if (charCount == 0) - { - charCount = malloc(charCountLen*sizeof(uint8_t)); - for (int i = 0; i < charCountLen; i++) - { - charCount[i] = 0; - } - } -} - - -uint32_t layer_state_set_user(uint32_t state) -{ - switch (biton32(state)) - { - case QWERTY: - rgblight_mode(9); - break; - case NAV_CLUSTER: - rgblight_mode(29); - break; - case GAMING: - rgblight_mode(26); - break; - case SQLMACROS: - rgblight_mode(1); - rgblight_setrgb(0x00, 0xFF, 0x80); - break; - case SQLNAMES: - rgblight_mode(1); - rgblight_setrgb(0x80, 0xFF, 0x00); - break; - case FN_LAYER: - rgblight_mode(1); - rgblight_setrgb(0x00, 0x80, 0xFF); - break; - } - return state; -} - -bool containsCode(uint16_t kc) -{ - for (int i = 0; i < macroTapsLen && macroTaps[i] > 0; i++) - { - if (macroTaps[i] == kc) return true; - } - return false; -} - -bool lastCodeIs(uint16_t kc) -{ - for (int i = 0; i < macroTapsLen-1 && macroTaps[i] > 0; i++) - { - if (macroTaps[i] == kc && macroTaps[i+1] == 0) return true; - } - return false; -} - -bool last2CodeAre(uint16_t kc) -{ - for (int i = 0; i < macroTapsLen-2 && macroTaps[i] > 0; i++) - { - if (macroTaps[i] == kc && macroTaps[i+1] == kc && macroTaps[i+2] == 0) return true; - } - return false; -} - -bool last2CodesAre(uint16_t kc, uint16_t kc2) -{ - for (int i = 0; i < macroTapsLen-2 && macroTaps[i] > 0; i++) - { - if (macroTaps[i] == kc && macroTaps[i+1] == kc2 && macroTaps[i+2] == 0) return true; - } - return false; -} - -void addKeyCode(uint16_t kc) -{ - int i = 0; - while (i < macroTapsLen-2 && macroTaps[i] > 0) i++; - if (macroTaps[i] == 0) - { - macroTaps[i] = kc; - macroTaps[i+1] = 0; - } -} - -void eraseKeyCodes(void) -{ - int i = 0; - while (i < macroTapsLen && macroTaps[i] > 0) macroTaps[i++] = 0; -} - -void eraseCharCounts(void) -{ - int i = 0; - while (i < charCountLen) - { - charCount[i] = 0; - } -} - -void printTableAbbreviation(void) -{ - initStringData(); - if (tableNameList[0] == 0) - { - return; - } - send_char(0x20); - int i = 0; - for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) - { - if (tableNameList[i] >= 65 && tableNameList[i] <= 90) - { - send_char(tableNameList[i]+32); - } - else - { - send_char(tableNameList[i]); - } - } - send_char(0x20); -} - -void eraseTableAbbreviation(void) -{ - initStringData(); - for (int i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) - { - tableNameList[i] = '\0'; - } -} - -void printString(char* str) -{ - - if (str[0] != '\0') - { - int i = 0; - while (true) - { - if (str[i] == 0) - { - break; - } - send_char(str[i++]); - charCount[countPointer]++; - } - } -} - -void printStringAndQueueChar(char* str) -{ - initStringData(); - if (charCount[countPointer] != 0) - { - countPointer++; - } - sendAbbr = true; - if (str[0] != '\0') - { - printString(str); - - for (int i = 0; i < tableNameListLen-1; i++) - { - if (tableNameList[i] == '\0') - { - tableNameList[i] = str[0]; - tableNameList[i+1] = '\0'; - break; - } - else if (i == tableNameListLen-2) - { - printTableAbbreviation(); - break; - } - } - //for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) - //{ - // send_char(tableNameList[i]); - //} - //send_string_P("Darden"); - //send_string_P(&myarray); - //send_string_P(str); - } -} - -void ReplaceString(char *orig, char *repl) -{ - int i = 0; - while((orig[i] != 0x0 && repl[i] != 0x0) && orig[i] == repl[i]) - i++; - - if(orig[i] != 0x0) - { - int o = i; - while (orig[o++] != 0x0) { - charCount[countPointer]--; - register_code(KC_BSPC); - unregister_code(KC_BSPC); - } - } - printString(repl+i); -} - -void deletePrev(void) -{ - for (int i = 0; i < charCount[countPointer]; i++) - { - register_code(KC_BSPC); - unregister_code(KC_BSPC); - } - charCount[countPointer] = 0; - countPointer--; - int i = 1; - for (;i < tableNameListLen-1; i++) - { - if (tableNameList[i] == 0x0) - { - break; - } - } - tableNameList[i-1] = 0x0; -} - -void processSmartMacroTap(uint16_t kc) -{ - initStringData(); - switch(kc) - { - case TD_C: - if (containsCode(TD_D)) - { - printString("ribution"); - printStringAndQueueChar("Center"); - } - else if (last2CodeAre(TD_C)) - { - ReplaceString("Corporation", "Contact"); - } - else if(lastCodeIs(TD_C)) - { - printString("oration"); - } - else - { - printStringAndQueueChar("Corp"); - } - break; - case TD_D: - if (last2CodeAre(TD_D)) - { - ReplaceString("Distribution", "Distributor"); - } - else if(lastCodeIs(TD_D)) - { - printString("ribution"); - } - else - { - printStringAndQueueChar("Dist"); - } - break; - case TD_G: - printStringAndQueueChar("Global"); - printStringAndQueueChar("Lookup"); - break; - case TD_I: - if (containsCode(TD_W)) - printStringAndQueueChar("Instance"); - else - printStringAndQueueChar("Item"); - break; - case TD_N: - printStringAndQueueChar("NadRate"); - break; - case TD_P: - if (last2CodesAre(TD_D, TD_C)) - { - ReplaceString("DistributionCenter", "DistCenter"); - printStringAndQueueChar("Pricing"); - } - else if (last2CodeAre(TD_P)) - { - } - else if(lastCodeIs(TD_P)) - { - ReplaceString("Product", "Person"); - } - else - { - printStringAndQueueChar("Product"); - } - break; - case TD_Q: - printStringAndQueueChar("Darden"); - break; - case TD_S: - if (containsCode(TD_W)) - if (containsCode(TD_S) || containsCode(TD_D)) - printStringAndQueueChar("Step"); - else - printStringAndQueueChar("Session"); - else - printStringAndQueueChar("Supplier"); - break; - case TD_T: - if (containsCode(TD_W)) - printStringAndQueueChar("Task"); - else - printStringAndQueueChar("Type"); - break; - case TD_W: - printStringAndQueueChar("Workflow"); - break; - } - addKeyCode(kc); -} - -bool process_record_user(uint16_t keycode, keyrecord_t *record) -{ - if (record->event.pressed) - { - switch (keycode) - { - case KC_LSPO: - case KC_RSPC: - shifted = true; - return true; - - case S_LFTJN: SEND_STRING("LEFT JOIN"); return false; - case S_INRJN: SEND_STRING("INNER JOIN "); return false; - case S_SLCT: SEND_STRING("SELECT "); return false; - case S_FROM: SEND_STRING("FROM "); return false; - case S_DSNCT: SEND_STRING("DISTINCT "); return false; - case S_ORDER: SEND_STRING("ORDER "); return false; - case S_WHERE: SEND_STRING("WHERE "); return false; - case S_ALTER: SEND_STRING("ALTER SESSION SET CURRENT_SCHEMA = "); return false; - case S_ASTRK: SEND_STRING("* "); return false; - - case KC_BSLS: - initStringData(); - layer_on(SQLNAMES); - return false; - - case TD_BSPC: - if (!shifted){ - deletePrev(); - } - else { - register_code(KC_BSPC); - unregister_code(KC_BSPC); - } - return false; - - case TD_A: - case TD_B: - case TD_C: - case TD_D: - case TD_E: - case TD_F: - case TD_G: - case TD_H: - case TD_I: - case TD_J: - case TD_K: - case TD_L: - case TD_M: - case TD_N: - case TD_O: - case TD_P: - case TD_Q: - case TD_R: - case TD_S: - case TD_T: - case TD_U: - case TD_V: - case TD_W: - case TD_X: - case TD_Y: - case TD_Z: - processSmartMacroTap(keycode); - return false; - - case TD_ENT: - printTableAbbreviation(); - case TD_ESC: - eraseKeyCodes(); - eraseTableAbbreviation(); - layer_off(SQLNAMES); - return true; - } - } - else - { - switch (keycode) - { - - case KC_BSLS: - if (macroTaps[0] == 0) - { - SEND_STRING("\\"); - layer_off(SQLNAMES); - } - return true; - case KC_LSPO: - case KC_RSPC: - shifted = false; - return true; - } - } - return true; -}; +// planned change: store previous table names and abbreviations to allow scrolling for inner joins on table name+id and abbreviation+id. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -507,7 +12,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT_60_ansi( ESCAP, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, MNUS, EQUL, BACKSPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, LBRC, RBRC, BSLASH, - MO_FNLR, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, COLN, QUOT, ENTER_OR_SQL, + FN_QT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, COLN, QUOT, ENTER_OR_SQL, LEFTSHFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, CMMA, PRRD, SLSH, RIGHT_SHIFT__PAREN, CTLL, WINL, ALTL, SPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACE, ALTR, WINR, APPR, CTLR), @@ -531,23 +36,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT_60_ansi( S_ALTER, ____, ____, ____, ____, ____, ____, ____, S_ASTRK, ____, ____, ____, ____, ___________, ______, ____, S_WHERE, ____, ____, ____, ____, ____, S_INRJN, S_ORDER, ____, ____, ____, ______, - _______, KC_LBRC, S_SLCT, KC_PAST,S_FROM, ____, ____, ____, ____, S_LFTJN, ____, RBRC, ___________, - ________, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, _________________, + _______, KC_LBRC, S_SLCT, S_ASTRK ,S_FROM, ____, ____, ____, ____, S_LFTJN, ____, RBRC, ___________, + ________, RGB_VAI, RGB_VAD, ____, ____, ____, ____, ____, ____, ____, ____, _________________, ____, ____, ____, /*------------------*/_____/*------------------*/, ____, ____, ____, ____), - [SQLNAMES]= - LAYOUT_60_ansi( - TD_ESC, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, TD_BSPC, - ________, TD_Q, TD_W, TD_E, TD_R, TD_T, TD_Y, TD_U, TD_I, TD_O, TD_P, ____, ____, _____, - ___________, TD_A, TD_S, TD_D, TD_F, TD_G, TD_H, TD_J, TD_K, TD_L, ____, ____, TD_ENT, - ___________, TD_Z, TD_X, TD_C, TD_V, TD_B, TD_N, TD_M, ____, ____, ____, _________________, - ____, ____, ____, /*----------------------*/TD_ENT/*-----------------------*/, ____, ____, ____, RESET), - [FN_LAYER]= LAYOUT_60_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_CAPSLOCK, KC_MPRV, KC_MPLY, KC_MNXT, LWIN(KC_R), ____, KC_CALC, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_SLCK, KC_BRK, ____, ____, KC_VOLD, KC_MUTE, KC_VOLU, ____, ____, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_INS, KC_DEL, ____, - ____, ____, ____, ____, ____, ____, KC_END, ____, QWRTY, NAVS, GAME, ____, - ____, ____, ____, _________________, ____, KC_HYPR, KC_MEH, ____) + ____, RGB_HUI, RGB_SAI, RGB_SAD, ____, ____, KC_END, QWRTY, GAME, NAVS, ____, ____, + ____, ____, ____, _________________, ____, KC_HYPR, KC_MEH, RESET) }; diff --git a/keyboards/dz60/keymaps/marianas/keymap.h b/keyboards/dz60/keymaps/marianas/keymap.h index 00e51cea2c5b..bb1ea68c77a6 100644 --- a/keyboards/dz60/keymaps/marianas/keymap.h +++ b/keyboards/dz60/keymaps/marianas/keymap.h @@ -1,105 +1,15 @@ -#include "quantum.h" +#include QMK_KEYBOARD_H -//Control -#define MO_FNLR MO(FN_LAYER) -#define BACKSPC KC_BSPC -#define ENTER_OR_SQL LT(SQLMACROS,KC_ENT) -#define ESCAP KC_ESC -#define PSCR KC_PSCREEN -#define SCRL KC_SCROLLLOCK -#define PAUS KC_PAUSE -#define NSRT KC_INSERT -#define HOME KC_HOME -#define PGUP KC_PGUP -#define PGDN KC_PGDN -#define END_ KC_END -#define DELT KC_DELETE -#define UPUP KC_UP -#define D_WN KC_DOWN -#define LEFT KC_LEFT -#define RGHT KC_RIGHT -//KEYPAD -#define KP_1 KC_KP_1 -#define KP_2 KC_KP_2 -#define KP_3 KC_KP_3 -#define KP_4 KC_KP_4 -#define KP_5 KC_KP_5 -#define KP_6 KC_KP_6 -#define KP_7 KC_KP_7 -#define KP_8 KC_KP_8 -#define KP_9 KC_KP_9 -#define KP_0 KC_KP_0 -#define NMLK KC_NUMLOCK -#define STAR KC_KP_ASTERISK -#define KSSH KC_KP_SLASH -#define KMIN KC_KP_MINUS -#define PLUS KC_KP_PLUS -#define KNTR KC_KP_ENTER -#define KDOT KC_KP_DOT +enum marianas_layers { + QWERTY, +/* + COLEMAK, + DVORAK, +*/ + NAV_CLUSTER, + GAMING, + SQLMACROS, + FN_LAYER +}; -//Modifiers -#define CTLL KC_LCTL -#define LEFTSHFT KC_LSPO -#define WINL KC_LGUI -#define ALTL KC_LALT -#define CTLR KC_RCTL -#define RIGHT_SHIFT__PAREN KC_RSPC -#define WINR KC_RGUI -#define ALTR KC_RALT -#define APPR KC_APP - - -//Punctuation -#define CMMA KC_COMM -#define PRRD KC_DOT -#define SLSH KC_SLSH -#define QUOT KC_QUOT -#define COLN KC_SCLN -#define LBRC KC_LBRC -#define RBRC KC_RBRC -#define EQUL KC_EQL -#define MNUS KC_MINS -#define BSLASH KC_BSLS - -//Layers -#define QWRTY TO(QWERTY) -#define NAVS TO(NAV_CLUSTER) -#define GAME TO(GAMING) - -//Space -#define ____ KC_TRNS -#define _____ KC_TRNS -#define ______ KC_TRNS -#define _______ KC_TRNS -#define ________ KC_TRNS -#define ___________ KC_TRNS -#define _________________ KC_TRNS -#define SPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACE KC_SPC -#define KCNO KC_NO - - - - - -#define macroTapsLen 32 -#define tableNameListLen 32 -#define charCountLen 32 - -void initStringData(void); -uint32_t layer_state_set_user(uint32_t state); -bool containsCode(uint16_t kc); -bool lastCodeIs(uint16_t kc); -bool last2CodeAre(uint16_t kc); -bool last2CodesAre(uint16_t kc, uint16_t kc2); -void addKeyCode(uint16_t kc); -void eraseKeyCodes(void); -void eraseCharCounts(void); -void printTableAbbreviation(void); -void eraseTableAbbreviation(void); -void printString(char* str); -void printStringAndQueueChar(char* str); -void ReplaceString(char *orig, char *repl); -void deletePrev(void); -void processSmartMacroTap(uint16_t kc); -bool process_record_user(uint16_t keycode, keyrecord_t *record); diff --git a/keyboards/dz60/keymaps/marianas/relativity.c b/keyboards/dz60/keymaps/marianas/relativity.c new file mode 100644 index 000000000000..96a5eb4e6ffd --- /dev/null +++ b/keyboards/dz60/keymaps/marianas/relativity.c @@ -0,0 +1,510 @@ +#include "relativity.h" +#include "keymap.h" +#include "keyDefinitions.h" + + +uint16_t *macroTaps = 0; + +char *tableNameList = 0; + +uint8_t *charCount = 0; +uint8_t countPointer = 0; + +bool relativityActive = false; + + +bool sendAbbr = false; + + +static int16_t relativityTimer = 0; + + +bool tempOff = false; + + + + +void initStringData() +{ + if (macroTaps == 0) + { + macroTaps = malloc(macroTapsLen*sizeof(uint16_t)); + for(int i = 0; i < macroTapsLen; i++) + { + macroTaps[i] = 0; + } + } + if (tableNameList == 0) + { + tableNameList = malloc(tableNameListLen*sizeof(char)); + for(int i = 0; i < tableNameListLen; i++) + { + tableNameList[i] = 0; + } + } + if (charCount == 0) + { + charCount = malloc(charCountLen*sizeof(uint8_t)); + for (int i = 0; i < charCountLen; i++) + { + charCount[i] = 0; + } + } +} + +void activateRelativity(void) +{ + initStringData(); + rgblight_mode(RGBLIGHT_MODE_KNIGHT); + relativityTimer = timer_read(); + relativityActive = true; +} + +bool deactivateRelativity(void) +{ + rgblight_mode(9); + eraseKeyCodes(); + eraseTableAbbreviation(); + eraseCharCounts(); + relativityActive = false; + tempOff = false; + return false; +} + +bool containsCode(uint16_t kc) +{ + for (int i = 0; i < macroTapsLen && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc) return true; + } + return false; +} + +bool lastCodeIs(uint16_t kc) +{ + for (int i = 0; i < macroTapsLen-1 && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc && macroTaps[i+1] == 0) return true; + } + return false; +} + +bool last2CodeAre(uint16_t kc) +{ + for (int i = 0; i < macroTapsLen-2 && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc && macroTaps[i+1] == kc && macroTaps[i+2] == 0) return true; + } + return false; +} + +bool last2CodesAre(uint16_t kc, uint16_t kc2) +{ + for (int i = 0; i < macroTapsLen-2 && macroTaps[i] > 0; i++) + { + if (macroTaps[i] == kc && macroTaps[i+1] == kc2 && macroTaps[i+2] == 0) return true; + } + return false; +} + +void addKeyCode(uint16_t kc) +{ + int i = 0; + while (i < macroTapsLen-2 && macroTaps[i] > 0) i++; + if (macroTaps[i] == 0) + { + macroTaps[i] = kc; + macroTaps[i+1] = 0; + } +} + +void eraseKeyCodes(void) +{ + int i = 0; + while (i < macroTapsLen && macroTaps[i] > 0) macroTaps[i++] = 0; +} + +void eraseCharCounts(void) +{ + while (countPointer > 0) + { + charCount[countPointer] = 0; + countPointer--; + } + charCount[countPointer] = 0; +} + +void printTableAbbreviationLimited(void) +{ + if (tableNameList[0] == 0) + { + return; + } + int i = 0; + for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + { + if (tableNameList[i] >= 65 && tableNameList[i] <= 90) + { + send_char(tableNameList[i]+32); + } + else + { + send_char(tableNameList[i]); + } + } +} + +void printTableAbbreviation(void) +{ + if (tableNameList[0] == 0) + { + return; + } + send_char(0x20); + int i = 0; + for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + { + if (tableNameList[i] >= 65 && tableNameList[i] <= 90) + { + send_char(tableNameList[i]+32); + } + else + { + send_char(tableNameList[i]); + } + } + send_char(0x20); +} + +void eraseTableAbbreviation(void) +{ + for (int i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + { + tableNameList[i] = '\0'; + } +} + +void printString(char* str) +{ + + if (str[0] != '\0') + { + int i = 0; + while (true) + { + if (str[i] == 0) + { + break; + } + send_char(str[i++]); + charCount[countPointer]++; + } + } +} + +void printStringAndQueueChar(char* str) +{ + if (charCount[countPointer] > 0 && countPointer < charCountLen) + { + countPointer++; + } + sendAbbr = true; + if (str[0] != '\0') + { + printString(str); + + for (int i = 0; i < tableNameListLen-1; i++) + { + if (tableNameList[i] == '\0') + { + tableNameList[i] = str[0]; + tableNameList[i+1] = '\0'; + break; + } + else if (i == tableNameListLen-2) + { + printTableAbbreviation(); + break; + } + } + //for (i = 0; i < tableNameListLen && tableNameList[i] > 0; i++) + //{ + // send_char(tableNameList[i]); + //} + //send_string_P("Darden"); + //send_string_P(&myarray); + //send_string_P(str); + } +} + +void ReplaceString(char *orig, char *repl) +{ + int i = 0; + while((orig[i] != 0x0 && repl[i] != 0x0) && orig[i] == repl[i]) + i++; + + if(orig[i] != 0x0) + { + int o = i; + while (orig[o++] != 0x0) { + charCount[countPointer]--; + register_code(KC_BSPC); + unregister_code(KC_BSPC); + } + } + printString(repl+i); +} + +void deletePrev(void) +{ + if (countPointer == 0 && charCount[countPointer] == 0) + return; + for (int i = 0; i < charCount[countPointer]; i++) + { + register_code(KC_BSPC); + unregister_code(KC_BSPC); + } + charCount[countPointer] = 0; + int i = 1; + for (;i < tableNameListLen-1; i++) + { + if (tableNameList[i] == 0x0) + { + break; + } + } + tableNameList[i-1] = 0x0; + if (countPointer > 0) + { + countPointer--; + } +} + +bool processSmartMacroTap(uint16_t kc) +{ + if (relativityTimer > 0 && TIMER_DIFF_16(timer_read(), relativityTimer) >= relTimeout) + { + deactivateRelativity(); + return true; + } + relativityTimer = 0; + switch(kc) + { + case KC_C: + if (containsCode(KC_D)) + { + printString("ribution"); + printStringAndQueueChar("Center"); + } + else if (last2CodeAre(KC_C)) + { + ReplaceString("Corporation", "Contact"); + } + else if(lastCodeIs(KC_C)) + { + printString("oration"); + } + else + { + printStringAndQueueChar("Corp"); + } + break; + case KC_D: + if (last2CodeAre(KC_D)) + { + ReplaceString("Distribution", "Distributor"); + } + else if(lastCodeIs(KC_D)) + { + printString("ribution"); + } + else + { + printStringAndQueueChar("Dist"); + } + break; + case KC_G: + printStringAndQueueChar("Global"); + printStringAndQueueChar("Lookup"); + break; + case KC_I: + if (containsCode(KC_W)) + printStringAndQueueChar("Instance"); + else + printStringAndQueueChar("Item"); + break; + case KC_N: + printStringAndQueueChar("NadRate"); + break; + case KC_P: + if (last2CodesAre(KC_D, KC_C)) + { + ReplaceString("DistributionCenter", "DistCenter"); + printStringAndQueueChar("Pricing"); + } + else if (last2CodeAre(KC_P)) + { + } + else if(lastCodeIs(KC_P)) + { + ReplaceString("Product", "Person"); + } + else + { + printStringAndQueueChar("Product"); + } + break; + case KC_Q: + printStringAndQueueChar("Darden"); + break; + case KC_S: + if (containsCode(KC_W)) + if (containsCode(KC_S) || containsCode(KC_D)) + printStringAndQueueChar("Step"); + else + printStringAndQueueChar("Session"); + else + printStringAndQueueChar("Supplier"); + break; + case KC_T: + if (containsCode(KC_W)) + printStringAndQueueChar("Task"); + else + printStringAndQueueChar("Type"); + break; + case KC_W: + printStringAndQueueChar("Workflow"); + break; + } + addKeyCode(kc); + return false; +} + + +bool shifted = false; +bool isShifted() +{ + return shifted; +} + +void setShifted(bool val) +{ + shifted = val; +} + + +bool storeShiftState(uint16_t keycode, keyrecord_t *record) +{ + + if (record->event.pressed) + { + switch (keycode) + { + case KC_LSPO: + case KC_RSPC: + shifted = true; + } + } + else + { + switch (keycode) + { + + case KC_LSPO: + case KC_RSPC: + shifted = false; + return true; + } + } + return true; +} + +bool handleSmartMacros(uint16_t keycode, keyrecord_t *record) +{ + if (relativityActive != true) return true; + if (record->event.pressed) + { + switch (keycode) + { + case KC_BSPC: + if (!isShifted()){ + deletePrev(); + } + else { + register_code(KC_BSPC); + unregister_code(KC_BSPC); + } + return false; + case KC_A: + case KC_B: + case KC_C: + case KC_D: + case KC_E: + case KC_F: + case KC_G: + case KC_H: + case KC_I: + case KC_J: + case KC_K: + case KC_L: + case KC_M: + case KC_N: + case KC_O: + case KC_P: + case KC_Q: + case KC_R: + case KC_S: + case KC_T: + case KC_U: + case KC_V: + case KC_W: + case KC_X: + case KC_Y: + case KC_Z: + return processSmartMacroTap(keycode); + + case PRRD: + if (tempOff) + { + SEND_STRING("Id = "); + printTableAbbreviationLimited(); + SEND_STRING(".Id"); + return deactivateRelativity(); + } + else + { + printTableAbbreviation(); + SEND_STRING("ON "); + printTableAbbreviationLimited(); + eraseKeyCodes(); + eraseTableAbbreviation(); + eraseCharCounts(); + tempOff = true; + return true; + } + + + case KC_SPC: + printTableAbbreviation(); + return deactivateRelativity(); + case ENTER_OR_SQL: + if (tempOff) + { + SEND_STRING("Id = "); + printTableAbbreviationLimited(); + SEND_STRING(".Id"); + deactivateRelativity(); + return true; + } + else + { + printTableAbbreviation(); + deactivateRelativity(); + return true; + } + case KC_ESC: + return deactivateRelativity(); + } + } + return true; +} diff --git a/keyboards/dz60/keymaps/marianas/relativity.h b/keyboards/dz60/keymaps/marianas/relativity.h new file mode 100644 index 000000000000..c917b1a4dcdc --- /dev/null +++ b/keyboards/dz60/keymaps/marianas/relativity.h @@ -0,0 +1,32 @@ +#include QMK_KEYBOARD_H +#define macroTapsLen 32 +#define tableNameListLen 32 +#define charCountLen 32 + +#define relTimeout 1500 + + +void activateRelativity(void); +bool deactivateRelativity(void); +void initStringData(void); +bool containsCode(uint16_t kc); +bool lastCodeIs(uint16_t kc); +bool last2CodeAre(uint16_t kc); +bool last2CodesAre(uint16_t kc, uint16_t kc2); +void addKeyCode(uint16_t kc); +void eraseKeyCodes(void); +void eraseCharCounts(void); +void printTableAbbreviation(void); +void eraseTableAbbreviation(void); +void printString(char* str); +void printStringAndQueueChar(char* str); +void ReplaceString(char *orig, char *repl); +void deletePrev(void); +bool processSmartMacroTap(uint16_t kc); +bool isShifted(void); +void setShifted(bool); + + + +bool handleSmartMacros(uint16_t keycode, keyrecord_t *record); +bool storeShiftState(uint16_t keycode, keyrecord_t *record); diff --git a/keyboards/dz60/keymaps/marianas/rules.mk b/keyboards/dz60/keymaps/marianas/rules.mk index ab188f3b2c42..230d194ab883 100644 --- a/keyboards/dz60/keymaps/marianas/rules.mk +++ b/keyboards/dz60/keymaps/marianas/rules.mk @@ -15,3 +15,7 @@ AUDIO_ENABLE = no RGBLIGHT_ENABLE = yes TAP_DANCE_ENABLE = no AUTO_SHIFT_ENABLE = no + + +SRC += relativity.c +SRC += customLogic.c From a91f439aec39ec8bbcbb2f579a9434c266f09f5c Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Wed, 7 Nov 2018 05:02:30 +0900 Subject: [PATCH 375/505] Helix-serial.c configuration improvement (#4370) The new simple API can be selected. Previous version, can select two way. * use old API (compatible with let's split serial.c) * use new API (multi-type transaction) This version, can select three way. * use old API (compatible with let's split serial.c) * use new API (single-type transaction) * use new API (multi-type transaction) There is no change in the code generated by this change. --- keyboards/helix/serial.c | 6 +++--- keyboards/helix/serial.h | 35 ++++++++++++++++++++--------------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/keyboards/helix/serial.c b/keyboards/helix/serial.c index 325c29a3f704..6006ebf1bdb2 100644 --- a/keyboards/helix/serial.c +++ b/keyboards/helix/serial.c @@ -71,8 +71,8 @@ #endif //////////////// for backward compatibility //////////////////////////////// -#ifndef SERIAL_USE_MULTI_TRANSACTION -/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ +#if !defined(SERIAL_USE_SINGLE_TRANSACTION) && !defined(SERIAL_USE_MULTI_TRANSACTION) +/* --- USE OLD API (compatible with let's split serial.c) */ #if SERIAL_SLAVE_BUFFER_LENGTH > 0 uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; #endif @@ -112,7 +112,7 @@ int serial_update_buffers() return result; } -#endif // end of Simple API (OLD API, compatible with let's split serial.c) +#endif // end of OLD API (compatible with let's split serial.c) //////////////////////////////////////////////////////////////////////////// #define ALWAYS_INLINE __attribute__((always_inline)) diff --git a/keyboards/helix/serial.h b/keyboards/helix/serial.h index 7e0c0847a431..2e53928df2d3 100644 --- a/keyboards/helix/serial.h +++ b/keyboards/helix/serial.h @@ -15,31 +15,36 @@ // // 4: about 26kbps // // 5: about 20kbps // -// //// USE Simple API (OLD API, compatible with let's split serial.c) +// //// USE OLD API (compatible with let's split serial.c) // ex. // #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 // #define SERIAL_MASTER_BUFFER_LENGTH 1 // -// //// USE flexible API (using multi-type transaction function) -// #define SERIAL_USE_MULTI_TRANSACTION +// //// USE NEW API +// //// USE simple API (using signle-type transaction function) +// #define SERIAL_USE_SINGLE_TRANSACTION +// //// USE flexible API (using multi-type transaction function) +// #define SERIAL_USE_MULTI_TRANSACTION // // ///////////////////////////////////////////////////////////////// -#ifndef SERIAL_USE_MULTI_TRANSACTION -/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ -#if SERIAL_SLAVE_BUFFER_LENGTH > 0 -extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; -#endif -#if SERIAL_MASTER_BUFFER_LENGTH > 0 -extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; -#endif +//////////////// for backward compatibility //////////////////////////////// +#if !defined(SERIAL_USE_SINGLE_TRANSACTION) && !defined(SERIAL_USE_MULTI_TRANSACTION) +/* --- USE OLD API (compatible with let's split serial.c) */ + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; + #endif + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; + #endif -void serial_master_init(void); -void serial_slave_init(void); -int serial_update_buffers(void); + void serial_master_init(void); + void serial_slave_init(void); + int serial_update_buffers(void); -#endif // USE Simple API +#endif // end of USE OLD API +//////////////////////////////////////////////////////////////////////////// // Soft Serial Transaction Descriptor typedef struct _SSTD_t { From 29dd6645898d1647c5e4326c9851c2f1562bb6a0 Mon Sep 17 00:00:00 2001 From: Danilo Vulicevic Date: Tue, 6 Nov 2018 21:03:33 +0100 Subject: [PATCH 376/505] Add whitefox/billypython keymap (#4374) * Add keyboards/whitefox/keymaps/billypython Cloned from vomindoraan/qmk_firmware * Customize keymap for Linux --- .../whitefox/keymaps/billypython/config.h | 20 ++ .../whitefox/keymaps/billypython/keymap.c | 205 ++++++++++++++++++ .../whitefox/keymaps/billypython/rules.mk | 10 + 3 files changed, 235 insertions(+) create mode 100644 keyboards/whitefox/keymaps/billypython/config.h create mode 100644 keyboards/whitefox/keymaps/billypython/keymap.c create mode 100644 keyboards/whitefox/keymaps/billypython/rules.mk diff --git a/keyboards/whitefox/keymaps/billypython/config.h b/keyboards/whitefox/keymaps/billypython/config.h new file mode 100644 index 000000000000..d1c3002d270c --- /dev/null +++ b/keyboards/whitefox/keymaps/billypython/config.h @@ -0,0 +1,20 @@ +#pragma once + +#define FORCE_NKRO + +#undef IS_COMMAND +#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL))) + +#define MAGIC_KEY_LAYER0_ALT1 BSLS +#define MAGIC_KEY_BOOTLOADER ESC + +#define MOUSEKEY_DELAY 50 +#define MOUSEKEY_INTERVAL 15 +#define MOUSEKEY_MAX_SPEED 4 +#define MOUSEKEY_TIME_TO_MAX 50 +#define MOUSEKEY_WHEEL_MAX_SPEED 1 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 50 + +#define PERMISSIVE_HOLD +#define TAPPING_TERM 200 +#define TAPPING_TOGGLE 2 diff --git a/keyboards/whitefox/keymaps/billypython/keymap.c b/keyboards/whitefox/keymaps/billypython/keymap.c new file mode 100644 index 000000000000..8096885cf8a9 --- /dev/null +++ b/keyboards/whitefox/keymaps/billypython/keymap.c @@ -0,0 +1,205 @@ +#include QMK_KEYBOARD_H + +#define TOP LCTL(KC_HOME) +#define BOTTOM LCTL(KC_END) +#define DSKTP_L LCTL(LGUI(KC_LEFT)) +#define DSKTP_R LCTL(LGUI(KC_RGHT)) + +#define FN MO(L_FN) +#define FN_CAPS LT(L_FN, KC_CAPS) +#define FN_FNLK TT(L_FN) + +#define DESKTOP TD(TD_DESKTOP) +#define FN_RCTL TD(TD_FN_RCTL) +#define RAL_LAL TD(TD_RAL_LAL) +#define RAL_RGU TD(TD_RAL_RGU) +#define RCT_RSF TD(TD_RCT_RSF) +#define RSF_RCT TD(TD_RSF_RCT) + +#define COMMA UC(0x002C) +#define L_PAREN UC(0x0028) +#define R_PAREN UC(0x0029) +#define EQUALS UC(0x003D) +#define TIMES UC(0x00D7) +#define DIVIDE UC(0x00F7) +#define MINUS UC(0x2212) + +void eeconfig_init_user(void) { + set_unicode_input_mode(UC_LNX); +} + +enum layers { + L_BASE, + L_FN, + L_NUMPAD, +}; + +enum custom_keycodes { + CLEAR = SAFE_RANGE, + NUMPAD, +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case CLEAR: + if (record->event.pressed) { + SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); + } + return false; + + case NUMPAD: + if (record->event.pressed) { + layer_invert(L_NUMPAD); + bool num_lock = host_keyboard_leds() & 1<count == 1 || state->count == 3) { + layer_on(L_FN); + } else if (state->count == 2) { + if (!td_fn_rctrl_data.fn_on) { + layer_off(L_FN); + } + register_code(KC_RCTL); + } +} + +void td_fn_rctrl_reset(qk_tap_dance_state_t *state, void *user_data) { + if ((state->count == 1 || state->count > 2) && !td_fn_rctrl_data.fn_on) { + layer_off(L_FN); + } + if (state->count >= 2) { + unregister_code(KC_RCTL); + } + td_fn_rctrl_data.started = false; +} + +#define ACTION_TAP_DANCE_DOUBLE_MODS(mod1, mod2) { \ + .fn = { td_double_mods_each, NULL, td_double_mods_reset }, \ + .user_data = &(qk_tap_dance_pair_t){ mod1, mod2 }, \ + } + +void td_double_mods_each(qk_tap_dance_state_t *state, void *user_data) { + qk_tap_dance_pair_t *mods = (qk_tap_dance_pair_t *)user_data; + // Single tap → mod1, double tap → mod2, triple tap etc. → mod1+mod2 + if (state->count == 1 || state->count == 3) { + register_code(mods->kc1); + } else if (state->count == 2) { + unregister_code(mods->kc1); + register_code(mods->kc2); + } + // Prevent tap dance from sending kc1 and kc2 as weak mods + state->weak_mods &= ~(MOD_BIT(mods->kc1) | MOD_BIT(mods->kc2)); +} + +void td_double_mods_reset(qk_tap_dance_state_t *state, void *user_data) { + qk_tap_dance_pair_t *mods = (qk_tap_dance_pair_t *)user_data; + if (state->count == 1 || state->count > 2) { + unregister_code(mods->kc1); + } + if (state->count >= 2) { + unregister_code(mods->kc2); + } +} + +enum tap_dance { + TD_DESKTOP, + TD_FN_RCTL, + TD_RAL_LAL, + TD_RAL_RGU, + TD_RCT_RSF, + TD_RSF_RCT, +}; + +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_DESKTOP] = ACTION_TAP_DANCE_DOUBLE(LCTL(LGUI(KC_D)), LCTL(LGUI(KC_F4))), // Add/close virtual desktop + [TD_FN_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(td_fn_rctrl_each, NULL, td_fn_rctrl_reset), + [TD_RAL_LAL] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RALT, KC_LALT), + [TD_RAL_RGU] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RALT, KC_RGUI), + [TD_RCT_RSF] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RCTL, KC_RSFT), + [TD_RSF_RCT] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RSFT, KC_RCTL), +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Base layer + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ \ │ ` │PSc│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ + * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │Bspc │Del│ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ + * │FnCaps│ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │PgU│ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ + * │ LShift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │SftCtl│ ↑ │PgD│ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤ + * │LCtl│LGui│LAlt│ Space │AlGu│FnLk│ │ ← │ ↓ │ → │ + * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ + */ + [L_BASE] = LAYOUT_truefox( \ + 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_PSCR, \ + 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_DEL, \ + FN_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,RSF_RCT, KC_UP, KC_PGDN, \ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, RAL_RGU,FN_FNLK, KC_LEFT,KC_DOWN,KC_RGHT \ + ), + + /* Function layer + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │ │F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11│F12│Num│Scr│Pau│ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ + * │ M4 │M2 │M↑ │M1 │M3 │M5 │ │PgU│ ↑ │PgD│Ply│Prv│Nxt│Clear│Ins│ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ + * │ │M← │M↓ │M→ │MW↑│ │Hom│ ← │ ↓ │ → │End│ │ │Top│ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ + * │ │MA0│MA2│MW←│MW→│ │ │ │VoD│VoU│Mut│ App │PgU│Btm│ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤ + * │ │ │ │ MW↓ │ │ │ │Hom│PgD│End│ + * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ + */ + [L_FN] = LAYOUT_truefox( \ + _______,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, NUMPAD, KC_SLCK,KC_PAUS, \ + KC_BTN4,KC_BTN2,KC_MS_U,KC_BTN1,KC_BTN3,KC_BTN5,_______,KC_PGUP,KC_UP, KC_PGDN,KC_MPLY,KC_MPRV,KC_MNXT,CLEAR, KC_INS, \ + _______,KC_MS_L,KC_MS_D,KC_MS_R,KC_WH_U,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_END, _______, _______, TOP, \ + _______, KC_ACL0,KC_ACL2,KC_WH_L,KC_WH_R,_______,_______,_______,KC_VOLD,KC_VOLU,KC_MUTE,KC_APP, KC_PGUP,BOTTOM, \ + _______,_______,_______, KC_WH_D, _______,_______, KC_HOME,KC_PGDN,KC_END \ + ), + + /* Numpad layer + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ + * │Num│ │ │ │ │ │ │P7 │P8 │P9 │P- │ − │ = │Num│ │ │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ + * │ │ │ │ │ │ │ │P4 │P5 │P6 │P+ │ ( │ ) │ │ │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ + * │ │ │ │ │ │ │ │P1 │P2 │P3 │P* │ × │ PEnter │ │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ + * │ │ │ │ │ │ │P0 │P0 │ , │P. │P/ │ ÷ │ │ │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤ + * │ │ │ │ │ │ │ │ │ │ │ + * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ + */ + [L_NUMPAD] = LAYOUT_truefox( \ + NUMPAD, _______,_______,_______,_______,_______,_______,KC_P7, KC_P8, KC_P9, KC_PMNS,MINUS, EQUALS, NUMPAD, _______,_______, \ + _______,_______,_______,_______,_______,_______,_______,KC_P4, KC_P5, KC_P6, KC_PPLS,L_PAREN,R_PAREN,_______, _______, \ + _______,_______,_______,_______,_______,_______,_______,KC_P1, KC_P2, KC_P3, KC_PAST,TIMES, KC_PENT, _______, \ + _______, _______,_______,_______,_______,_______,KC_P0, KC_P0, COMMA, KC_PDOT,KC_PSLS,DIVIDE, _______,_______, \ + _______,_______,_______, _______, _______,_______, _______,_______,_______ \ + ), +}; diff --git a/keyboards/whitefox/keymaps/billypython/rules.mk b/keyboards/whitefox/keymaps/billypython/rules.mk new file mode 100644 index 000000000000..abf92c2c4651 --- /dev/null +++ b/keyboards/whitefox/keymaps/billypython/rules.mk @@ -0,0 +1,10 @@ +BACKLIGHT_ENABLE = no +BOOTMAGIC_ENABLE = no +COMMAND_ENABLE = yes +CONSOLE_ENABLE = yes +EXTRAKEY_ENABLE = yes +MOUSEKEY_ENABLE = yes +NKRO_ENABLE = yes +TAP_DANCE_ENABLE = yes +UNICODE_ENABLE = yes +VISUALIZER_ENABLE = no From a5d22424f40cf386120008b5d44d810c62d0ffcb Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Tue, 6 Nov 2018 12:04:25 -0800 Subject: [PATCH 377/505] Commit my DZ60 keymap (#4375) * default mechmerlin keymap initial commit * fix up the keymap * cleanup keymap * add rgb sleep functionality * add the beginning of a readme * fix that compile error * fixup formatting * spruce up that readme * add RGB lighting controls to _CL layer * update readme * set rgb underglow color * update readme * fix formatting --- keyboards/dz60/keymaps/mechmerlin/config.h | 6 ++ keyboards/dz60/keymaps/mechmerlin/keymap.c | 40 ++++++++++++ keyboards/dz60/keymaps/mechmerlin/readme.md | 68 +++++++++++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 keyboards/dz60/keymaps/mechmerlin/config.h create mode 100644 keyboards/dz60/keymaps/mechmerlin/keymap.c create mode 100644 keyboards/dz60/keymaps/mechmerlin/readme.md diff --git a/keyboards/dz60/keymaps/mechmerlin/config.h b/keyboards/dz60/keymaps/mechmerlin/config.h new file mode 100644 index 000000000000..92d4cfb50a3a --- /dev/null +++ b/keyboards/dz60/keymaps/mechmerlin/config.h @@ -0,0 +1,6 @@ +#pragma once + +// Turn off RGB when computer goes to sleep +#ifdef RGBLIGHT_ENABLE +#define RGBLIGHT_SLEEP +#endif // RGBLIGHT_ENABLE diff --git a/keyboards/dz60/keymaps/mechmerlin/keymap.c b/keyboards/dz60/keymaps/mechmerlin/keymap.c new file mode 100644 index 000000000000..1a8593ef16d3 --- /dev/null +++ b/keyboards/dz60/keymaps/mechmerlin/keymap.c @@ -0,0 +1,40 @@ +#include QMK_KEYBOARD_H + +enum keyboard_layers { + _BL = 0, // Base Layer + _FL, // Function Layer + _CL // Control Layer +}; + +// Custom #defined keycodes (shorter macros for readability) +#define KC_CTCP LCTL_T(KC_CAPS) +#define KC_RSSH RSFT_T(KC_SLSH) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BL] = LAYOUT_60_b_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_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_CTCP, 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_RSSH, KC_UP, KC_DEL, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [_FL] = LAYOUT_60_b_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_DEL, + KC_TRNS, KC_TRNS, KC_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_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_PGUP, MO(_CL), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END), + + [_CL] = LAYOUT_60_b_ansi( + RESET, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; + +// Set underglow RGB leds to yellow +// Find the list of available colors in quantum/rgblight_list.h +void matrix_init_user(void) { + rgblight_sethsv_noeeprom_yellow(); +} diff --git a/keyboards/dz60/keymaps/mechmerlin/readme.md b/keyboards/dz60/keymaps/mechmerlin/readme.md new file mode 100644 index 000000000000..76ff54de548b --- /dev/null +++ b/keyboards/dz60/keymaps/mechmerlin/readme.md @@ -0,0 +1,68 @@ +# MechMerlin's DZ60 Keymap + +The purpose of this keymap is to provide examples on how to do some common QMK features. + +Make example for this keyboard (after setting up your build environment): + + make dz60:mechmerlin + +## Merlin's DZ60 Hardware Info +--- + +The DZ60 is a 60% pcb produced by KBDFans. It comes in two variants, USB Mini B and USB C. It supports many many layouts. It also supports both backlight and RGB underglow. The USB C variant does not have a hardware reset switch. USB C to C is not supported. + +Merlin's DZ60 uses +- Layout B, in QMK this is LAYOUT_60_b_ansi. +- USB C +- 50g Zilents +- Arrows are 78g Zilents +- KPRepublic XD64 Case + +## Layers +--- + +Merlin's keymap has three different layers. To switch layers you can use the `MO(X)` keycode, where `X` is the layer you want to switch to. + +### _BL + +This is the base layer also known as layer 0. It is a standard QWERTY layout. It has the `_FL` layer switch key. + +### _FL + +This is the function layer also known as layer 1. It utiizes the following: +- Function Keys +- Navigation Keys +- Audio keys such as Mute, Volume Down and Volume Up. +- `_CL` layer switch key + +### _CL + +This is the control layer also known as layer 2. It utilizes the following: +- RGB Controls +- `RESET` key + +## Non Standard Keycodes +--- +### RESET + +As long `BOOTMAGIC_ENABLE` is set to `yes` in `rules.mk`, the DZ60 can be put into bootloader mode by holding the `space` key and the `b` key while plugging in. However sometmes this doesn't work or is troublesome to do, might as well use the `RESET` keycode to accomplish this. + +### RSFT_T(KC_SLSH) + +Layout B is missing the `?` key and is instead replaced with a `right shift`. This keycode makes it so that the key can be tapped for `?` and held for `right shift`. + +### LCTL_T(KC_CAPS) + +`Caps Lock` is only ever used by tapping, why not use it as a `control` key when held? This keycode makes it so that the key can be tapped for `caps lock` and held for `control`. + + +## RGB Lighting +--- + +### RGBLIGHT_SLEEP + +This is set in `mechmerlin/config.h` so that when the computer goes to sleep, the RGB lights will also go to sleep on the keyboard. They will turn back on when the computer wakes. + +### RGB Underglow Color: Yellow + +This is set in `mechmerlin/keymap.c` in the `matrix_init_user` function. The list of available colors can be found in [`quantum/rgblight_list.h`](https://github.com/qmk/qmk_firmware/blob/388df5359b913eaf1ce6fb0ef624e430ad010ea5/quantum/rgblight_list.h#L59-L121). From 3dec80b7746ee61e4c9e67da817635828dd86b7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Tue, 6 Nov 2018 21:21:44 +0100 Subject: [PATCH 378/505] Improve wording, punctuation and capitalization in newbs_getting_started guide (#4342) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Improve wording, punctuation and capitalization in newbs_getting_started guide Also add some links * Update example build command output Co-Authored-By: vomindoraan * Replace occurrences of "layout" with "keymap" Co-Authored-By: MechMerlin <30334081+mechmerlin@users.noreply.github.com> * Explicitly instruct users to open an MSYS2 MinGW 64-bit terminal * MSYS2 Console → MSYS2 MinGW * Replace thin spaces with regular spaces --- docs/newbs_getting_started.md | 78 +++++++++++++++++------------------ 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/docs/newbs_getting_started.md b/docs/newbs_getting_started.md index 2181542856ba..276c7fec327f 100644 --- a/docs/newbs_getting_started.md +++ b/docs/newbs_getting_started.md @@ -1,99 +1,97 @@ # Introduction -Your computer keyboard has a processor inside of it, not unlike the one inside your computer. This processor runs software that is responsible for detecting button presses and sending reports about the state of the keyboard when they are pressed or released. QMK fills the role of that software, detecting button presses and passing that information on to the host computer. When you build your custom layout you are creating the equivalent of an .exe for your keyboard. +Your computer keyboard has a processor inside of it, not unlike the one inside your computer. This processor runs software that is responsible for detecting button presses and sending reports about the state of the keyboard when buttons are pressed or released. QMK fills the role of that software, detecting button presses and passing that information on to the host computer. When you build your custom keymap, you are creating the equivalent of an executable program for your keyboard. -QMK tries to put a lot of power into your hands by making easy things easy, and hard things possible. You don't have to know how to program to create powerful layouts, you only have to follow a few simple syntax rules. +QMK tries to put a lot of power into your hands by making easy things easy, and hard things possible. You don't have to know how to program to create powerful keymaps — you only have to follow a few simple syntax rules. # Getting Started -Before you can build keymaps you need to install some software and setup your build environment. This only has to be done one time no matter how many keyboards you want to compile firmware for. +Before you can build keymaps, you need to install some software and set up your build environment. This only has to be done once no matter how many keyboards you plan to compile firmware for. ## Download Software ### Text Editor -You'll need a program that can edit and save **plain text** files. If you are on Windows you can make due with Notepad, and on Linux you can use Gedit, both of which are simple but functional text editors. On macOS be careful with TextEdit.app, it will not save plain text files unless you make sure to select "Make Plain text" from the "Format" menu, or you can use another program such as Sublime Text. +You'll need a program that can edit and save **plain text** files. If you're on Windows you can make do with Notepad, and on Linux you can use gedit. Both of these are simple but functional text editors. On macOS, be careful with the default TextEdit app: it will not save plain text files unless you explicitly select _Make Plain Text_ from the _Format_ menu. + +You can also download and install a dedicated text editor like [Sublime Text](https://www.sublimetext.com/) or [VS Code](https://code.visualstudio.com/). This is probably the best way to go regardless of platform, as these programs are specifically made for editing code. ?> Not sure which text editor to use? Laurence Bradford wrote [a great introduction](https://learntocodewith.me/programming/basics/text-editors/) to the subject. ### QMK Toolbox -QMK Toolbox is an optional graphical Windows and macOS program that allows you to both program and debug your custom keyboard. You will likely prefer it to easily flash your keyboard and receive the debugging messages that your keyboard will print. - -Download the files from the links below: - -For Windows: "qmk_toolbox.exe" or "qmk_toolbox_install.exe" (with installer) +QMK Toolbox is an optional graphical program for Windows and macOS that allows you to both program and debug your custom keyboard. You will likely find it invaluable for easily flashing your keyboard and viewing debug messages that it prints. -For Mac: "QMK.Toolbox.app.zip" or "QMK.Toolbox.pkg" (with installer) +[Download the latest release here.](https://github.com/qmk/qmk_toolbox/releases/latest) -* [Newest Release](https://github.com/qmk/qmk_toolbox/releases/latest) -* [Source Code](https://github.com/qmk/qmk_toolbox/) +* For Windows: `qmk_toolbox.exe` (portable) or `qmk_toolbox_install.exe` (installer) +* For macOS: `QMK.Toolbox.app.zip` (portable) or `QMK.Toolbox.pkg` (installer) -## Environment Setup +## Set Up Your Environment -We've tried to make QMK as easy to setup as possible. You only have to prepare your Linux or Unix environment and let QMK install the rest. +We've tried to make QMK as easy to set up as possible. You only have to prepare your Linux or Unix environment, then let QMK install the rest. -?> If you haven't worked with the Linux/Unix command line before there are a few basic concepts and commands you should learn. These resources will teach you enough to work with QMK:
+?> If you haven't worked with the Linux/Unix command line before, there are a few basic concepts and commands you should learn. These resources will teach you enough to be able to work with QMK:
[Must Know Linux Commands](https://www.guru99.com/must-know-linux-commands.html)
[Some Basic Unix Commands](https://www.tjhsst.edu/~dhyatt/superap/unixcmd.html) ### Windows -You will need to install msys2 and git. +You will need to install MSYS2 and Git. -* Follow the installation instructions on the msys2 homepage: http://www.msys2.org -* Close any open msys2 terminals, and open a new terminal -* Install git by running this command: `pacman -S git` +* Follow the installation instructions on the [MSYS2 homepage](http://www.msys2.org). +* Close any open MSYS2 terminals and open a new MSYS2 MinGW 64-bit terminal. +* Install Git by running this command: `pacman -S git`. ### macOS -You will need to install homebrew. Follow the instructions on the homebrew homepage: https://brew.sh +You will need to install Homebrew. Follow the instructions on the [Homebrew homepage](https://brew.sh). -After homebrew is installed continue with "Download QMK", following step "Setup QMK" runs a script that will install other packages. +After Homebrew is installed, continue with _Set Up QMK_. In that step you will run a script that will install other packages. ### Linux -You will need to install git. It's extremely likely you already have it, but if not one of the following commands should install it: +You will need to install Git. It's very likely that you already have it, but if not, one of the following commands should install it: -* Debian/Ubuntu/Devuan: `apt-get install git` -* Fedora/Redhat/Centos: `yum install git` +* Debian / Ubuntu / Devuan: `apt-get install git` +* Fedora / Red Hat / CentOS: `yum install git` * Arch: `pacman -S git` -## Download QMK +?> Docker is also an option on all platforms. [Click here for details.](getting_started_build_tools.md#docker) -Once you have setup your Linux/Unix environment you are ready to download QMK. We will do this by using git to "clone" the QMK repository. Open a Terminal or MSYS2 Console window and leave it open for the remainder of this guide. Inside that window run these two commands: +## Set Up QMK + +Once you have set up your Linux/Unix environment, you are ready to download QMK. We will do this by using Git to "clone" the QMK repository. Open a Terminal or MSYS2 MinGW window and leave it open for the remainder of this guide. Inside that window run these two commands: git clone https://github.com/qmk/qmk_firmware.git cd qmk_firmware -?> If you already know [how to use GitHub](getting_started_github.md) we recommend you create and clone your own fork instead. If you don't know what that means you can safely ignore this message. - -## Setup QMK +?> If you already know [how to use GitHub](getting_started_github.md), we recommend that you create and clone your own fork instead. If you don't know what that means, you can safely ignore this message. -QMK comes with a script to help you setup the rest of what you'll need. You should run it now by typing in this command: +QMK comes with a script to help you set up the rest of what you'll need. You should run it now by typing in this command: - ./util/qmk_install.sh + util/qmk_install.sh ## Test Your Build Environment -Now that your QMK build environment is setup you can build a firmware for your keyboard. Start by trying to build the default layout for your keyboard. You should be able to do that with a command in this format: +Now that your QMK build environment is set up, you can build a firmware for your keyboard. Start by trying to build the keyboard's default keymap. You should be able to do that with a command in this format: make :default -For example, to build a firmware for a Clueboard 66% use: +For example, to build a firmware for a Clueboard 66% you would use: make clueboard/66/rev3:default When it is done you should have a lot of output that ends similar to this: ``` -Linking: .build/clueboard_66_rev2_default.elf [OK] -Creating load file for flashing: .build/clueboard_66_rev2_default.hex [OK] -Copying clueboard_66_rev2_default.hex to qmk_firmware folder [OK] -Checking file size of clueboard_66_rev2_default.hex [OK] - * File size is fine - 25174/28672 +Linking: .build/clueboard_66_rev3_default.elf [OK] +Creating load file for flashing: .build/clueboard_66_rev3_default.hex [OK] +Copying clueboard_66_rev3_default.hex to qmk_firmware folder [OK] +Checking file size of clueboard_66_rev3_default.hex [OK] + * The firmware size is fine - 26356/28672 (2316 bytes free) ``` -## Creating Your Layout +# Creating Your Keymap -Now you are ready to create your own personal layout. Move on to [Building Your First Firmware](newbs_building_firmware.md) for that. +You are now ready to create your own personal keymap! Move on to [Building Your First Firmware](newbs_building_firmware.md) for that. From f01a80968b327720048c3e95a8e5d57891ccfd5b Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Tue, 6 Nov 2018 12:35:08 -0800 Subject: [PATCH 379/505] Port over Noxary 268.2 from Rosakiin's Noxary Firmware (#4354) * port over 268.2 from Noxary Firmware * rename files * update readme * put rozakiin's ame in more places * add configurator support * Update keyboards/noxary/268_2/n268_2.c Co-Authored-By: mechmerlin <30334081+mechmerlin@users.noreply.github.com> * Update keyboards/noxary/268_2/keymaps/default/keymap.c Co-Authored-By: mechmerlin <30334081+mechmerlin@users.noreply.github.com> * rename 268_2 keyboard files --- keyboards/noxary/268_2/268_2.c | 54 +++++ keyboards/noxary/268_2/268_2.h | 43 ++++ keyboards/noxary/268_2/config.h | 221 ++++++++++++++++++ keyboards/noxary/268_2/info.json | 12 + .../noxary/268_2/keymaps/default/config.h | 19 ++ .../noxary/268_2/keymaps/default/keymap.c | 83 +++++++ .../noxary/268_2/keymaps/default/readme.md | 1 + keyboards/noxary/268_2/readme.md | 16 ++ keyboards/noxary/268_2/rules.mk | 80 +++++++ keyboards/noxary/README.md | 6 +- 10 files changed, 533 insertions(+), 2 deletions(-) create mode 100644 keyboards/noxary/268_2/268_2.c create mode 100644 keyboards/noxary/268_2/268_2.h create mode 100644 keyboards/noxary/268_2/config.h create mode 100644 keyboards/noxary/268_2/info.json create mode 100644 keyboards/noxary/268_2/keymaps/default/config.h create mode 100644 keyboards/noxary/268_2/keymaps/default/keymap.c create mode 100644 keyboards/noxary/268_2/keymaps/default/readme.md create mode 100644 keyboards/noxary/268_2/readme.md create mode 100644 keyboards/noxary/268_2/rules.mk diff --git a/keyboards/noxary/268_2/268_2.c b/keyboards/noxary/268_2/268_2.c new file mode 100644 index 000000000000..da4e5efb7698 --- /dev/null +++ b/keyboards/noxary/268_2/268_2.c @@ -0,0 +1,54 @@ +/* Copyright 2018 Rozakiin + * + * 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 "268_2.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); +} + +__attribute__((weak)) +void led_set_user(uint8_t usb_led) { + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRB |= (1 << 0); PORTB |= (1 << 0); + } + else { + DDRB &= ~(1 << 0); PORTB &= ~(1 << 0); + } +} diff --git a/keyboards/noxary/268_2/268_2.h b/keyboards/noxary/268_2/268_2.h new file mode 100644 index 000000000000..2f5d985a33fd --- /dev/null +++ b/keyboards/noxary/268_2/268_2.h @@ -0,0 +1,43 @@ +/* Copyright 2018 Rozakiin + * + * 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 N268_2_H +#define N268_2_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K114, K115, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K214, K215, \ + K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K314, K315, \ + K400, K401, K402, K406, K409, K410, K412, K414, K415 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO, K114, K115, }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, KC_NO, KC_NO, K214, K215, }, \ + { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, KC_NO, K314, K315, }, \ + { K400, K401, K402, KC_NO, KC_NO, KC_NO, K406, KC_NO, KC_NO, K409, K410, KC_NO, K412, KC_NO, K414, K415, } \ +} + +#endif diff --git a/keyboards/noxary/268_2/config.h b/keyboards/noxary/268_2/config.h new file mode 100644 index 000000000000..f5308d8ecd30 --- /dev/null +++ b/keyboards/noxary/268_2/config.h @@ -0,0 +1,221 @@ +/* +Copyright 2018 Rozakiin + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x4E58 +#define PRODUCT_ID 0x0044 +#define DEVICE_VER 0x0002 +#define MANUFACTURER Noxary +#define PRODUCT 268.2 +#define DESCRIPTION QMK keyboard firmware for 268.2 + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +/* + * 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) + * +*/ +/* key matrix pins */ +#define MATRIX_ROW_PINS { F7, F6, F5, F0, B5 } +#define MATRIX_COL_PINS { C6, B6, C7, F4, E6, D0, D7, D1, D2, B4, D6, D4, D5, F1, D3, B1 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +/* number of backlight levels */ +#define BACKLIGHT_PIN B7 +#ifdef BACKLIGHT_PIN +#define BACKLIGHT_LEVELS 3 +#endif + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 diff --git a/keyboards/noxary/268_2/info.json b/keyboards/noxary/268_2/info.json new file mode 100644 index 000000000000..8d227afd86aa --- /dev/null +++ b/keyboards/noxary/268_2/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "Noxary 268.2", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":15, "y":2}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}] + } + } +} diff --git a/keyboards/noxary/268_2/keymaps/default/config.h b/keyboards/noxary/268_2/keymaps/default/config.h new file mode 100644 index 000000000000..9c4c2b63081f --- /dev/null +++ b/keyboards/noxary/268_2/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 Rozakiin + * + * 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 + +// place overrides here diff --git a/keyboards/noxary/268_2/keymaps/default/keymap.c b/keyboards/noxary/268_2/keymaps/default/keymap.c new file mode 100644 index 000000000000..994fe36b0cb7 --- /dev/null +++ b/keyboards/noxary/268_2/keymaps/default/keymap.c @@ -0,0 +1,83 @@ +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL1 1 +#define _FL2 2 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* _BL: Base Layer(Default) - For ISO enter use ANSI enter + * ,----------------------------------------------------------------. + * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \|BSpc| Grv| + * |----------------------------------------------------------------| + * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | Del| + * |----------------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '| #| Ent|PgUp| + * |----------------------------------------------------------------| + * |Shift| \| Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |Alt|Mo(1)|Ctrl|Lef|Dow|Rght| + * `----------------------------------------------------------------' + */ + [_BL] = LAYOUT( + 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_BSPC, 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_BSLS, KC_DEL, + 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_SPC, KC_RALT, MO(_FL1), KC_LEFT, KC_DOWN, KC_RGHT), + /* _FL1: Function Layer 1 - For ISO enter use ANSI enter + * ,----------------------------------------------------------------. + * | `|F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| |PScr| | + * |----------------------------------------------------------------| + * | | | | |RST| | | | | | | | | | Ins| + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | |Home| + * |----------------------------------------------------------------| + * | | | | | | | | | |Bl-|Bl+| |Mute|Vol+| End| + * |----------------------------------------------------------------| + * | | | | BL_Toggle | | | | |Vol-| | + * `----------------------------------------------------------------' + */ + [_FL1] = LAYOUT( + 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_PSCR, _______, + _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, + _______, _______, _______, _______, _______, _______, _______, _______, BL_DEC, BL_INC, _______, KC_MUTE, KC_VOLU, KC_END, + _______, _______, _______, BL_TOGG, _______, _______, _______, KC_VOLD, _______), + /* _FL2: Function Layer 2 - For ISO enter use ANSI enter + * ,----------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | + * `----------------------------------------------------------------' + */ + [_FL2] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______), + +}; + + +void matrix_init_user(void) { +} + +void matrix_scan_user(void) { +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + + diff --git a/keyboards/noxary/268_2/keymaps/default/readme.md b/keyboards/noxary/268_2/keymaps/default/readme.md new file mode 100644 index 000000000000..c4c832cc645d --- /dev/null +++ b/keyboards/noxary/268_2/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for 268_2 diff --git a/keyboards/noxary/268_2/readme.md b/keyboards/noxary/268_2/readme.md new file mode 100644 index 000000000000..85d1a47179c6 --- /dev/null +++ b/keyboards/noxary/268_2/readme.md @@ -0,0 +1,16 @@ +# Noxary 268.2 + +![268.2](https://www.keebtalk.com/uploads/db8059/original/2X/6/65b93c83cadd98bbf8e3b1d739621d54b682609a.jpg) + +A fully customizable 65% keyboard. + +* Keyboard Maintainer: [Rozakiin](https://github.com/rozakiin) +* Hardware Supported: 268.2 PCB + * rev1 +* Hardware Availability: [Noxary](https://shop.noxary.co/collections/268-2/products/noxary-268-2-polycarbonate) + +Make example for this keyboard (after setting up your build environment): + + make noxary/268_2:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/noxary/268_2/rules.mk b/keyboards/noxary/268_2/rules.mk new file mode 100644 index 000000000000..9b6d7e672da5 --- /dev/null +++ b/keyboards/noxary/268_2/rules.mk @@ -0,0 +1,80 @@ +# 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 + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = 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 +# 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 = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) diff --git a/keyboards/noxary/README.md b/keyboards/noxary/README.md index bd4b4b591f5f..8dbd85f7ef90 100644 --- a/keyboards/noxary/README.md +++ b/keyboards/noxary/README.md @@ -4,6 +4,8 @@ All files related to firmware of Noxary Keyboards designed by [Rozakiin](https:/ ### Keyboards -- [268](./268/): Original repo [here](https://github.com/Rozakiin/Noxary_Firmware). Imported by kind [permission](https://github.com/Rozakiin/Noxary_Firmware/issues/1) of @rozakiin +- [268](./268/): Original repo [here](https://github.com/Rozakiin/Noxary_Firmware). Imported by kind [permission](https://github.com/Rozakiin/Noxary_Firmware/issues/1) of @rozakiin -- [x268](./x268/): Original repo [here](https://github.com/Rozakiin/Noxary_Firmware). Imported by kind [permission](https://github.com/Rozakiin/Noxary_Firmware/issues/1) of @rozakiin +- [268.2](./268_2/): Original repo [here](https://github.com/Rozakiin/Noxary_Firmware). Imported by kind [permission](https://github.com/Rozakiin/Noxary_Firmware/issues/1) of @rozakiin + +- [x268](./x268/): Original repo [here](https://github.com/Rozakiin/Noxary_Firmware). Imported by kind [permission](https://github.com/Rozakiin/Noxary_Firmware/issues/1) of @rozakiin From fc477a1ee7a68cab4ae8fb7d7f0c8d6a4e6c8509 Mon Sep 17 00:00:00 2001 From: Danny Date: Tue, 6 Nov 2018 16:13:58 -0500 Subject: [PATCH 380/505] Add Tragicforce 68 layout for split backspace and add configurator layouts (#4378) --- keyboards/tragicforce68/info.json | 236 +++++++++++++++++++++++- keyboards/tragicforce68/tragicforce68.h | 18 ++ 2 files changed, 251 insertions(+), 3 deletions(-) diff --git a/keyboards/tragicforce68/info.json b/keyboards/tragicforce68/info.json index f3e3d6adad13..550040a3a1f7 100644 --- a/keyboards/tragicforce68/info.json +++ b/keyboards/tragicforce68/info.json @@ -5,8 +5,238 @@ "width": 17.25, "height": 5, "layouts": { - "LAYOUT": { - "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"x":15.25, "y":1}, {"x":16.25, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"x":15.25, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"x":14.25, "y":4}, {"x":15.25, "y":4}, {"x":16.25, "y":4}] - } + "LAYOUT": { + "layout": [ + {"label":"~", "x":0, "y":0}, + {"label":"!", "x":1, "y":0}, + {"label":"@", "x":2, "y":0}, + {"label":"#", "x":3, "y":0}, + {"label":"$", "x":4, "y":0}, + {"label":"%", "x":5, "y":0}, + {"label":"^", "x":6, "y":0}, + {"label":"&", "x":7, "y":0}, + {"label":"*", "x":8, "y":0}, + {"label":"(", "x":9, "y":0}, + {"label":")", "x":10, "y":0}, + {"label":"_", "x":11, "y":0}, + {"label":"+", "x":12, "y":0}, + {"label":"Backspace", "x":13, "y":0, "w":2}, + {"x":15.25, "y":0}, + {"x":16.25, "y":0}, + + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":" {", "x":11.5, "y":1}, + {"label":"}", "x":12.5, "y":1}, + {"label":"|", "x":13.5, "y":1, "w":1.5}, + {"x":15.25, "y":1}, + {"x":16.25, "y":1}, + + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":":", "x":10.75, "y":2}, + {"label":"\"", "x":11.75, "y":2}, + {"label":"Enter", "x":12.75, "y":2, "w":2.25}, + + {"label":"Shift", "x":0, "y":3, "w":2.25}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":"<", "x":9.25, "y":3}, + {"label":">", "x":10.25, "y":3}, + {"label":"?", "x":11.25, "y":3}, + {"label":"Shift", "x":12.25, "y":3, "w":2.75}, + {"x":15.25, "y":3}, + + {"label":"Ctrl", "x":0, "y":4, "w":1.25}, + {"label":"Win", "x":1.25, "y":4, "w":1.25}, + {"label":"Alt", "x":2.5, "y":4, "w":1.25}, + {"x":3.75, "y":4, "w":6.25}, + {"label":"Alt", "x":10, "y":4, "w":1.25}, + {"label":"Win", "x":11.25, "y":4, "w":1.25}, + {"label":"Menu", "x":12.5, "y":4, "w":1.25}, + {"x":14.25, "y":4}, + {"x":15.25, "y":4}, + {"x":16.25, "y":4} + ] + }, + "LAYOUT_split_space": { + "layout": [ + {"label":"~", "x":0, "y":0}, + {"label":"!", "x":1, "y":0}, + {"label":"@", "x":2, "y":0}, + {"label":"#", "x":3, "y":0}, + {"label":"$", "x":4, "y":0}, + {"label":"%", "x":5, "y":0}, + {"label":"^", "x":6, "y":0}, + {"label":"&", "x":7, "y":0}, + {"label":"*", "x":8, "y":0}, + {"label":"(", "x":9, "y":0}, + {"label":")", "x":10, "y":0}, + {"label":"_", "x":11, "y":0}, + {"label":"+", "x":12, "y":0}, + {"label":"Backspace", "x":13, "y":0, "w":2}, + {"x":15.25, "y":0}, + {"x":16.25, "y":0}, + + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":" {", "x":11.5, "y":1}, + {"label":"}", "x":12.5, "y":1}, + {"label":"|", "x":13.5, "y":1, "w":1.5}, + {"x":15.25, "y":1}, + {"x":16.25, "y":1}, + + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":":", "x":10.75, "y":2}, + {"label":"\"", "x":11.75, "y":2}, + {"label":"Enter", "x":12.75, "y":2, "w":2.25}, + + {"label":"Shift", "x":0, "y":3, "w":2.25}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":"<", "x":9.25, "y":3}, + {"label":">", "x":10.25, "y":3}, + {"label":"?", "x":11.25, "y":3}, + {"label":"Shift", "x":12.25, "y":3, "w":2.75}, + {"x":15.25, "y":3}, + + {"label":"Ctrl", "x":0, "y":4, "w":1.25}, + {"label":"Win", "x":1.25, "y":4, "w":1.25}, + {"label":"Alt", "x":2.5, "y":4, "w":1.25}, + {"x":3.75, "y":4, "w":2.25}, + {"x":6, "y":4, "w":1.75}, + {"x":7.75, "y":4, "w":2.25}, + {"label":"Alt", "x":10, "y":4, "w":1.25}, + {"label":"Win", "x":11.25, "y":4, "w":1.25}, + {"label":"Menu", "x":12.5, "y":4, "w":1.25}, + {"x":14.25, "y":4}, + {"x":15.25, "y":4}, + {"x":16.25, "y":4} + ] + }, + "LAYOUT_split_space_and_backspace": { + "layout": [ + {"label":"~", "x":0, "y":0}, + {"label":"!", "x":1, "y":0}, + {"label":"@", "x":2, "y":0}, + {"label":"#", "x":3, "y":0}, + {"label":"$", "x":4, "y":0}, + {"label":"%", "x":5, "y":0}, + {"label":"^", "x":6, "y":0}, + {"label":"&", "x":7, "y":0}, + {"label":"*", "x":8, "y":0}, + {"label":"(", "x":9, "y":0}, + {"label":")", "x":10, "y":0}, + {"label":"_", "x":11, "y":0}, + {"label":"+", "x":12, "y":0}, + {"label":"Del", "x":13, "y":0}, + {"label":"Backspace", "x":14, "y":0}, + {"x":15.25, "y":0}, + {"x":16.25, "y":0}, + + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":" {", "x":11.5, "y":1}, + {"label":"}", "x":12.5, "y":1}, + {"label":"|", "x":13.5, "y":1, "w":1.5}, + {"x":15.25, "y":1}, + {"x":16.25, "y":1}, + + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":":", "x":10.75, "y":2}, + {"label":"\"", "x":11.75, "y":2}, + {"label":"Enter", "x":12.75, "y":2, "w":2.25}, + + {"label":"Shift", "x":0, "y":3, "w":2.25}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":"<", "x":9.25, "y":3}, + {"label":">", "x":10.25, "y":3}, + {"label":"?", "x":11.25, "y":3}, + {"label":"Shift", "x":12.25, "y":3, "w":2.75}, + {"x":15.25, "y":3}, + + {"label":"Ctrl", "x":0, "y":4, "w":1.25}, + {"label":"Win", "x":1.25, "y":4, "w":1.25}, + {"label":"Alt", "x":2.5, "y":4, "w":1.25}, + {"x":3.75, "y":4, "w":2.25}, + {"x":6, "y":4, "w":1.75}, + {"x":7.75, "y":4, "w":2.25}, + {"label":"Alt", "x":10, "y":4, "w":1.25}, + {"label":"Win", "x":11.25, "y":4, "w":1.25}, + {"label":"Menu", "x":12.5, "y":4, "w":1.25}, + {"x":14.25, "y":4}, + {"x":15.25, "y":4}, + {"x":16.25, "y":4} + ] + } } } diff --git a/keyboards/tragicforce68/tragicforce68.h b/keyboards/tragicforce68/tragicforce68.h index e1b2a038d085..a63ce50a5ece 100644 --- a/keyboards/tragicforce68/tragicforce68.h +++ b/keyboards/tragicforce68/tragicforce68.h @@ -38,6 +38,24 @@ { J1, J2, J3, J4, J5, J6, J7, J8 } \ } +#define LAYOUT_split_space_and_backspace( \ + A1, A2, A3, A4, A5, A6, A7, A8, E1, E2, E3, E4, E5, E6, H7, E7, E8, \ + B1, B2, B3, B4, B5, B6, B7, B8, F1, F2, F3, F4, F5, F6, F7, F8, \ + C1, C2, C3, C4, C5, C6, C7, C8, G1, G2, G3, G4, G5, \ + D1, D2, D3, D4, D5, D6, D7, D8, H1, H2, H3, H4, H5, \ + J1, J2, J3, J4, J5, J6, J7, J8, H6, G6, G7, G8 \ +) { \ + { A1, A2, A3, A4, A5, A6, A7, A8 }, \ + { B1, B2, B3, B4, B5, B6, B7, B8 }, \ + { C1, C2, C3, C4, C5, C6, C7, C8 }, \ + { D1, D2, D3, D4, D5, D6, D7, D8 }, \ + { E1, E2, E3, E4, E5, E6, E7, E8 }, \ + { F1, F2, F3, F4, F5, F6, F7, F8 }, \ + { G1, G2, G3, G4, G5, G6, G7, G8 }, \ + { H1, H2, H3, H4, H5, H6, H7, KC_NO }, \ + { J1, J2, J3, J4, J5, J6, J7, J8 } \ +} + #define LAYOUT_kc( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K10, K11, K12, K13, K14, K15, K16, \ K17, K18, K20, K21, K22, K23, K24, K25, K26, K27, K28, K30, K31, K32, K33, K34, \ From a30dd2bb1711f5402007adf89af9b3adb758a7fb Mon Sep 17 00:00:00 2001 From: Danilo Vulicevic Date: Wed, 7 Nov 2018 02:04:02 +0100 Subject: [PATCH 381/505] Add xd75/billypython keymap (#4381) * Add xd75/billypython keymap * Expand rules.mk (cherry picked from commit 806fee94ae3a21b6ca7a34624101349b57d41b75) * Expand billypython's rules.mk * Remove unused stuff in whitefox/billypython --- .../whitefox/keymaps/billypython/config.h | 3 - .../whitefox/keymaps/billypython/keymap.c | 52 +------- .../whitefox/keymaps/billypython/rules.mk | 5 + .../whitefox/keymaps/konstantin/rules.mk | 5 + keyboards/xd75/keymaps/billypython/config.h | 17 +++ keyboards/xd75/keymaps/billypython/keymap.c | 119 ++++++++++++++++++ keyboards/xd75/keymaps/billypython/rules.mk | 15 +++ 7 files changed, 163 insertions(+), 53 deletions(-) create mode 100644 keyboards/xd75/keymaps/billypython/config.h create mode 100644 keyboards/xd75/keymaps/billypython/keymap.c create mode 100644 keyboards/xd75/keymaps/billypython/rules.mk diff --git a/keyboards/whitefox/keymaps/billypython/config.h b/keyboards/whitefox/keymaps/billypython/config.h index d1c3002d270c..275f8effba79 100644 --- a/keyboards/whitefox/keymaps/billypython/config.h +++ b/keyboards/whitefox/keymaps/billypython/config.h @@ -2,9 +2,6 @@ #define FORCE_NKRO -#undef IS_COMMAND -#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL))) - #define MAGIC_KEY_LAYER0_ALT1 BSLS #define MAGIC_KEY_BOOTLOADER ESC diff --git a/keyboards/whitefox/keymaps/billypython/keymap.c b/keyboards/whitefox/keymaps/billypython/keymap.c index 8096885cf8a9..dfc7d6a967f0 100644 --- a/keyboards/whitefox/keymaps/billypython/keymap.c +++ b/keyboards/whitefox/keymaps/billypython/keymap.c @@ -2,18 +2,11 @@ #define TOP LCTL(KC_HOME) #define BOTTOM LCTL(KC_END) -#define DSKTP_L LCTL(LGUI(KC_LEFT)) -#define DSKTP_R LCTL(LGUI(KC_RGHT)) #define FN MO(L_FN) #define FN_CAPS LT(L_FN, KC_CAPS) #define FN_FNLK TT(L_FN) -#define DESKTOP TD(TD_DESKTOP) -#define FN_RCTL TD(TD_FN_RCTL) -#define RAL_LAL TD(TD_RAL_LAL) -#define RAL_RGU TD(TD_RAL_RGU) -#define RCT_RSF TD(TD_RCT_RSF) #define RSF_RCT TD(TD_RSF_RCT) #define COMMA UC(0x002C) @@ -62,37 +55,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } } -struct { - bool fn_on; // Layer state when tap dance started - bool started; -} td_fn_rctrl_data; - -void td_fn_rctrl_each(qk_tap_dance_state_t *state, void *user_data) { - if (!td_fn_rctrl_data.started) { - td_fn_rctrl_data.fn_on = IS_LAYER_ON(L_FN); - td_fn_rctrl_data.started = true; - } - // Single tap → Fn, double tap → RCtrl, triple tap etc. → Fn+RCtrl - if (state->count == 1 || state->count == 3) { - layer_on(L_FN); - } else if (state->count == 2) { - if (!td_fn_rctrl_data.fn_on) { - layer_off(L_FN); - } - register_code(KC_RCTL); - } -} - -void td_fn_rctrl_reset(qk_tap_dance_state_t *state, void *user_data) { - if ((state->count == 1 || state->count > 2) && !td_fn_rctrl_data.fn_on) { - layer_off(L_FN); - } - if (state->count >= 2) { - unregister_code(KC_RCTL); - } - td_fn_rctrl_data.started = false; -} - #define ACTION_TAP_DANCE_DOUBLE_MODS(mod1, mod2) { \ .fn = { td_double_mods_each, NULL, td_double_mods_reset }, \ .user_data = &(qk_tap_dance_pair_t){ mod1, mod2 }, \ @@ -122,20 +84,10 @@ void td_double_mods_reset(qk_tap_dance_state_t *state, void *user_data) { } enum tap_dance { - TD_DESKTOP, - TD_FN_RCTL, - TD_RAL_LAL, - TD_RAL_RGU, - TD_RCT_RSF, TD_RSF_RCT, }; qk_tap_dance_action_t tap_dance_actions[] = { - [TD_DESKTOP] = ACTION_TAP_DANCE_DOUBLE(LCTL(LGUI(KC_D)), LCTL(LGUI(KC_F4))), // Add/close virtual desktop - [TD_FN_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(td_fn_rctrl_each, NULL, td_fn_rctrl_reset), - [TD_RAL_LAL] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RALT, KC_LALT), - [TD_RAL_RGU] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RALT, KC_RGUI), - [TD_RCT_RSF] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RCTL, KC_RSFT), [TD_RSF_RCT] = ACTION_TAP_DANCE_DOUBLE_MODS(KC_RSFT, KC_RCTL), }; @@ -150,7 +102,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ * │ LShift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │SftCtl│ ↑ │PgD│ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤ - * │LCtl│LGui│LAlt│ Space │AlGu│FnLk│ │ ← │ ↓ │ → │ + * │LCtl│LGui│LAlt│ Space │RAlt│FnLk│ │ ← │ ↓ │ → │ * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ */ [L_BASE] = LAYOUT_truefox( \ @@ -158,7 +110,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { 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_DEL, \ FN_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,RSF_RCT, KC_UP, KC_PGDN, \ - KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, RAL_RGU,FN_FNLK, KC_LEFT,KC_DOWN,KC_RGHT \ + KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,FN_FNLK, KC_LEFT,KC_DOWN,KC_RGHT \ ), /* Function layer diff --git a/keyboards/whitefox/keymaps/billypython/rules.mk b/keyboards/whitefox/keymaps/billypython/rules.mk index abf92c2c4651..c42f6e7059d3 100644 --- a/keyboards/whitefox/keymaps/billypython/rules.mk +++ b/keyboards/whitefox/keymaps/billypython/rules.mk @@ -1,10 +1,15 @@ +AUDIO_ENABLE = no BACKLIGHT_ENABLE = no +BLUETOOTH_ENABLE = no BOOTMAGIC_ENABLE = no COMMAND_ENABLE = yes CONSOLE_ENABLE = yes EXTRAKEY_ENABLE = yes +MIDI_ENABLE = no MOUSEKEY_ENABLE = yes NKRO_ENABLE = yes +RGBLIGHT_ENABLE = no +SLEEP_LIGHT_ENABLE = no TAP_DANCE_ENABLE = yes UNICODE_ENABLE = yes VISUALIZER_ENABLE = no diff --git a/keyboards/whitefox/keymaps/konstantin/rules.mk b/keyboards/whitefox/keymaps/konstantin/rules.mk index abf92c2c4651..c42f6e7059d3 100644 --- a/keyboards/whitefox/keymaps/konstantin/rules.mk +++ b/keyboards/whitefox/keymaps/konstantin/rules.mk @@ -1,10 +1,15 @@ +AUDIO_ENABLE = no BACKLIGHT_ENABLE = no +BLUETOOTH_ENABLE = no BOOTMAGIC_ENABLE = no COMMAND_ENABLE = yes CONSOLE_ENABLE = yes EXTRAKEY_ENABLE = yes +MIDI_ENABLE = no MOUSEKEY_ENABLE = yes NKRO_ENABLE = yes +RGBLIGHT_ENABLE = no +SLEEP_LIGHT_ENABLE = no TAP_DANCE_ENABLE = yes UNICODE_ENABLE = yes VISUALIZER_ENABLE = no diff --git a/keyboards/xd75/keymaps/billypython/config.h b/keyboards/xd75/keymaps/billypython/config.h new file mode 100644 index 000000000000..275f8effba79 --- /dev/null +++ b/keyboards/xd75/keymaps/billypython/config.h @@ -0,0 +1,17 @@ +#pragma once + +#define FORCE_NKRO + +#define MAGIC_KEY_LAYER0_ALT1 BSLS +#define MAGIC_KEY_BOOTLOADER ESC + +#define MOUSEKEY_DELAY 50 +#define MOUSEKEY_INTERVAL 15 +#define MOUSEKEY_MAX_SPEED 4 +#define MOUSEKEY_TIME_TO_MAX 50 +#define MOUSEKEY_WHEEL_MAX_SPEED 1 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 50 + +#define PERMISSIVE_HOLD +#define TAPPING_TERM 200 +#define TAPPING_TOGGLE 2 diff --git a/keyboards/xd75/keymaps/billypython/keymap.c b/keyboards/xd75/keymaps/billypython/keymap.c new file mode 100644 index 000000000000..8a06074ca5f3 --- /dev/null +++ b/keyboards/xd75/keymaps/billypython/keymap.c @@ -0,0 +1,119 @@ +#include QMK_KEYBOARD_H + +#define TOP LCTL(KC_HOME) +#define BOTTOM LCTL(KC_END) + +#define FN MO(L_FN) +#define FN_CAPS LT(L_FN, KC_CAPS) +#define FN_FNLK TT(L_FN) + +#define COMMA UC(0x002C) +#define L_PAREN UC(0x0028) +#define R_PAREN UC(0x0029) +#define EQUALS UC(0x003D) +#define TIMES UC(0x00D7) +#define DIVIDE UC(0x00F7) +#define MINUS UC(0x2212) + +void eeconfig_init_user(void) { + set_unicode_input_mode(UC_LNX); +} + +enum layers { + L_BASE, + L_FN, + L_NUMPAD, +}; + +enum custom_keycodes { + CLEAR = SAFE_RANGE, + NUMPAD, +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case CLEAR: + if (record->event.pressed) { + SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE)); + } + return false; + + case NUMPAD: + if (record->event.pressed) { + layer_invert(L_NUMPAD); + bool num_lock = host_keyboard_leds() & 1< Date: Wed, 7 Nov 2018 09:25:18 -0700 Subject: [PATCH 382/505] Configurable Rainbow Swirl range (#4376) * Configurable Rainbow Swirl range This allows tweaking of the rainbow effect to get different effects on keyboards with varied LED layouts. We found the value 1950 works on the RGBKB.net Sol to get a cool striped effect across the keyboard. * Document RGBLIGHT_RAINBOW_SWIRL_RANGE * Better wording for the documentation --- docs/feature_rgblight.md | 1 + quantum/rgblight.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md index a2820347deb7..0205ebe91a7c 100644 --- a/docs/feature_rgblight.md +++ b/docs/feature_rgblight.md @@ -122,6 +122,7 @@ The following options can be used to tweak the various animations: |`RGBLIGHT_EFFECT_KNIGHT_LED_NUM` |`RGBLED_NUM` |The number of LEDs to have the "Knight" animation travel | |`RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL`|`1000` |How long to wait between light changes for the "Christmas" animation, in milliseconds| |`RGBLIGHT_EFFECT_CHRISTMAS_STEP` |`2` |The number of LEDs to group the red/green colors by for the "Christmas" animation | +|`RGBLIGHT_RAINBOW_SWIRL_RANGE` |`360` |Range adjustment for the rainbow swirl effect to get different swirls | You can also modify the speeds that the different modes animate at: diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 94e9c0a3b201..9ce3b2309253 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -679,6 +679,10 @@ void rgblight_effect_rainbow_mood(uint8_t interval) { #endif #ifdef RGBLIGHT_EFFECT_RAINBOW_SWIRL +#ifndef RGBLIGHT_RAINBOW_SWIRL_RANGE + #define RGBLIGHT_RAINBOW_SWIRL_RANGE 360 +#endif + __attribute__ ((weak)) const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {100, 50, 20}; @@ -692,7 +696,7 @@ void rgblight_effect_rainbow_swirl(uint8_t interval) { } last_timer = timer_read(); for (i = 0; i < RGBLED_NUM; i++) { - hue = (360 / RGBLED_NUM * i + current_hue) % 360; + hue = (RGBLIGHT_RAINBOW_SWIRL_RANGE / RGBLED_NUM * i + current_hue) % 360; sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i]); } rgblight_set(); From 945dd946ab2679882b7cd923013ce5424f8f33b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Wed, 7 Nov 2018 18:29:57 +0100 Subject: [PATCH 383/505] Fix misspelled make option, format rules.mk files (#4382) --- .../whitefox/keymaps/billypython/rules.mk | 28 +++++++++---------- .../whitefox/keymaps/konstantin/rules.mk | 28 +++++++++---------- keyboards/xd75/keymaps/billypython/rules.mk | 28 +++++++++---------- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/keyboards/whitefox/keymaps/billypython/rules.mk b/keyboards/whitefox/keymaps/billypython/rules.mk index c42f6e7059d3..8fbc1f3af489 100644 --- a/keyboards/whitefox/keymaps/billypython/rules.mk +++ b/keyboards/whitefox/keymaps/billypython/rules.mk @@ -1,15 +1,15 @@ -AUDIO_ENABLE = no -BACKLIGHT_ENABLE = no -BLUETOOTH_ENABLE = no -BOOTMAGIC_ENABLE = no -COMMAND_ENABLE = yes -CONSOLE_ENABLE = yes -EXTRAKEY_ENABLE = yes -MIDI_ENABLE = no -MOUSEKEY_ENABLE = yes -NKRO_ENABLE = yes -RGBLIGHT_ENABLE = no -SLEEP_LIGHT_ENABLE = no -TAP_DANCE_ENABLE = yes -UNICODE_ENABLE = yes +AUDIO_ENABLE = no +BACKLIGHT_ENABLE = no +BLUETOOTH_ENABLE = no +BOOTMAGIC_ENABLE = no +COMMAND_ENABLE = yes +CONSOLE_ENABLE = yes +EXTRAKEY_ENABLE = yes +MIDI_ENABLE = no +MOUSEKEY_ENABLE = yes +NKRO_ENABLE = yes +RGBLIGHT_ENABLE = no +SLEEP_LED_ENABLE = no +TAP_DANCE_ENABLE = yes +UNICODE_ENABLE = yes VISUALIZER_ENABLE = no diff --git a/keyboards/whitefox/keymaps/konstantin/rules.mk b/keyboards/whitefox/keymaps/konstantin/rules.mk index c42f6e7059d3..8fbc1f3af489 100644 --- a/keyboards/whitefox/keymaps/konstantin/rules.mk +++ b/keyboards/whitefox/keymaps/konstantin/rules.mk @@ -1,15 +1,15 @@ -AUDIO_ENABLE = no -BACKLIGHT_ENABLE = no -BLUETOOTH_ENABLE = no -BOOTMAGIC_ENABLE = no -COMMAND_ENABLE = yes -CONSOLE_ENABLE = yes -EXTRAKEY_ENABLE = yes -MIDI_ENABLE = no -MOUSEKEY_ENABLE = yes -NKRO_ENABLE = yes -RGBLIGHT_ENABLE = no -SLEEP_LIGHT_ENABLE = no -TAP_DANCE_ENABLE = yes -UNICODE_ENABLE = yes +AUDIO_ENABLE = no +BACKLIGHT_ENABLE = no +BLUETOOTH_ENABLE = no +BOOTMAGIC_ENABLE = no +COMMAND_ENABLE = yes +CONSOLE_ENABLE = yes +EXTRAKEY_ENABLE = yes +MIDI_ENABLE = no +MOUSEKEY_ENABLE = yes +NKRO_ENABLE = yes +RGBLIGHT_ENABLE = no +SLEEP_LED_ENABLE = no +TAP_DANCE_ENABLE = yes +UNICODE_ENABLE = yes VISUALIZER_ENABLE = no diff --git a/keyboards/xd75/keymaps/billypython/rules.mk b/keyboards/xd75/keymaps/billypython/rules.mk index 5a502b152678..c935bbac1161 100644 --- a/keyboards/xd75/keymaps/billypython/rules.mk +++ b/keyboards/xd75/keymaps/billypython/rules.mk @@ -1,15 +1,15 @@ -AUDIO_ENABLE = no -BACKLIGHT_ENABLE = no -BLUETOOTH_ENABLE = no -BOOTMAGIC_ENABLE = no -COMMAND_ENABLE = yes -CONSOLE_ENABLE = yes -EXTRAKEY_ENABLE = yes -MIDI_ENABLE = no -MOUSEKEY_ENABLE = yes -NKRO_ENABLE = yes -RGBLIGHT_ENABLE = no -SLEEP_LIGHT_ENABLE = no -TAP_DANCE_ENABLE = no -UNICODE_ENABLE = yes +AUDIO_ENABLE = no +BACKLIGHT_ENABLE = no +BLUETOOTH_ENABLE = no +BOOTMAGIC_ENABLE = no +COMMAND_ENABLE = yes +CONSOLE_ENABLE = yes +EXTRAKEY_ENABLE = yes +MIDI_ENABLE = no +MOUSEKEY_ENABLE = yes +NKRO_ENABLE = yes +RGBLIGHT_ENABLE = no +SLEEP_LED_ENABLE = no +TAP_DANCE_ENABLE = no +UNICODE_ENABLE = yes VISUALIZER_ENABLE = no From ba76fcfb8bbc531213619f2893415c8744b65a47 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Wed, 7 Nov 2018 21:39:29 -0800 Subject: [PATCH 384/505] Add Layout-b for GH60 satan (#4123) * Add Layout-b for GH60 satan * Update layout, toggle for colemak layout * Rename layout, replace function with KC_GESC * Update Layer order, Readme * Remove unnecessary code * Add backspace in extend layer --- keyboards/satan/keymaps/abhixec/keymap.c | 76 +++++++++++++++++++++++ keyboards/satan/keymaps/abhixec/readme.md | 19 ++++++ keyboards/satan/keymaps/abhixec/rules.mk | 18 ++++++ keyboards/satan/satan.h | 29 +++++++++ 4 files changed, 142 insertions(+) create mode 100644 keyboards/satan/keymaps/abhixec/keymap.c create mode 100644 keyboards/satan/keymaps/abhixec/readme.md create mode 100644 keyboards/satan/keymaps/abhixec/rules.mk diff --git a/keyboards/satan/keymaps/abhixec/keymap.c b/keyboards/satan/keymaps/abhixec/keymap.c new file mode 100644 index 000000000000..59a8c4312011 --- /dev/null +++ b/keyboards/satan/keymaps/abhixec/keymap.c @@ -0,0 +1,76 @@ +#include QMK_KEYBOARD_H + + +// Each layer gets a name for readability, which is then used in the keymap matix 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 2 +#define _CL 1 +#define _EL 3 + + +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| Del| + * |-----------------------------------------------------------| + * |Ctrl|Gui |Alt | Space |Alt |Gui |FN |Ctrl | + * `-----------------------------------------------------------' + */ +[_BL] = LAYOUT_60_ansi_split_rshift( + KC_GESC, 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(_EL, 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_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_DEL, \ + KC_LCTL, KC_LALT,KC_LGUI, KC_SPC, KC_RALT,KC_RGUI, MO(_FL),KC_RCTL), + +/* Keymap _CL: (Colemak Layer) + */ +[_CL] = LAYOUT_60_ansi_split_rshift( + KC_GESC, 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_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC,KC_BSLS, \ + LT(_EL, 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_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, KC_DEL, \ + KC_LCTL, KC_LALT,KC_LGUI, KC_SPC, KC_RALT,KC_RGUI, MO(_FL),KC_RCTL), + +[_EL] = LAYOUT_60_ansi_split_rshift( + + 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_LCTL,KC_WH_U,_______,_______,KC_MS_U,KC_PGUP,KC_HOME,KC_UP,KC_END,KC_DEL, KC_GESC, _______,_______, \ + _______,KC_LALT,KC_WH_D, KC_LSFT,_______,KC_MS_D,KC_PGDOWN,KC_LEFT,KC_DOWN,KC_RIGHT, KC_BSPC,_______,_______, \ +_______,KC_UNDO,KC_CUT,KC_COPY,KC_PASTE, KC_MS_BTN1, KC_MS_BTN3, KC_MS_BTN2,KC_MS_LEFT,KC_MS_RIGHT,_______,_______, _______, \ + _______,_______,_______, _______, _______,_______,_______,_______), + + + /* Keymap _FL: Function Layer + * ,-----------------------------------------------------------. + * | KC_GRV|F1|F2|F3|F4|F5|F6|F7| F8 | F9 |10|F11|F12| | + * |-----------------------------------------------------------| + * | | | | | | | | | | | |BL-|BL+|BL | + * |-----------------------------------------------------------| + * | | | | | | | | | |HOME| | | + * |-----------------------------------------------------------| + * | | | | | | |V_DWN|V_UP|MUTE | END || |_CL | + * |-----------------------------------------------------------| + * | | | | | | | | | + * `-----------------------------------------------------------' + */ + +[_FL] = LAYOUT_60_ansi_split_rshift( + + 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_PSCREEN, BL_DEC, BL_INC,BL_TOGG, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,KC_HOME,_______,_______, \ + _______,_______,_______,_______,_______,_______,KC_AUDIO_VOL_DOWN,KC_AUDIO_VOL_UP,KC_AUDIO_MUTE,KC_END,_______,_______, TG(_CL), \ + _______,_______,_______, _______, _______,_______,_______,_______) + +}; + diff --git a/keyboards/satan/keymaps/abhixec/readme.md b/keyboards/satan/keymaps/abhixec/readme.md new file mode 100644 index 000000000000..59a95b7fcf5a --- /dev/null +++ b/keyboards/satan/keymaps/abhixec/readme.md @@ -0,0 +1,19 @@ +# default Satan GH60 layout + +The layout for this keyboard is: +![Layout-2](https://i.imgur.com/Eqp8hov.jpg) + +Currently there are 3 layers: + +1. Base Layer is qwerty +2. 1st layer is colemak +3. 2nd layer is function layer +4. 3rd layer is extend layer + +How to use the layers: +1. Base is default. If you want Colemak then press function key and del next to the right shift (this combination will be used to toggle the layer on and off) +2. Function layer is accessible by holding down the function key. +3. Extend layer is accsessible by holding down the capslock. + Which when tapped acts like backspace when held triggers the Extend layer capability. + + diff --git a/keyboards/satan/keymaps/abhixec/rules.mk b/keyboards/satan/keymaps/abhixec/rules.mk new file mode 100644 index 000000000000..fdbd25ea80fe --- /dev/null +++ b/keyboards/satan/keymaps/abhixec/rules.mk @@ -0,0 +1,18 @@ +# 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 + diff --git a/keyboards/satan/satan.h b/keyboards/satan/satan.h index 0d9dd96a11be..a2a598460126 100644 --- a/keyboards/satan/satan.h +++ b/keyboards/satan/satan.h @@ -36,6 +36,35 @@ {k40, k41, k42, XXX, XXX, k45, XXX, XXX, XXX, k49, k4a, k4b, k4c, k4d} \ } + +/* Satan GH60 ANSI layout-B + * ,-----------------------------------------------------------. + * | 00| 01| 02| 03| 04| 05| 06| 07| 08| 09| 0a| 0b| 0c| 0d | + * |-----------------------------------------------------------| + * | 10 | 11| 12| 13| 14| 15| 16| 17| 18| 19| 1a| 1b| 1c| 1d | + * |-----------------------------------------------------------| + * | 20 | 21| 22| 23| 24| 25| 26| 27| 28| 29| 2a| 2b| 2d | + * |-----------------------------------------------------------| + * | 30 | 32| 33| 34| 35| 36| 37| 38| 39| 3a| 3b| 3d | 3c | + * |-----------------------------------------------------------| + * | 40 | 41 | 42 | 45 | 4a | 4b | 4c | 4d | + * `-----------------------------------------------------------' + */ +#define LAYOUT_60_ansi_split_rshift( \ + 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, k2d, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, k3c, \ + 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, XXX, k2d}, \ + {k30, XXX, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d}, \ + {k40, k41, k42, XXX, XXX, k45, XXX, XXX, XXX, XXX, k4a, k4b, k4c, k4d} \ +} + /* Satan GH60 ANSI layout * ,-----------------------------------------------------------. * | 00| 01| 02| 03| 04| 05| 06| 07| 08| 09| 0a| 0b| 0c| 0d | From 5eb69ca224f3d4233860a658e6a27516d86c4de7 Mon Sep 17 00:00:00 2001 From: Ryoichi KATO Date: Wed, 7 Nov 2018 23:04:02 -0800 Subject: [PATCH 385/505] Keyboard: fix ifdef for crkbd's default/keymap.c undef SSD1306OLED should not kill entire process_record_user() function. --- keyboards/crkbd/keymaps/default/keymap.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/keyboards/crkbd/keymaps/default/keymap.c b/keyboards/crkbd/keymaps/default/keymap.c index e92fbdebfa83..c7c9582e8368 100644 --- a/keyboards/crkbd/keymaps/default/keymap.c +++ b/keyboards/crkbd/keymaps/default/keymap.c @@ -179,10 +179,13 @@ void iota_gfx_task_user(void) { matrix_render_user(&matrix); matrix_update(&display, &matrix); } +#endif//SSD1306OLED bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (record->event.pressed) { +#ifdef SSD1306OLED set_keylog(keycode, record); +#endif // set_timelog(); } @@ -244,4 +247,3 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; } -#endif From ef84bd979979f092980dc68d513a906e084c8c57 Mon Sep 17 00:00:00 2001 From: Filip Sund Date: Fri, 9 Nov 2018 00:12:42 +0100 Subject: [PATCH 386/505] Keyboard: Add 30wer config and keymap (#4386) * Preliminary 30wer firmware. Not tested on real board yet. * Added a layer to default 30wer keymap. * Wrote readme for 30wer. * Added 30wer info.json. --- keyboards/30wer/30wer.c | 1 + keyboards/30wer/30wer.h | 14 ++++++ keyboards/30wer/config.h | 31 ++++++++++++ keyboards/30wer/info.json | 51 ++++++++++++++++++++ keyboards/30wer/keymaps/default/keymap.c | 17 +++++++ keyboards/30wer/readme.md | 16 +++++++ keyboards/30wer/rules.mk | 60 ++++++++++++++++++++++++ 7 files changed, 190 insertions(+) create mode 100644 keyboards/30wer/30wer.c create mode 100644 keyboards/30wer/30wer.h create mode 100644 keyboards/30wer/config.h create mode 100644 keyboards/30wer/info.json create mode 100644 keyboards/30wer/keymaps/default/keymap.c create mode 100644 keyboards/30wer/readme.md create mode 100644 keyboards/30wer/rules.mk diff --git a/keyboards/30wer/30wer.c b/keyboards/30wer/30wer.c new file mode 100644 index 000000000000..a46c54319602 --- /dev/null +++ b/keyboards/30wer/30wer.c @@ -0,0 +1 @@ +#include "30wer.h" diff --git a/keyboards/30wer/30wer.h b/keyboards/30wer/30wer.h new file mode 100644 index 000000000000..e7bce82776b2 --- /dev/null +++ b/keyboards/30wer/30wer.h @@ -0,0 +1,14 @@ +#pragma once + +#include "quantum.h" + +#define LAYOUT( \ + 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 \ +) \ +{ \ + { 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 } \ +} diff --git a/keyboards/30wer/config.h b/keyboards/30wer/config.h new file mode 100644 index 000000000000..d497585246fb --- /dev/null +++ b/keyboards/30wer/config.h @@ -0,0 +1,31 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x1234 +#define PRODUCT_ID 0x5678 +#define DEVICE_VER 0x0000 +#define MANUFACTURER 8o7wer +#define PRODUCT 30wer +#define DESCRIPTION Gherkin style construction 30% staggered pcb kit + +/* key matrix size */ +#define MATRIX_ROWS 3 +#define MATRIX_COLS 13 + +/* pcb default pin-out */ +#define MATRIX_ROW_PINS { E6, B4, B5 } +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, B6, D1, D0, D4, C6, D7 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* key combination for command */ +#define IS_COMMAND() ( \ + keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + +/* prevent stuck modifiers */ +#define PREVENT_STUCK_MODIFIERS diff --git a/keyboards/30wer/info.json b/keyboards/30wer/info.json new file mode 100644 index 000000000000..0fbbeb47ddf1 --- /dev/null +++ b/keyboards/30wer/info.json @@ -0,0 +1,51 @@ +{ + "keyboard_name": "30wer", + "url": "", + "maintainer": "qmk", + "width": 13.25, + "height": 3, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Tab", "x":0, "y":0}, + {"label":"Q", "x":1, "y":0}, + {"label":"W", "x":2, "y":0}, + {"label":"E", "x":3, "y":0}, + {"label":"R", "x":4, "y":0}, + {"label":"T", "x":5, "y":0}, + {"label":"Y", "x":6, "y":0}, + {"label":"U", "x":7, "y":0}, + {"label":"I", "x":8, "y":0}, + {"label":"O", "x":9, "y":0}, + {"label":"P", "x":10, "y":0}, + {"label":"Bksp", "x":11, "y":0}, + {"label":"Delete", "x":12, "y":0, "w":1.25}, + {"label":"Ctrl", "x":0, "y":1, "w":1.25}, + {"label":"A", "x":1.25, "y":1}, + {"label":"S", "x":2.25, "y":1}, + {"label":"D", "x":3.25, "y":1}, + {"label":"F", "x":4.25, "y":1}, + {"label":"G", "x":5.25, "y":1}, + {"label":"H", "x":6.25, "y":1}, + {"label":"J", "x":7.25, "y":1}, + {"label":"K", "x":8.25, "y":1}, + {"label":"L", "x":9.25, "y":1}, + {"label":":", "x":10.25, "y":1}, + {"label":"\"", "x":11.25, "y":1}, + {"label":"Enter", "x":12.25, "y":1}, + {"label":"Shift", "x":0, "y":2, "w":1.75}, + {"label":"Z", "x":1.75, "y":2}, + {"label":"X", "x":2.75, "y":2}, + {"label":"C", "x":3.75, "y":2}, + {"label":"V", "x":4.75, "y":2}, + {"label":"B", "x":5.75, "y":2}, + {"label":"N", "x":6.75, "y":2}, + {"label":"M", "x":7.75, "y":2}, + {"label":"<", "x":8.75, "y":2}, + {"label":">", "x":9.75, "y":2}, + {"label":"?", "x":10.75, "y":2}, + {"label":"Space", "x":11.75, "y":2, "w":1.5} + ] + } + } +} diff --git a/keyboards/30wer/keymaps/default/keymap.c b/keyboards/30wer/keymaps/default/keymap.c new file mode 100644 index 000000000000..9e39a500a343 --- /dev/null +++ b/keyboards/30wer/keymaps/default/keymap.c @@ -0,0 +1,17 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[0] = LAYOUT( \ + 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_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, LT(1, KC_SPC) \ +), + +[1] = LAYOUT( \ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_UP, KC_DEL, \ + _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, KC_LEFT, KC_RGHT, _______, \ + KC_LALT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DOWN, _______ \ +), + +}; diff --git a/keyboards/30wer/readme.md b/keyboards/30wer/readme.md new file mode 100644 index 000000000000..c9184f726ba9 --- /dev/null +++ b/keyboards/30wer/readme.md @@ -0,0 +1,16 @@ +30wer by 8o7wer +=== + +![30wer](https://i.imgur.com/ZYbRvY7.png) + +Keyboard Maintainer: [Filip Sund](https://github.com/FSund) +Hardware Supported: Pro Micro +Hardware Availability: Group buy + +More info in the [group by thread at Keebtalk](https://www.keebtalk.com/t/gb-30wer-by-8o7wer/3618/). + +Make example for this keyboard (after setting up your build environment): + + make 30wer:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). \ No newline at end of file diff --git a/keyboards/30wer/rules.mk b/keyboards/30wer/rules.mk new file mode 100644 index 000000000000..9d77ec546116 --- /dev/null +++ b/keyboards/30wer/rules.mk @@ -0,0 +1,60 @@ +# 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 + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = caterina + +# 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 = yes # 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 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. From 73883425a55f23a319eb1522c2e3ce52b8e2f042 Mon Sep 17 00:00:00 2001 From: zvecr Date: Thu, 8 Nov 2018 23:17:41 +0000 Subject: [PATCH 387/505] relocate 40percent.club boards to new parent folder (#4380) * Initial move of 40percent.club boards to common parent folder. * Refactor readme files to be consistent * Refactor readme files to be consistent - fix make command examples. * Refactor readme files to be consistent - align readme filenames. * Refactor readme files to be consistent - fix repo url. * Disable Community keymap builds as they are currently failing due to missing functionality * Move more of 40percent.club boards to common parent folder. * Refactor readme files to be consistent - align readme filenames. * Refactor readme files to be consistent - fix make command examples. --- keyboards/{ => 40percentclub}/4x4/4x4.c | 0 keyboards/{ => 40percentclub}/4x4/4x4.h | 0 keyboards/{ => 40percentclub}/4x4/config.h | 0 .../4x4/keymaps/default/config.h | 0 .../4x4/keymaps/default/keymap.c | 0 keyboards/{ => 40percentclub}/4x4/readme.md | 5 +++-- keyboards/{ => 40percentclub}/4x4/rules.mk | 8 ++++---- keyboards/{ => 40percentclub}/5x5/5x5.c | 0 keyboards/{ => 40percentclub}/5x5/5x5.h | 0 keyboards/{ => 40percentclub}/5x5/config.h | 0 .../5x5/keymaps/default/config.h | 0 .../5x5/keymaps/default/keymap.c | 0 keyboards/{ => 40percentclub}/5x5/readme.md | 5 +++-- keyboards/{ => 40percentclub}/5x5/rules.mk | 6 +++--- keyboards/{ => 40percentclub}/6lit/6lit.c | 0 keyboards/{ => 40percentclub}/6lit/6lit.h | 0 keyboards/{ => 40percentclub}/6lit/config.h | 0 keyboards/{ => 40percentclub}/6lit/info.json | 0 .../6lit/keymaps/default/config.h | 0 .../6lit/keymaps/default/keymap.c | 0 .../6lit/keymaps/default/readme.md | 0 .../6lit/keymaps/macro/config.h | 0 .../6lit/keymaps/macro/keymap.c | 0 .../6lit/keymaps/macro/readme.md | 0 keyboards/{ => 40percentclub}/6lit/readme.md | 3 ++- keyboards/{ => 40percentclub}/6lit/rules.mk | 0 keyboards/{ => 40percentclub}/foobar/config.h | 0 keyboards/{ => 40percentclub}/foobar/foobar.c | 0 keyboards/{ => 40percentclub}/foobar/foobar.h | 0 keyboards/{ => 40percentclub}/foobar/info.json | 0 .../foobar/keymaps/default/config.h | 0 .../foobar/keymaps/default/keymap.c | 0 .../foobar/keymaps/default/readme.md | 0 .../foobar/keymaps/macro/config.h | 0 .../foobar/keymaps/macro/keymap.c | 0 .../foobar/keymaps/macro/readme.md | 0 keyboards/{ => 40percentclub}/foobar/readme.md | 3 ++- keyboards/{ => 40percentclub}/foobar/rules.mk | 0 keyboards/{ => 40percentclub}/gherkin/config.h | 0 .../{ => 40percentclub}/gherkin/gherkin.c | 0 .../{ => 40percentclub}/gherkin/gherkin.h | 0 .../{ => 40percentclub}/gherkin/info.json | 0 .../gherkin/keymaps/bbaserdem/README.md | 0 .../gherkin/keymaps/bbaserdem/config.h | 0 .../gherkin/keymaps/bbaserdem/keymap.c | 0 .../gherkin/keymaps/bbaserdem/rules.mk | 0 .../gherkin/keymaps/default/keymap.c | 0 .../gherkin/keymaps/itsaferbie/config.h | 0 .../gherkin/keymaps/itsaferbie/keymap.c | 0 .../gherkin/keymaps/itsaferbie/rules.mk | 0 .../gherkin/keymaps/mjt/config.h | 0 .../gherkin/keymaps/mjt/keymap.c | 0 .../gherkin/keymaps/mjt/rules.mk | 0 .../gherkin/keymaps/steno/config.h | 0 .../gherkin/keymaps/steno/keymap.c | 0 .../gherkin/keymaps/steno/readme.md | 0 .../gherkin/keymaps/steno/rules.mk | 0 .../gherkin/keymaps/talljoe-gherkin/config.h | 0 .../gherkin/keymaps/talljoe-gherkin/keymap.c | 0 .../gherkin/keymaps/talljoe-gherkin/rules.mk | 0 .../gherkin/readme.md} | 9 ++++++--- keyboards/{ => 40percentclub}/gherkin/rules.mk | 0 keyboards/{ => 40percentclub}/luddite/config.h | 0 .../luddite/keymaps/default/keymap.c | 0 .../{ => 40percentclub}/luddite/luddite.c | 0 .../{ => 40percentclub}/luddite/luddite.h | 0 .../luddite/readme.md} | 5 ++++- keyboards/{ => 40percentclub}/luddite/rules.mk | 0 keyboards/{ => 40percentclub}/mf68/config.h | 0 keyboards/{ => 40percentclub}/mf68/info.json | 0 .../mf68/keymaps/default/keymap.c | 0 .../mf68/keymaps/factory/keymap.c | 0 keyboards/{ => 40percentclub}/mf68/mf68.c | 0 keyboards/{ => 40percentclub}/mf68/mf68.h | 0 keyboards/40percentclub/mf68/readme.md | 18 ++++++++++++++++++ keyboards/{ => 40percentclub}/mf68/rules.mk | 0 .../{ => 40percentclub}/mf68_ble/config.h | 0 .../{ => 40percentclub}/mf68_ble/info.json | 0 .../mf68_ble/keymaps/default/keymap.c | 0 .../{ => 40percentclub}/mf68_ble/mf68_ble.c | 0 .../{ => 40percentclub}/mf68_ble/mf68_ble.h | 0 .../mf68_ble/readme.md} | 16 +++++++++------- .../{ => 40percentclub}/mf68_ble/rules.mk | 0 keyboards/{ => 40percentclub}/nano/config.h | 0 keyboards/{ => 40percentclub}/nano/info.json | 0 .../nano/keymaps/default/keymap.c | 0 .../nano/keymaps/default/rules.mk | 0 .../nano/keymaps/spooka/config.h | 0 .../nano/keymaps/spooka/keymap.c | 0 .../nano/keymaps/spooka/rules.mk | 0 keyboards/{ => 40percentclub}/nano/matrix.c | 0 keyboards/{ => 40percentclub}/nano/nano.c | 0 keyboards/{ => 40percentclub}/nano/nano.h | 0 keyboards/40percentclub/nano/readme.md | 16 ++++++++++++++++ keyboards/{ => 40percentclub}/nano/rules.mk | 0 keyboards/40percentclub/readme.md | 4 ++++ keyboards/{ => 40percentclub}/tomato/config.h | 0 keyboards/{ => 40percentclub}/tomato/info.json | 0 .../tomato/keymaps/default/keymap.c | 0 keyboards/{ => 40percentclub}/tomato/readme.md | 8 +++++--- keyboards/{ => 40percentclub}/tomato/rules.mk | 0 keyboards/{ => 40percentclub}/tomato/tomato.c | 0 keyboards/{ => 40percentclub}/tomato/tomato.h | 0 .../{ => 40percentclub}/ut47/LED_controls.ino | 0 keyboards/{ => 40percentclub}/ut47/config.h | 0 keyboards/{ => 40percentclub}/ut47/info.json | 0 .../ut47/keymaps/default/config.h | 0 .../ut47/keymaps/default/keymap.c | 0 .../ut47/keymaps/default/readme.md | 0 .../ut47/keymaps/non-us/config.h | 0 .../ut47/keymaps/non-us/keymap.c | 0 .../ut47/keymaps/non-us/readme.md | 0 .../ut47/keymaps/nordic/config.h | 0 .../ut47/keymaps/nordic/keymap.c | 0 .../ut47/keymaps/nordic/readme.md | 0 .../ut47/keymaps/rgb/config.h | 0 .../ut47/keymaps/rgb/keymap.c | 0 .../ut47/keymaps/rgb/readme.md | 0 .../ut47/keymaps/rgb/rules.mk | 0 keyboards/{ => 40percentclub}/ut47/led.c | 0 keyboards/{ => 40percentclub}/ut47/matrix.c | 0 keyboards/{ => 40percentclub}/ut47/readme.md | 7 ++++--- keyboards/{ => 40percentclub}/ut47/rules.mk | 0 keyboards/{ => 40percentclub}/ut47/ut47.c | 0 keyboards/{ => 40percentclub}/ut47/ut47.h | 0 keyboards/mf68/README.md | 18 ------------------ keyboards/nano/readme.md | 14 -------------- 127 files changed, 83 insertions(+), 62 deletions(-) rename keyboards/{ => 40percentclub}/4x4/4x4.c (100%) rename keyboards/{ => 40percentclub}/4x4/4x4.h (100%) rename keyboards/{ => 40percentclub}/4x4/config.h (100%) rename keyboards/{ => 40percentclub}/4x4/keymaps/default/config.h (100%) rename keyboards/{ => 40percentclub}/4x4/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/4x4/readme.md (77%) rename keyboards/{ => 40percentclub}/4x4/rules.mk (94%) rename keyboards/{ => 40percentclub}/5x5/5x5.c (100%) rename keyboards/{ => 40percentclub}/5x5/5x5.h (100%) rename keyboards/{ => 40percentclub}/5x5/config.h (100%) rename keyboards/{ => 40percentclub}/5x5/keymaps/default/config.h (100%) rename keyboards/{ => 40percentclub}/5x5/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/5x5/readme.md (77%) rename keyboards/{ => 40percentclub}/5x5/rules.mk (95%) rename keyboards/{ => 40percentclub}/6lit/6lit.c (100%) rename keyboards/{ => 40percentclub}/6lit/6lit.h (100%) rename keyboards/{ => 40percentclub}/6lit/config.h (100%) rename keyboards/{ => 40percentclub}/6lit/info.json (100%) rename keyboards/{ => 40percentclub}/6lit/keymaps/default/config.h (100%) rename keyboards/{ => 40percentclub}/6lit/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/6lit/keymaps/default/readme.md (100%) rename keyboards/{ => 40percentclub}/6lit/keymaps/macro/config.h (100%) rename keyboards/{ => 40percentclub}/6lit/keymaps/macro/keymap.c (100%) rename keyboards/{ => 40percentclub}/6lit/keymaps/macro/readme.md (100%) rename keyboards/{ => 40percentclub}/6lit/readme.md (95%) rename keyboards/{ => 40percentclub}/6lit/rules.mk (100%) rename keyboards/{ => 40percentclub}/foobar/config.h (100%) rename keyboards/{ => 40percentclub}/foobar/foobar.c (100%) rename keyboards/{ => 40percentclub}/foobar/foobar.h (100%) rename keyboards/{ => 40percentclub}/foobar/info.json (100%) rename keyboards/{ => 40percentclub}/foobar/keymaps/default/config.h (100%) rename keyboards/{ => 40percentclub}/foobar/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/foobar/keymaps/default/readme.md (100%) rename keyboards/{ => 40percentclub}/foobar/keymaps/macro/config.h (100%) rename keyboards/{ => 40percentclub}/foobar/keymaps/macro/keymap.c (100%) rename keyboards/{ => 40percentclub}/foobar/keymaps/macro/readme.md (100%) rename keyboards/{ => 40percentclub}/foobar/readme.md (95%) rename keyboards/{ => 40percentclub}/foobar/rules.mk (100%) rename keyboards/{ => 40percentclub}/gherkin/config.h (100%) rename keyboards/{ => 40percentclub}/gherkin/gherkin.c (100%) rename keyboards/{ => 40percentclub}/gherkin/gherkin.h (100%) rename keyboards/{ => 40percentclub}/gherkin/info.json (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/bbaserdem/README.md (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/bbaserdem/config.h (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/bbaserdem/keymap.c (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/bbaserdem/rules.mk (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/itsaferbie/config.h (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/itsaferbie/keymap.c (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/itsaferbie/rules.mk (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/mjt/config.h (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/mjt/keymap.c (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/mjt/rules.mk (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/steno/config.h (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/steno/keymap.c (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/steno/readme.md (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/steno/rules.mk (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/talljoe-gherkin/config.h (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/talljoe-gherkin/keymap.c (100%) rename keyboards/{ => 40percentclub}/gherkin/keymaps/talljoe-gherkin/rules.mk (100%) rename keyboards/{gherkin/README.md => 40percentclub/gherkin/readme.md} (52%) rename keyboards/{ => 40percentclub}/gherkin/rules.mk (100%) rename keyboards/{ => 40percentclub}/luddite/config.h (100%) rename keyboards/{ => 40percentclub}/luddite/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/luddite/luddite.c (100%) rename keyboards/{ => 40percentclub}/luddite/luddite.h (100%) rename keyboards/{luddite/README.md => 40percentclub/luddite/readme.md} (82%) rename keyboards/{ => 40percentclub}/luddite/rules.mk (100%) rename keyboards/{ => 40percentclub}/mf68/config.h (100%) rename keyboards/{ => 40percentclub}/mf68/info.json (100%) rename keyboards/{ => 40percentclub}/mf68/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/mf68/keymaps/factory/keymap.c (100%) rename keyboards/{ => 40percentclub}/mf68/mf68.c (100%) rename keyboards/{ => 40percentclub}/mf68/mf68.h (100%) create mode 100644 keyboards/40percentclub/mf68/readme.md rename keyboards/{ => 40percentclub}/mf68/rules.mk (100%) rename keyboards/{ => 40percentclub}/mf68_ble/config.h (100%) rename keyboards/{ => 40percentclub}/mf68_ble/info.json (100%) rename keyboards/{ => 40percentclub}/mf68_ble/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/mf68_ble/mf68_ble.c (100%) rename keyboards/{ => 40percentclub}/mf68_ble/mf68_ble.h (100%) rename keyboards/{mf68_ble/README.md => 40percentclub/mf68_ble/readme.md} (58%) rename keyboards/{ => 40percentclub}/mf68_ble/rules.mk (100%) rename keyboards/{ => 40percentclub}/nano/config.h (100%) rename keyboards/{ => 40percentclub}/nano/info.json (100%) rename keyboards/{ => 40percentclub}/nano/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/nano/keymaps/default/rules.mk (100%) rename keyboards/{ => 40percentclub}/nano/keymaps/spooka/config.h (100%) rename keyboards/{ => 40percentclub}/nano/keymaps/spooka/keymap.c (100%) rename keyboards/{ => 40percentclub}/nano/keymaps/spooka/rules.mk (100%) rename keyboards/{ => 40percentclub}/nano/matrix.c (100%) rename keyboards/{ => 40percentclub}/nano/nano.c (100%) rename keyboards/{ => 40percentclub}/nano/nano.h (100%) create mode 100644 keyboards/40percentclub/nano/readme.md rename keyboards/{ => 40percentclub}/nano/rules.mk (100%) create mode 100644 keyboards/40percentclub/readme.md rename keyboards/{ => 40percentclub}/tomato/config.h (100%) rename keyboards/{ => 40percentclub}/tomato/info.json (100%) rename keyboards/{ => 40percentclub}/tomato/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/tomato/readme.md (56%) rename keyboards/{ => 40percentclub}/tomato/rules.mk (100%) rename keyboards/{ => 40percentclub}/tomato/tomato.c (100%) rename keyboards/{ => 40percentclub}/tomato/tomato.h (100%) rename keyboards/{ => 40percentclub}/ut47/LED_controls.ino (100%) rename keyboards/{ => 40percentclub}/ut47/config.h (100%) rename keyboards/{ => 40percentclub}/ut47/info.json (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/default/config.h (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/default/keymap.c (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/default/readme.md (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/non-us/config.h (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/non-us/keymap.c (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/non-us/readme.md (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/nordic/config.h (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/nordic/keymap.c (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/nordic/readme.md (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/rgb/config.h (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/rgb/keymap.c (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/rgb/readme.md (100%) rename keyboards/{ => 40percentclub}/ut47/keymaps/rgb/rules.mk (100%) rename keyboards/{ => 40percentclub}/ut47/led.c (100%) rename keyboards/{ => 40percentclub}/ut47/matrix.c (100%) rename keyboards/{ => 40percentclub}/ut47/readme.md (92%) rename keyboards/{ => 40percentclub}/ut47/rules.mk (100%) rename keyboards/{ => 40percentclub}/ut47/ut47.c (100%) rename keyboards/{ => 40percentclub}/ut47/ut47.h (100%) delete mode 100644 keyboards/mf68/README.md delete mode 100644 keyboards/nano/readme.md diff --git a/keyboards/4x4/4x4.c b/keyboards/40percentclub/4x4/4x4.c similarity index 100% rename from keyboards/4x4/4x4.c rename to keyboards/40percentclub/4x4/4x4.c diff --git a/keyboards/4x4/4x4.h b/keyboards/40percentclub/4x4/4x4.h similarity index 100% rename from keyboards/4x4/4x4.h rename to keyboards/40percentclub/4x4/4x4.h diff --git a/keyboards/4x4/config.h b/keyboards/40percentclub/4x4/config.h similarity index 100% rename from keyboards/4x4/config.h rename to keyboards/40percentclub/4x4/config.h diff --git a/keyboards/4x4/keymaps/default/config.h b/keyboards/40percentclub/4x4/keymaps/default/config.h similarity index 100% rename from keyboards/4x4/keymaps/default/config.h rename to keyboards/40percentclub/4x4/keymaps/default/config.h diff --git a/keyboards/4x4/keymaps/default/keymap.c b/keyboards/40percentclub/4x4/keymaps/default/keymap.c similarity index 100% rename from keyboards/4x4/keymaps/default/keymap.c rename to keyboards/40percentclub/4x4/keymaps/default/keymap.c diff --git a/keyboards/4x4/readme.md b/keyboards/40percentclub/4x4/readme.md similarity index 77% rename from keyboards/4x4/readme.md rename to keyboards/40percentclub/4x4/readme.md index 3ca074fddd24..077a2049be9c 100644 --- a/keyboards/4x4/readme.md +++ b/keyboards/40percentclub/4x4/readme.md @@ -17,7 +17,8 @@ Hardware Availability: [4x4x4x4x4 project on 40% Keyboards](http://www.40percent Make example for this keyboard (after setting up your build environment): - make 4x4:default + make 40percentclub/4x4:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. First pass at adding support for the 4x4 keyboard. Compiles but completely untested. Intended to kick-start development. diff --git a/keyboards/4x4/rules.mk b/keyboards/40percentclub/4x4/rules.mk similarity index 94% rename from keyboards/4x4/rules.mk rename to keyboards/40percentclub/4x4/rules.mk index b8b4bccc4247..d572e7244440 100644 --- a/keyboards/4x4/rules.mk +++ b/keyboards/40percentclub/4x4/rules.mk @@ -1,5 +1,4 @@ # MCU name -#MCU = at90usb1286 MCU = atmega32u4 # Processor frequency. @@ -43,11 +42,11 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Atmel DFU loader 4096 # LUFA bootloader 4096 # USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = caterina @@ -71,4 +70,5 @@ AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) -LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12 ortho_4x16 +#FIXME: Community keymap build are currently failing due to missing functionality +#LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12 ortho_4x16 diff --git a/keyboards/5x5/5x5.c b/keyboards/40percentclub/5x5/5x5.c similarity index 100% rename from keyboards/5x5/5x5.c rename to keyboards/40percentclub/5x5/5x5.c diff --git a/keyboards/5x5/5x5.h b/keyboards/40percentclub/5x5/5x5.h similarity index 100% rename from keyboards/5x5/5x5.h rename to keyboards/40percentclub/5x5/5x5.h diff --git a/keyboards/5x5/config.h b/keyboards/40percentclub/5x5/config.h similarity index 100% rename from keyboards/5x5/config.h rename to keyboards/40percentclub/5x5/config.h diff --git a/keyboards/5x5/keymaps/default/config.h b/keyboards/40percentclub/5x5/keymaps/default/config.h similarity index 100% rename from keyboards/5x5/keymaps/default/config.h rename to keyboards/40percentclub/5x5/keymaps/default/config.h diff --git a/keyboards/5x5/keymaps/default/keymap.c b/keyboards/40percentclub/5x5/keymaps/default/keymap.c similarity index 100% rename from keyboards/5x5/keymaps/default/keymap.c rename to keyboards/40percentclub/5x5/keymaps/default/keymap.c diff --git a/keyboards/5x5/readme.md b/keyboards/40percentclub/5x5/readme.md similarity index 77% rename from keyboards/5x5/readme.md rename to keyboards/40percentclub/5x5/readme.md index e25535968d2e..8f0d8e166776 100644 --- a/keyboards/5x5/readme.md +++ b/keyboards/40percentclub/5x5/readme.md @@ -17,7 +17,8 @@ Hardware Availability: [5x5 project on 40% Keyboards](http://www.40percent.club/ Make example for this keyboard (after setting up your build environment): - make 5x5:default + make 40percentclub/5x5:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. First pass at adding support for the 4x4 keyboard. Compiles but completely untested. Intended to kick-start development. diff --git a/keyboards/5x5/rules.mk b/keyboards/40percentclub/5x5/rules.mk similarity index 95% rename from keyboards/5x5/rules.mk rename to keyboards/40percentclub/5x5/rules.mk index 24e0e020fdad..abc961a86fe0 100644 --- a/keyboards/5x5/rules.mk +++ b/keyboards/40percentclub/5x5/rules.mk @@ -1,5 +1,4 @@ # MCU name -#MCU = at90usb1286 MCU = atmega32u4 # Processor frequency. @@ -43,7 +42,7 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Atmel DFU loader 4096 # LUFA bootloader 4096 # USBaspLoader 2048 -OPT_DEFS += -DBOOTLOADER_SIZE=4096 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of @@ -71,4 +70,5 @@ AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) -LAYOUTS = ortho_5x5 ortho_5x10 ortho_5x15 +#FIXME: Community keymap build are currently failing due to missing functionality +#LAYOUTS = ortho_5x5 ortho_5x10 ortho_5x15 diff --git a/keyboards/6lit/6lit.c b/keyboards/40percentclub/6lit/6lit.c similarity index 100% rename from keyboards/6lit/6lit.c rename to keyboards/40percentclub/6lit/6lit.c diff --git a/keyboards/6lit/6lit.h b/keyboards/40percentclub/6lit/6lit.h similarity index 100% rename from keyboards/6lit/6lit.h rename to keyboards/40percentclub/6lit/6lit.h diff --git a/keyboards/6lit/config.h b/keyboards/40percentclub/6lit/config.h similarity index 100% rename from keyboards/6lit/config.h rename to keyboards/40percentclub/6lit/config.h diff --git a/keyboards/6lit/info.json b/keyboards/40percentclub/6lit/info.json similarity index 100% rename from keyboards/6lit/info.json rename to keyboards/40percentclub/6lit/info.json diff --git a/keyboards/6lit/keymaps/default/config.h b/keyboards/40percentclub/6lit/keymaps/default/config.h similarity index 100% rename from keyboards/6lit/keymaps/default/config.h rename to keyboards/40percentclub/6lit/keymaps/default/config.h diff --git a/keyboards/6lit/keymaps/default/keymap.c b/keyboards/40percentclub/6lit/keymaps/default/keymap.c similarity index 100% rename from keyboards/6lit/keymaps/default/keymap.c rename to keyboards/40percentclub/6lit/keymaps/default/keymap.c diff --git a/keyboards/6lit/keymaps/default/readme.md b/keyboards/40percentclub/6lit/keymaps/default/readme.md similarity index 100% rename from keyboards/6lit/keymaps/default/readme.md rename to keyboards/40percentclub/6lit/keymaps/default/readme.md diff --git a/keyboards/6lit/keymaps/macro/config.h b/keyboards/40percentclub/6lit/keymaps/macro/config.h similarity index 100% rename from keyboards/6lit/keymaps/macro/config.h rename to keyboards/40percentclub/6lit/keymaps/macro/config.h diff --git a/keyboards/6lit/keymaps/macro/keymap.c b/keyboards/40percentclub/6lit/keymaps/macro/keymap.c similarity index 100% rename from keyboards/6lit/keymaps/macro/keymap.c rename to keyboards/40percentclub/6lit/keymaps/macro/keymap.c diff --git a/keyboards/6lit/keymaps/macro/readme.md b/keyboards/40percentclub/6lit/keymaps/macro/readme.md similarity index 100% rename from keyboards/6lit/keymaps/macro/readme.md rename to keyboards/40percentclub/6lit/keymaps/macro/readme.md diff --git a/keyboards/6lit/readme.md b/keyboards/40percentclub/6lit/readme.md similarity index 95% rename from keyboards/6lit/readme.md rename to keyboards/40percentclub/6lit/readme.md index d5b210028550..3d28df2d756d 100644 --- a/keyboards/6lit/readme.md +++ b/keyboards/40percentclub/6lit/readme.md @@ -1,6 +1,7 @@ # 6lit ![6lit](https://1.bp.blogspot.com/-Pa8RgYZ0hy8/Wbmr4bjuV0I/AAAAAAACDbI/WLKQMDlcDVAVf1lAIRMN51usR1XcCCVNgCLcBGAs/s1600/a.JPG) +=== 6 key macropad that fits within the 100mm x 100mm PCB size. Can be used singly as a regular 6 key macropad as well. @@ -12,6 +13,6 @@ Hardware Availability: [6lit project on 40% Keyboards](http://www.40percent.club Make example for this keyboard (after setting up your build environment): - make 6lit:default + make 40percentclub/6lit:default See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/6lit/rules.mk b/keyboards/40percentclub/6lit/rules.mk similarity index 100% rename from keyboards/6lit/rules.mk rename to keyboards/40percentclub/6lit/rules.mk diff --git a/keyboards/foobar/config.h b/keyboards/40percentclub/foobar/config.h similarity index 100% rename from keyboards/foobar/config.h rename to keyboards/40percentclub/foobar/config.h diff --git a/keyboards/foobar/foobar.c b/keyboards/40percentclub/foobar/foobar.c similarity index 100% rename from keyboards/foobar/foobar.c rename to keyboards/40percentclub/foobar/foobar.c diff --git a/keyboards/foobar/foobar.h b/keyboards/40percentclub/foobar/foobar.h similarity index 100% rename from keyboards/foobar/foobar.h rename to keyboards/40percentclub/foobar/foobar.h diff --git a/keyboards/foobar/info.json b/keyboards/40percentclub/foobar/info.json similarity index 100% rename from keyboards/foobar/info.json rename to keyboards/40percentclub/foobar/info.json diff --git a/keyboards/foobar/keymaps/default/config.h b/keyboards/40percentclub/foobar/keymaps/default/config.h similarity index 100% rename from keyboards/foobar/keymaps/default/config.h rename to keyboards/40percentclub/foobar/keymaps/default/config.h diff --git a/keyboards/foobar/keymaps/default/keymap.c b/keyboards/40percentclub/foobar/keymaps/default/keymap.c similarity index 100% rename from keyboards/foobar/keymaps/default/keymap.c rename to keyboards/40percentclub/foobar/keymaps/default/keymap.c diff --git a/keyboards/foobar/keymaps/default/readme.md b/keyboards/40percentclub/foobar/keymaps/default/readme.md similarity index 100% rename from keyboards/foobar/keymaps/default/readme.md rename to keyboards/40percentclub/foobar/keymaps/default/readme.md diff --git a/keyboards/foobar/keymaps/macro/config.h b/keyboards/40percentclub/foobar/keymaps/macro/config.h similarity index 100% rename from keyboards/foobar/keymaps/macro/config.h rename to keyboards/40percentclub/foobar/keymaps/macro/config.h diff --git a/keyboards/foobar/keymaps/macro/keymap.c b/keyboards/40percentclub/foobar/keymaps/macro/keymap.c similarity index 100% rename from keyboards/foobar/keymaps/macro/keymap.c rename to keyboards/40percentclub/foobar/keymaps/macro/keymap.c diff --git a/keyboards/foobar/keymaps/macro/readme.md b/keyboards/40percentclub/foobar/keymaps/macro/readme.md similarity index 100% rename from keyboards/foobar/keymaps/macro/readme.md rename to keyboards/40percentclub/foobar/keymaps/macro/readme.md diff --git a/keyboards/foobar/readme.md b/keyboards/40percentclub/foobar/readme.md similarity index 95% rename from keyboards/foobar/readme.md rename to keyboards/40percentclub/foobar/readme.md index 3898d4bb1a08..0acdf7252d2e 100644 --- a/keyboards/foobar/readme.md +++ b/keyboards/40percentclub/foobar/readme.md @@ -1,6 +1,7 @@ # foobar ![foobar](https://2.bp.blogspot.com/-rr8TK6xg2N0/WbwVL2O7EfI/AAAAAAACDc8/209wN69ju0wAFICYYPNLIEGQhat5-5MbwCLcBGAs/s640/a.JPG) +=== Split 30% keyboard that fits within the 100mm x 100mm PCB size. Can be used together as a split keyboard or as a single 15 key macropad. @@ -12,6 +13,6 @@ Hardware Availability: [foobar project on 40% Keyboards](http://www.40percent.cl Make example for this keyboard (after setting up your build environment): - make foobar:default + make 40percentclub/foobar:default See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/foobar/rules.mk b/keyboards/40percentclub/foobar/rules.mk similarity index 100% rename from keyboards/foobar/rules.mk rename to keyboards/40percentclub/foobar/rules.mk diff --git a/keyboards/gherkin/config.h b/keyboards/40percentclub/gherkin/config.h similarity index 100% rename from keyboards/gherkin/config.h rename to keyboards/40percentclub/gherkin/config.h diff --git a/keyboards/gherkin/gherkin.c b/keyboards/40percentclub/gherkin/gherkin.c similarity index 100% rename from keyboards/gherkin/gherkin.c rename to keyboards/40percentclub/gherkin/gherkin.c diff --git a/keyboards/gherkin/gherkin.h b/keyboards/40percentclub/gherkin/gherkin.h similarity index 100% rename from keyboards/gherkin/gherkin.h rename to keyboards/40percentclub/gherkin/gherkin.h diff --git a/keyboards/gherkin/info.json b/keyboards/40percentclub/gherkin/info.json similarity index 100% rename from keyboards/gherkin/info.json rename to keyboards/40percentclub/gherkin/info.json diff --git a/keyboards/gherkin/keymaps/bbaserdem/README.md b/keyboards/40percentclub/gherkin/keymaps/bbaserdem/README.md similarity index 100% rename from keyboards/gherkin/keymaps/bbaserdem/README.md rename to keyboards/40percentclub/gherkin/keymaps/bbaserdem/README.md diff --git a/keyboards/gherkin/keymaps/bbaserdem/config.h b/keyboards/40percentclub/gherkin/keymaps/bbaserdem/config.h similarity index 100% rename from keyboards/gherkin/keymaps/bbaserdem/config.h rename to keyboards/40percentclub/gherkin/keymaps/bbaserdem/config.h diff --git a/keyboards/gherkin/keymaps/bbaserdem/keymap.c b/keyboards/40percentclub/gherkin/keymaps/bbaserdem/keymap.c similarity index 100% rename from keyboards/gherkin/keymaps/bbaserdem/keymap.c rename to keyboards/40percentclub/gherkin/keymaps/bbaserdem/keymap.c diff --git a/keyboards/gherkin/keymaps/bbaserdem/rules.mk b/keyboards/40percentclub/gherkin/keymaps/bbaserdem/rules.mk similarity index 100% rename from keyboards/gherkin/keymaps/bbaserdem/rules.mk rename to keyboards/40percentclub/gherkin/keymaps/bbaserdem/rules.mk diff --git a/keyboards/gherkin/keymaps/default/keymap.c b/keyboards/40percentclub/gherkin/keymaps/default/keymap.c similarity index 100% rename from keyboards/gherkin/keymaps/default/keymap.c rename to keyboards/40percentclub/gherkin/keymaps/default/keymap.c diff --git a/keyboards/gherkin/keymaps/itsaferbie/config.h b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/config.h similarity index 100% rename from keyboards/gherkin/keymaps/itsaferbie/config.h rename to keyboards/40percentclub/gherkin/keymaps/itsaferbie/config.h diff --git a/keyboards/gherkin/keymaps/itsaferbie/keymap.c b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/keymap.c similarity index 100% rename from keyboards/gherkin/keymaps/itsaferbie/keymap.c rename to keyboards/40percentclub/gherkin/keymaps/itsaferbie/keymap.c diff --git a/keyboards/gherkin/keymaps/itsaferbie/rules.mk b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/rules.mk similarity index 100% rename from keyboards/gherkin/keymaps/itsaferbie/rules.mk rename to keyboards/40percentclub/gherkin/keymaps/itsaferbie/rules.mk diff --git a/keyboards/gherkin/keymaps/mjt/config.h b/keyboards/40percentclub/gherkin/keymaps/mjt/config.h similarity index 100% rename from keyboards/gherkin/keymaps/mjt/config.h rename to keyboards/40percentclub/gherkin/keymaps/mjt/config.h diff --git a/keyboards/gherkin/keymaps/mjt/keymap.c b/keyboards/40percentclub/gherkin/keymaps/mjt/keymap.c similarity index 100% rename from keyboards/gherkin/keymaps/mjt/keymap.c rename to keyboards/40percentclub/gherkin/keymaps/mjt/keymap.c diff --git a/keyboards/gherkin/keymaps/mjt/rules.mk b/keyboards/40percentclub/gherkin/keymaps/mjt/rules.mk similarity index 100% rename from keyboards/gherkin/keymaps/mjt/rules.mk rename to keyboards/40percentclub/gherkin/keymaps/mjt/rules.mk diff --git a/keyboards/gherkin/keymaps/steno/config.h b/keyboards/40percentclub/gherkin/keymaps/steno/config.h similarity index 100% rename from keyboards/gherkin/keymaps/steno/config.h rename to keyboards/40percentclub/gherkin/keymaps/steno/config.h diff --git a/keyboards/gherkin/keymaps/steno/keymap.c b/keyboards/40percentclub/gherkin/keymaps/steno/keymap.c similarity index 100% rename from keyboards/gherkin/keymaps/steno/keymap.c rename to keyboards/40percentclub/gherkin/keymaps/steno/keymap.c diff --git a/keyboards/gherkin/keymaps/steno/readme.md b/keyboards/40percentclub/gherkin/keymaps/steno/readme.md similarity index 100% rename from keyboards/gherkin/keymaps/steno/readme.md rename to keyboards/40percentclub/gherkin/keymaps/steno/readme.md diff --git a/keyboards/gherkin/keymaps/steno/rules.mk b/keyboards/40percentclub/gherkin/keymaps/steno/rules.mk similarity index 100% rename from keyboards/gherkin/keymaps/steno/rules.mk rename to keyboards/40percentclub/gherkin/keymaps/steno/rules.mk diff --git a/keyboards/gherkin/keymaps/talljoe-gherkin/config.h b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/config.h similarity index 100% rename from keyboards/gherkin/keymaps/talljoe-gherkin/config.h rename to keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/config.h diff --git a/keyboards/gherkin/keymaps/talljoe-gherkin/keymap.c b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/keymap.c similarity index 100% rename from keyboards/gherkin/keymaps/talljoe-gherkin/keymap.c rename to keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/keymap.c diff --git a/keyboards/gherkin/keymaps/talljoe-gherkin/rules.mk b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/rules.mk similarity index 100% rename from keyboards/gherkin/keymaps/talljoe-gherkin/rules.mk rename to keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/rules.mk diff --git a/keyboards/gherkin/README.md b/keyboards/40percentclub/gherkin/readme.md similarity index 52% rename from keyboards/gherkin/README.md rename to keyboards/40percentclub/gherkin/readme.md index 5e0daeabf936..a6680d72057c 100644 --- a/keyboards/gherkin/README.md +++ b/keyboards/40percentclub/gherkin/readme.md @@ -1,4 +1,6 @@ -Gherkin +# Gherkin + +![Gherkin](https://4.bp.blogspot.com/-sQ18-lNZXOc/WCzlTde-4PI/AAAAAAAB_JQ/qQrehAMG6DMKf3i4oj4mkmLGOfTUvb3KgCLcB/s640/IMG_20161116_122926.jpg) === A 30 key keyboard. @@ -11,8 +13,9 @@ Hardware Availability: [Gherkin project on 40% Keyboards](http://www.40percent.c Make example for this keyboard (after setting up your build environment): - make gherkin:default + make 40percentclub/gherkin:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. First pass at adding support for the gherkin keyboard. Compiles but completely untested. Intended to kick-start development. diff --git a/keyboards/gherkin/rules.mk b/keyboards/40percentclub/gherkin/rules.mk similarity index 100% rename from keyboards/gherkin/rules.mk rename to keyboards/40percentclub/gherkin/rules.mk diff --git a/keyboards/luddite/config.h b/keyboards/40percentclub/luddite/config.h similarity index 100% rename from keyboards/luddite/config.h rename to keyboards/40percentclub/luddite/config.h diff --git a/keyboards/luddite/keymaps/default/keymap.c b/keyboards/40percentclub/luddite/keymaps/default/keymap.c similarity index 100% rename from keyboards/luddite/keymaps/default/keymap.c rename to keyboards/40percentclub/luddite/keymaps/default/keymap.c diff --git a/keyboards/luddite/luddite.c b/keyboards/40percentclub/luddite/luddite.c similarity index 100% rename from keyboards/luddite/luddite.c rename to keyboards/40percentclub/luddite/luddite.c diff --git a/keyboards/luddite/luddite.h b/keyboards/40percentclub/luddite/luddite.h similarity index 100% rename from keyboards/luddite/luddite.h rename to keyboards/40percentclub/luddite/luddite.h diff --git a/keyboards/luddite/README.md b/keyboards/40percentclub/luddite/readme.md similarity index 82% rename from keyboards/luddite/README.md rename to keyboards/40percentclub/luddite/readme.md index 72666dda5fd2..928b6de8f3f3 100644 --- a/keyboards/luddite/README.md +++ b/keyboards/40percentclub/luddite/readme.md @@ -1,5 +1,8 @@ # Luddite +![Luddite](https://1.bp.blogspot.com/-GAAa-sMU_WU/W7uYLJJ8x1I/AAAAAAACS44/31n2z69BSboM4KT48YkNMJRYciC8LUMWgCLcBGAs/s640/a.jpg) +=== + Luddite 60% keyboard with backlight and RGB underglow. * [The original TMK firmware](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/luddite) @@ -10,7 +13,7 @@ Hardware Availability: [Luddite project on 40% Keyboards](http://www.40percent.c Make example for this keyboard (after setting up your build environment): - make luddite:default + make 40percentclub/luddite:default See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/luddite/rules.mk b/keyboards/40percentclub/luddite/rules.mk similarity index 100% rename from keyboards/luddite/rules.mk rename to keyboards/40percentclub/luddite/rules.mk diff --git a/keyboards/mf68/config.h b/keyboards/40percentclub/mf68/config.h similarity index 100% rename from keyboards/mf68/config.h rename to keyboards/40percentclub/mf68/config.h diff --git a/keyboards/mf68/info.json b/keyboards/40percentclub/mf68/info.json similarity index 100% rename from keyboards/mf68/info.json rename to keyboards/40percentclub/mf68/info.json diff --git a/keyboards/mf68/keymaps/default/keymap.c b/keyboards/40percentclub/mf68/keymaps/default/keymap.c similarity index 100% rename from keyboards/mf68/keymaps/default/keymap.c rename to keyboards/40percentclub/mf68/keymaps/default/keymap.c diff --git a/keyboards/mf68/keymaps/factory/keymap.c b/keyboards/40percentclub/mf68/keymaps/factory/keymap.c similarity index 100% rename from keyboards/mf68/keymaps/factory/keymap.c rename to keyboards/40percentclub/mf68/keymaps/factory/keymap.c diff --git a/keyboards/mf68/mf68.c b/keyboards/40percentclub/mf68/mf68.c similarity index 100% rename from keyboards/mf68/mf68.c rename to keyboards/40percentclub/mf68/mf68.c diff --git a/keyboards/mf68/mf68.h b/keyboards/40percentclub/mf68/mf68.h similarity index 100% rename from keyboards/mf68/mf68.h rename to keyboards/40percentclub/mf68/mf68.h diff --git a/keyboards/40percentclub/mf68/readme.md b/keyboards/40percentclub/mf68/readme.md new file mode 100644 index 000000000000..825c265f167b --- /dev/null +++ b/keyboards/40percentclub/mf68/readme.md @@ -0,0 +1,18 @@ +# mf68 + +![mf68](https://3.bp.blogspot.com/-0YCA3Hx2Rq0/WD3U3GWhyvI/AAAAAAAB_Uo/RWTeyCPblGcxDrDwT9WL9ck2ZRuR26DgACLcB/s640/IMG_20161129_063741.jpg) +=== + +Magicforce 68 with [replacement PCB](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/mf68) designed by [di0ib](https://github.com/di0ib). + +* [The original TMK firmware](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/mf68) + +Keyboard Maintainer: QMK Community +Hardware Supported: Pro Micro +Hardware Availability: [PCB files](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/mf68/pcb) + +Make example for this keyboard (after setting up your build environment): + + make 40percentclub/mf68:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/mf68/rules.mk b/keyboards/40percentclub/mf68/rules.mk similarity index 100% rename from keyboards/mf68/rules.mk rename to keyboards/40percentclub/mf68/rules.mk diff --git a/keyboards/mf68_ble/config.h b/keyboards/40percentclub/mf68_ble/config.h similarity index 100% rename from keyboards/mf68_ble/config.h rename to keyboards/40percentclub/mf68_ble/config.h diff --git a/keyboards/mf68_ble/info.json b/keyboards/40percentclub/mf68_ble/info.json similarity index 100% rename from keyboards/mf68_ble/info.json rename to keyboards/40percentclub/mf68_ble/info.json diff --git a/keyboards/mf68_ble/keymaps/default/keymap.c b/keyboards/40percentclub/mf68_ble/keymaps/default/keymap.c similarity index 100% rename from keyboards/mf68_ble/keymaps/default/keymap.c rename to keyboards/40percentclub/mf68_ble/keymaps/default/keymap.c diff --git a/keyboards/mf68_ble/mf68_ble.c b/keyboards/40percentclub/mf68_ble/mf68_ble.c similarity index 100% rename from keyboards/mf68_ble/mf68_ble.c rename to keyboards/40percentclub/mf68_ble/mf68_ble.c diff --git a/keyboards/mf68_ble/mf68_ble.h b/keyboards/40percentclub/mf68_ble/mf68_ble.h similarity index 100% rename from keyboards/mf68_ble/mf68_ble.h rename to keyboards/40percentclub/mf68_ble/mf68_ble.h diff --git a/keyboards/mf68_ble/README.md b/keyboards/40percentclub/mf68_ble/readme.md similarity index 58% rename from keyboards/mf68_ble/README.md rename to keyboards/40percentclub/mf68_ble/readme.md index 3829c8fd7dee..0e0f4b90d831 100644 --- a/keyboards/mf68_ble/README.md +++ b/keyboards/40percentclub/mf68_ble/readme.md @@ -1,10 +1,12 @@ -MF68 -==== +# mf68_ble + +![mf68_ble](https://3.bp.blogspot.com/-0YCA3Hx2Rq0/WD3U3GWhyvI/AAAAAAAB_Uo/RWTeyCPblGcxDrDwT9WL9ck2ZRuR26DgACLcB/s640/IMG_20161129_063741.jpg) +=== Magicforce 68 with [replacement PCB](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/mf68) designed by [di0ib](https://github.com/di0ib). -Keyboard Maintainer: [di0ib](http://www.40percent.club) -Hardware Supported: [Feather 32u4 Bluefruit](https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/) +Keyboard Maintainer: QMK Community +Hardware Supported: [Feather 32u4 Bluefruit](https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le/) Please note: This is 32u4 and not M0 Hardware Availability: [PCB files](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/mf68/pcb) [MF68 thicc case files](https://github.com/harshitgoel96/mf68-case-thicc) @@ -20,8 +22,8 @@ Below is how you wire the Feather to PCB ![wire map](https://i.imgur.com/zYOjlTA.png) -Make example for this keyboard (after setting up your build environment): +Make example for this keyboard (after setting up your build environment): - make mf68_ble:default + make 40percentclub/mf68_ble:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/mf68_ble/rules.mk b/keyboards/40percentclub/mf68_ble/rules.mk similarity index 100% rename from keyboards/mf68_ble/rules.mk rename to keyboards/40percentclub/mf68_ble/rules.mk diff --git a/keyboards/nano/config.h b/keyboards/40percentclub/nano/config.h similarity index 100% rename from keyboards/nano/config.h rename to keyboards/40percentclub/nano/config.h diff --git a/keyboards/nano/info.json b/keyboards/40percentclub/nano/info.json similarity index 100% rename from keyboards/nano/info.json rename to keyboards/40percentclub/nano/info.json diff --git a/keyboards/nano/keymaps/default/keymap.c b/keyboards/40percentclub/nano/keymaps/default/keymap.c similarity index 100% rename from keyboards/nano/keymaps/default/keymap.c rename to keyboards/40percentclub/nano/keymaps/default/keymap.c diff --git a/keyboards/nano/keymaps/default/rules.mk b/keyboards/40percentclub/nano/keymaps/default/rules.mk similarity index 100% rename from keyboards/nano/keymaps/default/rules.mk rename to keyboards/40percentclub/nano/keymaps/default/rules.mk diff --git a/keyboards/nano/keymaps/spooka/config.h b/keyboards/40percentclub/nano/keymaps/spooka/config.h similarity index 100% rename from keyboards/nano/keymaps/spooka/config.h rename to keyboards/40percentclub/nano/keymaps/spooka/config.h diff --git a/keyboards/nano/keymaps/spooka/keymap.c b/keyboards/40percentclub/nano/keymaps/spooka/keymap.c similarity index 100% rename from keyboards/nano/keymaps/spooka/keymap.c rename to keyboards/40percentclub/nano/keymaps/spooka/keymap.c diff --git a/keyboards/nano/keymaps/spooka/rules.mk b/keyboards/40percentclub/nano/keymaps/spooka/rules.mk similarity index 100% rename from keyboards/nano/keymaps/spooka/rules.mk rename to keyboards/40percentclub/nano/keymaps/spooka/rules.mk diff --git a/keyboards/nano/matrix.c b/keyboards/40percentclub/nano/matrix.c similarity index 100% rename from keyboards/nano/matrix.c rename to keyboards/40percentclub/nano/matrix.c diff --git a/keyboards/nano/nano.c b/keyboards/40percentclub/nano/nano.c similarity index 100% rename from keyboards/nano/nano.c rename to keyboards/40percentclub/nano/nano.c diff --git a/keyboards/nano/nano.h b/keyboards/40percentclub/nano/nano.h similarity index 100% rename from keyboards/nano/nano.h rename to keyboards/40percentclub/nano/nano.h diff --git a/keyboards/40percentclub/nano/readme.md b/keyboards/40percentclub/nano/readme.md new file mode 100644 index 000000000000..2677e5b7b744 --- /dev/null +++ b/keyboards/40percentclub/nano/readme.md @@ -0,0 +1,16 @@ +# nano + +![nano](https://1.bp.blogspot.com/-goa_eXx1McA/WEhvoSdfDSI/AAAAAAAB_bM/XdstcXe_eKkQxuYcNI5cTySTVo3xZxaeQCEw/s640/IMG_20161207_101051.jpg) +=== + +A 2x4 mini switch pad built using 6mm x 6mm tactile switches and a Pro Micro. [More info here.](http://www.40percent.club/2016/12/nano-tmk.html) + +Keyboard Maintainer: QMK Community +Hardware Supported: Pro Micro ATmega32U4 +Hardware Availability: [PCB Files](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/nano/pcb) + +Make example for this keyboard (after setting up your build environment): + + make 40percentclub/nano:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/nano/rules.mk b/keyboards/40percentclub/nano/rules.mk similarity index 100% rename from keyboards/nano/rules.mk rename to keyboards/40percentclub/nano/rules.mk diff --git a/keyboards/40percentclub/readme.md b/keyboards/40percentclub/readme.md new file mode 100644 index 000000000000..a8dd0e84f5f9 --- /dev/null +++ b/keyboards/40percentclub/readme.md @@ -0,0 +1,4 @@ +# 40% Keyboards + +Website: [40percent.club](http://www.40percent.club/) +The original TMK firmware: [repo](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/) diff --git a/keyboards/tomato/config.h b/keyboards/40percentclub/tomato/config.h similarity index 100% rename from keyboards/tomato/config.h rename to keyboards/40percentclub/tomato/config.h diff --git a/keyboards/tomato/info.json b/keyboards/40percentclub/tomato/info.json similarity index 100% rename from keyboards/tomato/info.json rename to keyboards/40percentclub/tomato/info.json diff --git a/keyboards/tomato/keymaps/default/keymap.c b/keyboards/40percentclub/tomato/keymaps/default/keymap.c similarity index 100% rename from keyboards/tomato/keymaps/default/keymap.c rename to keyboards/40percentclub/tomato/keymaps/default/keymap.c diff --git a/keyboards/tomato/readme.md b/keyboards/40percentclub/tomato/readme.md similarity index 56% rename from keyboards/tomato/readme.md rename to keyboards/40percentclub/tomato/readme.md index e3851f18ca67..f93105ffddae 100644 --- a/keyboards/tomato/readme.md +++ b/keyboards/40percentclub/tomato/readme.md @@ -1,4 +1,6 @@ -Tomato +# Tomato + +![Tomato](https://2.bp.blogspot.com/-k6lyvfZz2WA/WXYyr508D7I/AAAAAAACB8A/UCNP2WCfvWAT8UWsCDICMRXwip5tAZsOwCLcBGAs/s640/a.JPG) === A 30 key keyboard with programmable rgb backlighting. @@ -12,9 +14,9 @@ Hardware Availability: [Gherkin project on 40% Keyboards](http://www.40percent.c Make example for this keyboard (after setting up your build environment): - make tomato:default + make 40percentclub/tomato:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). First pass at adding support for the tomato keyboard. Completely untested. Intended to kick-start development. diff --git a/keyboards/tomato/rules.mk b/keyboards/40percentclub/tomato/rules.mk similarity index 100% rename from keyboards/tomato/rules.mk rename to keyboards/40percentclub/tomato/rules.mk diff --git a/keyboards/tomato/tomato.c b/keyboards/40percentclub/tomato/tomato.c similarity index 100% rename from keyboards/tomato/tomato.c rename to keyboards/40percentclub/tomato/tomato.c diff --git a/keyboards/tomato/tomato.h b/keyboards/40percentclub/tomato/tomato.h similarity index 100% rename from keyboards/tomato/tomato.h rename to keyboards/40percentclub/tomato/tomato.h diff --git a/keyboards/ut47/LED_controls.ino b/keyboards/40percentclub/ut47/LED_controls.ino similarity index 100% rename from keyboards/ut47/LED_controls.ino rename to keyboards/40percentclub/ut47/LED_controls.ino diff --git a/keyboards/ut47/config.h b/keyboards/40percentclub/ut47/config.h similarity index 100% rename from keyboards/ut47/config.h rename to keyboards/40percentclub/ut47/config.h diff --git a/keyboards/ut47/info.json b/keyboards/40percentclub/ut47/info.json similarity index 100% rename from keyboards/ut47/info.json rename to keyboards/40percentclub/ut47/info.json diff --git a/keyboards/ut47/keymaps/default/config.h b/keyboards/40percentclub/ut47/keymaps/default/config.h similarity index 100% rename from keyboards/ut47/keymaps/default/config.h rename to keyboards/40percentclub/ut47/keymaps/default/config.h diff --git a/keyboards/ut47/keymaps/default/keymap.c b/keyboards/40percentclub/ut47/keymaps/default/keymap.c similarity index 100% rename from keyboards/ut47/keymaps/default/keymap.c rename to keyboards/40percentclub/ut47/keymaps/default/keymap.c diff --git a/keyboards/ut47/keymaps/default/readme.md b/keyboards/40percentclub/ut47/keymaps/default/readme.md similarity index 100% rename from keyboards/ut47/keymaps/default/readme.md rename to keyboards/40percentclub/ut47/keymaps/default/readme.md diff --git a/keyboards/ut47/keymaps/non-us/config.h b/keyboards/40percentclub/ut47/keymaps/non-us/config.h similarity index 100% rename from keyboards/ut47/keymaps/non-us/config.h rename to keyboards/40percentclub/ut47/keymaps/non-us/config.h diff --git a/keyboards/ut47/keymaps/non-us/keymap.c b/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c similarity index 100% rename from keyboards/ut47/keymaps/non-us/keymap.c rename to keyboards/40percentclub/ut47/keymaps/non-us/keymap.c diff --git a/keyboards/ut47/keymaps/non-us/readme.md b/keyboards/40percentclub/ut47/keymaps/non-us/readme.md similarity index 100% rename from keyboards/ut47/keymaps/non-us/readme.md rename to keyboards/40percentclub/ut47/keymaps/non-us/readme.md diff --git a/keyboards/ut47/keymaps/nordic/config.h b/keyboards/40percentclub/ut47/keymaps/nordic/config.h similarity index 100% rename from keyboards/ut47/keymaps/nordic/config.h rename to keyboards/40percentclub/ut47/keymaps/nordic/config.h diff --git a/keyboards/ut47/keymaps/nordic/keymap.c b/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c similarity index 100% rename from keyboards/ut47/keymaps/nordic/keymap.c rename to keyboards/40percentclub/ut47/keymaps/nordic/keymap.c diff --git a/keyboards/ut47/keymaps/nordic/readme.md b/keyboards/40percentclub/ut47/keymaps/nordic/readme.md similarity index 100% rename from keyboards/ut47/keymaps/nordic/readme.md rename to keyboards/40percentclub/ut47/keymaps/nordic/readme.md diff --git a/keyboards/ut47/keymaps/rgb/config.h b/keyboards/40percentclub/ut47/keymaps/rgb/config.h similarity index 100% rename from keyboards/ut47/keymaps/rgb/config.h rename to keyboards/40percentclub/ut47/keymaps/rgb/config.h diff --git a/keyboards/ut47/keymaps/rgb/keymap.c b/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c similarity index 100% rename from keyboards/ut47/keymaps/rgb/keymap.c rename to keyboards/40percentclub/ut47/keymaps/rgb/keymap.c diff --git a/keyboards/ut47/keymaps/rgb/readme.md b/keyboards/40percentclub/ut47/keymaps/rgb/readme.md similarity index 100% rename from keyboards/ut47/keymaps/rgb/readme.md rename to keyboards/40percentclub/ut47/keymaps/rgb/readme.md diff --git a/keyboards/ut47/keymaps/rgb/rules.mk b/keyboards/40percentclub/ut47/keymaps/rgb/rules.mk similarity index 100% rename from keyboards/ut47/keymaps/rgb/rules.mk rename to keyboards/40percentclub/ut47/keymaps/rgb/rules.mk diff --git a/keyboards/ut47/led.c b/keyboards/40percentclub/ut47/led.c similarity index 100% rename from keyboards/ut47/led.c rename to keyboards/40percentclub/ut47/led.c diff --git a/keyboards/ut47/matrix.c b/keyboards/40percentclub/ut47/matrix.c similarity index 100% rename from keyboards/ut47/matrix.c rename to keyboards/40percentclub/ut47/matrix.c diff --git a/keyboards/ut47/readme.md b/keyboards/40percentclub/ut47/readme.md similarity index 92% rename from keyboards/ut47/readme.md rename to keyboards/40percentclub/ut47/readme.md index 244bbd1de80c..bbae1384a99c 100644 --- a/keyboards/ut47/readme.md +++ b/keyboards/40percentclub/ut47/readme.md @@ -1,6 +1,7 @@ # ut47 ![ut47](https://i.imgur.com/ZDKZQaj.jpg) +=== Somewhere between ortholinear and standard offset. Created to have all the same functions on a Planck in a keyboard but with a more conventional keyboard row stagger. @@ -12,15 +13,15 @@ Hardware Availability: [How to order](http://www.40percent.club/2017/03/ordering To flash the UT47 without LEDs (single controller), run: - make ut47:default + make 40percentclub/ut47:default To enable the UT47 LEDs (dual controller), run this for the main controller: - make ut47:default LED_ENABLE=yes + make 40percentclub/ut47:default LED_ENABLE=yes Or you can add `LED_ENABLE = yes` to *rules.mk* -And then flash [LED_controls.ino](LED_controls.ino) to the second controller using [Arduino IDE](https://www.arduino.cc/en/Main/Software) or similar. NOTE: Arduino IDE will require importing additional libraries to compile. +And then flash [LED_controls.ino](LED_controls.ino) to the second controller using [Arduino IDE](https://www.arduino.cc/en/Main/Software) or similar. NOTE: Arduino IDE will require importing additional libraries to compile. The reason this is an "opt-in" feature is to prevent sending serial communication over the pin, in case it ends up being used for something else (like RGB underglow). diff --git a/keyboards/ut47/rules.mk b/keyboards/40percentclub/ut47/rules.mk similarity index 100% rename from keyboards/ut47/rules.mk rename to keyboards/40percentclub/ut47/rules.mk diff --git a/keyboards/ut47/ut47.c b/keyboards/40percentclub/ut47/ut47.c similarity index 100% rename from keyboards/ut47/ut47.c rename to keyboards/40percentclub/ut47/ut47.c diff --git a/keyboards/ut47/ut47.h b/keyboards/40percentclub/ut47/ut47.h similarity index 100% rename from keyboards/ut47/ut47.h rename to keyboards/40percentclub/ut47/ut47.h diff --git a/keyboards/mf68/README.md b/keyboards/mf68/README.md deleted file mode 100644 index 7dd3a900a54e..000000000000 --- a/keyboards/mf68/README.md +++ /dev/null @@ -1,18 +0,0 @@ -MF68 -==== - -Magicforce 68 with [replacement PCB](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/mf68) designed by [di0ib](https://github.com/di0ib). - -Keyboard Maintainer: [di0ib](http://www.40percent.club) -Hardware Supported: Pro Micro -Hardware Availability: [PCB files](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/mf68/pcb) - -Make example for this keyboard (after setting up your build environment): - - make mf68:default - -Example of flashing this keyboard: - - make mf68:default:avrdude - -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. diff --git a/keyboards/nano/readme.md b/keyboards/nano/readme.md deleted file mode 100644 index e8278e340c58..000000000000 --- a/keyboards/nano/readme.md +++ /dev/null @@ -1,14 +0,0 @@ -Nano -==== - -A 2x4 mini switch pad built using 6mm x 6mm tactile switches and a Pro Micro. [More info here.](http://www.40percent.club/2016/12/nano-tmk.html) - -Keyboard Maintainer: [di0ib](https://github.com/di0ib) -Hardware Supported: Pro Micro ATmega32U4 -Hardware Availability: [PCB Files](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/nano/pcb) - -Make example for this keyboard (after setting up your build environment): - - make nano:default - -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. From fa2183a64a1f8619f0b0ce9b8087732eaaa154bf Mon Sep 17 00:00:00 2001 From: dlgoodr Date: Thu, 8 Nov 2018 19:01:16 -0600 Subject: [PATCH 388/505] Keymap: dlg's tada68 keymap (#4289) * dlg's keymap * fix list order * remove cruft * pragma Co-Authored-By: dlgoodr * turn on bootmagic, enable swapping ` and Esc while I figure out which compromise is least bad --- keyboards/tada68/keymaps/dlg/config.h | 3 + keyboards/tada68/keymaps/dlg/keymap.c | 76 ++++++++++++++++++++++++++ keyboards/tada68/keymaps/dlg/readme.md | 54 ++++++++++++++++++ keyboards/tada68/keymaps/dlg/rules.mk | 17 ++++++ 4 files changed, 150 insertions(+) create mode 100644 keyboards/tada68/keymaps/dlg/config.h create mode 100755 keyboards/tada68/keymaps/dlg/keymap.c create mode 100755 keyboards/tada68/keymaps/dlg/readme.md create mode 100644 keyboards/tada68/keymaps/dlg/rules.mk diff --git a/keyboards/tada68/keymaps/dlg/config.h b/keyboards/tada68/keymaps/dlg/config.h new file mode 100644 index 000000000000..e1a6eb1a2b0c --- /dev/null +++ b/keyboards/tada68/keymaps/dlg/config.h @@ -0,0 +1,3 @@ +#pragma once + +#define GRAVE_ESC_ALT_OVERRIDE diff --git a/keyboards/tada68/keymaps/dlg/keymap.c b/keyboards/tada68/keymaps/dlg/keymap.c new file mode 100755 index 000000000000..9cd6cb2f129d --- /dev/null +++ b/keyboards/tada68/keymaps/dlg/keymap.c @@ -0,0 +1,76 @@ +#include QMK_KEYBOARD_H + +#define _BL 0 +#define _FL 1 +#define _MAC 2 + +// investigate later - use lctl / lsft as up/down. +// https://github.com/qmk/qmk_firmware/tree/master/keyboards/tada68/keymaps/fakb +#define LCTL_MA LCTL_T(KC_UP) +#define LSFT_MA LSFT_T(KC_DOWN) + +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| [| ]| \ |Del | + * |----------------------------------------------------------------| + * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return |PgUp| + * |----------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |Alt|Fn |Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + * + * Note: Shift + Esc = ~ + * Win + Esc = ` + */ +[_BL] = LAYOUT_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_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_BSLS, KC_DEL , \ + 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_PGUP, \ + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, KC_PGDN, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RCTRL, KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap _FL: Function Layer + * ,----------------------------------------------------------------. + * |`swp|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| Del |`swp| + * |----------------------------------------------------------------| + * | |BL |BL-|BL+|Brt| | | |mac| |PSc| | | |Ins | + * |----------------------------------------------------------------| + * | | | | | | |<- |Dn |Up | ->| | | |Hme | + * |----------------------------------------------------------------| + * | | | | | | | |MUT|V- |V+ | | |PUp|End | + * |----------------------------------------------------------------| + * | | | | | | | |Hme|PDn|End | + * `----------------------------------------------------------------' + */ +[_FL] = LAYOUT_ansi( + MAGIC_UNSWAP_GRAVE_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_DEL, MAGIC_SWAP_GRAVE_ESC, \ + _______, BL_TOGG, BL_DEC, BL_INC , BL_BRTG, _______, _______, _______, TG(_MAC),_______, KC_PSCR, _______, _______, _______, KC_INS, \ + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, _______, KC_HOME, \ + _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, KC_PGUP, KC_END , \ + _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END ), + + /* Keymap _MAC: Mac Layer + * ,----------------------------------------------------------------. + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * | | | | | | | | | | | | | | | + * |----------------------------------------------------------------| + * |Ctrl|Alt |Win | |Win | |Alt| | | | + * `----------------------------------------------------------------' + */ +[_MAC] = LAYOUT_ansi( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + KC_LCTL, KC_LALT, KC_LGUI, _______, KC_RGUI, _______, KC_RALT, _______, _______, _______), + +}; diff --git a/keyboards/tada68/keymaps/dlg/readme.md b/keyboards/tada68/keymaps/dlg/readme.md new file mode 100755 index 000000000000..1f1ae1867111 --- /dev/null +++ b/keyboards/tada68/keymaps/dlg/readme.md @@ -0,0 +1,54 @@ +# dlg's layout + +[tshack's layout](https://github.com/qmk/qmk_firmware/tree/master/keyboards/tada68/keymaps/tshack), with: + + Mac layer + + Press Fn-I to align the bottom row to mac standards + + volume controls moved to Fn+ M<> + + [Space Cadet Shift](https://docs.qmk.fm/#/feature_space_cadet_shift) enabled + + Fn+R for LED breathing + + Fn+Del for Insert + + `GRAVE_ESC_ALT_OVERRIDE` so cmd-opt-esc still works (thx [mattdicarlo](https://github.com/qmk/qmk_firmware/tree/master/keyboards/tada68/keymaps/mattdicarlo)) + +``` + Base Layer +,----------------------------------------------------------------. +|Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |~ ` | +|----------------------------------------------------------------| +|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |Del | +|----------------------------------------------------------------| +|Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return |PgUp| +|----------------------------------------------------------------| +|Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Up |PgDn| +|----------------------------------------------------------------| +|Ctrl|Win |Alt | Space |Alt|Fn |Ctrl|<- |Dn | -> | +`----------------------------------------------------------------' +Note: Shift + Esc = ~ (tilde) + Win + Esc = ` (grave) + + + Fn Layer +,----------------------------------------------------------------. +| |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| Del | | +|----------------------------------------------------------------| +| |BL |BL-|BL+|Brt| | | |mac| |PSc| | | |Ins | +|----------------------------------------------------------------| +| | | | | | |<- |Dn |Up | ->| | | |Hme | +|----------------------------------------------------------------| +| | | | | | | |MUT|V- |V+ | | |PUp|End | +|----------------------------------------------------------------| +| | | | | | | |Hme|PDn|End | +`----------------------------------------------------------------' + +Mac Layer +,----------------------------------------------------------------. +| | | | | | | | | | | | | | | | +|----------------------------------------------------------------| +| | | | | | | | | | | | | | | | +|----------------------------------------------------------------| +| | | | | | | | | | | | | | | +|----------------------------------------------------------------| +| | | | | | | | | | | | | | | +|----------------------------------------------------------------| +|Ctrl|Alt |Win | |Win | |Alt| | | | +`----------------------------------------------------------------' +``` diff --git a/keyboards/tada68/keymaps/dlg/rules.mk b/keyboards/tada68/keymaps/dlg/rules.mk new file mode 100644 index 000000000000..2e0f1a661631 --- /dev/null +++ b/keyboards/tada68/keymaps/dlg/rules.mk @@ -0,0 +1,17 @@ +# 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 = full # 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 +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. +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend From 6ae409dd55133e25e103aa974080ce127790357f Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Fri, 9 Nov 2018 08:49:29 -0800 Subject: [PATCH 389/505] Add my new ANSI layout dz60 setup (#4397) * minor additions to alps64 and dz60 * Rename crd keymap to represent 2u lshift layout * Add crd's new ANSI layout dz60 with preferred layers --- keyboards/alps64/keymaps/crd/keymap.c | 6 ++-- .../keymaps/{crd => crd_2u_lshift}/keymap.c | 30 +++++++++---------- keyboards/dz60/keymaps/crd_ansi/keymap.c | 25 ++++++++++++++++ 3 files changed, 43 insertions(+), 18 deletions(-) rename keyboards/dz60/keymaps/{crd => crd_2u_lshift}/keymap.c (80%) create mode 100644 keyboards/dz60/keymaps/crd_ansi/keymap.c diff --git a/keyboards/alps64/keymaps/crd/keymap.c b/keyboards/alps64/keymaps/crd/keymap.c index 4f3ea446eced..815e6ddf4bc4 100644 --- a/keyboards/alps64/keymaps/crd/keymap.c +++ b/keyboards/alps64/keymaps/crd/keymap.c @@ -11,7 +11,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* 1: fn1 */ LAYOUT_all( - _______, 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_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_DEL, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_END, KC_PGDOWN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -19,8 +19,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* 2: fn2 */ LAYOUT_all( - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, + _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______, DEBUG, _______, _______, _______, _______, _______, _______, KC_SCROLLLOCK, KC_PAUSE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/dz60/keymaps/crd/keymap.c b/keyboards/dz60/keymaps/crd_2u_lshift/keymap.c similarity index 80% rename from keyboards/dz60/keymaps/crd/keymap.c rename to keyboards/dz60/keymaps/crd_2u_lshift/keymap.c index 148b03b995b9..4d2ca279c259 100644 --- a/keyboards/dz60/keymaps/crd/keymap.c +++ b/keyboards/dz60/keymaps/crd_2u_lshift/keymap.c @@ -10,7 +10,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |-----------------------------------------------------------------------------------------+ * | Ctrl/Esc| A | S | D | F | G | H | J | K | L | ; | ' | Enter | * |-----------------------------------------------------------------------------------------+ - * | Shift | Z | X | C | V | B | N | M | , | . | / | RSh | U | DEL | + * | Shift | Z | X | C | V | B | N | M | , | . | / |Home | U | End | * |-----------------------------------------------------------------------------------------+ * | FN1 | Alt | Cmd | Space | Cmd | FN2 | L | D | R | * `-----------------------------------------------------------------------------------------' @@ -20,17 +20,17 @@ 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, 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, 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, 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_UP, KC_DEL, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_HOME, KC_UP, KC_END, MO(1), KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, MO(2), KC_LEFT, KC_DOWN, KC_RIGHT ), /* FN1 Layer * ,-----------------------------------------------------------------------------------------. - * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | + * | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Del | * |-----------------------------------------------------------------------------------------+ - * | | | | | | | | | | | | | | | + * | | | | | | | | | | | | Home | PgUp | | * |-----------------------------------------------------------------------------------------+ - * | | | | | | | L | D | U | R | | | | + * | | | | | | | L | D | U | R | End | PgDn| | * |-----------------------------------------------------------------------------------------+ * | | | | | | | | | | | | |PgUp | | * |-----------------------------------------------------------------------------------------+ @@ -39,10 +39,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ LAYOUT_directional( - _______, 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_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, + 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_DEL, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_END, KC_PGDOWN, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDOWN, KC_END ), @@ -50,9 +50,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ,-----------------------------------------------------------------------------------------. * | | | | | | | | | | | | | | RESET | * |-----------------------------------------------------------------------------------------+ - * | |RBB T|RGB M| Hue+| Hue-| Sat+| Sat-| Val+| Val-| | | | | | + * | |RBB T|RGB M| Hue+| Hue-| Sat+| Sat-| Val+| Val-| |Mute | Vol- | Vol+ | | * |-----------------------------------------------------------------------------------------+ - * | | | | | | | | | | | | | | + * | | | | | | | | | | |Bri- |Bri+ | | * |-----------------------------------------------------------------------------------------+ * | | | | | | | | | | | |Pl/Ps|Vol+ |Mute | * |-----------------------------------------------------------------------------------------+ @@ -61,10 +61,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ LAYOUT_directional( - KC_SLEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, - _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_VOLU, KC_MUTE, + KC_SLEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, + _______, _______, _______, DEBUG, _______, _______, _______, _______, _______, _______, KC_SCROLLLOCK, KC_PAUSE, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_VOLU, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT ), }; diff --git a/keyboards/dz60/keymaps/crd_ansi/keymap.c b/keyboards/dz60/keymaps/crd_ansi/keymap.c new file mode 100644 index 000000000000..eac0f1e84c06 --- /dev/null +++ b/keyboards/dz60/keymaps/crd_ansi/keymap.c @@ -0,0 +1,25 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + LAYOUT_60_ansi( + 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_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_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, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RSFT_T(KC_UP), + MO(1), KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, RGUI_T(KC_LEFT), RALT_T(KC_DOWN), LT(2, KC_RIGHT) + ), + LAYOUT_60_ansi( + 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_DEL, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______, + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_END, KC_PGDN, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ), + LAYOUT_60_ansi( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_SCROLLLOCK, KC_PAUSE, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ + ) +}; From 519ce723fb5e8e7272ee08f611d2c15e40bb2969 Mon Sep 17 00:00:00 2001 From: mcmadhatter Date: Fri, 9 Nov 2018 19:16:08 +0000 Subject: [PATCH 390/505] Added support for backlight on diverge3 , and added a UK iso layout (#4392) * Added support for backlight , and a UK iso layout Added support for backlight , and a UK iso layout. Now uses the SPLIT_KEYBOARD #define rather than relying on lets split * Update keyboards/diverge3/keymaps/isoUK/keymap.c Co-Authored-By: mcmadhatter * Update keyboards/diverge3/keymaps/isoUK/keymap.c Co-Authored-By: mcmadhatter * Simplified the lower layer Simplified the lower layer * dir rename to snake case dir rename to snake case * changed dir case changed dir case * Update keyboards/diverge3/rules.mk Co-Authored-By: mcmadhatter * Update keyboards/diverge3/keymaps/iso_uk/config.h Co-Authored-By: mcmadhatter * Update keyboards/diverge3/config.h Co-Authored-By: mcmadhatter * Update keyboards/diverge3/keymaps/iso_uk/keymap.c Co-Authored-By: mcmadhatter * Update keyboards/diverge3/keymaps/iso_uk/keymap.c Co-Authored-By: mcmadhatter * Update keyboards/diverge3/keymaps/iso_uk/keymap.c Co-Authored-By: mcmadhatter * Update keyboards/diverge3/config.h Co-Authored-By: mcmadhatter * Update keyboards/diverge3/keymaps/iso_uk/config.h Co-Authored-By: mcmadhatter * Update keyboards/diverge3/keymaps/iso_uk/config.h Co-Authored-By: mcmadhatter * Update keyboards/diverge3/keymaps/iso_uk/config.h Co-Authored-By: mcmadhatter * aligned and tidyied up aligned and tidyied up --- keyboards/diverge3/config.h | 14 +++---- keyboards/diverge3/keymaps/iso_uk/config.h | 24 +++++++++++ keyboards/diverge3/keymaps/iso_uk/keymap.c | 45 +++++++++++++++++++++ keyboards/diverge3/keymaps/iso_uk/readme.md | 1 + keyboards/diverge3/keymaps/iso_uk/rules.mk | 1 + keyboards/diverge3/rules.mk | 10 ++--- 6 files changed, 79 insertions(+), 16 deletions(-) create mode 100755 keyboards/diverge3/keymaps/iso_uk/config.h create mode 100644 keyboards/diverge3/keymaps/iso_uk/keymap.c create mode 100755 keyboards/diverge3/keymaps/iso_uk/readme.md create mode 100755 keyboards/diverge3/keymaps/iso_uk/rules.mk diff --git a/keyboards/diverge3/config.h b/keyboards/diverge3/config.h index f3ed06739a8e..262be7b7573f 100644 --- a/keyboards/diverge3/config.h +++ b/keyboards/diverge3/config.h @@ -31,10 +31,6 @@ along with this program. If not, see . /* key matrix size */ #define MATRIX_ROWS 10 #define MATRIX_COLS 8 -// Only SERIAL is currently supported -// By converting this to use I2C, backlight -// would/should be fully functional as well -#define USE_SERIAL /* * Keyboard Matrix Assignments @@ -53,9 +49,9 @@ along with this program. If not, see . /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #define DIODE_DIRECTION ROW2COL -// #define BACKLIGHT_PIN C6 -// #define BACKLIGHT_BREATHING -// #define BACKLIGHT_LEVELS 3 +#define BACKLIGHT_PIN C6 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 5 /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ @@ -63,7 +59,7 @@ along with this program. If not, see . /* define if matrix has ghost (lacks anti-ghosting diodes) */ //#define MATRIX_HAS_GHOST - + /* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ #define LOCKING_SUPPORT_ENABLE @@ -73,7 +69,7 @@ along with this program. If not, see . /* If defined, GRAVE_ESC will always act as ESC when CTRL is held. * This is userful for the Windows task manager shortcut (ctrl+shift+esc). */ -// #define GRAVE_ESC_CTRL_OVERRIDE + #define GRAVE_ESC_CTRL_OVERRIDE /* * Force NKRO diff --git a/keyboards/diverge3/keymaps/iso_uk/config.h b/keyboards/diverge3/keymaps/iso_uk/config.h new file mode 100755 index 000000000000..83f65979c7ea --- /dev/null +++ b/keyboards/diverge3/keymaps/iso_uk/config.h @@ -0,0 +1,24 @@ +/* Copyright 2017 IslandMan93 + * + * 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 + + +// place overrides here +#define MASTER_LEFT +#define PERMISSIVE_HOLD +#define TAPPING_TERM 150 + diff --git a/keyboards/diverge3/keymaps/iso_uk/keymap.c b/keyboards/diverge3/keymaps/iso_uk/keymap.c new file mode 100644 index 000000000000..804334785084 --- /dev/null +++ b/keyboards/diverge3/keymaps/iso_uk/keymap.c @@ -0,0 +1,45 @@ +/* Copyright 2017 IslandMan93 + * + * 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 QMK_KEYBOARD_H + + +enum layers { + _QWERTY, + _LOWER, +}; + +#define LOWER MO(_LOWER) + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( \ + KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, + KC_CAPS, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LCBR, KC_RCBR, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_PSCR, KC_PGUP, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_NUHS, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_INS, KC_PGDN, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_ENT, + KC_LCTL, KC_LGUI, KC_LALT, KC_HOME, KC_END, KC_SPC, KC_SPC, LOWER, KC_QUOT, KC_SPC, KC_SPC, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,KC_SLASH + ), + + [_LOWER] = LAYOUT( + RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, + BL_TOGG, KC_ASTG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_INC, KC_ASUP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + BL_DEC, KC_ASDN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, KC_ASRP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ) + +}; diff --git a/keyboards/diverge3/keymaps/iso_uk/readme.md b/keyboards/diverge3/keymaps/iso_uk/readme.md new file mode 100755 index 000000000000..ff4971754ae9 --- /dev/null +++ b/keyboards/diverge3/keymaps/iso_uk/readme.md @@ -0,0 +1 @@ +# My UK based diverge 3 layout diff --git a/keyboards/diverge3/keymaps/iso_uk/rules.mk b/keyboards/diverge3/keymaps/iso_uk/rules.mk new file mode 100755 index 000000000000..c9383ab8db88 --- /dev/null +++ b/keyboards/diverge3/keymaps/iso_uk/rules.mk @@ -0,0 +1 @@ +AUTO_SHIFT_ENABLE = yes diff --git a/keyboards/diverge3/rules.mk b/keyboards/diverge3/rules.mk index 38f3ee4e6a9e..36e8ccb471af 100644 --- a/keyboards/diverge3/rules.mk +++ b/keyboards/diverge3/rules.mk @@ -1,6 +1,3 @@ -SRC += ../lets_split/matrix.c \ - ../lets_split/serial.c \ - ../lets_split/split_util.c # MCU name #MCU = at90usb1286 @@ -61,13 +58,12 @@ 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 +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. - +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. +SPLIT_KEYBOARD = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -CUSTOM_MATRIX = yes From d6184be67a56429a284c2d0fa5f990368a580735 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Fri, 9 Nov 2018 12:15:37 -0800 Subject: [PATCH 391/505] IDOBO Keyboard Support (75Keys Aluminum Keyboard) (#4401) * initial commit * put my name everywhere * get the switch matrix correct * add a basic keymap * use a better LAYOUT macro * update readme * Add QMK Configurator support --- keyboards/idobo/config.h | 227 ++++++++++++++++++++++ keyboards/idobo/idobo.c | 43 ++++ keyboards/idobo/idobo.h | 44 +++++ keyboards/idobo/info.json | 12 ++ keyboards/idobo/keymaps/default/config.h | 19 ++ keyboards/idobo/keymaps/default/keymap.c | 66 +++++++ keyboards/idobo/keymaps/default/readme.md | 1 + keyboards/idobo/readme.md | 17 ++ keyboards/idobo/rules.mk | 81 ++++++++ 9 files changed, 510 insertions(+) create mode 100644 keyboards/idobo/config.h create mode 100644 keyboards/idobo/idobo.c create mode 100644 keyboards/idobo/idobo.h create mode 100644 keyboards/idobo/info.json create mode 100644 keyboards/idobo/keymaps/default/config.h create mode 100644 keyboards/idobo/keymaps/default/keymap.c create mode 100644 keyboards/idobo/keymaps/default/readme.md create mode 100644 keyboards/idobo/readme.md create mode 100644 keyboards/idobo/rules.mk diff --git a/keyboards/idobo/config.h b/keyboards/idobo/config.h new file mode 100644 index 000000000000..f6b552bad8dc --- /dev/null +++ b/keyboards/idobo/config.h @@ -0,0 +1,227 @@ +/* +Copyright 2018 MechMerlin + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER You +#define PRODUCT idobo +#define DESCRIPTION A custom keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 15 + +/* + * 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 { B0, B3, C7, B6, C6 } +#define MATRIX_COL_PINS { F6, F5, F4, F1, E6, D5, D3, D2, D1, D0, D4, D6, D7, B4, B5 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B7 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 + +#define RGB_DI_PIN F0 +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 16 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#endif + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 diff --git a/keyboards/idobo/idobo.c b/keyboards/idobo/idobo.c new file mode 100644 index 000000000000..3f870835ed89 --- /dev/null +++ b/keyboards/idobo/idobo.c @@ -0,0 +1,43 @@ +/* Copyright 2018 MechMerlin + * + * 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 "idobo.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/idobo/idobo.h b/keyboards/idobo/idobo.h new file mode 100644 index 000000000000..386fcee1a94c --- /dev/null +++ b/keyboards/idobo/idobo.h @@ -0,0 +1,44 @@ +/* Copyright 2018 MechMerlin + * + * 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 IDOBO_H +#define IDOBO_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT_ortho_5x15( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \ + K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \ + { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E }, \ +} + +#endif diff --git a/keyboards/idobo/info.json b/keyboards/idobo/info.json new file mode 100644 index 000000000000..69c5e4e063d5 --- /dev/null +++ b/keyboards/idobo/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "IDOBO", + "url": "", + "maintainer": "qmk", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_ortho_5x15": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":13, "y":1}, {"x":14, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "y":2}, {"x":12, "y":2}, {"x":13, "y":2}, {"x":14, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":6, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4}, {"x":5, "y":4}, {"x":6, "y":4}, {"x":7, "y":4}, {"x":8, "y":4}, {"x":9, "y":4}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}] + } + } +} diff --git a/keyboards/idobo/keymaps/default/config.h b/keyboards/idobo/keymaps/default/config.h new file mode 100644 index 000000000000..a3ed4f762a6e --- /dev/null +++ b/keyboards/idobo/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 MechMerlin + * + * 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 + +// place overrides here diff --git a/keyboards/idobo/keymaps/default/keymap.c b/keyboards/idobo/keymaps/default/keymap.c new file mode 100644 index 000000000000..f54e3359bb20 --- /dev/null +++ b/keyboards/idobo/keymaps/default/keymap.c @@ -0,0 +1,66 @@ +/* Copyright 2018 MechMerlin + * + * 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 QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ortho_5x15( \ + 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_DEL, \ + 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_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_RSFT, KC_UP, KC_PGDN, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/idobo/keymaps/default/readme.md b/keyboards/idobo/keymaps/default/readme.md new file mode 100644 index 000000000000..577c62b51f80 --- /dev/null +++ b/keyboards/idobo/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for idobo diff --git a/keyboards/idobo/readme.md b/keyboards/idobo/readme.md new file mode 100644 index 000000000000..7f2c684464a3 --- /dev/null +++ b/keyboards/idobo/readme.md @@ -0,0 +1,17 @@ +# IDOBO + +![IDOBO](imgur.com image replace me!) + +75Keys Aluminum Mechanical Keyboard. + +Firmware here originally appeared on qmkeyboard.cn + +Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin) +Hardware Supported: IDOBO PCB +Hardware Availability: [IDOBO on Massdrop](https://www.massdrop.com/buy/xd75-aluminum-mechanical-keyboard) + +Make example for this keyboard (after setting up your build environment): + + make idobo:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/idobo/rules.mk b/keyboards/idobo/rules.mk new file mode 100644 index 000000000000..383a3594b474 --- /dev/null +++ b/keyboards/idobo/rules.mk @@ -0,0 +1,81 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = 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 +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From b3853e7d40528a2d5fbab940678ce75c70b4de6c Mon Sep 17 00:00:00 2001 From: Logan Huskins Date: Sat, 10 Nov 2018 10:21:24 -0600 Subject: [PATCH 392/505] Keymap: Add default keymap from web for 1up60hse (#4351) --- .../1up60hse/keymaps/default/config.h | 1 + .../1up60hse/keymaps/default/keymap.c | 43 +++++++++++-------- .../1up60hse/keymaps/default/readme.md | 6 +-- 3 files changed, 28 insertions(+), 22 deletions(-) diff --git a/keyboards/1upkeyboards/1up60hse/keymaps/default/config.h b/keyboards/1upkeyboards/1up60hse/keymaps/default/config.h index a3ed4f762a6e..99a70056070c 100644 --- a/keyboards/1upkeyboards/1up60hse/keymaps/default/config.h +++ b/keyboards/1upkeyboards/1up60hse/keymaps/default/config.h @@ -1,4 +1,5 @@ /* Copyright 2018 MechMerlin + * Copyright 2018 Logan Huskins * * 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/keyboards/1upkeyboards/1up60hse/keymaps/default/keymap.c b/keyboards/1upkeyboards/1up60hse/keymaps/default/keymap.c index 556246a3b204..1c168abf7d65 100644 --- a/keyboards/1upkeyboards/1up60hse/keymaps/default/keymap.c +++ b/keyboards/1upkeyboards/1up60hse/keymaps/default/keymap.c @@ -1,4 +1,5 @@ /* Copyright 2018 MechMerlin + * Copyright 2018 Logan Huskins * * 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 @@ -17,28 +18,34 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT_60_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, - MO(1), 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_LSFT, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(2), KC_RGUI, KC_RCTL), + 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, MO(1), KC_LCTL + ), - [1] = LAYOUT_60_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_TRNS, - KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + [1] = LAYOUT_60_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_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, + KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_HOME, KC_PGUP, KC_TRNS, + KC_TRNS, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, + KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(2), KC_TRNS, KC_TRNS + ), [2] = LAYOUT_60_ansi( - RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, - KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BL_STEP, BL_DEC, BL_INC, BL_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAD, RGB_VAI, RGB_SAI, RGB_HUD, RGB_HUI, RGB_MOD, RGB_TOG, KC_TRNS, KC_TRNS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, RESET, BL_TOGG, BL_INC, BL_DEC, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, + RGB_SAI, RGB_VAI, RGB_SPI, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS + ), }; -bool process_record_user(uint16_t keycode, keyrecord_t *record) { +bool process_record_user(uint16_t keycode, keyrecord_t *record) +{ return true; } - diff --git a/keyboards/1upkeyboards/1up60hse/keymaps/default/readme.md b/keyboards/1upkeyboards/1up60hse/keymaps/default/readme.md index a9afa5ea6d04..a7041f37b2ac 100644 --- a/keyboards/1upkeyboards/1up60hse/keymaps/default/readme.md +++ b/keyboards/1upkeyboards/1up60hse/keymaps/default/readme.md @@ -1,6 +1,4 @@ -# 1up60hse default keymap +# 1up60hse default keymap generated by QMK Configurator -This is the default keymap provided by [1upkeyboards](https://www.1upkeyboards.com). +This is the keymap used by [QMK Configurator](https://config.qmk.fm/#/1upkeyboards/1up60hse/LAYOUT_60_ansi) as default. -## Notes -- Software reset key is located on `Esc` on the third layer. From 3ba242cc3f5db93b14f0939f056e9aa759a43efe Mon Sep 17 00:00:00 2001 From: gorbachev Date: Sat, 10 Nov 2018 11:22:36 -0500 Subject: [PATCH 393/505] Keymap for random key presses for the scrabblepad (#4356) * Random key presses for scrabblepad * Fix keymap code comments * Remove unused methods as per code review --- keyboards/scrabblepad/keymaps/random/keymap.c | 75 +++++++++++++++++++ .../scrabblepad/keymaps/random/readme.md | 5 ++ 2 files changed, 80 insertions(+) create mode 100644 keyboards/scrabblepad/keymaps/random/keymap.c create mode 100644 keyboards/scrabblepad/keymaps/random/readme.md diff --git a/keyboards/scrabblepad/keymaps/random/keymap.c b/keyboards/scrabblepad/keymaps/random/keymap.c new file mode 100644 index 000000000000..8e782596615b --- /dev/null +++ b/keyboards/scrabblepad/keymaps/random/keymap.c @@ -0,0 +1,75 @@ +#include "scrabblepad.h" +#include + +static uint16_t keystroke; +static bool shift_pressed; + +static int lower = (int) KC_A; +static int upper = (int) KC_Z; + +uint16_t random_keycode(void) { + return lower + (rand() % (upper - lower + 1)); +}; + +enum custom_keycodes { + RND_KEY = SAFE_RANGE +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch(keycode) { + case RND_KEY: + if (record->event.pressed) { + keystroke = random_keycode(); + if (rand() % 2 > 0) { + shift_pressed = 1; + register_code(KC_LSHIFT); + } + register_code(keystroke); + } else { + if (shift_pressed > 0) { + unregister_code(KC_LSHIFT); + } + unregister_code(keystroke); + } + + return false; + + default: + return true; + } + + return true; +} + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[0] = LAYOUT( /* Base */ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RESET, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, \ + RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY, RND_KEY +), +}; + + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/scrabblepad/keymaps/random/readme.md b/keyboards/scrabblepad/keymaps/random/readme.md new file mode 100644 index 000000000000..e719adaeb8a2 --- /dev/null +++ b/keyboards/scrabblepad/keymaps/random/readme.md @@ -0,0 +1,5 @@ +# Scrabblepad keymap with every key press random + +Every key produces a random key press, except the middle key, which is reserved for resetting the board. + +The random key press is selected between KC_A and KC_Z keycodes. From 408361402385ea938575956e9368b5f373edc629 Mon Sep 17 00:00:00 2001 From: yiancar Date: Sat, 10 Nov 2018 12:26:39 -0800 Subject: [PATCH 394/505] I2C driver docs (#4298) * I2C driver docs - Added I2C driver docs. - Changed arm master i2c driver to have a weak i2c_init as it is impossible to account for all possible port configuration in the STM32 world. * Update docs/i2c_driver.md Co-Authored-By: yiancar * Update docs/i2c_driver.md Co-Authored-By: yiancar * Update docs/i2c_driver.md Co-Authored-By: yiancar * Update docs/i2c_driver.md Co-Authored-By: yiancar * GPIO release fix --- docs/_sidebar.md | 1 + docs/_summary.md | 1 + docs/i2c_driver.md | 83 ++++++++++++++++++++++++++++++++++++++++ drivers/arm/i2c_master.c | 5 ++- 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 docs/i2c_driver.md diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 2c573801220a..67e81422a187 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -79,6 +79,7 @@ * [Hand Wiring Guide](hand_wire.md) * [ISP Flashing Guide](isp_flashing_guide.md) * [ARM Debugging Guide](arm_debugging.md) + * [I2C Driver](i2c_driver.md) * For a Deeper Understanding * [How Keyboards Work](how_keyboards_work.md) diff --git a/docs/_summary.md b/docs/_summary.md index 2c573801220a..67e81422a187 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -79,6 +79,7 @@ * [Hand Wiring Guide](hand_wire.md) * [ISP Flashing Guide](isp_flashing_guide.md) * [ARM Debugging Guide](arm_debugging.md) + * [I2C Driver](i2c_driver.md) * For a Deeper Understanding * [How Keyboards Work](how_keyboards_work.md) diff --git a/docs/i2c_driver.md b/docs/i2c_driver.md new file mode 100644 index 000000000000..f69eb5a9da2c --- /dev/null +++ b/docs/i2c_driver.md @@ -0,0 +1,83 @@ +# I2C Master Driver + +The I2C Master drivers used in QMK have a set of common functions to allow portability between MCUs. + +## Available functions + +|Function |Description | +|------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +|`void i2c_init(void);` |Initializes the I2C driver. This function should be called once before any transaction is initiated. | +|`uint8_t i2c_start(uint8_t address);` |Starts an I2C transaction. Address is the 7-bit slave address without the direction bit. | +|`uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Transmit data over I2C. Address is the 7-bit slave address without the direction. | +|`uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Transmit data over I2C. Address is the 7-bit slave address without the direction. Returns status of transaction. | +|`uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Receive data over I2C. Address is the 7-bit slave address without the direction. Saves number of bytes specified by `length` in `data` array. Returns status of transaction. | +|`uint8_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` |Same as the `i2c_transmit` function but `regaddr` sets where in the slave the data will be written. | +|`uint8_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` |Same as the `i2c_receive` function but `regaddr` sets from where in the slave the data will be read. | +|`uint8_t i2c_stop(uint16_t timeout);` |Stops the I2C driver. | + +### Function Return + +All the above functions, except `void i2c_init(void);` return the following truth table: + +|Return Value |Description | +|---------------|---------------------------------------------------| +|0 |Operation executed successfully. | +|-1 |Operation failed. | +|-2 |Operation timed out. | + + +## AVR + +### Configuration + +The following defines can be used to configure the I2C master driver. + +|Variable |Description |Default| +|------------------|---------------------------------------------------|-------| +|`#F_SCL` |Clock frequency in Hz |400KHz | +|`#Prescaler` |Divides master clock to aid in I2C clock selection |1 | + +AVRs usually have set GPIO which turn into I2C pins, therefore no further configuration is required. + +## ARM + +For ARM the Chibios I2C HAL driver is under the hood. +This section assumes an STM32 MCU. + +### Configuration + +The configuration for ARM MCUs can be quite complex as often there are multiple I2C drivers which can be assigned to a variety of ports. + +Firstly the `mcuconf.h` file must be setup to enable the necessary hardware drivers. + +|Variable |Description |Default| +|------------------------------|------------------------------------------------------------------------------------|-------| +|`#STM32_I2C_USE_XXX` |Enable/Disable the hardware driver XXX (each driver should be explicitly listed) |FALSE | +|`#STM32_I2C_BUSY_TIMEOUT` |Time in ms until the I2C command is aborted if no response is received |50 | +|`#STM32_I2C_XXX_IRQ_PRIORITY` |Interrupt priority for hardware driver XXX (THIS IS AN EXPERT SETTING) |10 | +|`#STM32_I2C_USE_DMA` |Enable/Disable the ability of the MCU to offload the data transfer to the DMA unit |TRUE | +|`#STM32_I2C_XXX_DMA_PRIORITY` |Priority of DMA unit for hardware driver XXX (THIS IS AN EXPERT SETTING) |1 | + +Secondly, in the `halconf.h` file, `#define HAL_USE_I2C` must be set to `TRUE`. This allows ChibiOS to load its I2C driver. + +Lastly, we need to assign the correct GPIO pins depending on the I2C hardware driver we want to use. + +By default the I2C1 hardware driver is assumed to be used. If another hardware driver is used, `#define I2C_DRIVER I2CDX` should be added to the `config.h` file with X being the number of hardware driver used. For example is I2C3 is enabled, the `config.h` file should contain `#define I2C_DRIVER I2CD3`. This aligns the QMK I2C driver with the Chibios I2C driver. + +STM32 MCUs allows a variety of pins to be configured as I2C pins depending on the hardware driver used. By default B6 and B7 are set to I2C. + +This can be changed by declaring the `i2c_init` function which intentionally has a weak attribute. Please consult the datasheet of your MCU for the available GPIO configurations. The following is an example initialization function: + +```C +void i2c_init(void) +{ + setPinInput(B6); // Try releasing special pins for a short time + setPinInput(B7); + chThdSleepMilliseconds(10); // Wait for the release to happen + + palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B6 to I2C function + palSetPadMode(GPIOB, 7, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); // Set B7 to I2C function +} +``` + + diff --git a/drivers/arm/i2c_master.c b/drivers/arm/i2c_master.c index 2a7badd351f2..de584383922a 100644 --- a/drivers/arm/i2c_master.c +++ b/drivers/arm/i2c_master.c @@ -26,6 +26,7 @@ */ #include "i2c_master.h" +#include "quantum.h" #include #include @@ -41,9 +42,11 @@ static const I2CConfig i2cconfig = { 0 }; +__attribute__ ((weak)) void i2c_init(void) { - palSetGroupMode(GPIOB, GPIOB_PIN6 | GPIOB_PIN7, 0, PAL_MODE_INPUT); // Try releasing special pins for a short time + setPinInput(B6); // Try releasing special pins for a short time + setPinInput(B7); chThdSleepMilliseconds(10); palSetPadMode(GPIOB, 6, PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUPDR_PULLUP); From 6274980e6188c6f074e51b6655afd9efa991863e Mon Sep 17 00:00:00 2001 From: Yan-Fa Li Date: Sun, 11 Nov 2018 19:54:10 -0800 Subject: [PATCH 395/505] Improve new_project script (#4373) * Improve new_project script - use git user.name if available to replace the boilerplate name in files we generate - fix shellshock warnings * Test for git repo Suggestion by @skullydazed * Fix shellshock warning * Incorporate feedback from reviewers - thanks @vomindoraan - use a heredoc instead of echo for console - factor out common paths --- util/new_project.sh | 51 ++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/util/new_project.sh b/util/new_project.sh index a85e83322204..d1d1ed82ca38 100755 --- a/util/new_project.sh +++ b/util/new_project.sh @@ -14,7 +14,7 @@ elif [ -z "$KEYBOARD_TYPE" ]; then KEYBOARD_TYPE=avr fi -if [ $KEYBOARD_TYPE != "avr" -a $KEYBOARD_TYPE != "ps2avrgb" ]; then +if [ "$KEYBOARD_TYPE" != "avr" ] && [ "$KEYBOARD_TYPE" != "ps2avrgb" ]; then echo "Invalid keyboard type target" exit 1 fi @@ -24,22 +24,43 @@ if [ -e "keyboards/$1" ]; then exit 1 fi -cd "$(dirname "$0")/.." +cd "$(dirname "$0")/.." || exit -KEYBOARD_UPPERCASE=$(echo $1 | awk '{print toupper($0)}') -KEYBOARD_NAME=$(basename $1) -KEYBOARD_NAME_UPPERCASE=$(echo $KEYBOARD_NAME | awk '{print toupper($0)}') +KEYBOARD_NAME=$(basename "$1") +KEYBOARD_NAME_UPPERCASE=$(echo "$KEYBOARD_NAME" | awk '{print toupper($0)}') +NEW_KBD=keyboards/${KEYBOARD} -cp -r quantum/template/base keyboards/$KEYBOARD -cp -r quantum/template/$KEYBOARD_TYPE/. keyboards/$KEYBOARD +cp -r quantum/template/base "$NEW_KBD" +cp -r "quantum/template/$KEYBOARD_TYPE/." "$NEW_KBD" -mv keyboards/${KEYBOARD}/template.c keyboards/${KEYBOARD}/${KEYBOARD_NAME}.c -mv keyboards/${KEYBOARD}/template.h keyboards/${KEYBOARD}/${KEYBOARD_NAME}.h -find keyboards/${KEYBOARD} -type f -exec sed -i '' -e "s;%KEYBOARD%;${KEYBOARD_NAME};g" {} \; -find keyboards/${KEYBOARD} -type f -exec sed -i '' -e "s;%KEYBOARD_UPPERCASE%;${KEYBOARD_NAME_UPPERCASE};g" {} \; +mv "${NEW_KBD}/template.c" "${NEW_KBD}/${KEYBOARD_NAME}.c" +mv "${NEW_KBD}/template.h" "${NEW_KBD}/${KEYBOARD_NAME}.h" +find "${NEW_KBD}" -type f -exec sed -i '' -e "s;%KEYBOARD%;${KEYBOARD_NAME};g" {} \; +find "${NEW_KBD}" -type f -exec sed -i '' -e "s;%KEYBOARD_UPPERCASE%;${KEYBOARD_NAME_UPPERCASE};g" {} \; -echo "######################################################" -echo "# /keyboards/$KEYBOARD project created. To start" -echo "# working on things, cd into keyboards/$KEYBOARD" -echo "######################################################" +GIT=$(whereis git) +if [ "$GIT" != "" ]; then + IS_GIT_REPO=$($GIT log >>/dev/null 2>&1; echo $?) + if [ "$IS_GIT_REPO" -eq 0 ]; then + ID="'$($GIT config --get user.name)'" + echo "Using $ID as user name" + + for i in "$NEW_KBD/config.h" \ + "$NEW_KBD/$KEYBOARD_NAME.c" \ + "$NEW_KBD/$KEYBOARD_NAME.h" \ + "$NEW_KBD/keymaps/default/config.h" \ + "$NEW_KBD/keymaps/default/keymap.c" + do + awk -v id="$ID" '{sub(/REPLACE_WITH_YOUR_NAME/,id); print}' < "$i" > "$i.$$" + mv "$i.$$" "$i" + done + fi +fi + +cat <<-EOF +###################################################### +# $NEW_KBD project created. To start +# working on things, cd into $NEW_KBD +###################################################### +EOF From b49fd46eaaba5efe3231e6a1019af5c16558a057 Mon Sep 17 00:00:00 2001 From: Paco Date: Mon, 12 Nov 2018 14:58:07 -0500 Subject: [PATCH 396/505] Add support for slackware distribution (linux_install.sh) (#4369) * Add support for slackware distribution (linux_install.sh) The required packages are not provided by the official repository. The packages need to be installed from slackbuilds.org either manually or with the help of third party tools like sbotools. * Modify linux_install.sh according to code review Modifies the Slackware section of the linux_install.sh script based on the suggestions from the code review. * Modify utils/linux_install.sh according to suggestions --- util/linux_install.sh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/util/linux_install.sh b/util/linux_install.sh index 8dc28be6efa5..971d4c543c05 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -4,6 +4,8 @@ GENTOO_WARNING="This script will make a USE change in order to ensure that that QMK works on your system. All changes will be sent to the the file /etc/portage/package.use/qmk_firmware -- please review it, and read Portage's output carefully before installing any packages on your system. You will also need to ensure that your kernel is compiled with support for the keyboard chip that you are using (e.g. enable Arduino for the Pro Micro). Further information can be found on the Gentoo wiki." +SLACKWARE_WARNING="You will need the following packages from slackbuilds.org:\n\tarm-binutils\n\tarm-gcc\n\tavr-binutils\n\tavr-gcc\n\tavr-libc\n\tavrdude\n\tdfu-programmer\n\tdfu-util\n\tnewlib\nThese packages will be installed with sudo and sboinstall, so ensure that your user is added to sudoers and that sboinstall is configured." + if grep ID /etc/os-release | grep -qE "fedora"; then sudo dnf install \ arm-none-eabi-binutils-cs \ @@ -126,6 +128,26 @@ elif grep ID /etc/os-release | grep -qE "opensuse|tumbleweed"; then wget \ zip +elif grep ID /etc/os-release | grep -q slackware; then + printf "$SLACKWARE_WARNING\n" + printf "\nProceed (y/N)? " + read -r answer + if echo "$answer" | grep -iq "^y" ;then + sudo sboinstall \ + avr-binutils \ + avr-gcc \ + avr-libc \ + avrdude \ + dfu-programmer \ + dfu-util \ + arm-binutils \ + arm-gcc \ + newlib + echo "Done!" + else + echo "Quitting..." + fi + else echo "Sorry, we don't recognize your OS. Help us by contributing support!" echo From 746005acba3a3522eaa2bf1c8014644e1a60c5df Mon Sep 17 00:00:00 2001 From: zvecr Date: Mon, 12 Nov 2018 20:00:45 +0000 Subject: [PATCH 397/505] Keyboard: Initial 25 port (#4394) * Initial 25 port * Initial 25 port - fix info.json and hand_swap_config * Review comments - fix layout macros, copyright comments, and duplicated use of layering macros --- keyboards/40percentclub/25/25.c | 60 +++++ keyboards/40percentclub/25/25.h | 85 +++++++ keyboards/40percentclub/25/config.h | 230 ++++++++++++++++++ keyboards/40percentclub/25/info.json | 29 +++ .../40percentclub/25/keymaps/default/config.h | 19 ++ .../40percentclub/25/keymaps/default/keymap.c | 87 +++++++ .../25/keymaps/default/readme.md | 1 + .../40percentclub/25/keymaps/macro/config.h | 19 ++ .../40percentclub/25/keymaps/macro/keymap.c | 42 ++++ .../40percentclub/25/keymaps/macro/readme.md | 1 + keyboards/40percentclub/25/readme.md | 18 ++ keyboards/40percentclub/25/rules.mk | 85 +++++++ 12 files changed, 676 insertions(+) create mode 100644 keyboards/40percentclub/25/25.c create mode 100644 keyboards/40percentclub/25/25.h create mode 100644 keyboards/40percentclub/25/config.h create mode 100644 keyboards/40percentclub/25/info.json create mode 100644 keyboards/40percentclub/25/keymaps/default/config.h create mode 100644 keyboards/40percentclub/25/keymaps/default/keymap.c create mode 100644 keyboards/40percentclub/25/keymaps/default/readme.md create mode 100644 keyboards/40percentclub/25/keymaps/macro/config.h create mode 100644 keyboards/40percentclub/25/keymaps/macro/keymap.c create mode 100644 keyboards/40percentclub/25/keymaps/macro/readme.md create mode 100644 keyboards/40percentclub/25/readme.md create mode 100644 keyboards/40percentclub/25/rules.mk diff --git a/keyboards/40percentclub/25/25.c b/keyboards/40percentclub/25/25.c new file mode 100644 index 000000000000..54a42d263c80 --- /dev/null +++ b/keyboards/40percentclub/25/25.c @@ -0,0 +1,60 @@ +/* Copyright 2018 + * + * 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 "25.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); +} + +#ifdef SWAP_HANDS_ENABLE +__attribute__ ((weak)) +const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { + {{4, 5}, {3, 5}, {2, 5}, {1, 5}, {0, 5}}, + {{4, 6}, {3, 6}, {2, 6}, {1, 6}, {0, 6}}, + {{4, 7}, {3, 7}, {2, 7}, {1, 7}, {0, 7}}, + {{4, 8}, {3, 8}, {2, 8}, {1, 8}, {0, 8}}, + {{4, 9}, {3, 9}, {2, 9}, {1, 9}, {0, 9}}, + + {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}}, + {{0, 1}, {1, 1}, {2, 1}, {3, 1}, {4, 1}}, + {{0, 2}, {1, 2}, {2, 2}, {3, 2}, {4, 2}}, + {{0, 3}, {1, 3}, {2, 3}, {3, 3}, {4, 3}}, + {{0, 4}, {1, 4}, {2, 4}, {3, 4}, {4, 4}}, +}; +#endif diff --git a/keyboards/40percentclub/25/25.h b/keyboards/40percentclub/25/25.h new file mode 100644 index 000000000000..db9c48b524a4 --- /dev/null +++ b/keyboards/40percentclub/25/25.h @@ -0,0 +1,85 @@ +/* Copyright 2018 + * + * 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 + +#include "quantum.h" +#define ___ KC_NO + +#ifndef FLIP_HALF +#define LAYOUT_ortho_5x10( \ + L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \ + L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \ + L20, L21, L22, L23, L24, R20, R21, R22, R23, R24, \ + L30, L31, L32, L33, L34, R30, R31, R32, R33, R34, \ + L40, L41, L42, L43, L44, R40, R41, R42, R43, R44 \ +) { \ + { L00, L01, L02, L03, L04 }, \ + { L10, L11, L12, L13, L14 }, \ + { L20, L21, L22, L23, L24 }, \ + { L30, L31, L32, L33, L34 }, \ + { L40, L41, L42, L43, L44 }, \ + { R04, R03, R02, R01, R00 }, \ + { R14, R13, R12, R11, R10 }, \ + { R24, R23, R22, R21, R20 }, \ + { R34, R33, R32, R31, R30 }, \ + { R44, R43, R42, R41, R40 } \ +} +#else +#define LAYOUT_ortho_5x10( \ + L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \ + L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \ + L20, L21, L22, L23, L24, R20, R21, R22, R23, R24, \ + L30, L31, L32, L33, L34, R30, R31, R32, R33, R34, \ + L40, L41, L42, L43, L44, R40, R41, R42, R43, R44 \ +) { \ + { L00, L01, L02, L03, L04 }, \ + { L10, L11, L12, L13, L14 }, \ + { L20, L21, L22, L23, L24 }, \ + { L30, L31, L32, L33, L34 }, \ + { L40, L41, L42, L43, L44 }, \ + { R00, R01, R02, R03, R04 }, \ + { R10, R11, R12, R13, R14 }, \ + { R20, R21, R22, R23, R24 }, \ + { R30, R31, R32, R33, R34 }, \ + { R40, R41, R42, R43, R44 } \ +} +#endif + +#define LAYOUT_ortho_5x5( \ + L00, L01, L02, L03, L04, \ + L10, L11, L12, L13, L14, \ + L20, L21, L22, L23, L24, \ + L30, L31, L32, L33, L34, \ + L40, L41, L42, L43, L44 \ +) { \ + { L00, L01, L02, L03, L04 }, \ + { L10, L11, L12, L13, L14 }, \ + { L20, L21, L22, L23, L24 }, \ + { L30, L31, L32, L33, L34 }, \ + { L40, L41, L42, L43, L44 }, \ + { ___, ___, ___, ___, ___ }, \ + { ___, ___, ___, ___, ___ }, \ + { ___, ___, ___, ___, ___ }, \ + { ___, ___, ___, ___, ___ }, \ + { ___, ___, ___, ___, ___ } \ +} + +#define LAYOUT_macro LAYOUT_ortho_5x5 +#define LAYOUT_split LAYOUT_ortho_5x10 + +#ifdef USE_I2C + #error "I2C not Supported" +#endif diff --git a/keyboards/40percentclub/25/config.h b/keyboards/40percentclub/25/config.h new file mode 100644 index 000000000000..23b768e153d4 --- /dev/null +++ b/keyboards/40percentclub/25/config.h @@ -0,0 +1,230 @@ +/* Copyright 2018 + * + * 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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0A0C +#define DEVICE_VER 0x0F25 +#define MANUFACTURER di0ib +#define PRODUCT The 5x5 Keyboard +#define DESCRIPTION A split 50 key keyboard + +#define USE_SERIAL + +/* Select hand configuration */ +#define MASTER_LEFT +//#define MASTER_RIGHT +//#define EE_HANDS + +/* key matrix size */ +// Rows are doubled-up +#define MATRIX_ROWS 5*2 +#define MATRIX_COLS 5 + +/* + * 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 { D4, C6, D7, E6, B4 } +#define MATRIX_COL_PINS { F4, F5, F6, F7, B1 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN B7 +// #define BACKLIGHT_BREATHING +// #define BACKLIGHT_LEVELS 3 + +// #define RGB_DI_PIN E2 +// #ifdef RGB_DI_PIN +// #define RGBLIGHT_ANIMATIONS +// #define RGBLED_NUM 16 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 +// #endif + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ diff --git a/keyboards/40percentclub/25/info.json b/keyboards/40percentclub/25/info.json new file mode 100644 index 000000000000..abb77a0677c5 --- /dev/null +++ b/keyboards/40percentclub/25/info.json @@ -0,0 +1,29 @@ +{ + "keyboard_name": "foobar", + "url": "", + "maintainer": "qmk", + "width": 6, + "height": 2, + "layouts": { + "LAYOUT_macro": { + "key_count": 15, + "layout": [ + {"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, + {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, + {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, + {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, + {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4} + ] + }, + "LAYOUT_split": { + "key_count": 30, + "layout": [ + {"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, + {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, + {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, + {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":6, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}, + {"x":0, "y":4}, {"x":1, "y":4}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":4, "y":4}, {"x":5, "y":4}, {"x":6, "y":4}, {"x":7, "y":4}, {"x":8, "y":4}, {"x":9, "y":4} + ] + } + } +} diff --git a/keyboards/40percentclub/25/keymaps/default/config.h b/keyboards/40percentclub/25/keymaps/default/config.h new file mode 100644 index 000000000000..6173b63272f6 --- /dev/null +++ b/keyboards/40percentclub/25/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 + * + * 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 + +// place overrides here diff --git a/keyboards/40percentclub/25/keymaps/default/keymap.c b/keyboards/40percentclub/25/keymaps/default/keymap.c new file mode 100644 index 000000000000..ccb54c82a1ae --- /dev/null +++ b/keyboards/40percentclub/25/keymaps/default/keymap.c @@ -0,0 +1,87 @@ +/* Copyright 2018 + * + * 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 QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _QWERTY 0 +#define _LOWER 1 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + LOWER, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* Qwerty + * ,---------------------------------------------------------------------. + * | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | + * |------+------+------+------+------+------+------+------+------+------| + * | Q | W | E | R | T | Y | U | I | O | P | + * |------+------+------+------+-------------+------+------+------+------| + * | A | S | D | F | G | H | J | K | L | Bksp | + * |------+------+------+------+------|------+------+------+------+------| + * | Z | X | C | V | B | N | M | , | . |Enter | + * |------+------+------+------+------+------+------+------+------+------| + * | Ctrl | GUI | Alt |Lower |Space | Shift| Left | Down | Up |Right | + * `---------------------------------------------------------------------' + */ + [_QWERTY] = LAYOUT_split( + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \ + 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_BSPC, \ + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_ENT, \ + KC_LCTL, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_LSFT, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \ + ), + + /* Lower + * ,---------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | ` | / | _ | + | + * |------+------+------+------+------|------+------+------+------+------| + * | F7 | F8 | F9 | F10 | F11 | F12 | ~ | [ | ] | \ | + * |------+------+------+------+-------------+------+------+------+------| + * | Esc | | | | | | | ; | " | Del | + * |------+------+------+------+------|------+------+------+------+------| + * | Tab | | | | | | | | | | + * |------+------+------+------+------+------+------+------+------+------| + * | | | | | | | Home | PgDn | PgUp | End | + * `---------------------------------------------------------------------' + */ + [_LOWER] = LAYOUT_split( \ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_GRV, KC_SLSH, KC_UNDS, KC_PLUS, \ + KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TILD, KC_LBRC, KC_RBRC, KC_PIPE, \ + KC_ESC, _______, _______, _______, _______, _______, _______, KC_SCLN, KC_QUOT, KC_DEL, \ + KC_TAB, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/40percentclub/25/keymaps/default/readme.md b/keyboards/40percentclub/25/keymaps/default/readme.md new file mode 100644 index 000000000000..7558c42ec509 --- /dev/null +++ b/keyboards/40percentclub/25/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default split keymap for 25 diff --git a/keyboards/40percentclub/25/keymaps/macro/config.h b/keyboards/40percentclub/25/keymaps/macro/config.h new file mode 100644 index 000000000000..6173b63272f6 --- /dev/null +++ b/keyboards/40percentclub/25/keymaps/macro/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 + * + * 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 + +// place overrides here diff --git a/keyboards/40percentclub/25/keymaps/macro/keymap.c b/keyboards/40percentclub/25/keymaps/macro/keymap.c new file mode 100644 index 000000000000..80d227710b88 --- /dev/null +++ b/keyboards/40percentclub/25/keymaps/macro/keymap.c @@ -0,0 +1,42 @@ +/* Copyright 2018 + * + * 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 QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_macro( + KC_ESC, KC_1, KC_2, KC_3, KC_4, \ + KC_GRV, KC_Q, KC_W, KC_E, KC_R, \ + KC_TAB, KC_A, KC_S, KC_D, KC_F, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/40percentclub/25/keymaps/macro/readme.md b/keyboards/40percentclub/25/keymaps/macro/readme.md new file mode 100644 index 000000000000..6645f93dd88d --- /dev/null +++ b/keyboards/40percentclub/25/keymaps/macro/readme.md @@ -0,0 +1 @@ +# The default macro keymap for 25 diff --git a/keyboards/40percentclub/25/readme.md b/keyboards/40percentclub/25/readme.md new file mode 100644 index 000000000000..b1685b618dd0 --- /dev/null +++ b/keyboards/40percentclub/25/readme.md @@ -0,0 +1,18 @@ +# 25 + +![25](https://2.bp.blogspot.com/-lBK_ZlB3a9Q/WcAM0B_vwdI/AAAAAAACDgs/qnI9YB53pzck4Bw0v5QRvypDMs80CxWVQCLcBGAs/s640/IMG_0695.JPG) +=== + +Split 50 key keyboard - it is the largest keybad that fits within the 100mm x 100mm PCB size. Can be used together as a split keyboard or as a single 25 key macropad. + +* [The original TMK firmware](https://github.com/di0ib/tmk_keyboard/tree/master/keyboard/25) + +Keyboard Maintainer: QMK Community +Hardware Supported: 25 PCB +Hardware Availability: [25 project on 40% Keyboards](http://www.40percent.club/2017/09/25.html) + +Make example for this keyboard (after setting up your build environment): + + make 40percentclub/25:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/40percentclub/25/rules.mk b/keyboards/40percentclub/25/rules.mk new file mode 100644 index 000000000000..bfcdce7c995b --- /dev/null +++ b/keyboards/40percentclub/25/rules.mk @@ -0,0 +1,85 @@ +# 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 + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = lite # 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 +# 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 = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +# Enable generic behavior for split boards +SPLIT_KEYBOARD = yes + +LAYOUTS = ortho_5x5 ortho_5x10 From b173c05cc25e9394c6e50081c1af707443950104 Mon Sep 17 00:00:00 2001 From: zvecr Date: Mon, 12 Nov 2018 20:02:28 +0000 Subject: [PATCH 398/505] Tidy 40percentclub boards (#4403) * Remove unnecessary re-definitions for XXXXXXX and _______ * Update 6lit to use KC_NO in layout macros * Update rules.mk to follow current template * Remove use of deprecated function action_get_macro - unused and contents were from old template * Remove use of deprecated function action_get_macro - all code was commented out * Remove use of deprecated function action_get_macro - convert macro to use process_record_user * Convert keymap to consistent use of _______ * fix use of old style header guards * Swap KC_NO for XXXXXXX macro since the swap to the macro for KC_TRANS * Resolve use of ?= in rules.mk files * Remove duplication of rules.mk and config.h in gherkin mjt keymap * Remove unnecessary #includes * Align layout macros so foobar can use gherkin keymaps * Align 6lit layout macros with foobar * Remove ifndef QUANTUM_DIR from keymaps --- keyboards/40percentclub/4x4/4x4.h | 6 +- .../4x4/keymaps/default/keymap.c | 22 +-- keyboards/40percentclub/4x4/rules.mk | 32 ++-- keyboards/40percentclub/5x5/5x5.h | 6 +- .../5x5/keymaps/default/keymap.c | 24 +-- keyboards/40percentclub/5x5/rules.mk | 33 ++-- keyboards/40percentclub/6lit/6lit.h | 13 +- keyboards/40percentclub/foobar/foobar.h | 9 +- .../foobar/keymaps/default/keymap.c | 1 - keyboards/40percentclub/foobar/rules.mk | 2 + keyboards/40percentclub/gherkin/config.h | 5 +- keyboards/40percentclub/gherkin/gherkin.h | 5 +- .../gherkin/keymaps/bbaserdem/config.h | 6 +- .../gherkin/keymaps/bbaserdem/rules.mk | 4 - .../gherkin/keymaps/default/keymap.c | 11 -- .../gherkin/keymaps/itsaferbie/config.h | 7 +- .../gherkin/keymaps/itsaferbie/keymap.c | 31 ++-- .../gherkin/keymaps/itsaferbie/rules.mk | 4 - .../gherkin/keymaps/mjt/config.h | 168 +----------------- .../gherkin/keymaps/mjt/keymap.c | 29 --- .../gherkin/keymaps/mjt/rules.mk | 31 +--- .../gherkin/keymaps/steno/config.h | 7 +- .../gherkin/keymaps/steno/rules.mk | 8 +- .../gherkin/keymaps/talljoe-gherkin/config.h | 7 +- .../gherkin/keymaps/talljoe-gherkin/keymap.c | 2 - .../gherkin/keymaps/talljoe-gherkin/rules.mk | 4 - keyboards/40percentclub/gherkin/rules.mk | 39 ++-- keyboards/40percentclub/luddite/rules.mk | 39 ++-- keyboards/40percentclub/mf68/config.h | 5 +- .../mf68/keymaps/default/keymap.c | 15 -- .../mf68/keymaps/factory/keymap.c | 15 -- keyboards/40percentclub/mf68/mf68.h | 5 +- keyboards/40percentclub/mf68/rules.mk | 54 +++--- keyboards/40percentclub/mf68_ble/config.h | 5 +- .../mf68_ble/keymaps/default/keymap.c | 15 -- keyboards/40percentclub/mf68_ble/mf68_ble.h | 5 +- keyboards/40percentclub/mf68_ble/rules.mk | 54 +++--- keyboards/40percentclub/nano/config.h | 5 +- .../nano/keymaps/default/keymap.c | 1 - .../nano/keymaps/spooka/keymap.c | 2 - keyboards/40percentclub/nano/nano.h | 5 +- keyboards/40percentclub/nano/rules.mk | 34 ++-- keyboards/40percentclub/tomato/config.h | 5 +- .../tomato/keymaps/default/keymap.c | 39 ++-- keyboards/40percentclub/tomato/rules.mk | 32 +++- keyboards/40percentclub/tomato/tomato.h | 5 +- keyboards/40percentclub/ut47/config.h | 5 +- .../ut47/keymaps/default/config.h | 5 +- .../ut47/keymaps/default/keymap.c | 1 - .../ut47/keymaps/non-us/config.h | 5 +- .../ut47/keymaps/non-us/keymap.c | 1 - .../ut47/keymaps/nordic/keymap.c | 1 - .../40percentclub/ut47/keymaps/rgb/config.h | 5 +- .../40percentclub/ut47/keymaps/rgb/keymap.c | 1 - keyboards/40percentclub/ut47/rules.mk | 31 +++- keyboards/40percentclub/ut47/ut47.h | 5 +- 56 files changed, 299 insertions(+), 617 deletions(-) diff --git a/keyboards/40percentclub/4x4/4x4.h b/keyboards/40percentclub/4x4/4x4.h index ec75c3e28096..8cc5a150aaa3 100644 --- a/keyboards/40percentclub/4x4/4x4.h +++ b/keyboards/40percentclub/4x4/4x4.h @@ -1,6 +1,4 @@ - -#ifndef FOURX4_H -#define FOURX4_H +#pragma once #include "quantum.h" #define ___ KC_NO @@ -58,5 +56,3 @@ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, K2c, K2d, K2e, K2f }, \ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, K3d, K3e, K3f } \ } - -#endif diff --git a/keyboards/40percentclub/4x4/keymaps/default/keymap.c b/keyboards/40percentclub/4x4/keymaps/default/keymap.c index 144ec05c17fb..1f52b20667ad 100644 --- a/keyboards/40percentclub/4x4/keymaps/default/keymap.c +++ b/keyboards/40percentclub/4x4/keymaps/default/keymap.c @@ -6,9 +6,6 @@ #define NUM 2 #define DIR 3 -// Readability keycodes -#define _______ KC_TRNS - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Single 4x4 board only @@ -65,7 +62,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [NUM] = LAYOUT_ortho_4x16( _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, _______, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, _______, _______, KC_PPLS, _______, - _______, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_ENT, KC_RSFT, KC_RGUI, ALT_T(KC_DOT), CTL_T(KC_BSPC), _______, _______, _______, KC_PENT, _______, + _______, KC_F11, KC_F12, _______, _______, _______, KC_ENT, KC_RSFT, KC_RGUI, ALT_T(KC_DOT), CTL_T(KC_BSPC), _______, _______, _______, KC_PENT, _______, _______, _______, _______, _______, _______, _______, KC_ENT, KC_RSFT, _______, _______, _______, _______, _______, _______, _______, _______ ), @@ -90,23 +87,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; - -const uint16_t PROGMEM fn_actions[] = { - -}; - - -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - keyevent_t event = record->event; - (void)event; - - switch (id) { - - } - return MACRO_NONE; -} - - void matrix_init_user(void) { } diff --git a/keyboards/40percentclub/4x4/rules.mk b/keyboards/40percentclub/4x4/rules.mk index d572e7244440..a513357988e2 100644 --- a/keyboards/40percentclub/4x4/rules.mk +++ b/keyboards/40percentclub/4x4/rules.mk @@ -36,24 +36,30 @@ 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 -# Bootloader -# This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded -# automatically (+60). See bootloader.mk for all options. +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID BOOTLOADER = caterina + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +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) @@ -68,7 +74,7 @@ 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 -HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) #FIXME: Community keymap build are currently failing due to missing functionality #LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12 ortho_4x16 diff --git a/keyboards/40percentclub/5x5/5x5.h b/keyboards/40percentclub/5x5/5x5.h index 45fb80a4f757..182e9e8190d3 100644 --- a/keyboards/40percentclub/5x5/5x5.h +++ b/keyboards/40percentclub/5x5/5x5.h @@ -1,6 +1,4 @@ - -#ifndef FIVEX5_H -#define FIVEX5_H +#pragma once #include "quantum.h" #define ___ KC_NO @@ -53,5 +51,3 @@ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, K3d, K3e}, \ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4a, K4b, K4c, K4d, K4e} \ } - -#endif diff --git a/keyboards/40percentclub/5x5/keymaps/default/keymap.c b/keyboards/40percentclub/5x5/keymaps/default/keymap.c index a2c525d089ca..56ddbb23f5bb 100644 --- a/keyboards/40percentclub/5x5/keymaps/default/keymap.c +++ b/keyboards/40percentclub/5x5/keymaps/default/keymap.c @@ -6,9 +6,6 @@ #define NUM 2 #define DIR 3 -// Readability keycodes -#define _______ KC_TRNS - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Single 5x5 board only @@ -74,7 +71,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_NLCK, KC_PSLS, KC_PAST, KC_PMNS, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, _______, _______, KC_PPLS, - _______, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_ENT, KC_RSFT, KC_RGUI, ALT_T(KC_DOT), CTL_T(KC_BSPC), _______, _______, _______, KC_PENT, + _______, KC_F11, KC_F12, _______, _______, _______, KC_ENT, KC_RSFT, KC_RGUI, ALT_T(KC_DOT), CTL_T(KC_BSPC), _______, _______, _______, KC_PENT, _______, _______, _______, _______, _______, _______, KC_ENT, KC_RSFT, _______, _______, _______, _______, _______, _______, _______ ), @@ -102,25 +99,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -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) { diff --git a/keyboards/40percentclub/5x5/rules.mk b/keyboards/40percentclub/5x5/rules.mk index abc961a86fe0..ae041412698d 100644 --- a/keyboards/40percentclub/5x5/rules.mk +++ b/keyboards/40percentclub/5x5/rules.mk @@ -36,24 +36,31 @@ 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 -# Bootloader -# This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded -# automatically (+60). See bootloader.mk for all options. +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID BOOTLOADER = caterina + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +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) @@ -68,7 +75,7 @@ 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 -HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) #FIXME: Community keymap build are currently failing due to missing functionality #LAYOUTS = ortho_5x5 ortho_5x10 ortho_5x15 diff --git a/keyboards/40percentclub/6lit/6lit.h b/keyboards/40percentclub/6lit/6lit.h index ae0beea35d0e..af01d44c2a11 100644 --- a/keyboards/40percentclub/6lit/6lit.h +++ b/keyboards/40percentclub/6lit/6lit.h @@ -16,10 +16,10 @@ #pragma once #include "quantum.h" -#define ________ KC_NO +#define ___ KC_NO #ifndef FLIP_HALF -#define LAYOUT_split( \ +#define LAYOUT_ortho_2x6( \ L00, L01, L02, R00, R01, R02, \ L10, L11, L12, R10, R11, R12 \ ) { \ @@ -29,7 +29,7 @@ { R12, R11, R10 }, \ } #else -#define LAYOUT_split( \ +#define LAYOUT_ortho_2x6( \ L00, L01, L02, R00, R01, R02, \ L10, L11, L12, R10, R11, R12 \ ) { \ @@ -40,15 +40,18 @@ } #endif -#define LAYOUT_macro( \ +#define LAYOUT_ortho_2x3( \ L00, L01, L02, \ L10, L11, L12 \ ) { \ { L00, L01, L02 }, \ { L10, L11, L12 }, \ + { ___, ___, ___ }, \ + { ___, ___, ___ }, \ } -#define LAYOUT LAYOUT_macro +#define LAYOUT_macro LAYOUT_ortho_2x3 +#define LAYOUT_split LAYOUT_ortho_2x6 #ifdef USE_I2C #error "I2C not Supported" diff --git a/keyboards/40percentclub/foobar/foobar.h b/keyboards/40percentclub/foobar/foobar.h index fc49c72aaf2a..8cf2e384ffdd 100644 --- a/keyboards/40percentclub/foobar/foobar.h +++ b/keyboards/40percentclub/foobar/foobar.h @@ -19,7 +19,7 @@ #define ___ KC_NO #ifndef FLIP_HALF -#define LAYOUT_split( \ +#define LAYOUT_ortho_3x10( \ L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \ L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \ L20, L21, L22, L23, L24, R20, R21, R22, R23, R24 \ @@ -32,7 +32,7 @@ { R24, R23, R22, R21, R20 } \ } #else -#define LAYOUT_split( \ +#define LAYOUT_ortho_3x10( \ L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \ L10, L11, L12, L13, L14, R10, R11, R12, R13, R14, \ L20, L21, L22, L23, L24, R20, R21, R22, R23, R24 \ @@ -46,7 +46,7 @@ } #endif -#define LAYOUT_macro( \ +#define LAYOUT_ortho_3x5( \ L00, L01, L02, L03, L04, \ L10, L11, L12, L13, L14, \ L20, L21, L22, L23, L24 \ @@ -59,7 +59,8 @@ { ___, ___, ___, ___, ___ } \ } -#define LAYOUT LAYOUT_macro +#define LAYOUT_macro LAYOUT_ortho_3x5 +#define LAYOUT_split LAYOUT_ortho_3x10 #ifdef USE_I2C #error "I2C not Supported" diff --git a/keyboards/40percentclub/foobar/keymaps/default/keymap.c b/keyboards/40percentclub/foobar/keymaps/default/keymap.c index b750c6185145..774f1e854266 100644 --- a/keyboards/40percentclub/foobar/keymaps/default/keymap.c +++ b/keyboards/40percentclub/foobar/keymaps/default/keymap.c @@ -15,7 +15,6 @@ */ #include QMK_KEYBOARD_H -#define _______ KC_TRNS #define FN1_Q LT(1, KC_Q) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { diff --git a/keyboards/40percentclub/foobar/rules.mk b/keyboards/40percentclub/foobar/rules.mk index 3275651650c3..155a7daacb34 100644 --- a/keyboards/40percentclub/foobar/rules.mk +++ b/keyboards/40percentclub/foobar/rules.mk @@ -81,3 +81,5 @@ HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) # Enable generic behavior for split boards SPLIT_KEYBOARD = yes + +LAYOUTS = ortho_3x10 diff --git a/keyboards/40percentclub/gherkin/config.h b/keyboards/40percentclub/gherkin/config.h index 34f38e35c29f..3ed638b66f75 100644 --- a/keyboards/40percentclub/gherkin/config.h +++ b/keyboards/40percentclub/gherkin/config.h @@ -1,5 +1,4 @@ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" @@ -50,5 +49,3 @@ #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 #endif - -#endif diff --git a/keyboards/40percentclub/gherkin/gherkin.h b/keyboards/40percentclub/gherkin/gherkin.h index f8674be40ed6..70bffee302ae 100644 --- a/keyboards/40percentclub/gherkin/gherkin.h +++ b/keyboards/40percentclub/gherkin/gherkin.h @@ -1,5 +1,4 @@ -#ifndef GHERKIN_H -#define GHERKIN_H +#pragma once #include "quantum.h" @@ -14,5 +13,3 @@ { K30, K31, K32, K33, K34, K35 }, \ { K40, K41, K42, K43, K44, K45 } \ } - -#endif diff --git a/keyboards/40percentclub/gherkin/keymaps/bbaserdem/config.h b/keyboards/40percentclub/gherkin/keymaps/bbaserdem/config.h index 37d7113e78bd..5c9ca52d7509 100644 --- a/keyboards/40percentclub/gherkin/keymaps/bbaserdem/config.h +++ b/keyboards/40percentclub/gherkin/keymaps/bbaserdem/config.h @@ -1,7 +1,5 @@ -#ifndef CONFIG_KEYMAP_H -#define CONFIG_KEYMAP_H +#pragma once -#include "../../config.h" #define RGB_DI_PIN F6 #define RGBLED_NUM 10 #define RGBLIGHT_ANIMATIONS @@ -9,5 +7,3 @@ #undef BACKLIGHT_LEVELS #endif #define BACKLIGHT_LEVELS 3 - -#endif diff --git a/keyboards/40percentclub/gherkin/keymaps/bbaserdem/rules.mk b/keyboards/40percentclub/gherkin/keymaps/bbaserdem/rules.mk index cd1cddebf42f..07a20a421722 100644 --- a/keyboards/40percentclub/gherkin/keymaps/bbaserdem/rules.mk +++ b/keyboards/40percentclub/gherkin/keymaps/bbaserdem/rules.mk @@ -1,7 +1,3 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - USER_NAME := bbaserdem-nouserspace STENO_ENABLE = no # Additional protocols for Stenography(+1700), requires VIRTSER diff --git a/keyboards/40percentclub/gherkin/keymaps/default/keymap.c b/keyboards/40percentclub/gherkin/keymaps/default/keymap.c index f018200304e8..ae6f15862718 100644 --- a/keyboards/40percentclub/gherkin/keymaps/default/keymap.c +++ b/keyboards/40percentclub/gherkin/keymaps/default/keymap.c @@ -1,6 +1,5 @@ #include QMK_KEYBOARD_H -#define _______ KC_TRNS #define FN1_Q LT(1, KC_Q) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -19,16 +18,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) { - keyevent_t event = record->event; - (void)event; - - switch (id) { - - } - return MACRO_NONE; -} - void matrix_init_user(void) { } diff --git a/keyboards/40percentclub/gherkin/keymaps/itsaferbie/config.h b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/config.h index 71c0cb8b5680..6849bbdd2c99 100644 --- a/keyboards/40percentclub/gherkin/keymaps/itsaferbie/config.h +++ b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/config.h @@ -1,7 +1,4 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" +#pragma once #undef RGB_DI_PIN #undef RGBLED_NUM @@ -11,5 +8,3 @@ #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 - -#endif \ No newline at end of file diff --git a/keyboards/40percentclub/gherkin/keymaps/itsaferbie/keymap.c b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/keymap.c index 580b041c9cbf..950b6e86b90b 100644 --- a/keyboards/40percentclub/gherkin/keymaps/itsaferbie/keymap.c +++ b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/keymap.c @@ -12,10 +12,9 @@ enum custom_keycodes { PS = SAFE_RANGE, AI, PR, + MACRO_0, }; -#define _______ KC_TRNS - #define PS TO(0) #define AI TO(1) #define PR TO(2) @@ -72,7 +71,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Illustrator layer [_AI] = LAYOUT_ortho_3x10( - _______, M(0), RULER, _______, KC_G, _______, _______, KC_Q, KC_MINS, KC_PLUS, + _______, MACRO_0, RULER, _______, KC_G, _______, _______, KC_Q, KC_MINS, KC_PLUS, _______, _______, _______, KC_E, _______, _______, _______, SHAPE, KC_O, OPEN, _______, _______, _______, _______, _______, _______, _______, KC_M, KC_SLSH, PR ), @@ -133,20 +132,14 @@ void matrix_scan_user(void) { #endif } -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - keyevent_t event = record->event; - (void)event; - - switch (id) { - case 0: - // Save for Web Macro. - return MACRO(D(LSFT), D(LALT), D(LCTL), T(S), U(LCTL), U(LALT), U(LSFT), END); - } - return MACRO_NONE; -} - bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - } - return true; -} + if (record->event.pressed) { + switch(keycode) { + case MACRO_0: + // Save for Web Macro. + SEND_STRING(SS_LSFT(SS_LALT(SS_LCTRL("s")))); + return false; + } + } + return true; +}; diff --git a/keyboards/40percentclub/gherkin/keymaps/itsaferbie/rules.mk b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/rules.mk index ed0af7b8bd7a..b359ca2874cc 100644 --- a/keyboards/40percentclub/gherkin/keymaps/itsaferbie/rules.mk +++ b/keyboards/40percentclub/gherkin/keymaps/itsaferbie/rules.mk @@ -1,7 +1,3 @@ BACKLIGHT_ENABLE = yes AUDIO_ENABLE = no RGBLIGHT_ENABLE = yes - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif \ No newline at end of file diff --git a/keyboards/40percentclub/gherkin/keymaps/mjt/config.h b/keyboards/40percentclub/gherkin/keymaps/mjt/config.h index bb59ec213d5f..9fe94bcd21e5 100644 --- a/keyboards/40percentclub/gherkin/keymaps/mjt/config.h +++ b/keyboards/40percentclub/gherkin/keymaps/mjt/config.h @@ -1,169 +1,7 @@ -/* -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" +#pragma once /* USB Device descriptor parameter */ -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x6060 -#define DEVICE_VER 0x0001 +#undef MANUFACTURER +#undef DESCRIPTION #define MANUFACTURER Some Guy -#define PRODUCT Gherkin #define DESCRIPTION 30 percent disaster - -/* key matrix size */ -#define MATRIX_ROWS 5 -#define MATRIX_COLS 6 - -/* - * 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) - * -*/ - -// These are with USB on the left. -// #define MATRIX_ROW_PINS { B6, B2, B3, B1, F7 } -// original from TMK: #define MATRIX_COL_PINS { D0, D4, C6, D7, E6, B4 } -// #define MATRIX_COL_PINS { D0, D4, F6, D7, E6, B4 } - -// these are with USB on the right. -#define MATRIX_ROW_PINS { F7, B1, B3, B2, B6 } -#define MATRIX_COL_PINS { B4, E6, D7, F6, D4, D0 } - -#define UNUSED_PINS - -/* COL2ROW or ROW2COL */ -#define DIODE_DIRECTION COL2ROW - -/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ -#define DEBOUNCING_DELAY 5 - -/* define if matrix has ghost (lacks anti-ghosting diodes) */ -//#define MATRIX_HAS_GHOST - -/* number of backlight levels */ -#define BACKLIGHT_LEVELS 3 -#define BACKLIGHT_PIN B5 - -/* 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 - -#define AUDIO_VOICES - -/* - * 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/40percentclub/gherkin/keymaps/mjt/keymap.c b/keyboards/40percentclub/gherkin/keymaps/mjt/keymap.c index 2b4369c34f86..2fd4c2a461ec 100644 --- a/keyboards/40percentclub/gherkin/keymaps/mjt/keymap.c +++ b/keyboards/40percentclub/gherkin/keymaps/mjt/keymap.c @@ -12,7 +12,6 @@ enum { TD_C_LALT = 2, TD_A_TAB = 3, TD_Q_ESC = 4, -// M(0) }; //Friendly Layer Names @@ -37,10 +36,6 @@ enum gherkin_keycodes { EXT_PLV }; -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_QWERTY] = LAYOUT_ortho_3x10( TD(TD_Q_ESC), KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, @@ -171,30 +166,6 @@ 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) { - keyevent_t event = record->event; - - switch (id) { - case 0: { - if (record->event.pressed) { - key_timer = timer_read(); // if the key is being pressed, we start the timer. - } - else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down"). - if (timer_elapsed(key_timer) > 150) { // 150 being 150ms, the threshhold we pick for counting something as a tap. - return MACRO( D(LSFT), END ); - } - else { - return MACRO( T(N), END ); - } - } - break; - } - } - return MACRO_NONE; -}*/ - void matrix_init_user(void) { #ifdef AUDIO_ENABLE startup_user(); diff --git a/keyboards/40percentclub/gherkin/keymaps/mjt/rules.mk b/keyboards/40percentclub/gherkin/keymaps/mjt/rules.mk index afb93b674c1b..3a35ae3b302f 100644 --- a/keyboards/40percentclub/gherkin/keymaps/mjt/rules.mk +++ b/keyboards/40percentclub/gherkin/keymaps/mjt/rules.mk @@ -1,29 +1,2 @@ -## not sure where this stuff goes ## -MCU = atmega32u4 -F_CPU = 16000000 -ARCH = AVR8 -F_USB = $(F_CPU) -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 = 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 = 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. -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -TAP_DANCE_ENABLE=yes - -ifndef QUANTUM_DIR - include ../../../../Makefile -endif +AUDIO_ENABLE = yes # Audio output on port C6 +TAP_DANCE_ENABLE = yes diff --git a/keyboards/40percentclub/gherkin/keymaps/steno/config.h b/keyboards/40percentclub/gherkin/keymaps/steno/config.h index abacefa01d21..20a8f7844a96 100644 --- a/keyboards/40percentclub/gherkin/keymaps/steno/config.h +++ b/keyboards/40percentclub/gherkin/keymaps/steno/config.h @@ -1,12 +1,7 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H - -#include "../../config.h" +#pragma once #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 diff --git a/keyboards/40percentclub/gherkin/keymaps/steno/rules.mk b/keyboards/40percentclub/gherkin/keymaps/steno/rules.mk index fa813f2099f9..a6e76f7cf942 100644 --- a/keyboards/40percentclub/gherkin/keymaps/steno/rules.mk +++ b/keyboards/40percentclub/gherkin/keymaps/steno/rules.mk @@ -1,8 +1,4 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - -STENO_ENABLE = yes # Additional protocols for Stenography(+1700), requires VIRTSER +STENO_ENABLE = yes # Additional protocols for Stenography(+1700), requires VIRTSER BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = no # Mouse keys(+4700) @@ -13,4 +9,4 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend NKRO_ENABLE = no # USB 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 AUDIO_ENABLE = no -RGBLIGHT_ENABLE = no \ No newline at end of file +RGBLIGHT_ENABLE = no diff --git a/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/config.h b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/config.h index 7fa3bf328ec9..271f48d0011b 100644 --- a/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/config.h +++ b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/config.h @@ -1,6 +1,3 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once -#include "../../config.h" - -#endif +// place overrides here diff --git a/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/keymap.c b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/keymap.c index ea2921924e78..ca3da579a132 100644 --- a/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/keymap.c +++ b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/keymap.c @@ -4,8 +4,6 @@ #define ST_BOLT QK_STENO_BOLT #define ST_GEM QK_STENO_GEMINI -#define XXXXXXX KC_NO - enum keyboard_layers { _QWERTY, _RAISE, diff --git a/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/rules.mk b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/rules.mk index 02216ecb36e2..a64c606ae754 100644 --- a/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/rules.mk +++ b/keyboards/40percentclub/gherkin/keymaps/talljoe-gherkin/rules.mk @@ -1,6 +1,2 @@ -ifndef QUANTUM_DIR - include ../../../../Makefile -endif - MOUSEKEY_ENABLE = no # Mouse keys(+4700) STENO_ENABLE = yes # Additional protocols for Stenography(+1700), requires VIRTSER diff --git a/keyboards/40percentclub/gherkin/rules.mk b/keyboards/40percentclub/gherkin/rules.mk index 416ca5e5f4a8..1e0b346417f1 100644 --- a/keyboards/40percentclub/gherkin/rules.mk +++ b/keyboards/40percentclub/gherkin/rules.mk @@ -33,25 +33,40 @@ ARCH = AVR8 # CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. F_USB = $(F_CPU) -# Bootloader -# This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded -# automatically (+60). See bootloader.mk for all options. -BOOTLOADER = caterina - # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + # Build Options # comment out to disable the options. # BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +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 +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality AUDIO_ENABLE = no RGBLIGHT_ENABLE = no diff --git a/keyboards/40percentclub/luddite/rules.mk b/keyboards/40percentclub/luddite/rules.mk index 2f7d847bf06c..8dff21f9ab71 100644 --- a/keyboards/40percentclub/luddite/rules.mk +++ b/keyboards/40percentclub/luddite/rules.mk @@ -33,25 +33,40 @@ ARCH = AVR8 # CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. F_USB = $(F_CPU) -# Bootloader -# This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded -# automatically (+60). See bootloader.mk for all options. -BOOTLOADER = caterina - # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + # Build Options # comment out to disable the options. # BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +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 +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality AUDIO_ENABLE = no RGBLIGHT_ENABLE = yes diff --git a/keyboards/40percentclub/mf68/config.h b/keyboards/40percentclub/mf68/config.h index 07d787eacfa5..22d987e52c0f 100644 --- a/keyboards/40percentclub/mf68/config.h +++ b/keyboards/40percentclub/mf68/config.h @@ -15,8 +15,7 @@ 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 +#pragma once #include "config_common.h" @@ -158,5 +157,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - -#endif diff --git a/keyboards/40percentclub/mf68/keymaps/default/keymap.c b/keyboards/40percentclub/mf68/keymaps/default/keymap.c index 73045f3107a5..ae7e7297cb89 100644 --- a/keyboards/40percentclub/mf68/keymaps/default/keymap.c +++ b/keyboards/40percentclub/mf68/keymaps/default/keymap.c @@ -51,18 +51,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /*`ctrl-+-gui-+-alt-+----------space---------------+-fn---+-alt-+ctrl-' `left+down+rght' */ ) }; - -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/40percentclub/mf68/keymaps/factory/keymap.c b/keyboards/40percentclub/mf68/keymaps/factory/keymap.c index 0c5305e51916..12032350cd4c 100644 --- a/keyboards/40percentclub/mf68/keymaps/factory/keymap.c +++ b/keyboards/40percentclub/mf68/keymaps/factory/keymap.c @@ -57,18 +57,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /*`ctrl-+-gui-+-alt-+----------space---------------+-fn---+-alt-+ctrl-' `left+down+rght' */ ) }; - -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/40percentclub/mf68/mf68.h b/keyboards/40percentclub/mf68/mf68.h index a55c1d60b072..a34f9cde8deb 100644 --- a/keyboards/40percentclub/mf68/mf68.h +++ b/keyboards/40percentclub/mf68/mf68.h @@ -1,5 +1,4 @@ -#ifndef MF68_H -#define MF68_H +#pragma once #include "quantum.h" @@ -36,5 +35,3 @@ KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67, KC_##K68, \ KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74 \ ) - -#endif diff --git a/keyboards/40percentclub/mf68/rules.mk b/keyboards/40percentclub/mf68/rules.mk index 9f6445686d5c..38c9f517b9d4 100644 --- a/keyboards/40percentclub/mf68/rules.mk +++ b/keyboards/40percentclub/mf68/rules.mk @@ -1,4 +1,3 @@ - # MCU name MCU = atmega32u4 @@ -15,7 +14,6 @@ MCU = atmega32u4 # software delays. F_CPU = 16000000 - # # LUFA specific # @@ -39,30 +37,42 @@ F_USB = $(F_CPU) 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 +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) -EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) -CONSOLE_ENABLE ?= yes # Console for debug(+400) -COMMAND_ENABLE ?= yes # Commands for debug and configuration +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 +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 ?= yes # 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 +NKRO_ENABLE = no # USB Nkey Rollover +BACKLIGHT_ENABLE = yes # 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 -LAYOUTS = 68_ansi \ No newline at end of file +LAYOUTS = 68_ansi diff --git a/keyboards/40percentclub/mf68_ble/config.h b/keyboards/40percentclub/mf68_ble/config.h index 83c0a7a5ac91..e7edd77fe69d 100644 --- a/keyboards/40percentclub/mf68_ble/config.h +++ b/keyboards/40percentclub/mf68_ble/config.h @@ -15,8 +15,7 @@ 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 +#pragma once #include "config_common.h" @@ -158,5 +157,3 @@ along with this program. If not, see . //#define NO_ACTION_ONESHOT //#define NO_ACTION_MACRO //#define NO_ACTION_FUNCTION - -#endif diff --git a/keyboards/40percentclub/mf68_ble/keymaps/default/keymap.c b/keyboards/40percentclub/mf68_ble/keymaps/default/keymap.c index 73045f3107a5..ae7e7297cb89 100644 --- a/keyboards/40percentclub/mf68_ble/keymaps/default/keymap.c +++ b/keyboards/40percentclub/mf68_ble/keymaps/default/keymap.c @@ -51,18 +51,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /*`ctrl-+-gui-+-alt-+----------space---------------+-fn---+-alt-+ctrl-' `left+down+rght' */ ) }; - -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/40percentclub/mf68_ble/mf68_ble.h b/keyboards/40percentclub/mf68_ble/mf68_ble.h index 8ef14c98d448..a34f9cde8deb 100644 --- a/keyboards/40percentclub/mf68_ble/mf68_ble.h +++ b/keyboards/40percentclub/mf68_ble/mf68_ble.h @@ -1,5 +1,4 @@ -#ifndef MF68_BLE_H -#define MF68_BLE_H +#pragma once #include "quantum.h" @@ -36,5 +35,3 @@ KC_##K60, KC_##K61, KC_##K62, KC_##K63, KC_##K64, KC_##K65, KC_##K66, KC_##K67, KC_##K68, \ KC_##K70, KC_##K71, KC_##K72, KC_##K73, KC_##K74 \ ) - -#endif diff --git a/keyboards/40percentclub/mf68_ble/rules.mk b/keyboards/40percentclub/mf68_ble/rules.mk index 07b59d7853df..2ca811833c7e 100644 --- a/keyboards/40percentclub/mf68_ble/rules.mk +++ b/keyboards/40percentclub/mf68_ble/rules.mk @@ -1,4 +1,3 @@ - # MCU name MCU = atmega32u4 @@ -39,29 +38,42 @@ F_USB = $(F_CPU) 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 +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE ?= no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE ?= yes # Mouse keys(+4700) -EXTRAKEY_ENABLE ?= yes # Audio control and System control(+450) -CONSOLE_ENABLE ?= yes # Console for debug(+400) -COMMAND_ENABLE ?= yes # Commands for debug and configuration +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 +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 -BLUETOOTH = AdafruitBLE \ No newline at end of file +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 + +BLUETOOTH = AdafruitBLE diff --git a/keyboards/40percentclub/nano/config.h b/keyboards/40percentclub/nano/config.h index 088fafcaa5fd..36840d2f6c1f 100644 --- a/keyboards/40percentclub/nano/config.h +++ b/keyboards/40percentclub/nano/config.h @@ -15,8 +15,7 @@ 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 +#pragma once #include "config_common.h" @@ -41,5 +40,3 @@ along with this program. If not, see . #define DIODE_DIRECTION COL2ROW #define TAPPING_TERM 200 - -#endif diff --git a/keyboards/40percentclub/nano/keymaps/default/keymap.c b/keyboards/40percentclub/nano/keymaps/default/keymap.c index cd9d4549de39..9ce282a28a1b 100644 --- a/keyboards/40percentclub/nano/keymaps/default/keymap.c +++ b/keyboards/40percentclub/nano/keymaps/default/keymap.c @@ -3,7 +3,6 @@ #define _MAIN 0 #define _FN 1 -#define _______ KC_TRNS #define KC_X0 LT(_FN, KC_ESC) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { diff --git a/keyboards/40percentclub/nano/keymaps/spooka/keymap.c b/keyboards/40percentclub/nano/keymaps/spooka/keymap.c index 63b90da09ff9..7908794fe013 100644 --- a/keyboards/40percentclub/nano/keymaps/spooka/keymap.c +++ b/keyboards/40percentclub/nano/keymaps/spooka/keymap.c @@ -2,8 +2,6 @@ #define _MAIN 0 -#define _______ KC_TRNS - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_MAIN] = LAYOUT( RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, diff --git a/keyboards/40percentclub/nano/nano.h b/keyboards/40percentclub/nano/nano.h index 21d6c4f30c2c..ae297ac12e69 100644 --- a/keyboards/40percentclub/nano/nano.h +++ b/keyboards/40percentclub/nano/nano.h @@ -1,5 +1,4 @@ -#ifndef NANO_H -#define NANO_H +#pragma once #include "quantum.h" @@ -10,5 +9,3 @@ { k01, k02, k03, k04 }, \ { k05, k06, k07, k08 } \ } - -#endif diff --git a/keyboards/40percentclub/nano/rules.mk b/keyboards/40percentclub/nano/rules.mk index dc510bc0d190..66ad3ffc66a6 100644 --- a/keyboards/40percentclub/nano/rules.mk +++ b/keyboards/40percentclub/nano/rules.mk @@ -1,7 +1,4 @@ -SRC = matrix.c - # MCU name -#MCU = at90usb1287 MCU = atmega32u4 # Processor frequency. @@ -40,16 +37,28 @@ F_USB = $(F_CPU) 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 +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = caterina + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# 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 +# 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) @@ -67,4 +76,7 @@ RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +# custom matrix setup +SRC = matrix.c CUSTOM_MATRIX = yes diff --git a/keyboards/40percentclub/tomato/config.h b/keyboards/40percentclub/tomato/config.h index 185cb326cce0..05c83c30cddf 100644 --- a/keyboards/40percentclub/tomato/config.h +++ b/keyboards/40percentclub/tomato/config.h @@ -1,5 +1,4 @@ -#ifndef CONFIG_H -#define CONFIG_H +#pragma once #include "config_common.h" @@ -44,5 +43,3 @@ #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 - -#endif diff --git a/keyboards/40percentclub/tomato/keymaps/default/keymap.c b/keyboards/40percentclub/tomato/keymaps/default/keymap.c index 94bfca202bc9..01a868d7e305 100644 --- a/keyboards/40percentclub/tomato/keymaps/default/keymap.c +++ b/keyboards/40percentclub/tomato/keymaps/default/keymap.c @@ -38,7 +38,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT_ortho_3x10 ( KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0 , KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 - , KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_DEL, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS + , _______,_______,_______,_______,KC_DEL, _______,_______,_______,_______,_______ ), /* Level 2: Symbols Layer * ,-------------------------------------------------------------------------------. @@ -51,8 +51,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ LAYOUT_ortho_3x10 ( KC_EXLM,KC_AT, KC_HASH,KC_DLR, KC_PERC,KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN - , KC_F11, KC_F12,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_GRAVE - , KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS + , KC_F11, KC_F12,_______,_______,_______,_______,_______,_______,_______,KC_GRAVE + , _______,_______,_______,_______,_______,_______,_______,_______,_______,_______ ), /* Level 3: RGB Layer * ,-------------------------------------------------------------------------------. @@ -64,9 +64,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * '-------------------------------------------------------------------------------' */ LAYOUT_ortho_3x10 - ( KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_MINS,KC_EQL, KC_LBRC,KC_RBRC,KC_BSLS - , KC_TAB, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_COMM,KC_DOT, KC_SLSH,KC_SCLN,KC_QUOT - , KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_LEFT,KC_DOWN,KC_UP, KC_RGHT + ( _______,_______,_______,_______,_______,KC_MINS,KC_EQL, KC_LBRC,KC_RBRC,KC_BSLS + , KC_TAB, _______,_______,_______,_______,KC_COMM,KC_DOT, KC_SLSH,KC_SCLN,KC_QUOT + , _______,_______,_______,_______,_______,_______,KC_LEFT,KC_DOWN,KC_UP, KC_RGHT ), /* Level 4: RGB Layer * ,-------------------------------------------------------------------------------. @@ -78,9 +78,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * '-------------------------------------------------------------------------------' */ LAYOUT_ortho_3x10 - ( KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_UNDS,KC_PLUS,KC_LCBR,KC_RCBR,KC_PIPE - , KC_TAB, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_LT, KC_GT, KC_QUES,KC_COLN,KC_DQUO - , KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_HOME,KC_PGUP,KC_PGDN,KC_END + ( _______,_______,_______,_______,_______,KC_UNDS,KC_PLUS,KC_LCBR,KC_RCBR,KC_PIPE + , KC_TAB, _______,_______,_______,_______,KC_LT, KC_GT, KC_QUES,KC_COLN,KC_DQUO + , _______,_______,_______,_______,_______,_______,KC_HOME,KC_PGUP,KC_PGDN,KC_END ), /* Level 5: RGB Layer * ,-------------------------------------------------------------------------------. @@ -92,27 +92,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * '-------------------------------------------------------------------------------' */ LAYOUT_ortho_3x10 - ( KC_CALC,KC_WSCH,KC_MAIL,KC_MYCM,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS - , RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,KC_NO, KC_NO, RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD - , KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS + ( KC_CALC,KC_WSCH,KC_MAIL,KC_MYCM,_______,_______,_______,_______,_______,_______ + , RGB_TOG,RGB_MOD,RGB_HUI,RGB_HUD,XXXXXXX,XXXXXXX,RGB_SAI,RGB_SAD,RGB_VAI,RGB_VAD + , _______,_______,_______,_______,RESET, _______,_______,_______,_______,_______ ), }; -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) { } diff --git a/keyboards/40percentclub/tomato/rules.mk b/keyboards/40percentclub/tomato/rules.mk index cbb2b051963e..844ff998277f 100644 --- a/keyboards/40percentclub/tomato/rules.mk +++ b/keyboards/40percentclub/tomato/rules.mk @@ -37,21 +37,37 @@ F_USB = $(F_CPU) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT -# Boot Section Size in *bytes* +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID BOOTLOADER = caterina +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + # Build Options # comment out to disable the options. # BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = yes # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = no # Commands for debug and configuration -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +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 +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality AUDIO_ENABLE = no RGBLIGHT_ENABLE = yes diff --git a/keyboards/40percentclub/tomato/tomato.h b/keyboards/40percentclub/tomato/tomato.h index f8674be40ed6..70bffee302ae 100644 --- a/keyboards/40percentclub/tomato/tomato.h +++ b/keyboards/40percentclub/tomato/tomato.h @@ -1,5 +1,4 @@ -#ifndef GHERKIN_H -#define GHERKIN_H +#pragma once #include "quantum.h" @@ -14,5 +13,3 @@ { K30, K31, K32, K33, K34, K35 }, \ { K40, K41, K42, K43, K44, K45 } \ } - -#endif diff --git a/keyboards/40percentclub/ut47/config.h b/keyboards/40percentclub/ut47/config.h index 4335e3edd503..cd55e4d7324f 100644 --- a/keyboards/40percentclub/ut47/config.h +++ b/keyboards/40percentclub/ut47/config.h @@ -15,8 +15,7 @@ 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 +#pragma once #include "config_common.h" @@ -83,5 +82,3 @@ along with this program. If not, see . # else # error "USART configuration is needed." #endif - -#endif diff --git a/keyboards/40percentclub/ut47/keymaps/default/config.h b/keyboards/40percentclub/ut47/keymaps/default/config.h index 46098a22fb2b..f88ebf7e8037 100644 --- a/keyboards/40percentclub/ut47/keymaps/default/config.h +++ b/keyboards/40percentclub/ut47/keymaps/default/config.h @@ -14,11 +14,8 @@ * along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once #include "config_common.h" // place overrides here - -#endif diff --git a/keyboards/40percentclub/ut47/keymaps/default/keymap.c b/keyboards/40percentclub/ut47/keymaps/default/keymap.c index 6b6bb025b19f..0fa7838dfd79 100644 --- a/keyboards/40percentclub/ut47/keymaps/default/keymap.c +++ b/keyboards/40percentclub/ut47/keymaps/default/keymap.c @@ -18,7 +18,6 @@ #include "protocol/serial.h" #endif -#define _______ KC_TRNS #define LT3_TAB LT(3, KC_TAB) #define MT_RSFT_ENT MT(MOD_RSFT, KC_ENT) diff --git a/keyboards/40percentclub/ut47/keymaps/non-us/config.h b/keyboards/40percentclub/ut47/keymaps/non-us/config.h index 46098a22fb2b..f88ebf7e8037 100644 --- a/keyboards/40percentclub/ut47/keymaps/non-us/config.h +++ b/keyboards/40percentclub/ut47/keymaps/non-us/config.h @@ -14,11 +14,8 @@ * along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once #include "config_common.h" // place overrides here - -#endif diff --git a/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c b/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c index 1cb537b7d00a..0c1c2e75999b 100644 --- a/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c +++ b/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c @@ -18,7 +18,6 @@ #include "protocol/serial.h" #endif -#define _______ KC_TRNS #define LT3_TAB LT(3, KC_TAB) #define MT_RSFT_ENT MT(MOD_RSFT, KC_ENT) diff --git a/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c b/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c index cc3f43650eeb..f3e297ec03d6 100644 --- a/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c +++ b/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c @@ -21,7 +21,6 @@ #include "keymap_norwegian.h" -#define _______ KC_TRNS #define LT3_TAB LT(3, KC_TAB) #define MT_RSFT_ENT MT(MOD_RSFT, KC_ENT) #define CTRADEL LALT(LCTL(KC_DEL)) diff --git a/keyboards/40percentclub/ut47/keymaps/rgb/config.h b/keyboards/40percentclub/ut47/keymaps/rgb/config.h index 0eb010a3ae29..791147b5bfdd 100644 --- a/keyboards/40percentclub/ut47/keymaps/rgb/config.h +++ b/keyboards/40percentclub/ut47/keymaps/rgb/config.h @@ -14,8 +14,7 @@ * along with this program. If not, see . */ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once #include "config_common.h" @@ -23,5 +22,3 @@ #define RGBLIGHT_ANIMATIONS #define RGB_DI_PIN D3 // The pin the LED strip is connected to #define RGBLED_NUM 7 // Number of LEDs in your strip - -#endif diff --git a/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c b/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c index 58d11031ad11..77fa5b4017f1 100644 --- a/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c +++ b/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c @@ -18,7 +18,6 @@ #include "protocol/serial.h" #endif -#define _______ KC_TRNS #define LT3_TAB LT(3, KC_TAB) #define MT_RSFT_ENT MT(MOD_RSFT, KC_ENT) diff --git a/keyboards/40percentclub/ut47/rules.mk b/keyboards/40percentclub/ut47/rules.mk index b04659866984..7495f5edda14 100644 --- a/keyboards/40percentclub/ut47/rules.mk +++ b/keyboards/40percentclub/ut47/rules.mk @@ -1,5 +1,4 @@ # MCU name -#MCU = at90usb1286 MCU = atmega32u4 # Processor frequency. @@ -38,12 +37,26 @@ F_USB = $(F_CPU) # Interrupt driven control endpoint task(+60) OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT -# Bootloader + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID BOOTLOADER = caterina -# custom matrix setup -CUSTOM_MATRIX = yes -SRC += matrix.c protocol/serial_uart.c + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + # Build Options # change yes to no to disable @@ -51,12 +64,12 @@ SRC += matrix.c protocol/serial_uart.c BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000) MOUSEKEY_ENABLE = yes # Mouse keys(+4700) EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) +CONSOLE_ENABLE = no # 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 = yes # USB Nkey Rollover +NKRO_ENABLE = yes # USB Nkey Rollover BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) UNICODE_ENABLE = no # Unicode @@ -64,6 +77,10 @@ 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 +# custom matrix setup +CUSTOM_MATRIX = yes +SRC += matrix.c protocol/serial_uart.c + ifeq ($(strip $(LED_ENABLE)), yes) OPT_DEFS += -DLED_ENABLE SRC += led.c diff --git a/keyboards/40percentclub/ut47/ut47.h b/keyboards/40percentclub/ut47/ut47.h index a4507dd34d76..f6456fe911b4 100644 --- a/keyboards/40percentclub/ut47/ut47.h +++ b/keyboards/40percentclub/ut47/ut47.h @@ -13,8 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef UT47_H -#define UT47_H +#pragma once #include "quantum.h" @@ -45,5 +44,3 @@ ) #define LAYOUT_kc_ut47 LAYOUT_kc - -#endif From b26ccf9a2f7f070ee3a91456757dc463e46dfe10 Mon Sep 17 00:00:00 2001 From: Logan Bussell <36081148+lbussell@users.noreply.github.com> Date: Mon, 12 Nov 2018 15:04:12 -0500 Subject: [PATCH 399/505] Add rules.mk to ortho_4x12/buswerks keymap (#4405) * Added buswerks keymap * cleaned up comments on buswerks keymap * Added buswerks keymap readme.md * Fixed spelling in buswerks readme.md * Removed unnecessary includes, changed process_record_user to now use set_single_persistent_default_layer(), removed deprecated functions, and moved the audio ifdef block to config.h * Changed buswerks ortho_4x12 layout to accommodate 'MIT' layout * Updated README.md to reflect layout changes * update buswerks keymap * add buswerks tragicforce68 keymap --- .../tragicforce68/keymaps/buswerks/keymap.c | 60 +++++++++++++++++++ .../community/ortho_4x12/buswerks/keymap.c | 56 ++++++++++++----- .../community/ortho_4x12/buswerks/rules.mk | 9 +++ 3 files changed, 109 insertions(+), 16 deletions(-) create mode 100644 keyboards/tragicforce68/keymaps/buswerks/keymap.c create mode 100644 layouts/community/ortho_4x12/buswerks/rules.mk diff --git a/keyboards/tragicforce68/keymaps/buswerks/keymap.c b/keyboards/tragicforce68/keymaps/buswerks/keymap.c new file mode 100644 index 000000000000..d74c0186d617 --- /dev/null +++ b/keyboards/tragicforce68/keymaps/buswerks/keymap.c @@ -0,0 +1,60 @@ +#include QMK_KEYBOARD_H + +#define _QWERTY 0 +#define _COLEMAK 1 +#define _FN1 2 + +#define WORD_L LALT(KC_LEFT) +#define WORD_R LALT(KC_RGHT) +#define LINE_L LGUI(KC_LEFT) +#define LINE_R LGUI(KC_RGHT) + +#define DESK_L LCTL(KC_LEFT) +#define DESK_R LCTL(KC_RGHT) +#define MSN_CTL LCTL(KC_UP) + +#define LT_FN LT(_FN1, KC_ESC) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────────────┐ ┌────────┬────────┐ + 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_INS, KC_PGUP, + //├────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────────────┤ ├────────┼────────┤ + 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_PGDN, + //├────────────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴────────────┤ └────────┴────────┘ + LT_FN, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENTER, + //├──────────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───────────────────┤ ┌────────┐ + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, + //├──────────┬───────┴──┬─────┴────┬───┴────────┴────────┴────────┴────────┴────────┴──────┬─┴────────┼────────┴─┬──────────┬────┬──────┴─┬────────┼────────┐ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, KC_CAPS, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + //└──────────┴──────────┴──────────┴───────────────────────────────────────────────────────┴──────────┴──────────┴──────────┘ └────────┴────────┴────────┘ + ), + + [_COLEMAK] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────────────┐ ┌────────┬────────┐ + 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_INS, 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_DEL, KC_PGDN, + //├────────────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴────────────┤ └────────┴────────┘ + LT_FN, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENTER, + //├──────────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───────────────────┤ ┌────────┐ + KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, + //├──────────┬───────┴──┬─────┴────┬───┴────────┴────────┴────────┴────────┴────────┴──────┬─┴────────┼────────┴─┬──────────┬────┬──────┴─┬────────┼────────┐ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, KC_CAPS, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + //└──────────┴──────────┴──────────┴───────────────────────────────────────────────────────┴──────────┴──────────┴──────────┘ └────────┴────────┴────────┘ + ), + + [_FN1] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────┬────────────────┐ ┌────────┬────────┐ + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, RESET, KC_HOME, + //├────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────────────┤ ├────────┼────────┤ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END, + //├────────────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴─┬──────┴────────────┤ └────────┴────────┘ + _______, DESK_L, MSN_CTL, DESK_R, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______, + //├──────────────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───┬────┴───────────────────┤ ┌────────┐ + _______, _______, _______, _______, _______, _______, LINE_L, WORD_L, WORD_R, LINE_R, _______, _______, BL_INC, + //├──────────┬───────┴──┬─────┴────┬───┴────────┴────────┴────────┴────────┴────────┴──────┬─┴────────┼────────┴─┬──────────┬────┬──────┴─┬────────┼────────┐ + _______, _______, _______, KC_BSPC, _______, _______, KC_MENU, BL_BRTG, BL_DEC, BL_TOGG + //└──────────┴──────────┴──────────┴───────────────────────────────────────────────────────┴──────────┴──────────┴──────────┘ └────────┴────────┴────────┘ + ) +}; \ No newline at end of file diff --git a/layouts/community/ortho_4x12/buswerks/keymap.c b/layouts/community/ortho_4x12/buswerks/keymap.c index c05c26418304..72c592a0c3f3 100644 --- a/layouts/community/ortho_4x12/buswerks/keymap.c +++ b/layouts/community/ortho_4x12/buswerks/keymap.c @@ -7,6 +7,7 @@ extern keymap_config_t keymap_config; #define _DVORAK 2 #define _LOWER 3 #define _RAISE 4 +#define _MOUSE 5 #define _ADJUST 16 enum custom_keycodes { @@ -15,7 +16,7 @@ enum custom_keycodes { DVORAK, LOWER, RAISE, - NAV, + MOUSE, ADJUST, }; @@ -29,15 +30,26 @@ enum custom_keycodes { #define KC_LOWR LOWER #define KC_RASE RAISE #define KC_ADJ ADJUST +#define MOUSE TG(_MOUSE) #define DESK_L LCTL(KC_LEFT) #define DESK_R LCTL(KC_RGHT) #define MSN_CTL LCTL(KC_UP) #define APP_WND LCTL(KC_DOWN) +#define SWITCHR LGUI(KC_TAB) + +#define WORD_L LALT(KC_LEFT) +#define WORD_R LALT(KC_RGHT) +#define LINE_L LGUI(KC_LEFT) +#define LINE_R LGUI(KC_RGHT) + +#define COPY LGUI(KC_C) +#define CUT LGUI(KC_X) +#define PASTE LGUI(KC_V) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[_QWERTY] = LAYOUT_ortho_4x12( \ +[_QWERTY] = LAYOUT_ortho_4x12( // .--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------. KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I, KC_O , KC_P , KC_BSPC, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| @@ -45,7 +57,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| KC_LSPO, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_RSPC, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER , KC_SPC , KC_SPC , RSE_ENT, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT \ + KC_LCTL, KC_HYPR, MOUSE , KC_LALT, LOWER , KC_SPC , KC_SPC , RSE_ENT, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT \ // '--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------' ), @@ -57,7 +69,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| KC_LSPO, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_K , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_RSPC, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER , KC_SPC , KC_SPC , RSE_ENT, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT \ + KC_LCTL, KC_HYPR, MOUSE , KC_LALT, LOWER , KC_SPC , KC_SPC , RSE_ENT, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT \ // '--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------' ), @@ -69,38 +81,50 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| 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 , RSE_ENT, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT \ + KC_LCTL, KC_HYPR, MOUSE , KC_LALT, LOWER , KC_SPC , KC_SPC , RSE_ENT, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT \ // '--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------' ), [_LOWER] = LAYOUT_ortho_4x12( \ // .--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------. - KC_TILD, _______, KC_VOLD, MSN_CTL, KC_VOLU, _______, _______, KC_7, KC_8, KC_9, KC_MINS, KC_BSPC, \ + SWITCHR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_7, KC_8, KC_9, KC_MINS, _______, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - _______, _______, DESK_L , APP_WND, DESK_R , _______, _______, KC_4, KC_5, KC_6, KC_PLUS, KC_PIPE, \ + KC_TILD, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_4, KC_5, KC_6, KC_PLUS, KC_PIPE, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - KC_LBRC, _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, KC_SLSH, KC_RBRC, \ + _______, _______, _______, KC_UNDS, KC_EQL, _______, _______, KC_1, KC_2, KC_3, _______, _______, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - _______, _______, _______, _______, _______, _______, _______, KC_0, _______, _______, _______, _______ \ + _______, _______, _______, _______, _______, _______, _______, KC_0, KC_DOT, KC_COMM, _______, _______ \ // '--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------' ), [_RAISE] = LAYOUT_ortho_4x12( \ // .--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------. - KC_GRV, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ + KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_UNDS, KC_EQL, KC_DEL, \ + // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + _______, _______, KC_LBRC, KC_LCBR, KC_RCBR, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, KC_BSLS, \ + // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, LINE_L, WORD_L, WORD_R, LINE_R, _______, _______, \ + // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT \ + // '--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------' +), + +[_MOUSE] = LAYOUT_ortho_4x12( \ + // .--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------. + SWITCHR, _______, _______, KC_MS_U, _______, _______, _______, KC_ACL0, KC_ACL1, KC_ACL2, _______, _______, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, KC_BSLS, \ + _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, KC_BTN1, KC_BTN2, KC_BTN3, _______, _______, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - KC_LCBR, KC_CIRC, KC_ASTR, KC_UNDS, KC_EQL, KC_AMPR, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______, KC_RCBR, \ + _______, _______, _______, KC_WH_U, KC_WH_D, COPY, PASTE, KC_BTN4, KC_BTN5, _______, _______, _______, \ // |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + _______, _______, MOUSE , _______, _______, KC_SPC, KC_SPC, KC_ENT, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT \ // '--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------' ), [_ADJUST] = LAYOUT_ortho_4x12( \ - KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12, \ - _______, _______, RESET, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, QWERTY, COLEMAK, DVORAK, RESET, _______, _______, _______, _______, AG_NORM, AG_SWAP, _______, \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, AU_OFF , AU_ON , _______, \ + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ) diff --git a/layouts/community/ortho_4x12/buswerks/rules.mk b/layouts/community/ortho_4x12/buswerks/rules.mk new file mode 100644 index 000000000000..72f8257322a7 --- /dev/null +++ b/layouts/community/ortho_4x12/buswerks/rules.mk @@ -0,0 +1,9 @@ +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 +TAP_DANCE_ENABLE = no +AUDIO_ENABLE = yes + +MACROS_ENABLED = no \ No newline at end of file From 2509039abfc5f59d791c8e061641b6fc2e63a69b Mon Sep 17 00:00:00 2001 From: Daniel Shields Date: Mon, 12 Nov 2018 12:02:51 +0000 Subject: [PATCH 400/505] Add missing arm gcc compiler for openSUSE 15.0 and Tumbleweed. --- util/linux_install.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/util/linux_install.sh b/util/linux_install.sh index 971d4c543c05..0e8296c0d22b 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -112,12 +112,15 @@ elif grep ID /etc/os-release | grep -q sabayon; then elif grep ID /etc/os-release | grep -qE "opensuse|tumbleweed"; then CROSS_AVR_GCC=cross-avr-gcc8 + CROSS_ARM_GCC=cross-arm-none-gcc8 if grep ID /etc/os-release | grep -q "15.0"; then CROSS_AVR_GCC=cross-avr-gcc7 + CROSS_ARM_GCC=cross-arm-none-gcc7 fi sudo zypper install \ avr-libc \ $CROSS_AVR_GCC \ + $CROSS_ARM_GCC \ cross-avr-binutils \ cross-arm-none-newlib-devel \ cross-arm-binutils cross-arm-none-newlib-devel \ From b1e74aee43596e2601248b0a78b2c54c897ce78b Mon Sep 17 00:00:00 2001 From: Michael Kaylan <1063516+kaylanm@users.noreply.github.com> Date: Mon, 12 Nov 2018 11:20:56 -0500 Subject: [PATCH 401/505] Make sure that avr-gcc@7 gets linked into the path on MacOS. --- docs/faq_build.md | 2 +- docs/getting_started_build_tools.md | 1 + util/macos_install.sh | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/faq_build.md b/docs/faq_build.md index 465a283aef24..14c61a1e99e6 100644 --- a/docs/faq_build.md +++ b/docs/faq_build.md @@ -126,5 +126,5 @@ For now, you need to rollback avr-gcc to 7 in brew. ``` brew uninstall --force avr-gcc brew install avr-gcc@7 -brew link avr-gcc@7 +brew link --force avr-gcc@7 ``` diff --git a/docs/getting_started_build_tools.md b/docs/getting_started_build_tools.md index 587dece4a150..67bbe5434467 100644 --- a/docs/getting_started_build_tools.md +++ b/docs/getting_started_build_tools.md @@ -57,6 +57,7 @@ If you're using [homebrew,](http://brew.sh/) you can use the following commands: brew tap PX4/homebrew-px4 brew update brew install avr-gcc@7 + brew link --force avr-gcc@7 brew install dfu-programmer brew install dfu-util brew install gcc-arm-none-eabi diff --git a/util/macos_install.sh b/util/macos_install.sh index c31be99d2210..d2629a8cb4ae 100755 --- a/util/macos_install.sh +++ b/util/macos_install.sh @@ -23,3 +23,4 @@ brew tap osx-cross/avr brew tap PX4/homebrew-px4 brew update brew install avr-gcc@7 gcc-arm-none-eabi dfu-programmer avrdude dfu-util +brew link --force avr-gcc@7 From aa03049015855cdd5f61e6e8a7c6955abc5d3141 Mon Sep 17 00:00:00 2001 From: comaid <44457151+comaid@users.noreply.github.com> Date: Tue, 13 Nov 2018 05:19:29 +0900 Subject: [PATCH 402/505] Fix up screen off timer of crkbd (#4346) * fix about screen off timer * Fix Up ScreenOffInterval exceeded uint16_t * Fix Up never waking up once screen off if in case of matrix are not dirty. * Revert "fix about screen off timer" This reverts commit 3d175f2340c14250a71af78afec5a1e890d9f4e7. * Fix up screen off timer of crkbd * Fix Up ScreenOffInterval exceeded uint16_t * Fix Up never waking up once screen off if in case of matrix are not dirty. * Fix up screen off timer of helix * Fix Up ScreenOffInterval exceeded uint16_t * Fix Up never waking up once screen off if in case of matrix are not dirty * Revert "Fix up screen off timer of helix" This reverts commit f0efb82443a7dc34b75579359b0514e8bfa51100. * Improve internal processing of process_record_kb() * Use the return value of process_record_gfx() * Fix a indent Fix a indent --- keyboards/crkbd/crkbd.c | 5 +++++ keyboards/crkbd/ssd1306.c | 16 ++++++++++++++-- keyboards/crkbd/ssd1306.h | 3 +++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/keyboards/crkbd/crkbd.c b/keyboards/crkbd/crkbd.c index 5e8ba8bacf48..32f7af776ee0 100644 --- a/keyboards/crkbd/crkbd.c +++ b/keyboards/crkbd/crkbd.c @@ -1 +1,6 @@ #include "crkbd.h" +#include "ssd1306.h" + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + return process_record_gfx(keycode,record) && process_record_user(keycode, record); +} \ No newline at end of file diff --git a/keyboards/crkbd/ssd1306.c b/keyboards/crkbd/ssd1306.c index 205ce67a9e00..4330c8497db2 100644 --- a/keyboards/crkbd/ssd1306.c +++ b/keyboards/crkbd/ssd1306.c @@ -24,12 +24,17 @@ static const unsigned char font[] PROGMEM; //static uint16_t last_battery_update; //static uint32_t vbat; //#define BatteryUpdateInterval 10000 /* milliseconds */ -#define ScreenOffInterval 300000 /* milliseconds */ + +// 'last_flush' is declared as uint16_t, +// so this must be less than 65535 +#define ScreenOffInterval 60000 /* milliseconds */ #if DEBUG_TO_SCREEN static uint8_t displaying; #endif static uint16_t last_flush; +static bool force_dirty = true; + // Write command sequence. // Returns true on success. static inline bool _send_cmd1(uint8_t cmd) { @@ -321,12 +326,19 @@ void iota_gfx_task_user(void) { void iota_gfx_task(void) { iota_gfx_task_user(); - if (display.dirty) { + if (display.dirty|| force_dirty) { iota_gfx_flush(); + force_dirty = false; } if (timer_elapsed(last_flush) > ScreenOffInterval) { iota_gfx_off(); } } + +bool process_record_gfx(uint16_t keycode, keyrecord_t *record) { + force_dirty = true; + return true; +} + #endif diff --git a/keyboards/crkbd/ssd1306.h b/keyboards/crkbd/ssd1306.h index 76dd6a2a72d3..ea8c9232805d 100644 --- a/keyboards/crkbd/ssd1306.h +++ b/keyboards/crkbd/ssd1306.h @@ -3,6 +3,7 @@ #include #include #include "pincontrol.h" +#include "action.h" enum ssd1306_cmds { DisplayOff = 0xAE, @@ -86,3 +87,5 @@ void matrix_write(struct CharacterMatrix *matrix, const char *data); void matrix_write_ln(struct CharacterMatrix *matrix, const char *data); void matrix_write_P(struct CharacterMatrix *matrix, const char *data); void matrix_render(struct CharacterMatrix *matrix); + +bool process_record_gfx(uint16_t keycode, keyrecord_t *record); \ No newline at end of file From 2b7decbaeb020c5320ada182552e633deec77ff7 Mon Sep 17 00:00:00 2001 From: comaid <44457151+comaid@users.noreply.github.com> Date: Tue, 13 Nov 2018 05:20:50 +0900 Subject: [PATCH 403/505] Fix up screen off timer of helix (#4347) * Fix up screen off timer of helix * Fix Up ScreenOffInterval exceeded uint16_t * Fix Up never waking up once screen off if in case of matrix are not dirty * Changing referenIng incorrect constant name * OLED_ENABLED => SSD1306OLED * Improve internal processing of process_record_kb() * Use the return value of process_record_gfx() * Move a include statement into #ifdef block Move #include "ssd1306.h` statement into #ifdef block * Move process_record_kbI() Move process_record_kb() from helix.c to rev1.c/rev2.c/pico.c * Move process_record_kb() --- keyboards/helix/pico/pico.c | 6 ++++++ keyboards/helix/rev1/rev1.c | 6 ++++++ keyboards/helix/rev2/rev2.c | 6 ++++++ keyboards/helix/ssd1306.c | 17 +++++++++++++++-- keyboards/helix/ssd1306.h | 3 ++- 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/keyboards/helix/pico/pico.c b/keyboards/helix/pico/pico.c index 5e248ccffec1..bb8ba9ca2b4d 100644 --- a/keyboards/helix/pico/pico.c +++ b/keyboards/helix/pico/pico.c @@ -2,6 +2,12 @@ #ifdef SSD1306OLED +#include "ssd1306.h" + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + return process_record_gfx(keycode,record) && 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/helix/rev1/rev1.c b/keyboards/helix/rev1/rev1.c index d7ea9b723572..309cca010f1a 100644 --- a/keyboards/helix/rev1/rev1.c +++ b/keyboards/helix/rev1/rev1.c @@ -2,6 +2,12 @@ #ifdef SSD1306OLED +#include "ssd1306.h" + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + return process_record_gfx(keycode,record) && 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/helix/rev2/rev2.c b/keyboards/helix/rev2/rev2.c index 75765f1d3575..abaa02cdb131 100644 --- a/keyboards/helix/rev2/rev2.c +++ b/keyboards/helix/rev2/rev2.c @@ -2,6 +2,12 @@ #ifdef SSD1306OLED +#include "ssd1306.h" + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) { + return process_record_gfx(keycode,record) && 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/helix/ssd1306.c b/keyboards/helix/ssd1306.c index b3e55a67c201..dd3290ba0cc8 100644 --- a/keyboards/helix/ssd1306.c +++ b/keyboards/helix/ssd1306.c @@ -1,3 +1,4 @@ + #ifdef SSD1306OLED #include "ssd1306.h" @@ -27,12 +28,17 @@ //static uint16_t last_battery_update; //static uint32_t vbat; //#define BatteryUpdateInterval 10000 /* milliseconds */ -#define ScreenOffInterval 300000 /* milliseconds */ + +// 'last_flush' is declared as uint16_t, +// so this must be less than 65535 +#define ScreenOffInterval 60000 /* milliseconds */ #if DEBUG_TO_SCREEN static uint8_t displaying; #endif static uint16_t last_flush; +static bool force_dirty = true; + // Write command sequence. // Returns true on success. static inline bool _send_cmd1(uint8_t cmd) { @@ -318,12 +324,19 @@ void iota_gfx_task_user(void) { void iota_gfx_task(void) { iota_gfx_task_user(); - if (display.dirty) { + if (display.dirty|| force_dirty) { iota_gfx_flush(); + force_dirty = false; } if (timer_elapsed(last_flush) > ScreenOffInterval) { iota_gfx_off(); } } + +bool process_record_gfx(uint16_t keycode, keyrecord_t *record) { + force_dirty = true; + return true; +} + #endif diff --git a/keyboards/helix/ssd1306.h b/keyboards/helix/ssd1306.h index 77ce7c211a04..9cf6983b7e43 100644 --- a/keyboards/helix/ssd1306.h +++ b/keyboards/helix/ssd1306.h @@ -4,6 +4,7 @@ #include #include #include "pincontrol.h" +#include "action.h" enum ssd1306_cmds { DisplayOff = 0xAE, @@ -87,6 +88,6 @@ void matrix_write(struct CharacterMatrix *matrix, const char *data); void matrix_write_P(struct CharacterMatrix *matrix, const char *data); void matrix_render(struct CharacterMatrix *matrix); - +bool process_record_gfx(uint16_t keycode, keyrecord_t *record); #endif From d0f8e1babee406af6c17759200173109705a35e3 Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Thu, 25 Oct 2018 02:03:29 +0900 Subject: [PATCH 404/505] modify quantum/template/avr/config.h: add rgblight effect configurations --- quantum/template/avr/config.h | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/quantum/template/avr/config.h b/quantum/template/avr/config.h index 56395f376f65..463ddff2db32 100644 --- a/quantum/template/avr/config.h +++ b/quantum/template/avr/config.h @@ -54,11 +54,24 @@ along with this program. If not, see . // #define RGB_DI_PIN E2 // #ifdef RGB_DI_PIN -// #define RGBLIGHT_ANIMATIONS -// #define RGBLED_NUM 16 -// #define RGBLIGHT_HUE_STEP 8 -// #define RGBLIGHT_SAT_STEP 8 -// #define RGBLIGHT_VAL_STEP 8 +// #define RGBLED_NUM 16 +// #define RGBLIGHT_HUE_STEP 8 +// #define RGBLIGHT_SAT_STEP 8 +// #define RGBLIGHT_VAL_STEP 8 +// #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */ +// #define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */ +// /*== all animations enable ==*/ +// #define RGBLIGHT_ANIMATIONS +// /*== or choose animations ==*/ +// #define RGBLIGHT_EFFECT_BREATHING +// #define RGBLIGHT_EFFECT_RAINBOW_MOOD +// #define RGBLIGHT_EFFECT_RAINBOW_SWIRL +// #define RGBLIGHT_EFFECT_SNAKE +// #define RGBLIGHT_EFFECT_KNIGHT +// #define RGBLIGHT_EFFECT_CHRISTMAS +// #define RGBLIGHT_EFFECT_STATIC_GRADIENT +// #define RGBLIGHT_EFFECT_RGB_TEST +// #define RGBLIGHT_EFFECT_ALTERNATING // #endif /* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ From 2b3473455cb366888cdb62e8e570d24444173a01 Mon Sep 17 00:00:00 2001 From: Junya Ogura Date: Thu, 8 Nov 2018 02:58:51 +0900 Subject: [PATCH 405/505] Change hex file permission to 644 from 755 --- util/bootloader_atmega32u4_1_0_0.hex | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 util/bootloader_atmega32u4_1_0_0.hex diff --git a/util/bootloader_atmega32u4_1_0_0.hex b/util/bootloader_atmega32u4_1_0_0.hex old mode 100755 new mode 100644 From 599b21b9f4b450392380870675b136449839f6e5 Mon Sep 17 00:00:00 2001 From: QMK Bot Date: Mon, 12 Nov 2018 20:51:24 +0000 Subject: [PATCH 406/505] convert to unix line-endings [skip ci] --- util/bootloader_atmega32u4_1_0_0.hex | 506 +++++++++++++-------------- 1 file changed, 253 insertions(+), 253 deletions(-) diff --git a/util/bootloader_atmega32u4_1_0_0.hex b/util/bootloader_atmega32u4_1_0_0.hex index 275aeacba317..20174989ae22 100644 --- a/util/bootloader_atmega32u4_1_0_0.hex +++ b/util/bootloader_atmega32u4_1_0_0.hex @@ -1,253 +1,253 @@ -:020000020000FC -:047000000C948D3E21 -:047028000C94B73DD0 -:10702F0012010002FF010020EB03F42F0000010208 -:10703F00030109021200010100803209040000005F -:10704F00000000000C03410054004D0045004C00AF -:10705F001603410054006D00330032005500340018 -:10706F004400460055000C0331002E0030002E0066 -:10707F0030000403090416010C0100000C0000018C -:02708F006C7F14 -:1070920012BD01BDF89A00B5089501E00895F9996D -:1070A200FECF12BD01BD20BDFA9AF99AF6CFF99929 -:1070B200FECF0C944938F80104910895F8013491F7 -:1070C20031962491890108950091610000930C0189 -:1070D20000E80093610001E00093610005BF02E057 -:1070E20005BF0C9486380091D70001600093D70049 -:1070F200A89507EF04BF0091600000610093600053 -:1071020000E00093600001E008950E94AA3D0E9401 -:10711200B53DFDCF0CD00F7708D0006806D00061D6 -:1071220004D0016028D0789408950093D80000918B -:10713200D8000895FCDF00621ED04CD009B500FFD4 -:10714200FDCFF5DF0F7D17D00091E0000E7F009399 -:10715200E0000091E000077F0093E0000091E20070 -:1071620001600093E2000091E20008600093E200F7 -:1071720078940C94743B0093D800089500910D010B -:10718200002359F40091D90000FF07C0D0DF006846 -:10719200F2DF01E000930D01CDDFE0E2F2E00081D9 -:1071A200018100FF0DC0008111811E7F11830083C8 -:1071B20001E00093EA0000E00093EA0000931E025F -:1071C20000E00093E9000091E80003FF02C00E9482 -:1071D200F23B0895A89539D000E40093600000E0E6 -:1071E200009381000093800010E0009385000093DB -:1071F200840001E006BB00918100036000938100DE -:107202000091600007FFFCCF00E80093600010933C -:107212008100A89507EF04BF18D010936000209159 -:1072220084003091850010938100109380001093A8 -:1072320085001093840001E006BB2D3D354010F01F -:1072420002E101C002E009BD089500916000006101 -:107252000093600008950E94AD3E239741D100E063 -:1072620000930901B5D104811581012B51F437D165 -:1072720000910701002309F4B9C000E0009307015F -:10728200B5C058D102FFFDCF37D1068335D1009367 -:107292000F0132D1009310012FD1009311012CD193 -:1072A2000093120129D10093130102852091130149 -:1072B20030911201409111015091100116811A95DD -:1072C20041F01250A9F01A9599F11A9509F473C078 -:1072D2008BC010910F01113011F411E001C010E0C8 -:1072E200138799D00C3F11F414D17FC077D17DC0A0 -:1072F20092D010910F01112329F01A9549F01A9595 -:10730200A9F073C010E013870C3F09F06EC0ECCFF8 -:1073120056D103C04CD109F468C00D911C9144D1DF -:107322000F3FC1F305E0009309015FC011E0EBCF0D -:10733200D2D029F00250E1F10A9541F056C0FDD0B9 -:107342000E94A33F0FEF00930A014FC0552319F08B -:107352005A9579F04AC04ED00DEF04BF74D0EAD0EE -:1073620003FFFDCF67D051D04AD008E00093600000 -:10737200FFCF40D068D0DED003FFFDCF5BD03FD03F -:1073820044D00FEF1FE004C009811A810150104060 -:1073920009831A8309811A81012BB1F700E800934E -:1073A200610000910C01009361000C940000FFCF7A -:1073B20001E003871AC08FD019F00A9539F015C081 -:1073C200535098F4BAD002E000870FC0505339F0FE -:1073D2005A9541F05F52B1F35A95A1F306C002E00B -:1073E2000883F0CF01E0FCCFA8D079D02396E4E067 -:1073F2000C94BA3E01E005BF00E005BF089500917C -:10740200D8000F770093D800089509B50D7F09BD04 -:1074120000E009BD08955183408333832283109194 -:10742200E8001B7F1093E8001091E8001F7710938B -:10743200E80008955DD053D0F8940091E000016017 -:107442000093E000089579D04AC0219749D0009175 -:107452000601035019F00250B9F00BC03CD021F0E4 -:107462000A9559F00A9529F400910A010C3F19F482 -:1074720050D02196089567D0FCCF0091010100936E -:10748200F100009100010AC01091100124D019F0FE -:107492000A9549F0EECF135018F400E00093F10082 -:1074A2001ED044D0E6CF105339F01A9539F01F524E -:1074B20041F01A9541F0F4CF08E5F0CF00E006D094 -:1074C200EDCF02E0FCCF04E001D0E8CF10E020E0F5 -:1074D20030E00C94113F00910F010023089521C068 -:1074E2000BD008D007D00093040106D00093050109 -:1074F20021D00BC000D008830091F10008950091C3 -:10750200EB0000620093EB0015D0077F0093E800C8 -:107512000895F5DF02E00093080103E000930901FA -:10752200089559D007D000FFFDCF089503D002FF80 -:10753200FDCF03C00091E8000895FCDF0B7FE6DF7A -:10754200F9DF0F77E3CF0E94AC3E42D038D006C0BD -:107552002BD00093F1002BD059F43DD0082F092BEA -:10756200A9F0E8DF02FD12C0E5DF00FFFDCF4424F1 -:10757200042D4394003289F300910B0100230D91F5 -:107582001C9131F311970E945838E3CFD3DF00FFEB -:10759200FDCF21D0CFDF00FFFDCFCCDF02FFFDCF3B -:1075A200CCDFE5E00C94B93E11970C945C380D9158 -:1075B2001C910F5F1F4F1C930E93019708958281B8 -:1075C200938100811181801B910B0196DF01089547 -:1075D200E0E0F1E00895AEDF0E7F98CF0E94A93E71 -:1075E200F7DF80819181A081B181AF710481158122 -:1075F20000521040048315830AC000910B0100233E -:1076020031F4A301920103E911E00E943B3F47D00C -:10761200B8F1662477242C0111C06EDFF301ED5618 -:10762200FE4F008301E0600E00E0701E01960091A3 -:10763200F200002311F033D0B8F47FDF30D0E8F24B -:10764200F301B096E238F040C0F674DF02FFFDCFDE -:107652000091F200BDDF24813581201B304024835C -:107662003583E5CF49DFAA95AA23E1F700910B0103 -:10767200013099F62091F1008C010E945038D6CF4A -:1076820004811581012B21F055DF02FFFDCF55DF6B -:10769200A2DF50DF00FFFDCFE8E00C94B63EE0E051 -:1076A200F1E0028113810817190708952091EB0078 -:1076B20021602093EB000093EC000091ED0002703A -:1076C200012B0093ED000091ED0002600093ED00AC -:1076D2001091EE00012F000F00E0001F0895412FCE -:1076E2000093E900089500E009D000FD05C000E024 -:1076F200F7DF10E202E0DACF00E00895F1DF009157 -:10770200EB0008950F770132A9F5112369F11A955B -:1077120059F01A9561F01A9569F01A95F9F01A95CF -:10772200C1F01A95D9F024C00E942C3920C00E94C1 -:10773200263A1DC029D00091090123D001E01FD0B3 -:1077420020D0009108011BD00E94923A0E94973AE1 -:107752000EC01AD00091080114D007C002E00093B5 -:10776200080100E0009309010FD00E94923A03C081 -:107772000E94803A02C001E0089500E0089501D01D -:1077820000E00093F10008950091E800077F009364 -:10779200E800089508950350F9F4112339F01A9579 -:1077A20051F01A9581F01A9599F016C004E016D09E -:1077B20001E810E703C011D003E510E7E7E1F2E0CA -:1077C20000831183D8CF06E109D00FE510E7F6CF89 -:1077D20004D005E710E7F2CFD0CF0CE000931A02F5 -:1077E200089527D120D100931D02E1D0212F11232A -:1077F20029F12A95E9F02250F1F0225099F02A95C8 -:1078020049F0225061F02A9581F02A95E1F02A95FB -:10781200E9F023C0003809F44FC00C94833B0038D0 -:10782200E1F7C8C00023C9F71EC00023B1F72DC07D -:10783200033098F744C1033080F70BC1003868F376 -:10784200033858F7C9C0013841F77BC1013051F400 -:10785200FCD0BFD000FD06C0FCCF0E94833B0023BA -:1078620009F41ED008951091E3001078DCD00F7750 -:10787200012B0093E300E9D0ACD000FFFDCF0091D3 -:10788200E30000680093E300089591D0123040F4C1 -:107892000FD010931E02DAD000911E020C94CB3B43 -:1078A2000091EB0001D004C000620093EB00089548 -:1078B2000091E800077FC0C0BA93AA93229700E024 -:1078C2000093190274D0AFD0202F2A9519F02A956F -:1078D200E9F022C002E100931A020FE210E7E7E1A9 -:1078E200F2E0008311839DD008839DD00983E0DFFD -:1078F20000911A0210E02881398102171307A8F4B7 -:107902000F7181F401E00093190211C002E10093AA -:107912001A0201E410E7E3CF0E94CC3B002319F7DF -:107922008ED040C01093190202C020931A027ED05A -:10793200A7E1B2E001C08AD000911A02002309F146 -:1079420048D004FD1EC045D000FD03C042D004FF54 -:10795200FACF10E0012F1395003281F0ED91FC91E6 -:107962001197049133D02D913C912F5F3F4F3C935F -:107972002E93FD0103810A95038361F72AD004FF48 -:10798200DACF00911902013039F423D004FD04C08A -:1079920020D000FFFDCF5AD01CD004FFFDCF46D02F -:1079A20018D00B7F49D02296A991B99108951091D0 -:1079B200F10008957DDF00911E0208D047D009D062 -:1079C2000F773AD006D002FFFDCFBFC00093F1007F -:1079D20008950091E800089524D010911D021058D6 -:1079E20029F01A9589F01A9591F019C061DF00917A -:1079F2001C02ECDF00E0EADF29D0EBDF02FFFDCF63 -:107A020018D0E7DF0F770CC053DF00E0F2CF51D080 -:107A12000F7710E0F801E55EFD4F0081EACF0FD04D -:107A22000BC001D000D00091F1000895D2DF0F7E8B -:107A320003C00091E8000B7F0093E80008950091D5 -:107A4200EB0032DFC6DF077F089532DFC2DF0E7F31 -:107A5200F3CF00911D02002329F00A9509F10A953E -:107A620031F01EC0E0DF0A9561D0D9F41AC061D0AE -:107A7200B9F4D9DF0F7711F416D01BD00093E900C7 -:107A82001091EB0010FF0BC00ED010E01093E90034 -:107A920021E0F801E55EFD4F20834FD003C042D0C4 -:107AA20045D0CFDFC9CF1091EB0010621093EB00ED -:107AB20008951091E800177F1093E800089500914F -:107AC2001D02002311F4AFDF02C0013011F4B7DF51 -:107AD200B3CF023031F52DD019F52091F1002F7777 -:107AE2002093E90023D000FF19C081F01FD000616C -:107AF200DCDE01E010E0422F0E949F3E0093EA008C -:107B020000E00093EA0012D00860CFDE0BD030E034 -:107B1200F901E55EFD4F008310D0DACF03D0D7CF55 -:107B2200BFDE089500E00093E90008950091EB00A4 -:107B3200089579DF3CDF00230895BADE4ADF0E7F25 -:107B4200089583DF46DF02FFFDCF73DF42DF0F7749 -:107B520073CF0091D70001600093D7000E948B3849 -:107B620000E000931F0208950C94BF388A93FA93A1 -:107B7200EA933A922A921A920A927A936A935A93BF -:107B82004A933A932A931A930A938FB70091DA0091 -:107B920000FF24C00091D80000FF20C00EEF009328 -:107BA200DA000091D90000FF11C001E000930D013D -:107BB200ABD0026096D09AD00860A2D00E949B38C7 -:107BC2000091E0000E7F0093E00008C000E0009307 -:107BD2000D0100931E0298D0046083D07FD002FF73 -:107BE20005C084D002FF02C00BEF75D077D000FF32 -:107BF2001BC07CD000FF18C001E000930E016AD0C8 -:107C020083D000626ED00EEF6FD0006179D06ED05B -:107C12000F7D76D00091D80000620093D80009B59C -:107C22000D7F09BD00E009BD59D004FF20C05ED020 -:107C320004FF1DC009B500FD05C00E94EB3809B55F -:107C420000FFFDCF0091D8000F7D0093D80042D0F5 -:107C520000910E01002359F04CD00FEE45D00F7E5B -:107C620052D000643ED042D001604AD042D036D0D9 -:107C720005FF0FC03BD005FF0CC000E000930E01D2 -:107C820035D00F7E3DD00FED2FD00F7D3CD0006858 -:107C920028D024D003FF0DC029D003FF0AC000E082 -:107CA20000931F0207EF17D00E94743B2DD0116082 -:107CB20018D08FBF09911991299139914991599100 -:107CC200699179910990199029903990E991F991E6 -:107CD200899118950FEE0093E10008950091E1005B -:107CE20008951183008308950093E1000091E2005A -:107CF20008950091E200006203D00091E200086062 -:107D02000093E2000895FCDFE0E2F2E000811181DD -:107D1200089500008895FECF01E60DBF02E00EBF78 -:107D2200C2EED2E00E947438002311F00E94D33ECA -:107D32000E9465380E948A3E0C948A3E4A951AF047 -:107D4200000F111FFBCF0895BA92AA929A928A92BB -:107D52007A926A925A924A92BA93AA939A938A937D -:107D62000895BB84AA84998488847F806E805D8014 -:107D72004C80BB81AA8199818881F0E00FB6F8948A -:107D8200CE0FDF1F0FBE089520E006D0E9F7089559 -:107D9200259102D0E9F708952D9301501040202F2C -:107DA200212B089585E890E7FC0105911491FC01CF -:107DB2003296A591B491FC01349625913491422FCB -:107DC200432B19F0F901E4DF01C0DEDF069610E76C -:107DD2008139910748F308952F930CD02F9101D048 -:107DE20008953CD0F12FE02F45E047BFE89536D00B -:107DF20012D0089533D0F12FE02F43E047BFE8952A -:107E02002DD008952BD0F12FE02F43E047BFE89506 -:107E120025D001D0089522D041E147BFE8951EC088 -:107E22001DD0F12FE02F41E247BFC895002D16C0AB -:107E320015D0F12FE02F49E047BFC895002D0EC0A5 -:107E4200F32FE22F012E102E41E047BFE89506C026 -:107E520005D0002E29E027BFE89500C0022E27B7E3 -:107E620020FDFCCF202D0895022E27B726FDFCCF42 -:107E7200202D08950E94A53E22974801C901DA01EA -:107E820010C05BD001E0A00E00E0B01E00E4A0161E -:107E920000E0B00608F440C0830120E030E00E9418 -:107EA200F23E0A2F0B2B09F440C0082F0F7710E087 -:107EB2002C01401A510A320100E4A02E03C00A2FFD -:107EC2000B2BE1F04816590680F0F40101914F01A5 -:107ED2000983119729F001914F010883119711C06D -:107EE200F2013196049108830CC0F20104910983D6 -:107EF2003196E817F907A1F7F401EDCF1BD00883FB -:107F020019839201088119810E94213F16D0AA94F7 -:107F1200B1F62301AA24BB240DD0312F0F3F3F4FCE -:107F220009F4AFCF83011DD0B7CF01E02296ECE078 -:107F32000C94B23E82010C945F3802E0400E00E0E5 -:107F4200501E08959A938A9380E090E08C0109D0A4 -:107F520080589F4F8F3F0FE69007C0F38991999108 -:107F6200089520E030E00C94FB3E00000000000089 -:067F720000000000FC000D -:107FE4000C94ED3E0C94113F0C94193F0C94213FDA -:0C7FF4000C94F23E0C94033F0C94293FC7 -:040000030000700089 -:00000001FF +:020000020000FC +:047000000C948D3E21 +:047028000C94B73DD0 +:10702F0012010002FF010020EB03F42F0000010208 +:10703F00030109021200010100803209040000005F +:10704F00000000000C03410054004D0045004C00AF +:10705F001603410054006D00330032005500340018 +:10706F004400460055000C0331002E0030002E0066 +:10707F0030000403090416010C0100000C0000018C +:02708F006C7F14 +:1070920012BD01BDF89A00B5089501E00895F9996D +:1070A200FECF12BD01BD20BDFA9AF99AF6CFF99929 +:1070B200FECF0C944938F80104910895F8013491F7 +:1070C20031962491890108950091610000930C0189 +:1070D20000E80093610001E00093610005BF02E057 +:1070E20005BF0C9486380091D70001600093D70049 +:1070F200A89507EF04BF0091600000610093600053 +:1071020000E00093600001E008950E94AA3D0E9401 +:10711200B53DFDCF0CD00F7708D0006806D00061D6 +:1071220004D0016028D0789408950093D80000918B +:10713200D8000895FCDF00621ED04CD009B500FFD4 +:10714200FDCFF5DF0F7D17D00091E0000E7F009399 +:10715200E0000091E000077F0093E0000091E20070 +:1071620001600093E2000091E20008600093E200F7 +:1071720078940C94743B0093D800089500910D010B +:10718200002359F40091D90000FF07C0D0DF006846 +:10719200F2DF01E000930D01CDDFE0E2F2E00081D9 +:1071A200018100FF0DC0008111811E7F11830083C8 +:1071B20001E00093EA0000E00093EA0000931E025F +:1071C20000E00093E9000091E80003FF02C00E9482 +:1071D200F23B0895A89539D000E40093600000E0E6 +:1071E200009381000093800010E0009385000093DB +:1071F200840001E006BB00918100036000938100DE +:107202000091600007FFFCCF00E80093600010933C +:107212008100A89507EF04BF18D010936000209159 +:1072220084003091850010938100109380001093A8 +:1072320085001093840001E006BB2D3D354010F01F +:1072420002E101C002E009BD089500916000006101 +:107252000093600008950E94AD3E239741D100E063 +:1072620000930901B5D104811581012B51F437D165 +:1072720000910701002309F4B9C000E0009307015F +:10728200B5C058D102FFFDCF37D1068335D1009367 +:107292000F0132D1009310012FD1009311012CD193 +:1072A2000093120129D10093130102852091130149 +:1072B20030911201409111015091100116811A95DD +:1072C20041F01250A9F01A9599F11A9509F473C078 +:1072D2008BC010910F01113011F411E001C010E0C8 +:1072E200138799D00C3F11F414D17FC077D17DC0A0 +:1072F20092D010910F01112329F01A9549F01A9595 +:10730200A9F073C010E013870C3F09F06EC0ECCFF8 +:1073120056D103C04CD109F468C00D911C9144D1DF +:107322000F3FC1F305E0009309015FC011E0EBCF0D +:10733200D2D029F00250E1F10A9541F056C0FDD0B9 +:107342000E94A33F0FEF00930A014FC0552319F08B +:107352005A9579F04AC04ED00DEF04BF74D0EAD0EE +:1073620003FFFDCF67D051D04AD008E00093600000 +:10737200FFCF40D068D0DED003FFFDCF5BD03FD03F +:1073820044D00FEF1FE004C009811A810150104060 +:1073920009831A8309811A81012BB1F700E800934E +:1073A200610000910C01009361000C940000FFCF7A +:1073B20001E003871AC08FD019F00A9539F015C081 +:1073C200535098F4BAD002E000870FC0505339F0FE +:1073D2005A9541F05F52B1F35A95A1F306C002E00B +:1073E2000883F0CF01E0FCCFA8D079D02396E4E067 +:1073F2000C94BA3E01E005BF00E005BF089500917C +:10740200D8000F770093D800089509B50D7F09BD04 +:1074120000E009BD08955183408333832283109194 +:10742200E8001B7F1093E8001091E8001F7710938B +:10743200E80008955DD053D0F8940091E000016017 +:107442000093E000089579D04AC0219749D0009175 +:107452000601035019F00250B9F00BC03CD021F0E4 +:107462000A9559F00A9529F400910A010C3F19F482 +:1074720050D02196089567D0FCCF0091010100936E +:10748200F100009100010AC01091100124D019F0FE +:107492000A9549F0EECF135018F400E00093F10082 +:1074A2001ED044D0E6CF105339F01A9539F01F524E +:1074B20041F01A9541F0F4CF08E5F0CF00E006D094 +:1074C200EDCF02E0FCCF04E001D0E8CF10E020E0F5 +:1074D20030E00C94113F00910F010023089521C068 +:1074E2000BD008D007D00093040106D00093050109 +:1074F20021D00BC000D008830091F10008950091C3 +:10750200EB0000620093EB0015D0077F0093E800C8 +:107512000895F5DF02E00093080103E000930901FA +:10752200089559D007D000FFFDCF089503D002FF80 +:10753200FDCF03C00091E8000895FCDF0B7FE6DF7A +:10754200F9DF0F77E3CF0E94AC3E42D038D006C0BD +:107552002BD00093F1002BD059F43DD0082F092BEA +:10756200A9F0E8DF02FD12C0E5DF00FFFDCF4424F1 +:10757200042D4394003289F300910B0100230D91F5 +:107582001C9131F311970E945838E3CFD3DF00FFEB +:10759200FDCF21D0CFDF00FFFDCFCCDF02FFFDCF3B +:1075A200CCDFE5E00C94B93E11970C945C380D9158 +:1075B2001C910F5F1F4F1C930E93019708958281B8 +:1075C200938100811181801B910B0196DF01089547 +:1075D200E0E0F1E00895AEDF0E7F98CF0E94A93E71 +:1075E200F7DF80819181A081B181AF710481158122 +:1075F20000521040048315830AC000910B0100233E +:1076020031F4A301920103E911E00E943B3F47D00C +:10761200B8F1662477242C0111C06EDFF301ED5618 +:10762200FE4F008301E0600E00E0701E01960091A3 +:10763200F200002311F033D0B8F47FDF30D0E8F24B +:10764200F301B096E238F040C0F674DF02FFFDCFDE +:107652000091F200BDDF24813581201B304024835C +:107662003583E5CF49DFAA95AA23E1F700910B0103 +:10767200013099F62091F1008C010E945038D6CF4A +:1076820004811581012B21F055DF02FFFDCF55DF6B +:10769200A2DF50DF00FFFDCFE8E00C94B63EE0E051 +:1076A200F1E0028113810817190708952091EB0078 +:1076B20021602093EB000093EC000091ED0002703A +:1076C200012B0093ED000091ED0002600093ED00AC +:1076D2001091EE00012F000F00E0001F0895412FCE +:1076E2000093E900089500E009D000FD05C000E024 +:1076F200F7DF10E202E0DACF00E00895F1DF009157 +:10770200EB0008950F770132A9F5112369F11A955B +:1077120059F01A9561F01A9569F01A95F9F01A95CF +:10772200C1F01A95D9F024C00E942C3920C00E94C1 +:10773200263A1DC029D00091090123D001E01FD0B3 +:1077420020D0009108011BD00E94923A0E94973AE1 +:107752000EC01AD00091080114D007C002E00093B5 +:10776200080100E0009309010FD00E94923A03C081 +:107772000E94803A02C001E0089500E0089501D01D +:1077820000E00093F10008950091E800077F009364 +:10779200E800089508950350F9F4112339F01A9579 +:1077A20051F01A9581F01A9599F016C004E016D09E +:1077B20001E810E703C011D003E510E7E7E1F2E0CA +:1077C20000831183D8CF06E109D00FE510E7F6CF89 +:1077D20004D005E710E7F2CFD0CF0CE000931A02F5 +:1077E200089527D120D100931D02E1D0212F11232A +:1077F20029F12A95E9F02250F1F0225099F02A95C8 +:1078020049F0225061F02A9581F02A95E1F02A95FB +:10781200E9F023C0003809F44FC00C94833B0038D0 +:10782200E1F7C8C00023C9F71EC00023B1F72DC07D +:10783200033098F744C1033080F70BC1003868F376 +:10784200033858F7C9C0013841F77BC1013051F400 +:10785200FCD0BFD000FD06C0FCCF0E94833B0023BA +:1078620009F41ED008951091E3001078DCD00F7750 +:10787200012B0093E300E9D0ACD000FFFDCF0091D3 +:10788200E30000680093E300089591D0123040F4C1 +:107892000FD010931E02DAD000911E020C94CB3B43 +:1078A2000091EB0001D004C000620093EB00089548 +:1078B2000091E800077FC0C0BA93AA93229700E024 +:1078C2000093190274D0AFD0202F2A9519F02A956F +:1078D200E9F022C002E100931A020FE210E7E7E1A9 +:1078E200F2E0008311839DD008839DD00983E0DFFD +:1078F20000911A0210E02881398102171307A8F4B7 +:107902000F7181F401E00093190211C002E10093AA +:107912001A0201E410E7E3CF0E94CC3B002319F7DF +:107922008ED040C01093190202C020931A027ED05A +:10793200A7E1B2E001C08AD000911A02002309F146 +:1079420048D004FD1EC045D000FD03C042D004FF54 +:10795200FACF10E0012F1395003281F0ED91FC91E6 +:107962001197049133D02D913C912F5F3F4F3C935F +:107972002E93FD0103810A95038361F72AD004FF48 +:10798200DACF00911902013039F423D004FD04C08A +:1079920020D000FFFDCF5AD01CD004FFFDCF46D02F +:1079A20018D00B7F49D02296A991B99108951091D0 +:1079B200F10008957DDF00911E0208D047D009D062 +:1079C2000F773AD006D002FFFDCFBFC00093F1007F +:1079D20008950091E800089524D010911D021058D6 +:1079E20029F01A9589F01A9591F019C061DF00917A +:1079F2001C02ECDF00E0EADF29D0EBDF02FFFDCF63 +:107A020018D0E7DF0F770CC053DF00E0F2CF51D080 +:107A12000F7710E0F801E55EFD4F0081EACF0FD04D +:107A22000BC001D000D00091F1000895D2DF0F7E8B +:107A320003C00091E8000B7F0093E80008950091D5 +:107A4200EB0032DFC6DF077F089532DFC2DF0E7F31 +:107A5200F3CF00911D02002329F00A9509F10A953E +:107A620031F01EC0E0DF0A9561D0D9F41AC061D0AE +:107A7200B9F4D9DF0F7711F416D01BD00093E900C7 +:107A82001091EB0010FF0BC00ED010E01093E90034 +:107A920021E0F801E55EFD4F20834FD003C042D0C4 +:107AA20045D0CFDFC9CF1091EB0010621093EB00ED +:107AB20008951091E800177F1093E800089500914F +:107AC2001D02002311F4AFDF02C0013011F4B7DF51 +:107AD200B3CF023031F52DD019F52091F1002F7777 +:107AE2002093E90023D000FF19C081F01FD000616C +:107AF200DCDE01E010E0422F0E949F3E0093EA008C +:107B020000E00093EA0012D00860CFDE0BD030E034 +:107B1200F901E55EFD4F008310D0DACF03D0D7CF55 +:107B2200BFDE089500E00093E90008950091EB00A4 +:107B3200089579DF3CDF00230895BADE4ADF0E7F25 +:107B4200089583DF46DF02FFFDCF73DF42DF0F7749 +:107B520073CF0091D70001600093D7000E948B3849 +:107B620000E000931F0208950C94BF388A93FA93A1 +:107B7200EA933A922A921A920A927A936A935A93BF +:107B82004A933A932A931A930A938FB70091DA0091 +:107B920000FF24C00091D80000FF20C00EEF009328 +:107BA200DA000091D90000FF11C001E000930D013D +:107BB200ABD0026096D09AD00860A2D00E949B38C7 +:107BC2000091E0000E7F0093E00008C000E0009307 +:107BD2000D0100931E0298D0046083D07FD002FF73 +:107BE20005C084D002FF02C00BEF75D077D000FF32 +:107BF2001BC07CD000FF18C001E000930E016AD0C8 +:107C020083D000626ED00EEF6FD0006179D06ED05B +:107C12000F7D76D00091D80000620093D80009B59C +:107C22000D7F09BD00E009BD59D004FF20C05ED020 +:107C320004FF1DC009B500FD05C00E94EB3809B55F +:107C420000FFFDCF0091D8000F7D0093D80042D0F5 +:107C520000910E01002359F04CD00FEE45D00F7E5B +:107C620052D000643ED042D001604AD042D036D0D9 +:107C720005FF0FC03BD005FF0CC000E000930E01D2 +:107C820035D00F7E3DD00FED2FD00F7D3CD0006858 +:107C920028D024D003FF0DC029D003FF0AC000E082 +:107CA20000931F0207EF17D00E94743B2DD0116082 +:107CB20018D08FBF09911991299139914991599100 +:107CC200699179910990199029903990E991F991E6 +:107CD200899118950FEE0093E10008950091E1005B +:107CE20008951183008308950093E1000091E2005A +:107CF20008950091E200006203D00091E200086062 +:107D02000093E2000895FCDFE0E2F2E000811181DD +:107D1200089500008895FECF01E60DBF02E00EBF78 +:107D2200C2EED2E00E947438002311F00E94D33ECA +:107D32000E9465380E948A3E0C948A3E4A951AF047 +:107D4200000F111FFBCF0895BA92AA929A928A92BB +:107D52007A926A925A924A92BA93AA939A938A937D +:107D62000895BB84AA84998488847F806E805D8014 +:107D72004C80BB81AA8199818881F0E00FB6F8948A +:107D8200CE0FDF1F0FBE089520E006D0E9F7089559 +:107D9200259102D0E9F708952D9301501040202F2C +:107DA200212B089585E890E7FC0105911491FC01CF +:107DB2003296A591B491FC01349625913491422FCB +:107DC200432B19F0F901E4DF01C0DEDF069610E76C +:107DD2008139910748F308952F930CD02F9101D048 +:107DE20008953CD0F12FE02F45E047BFE89536D00B +:107DF20012D0089533D0F12FE02F43E047BFE8952A +:107E02002DD008952BD0F12FE02F43E047BFE89506 +:107E120025D001D0089522D041E147BFE8951EC088 +:107E22001DD0F12FE02F41E247BFC895002D16C0AB +:107E320015D0F12FE02F49E047BFC895002D0EC0A5 +:107E4200F32FE22F012E102E41E047BFE89506C026 +:107E520005D0002E29E027BFE89500C0022E27B7E3 +:107E620020FDFCCF202D0895022E27B726FDFCCF42 +:107E7200202D08950E94A53E22974801C901DA01EA +:107E820010C05BD001E0A00E00E0B01E00E4A0161E +:107E920000E0B00608F440C0830120E030E00E9418 +:107EA200F23E0A2F0B2B09F440C0082F0F7710E087 +:107EB2002C01401A510A320100E4A02E03C00A2FFD +:107EC2000B2BE1F04816590680F0F40101914F01A5 +:107ED2000983119729F001914F010883119711C06D +:107EE200F2013196049108830CC0F20104910983D6 +:107EF2003196E817F907A1F7F401EDCF1BD00883FB +:107F020019839201088119810E94213F16D0AA94F7 +:107F1200B1F62301AA24BB240DD0312F0F3F3F4FCE +:107F220009F4AFCF83011DD0B7CF01E02296ECE078 +:107F32000C94B23E82010C945F3802E0400E00E0E5 +:107F4200501E08959A938A9380E090E08C0109D0A4 +:107F520080589F4F8F3F0FE69007C0F38991999108 +:107F6200089520E030E00C94FB3E00000000000089 +:067F720000000000FC000D +:107FE4000C94ED3E0C94113F0C94193F0C94213FDA +:0C7FF4000C94F23E0C94033F0C94293FC7 +:040000030000700089 +:00000001FF From e653cc198e3a535f23ae33d677115f192979ee55 Mon Sep 17 00:00:00 2001 From: Andrew Kannan Date: Mon, 12 Nov 2018 19:31:22 -0500 Subject: [PATCH 407/505] The "Practice60" Board, Blue Pill powered (#4407) * Starting point for blue pill based practice60 * Changes * add * try raw bin no botloader * swap back to bootloader version * edit * Remove debug LED flash * Disable JTAG to open up B3 and B4 * Add led backlight support (no breathing yet) * Update matrix for correctness * RGB Underglow working in a very simple state * not as bright * Move to handwired * revert ChibiOS_Test changes * Changes based on PR comments * Address PR comments v2 * Move files --- .../boards/GENERIC_STM32_F103/board.c | 56 ++ .../boards/GENERIC_STM32_F103/board.h | 166 ++++++ .../boards/GENERIC_STM32_F103/board.mk | 5 + .../handwired/practice60/bootloader_defs.h | 10 + keyboards/handwired/practice60/chconf.h | 524 ++++++++++++++++++ keyboards/handwired/practice60/config.h | 74 +++ keyboards/handwired/practice60/halconf.h | 353 ++++++++++++ keyboards/handwired/practice60/hsv2rgb.c | 80 +++ keyboards/handwired/practice60/hsv2rgb.h | 23 + .../practice60/keymaps/default/keymap.c | 48 ++ keyboards/handwired/practice60/ld/MKL26Z64.ld | 105 ++++ .../ld/STM32F103x8_stm32duino_bootloader.ld | 88 +++ keyboards/handwired/practice60/led.c | 51 ++ keyboards/handwired/practice60/mcuconf.h | 209 +++++++ keyboards/handwired/practice60/practice60.c | 32 ++ keyboards/handwired/practice60/practice60.h | 18 + keyboards/handwired/practice60/readme.md | 3 + keyboards/handwired/practice60/rules.mk | 56 ++ keyboards/handwired/practice60/underglow.c | 157 ++++++ keyboards/handwired/practice60/underglow.h | 10 + 20 files changed, 2068 insertions(+) create mode 100644 keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.c create mode 100644 keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.h create mode 100644 keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.mk create mode 100644 keyboards/handwired/practice60/bootloader_defs.h create mode 100644 keyboards/handwired/practice60/chconf.h create mode 100644 keyboards/handwired/practice60/config.h create mode 100644 keyboards/handwired/practice60/halconf.h create mode 100644 keyboards/handwired/practice60/hsv2rgb.c create mode 100644 keyboards/handwired/practice60/hsv2rgb.h create mode 100644 keyboards/handwired/practice60/keymaps/default/keymap.c create mode 100644 keyboards/handwired/practice60/ld/MKL26Z64.ld create mode 100644 keyboards/handwired/practice60/ld/STM32F103x8_stm32duino_bootloader.ld create mode 100644 keyboards/handwired/practice60/led.c create mode 100644 keyboards/handwired/practice60/mcuconf.h create mode 100644 keyboards/handwired/practice60/practice60.c create mode 100644 keyboards/handwired/practice60/practice60.h create mode 100644 keyboards/handwired/practice60/readme.md create mode 100644 keyboards/handwired/practice60/rules.mk create mode 100644 keyboards/handwired/practice60/underglow.c create mode 100644 keyboards/handwired/practice60/underglow.h diff --git a/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.c b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.c new file mode 100644 index 000000000000..8c5a87f35f8b --- /dev/null +++ b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.c @@ -0,0 +1,56 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#include "hal.h" + +// Value to place in RTC backup register 10 for persistent bootloader mode +#define RTC_BOOTLOADER_FLAG 0x424C + +/** + * @brief PAL setup. + * @details Digital I/O ports static configuration as defined in @p board.h. + * This variable is used by the HAL when initializing the PAL driver. + */ +#if HAL_USE_PAL || defined(__DOXYGEN__) +const PALConfig pal_default_config = +{ + {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH}, + {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH}, + {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH}, + {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH}, + {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH}, +}; +#endif + +/* + * Early initialization code. + * This initialization must be performed just after stack setup and before + * any other initialization. + */ +void __early_init(void) { + + stm32_clock_init(); +} + +/* + * Board-specific initialization code. + */ +void boardInit(void) { + //JTAG-DP Disabled and SW-DP Enabled + AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE; + //Set backup register DR10 to enter bootloader on reset + BKP->DR10 = RTC_BOOTLOADER_FLAG; +} diff --git a/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.h b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.h new file mode 100644 index 000000000000..9427adabf11d --- /dev/null +++ b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.h @@ -0,0 +1,166 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +/* + * Setup for a Generic STM32F103 board. + */ + +/* + * Board identifier. + */ +#define BOARD_GENERIC_STM32_F103 +#define BOARD_NAME "Generic STM32F103x board" + +/* + * Board frequencies. + */ +#define STM32_LSECLK 32768 +#define STM32_HSECLK 8000000 + +/* + * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h. + */ +#define STM32F103xB + +/* + * IO pins assignments + */ + +/* on-board */ + +#define GPIOA_LED 8 +#define GPIOD_OSC_IN 0 +#define GPIOD_OSC_OUT 1 + +/* In case your board has a "USB enable" hardware + controlled by a pin, define it here. (It could be just + a 1.5k resistor connected to D+ line.) +*/ +/* +#define GPIOB_USB_DISC 10 +*/ + +/* + * I/O ports initial setup, this configuration is established soon after reset + * in the initialization code. + * + * The digits have the following meaning: + * 0 - Analog input. + * 1 - Push Pull output 10MHz. + * 2 - Push Pull output 2MHz. + * 3 - Push Pull output 50MHz. + * 4 - Digital input. + * 5 - Open Drain output 10MHz. + * 6 - Open Drain output 2MHz. + * 7 - Open Drain output 50MHz. + * 8 - Digital input with PullUp or PullDown resistor depending on ODR. + * 9 - Alternate Push Pull output 10MHz. + * A - Alternate Push Pull output 2MHz. + * B - Alternate Push Pull output 50MHz. + * C - Reserved. + * D - Alternate Open Drain output 10MHz. + * E - Alternate Open Drain output 2MHz. + * F - Alternate Open Drain output 50MHz. + * Please refer to the STM32 Reference Manual for details. + */ + +/* + * Port A setup. + * Everything input with pull-up except: + * PA2 - Alternate output (USART2 TX). + * PA3 - Normal input (USART2 RX). + * PA9 - Alternate output (USART1 TX). + * PA10 - Normal input (USART1 RX). + */ +#define VAL_GPIOACRL 0x88884B88 /* PA7...PA0 */ +#define VAL_GPIOACRH 0x888884B8 /* PA15...PA8 */ +#define VAL_GPIOAODR 0xFFFFFFFF + +/* + * Port B setup. + * Everything input with pull-up except: + * PB10 - Push Pull output (USB switch). + */ +#define VAL_GPIOBCRL 0x88888888 /* PB7...PB0 */ +#define VAL_GPIOBCRH 0x88888388 /* PB15...PB8 */ +#define VAL_GPIOBODR 0xFFFFFFFF + +/* + * Port C setup. + * Everything input with pull-up except: + * PC13 - Push Pull output (LED). + */ +#define VAL_GPIOCCRL 0x88888888 /* PC7...PC0 */ +#define VAL_GPIOCCRH 0x88388888 /* PC15...PC8 */ +#define VAL_GPIOCODR 0xFFFFFFFF + +/* + * Port D setup. + * Everything input with pull-up except: + * PD0 - Normal input (XTAL). + * PD1 - Normal input (XTAL). + */ +#define VAL_GPIODCRL 0x88888844 /* PD7...PD0 */ +#define VAL_GPIODCRH 0x88888888 /* PD15...PD8 */ +#define VAL_GPIODODR 0xFFFFFFFF + +/* + * Port E setup. + * Everything input with pull-up except: + */ +#define VAL_GPIOECRL 0x88888888 /* PE7...PE0 */ +#define VAL_GPIOECRH 0x88888888 /* PE15...PE8 */ +#define VAL_GPIOEODR 0xFFFFFFFF + +/* + * USB bus activation macro, required by the USB driver. + */ +/* The point is that most of the generic STM32F103* boards + have a 1.5k resistor connected on one end to the D+ line + and on the other end to some pin. Or even a slightly more + complicated "USB enable" circuit, controlled by a pin. + That should go here. + + However on some boards (e.g. one that I have), there's no + such hardware. In which case it's better to not do anything. +*/ +/* +#define usb_lld_connect_bus(usbp) palClearPad(GPIOB, GPIOB_USB_DISC) +*/ +#define usb_lld_connect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_INPUT); + +/* + * USB bus de-activation macro, required by the USB driver. + */ +/* +#define usb_lld_disconnect_bus(usbp) palSetPad(GPIOB, GPIOB_USB_DISC) +*/ +#define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12); + +#if !defined(_FROM_ASM_) +#ifdef __cplusplus +extern "C" { +#endif + void boardInit(void); +#ifdef __cplusplus +} +#endif +#endif /* _FROM_ASM_ */ + +#endif /* _BOARD_H_ */ diff --git a/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.mk b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.mk new file mode 100644 index 000000000000..6b8b312fd9fd --- /dev/null +++ b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.mk @@ -0,0 +1,5 @@ +# List of all the board related files. +BOARDSRC = $(BOARD_PATH)/boards/GENERIC_STM32_F103/board.c + +# Required include directories +BOARDINC = $(BOARD_PATH)/boards/GENERIC_STM32_F103 diff --git a/keyboards/handwired/practice60/bootloader_defs.h b/keyboards/handwired/practice60/bootloader_defs.h new file mode 100644 index 000000000000..0f45203cb613 --- /dev/null +++ b/keyboards/handwired/practice60/bootloader_defs.h @@ -0,0 +1,10 @@ +/* Address for jumping to bootloader on STM32 chips. */ +/* It is chip dependent, the correct number can be looked up here (page 175): + * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf + * This also requires a patch to chibios: + * /tmk_core/tool/chibios/ch-bootloader-jump.patch + */ + +// STM32F103* does NOT have an USB bootloader in ROM (only serial), +// so setting anything here does not make much sense +// #define STM32_BOOTLOADER_ADDRESS 0x1FFFC800 diff --git a/keyboards/handwired/practice60/chconf.h b/keyboards/handwired/practice60/chconf.h new file mode 100644 index 000000000000..dfb1f9dfb9e6 --- /dev/null +++ b/keyboards/handwired/practice60/chconf.h @@ -0,0 +1,524 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/chconf.h + * @brief Configuration file template. + * @details A copy of this file must be placed in each project directory, it + * contains the application specific kernel settings. + * + * @addtogroup config + * @details Kernel related settings and hooks. + * @{ + */ + +#ifndef CHCONF_H +#define CHCONF_H + +#define _CHIBIOS_RT_CONF_ + +/*===========================================================================*/ +/** + * @name System timers settings + * @{ + */ +/*===========================================================================*/ + +/** + * @brief System time counter resolution. + * @note Allowed values are 16 or 32 bits. + */ +#define CH_CFG_ST_RESOLUTION 16 + +/** + * @brief System tick frequency. + * @details Frequency of the system timer that drives the system ticks. This + * setting also defines the system tick time unit. + */ +#define CH_CFG_ST_FREQUENCY 2000 + +/** + * @brief Time delta constant for the tick-less mode. + * @note If this value is zero then the system uses the classic + * periodic tick. This value represents the minimum number + * of ticks that is safe to specify in a timeout directive. + * The value one is not valid, timeouts are rounded up to + * this value. + */ +#define CH_CFG_ST_TIMEDELTA 2 + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel parameters and options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Round robin interval. + * @details This constant is the number of system ticks allowed for the + * threads before preemption occurs. Setting this value to zero + * disables the preemption for threads with equal priority and the + * round robin becomes cooperative. Note that higher priority + * threads can still preempt, the kernel is always preemptive. + * @note Disabling the round robin preemption makes the kernel more compact + * and generally faster. + * @note The round robin preemption is not supported in tickless mode and + * must be set to zero in that case. + */ +#define CH_CFG_TIME_QUANTUM 0 + +/** + * @brief Managed RAM size. + * @details Size of the RAM area to be managed by the OS. If set to zero + * then the whole available RAM is used. The core memory is made + * available to the heap allocator and/or can be used directly through + * the simplified core memory allocator. + * + * @note In order to let the OS manage the whole RAM the linker script must + * provide the @p __heap_base__ and @p __heap_end__ symbols. + * @note Requires @p CH_CFG_USE_MEMCORE. + */ +#define CH_CFG_MEMCORE_SIZE 0 + +/** + * @brief Idle thread automatic spawn suppression. + * @details When this option is activated the function @p chSysInit() + * does not spawn the idle thread. The application @p main() + * function becomes the idle thread and must implement an + * infinite loop. + */ +#define CH_CFG_NO_IDLE_THREAD FALSE + +/* Use __WFI in the idle thread for waiting. Does lower the power + * consumption. */ +#define CORTEX_ENABLE_WFI_IDLE TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Performance options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief OS optimization. + * @details If enabled then time efficient rather than space efficient code + * is used when two possible implementations exist. + * + * @note This is not related to the compiler optimization options. + * @note The default is @p TRUE. + */ +#define CH_CFG_OPTIMIZE_SPEED TRUE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Subsystem options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Time Measurement APIs. + * @details If enabled then the time measurement APIs are included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_TM FALSE + +/** + * @brief Threads registry APIs. + * @details If enabled then the registry APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_REGISTRY TRUE + +/** + * @brief Threads synchronization APIs. + * @details If enabled then the @p chThdWait() function is included in + * the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_WAITEXIT TRUE + +/** + * @brief Semaphores APIs. + * @details If enabled then the Semaphores APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_SEMAPHORES TRUE + +/** + * @brief Semaphores queuing mode. + * @details If enabled then the threads are enqueued on semaphores by + * priority rather than in FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE + +/** + * @brief Mutexes APIs. + * @details If enabled then the mutexes APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MUTEXES TRUE + +/** + * @brief Enables recursive behavior on mutexes. + * @note Recursive mutexes are heavier and have an increased + * memory footprint. + * + * @note The default is @p FALSE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE + +/** + * @brief Conditional Variables APIs. + * @details If enabled then the conditional variables APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MUTEXES. + */ +#define CH_CFG_USE_CONDVARS TRUE + +/** + * @brief Conditional Variables APIs with timeout. + * @details If enabled then the conditional variables APIs with timeout + * specification are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_CONDVARS. + */ +#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE + +/** + * @brief Events Flags APIs. + * @details If enabled then the event flags APIs are included in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_EVENTS TRUE + +/** + * @brief Events Flags APIs with timeout. + * @details If enabled then the events APIs with timeout specification + * are included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_EVENTS. + */ +#define CH_CFG_USE_EVENTS_TIMEOUT TRUE + +/** + * @brief Synchronous Messages APIs. + * @details If enabled then the synchronous messages APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MESSAGES TRUE + +/** + * @brief Synchronous Messages queuing mode. + * @details If enabled then messages are served by priority rather than in + * FIFO order. + * + * @note The default is @p FALSE. Enable this if you have special + * requirements. + * @note Requires @p CH_CFG_USE_MESSAGES. + */ +#define CH_CFG_USE_MESSAGES_PRIORITY FALSE + +/** + * @brief Mailboxes APIs. + * @details If enabled then the asynchronous messages (mailboxes) APIs are + * included in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_SEMAPHORES. + */ +#define CH_CFG_USE_MAILBOXES TRUE + +/** + * @brief Core Memory Manager APIs. + * @details If enabled then the core memory manager APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMCORE TRUE + +/** + * @brief Heap Allocator APIs. + * @details If enabled then the memory heap allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or + * @p CH_CFG_USE_SEMAPHORES. + * @note Mutexes are recommended. + */ +#define CH_CFG_USE_HEAP TRUE + +/** + * @brief Memory Pools Allocator APIs. + * @details If enabled then the memory pools allocator APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + */ +#define CH_CFG_USE_MEMPOOLS FALSE + +/** + * @brief Dynamic Threads APIs. + * @details If enabled then the dynamic threads creation APIs are included + * in the kernel. + * + * @note The default is @p TRUE. + * @note Requires @p CH_CFG_USE_WAITEXIT. + * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS. + */ +#define CH_CFG_USE_DYNAMIC FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Debug options + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Debug option, kernel statistics. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_STATISTICS FALSE + +/** + * @brief Debug option, system state check. + * @details If enabled the correct call protocol for system APIs is checked + * at runtime. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_SYSTEM_STATE_CHECK FALSE + +/** + * @brief Debug option, parameters checks. + * @details If enabled then the checks on the API functions input + * parameters are activated. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_CHECKS FALSE + +/** + * @brief Debug option, consistency checks. + * @details If enabled then all the assertions in the kernel code are + * activated. This includes consistency checks inside the kernel, + * runtime anomalies and port-defined checks. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_ENABLE_ASSERTS FALSE + +/** + * @brief Debug option, trace buffer. + * @details If enabled then the trace buffer is activated. + * + * @note The default is @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED + +/** + * @brief Trace buffer entries. + * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is + * different from @p CH_DBG_TRACE_MASK_DISABLED. + */ +#define CH_DBG_TRACE_BUFFER_SIZE 128 + +/** + * @brief Debug option, stack checks. + * @details If enabled then a runtime stack check is performed. + * + * @note The default is @p FALSE. + * @note The stack check is performed in a architecture/port dependent way. + * It may not be implemented or some ports. + * @note The default failure mode is to halt the system with the global + * @p panic_msg variable set to @p NULL. + */ +#define CH_DBG_ENABLE_STACK_CHECK FALSE + +/** + * @brief Debug option, stacks initialization. + * @details If enabled then the threads working area is filled with a byte + * value when a thread is created. This can be useful for the + * runtime measurement of the used stack. + * + * @note The default is @p FALSE. + */ +#define CH_DBG_FILL_THREADS FALSE + +/** + * @brief Debug option, threads profiling. + * @details If enabled then a field is added to the @p thread_t structure that + * counts the system ticks occurred while executing the thread. + * + * @note The default is @p FALSE. + * @note This debug option is not currently compatible with the + * tickless mode. + */ +#define CH_DBG_THREADS_PROFILING FALSE + +/** @} */ + +/*===========================================================================*/ +/** + * @name Kernel hooks + * @{ + */ +/*===========================================================================*/ + +/** + * @brief Threads descriptor structure extension. + * @details User fields added to the end of the @p thread_t structure. + */ +#define CH_CFG_THREAD_EXTRA_FIELDS \ + /* Add threads custom fields here.*/ + +/** + * @brief Threads initialization hook. + * @details User initialization code added to the @p chThdInit() API. + * + * @note It is invoked from within @p chThdInit() and implicitly from all + * the threads creation APIs. + */ +#define CH_CFG_THREAD_INIT_HOOK(tp) { \ + /* Add threads initialization code here.*/ \ +} + +/** + * @brief Threads finalization hook. + * @details User finalization code added to the @p chThdExit() API. + */ +#define CH_CFG_THREAD_EXIT_HOOK(tp) { \ + /* Add threads finalization code here.*/ \ +} + +/** + * @brief Context switch hook. + * @details This hook is invoked just before switching between threads. + */ +#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \ + /* Context switch code here.*/ \ +} + +/** + * @brief ISR enter hook. + */ +#define CH_CFG_IRQ_PROLOGUE_HOOK() { \ + /* IRQ prologue code here.*/ \ +} + +/** + * @brief ISR exit hook. + */ +#define CH_CFG_IRQ_EPILOGUE_HOOK() { \ + /* IRQ epilogue code here.*/ \ +} + +/** + * @brief Idle thread enter hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to activate a power saving mode. + */ +#define CH_CFG_IDLE_ENTER_HOOK() { \ + /* Idle-enter code here.*/ \ +} + +/** + * @brief Idle thread leave hook. + * @note This hook is invoked within a critical zone, no OS functions + * should be invoked from here. + * @note This macro can be used to deactivate a power saving mode. + */ +#define CH_CFG_IDLE_LEAVE_HOOK() { \ + /* Idle-leave code here.*/ \ +} + +/** + * @brief Idle Loop hook. + * @details This hook is continuously invoked by the idle thread loop. + */ +#define CH_CFG_IDLE_LOOP_HOOK() { \ + /* Idle loop code here.*/ \ +} + +/** + * @brief System tick event hook. + * @details This hook is invoked in the system tick handler immediately + * after processing the virtual timers queue. + */ +#define CH_CFG_SYSTEM_TICK_HOOK() { \ + /* System tick event code here.*/ \ +} + +/** + * @brief System halt hook. + * @details This hook is invoked in case to a system halting error before + * the system is halted. + */ +#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \ + /* System halt code here.*/ \ +} + +/** + * @brief Trace hook. + * @details This hook is invoked each time a new record is written in the + * trace buffer. + */ +#define CH_CFG_TRACE_HOOK(tep) { \ + /* Trace code here.*/ \ +} + +/** @} */ + +/*===========================================================================*/ +/* Port-specific settings (override port settings defaulted in chcore.h). */ +/*===========================================================================*/ + +#endif /* CHCONF_H */ + +/** @} */ diff --git a/keyboards/handwired/practice60/config.h b/keyboards/handwired/practice60/config.h new file mode 100644 index 000000000000..31ddd77d1776 --- /dev/null +++ b/keyboards/handwired/practice60/config.h @@ -0,0 +1,74 @@ +/* +Copyright 2015 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 . +*/ + +#pragma once + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6464 +#define DEVICE_VER 0x0001 +/* in python2: list(u"whatever".encode('utf-16-le')) */ +/* at most 32 characters or the ugly hack in usb_main.c borks */ +#define MANUFACTURER QMK +#define PRODUCT Practice 60 +#define DESCRIPTION Practice 60 + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 14 + +#define MATRIX_COL_PINS { B11, B10, B1, B0, A7, A6, A5, A4, A3, A2, A1, A0, C15, C14 } +#define MATRIX_ROW_PINS { B3, B4, B5, B6, B7 } +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_LEVELS 1 + +/* define if matrix has ghost */ +//#define MATRIX_HAS_GHOST + +/* Set 0 if debouncing isn't needed */ +#define DEBOUNCE 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 diff --git a/keyboards/handwired/practice60/halconf.h b/keyboards/handwired/practice60/halconf.h new file mode 100644 index 000000000000..5fba285a380d --- /dev/null +++ b/keyboards/handwired/practice60/halconf.h @@ -0,0 +1,353 @@ +/* + ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file templates/halconf.h + * @brief HAL configuration header. + * @details HAL configuration file, this file allows to enable or disable the + * various device drivers from your application. You may also use + * this file in order to override the device drivers default settings. + * + * @addtogroup HAL_CONF + * @{ + */ + +#ifndef _HALCONF_H_ +#define _HALCONF_H_ + +#include "mcuconf.h" + +/** + * @brief Enables the PAL subsystem. + */ +#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__) +#define HAL_USE_PAL TRUE +#endif + +/** + * @brief Enables the ADC subsystem. + */ +#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__) +#define HAL_USE_ADC FALSE +#endif + +/** + * @brief Enables the CAN subsystem. + */ +#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__) +#define HAL_USE_CAN FALSE +#endif + +/** + * @brief Enables the DAC subsystem. + */ +#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__) +#define HAL_USE_DAC FALSE +#endif + +/** + * @brief Enables the EXT subsystem. + */ +#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__) +#define HAL_USE_EXT FALSE +#endif + +/** + * @brief Enables the GPT subsystem. + */ +#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__) +#define HAL_USE_GPT FALSE +#endif + +/** + * @brief Enables the I2C subsystem. + */ +#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__) +#define HAL_USE_I2C FALSE +#endif + +/** + * @brief Enables the I2S subsystem. + */ +#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__) +#define HAL_USE_I2S FALSE +#endif + +/** + * @brief Enables the ICU subsystem. + */ +#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__) +#define HAL_USE_ICU FALSE +#endif + +/** + * @brief Enables the MAC subsystem. + */ +#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__) +#define HAL_USE_MAC FALSE +#endif + +/** + * @brief Enables the MMC_SPI subsystem. + */ +#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__) +#define HAL_USE_MMC_SPI FALSE +#endif + +/** + * @brief Enables the PWM subsystem. + */ +#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__) +#define HAL_USE_PWM FALSE +#endif + +/** + * @brief Enables the RTC subsystem. + */ +#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__) +#define HAL_USE_RTC FALSE +#endif + +/** + * @brief Enables the SDC subsystem. + */ +#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__) +#define HAL_USE_SDC FALSE +#endif + +/** + * @brief Enables the SERIAL subsystem. + */ +#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL FALSE +#endif + +/** + * @brief Enables the SERIAL over USB subsystem. + */ +#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__) +#define HAL_USE_SERIAL_USB FALSE +#endif + +/** + * @brief Enables the SPI subsystem. + */ +#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__) +#define HAL_USE_SPI TRUE +#endif + +/** + * @brief Enables the UART subsystem. + */ +#if !defined(HAL_USE_UART) || defined(__DOXYGEN__) +#define HAL_USE_UART FALSE +#endif + +/** + * @brief Enables the USB subsystem. + */ +#if !defined(HAL_USE_USB) || defined(__DOXYGEN__) +#define HAL_USE_USB TRUE +#endif + +/** + * @brief Enables the WDG subsystem. + */ +#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__) +#define HAL_USE_WDG FALSE +#endif + +/*===========================================================================*/ +/* ADC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__) +#define ADC_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define ADC_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* CAN driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Sleep mode related APIs inclusion switch. + */ +#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__) +#define CAN_USE_SLEEP_MODE TRUE +#endif + +/*===========================================================================*/ +/* I2C driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables the mutual exclusion APIs on the I2C bus. + */ +#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define I2C_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* MAC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__) +#define MAC_USE_ZERO_COPY FALSE +#endif + +/** + * @brief Enables an event sources for incoming packets. + */ +#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__) +#define MAC_USE_EVENTS TRUE +#endif + +/*===========================================================================*/ +/* MMC_SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + * This option is recommended also if the SPI driver does not + * use a DMA channel and heavily loads the CPU. + */ +#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__) +#define MMC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SDC driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Number of initialization attempts before rejecting the card. + * @note Attempts are performed at 10mS intervals. + */ +#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__) +#define SDC_INIT_RETRY 100 +#endif + +/** + * @brief Include support for MMC cards. + * @note MMC support is not yet implemented so this option must be kept + * at @p FALSE. + */ +#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__) +#define SDC_MMC_SUPPORT FALSE +#endif + +/** + * @brief Delays insertions. + * @details If enabled this options inserts delays into the MMC waiting + * routines releasing some extra CPU time for the threads with + * lower priority, this may slow down the driver a bit however. + */ +#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__) +#define SDC_NICE_WAITING TRUE +#endif + +/*===========================================================================*/ +/* SERIAL driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Default bit rate. + * @details Configuration parameter, this is the baud rate selected for the + * default configuration. + */ +#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__) +#define SERIAL_DEFAULT_BITRATE 38400 +#endif + +/** + * @brief Serial buffers size. + * @details Configuration parameter, you can change the depth of the queue + * buffers depending on the requirements of your application. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_BUFFERS_SIZE 16 +#endif + +/*===========================================================================*/ +/* SERIAL_USB driver related setting. */ +/*===========================================================================*/ + +/** + * @brief Serial over USB buffers size. + * @details Configuration parameter, the buffer size must be a multiple of + * the USB data endpoint maximum packet size. + * @note The default is 64 bytes for both the transmission and receive + * buffers. + */ +#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__) +#define SERIAL_USB_BUFFERS_SIZE 1 +#endif + +/*===========================================================================*/ +/* SPI driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__) +#define SPI_USE_WAIT TRUE +#endif + +/** + * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__) +#define SPI_USE_MUTUAL_EXCLUSION TRUE +#endif + +/*===========================================================================*/ +/* USB driver related settings. */ +/*===========================================================================*/ + +/** + * @brief Enables synchronous APIs. + * @note Disabling this option saves both code and data space. + */ +#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__) +#define USB_USE_WAIT TRUE +#endif + +#endif /* _HALCONF_H_ */ + +/** @} */ diff --git a/keyboards/handwired/practice60/hsv2rgb.c b/keyboards/handwired/practice60/hsv2rgb.c new file mode 100644 index 000000000000..adb7af8fa57e --- /dev/null +++ b/keyboards/handwired/practice60/hsv2rgb.c @@ -0,0 +1,80 @@ +/* hsv2rgb.c + * Integer only conversion functions between HSV and RGB + */ + +#include "hsv2rgb.h" + +// TODO fix these buggy macros +#define max(x,y) ((x>y) ? x:y) +#define min(x,y) ((x>y) ? y:x) +#define min3(x,y,z) (min(min(x,y),z)) +#define max3(x,y,z) (max(max(x,y),z)) + + +rgb_color hsv2rgb(hsv_color hsv) +{ + // From : http://qscribble.blogspot.fr/2008/06/integer-conversion-from-hsl-to-rgb.html + int h = hsv.h; + int s = hsv.s; + int v = hsv.v; + rgb_color rgb = {0, 0, 0}; + + if (v == 0) + return rgb; + + // sextant = 0 .. 5 + int sextant = (h*6)/256; + // f = 0 .. 42 + int f = h - (sextant*256)/6; + + int p = (v * (256 - s))/256; + int q = (v * (256*43 - s*f))/(256*43); + int t = (v * (256*43 - s*(43-f)))/(256*43); + + // Corrige les erreurs dues aux arrondis + p = max(min(p, 255), 0); + q = max(min(q, 255), 0); + t = max(min(t, 255), 0); + + switch(sextant){ + case 0: rgb.r = v; rgb.g = t; rgb.b = p; break; + case 1: rgb.r = q; rgb.g = v; rgb.b = p; break; + case 2: rgb.r = p; rgb.g = v; rgb.b = t; break; + case 3: rgb.r = p; rgb.g = q; rgb.b = v; break; + case 4: rgb.r = t; rgb.g = p; rgb.b = v; break; + default:rgb.r = v; rgb.g = p; rgb.b = q; break; + } + return rgb; +} + + +hsv_color rgb2hsv(rgb_color rgb) +{ + // From : http://www.ruinelli.ch/rgb-to-hsv + hsv_color hsv = {0, 0, 0}; + int min, max, delta; + + min = min3(rgb.r, rgb.g, rgb.b); + max = max3(rgb.r, rgb.g, rgb.b); + + if(max==0) { + hsv.h = 0; + hsv.s = 0; + hsv.v = 0; + return hsv; + } + + hsv.v = max; + delta = max - min; + + hsv.s = (delta)*255 / max; + + if(rgb.r == max) + hsv.h = (rgb.g - rgb.b)*42/delta; // between yellow & magenta + else if(rgb.g == max) + hsv.h = 120 + (rgb.b - rgb.r)*42/delta; // between cyan & yellow + else + hsv.h = 240 + (rgb.r - rgb.g)*42/delta; // between magenta & cyan + + return hsv; +} \ No newline at end of file diff --git a/keyboards/handwired/practice60/hsv2rgb.h b/keyboards/handwired/practice60/hsv2rgb.h new file mode 100644 index 000000000000..99566c32c07e --- /dev/null +++ b/keyboards/handwired/practice60/hsv2rgb.h @@ -0,0 +1,23 @@ +/* hsv2rgb.h + * Convert Hue Saturation Value to Red Green Blue + * + * Programme de convertion d'une information HSV en RGB + */ +#ifndef HSV2RGB_H +#define HSV2RGB_H + +typedef struct { + unsigned char h; + unsigned char s; + unsigned char v; +} hsv_color; + +typedef struct { + unsigned char r; + unsigned char g; + unsigned char b; +} rgb_color; + +rgb_color hsv2rgb(hsv_color hsv); + +#endif \ No newline at end of file diff --git a/keyboards/handwired/practice60/keymaps/default/keymap.c b/keyboards/handwired/practice60/keymaps/default/keymap.c new file mode 100644 index 000000000000..e15cd223077b --- /dev/null +++ b/keyboards/handwired/practice60/keymaps/default/keymap.c @@ -0,0 +1,48 @@ +/* +Copyright 2012,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 . +*/ +#include QMK_KEYBOARD_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 _BASE 0 +#define _FN1 1 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_60_ansi( + KC_GESC, 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 , MO(_FN1) , KC_RCTL + ), + + [_FN1] = LAYOUT_60_ansi( + KC_GESC, 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_BSPC, \ + RGB_TOG, RGB_MOD, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,\ + BL_INC, BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + KC_GRV, _______, _______, _______, _______, _______, _______, _______ + ) +}; diff --git a/keyboards/handwired/practice60/ld/MKL26Z64.ld b/keyboards/handwired/practice60/ld/MKL26Z64.ld new file mode 100644 index 000000000000..c4ca8b874cca --- /dev/null +++ b/keyboards/handwired/practice60/ld/MKL26Z64.ld @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2013-2016 Fabio Utzig, http://fabioutzig.com + * (C) 2016 flabbergast + * + * 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 to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* + * KL26Z64 memory setup. + */ +MEMORY +{ + flash0 : org = 0x00000000, len = 0x100 + flash1 : org = 0x00000400, len = 0x10 + flash2 : org = 0x00000410, len = 62k - 0x410 + flash3 : org = 0x0000F800, len = 2k + flash4 : org = 0x00000000, len = 0 + flash5 : org = 0x00000000, len = 0 + flash6 : org = 0x00000000, len = 0 + flash7 : org = 0x00000000, len = 0 + ram0 : org = 0x1FFFF800, len = 8k + ram1 : org = 0x00000000, len = 0 + ram2 : org = 0x00000000, len = 0 + ram3 : org = 0x00000000, len = 0 + ram4 : org = 0x00000000, len = 0 + ram5 : org = 0x00000000, len = 0 + ram6 : org = 0x00000000, len = 0 + ram7 : org = 0x00000000, len = 0 +} + +/* Flash region for the configuration bytes.*/ +SECTIONS +{ + .cfmprotect : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.cfmconfig)) + } > flash1 +} + +/* For each data/text section two region are defined, a virtual region + and a load region (_LMA suffix).*/ + +/* Flash region to be used for exception vectors.*/ +REGION_ALIAS("VECTORS_FLASH", flash0); +REGION_ALIAS("VECTORS_FLASH_LMA", flash0); + +/* Flash region to be used for constructors and destructors.*/ +REGION_ALIAS("XTORS_FLASH", flash2); +REGION_ALIAS("XTORS_FLASH_LMA", flash2); + +/* Flash region to be used for code text.*/ +REGION_ALIAS("TEXT_FLASH", flash2); +REGION_ALIAS("TEXT_FLASH_LMA", flash2); + +/* Flash region to be used for read only data.*/ +REGION_ALIAS("RODATA_FLASH", flash2); +REGION_ALIAS("RODATA_FLASH_LMA", flash2); + +/* Flash region to be used for various.*/ +REGION_ALIAS("VARIOUS_FLASH", flash2); +REGION_ALIAS("VARIOUS_FLASH_LMA", flash2); + +/* Flash region to be used for RAM(n) initialization data.*/ +REGION_ALIAS("RAM_INIT_FLASH_LMA", flash2); + +/* RAM region to be used for Main stack. This stack accommodates the processing + of all exceptions and interrupts.*/ +REGION_ALIAS("MAIN_STACK_RAM", ram0); + +/* RAM region to be used for the process stack. This is the stack used by + the main() function.*/ +REGION_ALIAS("PROCESS_STACK_RAM", ram0); + +/* RAM region to be used for data segment.*/ +REGION_ALIAS("DATA_RAM", ram0); +REGION_ALIAS("DATA_RAM_LMA", flash2); + +/* RAM region to be used for BSS segment.*/ +REGION_ALIAS("BSS_RAM", ram0); + +/* RAM region to be used for the default heap.*/ +REGION_ALIAS("HEAP_RAM", ram0); + +__eeprom_workarea_start__ = ORIGIN(flash3); +__eeprom_workarea_size__ = LENGTH(flash3); +__eeprom_workarea_end__ = __eeprom_workarea_start__ + __eeprom_workarea_size__; + +/* Generic rules inclusion.*/ +INCLUDE rules.ld diff --git a/keyboards/handwired/practice60/ld/STM32F103x8_stm32duino_bootloader.ld b/keyboards/handwired/practice60/ld/STM32F103x8_stm32duino_bootloader.ld new file mode 100644 index 000000000000..d0688ef60164 --- /dev/null +++ b/keyboards/handwired/practice60/ld/STM32F103x8_stm32duino_bootloader.ld @@ -0,0 +1,88 @@ +/* + ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/* + * ST32F103xB memory setup for use with the maplemini bootloader. + * You will have to + * #define CORTEX_VTOR_INIT 0x5000 + * in your projects chconf.h + */ +MEMORY +{ + flash0 : org = 0x08002000, len = 64k - 0x2000 + flash1 : org = 0x00000000, len = 0 + flash2 : org = 0x00000000, len = 0 + flash3 : org = 0x00000000, len = 0 + flash4 : org = 0x00000000, len = 0 + flash5 : org = 0x00000000, len = 0 + flash6 : org = 0x00000000, len = 0 + flash7 : org = 0x00000000, len = 0 + ram0 : org = 0x20000000, len = 20k + ram1 : org = 0x00000000, len = 0 + ram2 : org = 0x00000000, len = 0 + ram3 : org = 0x00000000, len = 0 + ram4 : org = 0x00000000, len = 0 + ram5 : org = 0x00000000, len = 0 + ram6 : org = 0x00000000, len = 0 + ram7 : org = 0x00000000, len = 0 +} + +/* For each data/text section two region are defined, a virtual region + and a load region (_LMA suffix).*/ + +/* Flash region to be used for exception vectors.*/ +REGION_ALIAS("VECTORS_FLASH", flash0); +REGION_ALIAS("VECTORS_FLASH_LMA", flash0); + +/* Flash region to be used for constructors and destructors.*/ +REGION_ALIAS("XTORS_FLASH", flash0); +REGION_ALIAS("XTORS_FLASH_LMA", flash0); + +/* Flash region to be used for code text.*/ +REGION_ALIAS("TEXT_FLASH", flash0); +REGION_ALIAS("TEXT_FLASH_LMA", flash0); + +/* Flash region to be used for read only data.*/ +REGION_ALIAS("RODATA_FLASH", flash0); +REGION_ALIAS("RODATA_FLASH_LMA", flash0); + +/* Flash region to be used for various.*/ +REGION_ALIAS("VARIOUS_FLASH", flash0); +REGION_ALIAS("VARIOUS_FLASH_LMA", flash0); + +/* Flash region to be used for RAM(n) initialization data.*/ +REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0); + +/* RAM region to be used for Main stack. This stack accommodates the processing + of all exceptions and interrupts.*/ +REGION_ALIAS("MAIN_STACK_RAM", ram0); + +/* RAM region to be used for the process stack. This is the stack used by + the main() function.*/ +REGION_ALIAS("PROCESS_STACK_RAM", ram0); + +/* RAM region to be used for data segment.*/ +REGION_ALIAS("DATA_RAM", ram0); +REGION_ALIAS("DATA_RAM_LMA", flash0); + +/* RAM region to be used for BSS segment.*/ +REGION_ALIAS("BSS_RAM", ram0); + +/* RAM region to be used for the default heap.*/ +REGION_ALIAS("HEAP_RAM", ram0); + +/* Generic rules inclusion.*/ +INCLUDE rules.ld diff --git a/keyboards/handwired/practice60/led.c b/keyboards/handwired/practice60/led.c new file mode 100644 index 000000000000..f15baed169d4 --- /dev/null +++ b/keyboards/handwired/practice60/led.c @@ -0,0 +1,51 @@ +/* +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 . +*/ + +#include "hal.h" +#include "backlight.h" +#include "led.h" +#include "printf.h" + +void backlight_init_ports(void) { + printf("backlight_init_ports()\n"); + #ifdef BACKLIGHT_ENABLE + palSetPadMode(GPIOA, 8, PAL_MODE_OUTPUT_PUSHPULL); + palSetPad(GPIOA, 8); + #endif +} + +void backlight_set(uint8_t level) { + printf("backlight_set(%d)\n", level); + #ifdef BACKLIGHT_ENABLE + if (level == 0) { + // Turn backlight off + palSetPad(GPIOA, 8); + } else { + // Turn backlight on + palClearPad(GPIOA, 8); + } + #endif +} + +void led_set(uint8_t usb_led) +{ + if (usb_led & (1</os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES) +MCU_FAMILY = STM32 +MCU_SERIES = STM32F1xx +# linker script to use +# it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/ +# or /ld/ +# startup code to use +# is should exist in /os/common/ports/ARMCMx/compilers/GCC/mk/ +MCU_STARTUP = stm32f1xx +# it should exist either in /os/hal/boards/ +# or /boards +# Cortex version +# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4 +MCU = cortex-m3 +# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7 +ARMV = 7 +# If you want to be able to jump to bootloader from firmware on STM32 MCUs, +# set the correct BOOTLOADER_ADDRESS. Either set it here, or define it in +# ./bootloader_defs.h or in ./boards//bootloader_defs.h (if you have +# a custom board definition that you plan to reuse). +# If you're not setting it here, leave it commented out. +# It is chip dependent, the correct number can be looked up here (page 175): +# http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf +# This also requires a patch to chibios: +# /tmk_core/tool/chibios/ch-bootloader-jump.patch +#STM32_BOOTLOADER_ADDRESS = 0x1FFFC800 + + +#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = yes # Console for debug +COMMAND_ENABLE = yes # Commands for debug and configuration +SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = yes + +LAYOUTS = 60_ansi + +DEFAULT_FOLDER = handwired/practice60 diff --git a/keyboards/handwired/practice60/underglow.c b/keyboards/handwired/practice60/underglow.c new file mode 100644 index 000000000000..1383af18985f --- /dev/null +++ b/keyboards/handwired/practice60/underglow.c @@ -0,0 +1,157 @@ +#include "ch.h" +#include "hal.h" + +#include "hsv2rgb.h" +#include "underglow.h" + +#define BYTES_FOR_LED_BYTE 4 +#define NB_COLORS 3 +#define BYTES_FOR_LED BYTES_FOR_LED_BYTE*NB_COLORS +#define DATA_SIZE BYTES_FOR_LED*NB_LEDS +#define RESET_SIZE 200 +#define PREAMBLE_SIZE 4 + +// Define the spi your LEDs are plugged to here +#define LEDS_SPI SPID2 +// Define the number of LEDs you wish to control in your LED strip +#define NB_LEDS 8 + +#define LED_SPIRAL 1 + +static uint8_t txbuf[PREAMBLE_SIZE + DATA_SIZE + RESET_SIZE]; +static uint8_t get_protocol_eq(uint8_t data, int pos); + +/* + * This lib is meant to be used asynchronously, thus the colors contained in + * the txbuf will be sent in loop, so that the colors are always the ones you + * put in the table (the user thus have less to worry about) + * + * Since the data are sent via DMA, and the call to spiSend is a blocking one, + * the processor ressources are not used to much, if you see your program being + * too slow, simply add a: + * chThdSleepMilliseconds(x); + * after the spiSend, where you increment x untill you are satisfied with your + * program speed, another trick may be to lower this thread priority : your call + */ +static THD_WORKING_AREA(LEDS_THREAD_WA, 128); +static THD_FUNCTION(ledsThread, arg) { + (void) arg; + while(1){ + spiSend(&LEDS_SPI, PREAMBLE_SIZE + DATA_SIZE + RESET_SIZE, txbuf); + } +} + +#if LED_SPIRAL +/* + * 'Led spiral' is a simple demo in which we put all the leds to the same + * color, where this color does all the hsv circle in loop. + * If you want to launch the thread that will chage the led colors to the + * appropriate value, simply set LED_SPIRAL to 1. + */ +static THD_WORKING_AREA(HSVTRANS_WA, 128); +static THD_FUNCTION(hsv_transThread, arg){ + (void) arg; + hsv_color color = {0, 255, 127}; + while(1){ + color.h += 1; + color.h %= 256; + set_leds_color_hsv(color); + chThdSleepMilliseconds(50); + } +} +#endif + +static const SPIConfig spicfg = { + NULL, + GPIOB, + 15, + SPI_CR1_BR_1|SPI_CR1_BR_0 // baudrate : fpclk / 8 => 1tick is 0.32us +}; + +/* + * Function used to initialize the driver. + * + * Starts by shutting off all the LEDs. + * Then gets access on the LED_SPI driver. + * May eventually launch an animation on the LEDs (e.g. a thread setting the + * txbuff values) + */ +void leds_init(void){ + for(int i = 0; i < RESET_SIZE; i++) + txbuf[DATA_SIZE+i] = 0x00; + for (int i=0; i Date: Tue, 13 Nov 2018 00:46:01 +0000 Subject: [PATCH 408/505] Fixed incorrect link to feature_combo.md in features.md docs file. Was linked to feature_combos.md, but _sidebar.md, _summary.md, and config_options.md all link to feature_combo.md. Assuming that it should not be pluralized. (#4411) --- docs/features.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features.md b/docs/features.md index 43d972e68961..85f4cf6e0081 100644 --- a/docs/features.md +++ b/docs/features.md @@ -8,7 +8,7 @@ QMK has a staggering number of features for building your keyboard. It can take * [Auto Shift](feature_auto_shift.md) - Tap for the normal key, hold slightly longer for its shifted state. * [Backlight](feature_backlight.md) - LED lighting support for your keyboard. * [Bootmagic](feature_bootmagic.md) - Adjust the behavior of your keyboard using hotkeys. -* [Combos](feature_combos.md) - Custom actions for multiple key holds. +* [Combos](feature_combo.md) - Custom actions for multiple key holds. * [Command](feature_command.md) - Runtime version of bootmagic (Formerly known as "Magic"). * [Dynamic Macros](feature_dynamic_macros.md) - Record and playback macros from the keyboard itself. * [Grave Escape](feature_grave_esc.md) - Lets you use a single key for Esc and Grave. From 9b28dc84889357b9097ece2557c926ffa12a8479 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Mon, 12 Nov 2018 21:46:34 -0800 Subject: [PATCH 409/505] KBDFans KBD67 Support (#4412) * initial commit for kbd67 keyboard * add in a standard matrix * get the correct matrix for layout_all * add a layout_65_ansi LAYOUT macro * get a default keymap in * add caps lock led support * fix formatting of my name in the comments * add QMK Configurator support * turn on bootmagic --- keyboards/kbd67/config.h | 240 ++++++++++++++++++++++ keyboards/kbd67/info.json | 16 ++ keyboards/kbd67/kbd67.c | 51 +++++ keyboards/kbd67/kbd67.h | 59 ++++++ keyboards/kbd67/keymaps/default/config.h | 19 ++ keyboards/kbd67/keymaps/default/keymap.c | 99 +++++++++ keyboards/kbd67/keymaps/default/readme.md | 1 + keyboards/kbd67/readme.md | 15 ++ keyboards/kbd67/rules.mk | 80 ++++++++ 9 files changed, 580 insertions(+) create mode 100644 keyboards/kbd67/config.h create mode 100644 keyboards/kbd67/info.json create mode 100644 keyboards/kbd67/kbd67.c create mode 100644 keyboards/kbd67/kbd67.h create mode 100644 keyboards/kbd67/keymaps/default/config.h create mode 100644 keyboards/kbd67/keymaps/default/keymap.c create mode 100644 keyboards/kbd67/keymaps/default/readme.md create mode 100644 keyboards/kbd67/readme.md create mode 100644 keyboards/kbd67/rules.mk diff --git a/keyboards/kbd67/config.h b/keyboards/kbd67/config.h new file mode 100644 index 000000000000..2e3cf85c3854 --- /dev/null +++ b/keyboards/kbd67/config.h @@ -0,0 +1,240 @@ +/* +Copyright 2018 MechMerlin + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER kbdfans +#define PRODUCT kbd67 +#define DESCRIPTION 65% Keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { D0, D1, D2, D3, D5 } +#define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B7, D4, B1, B0, B5, B4, D7, D6, B3, F4, F5 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +#define BACKLIGHT_PIN B6 +#define BACKLIGHT_BREATHING +#define BACKLIGHT_LEVELS 3 + +#define RGB_DI_PIN E2 +#ifdef RGB_DI_PIN + #define RGBLED_NUM 20 + #define RGBLIGHT_HUE_STEP 8 + #define RGBLIGHT_SAT_STEP 8 + #define RGBLIGHT_VAL_STEP 8 + #define RGBLIGHT_LIMIT_VAL 180 /* The maximum brightness level */ + // #define RGBLIGHT_SLEEP /* If defined, the RGB lighting will be switched off when the host goes to sleep */ +/*== all animations enable ==*/ + #define RGBLIGHT_ANIMATIONS +/*== or choose animations ==*/ + // #define RGBLIGHT_EFFECT_BREATHING + // #define RGBLIGHT_EFFECT_RAINBOW_MOOD + // #define RGBLIGHT_EFFECT_RAINBOW_SWIRL + // #define RGBLIGHT_EFFECT_SNAKE + // #define RGBLIGHT_EFFECT_KNIGHT + // #define RGBLIGHT_EFFECT_CHRISTMAS + // #define RGBLIGHT_EFFECT_STATIC_GRADIENT + // #define RGBLIGHT_EFFECT_RGB_TEST + // #define RGBLIGHT_EFFECT_ALTERNATING +#endif + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 diff --git a/keyboards/kbd67/info.json b/keyboards/kbd67/info.json new file mode 100644 index 000000000000..70a926a7f198 --- /dev/null +++ b/keyboards/kbd67/info.json @@ -0,0 +1,16 @@ +{ + "keyboard_name": "kbd67", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 5, + "layouts": { + "LAYOUT_all": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":15, "y":2}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.75}, {"x":6.5, "y":4, "w":1.25}, {"x":7.75, "y":4, "w":2.25}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}] + }, + + "LAYOUT_65_ansi": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":15, "y":2}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}] + } + } +} diff --git a/keyboards/kbd67/kbd67.c b/keyboards/kbd67/kbd67.c new file mode 100644 index 000000000000..5e0369673b2c --- /dev/null +++ b/keyboards/kbd67/kbd67.c @@ -0,0 +1,51 @@ +/* Copyright 2018 MechMerlin + * + * 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 "kbd67.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 + + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + DDRB |= (1 << 2); + PORTB &= ~(1 << 2); + } else { + DDRB &= ~(1 << 2); + PORTB &= ~(1 << 2); + } + + led_set_user(usb_led); +} diff --git a/keyboards/kbd67/kbd67.h b/keyboards/kbd67/kbd67.h new file mode 100644 index 000000000000..4a98c66f7ae1 --- /dev/null +++ b/keyboards/kbd67/kbd67.h @@ -0,0 +1,59 @@ +/* Copyright 2018 MechMerlin + * + * 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 KBD67_H +#define KBD67_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT_all( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \ + K10, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, \ + K20, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2F, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3E, K3F, \ + K40, K41, K43, K44, K46, K48, K4A, K4B, K4C, K4D, K4E, K4F \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \ + { K10, KC_NO, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \ + { K20, KC_NO, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, KC_NO, K2F }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, K3E, K3F }, \ + { K40, K41, KC_NO, K43, K44, KC_NO, K46, KC_NO, K48, KC_NO, K4A, K4B, K4C, K4D, K4E, K4F }, \ +} + +#define LAYOUT_65_ansi( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0E, K0F, \ + K10, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, \ + K20, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2F, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3E, K3F, \ + K40, K41, K43, K46, K4A, K4B, K4C, K4D, K4E, K4F \ +) \ +{ \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, KC_NO, K0E, K0F }, \ + { K10, KC_NO, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \ + { K20, KC_NO, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, KC_NO, K2F }, \ + { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, K3E, K3F }, \ + { K40, K41, KC_NO, K43, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D, K4E, K4F }, \ +} + +#endif diff --git a/keyboards/kbd67/keymaps/default/config.h b/keyboards/kbd67/keymaps/default/config.h new file mode 100644 index 000000000000..a3ed4f762a6e --- /dev/null +++ b/keyboards/kbd67/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 MechMerlin + * + * 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 + +// place overrides here diff --git a/keyboards/kbd67/keymaps/default/keymap.c b/keyboards/kbd67/keymaps/default/keymap.c new file mode 100644 index 000000000000..89fa9a534d33 --- /dev/null +++ b/keyboards/kbd67/keymaps/default/keymap.c @@ -0,0 +1,99 @@ +/* Copyright 2018 'mechmerlin' + * + * 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 QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +/* Keymap (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| [| ]| \ |Del | + * |----------------------------------------------------------------| + * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return |PgUp| + * |----------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |Alt| FN|Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + */ +[0] = LAYOUT_65_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_HOME, \ + 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_PGUP, \ + 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_PGDN, \ + 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_END, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + /* Keymap Fn Layer + * ,----------------------------------------------------------------. + * | | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |Ins | + * |----------------------------------------------------------------| + * | | |Up | | | | | | | | | | | |Hme | + * |----------------------------------------------------------------| + * | |<- |Dn | ->| | | | | | | | | |End | + * |----------------------------------------------------------------| + * | | | |Bl-|BL |BL+| |VU-|VU+|MUT| | McL|MsU|McR | + * |----------------------------------------------------------------| + * | | | | | | | |MsL|MsD|MsR | + * `----------------------------------------------------------------' + */ +[1] = LAYOUT_65_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_INS, \ + KC_CAPS,_______, KC_UP,_______,_______,_______,_______,_______,KC_PSCR,KC_SLCK,KC_PAUS, KC_UP,_______, _______,_______, \ + _______,KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,_______,_______,KC_HOME,KC_PGUP,KC_LEFT,KC_RGHT, _______,_______, \ + _______,_______,_______,_______,_______,_______,_______,_______, KC_END,KC_PGDN,KC_DOWN, _______,KC_PGUP,_______, \ + _______, _______, _______, _______, _______,_______,_______,KC_HOME,KC_PGDN, KC_END), + +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/kbd67/keymaps/default/readme.md b/keyboards/kbd67/keymaps/default/readme.md new file mode 100644 index 000000000000..2cb43c5e1a3f --- /dev/null +++ b/keyboards/kbd67/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for kbd67 diff --git a/keyboards/kbd67/readme.md b/keyboards/kbd67/readme.md new file mode 100644 index 000000000000..734b1a63aebc --- /dev/null +++ b/keyboards/kbd67/readme.md @@ -0,0 +1,15 @@ +# kbd67 + +![kbd67](imgur.com image replace me!) + +65% keyboard with blocker. + +Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin) +Hardware Supported: KBD67 PCB +Hardware Availability: [KBDFans](https://kbdfans.cn/products/coming-soon-kbd67-mechanical-keyboard-diy-kit) + +Make example for this keyboard (after setting up your build environment): + + make kbd67:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/kbd67/rules.mk b/keyboards/kbd67/rules.mk new file mode 100644 index 000000000000..9d25d7b21ab4 --- /dev/null +++ b/keyboards/kbd67/rules.mk @@ -0,0 +1,80 @@ +# 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 + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = yes # 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 +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From 709bf386f4429687a8ec73ebd29193e5f209461b Mon Sep 17 00:00:00 2001 From: Andrew Kannan Date: Tue, 13 Nov 2018 01:03:48 -0500 Subject: [PATCH 410/505] Update Practice60 to use MT feature and revise system ticks (#4413) * Update Practice60 to use MT feature and revise system tics * Increase system tick frequency 10,000 instead of 10,000 --- keyboards/handwired/practice60/chconf.h | 6 +++--- keyboards/handwired/practice60/keymaps/default/keymap.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/keyboards/handwired/practice60/chconf.h b/keyboards/handwired/practice60/chconf.h index dfb1f9dfb9e6..bbd9b2da62d2 100644 --- a/keyboards/handwired/practice60/chconf.h +++ b/keyboards/handwired/practice60/chconf.h @@ -41,14 +41,14 @@ * @brief System time counter resolution. * @note Allowed values are 16 or 32 bits. */ -#define CH_CFG_ST_RESOLUTION 16 +#define CH_CFG_ST_RESOLUTION 32 /** * @brief System tick frequency. * @details Frequency of the system timer that drives the system ticks. This * setting also defines the system tick time unit. */ -#define CH_CFG_ST_FREQUENCY 2000 +#define CH_CFG_ST_FREQUENCY 100000 /** * @brief Time delta constant for the tick-less mode. @@ -58,7 +58,7 @@ * The value one is not valid, timeouts are rounded up to * this value. */ -#define CH_CFG_ST_TIMEDELTA 2 +#define CH_CFG_ST_TIMEDELTA 0 /** @} */ diff --git a/keyboards/handwired/practice60/keymaps/default/keymap.c b/keyboards/handwired/practice60/keymaps/default/keymap.c index e15cd223077b..afea72b11620 100644 --- a/keyboards/handwired/practice60/keymaps/default/keymap.c +++ b/keyboards/handwired/practice60/keymaps/default/keymap.c @@ -32,7 +32,7 @@ enum custom_keycodes { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = LAYOUT_60_ansi( KC_GESC, 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_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, MT(MOD_LSFT, 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 , MO(_FN1) , KC_RCTL From 7e87532ec261bcc30d7fa5dfc5bf6427e2d3d36e Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Tue, 13 Nov 2018 08:26:55 -0800 Subject: [PATCH 411/505] converter/ibm_terminal Refactor and Configurator support (#4414) * IBM Terminal converter: layout macro refactor - Renamed KEYMAP to LAYOUT - Renamed KEYMAP_101 to LAYOUT_101 - minor matrix array fixes * IBM Terminal converter: default keymap refactor - Updated layout macro names - Updated to #include QMK_KEYBOARD_H - config.h updated to use #pragma once * IBM Terminal converter: priyadi keymap refactor - Updated layout macro names - Updated to #include QMK_KEYBOARD_H - Removed redundant KC_TRNS and KC_NO defines - config.h updated to use #pragma once * IBM Terminal converter: Configurator support * IBM Terminal converter: readme cleanup Updated markdown formatting. * IBM Terminal converter: readme rename Renamed file to fully lowercase. --- keyboards/converter/ibm_terminal/README.md | 40 --- .../converter/ibm_terminal/ibm_terminal.h | 10 +- keyboards/converter/ibm_terminal/info.json | 245 ++++++++++++++++++ .../ibm_terminal/keymaps/default/config.h | 7 +- .../ibm_terminal/keymaps/default/keymap.c | 12 +- .../ibm_terminal/keymaps/priyadi/config.h | 7 +- .../ibm_terminal/keymaps/priyadi/keymap.c | 28 +- keyboards/converter/ibm_terminal/readme.md | 39 +++ 8 files changed, 305 insertions(+), 83 deletions(-) delete mode 100644 keyboards/converter/ibm_terminal/README.md create mode 100644 keyboards/converter/ibm_terminal/info.json create mode 100644 keyboards/converter/ibm_terminal/readme.md diff --git a/keyboards/converter/ibm_terminal/README.md b/keyboards/converter/ibm_terminal/README.md deleted file mode 100644 index dff26e0594f9..000000000000 --- a/keyboards/converter/ibm_terminal/README.md +++ /dev/null @@ -1,40 +0,0 @@ -Keyboard converter for IBM terminal keyboard -============================================ - -This is a port of TMK's converter/terminal_usb to QMK. - -It supports PS/2 Scan Code Set 3 and runs on USB AVR chips such like PJRC Teensy. -I tested the converter on ATMega32U4 with 1392595(102keys) and 6110345(122keys). - -Source code: https://github.com/qmk/qmk_firmware.git -Article: http://geekhack.org/index.php?topic=27272.0 - - -CONNECTION ----------- -Keyboard ATMega32U4 ----------------------- -Data: PD2 -Clock: PD5 - -And VCC and GND, of course. See RESOURCE for keyboard connector pin assign. - - -BUILD ------ -$ git clone https://github.com/qmk/qmk_firmware.git -$ cd qmk_firmware -$ make converter/ibm_terminal:default - - -RESOURCE --------- -Soarer's Converter: http://geekhack.org/index.php?topic=17458.0 -102keys(1392595): http://geekhack.org/index.php?topic=10737.0 -122keys(1390876): http://www.seasip.info/VintagePC/ibm_1390876.html -KbdBabel: http://www.kbdbabel.org/ -RJ45 Connector: http://www.kbdbabel.org/conn/kbd_connector_ibmterm.png -DIN Connector: http://www.kbdbabel.org/conn/kbd_connector_ibm3179_318x_319x.png -WinAVR: http://winavr.sourceforge.net/ - -EOF diff --git a/keyboards/converter/ibm_terminal/ibm_terminal.h b/keyboards/converter/ibm_terminal/ibm_terminal.h index c6468349ca23..adf048206e9b 100644 --- a/keyboards/converter/ibm_terminal/ibm_terminal.h +++ b/keyboards/converter/ibm_terminal/ibm_terminal.h @@ -19,7 +19,7 @@ void matrix_init_user(void); * 17| | * +---------+ */ -#define KEYMAP( \ +#define LAYOUT( \ K08,K10,K18,K20,K28,K30,K38,K40,K48,K50,K57,K5F, \ K07,K0F,K17,K1F,K27,K2F,K37,K3F,K47,K4F,K56,K5E, \ \ @@ -45,13 +45,13 @@ void matrix_init_user(void); { K68, K69, K6A, K6B, K6C, K6D, K6E, K6F }, \ { K70, K71, K72, K73, K74, K75, K76, K77 }, \ { K78, K79, K7A, K7B, K7C, K7D, K7E, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, K83, K84, KC_NO, KC_NO, KC_NO,}, \ + { KC_NO, KC_NO, KC_NO, K83, K84, KC_NO, KC_NO, KC_NO } \ } /* * IBM Terminal keyboard 1399625, 101-key */ -#define KEYMAP_101( \ +#define LAYOUT_101( \ K08, K07,K0F,K17,K1F,K27,K2F,K37,K3F,K47,K4F,K56,K5E, K57,K5F,K62, \ \ K0E,K16,K1E,K26,K25,K2E,K36,K3D,K3E,K46,K45,K4E,K55,K66, K67,K6E,K6F, K76,K77,K7E,K84, \ @@ -76,7 +76,7 @@ void matrix_init_user(void); { KC_NO, K69, K6A, K6B, K6C, K6D, K6E, K6F }, \ { K70, K71, K72, K73, K74, K75, K76, K77 }, \ { KC_NO, K79, K7A, KC_NO, K7C, K7D, K7E, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, KC_NO, K84, KC_NO, KC_NO, KC_NO,}, \ + { KC_NO, KC_NO, KC_NO, KC_NO, K84, KC_NO, KC_NO, KC_NO } \ } -#endif \ No newline at end of file +#endif diff --git a/keyboards/converter/ibm_terminal/info.json b/keyboards/converter/ibm_terminal/info.json new file mode 100644 index 000000000000..f064f3c5bd14 --- /dev/null +++ b/keyboards/converter/ibm_terminal/info.json @@ -0,0 +1,245 @@ +{ + "keyboard_name": "Keyboard converter for IBM terminal keyboard", + "url": "", + "maintainer": "qmk", + "width": 24.75, + "height": 8, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"F13", "x":3.25, "y":0}, + {"label":"F14", "x":4.25, "y":0}, + {"label":"F15", "x":5.25, "y":0}, + {"label":"F16", "x":6.25, "y":0}, + {"label":"F17", "x":7.25, "y":0}, + {"label":"F18", "x":8.25, "y":0}, + {"label":"F19", "x":9.25, "y":0}, + {"label":"F20", "x":10.25, "y":0}, + {"label":"F21", "x":11.25, "y":0}, + {"label":"F22", "x":12.25, "y":0}, + {"label":"F23", "x":13.25, "y":0}, + {"label":"F24", "x":14.25, "y":0}, + {"label":"F1", "x":3.25, "y":1}, + {"label":"F2", "x":4.25, "y":1}, + {"label":"F3", "x":5.25, "y":1}, + {"label":"F4", "x":6.25, "y":1}, + {"label":"F5", "x":7.25, "y":1}, + {"label":"F6", "x":8.25, "y":1}, + {"label":"F7", "x":9.25, "y":1}, + {"label":"F8", "x":10.25, "y":1}, + {"label":"F9", "x":11.25, "y":1}, + {"label":"F10", "x":12.25, "y":1}, + {"label":"F11", "x":13.25, "y":1}, + {"label":"F12", "x":14.25, "y":1}, + {"label":"Print Screen", "x":0, "y":3}, + {"label":"Esc", "x":1, "y":3}, + {"label":"Esc", "x":2.25, "y":3}, + {"label":"1", "x":3.25, "y":3}, + {"label":"2", "x":4.25, "y":3}, + {"label":"3", "x":5.25, "y":3}, + {"label":"4", "x":6.25, "y":3}, + {"label":"5", "x":7.25, "y":3}, + {"label":"6", "x":8.25, "y":3}, + {"label":"7", "x":9.25, "y":3}, + {"label":"8", "x":10.25, "y":3}, + {"label":"9", "x":11.25, "y":3}, + {"label":"0", "x":12.25, "y":3}, + {"label":"-", "x":13.25, "y":3}, + {"label":"=", "x":14.25, "y":3}, + {"label":"No", "x":15.25, "y":3}, + {"label":"Back Space", "x":16.25, "y":3}, + {"label":"Insert", "x":17.5, "y":3}, + {"label":"Home", "x":18.5, "y":3}, + {"label":"Page Up", "x":19.5, "y":3}, + {"label":"Num Lock", "x":20.75, "y":3}, + {"label":"/", "x":21.75, "y":3}, + {"label":"*", "x":22.75, "y":3}, + {"label":"-", "x":23.75, "y":3}, + {"label":"Scroll Lock", "x":0, "y":4}, + {"label":"Int4", "x":1, "y":4}, + {"label":"Tab", "x":2.25, "y":4, "w":1.5}, + {"label":"Q", "x":3.75, "y":4}, + {"label":"W", "x":4.75, "y":4}, + {"label":"E", "x":5.75, "y":4}, + {"label":"R", "x":6.75, "y":4}, + {"label":"T", "x":7.75, "y":4}, + {"label":"Y", "x":8.75, "y":4}, + {"label":"U", "x":9.75, "y":4}, + {"label":"I", "x":10.75, "y":4}, + {"label":"O", "x":11.75, "y":4}, + {"label":"P", "x":12.75, "y":4}, + {"label":"[", "x":13.75, "y":4}, + {"label":"]", "x":14.75, "y":4}, + {"label":"No", "x":15.75, "y":4, "w":1.5}, + {"label":"Delete", "x":17.5, "y":4}, + {"label":"End", "x":18.5, "y":4}, + {"label":"Page Down", "x":19.5, "y":4}, + {"label":"7", "x":20.75, "y":4}, + {"label":"8", "x":21.75, "y":4}, + {"label":"9", "x":22.75, "y":4}, + {"label":"+", "x":23.75, "y":4}, + {"label":"Pause", "x":0, "y":5}, + {"label":"Int5", "x":1, "y":5}, + {"label":"Caps Lock", "x":2.25, "y":5, "w":1.75}, + {"label":"A", "x":4, "y":5}, + {"label":"S", "x":5, "y":5}, + {"label":"D", "x":6, "y":5}, + {"label":"F", "x":7, "y":5}, + {"label":"G", "x":8, "y":5}, + {"label":"H", "x":9, "y":5}, + {"label":"J", "x":10, "y":5}, + {"label":"K", "x":11, "y":5}, + {"label":"L", "x":12, "y":5}, + {"label":";", "x":13, "y":5}, + {"label":"'", "x":14, "y":5}, + {"label":"\\", "x":15, "y":5}, + {"label":"Enter", "x":16, "y":5, "w":1.25}, + {"label":"Up", "x":18.5, "y":5}, + {"label":"4", "x":20.75, "y":5}, + {"label":"5", "x":21.75, "y":5}, + {"label":"6", "x":22.75, "y":5}, + {"label":",", "x":23.75, "y":5}, + {"label":"App", "x":0, "y":6}, + {"label":"Int6", "x":1, "y":6}, + {"label":"Shift", "x":2.25, "y":6, "w":1.25}, + {"label":"ISO \\", "x":3.5, "y":6}, + {"label":"Z", "x":4.5, "y":6}, + {"label":"X", "x":5.5, "y":6}, + {"label":"C", "x":6.5, "y":6}, + {"label":"V", "x":7.5, "y":6}, + {"label":"B", "x":8.5, "y":6}, + {"label":"N", "x":9.5, "y":6}, + {"label":"M", "x":10.5, "y":6}, + {"label":",", "x":11.5, "y":6}, + {"label":".", "x":12.5, "y":6}, + {"label":"/", "x":13.5, "y":6}, + {"label":"No", "x":14.5, "y":6}, + {"label":"Shift", "x":15.5, "y":6, "w":1.75}, + {"label":"Left", "x":17.5, "y":6}, + {"label":"Int2", "x":18.5, "y":6}, + {"label":"Right", "x":19.5, "y":6}, + {"label":"1", "x":20.75, "y":6}, + {"label":"2", "x":21.75, "y":6}, + {"label":"3", "x":22.75, "y":6}, + {"label":"Enter", "x":23.75, "y":6}, + {"label":"RGUI", "x":0, "y":7}, + {"label":"lgui", "x":1, "y":7}, + {"label":"Ctrl", "x":2.25, "y":7, "w":1.5}, + {"label":"Alt", "x":4.75, "y":7, "w":1.5}, + {"label":"Space", "x":6.25, "y":7, "w":7}, + {"label":"Alt", "x":13.25, "y":7, "w":1.5}, + {"label":"Ctrl", "x":15.75, "y":7, "w":1.5}, + {"label":"Down", "x":18.5, "y":7}, + {"label":"No", "x":20.75, "y":7}, + {"label":"0", "x":21.75, "y":7}, + {"label":".", "x":22.75, "y":7}, + {"label":"No", "x":23.75, "y":7} + ] + }, + "LAYOUT_101": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":2, "y":0}, + {"label":"F2", "x":3, "y":0}, + {"label":"F3", "x":4, "y":0}, + {"label":"F4", "x":5, "y":0}, + {"label":"F5", "x":6.5, "y":0}, + {"label":"F6", "x":7.5, "y":0}, + {"label":"F7", "x":8.5, "y":0}, + {"label":"F8", "x":9.5, "y":0}, + {"label":"F9", "x":11, "y":0}, + {"label":"F10", "x":12, "y":0}, + {"label":"F11", "x":13, "y":0}, + {"label":"F12", "x":14, "y":0}, + {"label":"Print Screen", "x":15.25, "y":0}, + {"label":"Scroll Lock", "x":16.25, "y":0}, + {"label":"Pause", "x":17.25, "y":0}, + {"label":"`", "x":0, "y":2}, + {"label":"1", "x":1, "y":2}, + {"label":"2", "x":2, "y":2}, + {"label":"3", "x":3, "y":2}, + {"label":"4", "x":4, "y":2}, + {"label":"5", "x":5, "y":2}, + {"label":"6", "x":6, "y":2}, + {"label":"7", "x":7, "y":2}, + {"label":"8", "x":8, "y":2}, + {"label":"9", "x":9, "y":2}, + {"label":"0", "x":10, "y":2}, + {"label":"-", "x":11, "y":2}, + {"label":"=", "x":12, "y":2}, + {"label":"Back Space", "x":13, "y":2, "w":2}, + {"label":"Insert", "x":15.25, "y":2}, + {"label":"Home", "x":16.25, "y":2}, + {"label":"Page Up", "x":17.25, "y":2}, + {"label":"Num Lock", "x":18.5, "y":2}, + {"label":"/", "x":19.5, "y":2}, + {"label":"*", "x":20.5, "y":2}, + {"label":"-", "x":21.5, "y":2}, + {"label":"Tab", "x":0, "y":3, "w":1.5}, + {"label":"Q", "x":1.5, "y":3}, + {"label":"W", "x":2.5, "y":3}, + {"label":"E", "x":3.5, "y":3}, + {"label":"R", "x":4.5, "y":3}, + {"label":"T", "x":5.5, "y":3}, + {"label":"Y", "x":6.5, "y":3}, + {"label":"U", "x":7.5, "y":3}, + {"label":"I", "x":8.5, "y":3}, + {"label":"O", "x":9.5, "y":3}, + {"label":"P", "x":10.5, "y":3}, + {"label":"[", "x":11.5, "y":3}, + {"label":"]", "x":12.5, "y":3}, + {"label":"\\", "x":13.5, "y":3, "w":1.5}, + {"label":"Delete", "x":15.25, "y":3}, + {"label":"End", "x":16.25, "y":3}, + {"label":"Page Down", "x":17.25, "y":3}, + {"label":"7", "x":18.5, "y":3}, + {"label":"8", "x":19.5, "y":3}, + {"label":"9", "x":20.5, "y":3}, + {"label":"Caps Lock", "x":0, "y":4, "w":1.75}, + {"label":"A", "x":1.75, "y":4}, + {"label":"S", "x":2.75, "y":4}, + {"label":"D", "x":3.75, "y":4}, + {"label":"F", "x":4.75, "y":4}, + {"label":"G", "x":5.75, "y":4}, + {"label":"H", "x":6.75, "y":4}, + {"label":"J", "x":7.75, "y":4}, + {"label":"K", "x":8.75, "y":4}, + {"label":"L", "x":9.75, "y":4}, + {"label":";", "x":10.75, "y":4}, + {"label":"'", "x":11.75, "y":4}, + {"label":"Enter", "x":12.75, "y":4, "w":2.25}, + {"label":"4", "x":18.5, "y":4}, + {"label":"5", "x":19.5, "y":4}, + {"label":"6", "x":20.5, "y":4}, + {"label":"+", "x":21.5, "y":3, "h":2}, + {"label":"Shift", "x":0, "y":5, "w":2.25}, + {"label":"Z", "x":2.25, "y":5}, + {"label":"X", "x":3.25, "y":5}, + {"label":"C", "x":4.25, "y":5}, + {"label":"V", "x":5.25, "y":5}, + {"label":"B", "x":6.25, "y":5}, + {"label":"N", "x":7.25, "y":5}, + {"label":"M", "x":8.25, "y":5}, + {"label":",", "x":9.25, "y":5}, + {"label":".", "x":10.25, "y":5}, + {"label":"/", "x":11.25, "y":5}, + {"label":"Shift", "x":12.25, "y":5, "w":2.75}, + {"label":"Up", "x":16.25, "y":5}, + {"label":"1", "x":18.5, "y":5}, + {"label":"2", "x":19.5, "y":5}, + {"label":"3", "x":20.5, "y":5}, + {"label":"Ctrl", "x":0, "y":6, "w":1.5}, + {"label":"Alt", "x":2.5, "y":6, "w":1.5}, + {"label":"Space", "x":4, "y":6, "w":7}, + {"label":"Alt", "x":11, "y":6, "w":1.5}, + {"label":"Ctrl", "x":13.5, "y":6, "w":1.5}, + {"label":"Left", "x":15.25, "y":6}, + {"label":"Down", "x":16.25, "y":6}, + {"label":"Right", "x":17.25, "y":6}, + {"label":"0", "x":18.5, "y":6, "w":2}, + {"label":".", "x":20.5, "y":6}, + {"label":"Enter", "x":21.5, "y":5, "h":2} + ] + } + } +} diff --git a/keyboards/converter/ibm_terminal/keymaps/default/config.h b/keyboards/converter/ibm_terminal/keymaps/default/config.h index 7fa3bf328ec9..271f48d0011b 100644 --- a/keyboards/converter/ibm_terminal/keymaps/default/config.h +++ b/keyboards/converter/ibm_terminal/keymaps/default/config.h @@ -1,6 +1,3 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once -#include "../../config.h" - -#endif +// place overrides here diff --git a/keyboards/converter/ibm_terminal/keymaps/default/keymap.c b/keyboards/converter/ibm_terminal/keymaps/default/keymap.c index 2beb51106ec6..59187ef339e1 100644 --- a/keyboards/converter/ibm_terminal/keymaps/default/keymap.c +++ b/keyboards/converter/ibm_terminal/keymaps/default/keymap.c @@ -15,18 +15,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include -#include -#include "keycode.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "ibm_terminal.h" +#include QMK_KEYBOARD_H const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { // Layer 0 - KEYMAP( + LAYOUT( KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, @@ -56,7 +50,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `----' `---------------------------------------' `----' `-----------' `---------------' */ /* - KEYMAP_101( + LAYOUT_101( 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_BRK, 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, diff --git a/keyboards/converter/ibm_terminal/keymaps/priyadi/config.h b/keyboards/converter/ibm_terminal/keymaps/priyadi/config.h index 7fa3bf328ec9..271f48d0011b 100644 --- a/keyboards/converter/ibm_terminal/keymaps/priyadi/config.h +++ b/keyboards/converter/ibm_terminal/keymaps/priyadi/config.h @@ -1,6 +1,3 @@ -#ifndef CONFIG_USER_H -#define CONFIG_USER_H +#pragma once -#include "../../config.h" - -#endif +// place overrides here diff --git a/keyboards/converter/ibm_terminal/keymaps/priyadi/keymap.c b/keyboards/converter/ibm_terminal/keymaps/priyadi/keymap.c index 47a5181ddef3..3d6da6eab879 100644 --- a/keyboards/converter/ibm_terminal/keymaps/priyadi/keymap.c +++ b/keyboards/converter/ibm_terminal/keymaps/priyadi/keymap.c @@ -15,17 +15,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#include "keycode.h" -#include "print.h" -#include "debug.h" -#include "util.h" -#include "ibm_terminal.h" -#include "action_layer.h" - -// Fillers to make layering clearer - -#define _______ KC_TRNS -#define XXXXXXX KC_NO +#include QMK_KEYBOARD_H enum layers { QWE, // qwerty @@ -159,7 +149,7 @@ const uint32_t PROGMEM unicode_map[] = { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* qwerty */ - [QWE] = KEYMAP( + [QWE] = LAYOUT( KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_PSCR, KC_SLCK, KC_PAUS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, @@ -171,7 +161,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* colemak */ - [COL] = KEYMAP( + [COL] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -183,7 +173,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* workman */ - [WOR] = KEYMAP( + [WOR] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -195,7 +185,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* dvorak */ - [DVO] = KEYMAP( + [DVO] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -207,7 +197,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* system */ - [SYS] = KEYMAP( + [SYS] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -219,7 +209,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* mouse keys */ - [MOU] = KEYMAP( + [MOU] = LAYOUT( XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, @@ -231,7 +221,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* emoji */ - [EMO] = KEYMAP( + [EMO] = LAYOUT( XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, @@ -243,7 +233,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), /* - [XXX] = KEYMAP( + [XXX] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, diff --git a/keyboards/converter/ibm_terminal/readme.md b/keyboards/converter/ibm_terminal/readme.md new file mode 100644 index 000000000000..b781b0468780 --- /dev/null +++ b/keyboards/converter/ibm_terminal/readme.md @@ -0,0 +1,39 @@ +# Keyboard converter for IBM terminal keyboard + +This is a port of TMK's converter/terminal_usb to QMK. + +It supports PS/2 Scan Code Set 3 and runs on USB AVR chips such like PJRC Teensy. +I tested the converter on ATMega32U4 with 1392595(102keys) and 6110345(122keys). + +Source code: https://github.com/qmk/qmk_firmware.git +Article: http://geekhack.org/index.php?topic=27272.0 + + +## Connection + +Keyboard | ATMega32U4 +:------- | :--------- +Data | PD2 +Clock | PD5 + +And VCC and GND, of course. See Resource section for keyboard connector pin assign. + + +## Build + +``` +git clone https://github.com/qmk/qmk_firmware.git +cd qmk_firmware +make converter/ibm_terminal:default +``` + +## Resource + +- Soarer's Converter: http://geekhack.org/index.php?topic=17458.0 +- 102keys(1392595): http://geekhack.org/index.php?topic=10737.0 +- 122keys(1390876): http://www.seasip.info/VintagePC/ibm_1390876.html +- KbdBabel: http://www.kbdbabel.org/ +- RJ45 Connector: http://www.kbdbabel.org/conn/kbd_connector_ibmterm.png +- DIN Connector: http://www.kbdbabel.org/conn/kbd_connector_ibm3179_318x_319x.png +- WinAVR: http://winavr.sourceforge.net/ + From caa293a8f77447891b02d5f8c91b209f9a082cc9 Mon Sep 17 00:00:00 2001 From: Junya Ogura <5352+juno@users.noreply.github.com> Date: Wed, 14 Nov 2018 01:27:46 +0900 Subject: [PATCH 412/505] Remove duplicate row from Available functions table in i2c_driver doc (#4416) --- docs/i2c_driver.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/i2c_driver.md b/docs/i2c_driver.md index f69eb5a9da2c..ea24dc64f392 100644 --- a/docs/i2c_driver.md +++ b/docs/i2c_driver.md @@ -8,7 +8,6 @@ The I2C Master drivers used in QMK have a set of common functions to allow porta |------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |`void i2c_init(void);` |Initializes the I2C driver. This function should be called once before any transaction is initiated. | |`uint8_t i2c_start(uint8_t address);` |Starts an I2C transaction. Address is the 7-bit slave address without the direction bit. | -|`uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Transmit data over I2C. Address is the 7-bit slave address without the direction. | |`uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Transmit data over I2C. Address is the 7-bit slave address without the direction. Returns status of transaction. | |`uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` |Receive data over I2C. Address is the 7-bit slave address without the direction. Saves number of bytes specified by `length` in `data` array. Returns status of transaction. | |`uint8_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` |Same as the `i2c_transmit` function but `regaddr` sets where in the slave the data will be written. | From 2dea540afbfcffaea82f70b6642c39aedb9e3b5b Mon Sep 17 00:00:00 2001 From: Wilba Date: Wed, 14 Nov 2018 03:31:25 +1100 Subject: [PATCH 413/505] Refactoring M6-A, M6-B, Zeal60, Zeal65, WT60-A, WT65-A, WT80-A (#4417) * Refactored M6-B to use Zeal60 RGB backlight code * Fixed M6-B LED co-ordinates * Minor changes to RGB config for Zeal65 * Added dynamic keymaps to WT80-A, WT60-A, WT-80A, U80-A --- keyboards/rama/m6_a/config.h | 113 ++------- keyboards/rama/m6_a/rules.mk | 32 ++- keyboards/rama/m6_b/config.h | 33 ++- keyboards/rama/m6_b/m6_b.c | 216 +----------------- keyboards/rama/m6_b/m6_b_api.h | 39 ---- keyboards/rama/m6_b/rgb_backlight.c | 139 ----------- keyboards/rama/m6_b/rgb_backlight.h | 34 --- keyboards/rama/m6_b/rules.mk | 24 +- keyboards/rama/u80_a/config.h | 17 ++ keyboards/rama/u80_a/keymaps/default/keymap.c | 15 ++ keyboards/rama/u80_a/rules.mk | 12 +- keyboards/wilba_tech/wt60_a/config.h | 17 ++ keyboards/wilba_tech/wt60_a/rules.mk | 11 +- keyboards/wilba_tech/wt65_a/config.h | 17 ++ keyboards/wilba_tech/wt65_a/rules.mk | 11 +- keyboards/wilba_tech/wt80_a/config.h | 17 ++ .../wt80_a/keymaps/default/keymap.c | 16 ++ keyboards/wilba_tech/wt80_a/rules.mk | 11 +- keyboards/wilba_tech/wt80_a/wt80_a.h | 15 ++ keyboards/wilba_tech/wt_main.c | 155 ++++++++++++- keyboards/zeal60/rgb_backlight.c | 122 +++++++--- keyboards/zeal60/zeal60.c | 1 + keyboards/zeal65/config.h | 8 +- 23 files changed, 468 insertions(+), 607 deletions(-) delete mode 100644 keyboards/rama/m6_b/m6_b_api.h delete mode 100644 keyboards/rama/m6_b/rgb_backlight.c delete mode 100644 keyboards/rama/m6_b/rgb_backlight.h diff --git a/keyboards/rama/m6_a/config.h b/keyboards/rama/m6_a/config.h index 8d77f5339d5a..63da7927453f 100644 --- a/keyboards/rama/m6_a/config.h +++ b/keyboards/rama/m6_a/config.h @@ -1,20 +1,18 @@ -/* -Copyright 2018 Wilba - -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 . -*/ - +/* Copyright 2018 Jason Williams (Wilba) + * + * 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 #include "config_common.h" @@ -47,7 +45,7 @@ along with this program. If not, see . /* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ #define DIODE_DIRECTION COL2ROW - + // #define BACKLIGHT_PIN B7 // #define BACKLIGHT_BREATHING // #define BACKLIGHT_LEVELS 3 @@ -109,88 +107,10 @@ along with this program. If not, see . 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 - -/* - * 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 1 - #define RGB_BACKLIGHT_ENABLED 0 #define DYNAMIC_KEYMAP_LAYER_COUNT 4 - // EEPROM usage // TODO: refactor with new user EEPROM code (coming soon) @@ -206,3 +126,4 @@ along with this program. If not, see . #define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 // Dynamic keymap starts after backlight config (35+37) #define DYNAMIC_KEYMAP_EEPROM_ADDR 72 + diff --git a/keyboards/rama/m6_a/rules.mk b/keyboards/rama/m6_a/rules.mk index ed85ac36d0c3..ff1706918279 100644 --- a/keyboards/rama/m6_a/rules.mk +++ b/keyboards/rama/m6_a/rules.mk @@ -1,5 +1,5 @@ # project specific files -SRC = keyboards/rama/m6_b/m6_b.c +SRC = ../zeal60/zeal60.c # MCU name MCU = atmega32u4 @@ -43,24 +43,32 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT # Boot Section BOOTLOADER = atmel-dfu +# Do not put the microcontroller into power saving mode +# when we get USB suspend event. We want it to keep updating +# backlight effects. +OPT_DEFS += -DNO_SUSPEND_POWER_DOWN + + # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +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) +CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = no # Commands for debug and configuration -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE = yes # USB Nkey Rollover -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default -MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +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 -AUDIO_ENABLE = no # Audio output on port C6 -FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +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 RAW_ENABLE = yes -DYNAMIC_KEYMAP_ENABLE = yes \ No newline at end of file +DYNAMIC_KEYMAP_ENABLE = yes +CIE1931_CURVE = no + diff --git a/keyboards/rama/m6_b/config.h b/keyboards/rama/m6_b/config.h index 1adaad3f9ed1..c016703e0465 100644 --- a/keyboards/rama/m6_b/config.h +++ b/keyboards/rama/m6_b/config.h @@ -109,8 +109,38 @@ #define RGB_BACKLIGHT_ENABLED 1 -#define DYNAMIC_KEYMAP_LAYER_COUNT 4 +// This conditionally compiles the backlight code for M6-B specifics +#define RGB_BACKLIGHT_M6_B + +// enable/disable LEDs based on layout +#define RGB_BACKLIGHT_USE_SPLIT_BACKSPACE 0 +#define RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT 0 +#define RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT 0 +#define RGB_BACKLIGHT_USE_7U_SPACEBAR 0 +#define RGB_BACKLIGHT_USE_ISO_ENTER 0 +#define RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS 0 + +// disable backlight when USB suspended (PC sleep/hibernate/shutdown) +#define RGB_BACKLIGHT_DISABLE_WHEN_USB_SUSPENDED 0 + +// disable backlight after timeout in minutes, 0 = no timeout +#define RGB_BACKLIGHT_DISABLE_AFTER_TIMEOUT 0 + +// the default effect (RGB test) +#define RGB_BACKLIGHT_EFFECT 255 + +// These define which keys in the matrix are alphas/mods +// Used for backlight effects so colors are different for +// alphas vs. mods +// Each value is for a row, bit 0 is column 0 +// Alpha=0 Mod=1 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_0 0 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_1 0 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_2 0 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_3 0 +#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_4 0 +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 // EEPROM usage @@ -127,3 +157,4 @@ #define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 // Dynamic keymap starts after backlight config (35+37) #define DYNAMIC_KEYMAP_EEPROM_ADDR 72 + diff --git a/keyboards/rama/m6_b/m6_b.c b/keyboards/rama/m6_b/m6_b.c index e7cd2f62872a..581b31d753d9 100644 --- a/keyboards/rama/m6_b/m6_b.c +++ b/keyboards/rama/m6_b/m6_b.c @@ -13,218 +13,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "m6_b.h" -#include "m6_b_api.h" - -// Check that no backlight functions are called -#if RGB_BACKLIGHT_ENABLED -#include "rgb_backlight.h" -#endif // RGB_BACKLIGHT_ENABLED - -#include "raw_hid.h" -#include "dynamic_keymap.h" -#include "timer.h" -#include "tmk_core/common/eeprom.h" - -bool eeprom_is_valid(void) -{ - return (eeprom_read_word(((void*)EEPROM_MAGIC_ADDR)) == EEPROM_MAGIC && - eeprom_read_byte(((void*)EEPROM_VERSION_ADDR)) == EEPROM_VERSION); -} - -void eeprom_set_valid(bool valid) -{ - eeprom_update_word(((void*)EEPROM_MAGIC_ADDR), valid ? EEPROM_MAGIC : 0xFFFF); - eeprom_update_byte(((void*)EEPROM_VERSION_ADDR), valid ? EEPROM_VERSION : 0xFF); -} - -void eeprom_reset(void) -{ - // Set the keyboard-specific EEPROM state as invalid. - eeprom_set_valid(false); - // Set the TMK/QMK EEPROM state as invalid. - eeconfig_disable(); -} - -#ifdef RAW_ENABLE - -void raw_hid_receive( uint8_t *data, uint8_t length ) -{ - uint8_t *command_id = &(data[0]); - uint8_t *command_data = &(data[1]); - switch ( *command_id ) - { - case id_get_protocol_version: - { - command_data[0] = PROTOCOL_VERSION >> 8; - command_data[1] = PROTOCOL_VERSION & 0xFF; - break; - } - case id_get_keyboard_value: - { - if ( command_data[0] == id_uptime ) - { - uint32_t value = timer_read32(); - command_data[1] = (value >> 24 ) & 0xFF; - command_data[2] = (value >> 16 ) & 0xFF; - command_data[3] = (value >> 8 ) & 0xFF; - command_data[4] = value & 0xFF; - } - else - { - *command_id = id_unhandled; - } - break; - } -#ifdef DYNAMIC_KEYMAP_ENABLE - case id_dynamic_keymap_get_keycode: - { - uint16_t keycode = dynamic_keymap_get_keycode( command_data[0], command_data[1], command_data[2] ); - command_data[3] = keycode >> 8; - command_data[4] = keycode & 0xFF; - break; - } - case id_dynamic_keymap_set_keycode: - { - dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] ); - break; - } - case id_dynamic_keymap_reset: - { - dynamic_keymap_reset(); - break; - } -#endif // DYNAMIC_KEYMAP_ENABLE -#if RGB_BACKLIGHT_ENABLED - case id_backlight_config_set_value: - { - //backlight_config_set_value(command_data); - break; - } - case id_backlight_config_get_value: - { - //backlight_config_get_value(command_data); - break; - } - case id_backlight_config_save: - { - //backlight_config_save(); - break; - } -#endif // RGB_BACKLIGHT_ENABLED - case id_eeprom_reset: - { - eeprom_reset(); - break; - } - case id_bootloader_jump: - { - // Need to send data back before the jump - // Informs host that the command is handled - raw_hid_send( data, length ); - // Give host time to read it - wait_ms(100); - bootloader_jump(); - break; - } - default: - { - // Unhandled message. - *command_id = id_unhandled; - break; - } - } - - // Return same buffer with values changed - raw_hid_send( data, length ); - -} - +#ifndef RGB_BACKLIGHT_M6_B +#error RGB_BACKLIGHT_M6_B not defined, you done goofed somehao, brah #endif - -void main_init(void) -{ - // If the EEPROM has the magic, the data is good. - // OK to load from EEPROM. - if (eeprom_is_valid()) { -#if RGB_BACKLIGHT_ENABLED - //backlight_config_load(); -#endif // RGB_BACKLIGHT_ENABLED - } else { -#if RGB_BACKLIGHT_ENABLED - // If the EEPROM has not been saved before, or is out of date, - // save the default values to the EEPROM. Default values - // come from construction of the zeal_backlight_config instance. - //backlight_config_save(); -#endif // RGB_BACKLIGHT_ENABLED -#ifdef DYNAMIC_KEYMAP_ENABLE - // This resets the keymaps in EEPROM to what is in flash. - dynamic_keymap_reset(); -#endif - // Save the magic number last, in case saving was interrupted - eeprom_set_valid(true); - } -#if RGB_BACKLIGHT_ENABLED - // Initialize LED drivers for backlight. - backlight_init_drivers(); - - backlight_timer_init(); - backlight_timer_enable(); -#endif // RGB_BACKLIGHT_ENABLED -} - -void bootmagic_lite(void) -{ - // The lite version of TMK's bootmagic. - // 100% less potential for accidentally making the - // keyboard do stupid things. - - // We need multiple scans because debouncing can't be turned off. - matrix_scan(); - wait_ms(DEBOUNCING_DELAY); - wait_ms(DEBOUNCING_DELAY); - matrix_scan(); - - // If the Esc (matrix 0,0) is held down on power up, - // reset the EEPROM valid state and jump to bootloader. - if ( matrix_get_row(0) & (1<<0) ) { - eeprom_reset(); - bootloader_jump(); - } -} - -void matrix_init_kb(void) { - bootmagic_lite(); - main_init(); - matrix_init_user(); -} - -void matrix_scan_kb(void) { -#if RGB_BACKLIGHT_ENABLED - // This only updates the LED driver buffers if something has changed. - backlight_update_pwm_buffers(); -#endif // BACKLIGHT_ENABLED - matrix_scan_user(); -} - -bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - return process_record_user(keycode, record); -} - -void led_set_kb(uint8_t usb_led) { - led_set_user(usb_led); -} - -void suspend_power_down_kb(void) -{ -#if RGB_BACKLIGHT_ENABLED - //backlight_set_suspend_state(true); -#endif // BACKLIGHT_ENABLED -} - -void suspend_wakeup_init_kb(void) -{ -#if RGB_BACKLIGHT_ENABLED - //backlight_set_suspend_state(false); -#endif // BACKLIGHT_ENABLED -} diff --git a/keyboards/rama/m6_b/m6_b_api.h b/keyboards/rama/m6_b/m6_b_api.h deleted file mode 100644 index 041fd6e6eed7..000000000000 --- a/keyboards/rama/m6_b/m6_b_api.h +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright 2017 Jason Williams (Wilba) - * - * 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 - -#define PROTOCOL_VERSION 0x0001 - -enum m6_b_command_id -{ - id_get_protocol_version = 0x01, // always 0x01 - id_get_keyboard_value, - id_set_keyboard_value, - id_dynamic_keymap_get_keycode, - id_dynamic_keymap_set_keycode, - id_dynamic_keymap_reset, - id_backlight_config_set_value, - id_backlight_config_get_value, - id_backlight_config_save, - id_eeprom_reset, - id_bootloader_jump, - id_unhandled = 0xFF, -}; - -enum m6_b_keyboard_value_id -{ - id_uptime = 0x01 -}; diff --git a/keyboards/rama/m6_b/rgb_backlight.c b/keyboards/rama/m6_b/rgb_backlight.c deleted file mode 100644 index 8f7ac06303e4..000000000000 --- a/keyboards/rama/m6_b/rgb_backlight.c +++ /dev/null @@ -1,139 +0,0 @@ -/* Copyright 2018 Jason Williams (Wilba) - * - * 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 . - */ -#if RGB_BACKLIGHT_ENABLED - -#include "rgb_backlight.h" -//#include "rgb_backlight_api.h" - -#include -#include -#include -#include "progmem.h" - -#include "quantum/color.h" -#include "drivers/avr/i2c_master.h" -#include "drivers/issi/is31fl3218.h" - -bool g_suspend_state = false; - -// Global tick at 20 Hz -uint32_t g_tick = 0; -uint8_t g_config_effect_speed = 0; -uint8_t g_config_brightness = 255; - -void backlight_update_pwm_buffers(void) -{ - IS31FL3218_update_pwm_buffers(); -} - -void backlight_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) -{ - IS31FL3218_set_color( index, red, green, blue ); -} - -void backlight_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) -{ - IS31FL3218_set_color_all( red, green, blue ); -} - - -// This is (F_CPU/1024) / 20 Hz -// = 15625 Hz / 20 Hz -// = 781 -#define TIMER3_TOP 260 - -void backlight_timer_init(void) -{ - static uint8_t backlight_timer_is_init = 0; - if ( backlight_timer_is_init ) - { - return; - } - backlight_timer_is_init = 1; - - // Timer 3 setup - TCCR3B = _BV(WGM32) | // CTC mode OCR3A as TOP - _BV(CS32) | _BV(CS30); // prescale by /1024 - // Set TOP value - uint8_t sreg = SREG; - cli(); - - OCR3AH = (TIMER3_TOP >> 8) & 0xff; - OCR3AL = TIMER3_TOP & 0xff; - SREG = sreg; -} - -void backlight_timer_enable(void) -{ - TIMSK3 |= _BV(OCIE3A); -} - -void backlight_timer_disable(void) -{ - TIMSK3 &= ~_BV(OCIE3A); -} - -void backlight_set_suspend_state(bool state) -{ - g_suspend_state = state; -} - -void backlight_effect_cycle_all(void) -{ - uint8_t hueOffset = ( g_tick << g_config_effect_speed ) & 0xFF; - uint8_t satOffset = 127; - // Relies on hue being 8-bit and wrapping - for ( int i=0; i<6; i++ ) - { - HSV hsv = { .h = hueOffset, .s = satOffset, .v = g_config_brightness }; - RGB rgb = hsv_to_rgb( hsv ); - backlight_set_color( i, rgb.r, rgb.g, rgb.b ); - } -} - -ISR(TIMER3_COMPA_vect) -{ - // delay 1 second before driving LEDs or doing anything else - static uint8_t startup_tick = 0; - if ( startup_tick < 20 ) - { - startup_tick++; - return; - } - - g_tick++; - - if ( g_suspend_state ) - { - backlight_set_color_all( 0, 0, 0 ); - } - else - { - //HSV hsv = { .h = 240, .s = 255, .v = g_config_brightness }; - //RGB rgb = hsv_to_rgb( hsv ); - //backlight_set_color_all( rgb.r, rgb.g, rgb.b ); - backlight_effect_cycle_all(); - } -} - -void backlight_init_drivers(void) -{ - // Initialize I2C - i2c_init(); - IS31FL3218_init(); -} - -#endif // RGB_BACKLIGHT_ENABLED diff --git a/keyboards/rama/m6_b/rgb_backlight.h b/keyboards/rama/m6_b/rgb_backlight.h deleted file mode 100644 index bbf605284b85..000000000000 --- a/keyboards/rama/m6_b/rgb_backlight.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright 2018 Jason Williams (Wilba) - * - * 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 - -#if RGB_BACKLIGHT_ENABLED -#else -#error rgb_backlight.h included when RGB_BACKLIGHT_ENABLED == 0 -#endif // RGB_BACKLIGHT_ENABLED - -#include -#include - -#include "quantum/color.h" - -void backlight_init_drivers(void); -void backlight_update_pwm_buffers(void); -void backlight_timer_init(void); -void backlight_timer_enable(void); -void backlight_timer_disable(void); -void backlight_set_suspend_state(bool state); - diff --git a/keyboards/rama/m6_b/rules.mk b/keyboards/rama/m6_b/rules.mk index 8226debd4561..1a7466af37df 100644 --- a/keyboards/rama/m6_b/rules.mk +++ b/keyboards/rama/m6_b/rules.mk @@ -1,5 +1,6 @@ # project specific files -SRC = rgb_backlight.c \ +SRC = ../zeal60/zeal60.c \ + ../zeal60/rgb_backlight.c \ quantum/color.c \ drivers/issi/is31fl3218.c \ drivers/avr/i2c_master.c @@ -56,22 +57,23 @@ OPT_DEFS += -DNO_SUSPEND_POWER_DOWN # Build Options # change yes to no to disable # -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +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) +CONSOLE_ENABLE = no # Console for debug(+400) COMMAND_ENABLE = no # Commands for debug and configuration -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend -# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE = yes # USB Nkey Rollover -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default -MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config) +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 -AUDIO_ENABLE = no # Audio output on port C6 -FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +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 RAW_ENABLE = yes DYNAMIC_KEYMAP_ENABLE = yes CIE1931_CURVE = yes + diff --git a/keyboards/rama/u80_a/config.h b/keyboards/rama/u80_a/config.h index bfd97282836d..9c74735ad525 100644 --- a/keyboards/rama/u80_a/config.h +++ b/keyboards/rama/u80_a/config.h @@ -185,3 +185,20 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION_ADDR 34 + +// Backlight config starts after EEPROM version +#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 +// Dynamic keymap starts after backlight config (35+37) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 diff --git a/keyboards/rama/u80_a/keymaps/default/keymap.c b/keyboards/rama/u80_a/keymaps/default/keymap.c index cf9225e3e5ac..036a57b689fa 100644 --- a/keyboards/rama/u80_a/keymaps/default/keymap.c +++ b/keyboards/rama/u80_a/keymaps/default/keymap.c @@ -18,5 +18,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + [2] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [3] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), }; diff --git a/keyboards/rama/u80_a/rules.mk b/keyboards/rama/u80_a/rules.mk index 99224c247cdd..67b04e350e2c 100644 --- a/keyboards/rama/u80_a/rules.mk +++ b/keyboards/rama/u80_a/rules.mk @@ -52,17 +52,21 @@ BOOTLOADER = atmel-dfu # change yes to no to disable # 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 = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE = no # USB Nkey Rollover +NKRO_ENABLE = yes # USB Nkey Rollover BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default 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 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes +CIE1931_CURVE = yes \ No newline at end of file diff --git a/keyboards/wilba_tech/wt60_a/config.h b/keyboards/wilba_tech/wt60_a/config.h index 95f4c786e61d..26f9ed2ba44d 100644 --- a/keyboards/wilba_tech/wt60_a/config.h +++ b/keyboards/wilba_tech/wt60_a/config.h @@ -185,3 +185,20 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION_ADDR 34 + +// Backlight config starts after EEPROM version +#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 +// Dynamic keymap starts after backlight config (35+37) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 diff --git a/keyboards/wilba_tech/wt60_a/rules.mk b/keyboards/wilba_tech/wt60_a/rules.mk index 99224c247cdd..76a07d7a44ac 100644 --- a/keyboards/wilba_tech/wt60_a/rules.mk +++ b/keyboards/wilba_tech/wt60_a/rules.mk @@ -52,17 +52,20 @@ BOOTLOADER = atmel-dfu # change yes to no to disable # 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 = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE = no # USB Nkey Rollover +NKRO_ENABLE = yes # USB Nkey Rollover BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default 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 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes \ No newline at end of file diff --git a/keyboards/wilba_tech/wt65_a/config.h b/keyboards/wilba_tech/wt65_a/config.h index fa919f186b55..5f535c6a79af 100644 --- a/keyboards/wilba_tech/wt65_a/config.h +++ b/keyboards/wilba_tech/wt65_a/config.h @@ -185,3 +185,20 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION_ADDR 34 + +// Backlight config starts after EEPROM version +#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 +// Dynamic keymap starts after backlight config (35+37) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 diff --git a/keyboards/wilba_tech/wt65_a/rules.mk b/keyboards/wilba_tech/wt65_a/rules.mk index 99224c247cdd..76a07d7a44ac 100644 --- a/keyboards/wilba_tech/wt65_a/rules.mk +++ b/keyboards/wilba_tech/wt65_a/rules.mk @@ -52,17 +52,20 @@ BOOTLOADER = atmel-dfu # change yes to no to disable # 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 = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE = no # USB Nkey Rollover +NKRO_ENABLE = yes # USB Nkey Rollover BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default 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 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes \ No newline at end of file diff --git a/keyboards/wilba_tech/wt80_a/config.h b/keyboards/wilba_tech/wt80_a/config.h index 9687cb6d680a..f78ce7fb34ee 100644 --- a/keyboards/wilba_tech/wt80_a/config.h +++ b/keyboards/wilba_tech/wt80_a/config.h @@ -185,3 +185,20 @@ /* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */ //#define MIDI_TONE_KEYCODE_OCTAVES 1 +#define DYNAMIC_KEYMAP_LAYER_COUNT 4 + +// EEPROM usage + +// TODO: refactor with new user EEPROM code (coming soon) +#define EEPROM_MAGIC 0x451F +#define EEPROM_MAGIC_ADDR 32 +// Bump this every time we change what we store +// This will automatically reset the EEPROM with defaults +// and avoid loading invalid data from the EEPROM +#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION_ADDR 34 + +// Backlight config starts after EEPROM version +#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 +// Dynamic keymap starts after backlight config (35+37) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 diff --git a/keyboards/wilba_tech/wt80_a/keymaps/default/keymap.c b/keyboards/wilba_tech/wt80_a/keymaps/default/keymap.c index cf9225e3e5ac..9cbe7ff6241a 100644 --- a/keyboards/wilba_tech/wt80_a/keymaps/default/keymap.c +++ b/keyboards/wilba_tech/wt80_a/keymaps/default/keymap.c @@ -18,5 +18,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + [2] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [3] = LAYOUT_all( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + }; diff --git a/keyboards/wilba_tech/wt80_a/rules.mk b/keyboards/wilba_tech/wt80_a/rules.mk index 99224c247cdd..76a07d7a44ac 100644 --- a/keyboards/wilba_tech/wt80_a/rules.mk +++ b/keyboards/wilba_tech/wt80_a/rules.mk @@ -52,17 +52,20 @@ BOOTLOADER = atmel-dfu # change yes to no to disable # 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 = yes # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend # if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -NKRO_ENABLE = no # USB Nkey Rollover +NKRO_ENABLE = yes # USB Nkey Rollover BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default 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 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches + +RAW_ENABLE = yes +DYNAMIC_KEYMAP_ENABLE = yes \ No newline at end of file diff --git a/keyboards/wilba_tech/wt80_a/wt80_a.h b/keyboards/wilba_tech/wt80_a/wt80_a.h index 26403ef3475a..a6fb1cccb1fc 100644 --- a/keyboards/wilba_tech/wt80_a/wt80_a.h +++ b/keyboards/wilba_tech/wt80_a/wt80_a.h @@ -41,3 +41,18 @@ { K500, K501, K502, ____, ____, ____, K506, ____, ____, ____, K510, K511, K512, K513, K514, K515, K516 } \ } +#define LAYOUT_no_split( \ + K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \ + K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, \ + K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, \ + K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K415, \ + K500, K501, K502, K506, K510, K511, K512, K513, K514, K515, K516 \ +) { \ + { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, ____, K014, K015, K016 }, \ + { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116 }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216 }, \ + { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, ____, ____, ____ }, \ + { K400, ____, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, ____, K415, ____ }, \ + { K500, K501, K502, ____, ____, ____, K506, ____, ____, ____, K510, K511, K512, K513, K514, K515, K516 } \ +} diff --git a/keyboards/wilba_tech/wt_main.c b/keyboards/wilba_tech/wt_main.c index f514dbefcda2..23f07d7eb144 100644 --- a/keyboards/wilba_tech/wt_main.c +++ b/keyboards/wilba_tech/wt_main.c @@ -16,6 +16,152 @@ #include "quantum.h" #include "keyboards/wilba_tech/wt_mono_backlight.h" +#include "keyboards/zeal60/zeal60_api.h" // Temporary hack + +#include "raw_hid.h" +#include "dynamic_keymap.h" +#include "timer.h" +#include "tmk_core/common/eeprom.h" + +bool eeprom_is_valid(void) +{ + return (eeprom_read_word(((void*)EEPROM_MAGIC_ADDR)) == EEPROM_MAGIC && + eeprom_read_byte(((void*)EEPROM_VERSION_ADDR)) == EEPROM_VERSION); +} + +void eeprom_set_valid(bool valid) +{ + eeprom_update_word(((void*)EEPROM_MAGIC_ADDR), valid ? EEPROM_MAGIC : 0xFFFF); + eeprom_update_byte(((void*)EEPROM_VERSION_ADDR), valid ? EEPROM_VERSION : 0xFF); +} + +void eeprom_reset(void) +{ + // Set the Zeal60 specific EEPROM state as invalid. + eeprom_set_valid(false); + // Set the TMK/QMK EEPROM state as invalid. + eeconfig_disable(); +} + +#ifdef RAW_ENABLE + +void raw_hid_receive( uint8_t *data, uint8_t length ) +{ + uint8_t *command_id = &(data[0]); + uint8_t *command_data = &(data[1]); + switch ( *command_id ) + { + case id_get_protocol_version: + { + command_data[0] = PROTOCOL_VERSION >> 8; + command_data[1] = PROTOCOL_VERSION & 0xFF; + break; + } + case id_get_keyboard_value: + { + if ( command_data[0] == id_uptime ) + { + uint32_t value = timer_read32(); + command_data[1] = (value >> 24 ) & 0xFF; + command_data[2] = (value >> 16 ) & 0xFF; + command_data[3] = (value >> 8 ) & 0xFF; + command_data[4] = value & 0xFF; + } + else + { + *command_id = id_unhandled; + } + break; + } +#ifdef DYNAMIC_KEYMAP_ENABLE + case id_dynamic_keymap_get_keycode: + { + uint16_t keycode = dynamic_keymap_get_keycode( command_data[0], command_data[1], command_data[2] ); + command_data[3] = keycode >> 8; + command_data[4] = keycode & 0xFF; + break; + } + case id_dynamic_keymap_set_keycode: + { + dynamic_keymap_set_keycode( command_data[0], command_data[1], command_data[2], ( command_data[3] << 8 ) | command_data[4] ); + break; + } + case id_dynamic_keymap_reset: + { + dynamic_keymap_reset(); + break; + } +#endif // DYNAMIC_KEYMAP_ENABLE + case id_backlight_config_set_value: + { + //backlight_config_set_value(command_data); + break; + } + case id_backlight_config_get_value: + { + //backlight_config_get_value(command_data); + break; + } + case id_backlight_config_save: + { + //backlight_config_save(); + break; + } + case id_eeprom_reset: + { + eeprom_reset(); + break; + } + case id_bootloader_jump: + { + // Need to send data back before the jump + // Informs host that the command is handled + raw_hid_send( data, length ); + // Give host time to read it + wait_ms(100); + bootloader_jump(); + break; + } + default: + { + // Unhandled message. + *command_id = id_unhandled; + break; + } + } + + // Return same buffer with values changed + raw_hid_send( data, length ); + +} + +#endif + +void main_init(void) +{ + // If the EEPROM has the magic, the data is good. + // OK to load from EEPROM. + if (eeprom_is_valid()) { + //backlight_config_load(); + } else { + // If the EEPROM has not been saved before, or is out of date, + // save the default values to the EEPROM. Default values + // come from construction of the zeal_backlight_config instance. + //backlight_config_save(); +#ifdef DYNAMIC_KEYMAP_ENABLE + // This resets the keymaps in EEPROM to what is in flash. + dynamic_keymap_reset(); +#endif + // Save the magic number last, in case saving was interrupted + eeprom_set_valid(true); + } + + // Initialize LED drivers for backlight. + backlight_init_drivers(); + + backlight_timer_init(); + backlight_timer_enable(); +} void bootmagic_lite(void) { @@ -32,9 +178,7 @@ void bootmagic_lite(void) // If the Esc (matrix 0,0) is held down on power up, // reset the EEPROM valid state and jump to bootloader. if ( matrix_get_row(0) & (1<<0) ) { - // Set the TMK/QMK EEPROM state as invalid. - eeconfig_disable(); - // Jump to bootloader. + eeprom_reset(); bootloader_jump(); } } @@ -42,14 +186,13 @@ void bootmagic_lite(void) void matrix_init_kb(void) { bootmagic_lite(); - backlight_init_drivers(); - backlight_timer_init(); - backlight_timer_enable(); + main_init(); matrix_init_user(); } void matrix_scan_kb(void) { + // This only updates the LED driver buffers if something has changed. backlight_update_pwm_buffers(); matrix_scan_user(); } diff --git a/keyboards/zeal60/rgb_backlight.c b/keyboards/zeal60/rgb_backlight.c index ce8b1cb17920..c3dade123c90 100644 --- a/keyboards/zeal60/rgb_backlight.c +++ b/keyboards/zeal60/rgb_backlight.c @@ -15,12 +15,12 @@ */ #if RGB_BACKLIGHT_ENABLED -#if defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_ZEAL65) || defined (RGB_BACKLIGHT_M60_A) +#if defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_ZEAL65) || defined (RGB_BACKLIGHT_M60_A) || defined(RGB_BACKLIGHT_M6_B) #else -#error None of the following was defined: RGB_BACKLIGHT_ZEAL60, RGB_BACKLIGHT_ZEAL65, RGB_BACKLIGHT_M60_A +#error None of the following was defined: RGB_BACKLIGHT_ZEAL60, RGB_BACKLIGHT_ZEAL65, RGB_BACKLIGHT_M60_A, RGB_BACKLIGHT_M6_B #endif -#include "zeal60.h" +#include "quantum.h" #include "rgb_backlight.h" #include "rgb_backlight_api.h" #include "rgb_backlight_keycodes.h" @@ -32,7 +32,14 @@ #include "quantum/color.h" #include "drivers/avr/i2c_master.h" + +#if defined (RGB_BACKLIGHT_M6_B) +#include "drivers/issi/is31fl3218.h" +#define BACKLIGHT_LED_COUNT 6 +#else #include "drivers/issi/is31fl3731.h" +#define BACKLIGHT_LED_COUNT 72 +#endif #define BACKLIGHT_EFFECT_MAX 10 @@ -69,11 +76,12 @@ uint8_t g_indicator_state = 0; uint32_t g_tick = 0; // Ticks since this key was last hit. -uint8_t g_key_hit[72]; +uint8_t g_key_hit[BACKLIGHT_LED_COUNT]; // Ticks since any key was last hit. uint32_t g_any_key_hit = 0; +#if !defined(RGB_BACKLIGHT_M6_B) // This is a 7-bit address, that gets left-shifted and bit 0 // set to 0 for write, 1 for read (as per I2C protocol) #define ISSI_ADDR_1 0x74 @@ -162,7 +170,7 @@ const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { {1, C9_16, C7_15, C6_15}, // LD16 {1, C8_16, C7_16, C6_16}, // LD17 }; - +#endif // !defined(RGB_BACKLIGHT_M6_B) typedef struct Point { @@ -175,7 +183,7 @@ typedef struct Point { // point values in range x=0..224 y=0..64 // origin is center of top-left key (i.e Esc) #if defined (RGB_BACKLIGHT_ZEAL65) -const Point g_map_led_to_point[72] PROGMEM = { +const Point g_map_led_to_point[BACKLIGHT_LED_COUNT] PROGMEM = { // LA0..LA17 {120,16}, {104,16}, {88,16}, {72,16}, {56,16}, {40,16}, {24,16}, {4,16}, {4,32}, {128,0}, {112,0}, {96,0}, {80,0}, {64,0}, {48,0}, {32,0}, {16,0}, {0,0}, @@ -189,7 +197,7 @@ const Point g_map_led_to_point[72] PROGMEM = { {124,32}, {140,32}, {156,32}, {172,32}, {188,32}, {214,32}, {180,48}, {202,48}, {224,48}, {116,48}, {132,48}, {148,48}, {164,48}, {255,255}, {144,60}, {164,64}, {188,64}, {208,64} }; -const Point g_map_led_to_point_polar[72] PROGMEM = { +const Point g_map_led_to_point_polar[BACKLIGHT_LED_COUNT] PROGMEM = { // LA0..LA17 {64,128}, {75,132}, {84,145}, {91,164}, {97,187}, {102,213}, {105,242}, {109,255}, {128,247}, {61,255}, {67,255}, {72,255}, {77,255}, {82,255}, {86,255}, {90,255}, {93,255}, {96,255}, @@ -204,7 +212,7 @@ const Point g_map_led_to_point_polar[72] PROGMEM = { {189,128}, {200,131}, {210,141}, {218,159}, {201,228}, {201,228}, {206,255}, {213,255}, {218,255} }; #elif defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_M60_A) -const Point g_map_led_to_point[72] PROGMEM = { +const Point g_map_led_to_point[BACKLIGHT_LED_COUNT] PROGMEM = { // LA0..LA17 {120,16}, {104,16}, {88,16}, {72,16}, {56,16}, {40,16}, {24,16}, {4,16}, {4,32}, {128,0}, {112,0}, {96,0}, {80,0}, {64,0}, {48,0}, {32,0}, {16,0}, {0,0}, @@ -218,7 +226,7 @@ const Point g_map_led_to_point[72] PROGMEM = { {124,32}, {140,32}, {156,32}, {172,32}, {188,32}, {214,32}, {180,48}, {210,48}, {224,48}, {116,48}, {132,48}, {148,48}, {164,48}, {144,64}, {161,64}, {181,64}, {201,64}, {221,64} }; -const Point g_map_led_to_point_polar[72] PROGMEM = { +const Point g_map_led_to_point_polar[BACKLIGHT_LED_COUNT] PROGMEM = { // LA0..LA17 {58,129}, {70,129}, {80,139}, {89,157}, {96,181}, {101,208}, {105,238}, {109,255}, {128,247}, {58,255}, {64,255}, {70,255}, {75,255}, {80,255}, {85,255}, {89,255}, {93,255}, {96,255}, @@ -232,6 +240,16 @@ const Point g_map_led_to_point_polar[72] PROGMEM = { {0,27}, {0,64}, {0,101}, {0,137}, {0,174}, {255,233}, {228,201}, {235,255}, {237,255}, {195,128}, {206,136}, {215,152}, {222,175}, {205,234}, {209,255}, {214,255}, {219,255}, {223,255} }; +#elif defined (RGB_BACKLIGHT_M6_B) +// M6-B is really simple: +// 0 3 5 +// 1 2 4 +const Point g_map_led_to_point[BACKLIGHT_LED_COUNT] PROGMEM = { + {0,0}, {0,16}, {16,16}, {16,0}, {32,16}, {32,0} +}; +const Point g_map_led_to_point_polar[BACKLIGHT_LED_COUNT] PROGMEM = { + {0,0}, {0,16}, {16,16}, {16,0}, {32,16}, {32,0} +}; #endif // This may seem counter-intuitive, but it's quite flexible. @@ -245,16 +263,30 @@ void map_led_to_point( uint8_t index, Point *point ) point->x = pgm_read_byte(addr); point->y = pgm_read_byte(addr+1); +#if defined (RGB_BACKLIGHT_M6_B) + return; +#endif + switch (index) { case 18+4: // LB4A if ( g_config.use_split_backspace ) point->x -= 8; break; +#if defined (RGB_BACKLIGHT_ZEAL60) case 18+14: // LB14A if ( g_config.use_iso_enter ) point->y += 8; // extremely pedantic break; + case 54+5: // LD5A + if ( !g_config.use_iso_enter ) + point->x -= 10; + break; + case 36+16: // LC16A + if ( !g_config.use_split_left_shift ) + point->x += 8; + break; +#endif #if defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_M60_A) case 36+0: // LC0A if ( g_config.use_7u_spacebar ) @@ -264,19 +296,11 @@ void map_led_to_point( uint8_t index, Point *point ) if ( g_config.use_7u_spacebar ) point->x += 4; break; -#endif - case 36+16: // LC16A - if ( !g_config.use_split_left_shift ) - point->x += 8; - break; - case 54+5: // LD5A - if ( !g_config.use_iso_enter ) - point->x -= 10; - break; case 54+7: // LD7A if ( !g_config.use_split_right_shift ) point->x -= 8; break; +#endif } } @@ -325,6 +349,13 @@ const uint8_t g_map_row_column_to_led[MATRIX_ROWS][MATRIX_COLS] PROGMEM = { { 36+16, 36+15, 36+5, 36+4, 36+3, 36+2, 36+1, 54+9, 54+10, 54+11, 54+12, 54+6, 54+7, 54+8 }, { 36+17, 36+8, 36+7, 36+6, 255, 255, 255, 36+0, 255, 54+13, 54+14, 54+15, 54+16, 54+17 } }; +#elif defined (RGB_BACKLIGHT_M6_B) +// M6-B is really simple: +// 0 3 5 +// 1 2 4 +const uint8_t g_map_row_column_to_led[MATRIX_ROWS][MATRIX_COLS] PROGMEM = { + { 0, 3, 5, 1, 2, 4 } +}; #endif void map_row_column_to_led( uint8_t row, uint8_t column, uint8_t *led ) @@ -338,18 +369,30 @@ void map_row_column_to_led( uint8_t row, uint8_t column, uint8_t *led ) void backlight_update_pwm_buffers(void) { +#if defined (RGB_BACKLIGHT_M6_B) + IS31FL3218_update_pwm_buffers(); +#else IS31FL3731_update_pwm_buffers( ISSI_ADDR_1, ISSI_ADDR_2 ); IS31FL3731_update_led_control_registers( ISSI_ADDR_1, ISSI_ADDR_2 ); +#endif } void backlight_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ) { +#if defined (RGB_BACKLIGHT_M6_B) + IS31FL3218_set_color( index, red, green, blue ); +#else IS31FL3731_set_color( index, red, green, blue ); +#endif } void backlight_set_color_all( uint8_t red, uint8_t green, uint8_t blue ) { +#if defined (RGB_BACKLIGHT_M6_B) + IS31FL3218_set_color_all( red, green, blue ); +#else IS31FL3731_set_color_all( red, green, blue ); +#endif } void backlight_set_key_hit(uint8_t row, uint8_t column) @@ -436,6 +479,7 @@ void backlight_effect_rgb_test(void) } } +#if defined(RGB_DEBUGGING_ONLY) // This tests the LEDs // Note that it will change the LED control registers // in the LED drivers, and leave them in an invalid @@ -475,6 +519,7 @@ void backlight_effect_single_LED_test(void) backlight_set_color_all( 255, 255, 255 ); backlight_test_led( led, color==0, color==1, color==2 ); } +#endif // defined(RGB_DEBUGGING_ONLY) // All LEDs off void backlight_effect_all_off(void) @@ -502,7 +547,7 @@ void backlight_effect_alphas_mods(void) { uint8_t index; map_row_column_to_led( row, column, &index ); - if ( index < 72 ) + if ( index < BACKLIGHT_LED_COUNT ) { if ( ( g_config.alphas_mods[row] & (1< Date: Tue, 13 Nov 2018 11:38:48 -0500 Subject: [PATCH 414/505] Keyboard: Add 412 64 Model 00 keyboard. (#4400) * Add 412-64 keyboard firmware It's pretty barebones for now, but the Model 00 is also a pretty barebones machine. Model 01 won't be better, but plenty of pins exist for things like LEDs on Model 02. * MANU/PROD ID changes. Changed around the MANUFACTURER and PRODUCT IDs to be more polite when viewed in qmk toolbox. * Fixing PROD again. For the love of all that is good and holy, that was ugly. This new one looks better. This stuff matters to me for some reason. * Yep, updating MANU again. There we go. That's better - From my name to my "design firm". * Update keyboards/412_64/keymaps/default/keymap.c Co-Authored-By: FateEverywhere <41215461+FateEverywhere@users.noreply.github.com> * Update keyboards/412_64/rules.mk Co-Authored-By: FateEverywhere <41215461+FateEverywhere@users.noreply.github.com> * Update keyboards/412_64/rules.mk Co-Authored-By: FateEverywhere <41215461+FateEverywhere@users.noreply.github.com> * Update keyboards/412_64/rules.mk Co-Authored-By: FateEverywhere <41215461+FateEverywhere@users.noreply.github.com> * Update keyboards/412_64/rules.mk Co-Authored-By: FateEverywhere <41215461+FateEverywhere@users.noreply.github.com> --- keyboards/412_64/412_64.c | 29 ++++ keyboards/412_64/412_64.h | 29 ++++ keyboards/412_64/config.h | 202 ++++++++++++++++++++++ keyboards/412_64/keymaps/default/config.h | 5 + keyboards/412_64/keymaps/default/keymap.c | 105 +++++++++++ keyboards/412_64/keymaps/default/rules.mk | 1 + keyboards/412_64/readme.md | 15 ++ keyboards/412_64/rules.mk | 73 ++++++++ 8 files changed, 459 insertions(+) create mode 100644 keyboards/412_64/412_64.c create mode 100644 keyboards/412_64/412_64.h create mode 100644 keyboards/412_64/config.h create mode 100644 keyboards/412_64/keymaps/default/config.h create mode 100644 keyboards/412_64/keymaps/default/keymap.c create mode 100644 keyboards/412_64/keymaps/default/rules.mk create mode 100644 keyboards/412_64/readme.md create mode 100644 keyboards/412_64/rules.mk diff --git a/keyboards/412_64/412_64.c b/keyboards/412_64/412_64.c new file mode 100644 index 000000000000..eaec54ade88e --- /dev/null +++ b/keyboards/412_64/412_64.c @@ -0,0 +1,29 @@ + +#include "412_64.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/412_64/412_64.h b/keyboards/412_64/412_64.h new file mode 100644 index 000000000000..27a32f15aaa5 --- /dev/null +++ b/keyboards/412_64/412_64.h @@ -0,0 +1,29 @@ + +#ifndef FOURx16_H +#define FOURx16_H + +#include "quantum.h" +#define ___ KC_NO + +// This a shortcut to help you visually see your layout. +// The first section contains all of the arguments +// The second converts the arguments into a two-dimensional array + +#define LAYOUT_ortho_4x16( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K10, K11, K12, K13, K14, K15, \ + K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K30, K31, \ + K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42, K43, K44, K45, K46, K47, \ + K48, K49, K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, K60, K61, K62, K63 \ +) \ +{ \ + { K00, K02, K04, K06, K08, K10, K12, K14 }, \ + { K01, K03, K05, K07, K09, K11, K13, K15 }, \ + { K16, K18, K20, K22, K24, K26, K28, K30 }, \ + { K17, K19, K21, K23, K25, K27, K29, K31 }, \ + { K32, K34, K36, K38, K40, K42, K44, K46 }, \ + { K33, K35, K37, K39, K41, K43, K45, K47 }, \ + { K48, K50, K52, K54, K56, K58, K60, K62 }, \ + { K49, K51, K53, K55, K57, K59, K61, K63 } \ +} + +#endif diff --git a/keyboards/412_64/config.h b/keyboards/412_64/config.h new file mode 100644 index 000000000000..28d9763c313f --- /dev/null +++ b/keyboards/412_64/config.h @@ -0,0 +1,202 @@ + + +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xF7E0 +#define PRODUCT_ID 0x0412 +#define DEVICE_VER 0x0000 +#define MANUFACTURER EDI/SCI +#define PRODUCT 412 64 Model 00 +#define DESCRIPTION A compact 60% keyboard inspired by the 4x4x4x4x4 + +/* key matrix size */ +#define MATRIX_ROWS 8 +#define MATRIX_COLS 8 + +/* + * Keyboard Matrix Assignments + * + * Change this to how you wired your keyboard + * COLS: AVR pins used for columns, left to right + * ROWS: AVR pins used for rows, top to bottom + * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode) + * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode) + * +*/ +#define MATRIX_ROW_PINS { D3, F4, F5, F6, F7, B1, B3, B2 } +#define MATRIX_COL_PINS { B0, D2, D0, D1, D4, C6, D7, E6 } +#define UNUSED_PINS { B4, B5, B6, B7, C7, F0, F1 } + + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +// #define BACKLIGHT_PIN C7 +// #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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + diff --git a/keyboards/412_64/keymaps/default/config.h b/keyboards/412_64/keymaps/default/config.h new file mode 100644 index 000000000000..d533d806c90c --- /dev/null +++ b/keyboards/412_64/keymaps/default/config.h @@ -0,0 +1,5 @@ + + +#pragma once + +// place overrides here diff --git a/keyboards/412_64/keymaps/default/keymap.c b/keyboards/412_64/keymaps/default/keymap.c new file mode 100644 index 000000000000..c098a37e5ef4 --- /dev/null +++ b/keyboards/412_64/keymaps/default/keymap.c @@ -0,0 +1,105 @@ + +#include QMK_KEYBOARD_H + +#define _MAIN 0 +#define _RAISE 1 +#define _LOWER 2 + +// Readability keycodes +#define LOWER MO(_LOWER) +#define RAISE MO(_RAISE) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + +/* MAIN + * .-----------------------------------------------------------------------------------------------------------------------------------------------. + * | TAB | Q | W | E | R | T | Y | U | I | O | P | Backsp | Delete | 7 | 8 | 9 | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | ESC | A | S | D | F | G | H | J | K | L | ; | ' | PgUp | 4 | 5 | 6 | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | SHIFT | Z | X | C | V | B | N | M | , | . | / | ENTER | PgDn | 1 | 2 | 3 | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | LCTRL | PAUS | GUI | ALT | Lower | Space | Space | Raise | Left | Down | Up | Right | Shift | 0 | . | ENTER | + * '-----------------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_MAIN] = LAYOUT_ortho_4x16( + 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_DEL, KC_KP_7, KC_KP_8, KC_KP_9, + 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_PGUP, KC_KP_4, KC_KP_5, KC_KP_6, + 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_PGDN, KC_KP_1, KC_KP_2, KC_KP_3, + KC_LCTL, KC_PAUS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_RSFT, KC_KP_0, KC_KP_DOT, KC_PENT + ), + +/* RAISE + * .-----------------------------------------------------------------------------------------------------------------------------------------------. + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | | Insert | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | | - | = | [ | ] | \ | Home | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | | ISO # | ISO / | | | PScr | End | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | | Next | Vol- | Vol+ | Play | | | | | + * '-----------------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_RAISE] = LAYOUT_ortho_4x16( + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, KC_INS, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, KC_HOME, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, KC_NUHS, KC_NUBS, _______, _______, KC_PSCR, KC_END, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY, _______, _______, _______, _______ + ), + +/* LOWER + * .-----------------------------------------------------------------------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | | | | Reset | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | F7 | F8 | F9 | F10 | F11 | F12 | ISO ~ | ISO | | | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | | | | | Mute | | | | | + * '-----------------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_LOWER] = LAYOUT_ortho_4x16( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, _______, _______, _______, RESET, + _______, 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_MUTE, _______, _______, _______, _______ + ), + +}; + + +const uint16_t PROGMEM fn_actions[] = { + +}; + + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { + keyevent_t event = record->event; + (void)event; + + switch (id) { + + } + 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/412_64/keymaps/default/rules.mk b/keyboards/412_64/keymaps/default/rules.mk new file mode 100644 index 000000000000..08fdcc0a5684 --- /dev/null +++ b/keyboards/412_64/keymaps/default/rules.mk @@ -0,0 +1 @@ +KEY_LOCK_ENABLE = yes # Enable the universal locking key, which lets you do any locking you require. \ No newline at end of file diff --git a/keyboards/412_64/readme.md b/keyboards/412_64/readme.md new file mode 100644 index 000000000000..08110310750b --- /dev/null +++ b/keyboards/412_64/readme.md @@ -0,0 +1,15 @@ +# 412-64 + +![412-64](image_here) + +A compact 60% keyboard designed by Fate Everywhere and sold on a limited basis. Born out of the desire for a Planck with a numpad for technical work. + +Keyboard Maintainer: [Fate Everywhere](https://github.com/fateeverywhere) +Hardware Supported: 4x16 T&E Prototype, 412-64 Mk. 0, Mk. 1. +Hardware Availability: Highly limited, contact /u/FateEverywhere on reddit for availability. + +Make example for this keyboard (after setting up your build environment): + + make 412-64:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). \ No newline at end of file diff --git a/keyboards/412_64/rules.mk b/keyboards/412_64/rules.mk new file mode 100644 index 000000000000..9e74da5d9834 --- /dev/null +++ b/keyboards/412_64/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=4096 + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = atmel-dfu + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = lite # 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 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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +LAYOUTS = ortho_4x16 From 911b2d07565fa0c6edb49a198f4420391f7f33f3 Mon Sep 17 00:00:00 2001 From: KOBAYASHI Daisuke Date: Wed, 22 Aug 2018 23:56:24 +0900 Subject: [PATCH 415/505] Docs: Fix descriptions of KC_INT1 and KC_INT3 --- docs/keycodes.md | 4 ++-- docs/keycodes_basic.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/keycodes.md b/docs/keycodes.md index e5d35b2b4af3..592b52ec7b3a 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -141,9 +141,9 @@ This is a reference only. Each group of keys links to the page documenting their |`KC_LOCKING_SCROLL` |`KC_LSCR` |Locking Scroll Lock | |`KC_KP_COMMA` |`KC_PCMM` |Keypad `,` | |`KC_KP_EQUAL_AS400` | |Keypad `=` on AS/400 keyboards | -|`KC_INT1` |`KC_RO` |JIS `\` and | | +|`KC_INT1` |`KC_RO` |JIS `\` and `_` | |`KC_INT2` |`KC_KANA` |JIS Katakana/Hiragana | -|`KC_INT3` |`KC_JYEN` |JIS `¥` | +|`KC_INT3` |`KC_JYEN` |JIS `¥` and | | |`KC_INT4` |`KC_HENK` |JIS Henkan | |`KC_INT5` |`KC_MHEN` |JIS Muhenkan | |`KC_INT6` | |JIS Numpad `,` | diff --git a/docs/keycodes_basic.md b/docs/keycodes_basic.md index 82e94aa5e9c0..ada9cc0e5a21 100644 --- a/docs/keycodes_basic.md +++ b/docs/keycodes_basic.md @@ -123,9 +123,9 @@ The basic set of keycodes are based on the [HID Keyboard/Keypad Usage Page (0x07 |Key |Aliases |Description | |----------|---------|-------------------------------| -|`KC_INT1` |`KC_RO` |JIS `\` and || +|`KC_INT1` |`KC_RO` |JIS `\` and `_` | |`KC_INT2` |`KC_KANA`|JIS Katakana/Hiragana | -|`KC_INT3` |`KC_JYEN`|JIS `¥` | +|`KC_INT3` |`KC_JYEN`|JIS `¥` and || |`KC_INT4` |`KC_HENK`|JIS Henkan | |`KC_INT5` |`KC_MHEN`|JIS Muhenkan | |`KC_INT6` | |JIS Numpad `,` | From 991686203c91eca9149e6fe942be73e5172719ba Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Tue, 13 Nov 2018 14:20:42 -0800 Subject: [PATCH 416/505] converter/m0110_usb Configurator support and readme cleanup (#4421) * Apple M0110 USB converter: readme cleanup * Apple M0110 USB converter: Configurator support --- keyboards/converter/m0110_usb/README.md | 18 +-- keyboards/converter/m0110_usb/info.json | 172 ++++++++++++++++++++++++ 2 files changed, 181 insertions(+), 9 deletions(-) create mode 100644 keyboards/converter/m0110_usb/info.json diff --git a/keyboards/converter/m0110_usb/README.md b/keyboards/converter/m0110_usb/README.md index 3041eb0b4a59..2e8a2eaef1eb 100644 --- a/keyboards/converter/m0110_usb/README.md +++ b/keyboards/converter/m0110_usb/README.md @@ -1,19 +1,19 @@ -M0110(A) keyboard converter -====================================== +# M0110(A) keyboard converter + This is a port of the original M0110 converter from TMK to QMK. The original converter was designed to work with **ATmega32U2** and **ATmega32U4** based microcontrollers to convert Apple M0110/M0110A keyboards and M0120 numpads to USB. This port has been tested to be compatible with the [**Adafruit Feather 32U4 BLE**](https://learn.adafruit.com/adafruit-feather-32u4-bluefruit-le). -### Enabling Bluetooth for the Adafruit Feather 32U4 BLE ----------------------------------------------------- +## Enabling Bluetooth for the Adafruit Feather 32U4 BLE + Simply add `BLUETOOTH = AdafruitBLE` to your `rules.mk` file. This enables code specifically for the Adafruit Feather 32U4 BLE. If enabled, the device will use the `PRODUCT` and `DESCRIPTION` values from `config.h` for the device name displayed by the Feather on host devices. You can simply change these values to change the device name. -### Pins ----- +## Pins + This port utilizes the same pins that the TMK converter used. `PD1` is used for `CLOCK` and `PD0` is used for the `DATA` from the keyboard. These pins can be changed in `config.h`. -### Other important hardware notes from the original TMK converter Readme: +## Other important hardware notes from the original TMK converter Readme: >### Hardware >-------- >You can buy preassembled [TMK converter] or make yourown with AVR dev board like PJRC [Teensy]. @@ -45,7 +45,7 @@ This port utilizes the same pins that the TMK converter used. `PD1` is used for [**View the original TMK converter Repository**](https://github.com/tmk/tmk_keyboard/tree/master/converter/m0110_usb) -### QMK Port Changelog ---------- +## QMK Port Changelog + - 2018/08/01 - Original Release diff --git a/keyboards/converter/m0110_usb/info.json b/keyboards/converter/m0110_usb/info.json new file mode 100644 index 000000000000..6ef610334506 --- /dev/null +++ b/keyboards/converter/m0110_usb/info.json @@ -0,0 +1,172 @@ +{ + "keyboard_name": "M0110(A) keyboard converter", + "url": "", + "maintainer": "qmk", + "width": 19.25, + "height": 5, + "layouts": { + "LAYOUT_ansi": { + "key_count": 78, + "layout": [ + {"label":"`", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"-", "x":11, "y":0}, + {"label":"=", "x":12, "y":0}, + {"label":"Backspace", "x":13, "y":0, "w":1.5}, + {"label":"Num Lock", "x":15.25, "y":0}, + {"label":"=", "x":16.25, "y":0}, + {"label":"/", "x":17.25, "y":0}, + {"label":"*", "x":18.25, "y":0}, + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":"[", "x":11.5, "y":1}, + {"label":"]", "x":12.5, "y":1}, + {"label":"7", "x":15.25, "y":1}, + {"label":"8", "x":16.25, "y":1}, + {"label":"9", "x":17.25, "y":1}, + {"label":"-", "x":18.25, "y":1}, + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":";", "x":10.75, "y":2}, + {"label":"'", "x":11.75, "y":2}, + {"label":"Enter", "x":12.75, "y":2, "w":1.75}, + {"label":"4", "x":15.25, "y":2}, + {"label":"5", "x":16.25, "y":2}, + {"label":"6", "x":17.25, "y":2}, + {"label":"+", "x":18.25, "y":2}, + {"label":"Shift", "x":0, "y":3, "w":2.25}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":",", "x":9.25, "y":3}, + {"label":".", "x":10.25, "y":3}, + {"label":"/", "x":11.25, "y":3}, + {"label":"Up", "x":13.5, "y":3}, + {"label":"1", "x":15.25, "y":3}, + {"label":"2", "x":16.25, "y":3}, + {"label":"3", "x":17.25, "y":3}, + {"label":"Enter", "x":18.25, "y":3, "h":2}, + {"label":"Alt", "x":0, "y":4, "w":1.5}, + {"label":"GUI", "x":1.5, "y":4, "w":2}, + {"label":"Space", "x":3.5, "y":4, "w":6}, + {"label":"MO(1)", "x":9.5, "y":4}, + {"label":"\\", "x":10.5, "y":4}, + {"label":"Left", "x":11.5, "y":4}, + {"label":"Right", "x":12.5, "y":4}, + {"label":"Down", "x":13.5, "y":4}, + {"label":"0", "x":15.25, "y":4, "w":2}, + {"label":".", "x":17.25, "y":4} + ] + }, + "LAYOUT_iso": { + "key_count": 75, + "layout": [ + {"label":"`", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"-", "x":11, "y":0}, + {"label":"=", "x":12, "y":0}, + {"label":"Backspace", "x":13, "y":0, "w":1.5}, + {"label":"Num Lock", "x":15.25, "y":0}, + {"label":"=", "x":16.25, "y":0}, + {"label":"/", "x":17.25, "y":0}, + {"label":"*", "x":18.25, "y":0}, + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":"[", "x":11.5, "y":1}, + {"label":"]", "x":12.5, "y":1}, + {"label":"Return", "x":13.75, "y":1, "w":0.75, "h":2}, + {"label":"7", "x":15.25, "y":1}, + {"label":"8", "x":16.25, "y":1}, + {"label":"9", "x":17.25, "y":1}, + {"label":"-", "x":18.25, "y":1}, + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":";", "x":10.75, "y":2}, + {"label":"'", "x":11.75, "y":2}, + {"label":"#", "x":12.75, "y":2}, + {"label":"4", "x":15.25, "y":2}, + {"label":"5", "x":16.25, "y":2}, + {"label":"6", "x":17.25, "y":2}, + {"label":"+", "x":18.25, "y":2}, + {"label":"Shift", "x":0, "y":3, "w":1.25}, + {"label":"\\", "x":1.25, "y":3}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":",", "x":9.25, "y":3}, + {"label":".", "x":10.25, "y":3}, + {"label":"/", "x":11.25, "y":3}, + {"label":"1", "x":15.25, "y":3}, + {"label":"2", "x":16.25, "y":3}, + {"label":"3", "x":17.25, "y":3}, + {"label":"Enter", "x":18.25, "y":3, "h":2}, + {"label":"Option", "x":1, "y":4}, + {"label":"GUI", "x":2, "y":4, "w":1.5}, + {"label":"Space", "x":3.5, "y":4, "w":7.5}, + {"label":"Enter", "x":11, "y":4, "w":1.5}, + {"label":"0", "x":15.25, "y":4, "w":2}, + {"label":".", "x":17.25, "y":4} + ] + } + } +} From e10a602e7b1ac8d7f2ff027ae41570fe1a2ba57d Mon Sep 17 00:00:00 2001 From: FiNeXdesign Date: Tue, 13 Nov 2018 23:44:50 +0100 Subject: [PATCH 417/505] Keymap: Finex Redox keymap (#4418) * Added FiNeX custom Redox Layout, first commit. * updated readme * removed old code --- keyboards/redox/keymaps/finex/config.h | 36 +++++ keyboards/redox/keymaps/finex/keymap.c | 188 ++++++++++++++++++++++++ keyboards/redox/keymaps/finex/readme.md | 35 +++++ keyboards/redox/keymaps/finex/rules.mk | 3 + 4 files changed, 262 insertions(+) create mode 100644 keyboards/redox/keymaps/finex/config.h create mode 100644 keyboards/redox/keymaps/finex/keymap.c create mode 100644 keyboards/redox/keymaps/finex/readme.md create mode 100644 keyboards/redox/keymaps/finex/rules.mk diff --git a/keyboards/redox/keymaps/finex/config.h b/keyboards/redox/keymaps/finex/config.h new file mode 100644 index 000000000000..9adbcedf49eb --- /dev/null +++ b/keyboards/redox/keymaps/finex/config.h @@ -0,0 +1,36 @@ +/* +Copyright 2018 Leonardo (FiNeX) Finetti + +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 + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#undef RGBLED_NUM +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 14 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 diff --git a/keyboards/redox/keymaps/finex/keymap.c b/keyboards/redox/keymaps/finex/keymap.c new file mode 100644 index 000000000000..8b8f5f183903 --- /dev/null +++ b/keyboards/redox/keymaps/finex/keymap.c @@ -0,0 +1,188 @@ +#include QMK_KEYBOARD_H + +extern keymap_config_t keymap_config; + +// Layer names +#define _QWERTY 0 +#define _COLEMAKDHMK 1 +#define _QWERTY_MAC 2 +#define _COLEMAKDHMK_MAC 3 +#define _SYMB 4 +#define _ADJUST 5 + +// Custom keycodes +enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAKDHMK, + QWERTY_MAC, + COLEMAKDHMK_MAC, + SYMB, + ADJUST, + ASC_SAR, + ASC_DAR, + ASC_SQT, + ASC_DQT, + ASC_HAP, + ASC_SAD +}; + +// Shortcut to make keymap more readable +#define KC_SYQT LT(_SYMB, KC_QUOT) +#define KC_SYGR LT(_SYMB, KC_GRV) +#define KC_SYSP LT(_SYMB, KC_SPC) +#define KC_ADEN LT(_ADJUST, KC_END) +#define KC_ADPU LT(_ADJUST, KC_PGUP) +#define KC_CESC LCTL_T(KC_ESC) +#define KC_CBSP LCTL_T(KC_BSPC) +#define KC_CMIN RCTL_T(KC_MINUS) +#define KC_GBSP LGUI_T(KC_BSPC) +#define KC_ADEL LALT_T(KC_DEL) +#define KC_APLS RALT_T(KC_PPLS) +#define KC_LSEN LSFT_T(KC_ENT) +#define KC_RSEN RSFT_T(KC_ENT) +#define FN1 QWERTY +#define FN2 COLEMAKDHMK +#define FN3 QWERTY_MAC +#define FN4 COLEMAKDHMK_MAC + +// Send custom strings or change default base layer +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + if (record->event.pressed) { + switch(keycode) { + case ASC_SAR: + SEND_STRING("->"); + return false; + case ASC_DAR: + SEND_STRING("=>"); + return false; + case ASC_SQT: + // SS_RALT(): Avoid sending dead key on software intl layouts + SEND_STRING(SS_RALT("'")); + return false; + case ASC_DQT: + // SS_RALT(SS_LSFT()): Avoid sending dead key on software intl layouts + SEND_STRING(SS_RALT(SS_LSFT("\""))); + return false; + case ASC_HAP: + SEND_STRING(":-) "); + return false; + case ASC_SAD: + SEND_STRING(":-( "); + return false; + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAKDHMK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAKDHMK); + } + return false; + break; + case QWERTY_MAC: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY_MAC); + } + return false; + break; + case COLEMAKDHMK_MAC: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAKDHMK_MAC); + } + return false; + break; + } + } + return true; +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_SYGR ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_SYQT , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_DEL , KC_BSPC ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_EQL , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_CESC ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_LBRC , KC_RBRC ,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,KC_CMIN , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSPO ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSPC , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + KC_SYSP ,KC_BSLS ,KC_QUOT ,KC_LGUI , KC_ADEL , KC_CBSP ,KC_LSEN , KC_RSEN ,KC_SYSP , KC_APLS , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_COLEMAKDHMK] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_SYGR ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_SYQT , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_F ,KC_P ,KC_B ,KC_DEL , KC_BSPC ,KC_J ,KC_L ,KC_U ,KC_Y ,KC_SCLN ,KC_EQL , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_CESC ,KC_A ,KC_R ,KC_S ,KC_T ,KC_G ,KC_LBRC , KC_RBRC ,KC_M ,KC_N ,KC_E ,KC_I ,KC_O ,KC_CMIN , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSPO ,KC_Z ,KC_X ,KC_C ,KC_D ,KC_V ,KC_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,KC_K ,KC_H ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSPC , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + KC_SYSP ,KC_BSLS ,KC_QUOT ,KC_LGUI , KC_ADEL , KC_CBSP ,KC_LSEN , KC_RSEN ,KC_SYSP , KC_APLS , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_QWERTY_MAC] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_SYGR ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_SYQT , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_DEL , KC_BSPC ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_EQL , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_CESC ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_LBRC , KC_RBRC ,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,KC_CMIN , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSPO ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSPC , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + KC_SYSP ,KC_BSLS ,KC_QUOT ,KC_LCTL , KC_ADEL , KC_GBSP ,KC_LSEN , KC_RSEN ,KC_SYSP , KC_APLS , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_COLEMAKDHMK_MAC] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + KC_SYGR ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_SYQT , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_TAB ,KC_Q ,KC_W ,KC_F ,KC_P ,KC_B ,KC_DEL , KC_BSPC ,KC_J ,KC_L ,KC_U ,KC_Y ,KC_SCLN ,KC_EQL , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_CESC ,KC_A ,KC_R ,KC_S ,KC_T ,KC_G ,KC_LBRC , KC_RBRC ,KC_M ,KC_N ,KC_E ,KC_I ,KC_O ,KC_CMIN , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + KC_LSPO ,KC_Z ,KC_X ,KC_C ,KC_D ,KC_V ,KC_ADPU ,KC_PGDN , KC_HOME ,KC_ADEN ,KC_K ,KC_H ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_RSPC , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + KC_SYSP ,KC_BSLS ,KC_QUOT ,KC_LCTL , KC_ADEL , KC_GBSP ,KC_LSEN , KC_RSEN ,KC_SYSP , KC_APLS , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_SYMB] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_CIRC ,KC_BSLS ,KC_PMNS ,KC_UNDS ,XXXXXXX ,_______ , _______ ,XXXXXXX ,KC_KP_7 ,KC_KP_8 ,KC_KP_9 ,KC_F11 ,KC_APP , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_PAST ,KC_PIPE ,ASC_SQT ,KC_TILD ,KC_QUOT ,ASC_SAR , ASC_DAR ,XXXXXXX ,KC_KP_4 ,KC_KP_5 ,KC_KP_6 ,KC_F12 ,KC_PSCR , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + _______ ,KC_HASH ,KC_AMPR ,KC_AT ,ASC_DQT ,KC_GRV ,ASC_SAD ,ASC_HAP , _______ ,_______ ,XXXXXXX ,KC_KP_1 ,KC_KP_2 ,KC_KP_3 ,KC_UP ,_______ , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + _______ ,_______ ,_______ ,_______ , _______ , _______ ,_______ , _______ ,_______ , KC_KP_0 , KC_PDOT ,KC_LEFT ,KC_DOWN ,KC_RGHT + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ), + + [_ADJUST] = LAYOUT( + //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐ + XXXXXXX ,FN1 ,FN2 ,FN3 ,FN4 ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,RESET ,RGB_M_P ,RGB_TOG ,RGB_MOD ,RGB_HUD ,RGB_HUI , RGB_SAD ,RGB_SAI ,RGB_VAD ,RGB_VAI ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,RGB_M_B ,RGB_M_R ,RGB_M_SW,RGB_M_SN,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,RGB_M_K ,RGB_M_X ,RGB_M_G ,XXXXXXX ,_______ ,XXXXXXX , XXXXXXX ,_______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , + //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤ ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤ + XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX , XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX + //└────────┴────────┴────────┴────────┘ └────────┘ └────────┴────────┘ └────────┴────────┘ └────────┘ └────────┴────────┴────────┴────────┘ + ) + +}; diff --git a/keyboards/redox/keymaps/finex/readme.md b/keyboards/redox/keymaps/finex/readme.md new file mode 100644 index 000000000000..f1b6fa7c7ba9 --- /dev/null +++ b/keyboards/redox/keymaps/finex/readme.md @@ -0,0 +1,35 @@ +# Customized keymap for Redox by Leonardo (FiNeX) Finetti. + + +## Features + +- Enabled USE_SERIAL for Falba.Tech Redox keyboards. +- PC Layouts: QWERTY, Colemak Mod DH-MK. +- Mac Layouts: same as above with CTRL-GUI keys inverted on the bottom row. +- Added redundant "Space", "Esc" and "Ctrl" keys. +- Added macro to print "->" and "=>" strings. +- Added macro to print ":-( " and ":-) " strings. +- Added more arrows. +- Added "(" and ")" on Shifts keys. +- Added Shift on both ) "Enter" keys. +- Removed Mouse and media support. +- Added missing "Print Screen" and "Menu" keys. +- Added missing "F11" and "F12" keys. + + +## Layers + +This keymap use the default one with some minor improvements to suit my needs. + +## Changelog + +- 2018/11/13 + First public release + + +## TODO + +- Bring back mouse and multimedia keys. +- Add default Colemak Mod DH layout. +- Improve top corner keys. +- Improve bottom row keys (mostly KC_BSLS and KC_QUOT). diff --git a/keyboards/redox/keymaps/finex/rules.mk b/keyboards/redox/keymaps/finex/rules.mk new file mode 100644 index 000000000000..21550e9fe10c --- /dev/null +++ b/keyboards/redox/keymaps/finex/rules.mk @@ -0,0 +1,3 @@ +RGBLIGHT_ENABLE = yes + +COMMAND_ENABLE = no From f7fcba329dbd659a4bb37acdf7e2dc24204a81c8 Mon Sep 17 00:00:00 2001 From: James Osborn Date: Wed, 14 Nov 2018 15:33:46 +0000 Subject: [PATCH 418/505] Fixed Unicode Support heading (#4425) Previously, Unicode Support heading appeared as the last row in the Swap Hands table. --- docs/keycodes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/keycodes.md b/docs/keycodes.md index 592b52ec7b3a..30fe60278f10 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -459,6 +459,7 @@ This is a reference only. Each group of keys links to the page documenting their |`SH_MOFF` |Momentarily turns off swap. | |`SH_TG` |Toggles swap on and off with every key press. | |`SH_TT` |Toggles with a tap; momentary when held. | + ## [Unicode Support](feature_unicode.md) |Key |Aliases| | From 0cda2f43e2c95fe5dd440e6391ae807f508b040b Mon Sep 17 00:00:00 2001 From: Phillip Tennen Date: Wed, 14 Nov 2018 16:45:46 +0100 Subject: [PATCH 419/505] Backlight status functions (#4259) * add functions to set specific backlight state * add function to query backlight state * update documentation with new backlight functions * Update tmk_core/common/backlight.c Co-Authored-By: codyd51 * Update tmk_core/common/backlight.h Co-Authored-By: codyd51 * update docs for is_backlight_enabled() name change --- docs/feature_backlight.md | 19 ++++++++------ tmk_core/common/backlight.c | 51 ++++++++++++++++++++++++++++++++----- tmk_core/common/backlight.h | 4 +++ 3 files changed, 60 insertions(+), 14 deletions(-) diff --git a/docs/feature_backlight.md b/docs/feature_backlight.md index 7bb7e03a89eb..f7a35406c7a0 100644 --- a/docs/feature_backlight.md +++ b/docs/feature_backlight.md @@ -54,14 +54,17 @@ In this handler, the value of an incrementing counter is mapped onto a precomput ## Backlight Functions -|Function |Description | -|----------|----------------------------------------------------------| -|`backlight_toggle()` |Turn the backlight on or off | -|`backlight_step()` |Cycle through backlight levels | -|`backlight_increase()` |Increase the backlight level | -|`backlight_decrease()` |Decrease the backlight level | -|`backlight_level(x)` |Sets the backlight level to specified level | -|`get_backlight_level()`|Return the current backlight level | +|Function |Description | +|----------|-----------------------------------------------------------| +|`backlight_toggle()` |Turn the backlight on or off | +|`backlight_enable()` |Turn the backlight on | +|`backlight_disable()` |Turn the backlight off | +|`backlight_step()` |Cycle through backlight levels | +|`backlight_increase()` |Increase the backlight level | +|`backlight_decrease()` |Decrease the backlight level | +|`backlight_level(x)` |Sets the backlight level to specified level | +|`get_backlight_level()` |Return the current backlight level | +|`is_backlight_enabled()`|Return whether the backlight is currently on | ### Backlight Breathing Functions diff --git a/tmk_core/common/backlight.c b/tmk_core/common/backlight.c index 3e29aacc499c..8ddacd98b699 100644 --- a/tmk_core/common/backlight.c +++ b/tmk_core/common/backlight.c @@ -76,12 +76,51 @@ void backlight_decrease(void) */ void backlight_toggle(void) { - backlight_config.enable ^= 1; - if (backlight_config.raw == 1) // enabled but level = 0 - backlight_config.level = 1; - eeconfig_update_backlight(backlight_config.raw); - dprintf("backlight toggle: %u\n", backlight_config.enable); - backlight_set(backlight_config.enable ? backlight_config.level : 0); + bool enabled = backlight_config.enable; + dprintf("backlight toggle: %u\n", enabled); + if (enabled) + backlight_disable(); + else + backlight_enable(); +} + +/** \brief Enable backlight + * + * FIXME: needs doc + */ +void backlight_enable(void) +{ + if (backlight_config.enable) return; // do nothing if backlight is already on + + backlight_config.enable = true; + if (backlight_config.raw == 1) // enabled but level == 0 + backlight_config.level = 1; + eeconfig_update_backlight(backlight_config.raw); + dprintf("backlight enable\n"); + backlight_set(backlight_config.level); +} + +/** /brief Disable backlight + * + * FIXME: needs doc + */ +void backlight_disable(void) +{ + if (!backlight_config.enable) return; // do nothing if backlight is already off + + backlight_config.enable = false; + eeconfig_update_backlight(backlight_config.raw); + dprintf("backlight disable\n"); + backlight_set(0); +} + +/** /brief Get the backlight status + * + * FIXME: needs doc + */ +bool is_backlight_enabled(void) +{ + return backlight_config.enable; } /** \brief Backlight step through levels diff --git a/tmk_core/common/backlight.h b/tmk_core/common/backlight.h index ef8ab9b2be92..420c9d19edd8 100644 --- a/tmk_core/common/backlight.h +++ b/tmk_core/common/backlight.h @@ -32,7 +32,11 @@ void backlight_init(void); void backlight_increase(void); void backlight_decrease(void); void backlight_toggle(void); +void backlight_enable(void); +void backlight_disable(void); +bool is_backlight_enabled(void); void backlight_step(void); void backlight_set(uint8_t level); void backlight_level(uint8_t level); uint8_t get_backlight_level(void); + From a034602651c86424bc2197ee61bea0ff584b3be1 Mon Sep 17 00:00:00 2001 From: ishtob Date: Wed, 14 Nov 2018 12:22:16 -0500 Subject: [PATCH 420/505] adding block def to ishtob's userspace (#4427) --- keyboards/planck/keymaps/ishtob/keymap.c | 34 ++--- users/ishtob/ishtob.h | 165 +++++++++++++++++++++++ 2 files changed, 182 insertions(+), 17 deletions(-) diff --git a/keyboards/planck/keymaps/ishtob/keymap.c b/keyboards/planck/keymaps/ishtob/keymap.c index 86c5555da307..082257b8956e 100644 --- a/keyboards/planck/keymaps/ishtob/keymap.c +++ b/keyboards/planck/keymaps/ishtob/keymap.c @@ -25,9 +25,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_QWERTY] = LAYOUT_planck_grid( - LT_FN(KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT_MC(KC_SCLN), CTL_ENT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, LT_RAI(KC_MINS), + LT_FN(KC_TAB), _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_BSPC, + KC_LCTL, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, CTL_ENT, + KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, LT_RAI(KC_MINS), KC_ESC, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_RALT, TG_NUMLAY, KC_APP, KC_DEL ), @@ -43,10 +43,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_COLEMAK] = LAYOUT_planck_grid( - LT_FN(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_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, LT_MC(KC_O), KC_ENT, - KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, LT_RAI(KC_MINS), - KC_ESC, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_RALT, TG_NUMLAY, KC_APP, KC_DEL + LT_FN(KC_TAB), _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, KC_BSPC, + KC_LCTL, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_ENT, + KC_LSFT, _________________COLEMAK_L3________________, _________________COLEMAK_R3________________, LT_RAI(KC_MINS), + KC_ESC, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_RALT, TG_NUMLAY, KC_APP, KC_DEL ), /* Dvorak @@ -61,10 +61,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_DVORAK] = LAYOUT_planck_grid( - LT_FN(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_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, LT_MC(KC_S), KC_ENT, - KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, LT_RAI(KC_MINS), - KC_ESC, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_RALT, TG_NUMLAY, KC_APP, KC_DEL + LT_FN(KC_TAB), _________________DVORAK_L1_________________, _________________DVORAK_R1_________________, KC_BSPC, + KC_LCTL, _________________DVORAK_L2_________________, _________________DVORAK_R2_________________, KC_ENT, + KC_LSFT, _________________DVORAK_L3_________________, _________________DVORAK_R3_________________, LT_RAI(KC_MINS), + KC_ESC, KC_CAPS, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_RALT, TG_NUMLAY, KC_APP, KC_DEL ), /* Lower @@ -79,9 +79,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_LOWER] = LAYOUT_planck_grid( - KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV, KC_BSLS, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_EQL, KC_LBRC, KC_RBRC, KC_PIPE, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_LCBR, KC_RCBR, _______, + ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_GRV, KC_BSLS, + _______, __________________LONG_FUNC_LEFT___________________, KC_UNDS, KC_EQL, KC_LBRC, KC_RBRC, KC_PIPE, + _______, __________________LONG_FUNC_RIGHT__________________,S(KC_NUHS),S(KC_NUBS),KC_LCBR, KC_RCBR, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ), @@ -97,7 +97,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_RAISE] = LAYOUT_planck_grid( - KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_PLUS, KC_BSLS, + ________________NUMBER_LEFT________________, ________________NUMBER_RIGHT_______________, KC_PLUS, KC_BSLS, _______, KC_A, KC_UP, KC_D, KC_PSCR, KC_VOLU, KC_4, KC_5, KC_6, KC_PAST, KC_COLN, KC_QUOT, _______, KC_LEFT, KC_DOWN, KC_RIGHT,KC__MUTE, KC_VOLD, KC_1, KC_2, KC_3, KC_UP, KC_SLSH, _______, _______, _______, _______, _______, _______, KC_SPC, KC_0, _______, KC_LEFT, KC_DOWN, KC_RIGHT, KC_NLCK @@ -135,8 +135,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_FNLAYER] = LAYOUT_planck_grid( _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PLUS, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_EQL, KC_LBRC, KC_RBRC, KC_QUOT, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_LCBR, KC_RCBR, _______, + _______, __________________LONG_FUNC_LEFT___________________, KC_UNDS, KC_EQL, KC_LBRC, KC_RBRC, KC_QUOT, + _______, __________________LONG_FUNC_RIGHT__________________,S(KC_NUHS),S(KC_NUBS),KC_LCBR, KC_RCBR, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ), diff --git a/users/ishtob/ishtob.h b/users/ishtob/ishtob.h index 2c47fce791a6..3e4d4ffbcbc3 100644 --- a/users/ishtob/ishtob.h +++ b/users/ishtob/ishtob.h @@ -71,6 +71,171 @@ enum userspace_layers { }; */ +/* +Since our quirky block definitions are basically a list of comma separated +arguments, we need a wrapper in order for these definitions to be +expanded before being used as arguments to the LAYOUT_xxx macro. +*/ +#if (!defined(LAYOUT) && defined(KEYMAP)) +#define LAYOUT KEYMAP +#endif + +#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__) +#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__) +#define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__) +#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__) +#define LAYOUT_ortho_4x12_wrapper(...) LAYOUT_ortho_4x12(__VA_ARGS__) +#define LAYOUT_planck_grid(...) LAYOUT_planck_grid(__VA_ARGS__) + +/* +Blocks for each of the four major keyboard layouts +Organized so we can quickly adapt and modify all of them +at once, rather than for each keyboard, one at a time. +And this allows for much cleaner blocks in the keymaps. +For instance Tap/Hold for Control on all of the layouts + +NOTE: These are all the same length. If you do a search/replace + then you need to add/remove underscores to keep the + lengths consistent. +*/ + +#define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T +#define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G +#define _________________QWERTY_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B + +#define _________________QWERTY_R1_________________ KC_Y, KC_U, KC_I, KC_O, KC_P +#define _________________QWERTY_R2_________________ KC_H, KC_J, KC_K, KC_L, LT_MC(KC_SCLN) +#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH + + +#define _________________COLEMAK_L1________________ KC_Q, KC_W, KC_F, KC_P, KC_G +#define _________________COLEMAK_L2________________ KC_A, KC_R, KC_S, KC_T, KC_D +#define _________________COLEMAK_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_B + +#define _________________COLEMAK_R1________________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN +#define _________________COLEMAK_R2________________ KC_H, KC_N, KC_E, KC_I, LT_MC(KC_O) +#define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH + +#define ______________COLEMAK_MOD_DH_L1____________ KC_Q, KC_W, KC_F, KC_P, KC_B +#define ______________COLEMAK_MOD_DH_L2____________ KC_A, KC_R, KC_S, KC_T, KC_G +#define ______________COLEMAK_MOD_DH_L3____________ KC_Z, KC_X, KC_C, KC_D, KC_V + +#define ______________COLEMAK_MOD_DH_R1____________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN +#define ______________COLEMAK_MOD_DH_R2____________ KC_M, KC_N, KC_E, KC_I, LT_MC(KC_O) +#define ______________COLEMAK_MOD_DH_R3____________ KC_K, KC_H, KC_COMM, KC_DOT, KC_SLASH + + +#define _________________DVORAK_L1_________________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y +#define _________________DVORAK_L2_________________ KC_A, KC_O, KC_E, KC_U, KC_I +#define _________________DVORAK_L3_________________ KC_SCLN, KC_Q, KC_J, KC_K, KC_X + +#define _________________DVORAK_R1_________________ KC_F, KC_G, KC_C, KC_R, KC_L +#define _________________DVORAK_R2_________________ KC_D, KC_H, KC_T, KC_N, LT_MC(KC_S) +#define _________________DVORAK_R3_________________ KC_B, KC_M, KC_W, KC_V, KC_Z + + +#define _________________WORKMAN_L1________________ KC_Q, KC_D, KC_R, KC_W, KC_B +#define _________________WORKMAN_L2________________ KC_A, KC_S, KC_H, KC_T, KC_G +#define _________________WORKMAN_L3________________ KC_Z, KC_X, KC_M, KC_C, KC_V + +#define _________________WORKMAN_R1________________ KC_J, KC_F, KC_U, KC_P, KC_SCLN +#define _________________WORKMAN_R2________________ KC_Y, KC_N, KC_E, KC_O, LT_MC(KC_I) +#define _________________WORKMAN_R3________________ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH + + +#define _________________NORMAN_L1_________________ KC_Q, KC_W, KC_D, KC_F, KC_K +#define _________________NORMAN_L2_________________ KC_A, KC_S, KC_E, KC_T, KC_G +#define _________________NORMAN_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B + +#define _________________NORMAN_R1_________________ KC_J, KC_U, KC_R, KC_L, KC_SCLN +#define _________________NORMAN_R2_________________ KC_Y, KC_N, KC_I, KC_O, LT_MC(KC_U) +#define _________________NORMAN_R3_________________ KC_P, KC_M, KC_COMM, KC_DOT, KC_SLASH + + +#define _________________MALTRON_L1________________ KC_Q, KC_P, KC_Y, KC_C, KC_B +#define _________________MALTRON_L2________________ KC_A, KC_N, KC_I, KC_S, KC_F +#define _________________MALTRON_L3________________ KC_SCLN, KC_SLSH, KC_J KC_G, KC_COMM + +#define _________________MALTRON_R1________________ KC_V, KC_M, KC_U, KC_Z, KC_L +#define _________________MALTRON_R2________________ KC_D, KC_T, KC_D, KC_O, LT_MC(KC_R) +#define _________________MALTRON_R3________________ KC_DOT, KC_W, KC_K, KC_MINS, KC_X + + +#define _________________EUCALYN_L1________________ KC_SLSH, KC_COMM, KC_DOT, KC_F, KC_Q +#define _________________EUCALYN_L2________________ KC_A, KC_O, KC_E, KC_I, KC_U +#define _________________EUCALYN_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_W + +#define _________________EUCALYN_R1________________ KC_M, KC_R, KC_D, KC_Y, KC_P +#define _________________EUCALYN_R2________________ KC_G, KC_T, KC_K, KC_S, LT_MC(KC_N) +#define _________________EUCALYN_R3________________ KC_B, KC_H, KC_J, KC_L, KC_SCLN + + +#define _____________CARPLAX_QFMLWY_L1_____________ KC_Q, KC_F, KC_M, KC_L, KC_W +#define _____________CARPLAX_QFMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R +#define _____________CARPLAX_QFMLWY_L3_____________ KC_Z, KC_V, KC_G, KC_C, KC_X + +#define _____________CARPLAX_QFMLWY_R1_____________ KC_Y, KC_U, KC_O, KC_B, KC_J +#define _____________CARPLAX_QFMLWY_R2_____________ KC_I, KC_A, KC_E, KC_H, LT_MC(KC_SCLN) +#define _____________CARPLAX_QFMLWY_R3_____________ KC_P, KC_K, KC_COMM, KC_DOT, KC_SLSH + + +#define _____________CARPLAX_QGMLWB_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W +#define _____________CARPLAX_QGMLWB_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R +#define _____________CARPLAX_QGMLWB_L3_____________ KC_Z, KC_X, KC_C, KC_F, KC_J + +#define _____________CARPLAX_QGMLWB_R1_____________ KC_B, KC_Y, KC_U, KC_V, KC_SCLN +#define _____________CARPLAX_QGMLWB_R2_____________ KC_I, KC_A, KC_E, KC_O, LT_MC(KC_H) +#define _____________CARPLAX_QGMLWB_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH + + +#define _____________CARPLAX_QGMLWY_L1_____________ KC_Q, KC_G, KC_M, KC_L, KC_W +#define _____________CARPLAX_QGMLWY_L2_____________ KC_D, KC_S, KC_T, KC_N, KC_R +#define _____________CARPLAX_QGMLWY_L3_____________ KC_Z, KC_X, KC_C, KC_V, KC_J + +#define _____________CARPLAX_QGMLWY_R1_____________ KC_Y, KC_F, KC_U, KC_B, KC_SCLN +#define _____________CARPLAX_QGMLWY_R2_____________ KC_I, KC_A, KC_E, KC_O, LT_MC(KC_H) +#define _____________CARPLAX_QGMLWY_R3_____________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH + + +#define ________________NUMBER_LEFT________________ KC_1, KC_2, KC_3, KC_4, KC_5 +#define ________________NUMBER_RIGHT_______________ KC_6, KC_7, KC_8, KC_9, KC_0 +#define _________________FUNC_LEFT_________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5 +#define _________________FUNC_RIGHT________________ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10 + +#define __________________LONG_FUNC_LEFT___________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6 +#define __________________LONG_FUNC_RIGHT__________________ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12 + +#define ___________________BLANK___________________ _______, _______, _______, _______, _______ + + +#define _________________LOWER_L1__________________ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC +#define _________________LOWER_L2__________________ _________________FUNC_LEFT_________________ +#define _________________LOWER_L3__________________ _________________FUNC_RIGHT________________ + +#define _________________LOWER_R1__________________ KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN +#define _________________LOWER_R2__________________ _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR +#define _________________LOWER_R3__________________ _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + + + +#define _________________RAISE_L1__________________ ________________NUMBER_LEFT________________ +#define _________________RAISE_L2__________________ ___________________BLANK___________________ +#define _________________RAISE_L3__________________ ___________________BLANK___________________ + +#define _________________RAISE_R1__________________ ________________NUMBER_RIGHT_______________ +#define _________________RAISE_R2__________________ _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC +#define _________________RAISE_R3__________________ _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END + + + +#define _________________ADJUST_L1_________________ RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_TOG +#define _________________ADJUST_L2_________________ MU_TOG , CK_TOGG, AU_ON, AU_OFF, AG_NORM +#define _________________ADJUST_L3_________________ RGB_RMOD,RGB_HUD,RGB_SAD, RGB_VAD, KC_RGB_T + +#define _________________ADJUST_R1_________________ KC_SEC1, KC_SEC2, KC_SEC3, KC_SEC4, KC_SEC5 +#define _________________ADJUST_R2_________________ AG_SWAP, QWERTY, COLEMAK, DVORAK, WORKMAN +#define _________________ADJUST_R3_________________ MG_NKRO, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT + #endif // !USERSPACE \ No newline at end of file From d8f090e5592fd5b6fde35ae36e36f2473c716312 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 14 Nov 2018 18:32:28 -0800 Subject: [PATCH 421/505] Docs: Supporting a keyboard in the QMK Configurator (#4396) * Docs: Configurator Support * Minor updates * Updated keyboard.h example to use #pragma once per @drashna https://github.com/qmk/qmk_firmware/pull/4396#discussion_r232140934 * Add link to doc under Reference section Added to _sidebar.md and _summary.md * Changed doc title; minor tweaks Re-titled the doc as "Supporting Your Keyboard in QMK Configurator". Made some minor changes to the keyboard.h examples. * Added tags object to JSON example --- docs/_sidebar.md | 1 + docs/_summary.md | 1 + docs/reference_configurator_support.md | 195 +++++++++++++++++++++++++ 3 files changed, 197 insertions(+) create mode 100644 docs/reference_configurator_support.md diff --git a/docs/_sidebar.md b/docs/_sidebar.md index 67e81422a187..1fb5398d938b 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -39,6 +39,7 @@ * [Glossary](reference_glossary.md) * [Unit Testing](unit_testing.md) * [Useful Functions](ref_functions.md) + * [Configurator Support](reference_configurator_support.md) * [Features](features.md) * [Basic Keycodes](keycodes_basic.md) diff --git a/docs/_summary.md b/docs/_summary.md index 67e81422a187..1fb5398d938b 100644 --- a/docs/_summary.md +++ b/docs/_summary.md @@ -39,6 +39,7 @@ * [Glossary](reference_glossary.md) * [Unit Testing](unit_testing.md) * [Useful Functions](ref_functions.md) + * [Configurator Support](reference_configurator_support.md) * [Features](features.md) * [Basic Keycodes](keycodes_basic.md) diff --git a/docs/reference_configurator_support.md b/docs/reference_configurator_support.md new file mode 100644 index 000000000000..a20a6c9adb6c --- /dev/null +++ b/docs/reference_configurator_support.md @@ -0,0 +1,195 @@ +# Supporting Your Keyboard in QMK Configurator + +This page covers how to properly support keyboards in the [QMK Configurator](https://config.qmk.fm/). + + +## How the Configurator Understands Keyboards + +To understand how the Configurator understands keyboards, first one must understand layout macros. For this exercise, we're going to imagine a 17-key numpad PCB, which we're going to call `numpad`. + +``` +┌───┬───┬───┬───┐ +│NLk│ / │ * │ - │ +├───┼───┼───┼───┤ +│7 │8 │9 │ + │ +├───┼───┼───┤ │ +│4 │5 │6 │ │ +├───┼───┼───┼───┤ +│1 │2 │3 │Ent│ +├───┴───┼───┤ │ +│0 │ . │ │ +└───────┴───┴───┘ +``` + +?> For more on layout macros, see [Understanding QMK: Matrix Scanning](understanding_qmk.md?id=matrix-scanning) and [Understanding QMK: Matrix to Physical Layout Map](understanding_qmk.md?id=matrix-to-physical-layout-map). + +The Configurator's API reads the keyboard's `.h` file from `qmk_firmware/keyboards//.h`. For our numpad, this file would be `qmk_firmware/keyboards/numpad/numpad.h`: + +```c +#pragma once + +#define LAYOUT( \ + k00, k01, k02, k03, \ + k10, k11, k12, k13, \ + k20, k21, k22, \ + k30, k31, k32, k33, \ + k40, k42 \ + ) { \ + { k00, k01, k02, k03 }, \ + { k10, k11, k12, k13 }, \ + { k20, k21, k22, KC_NO }, \ + { k30, k31, k32, k33 }, \ + { k40, KC_NO, k42, KC_NO } \ +} +``` + +QMK uses `KC_NO` to designate places in the switch matrix where there is no switch. Sometimes, `XXX`, `___` or `____` are used as shorthand to make this section easier to read if it needs to be debugged. This is usually defined near the beginning of the `.h` file: + +```c +#pragma once + +#define XXX KC_NO + +#define LAYOUT( \ + k00, k01, k02, k03, \ + k10, k11, k12, k13, \ + k20, k21, k22, \ + k30, k31, k32, k33, \ + k40, k42 \ + ) { \ + { k00, k01, k02, k03 }, \ + { k10, k11, k12, k13 }, \ + { k20, k21, k22, XXX }, \ + { k30, k31, k32, k33 }, \ + { k40, XXX, k42, XXX } \ +} +``` + +!> This usage differs from that of keymap macros, which almost always use `XXXXXXX` (seven capital X's) for `KC_NO` and `_______` (seven underscores) for `KC_TRNS`. + +!> To prevent user confusion, using `KC_NO` is preferred. + +The layout macro tells the Configurator that our keyboard has 17 keys, arranged in five rows of four columns each. Our switch positions are named `k`, counting from 0. The names themselves actually don't matter, as long as they match between the top section, which receives the keycodes from the keymap, and the bottom half which designates where each key is in the matrix. + +To display our keyboard in a way that resembles the physical keyboard, we need to build a JSON file that tells the Configurator how to tie the physical locations and sizes of our keys to our switch matrix. + +## Building the JSON file + +To build the JSON file, the easiest way is to build the layout in [Keyboard Layout Editor](http://www.keyboard-layout-editor.com/) ("KLE"), from which we'll feed the Raw Data into a QMK tool that converts this data into a JSON the Configurator will read and use. Since KLE opens by default with a numpad layout, we're just going to remove the Getting Started instructions, and use what's left. + +Once the layout is as desired, move to the Raw Data tab in KLE, and copy the contents: + +``` +["Num Lock","/","*","-"], +["7\nHome","8\n↑","9\nPgUp",{h:2},"+"], +["4\n←","5","6\n→"], +["1\nEnd","2\n↓","3\nPgDn",{h:2},"Enter"], +[{w:2},"0\nIns",".\nDel"] +``` + +To convert this data into our JSON, go to the [QMK KLE-JSON Converter](https://qmk.fm/converter/), paste the Raw Data into the Input field, and click the Convert button. After a moment, our JSON data will appear in the Output field. Copy the contents to a new text document, and name the document `info.json`, saving it in the same folder that contains `numpad.h`. + +Use the `keyboard_name` object to set the name of the keyboard. The `bootloader` object is deprecated, so it can be deleted. For instruction purposes, we will put each key's object on its own line. This is only to make the file more human-readable, and does not affect the Configurator's functionality. + +```json +{ + "keyboard_name": "Numpad", + "url": "", + "maintainer": "qmk", + "tags": { + "form_factor": "numpad" + }, + "width": 4, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Num Lock", "x":0, "y":0}, + {"label":"/", "x":1, "y":0}, + {"label":"*", "x":2, "y":0}, + {"label":"-", "x":3, "y":0}, + {"label":"7", "x":0, "y":1}, + {"label":"8", "x":1, "y":1}, + {"label":"9", "x":2, "y":1}, + {"label":"+", "x":3, "y":1, "h":2}, + {"label":"4", "x":0, "y":2}, + {"label":"5", "x":1, "y":2}, + {"label":"6", "x":2, "y":2}, + {"label":"1", "x":0, "y":3}, + {"label":"2", "x":1, "y":3}, + {"label":"3", "x":2, "y":3}, + {"label":"Enter", "x":3, "y":3, "h":2}, + {"label":"0", "x":0, "y":4, "w":2}, + {"label":".", "x":2, "y":4} + ] + } + } +} +``` + +The `layouts` object contains the data that represents the physical layout of the keyboard. It has an object `LAYOUT`, which needs to match the name of our layout macro from `numpad.h`. The `LAYOUT` object itself has an object named `layout`, which contains one JSON object for each physical key on our keyboard, formatted as follows: + +``` + ┌ The name of the key. Not displayed in the Configurator. + │ ┌ The key's X-axis location, in key units from the + │ │ keyboard's left edge. + │ │ ┌ The key's Y-axis location, in key units from + │ │ │ the keyboard's top (rear-facing) edge. + ↓ ↓ ↓ +{"label":"Num Lock", "x":0, "y":0}, +``` + +Some objects will also have `"w"` and `"h"` keys, which represent a key's width and height, respectively. + +?> For more on the `info.json` files, see [QMK Keyboard Guidelines: Keyboard Metadata](hardware_keyboard_guidelines.md?id=keyboard-metadata) + + +## How the Configurator Programs Keys + +The Configurator's API uses the layout macro and the JSON file we've given it to create a visual representation of the keyboard that has each visual object tied to a specific key, in sequence: + +key in layout macro | JSON object used +:---: | :---- +k00 | {"label":"Num Lock", "x":0, "y":0} +k01 | {"label":"/", "x":1, "y":0} +k02 | {"label":"*", "x":2, "y":0} +k03 | {"label":"-", "x":3, "y":0} +k10 | {"label":"7", "x":0, "y":1} +k11 | {"label":"8", "x":1, "y":1} +k12 | {"label":"9", "x":2, "y":1} +k13 | {"label":"+", "x":3, "y":1, "h":2} +k20 | {"label":"4", "x":0, "y":2} +k21 | {"label":"5", "x":1, "y":2} +k22 | {"label":"6", "x":2, "y":2} +k30 | {"label":"1", "x":0, "y":3} +k31 | {"label":"2", "x":1, "y":3} +k32 | {"label":"3", "x":2, "y":3} +k33 | {"label":"Enter", "x":3, "y":3, "h":2} +k40 | {"label":"0", "x":0, "y":4, "w":2} +k42 | {"label":".", "x":2, "y":4} + +When a user selects the top-left key in the Configurator, and assigns Num Lock to it, the Configurator builds a keymap file with `KC_NLCK` as the first key, and so on as the keymap is built. The `label` keys are not used; they are only for the user's reference in identifying specific keys when debugging the `info.json` file. + + +## Issues and Hazards + +Currently, the Configurator does not support key rotation or non-rectangular key shapes like ISO Enter. Additionally, keys that are vertically-offset from their "row" — the arrow keys on 1800-layouts like the [TKC1800](https://github.com/qmk/qmk_firmware/tree/4ac48a61a66206beaf2fdd5f2939d8bbedd0004c/keyboards/tkc1800/) being a prominent example — confuse the KLE-to-JSON Converter, if not adjusted for by the contributor of the `info.json` file. + +### Workarounds + +#### Non-rectangular keys + +For ISO Enter keys, QMK custom is to display it as a rectangular key, 1.25u wide and 2u high, aligned so its right edge is aligned with the right edge of the alphanumeric key block. + +![](https://i.imgur.com/JKngtTw.png) +*A 60% keyboard in standard ISO layout, as rendered by QMK Configurator.* + +#### Vertically-offset keys + +For vertically-offset keys, place them in KLE as if they were not offset, then edit the Y-values as needed in the converted JSON file + +![](https://i.imgur.com/fmDvDzR.png) +*An 1800-layout keyboard as rendered in Keyboard Layout Editor, without the vertical offset applied to the arrow keys.* + +![](https://i.imgur.com/8beYMBR.png) +*A Unix diff file, showing the changes needed to vertically-offset the arrow keys in our keyboard's JSON file.* From daf08f40f2aeb815322d65d14a90ae56ea22953c Mon Sep 17 00:00:00 2001 From: Pekaso Date: Thu, 15 Nov 2018 11:36:53 +0900 Subject: [PATCH 422/505] serial.c update (#4423) --- keyboards/fortitude60/serial.c | 290 +++++++++++++++++++------- keyboards/fortitude60/serial.h | 59 +++--- keyboards/fortitude60/serial_config.h | 8 +- 3 files changed, 254 insertions(+), 103 deletions(-) diff --git a/keyboards/fortitude60/serial.c b/keyboards/fortitude60/serial.c index cea1a5f6caab..6006ebf1bdb2 100644 --- a/keyboards/fortitude60/serial.c +++ b/keyboards/fortitude60/serial.c @@ -1,5 +1,10 @@ /* * WARNING: be careful changing this code, it is very timing dependent + * + * 2018-10-28 checked + * avr-gcc 4.9.2 + * avr-gcc 5.4.0 + * avr-gcc 7.3.0 */ #ifndef F_CPU @@ -14,10 +19,60 @@ #include "serial.h" //#include -#ifdef USE_SERIAL +#ifdef SOFT_SERIAL_PIN -#ifndef SERIAL_USE_MULTI_TRANSACTION -/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ +#ifdef __AVR_ATmega32U4__ + // if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial. + #ifdef USE_I2C + #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1 + #error Using ATmega32U4 I2C, so can not use PD0, PD1 + #endif + #endif + + #if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3 + #define SERIAL_PIN_DDR DDRD + #define SERIAL_PIN_PORT PORTD + #define SERIAL_PIN_INPUT PIND + #if SOFT_SERIAL_PIN == D0 + #define SERIAL_PIN_MASK _BV(PD0) + #define EIMSK_BIT _BV(INT0) + #define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01))) + #define SERIAL_PIN_INTERRUPT INT0_vect + #elif SOFT_SERIAL_PIN == D1 + #define SERIAL_PIN_MASK _BV(PD1) + #define EIMSK_BIT _BV(INT1) + #define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11))) + #define SERIAL_PIN_INTERRUPT INT1_vect + #elif SOFT_SERIAL_PIN == D2 + #define SERIAL_PIN_MASK _BV(PD2) + #define EIMSK_BIT _BV(INT2) + #define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21))) + #define SERIAL_PIN_INTERRUPT INT2_vect + #elif SOFT_SERIAL_PIN == D3 + #define SERIAL_PIN_MASK _BV(PD3) + #define EIMSK_BIT _BV(INT3) + #define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31))) + #define SERIAL_PIN_INTERRUPT INT3_vect + #endif + #elif SOFT_SERIAL_PIN == E6 + #define SERIAL_PIN_DDR DDRE + #define SERIAL_PIN_PORT PORTE + #define SERIAL_PIN_INPUT PINE + #define SERIAL_PIN_MASK _BV(PE6) + #define EIMSK_BIT _BV(INT6) + #define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61))) + #define SERIAL_PIN_INTERRUPT INT6_vect + #else + #error invalid SOFT_SERIAL_PIN value + #endif + +#else + #error serial.c now support ATmega32U4 only +#endif + +//////////////// for backward compatibility //////////////////////////////// +#if !defined(SERIAL_USE_SINGLE_TRANSACTION) && !defined(SERIAL_USE_MULTI_TRANSACTION) +/* --- USE OLD API (compatible with let's split serial.c) */ #if SERIAL_SLAVE_BUFFER_LENGTH > 0 uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0}; #endif @@ -42,56 +97,118 @@ SSTD_t transactions[] = { }; void serial_master_init(void) -{ soft_serial_initiator_init(transactions); } +{ soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); } void serial_slave_init(void) -{ soft_serial_target_init(transactions); } +{ soft_serial_target_init(transactions, TID_LIMIT(transactions)); } // 0 => no error // 1 => slave did not respond // 2 => checksum error int serial_update_buffers() -{ return soft_serial_transaction(); } +{ + int result; + result = soft_serial_transaction(); + return result; +} -#endif // Simple API (OLD API, compatible with let's split serial.c) +#endif // end of OLD API (compatible with let's split serial.c) +//////////////////////////////////////////////////////////////////////////// #define ALWAYS_INLINE __attribute__((always_inline)) #define NO_INLINE __attribute__((noinline)) #define _delay_sub_us(x) __builtin_avr_delay_cycles(x) -// Serial pulse period in microseconds. -#define TID_SEND_ADJUST 14 +// parity check +#define ODD_PARITY 1 +#define EVEN_PARITY 0 +#define PARITY EVEN_PARITY + +#ifdef SERIAL_DELAY + // custom setup in config.h + // #define TID_SEND_ADJUST 2 + // #define SERIAL_DELAY 6 // micro sec + // #define READ_WRITE_START_ADJUST 30 // cycles + // #define READ_WRITE_WIDTH_ADJUST 8 // cycles +#else +// ============ Standard setups ============ + +#ifndef SELECT_SOFT_SERIAL_SPEED +#define SELECT_SOFT_SERIAL_SPEED 1 +// 0: about 189kbps +// 1: about 137kbps (default) +// 2: about 75kbps +// 3: about 39kbps +// 4: about 26kbps +// 5: about 20kbps +#endif -#define SELECT_SERIAL_SPEED 1 -#if SELECT_SERIAL_SPEED == 0 +#if __GNUC__ < 6 + #define TID_SEND_ADJUST 14 +#else + #define TID_SEND_ADJUST 2 +#endif + +#if SELECT_SOFT_SERIAL_SPEED == 0 // Very High speed #define SERIAL_DELAY 4 // micro sec - #define READ_WRITE_START_ADJUST 33 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 1 + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 34 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 1 // High speed #define SERIAL_DELAY 6 // micro sec - #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 2 + #if __GNUC__ < 6 + #define READ_WRITE_START_ADJUST 30 // cycles + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_START_ADJUST 33 // cycles + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 2 // Middle speed #define SERIAL_DELAY 12 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 3 + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 3 // Low speed #define SERIAL_DELAY 24 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles -#elif SELECT_SERIAL_SPEED == 4 + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 4 // Very Low speed - #define SERIAL_DELAY 50 // micro sec + #define SERIAL_DELAY 36 // micro sec #define READ_WRITE_START_ADJUST 30 // cycles - #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif +#elif SELECT_SOFT_SERIAL_SPEED == 5 + // Ultra Low speed + #define SERIAL_DELAY 48 // micro sec + #define READ_WRITE_START_ADJUST 30 // cycles + #if __GNUC__ < 6 + #define READ_WRITE_WIDTH_ADJUST 3 // cycles + #else + #define READ_WRITE_WIDTH_ADJUST 7 // cycles + #endif #else -#error Illegal Serial Speed -#endif - +#error invalid SELECT_SOFT_SERIAL_SPEED value +#endif /* SELECT_SOFT_SERIAL_SPEED */ +#endif /* SERIAL_DELAY */ #define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2) #define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2) @@ -105,17 +222,21 @@ int serial_update_buffers() #endif static SSTD_t *Transaction_table = NULL; +static uint8_t Transaction_table_size = 0; +inline static void serial_delay(void) ALWAYS_INLINE; inline static void serial_delay(void) { _delay_us(SERIAL_DELAY); } +inline static void serial_delay_half1(void) ALWAYS_INLINE; inline static void serial_delay_half1(void) { _delay_us(SERIAL_DELAY_HALF1); } +inline static void serial_delay_half2(void) ALWAYS_INLINE; inline static void serial_delay_half2(void) { _delay_us(SERIAL_DELAY_HALF2); @@ -135,6 +256,7 @@ void serial_input_with_pullup(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } +inline static uint8_t serial_read_pin(void) ALWAYS_INLINE; inline static uint8_t serial_read_pin(void) { return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK); @@ -152,30 +274,28 @@ void serial_high(void) { SERIAL_PIN_PORT |= SERIAL_PIN_MASK; } -void soft_serial_initiator_init(SSTD_t *sstd_table) +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size) { Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; serial_output(); serial_high(); } -void soft_serial_target_init(SSTD_t *sstd_table) +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size) { Transaction_table = sstd_table; + Transaction_table_size = (uint8_t)sstd_table_size; serial_input_with_pullup(); -#if SERIAL_PIN_MASK == _BV(PD0) - // Enable INT0 - EIMSK |= _BV(INT0); - // Trigger on falling edge of INT0 - EICRA &= ~(_BV(ISC00) | _BV(ISC01)); -#elif SERIAL_PIN_MASK == _BV(PD2) - // Enable INT2 - EIMSK |= _BV(INT2); - // Trigger on falling edge of INT2 - EICRA &= ~(_BV(ISC20) | _BV(ISC21)); + // Enable INT0-INT3,INT6 + EIMSK |= EIMSK_BIT; +#if SERIAL_PIN_MASK == _BV(PE6) + // Trigger on falling edge of INT6 + EICRB &= EICRx_BIT; #else - #error unknown SERIAL_PIN_MASK value + // Trigger on falling edge of INT0-INT3 + EICRA &= EICRx_BIT; #endif } @@ -191,7 +311,7 @@ void sync_recv(void) { } // Used by the reciver to send a synchronization signal to the sender. -static void sync_send(void)NO_INLINE; +static void sync_send(void) NO_INLINE; static void sync_send(void) { serial_low(); @@ -205,12 +325,12 @@ static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { uint8_t byte, i, p, pb; _delay_sub_us(READ_WRITE_START_ADJUST); - for( i = 0, byte = 0, p = 0; i < bit; i++ ) { + for( i = 0, byte = 0, p = PARITY; i < bit; i++ ) { serial_delay_half1(); // read the middle of pulses if( serial_read_pin() ) { - byte = (byte << 1) | 1; p ^= 1; + byte = (byte << 1) | 1; p ^= 1; } else { - byte = (byte << 1) | 0; p ^= 0; + byte = (byte << 1) | 0; p ^= 0; } _delay_sub_us(READ_WRITE_WIDTH_ADJUST); serial_delay_half2(); @@ -230,13 +350,13 @@ static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) { void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE; void serial_write_chunk(uint8_t data, uint8_t bit) { uint8_t b, p; - for( p = 0, b = 1<<(bit-1); b ; b >>= 1) { - if(data & b) { - serial_high(); p ^= 1; - } else { - serial_low(); p ^= 0; - } - serial_delay(); + for( p = PARITY, b = 1<<(bit-1); b ; b >>= 1) { + if(data & b) { + serial_high(); p ^= 1; + } else { + serial_low(); p ^= 0; + } + serial_delay(); } /* send parity bit */ if(p & 1) { serial_high(); } @@ -288,6 +408,13 @@ void change_reciver2sender(void) { serial_delay_half1(); //4 } +static inline uint8_t nibble_bits_count(uint8_t bits) +{ + bits = (bits & 0x5) + (bits >> 1 & 0x5); + bits = (bits & 0x3) + (bits >> 2 & 0x3); + return bits; +} + // interrupt handle to be used by the target device ISR(SERIAL_PIN_INTERRUPT) { @@ -297,12 +424,15 @@ ISR(SERIAL_PIN_INTERRUPT) { SSTD_t *trans = Transaction_table; #else // recive transaction table index - uint8_t tid; + uint8_t tid, bits; uint8_t pecount = 0; sync_recv(); - tid = serial_read_chunk(&pecount,4); - if(pecount> 0) + bits = serial_read_chunk(&pecount,7); + tid = bits>>3; + bits = (bits&7) != nibble_bits_count(tid); + if( bits || pecount> 0 || tid > Transaction_table_size ) { return; + } serial_delay_half1(); serial_high(); // response step1 low->high @@ -315,17 +445,17 @@ ISR(SERIAL_PIN_INTERRUPT) { // target send phase if( trans->target2initiator_buffer_size > 0 ) serial_send_packet((uint8_t *)trans->target2initiator_buffer, - trans->target2initiator_buffer_size); + trans->target2initiator_buffer_size); // target switch to input change_sender2reciver(); // target recive phase if( trans->initiator2target_buffer_size > 0 ) { if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer, - trans->initiator2target_buffer_size) ) { - *trans->status = TRANSACTION_ACCEPTED; + trans->initiator2target_buffer_size) ) { + *trans->status = TRANSACTION_ACCEPTED; } else { - *trans->status = TRANSACTION_DATA_ERROR; + *trans->status = TRANSACTION_DATA_ERROR; } } else { *trans->status = TRANSACTION_ACCEPTED; @@ -349,6 +479,8 @@ int soft_serial_transaction(void) { SSTD_t *trans = Transaction_table; #else int soft_serial_transaction(int sstd_index) { + if( sstd_index > Transaction_table_size ) + return TRANSACTION_TYPE_ERROR; SSTD_t *trans = &Transaction_table[sstd_index]; #endif cli(); @@ -375,9 +507,10 @@ int soft_serial_transaction(int sstd_index) { #else // send transaction table index + int tid = (sstd_index<<3) | (7 & nibble_bits_count(sstd_index)); sync_send(); _delay_sub_us(TID_SEND_ADJUST); - serial_write_chunk(sstd_index, 4); + serial_write_chunk(tid, 7); serial_delay_half1(); // wait for the target response (step1 low->high) @@ -389,12 +522,12 @@ int soft_serial_transaction(int sstd_index) { // check if the target is present (step2 high->low) for( int i = 0; serial_read_pin(); i++ ) { if (i > SLAVE_INT_ACK_WIDTH + 1) { - // slave failed to pull the line low, assume not present - serial_output(); - serial_high(); - *trans->status = TRANSACTION_NO_RESPONSE; - sei(); - return TRANSACTION_NO_RESPONSE; + // slave failed to pull the line low, assume not present + serial_output(); + serial_high(); + *trans->status = TRANSACTION_NO_RESPONSE; + sei(); + return TRANSACTION_NO_RESPONSE; } _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT); } @@ -404,12 +537,12 @@ int soft_serial_transaction(int sstd_index) { // if the target is present syncronize with it if( trans->target2initiator_buffer_size > 0 ) { if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer, - trans->target2initiator_buffer_size) ) { - serial_output(); - serial_high(); - *trans->status = TRANSACTION_DATA_ERROR; - sei(); - return TRANSACTION_DATA_ERROR; + trans->target2initiator_buffer_size) ) { + serial_output(); + serial_high(); + *trans->status = TRANSACTION_DATA_ERROR; + sei(); + return TRANSACTION_DATA_ERROR; } } @@ -419,7 +552,7 @@ int soft_serial_transaction(int sstd_index) { // initiator send phase if( trans->initiator2target_buffer_size > 0 ) { serial_send_packet((uint8_t *)trans->initiator2target_buffer, - trans->initiator2target_buffer_size); + trans->initiator2target_buffer_size); } // always, release the line when not in use @@ -441,4 +574,17 @@ int soft_serial_get_and_clean_status(int sstd_index) { } #endif -#endif \ No newline at end of file +#endif + +// Helix serial.c history +// 2018-1-29 fork from let's split and add PD2, modify sync_recv() (#2308, bceffdefc) +// 2018-6-28 bug fix master to slave comm and speed up (#3255, 1038bbef4) +// (adjusted with avr-gcc 4.9.2) +// 2018-7-13 remove USE_SERIAL_PD2 macro (#3374, f30d6dd78) +// (adjusted with avr-gcc 4.9.2) +// 2018-8-11 add support multi-type transaction (#3608, feb5e4aae) +// (adjusted with avr-gcc 4.9.2) +// 2018-10-21 fix serial and RGB animation conflict (#4191, 4665e4fff) +// (adjusted with avr-gcc 7.3.0) +// 2018-10-28 re-adjust compiler depend value of delay (#4269, 8517f8a66) +// (adjusted with avr-gcc 5.4.0, 7.3.0) diff --git a/keyboards/fortitude60/serial.h b/keyboards/fortitude60/serial.h index d008980556ce..2e53928df2d3 100644 --- a/keyboards/fortitude60/serial.h +++ b/keyboards/fortitude60/serial.h @@ -4,40 +4,47 @@ #include // ///////////////////////////////////////////////////////////////// -// Need Soft Serial defines in serial_config.h +// Need Soft Serial defines in config.h // ///////////////////////////////////////////////////////////////// // ex. -// #define SERIAL_PIN_DDR DDRD -// #define SERIAL_PIN_PORT PORTD -// #define SERIAL_PIN_INPUT PIND -// #define SERIAL_PIN_MASK _BV(PD?) ?=0,2 -// #define SERIAL_PIN_INTERRUPT INT?_vect ?=0,2 +// #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6 +// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5 +// // 1: about 137kbps (default) +// // 2: about 75kbps +// // 3: about 39kbps +// // 4: about 26kbps +// // 5: about 20kbps // -// //// USE Simple API (OLD API, compatible with let's split serial.c) +// //// USE OLD API (compatible with let's split serial.c) // ex. // #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 // #define SERIAL_MASTER_BUFFER_LENGTH 1 // -// //// USE flexible API (using multi-type transaction function) -// #define SERIAL_USE_MULTI_TRANSACTION +// //// USE NEW API +// //// USE simple API (using signle-type transaction function) +// #define SERIAL_USE_SINGLE_TRANSACTION +// //// USE flexible API (using multi-type transaction function) +// #define SERIAL_USE_MULTI_TRANSACTION // // ///////////////////////////////////////////////////////////////// -#ifndef SERIAL_USE_MULTI_TRANSACTION -/* --- USE Simple API (OLD API, compatible with let's split serial.c) */ -#if SERIAL_SLAVE_BUFFER_LENGTH > 0 -extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; -#endif -#if SERIAL_MASTER_BUFFER_LENGTH > 0 -extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; -#endif +//////////////// for backward compatibility //////////////////////////////// +#if !defined(SERIAL_USE_SINGLE_TRANSACTION) && !defined(SERIAL_USE_MULTI_TRANSACTION) +/* --- USE OLD API (compatible with let's split serial.c) */ + #if SERIAL_SLAVE_BUFFER_LENGTH > 0 + extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH]; + #endif + #if SERIAL_MASTER_BUFFER_LENGTH > 0 + extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH]; + #endif -void serial_master_init(void); -void serial_slave_init(void); -int serial_update_buffers(void); + void serial_master_init(void); + void serial_slave_init(void); + int serial_update_buffers(void); -#endif // USE Simple API +#endif // end of USE OLD API +//////////////////////////////////////////////////////////////////////////// // Soft Serial Transaction Descriptor typedef struct _SSTD_t { @@ -47,16 +54,18 @@ typedef struct _SSTD_t { uint8_t target2initiator_buffer_size; uint8_t *target2initiator_buffer; } SSTD_t; +#define TID_LIMIT( table ) (sizeof(table) / sizeof(SSTD_t)) // initiator is transaction start side -void soft_serial_initiator_init(SSTD_t *sstd_table); +void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size); // target is interrupt accept side -void soft_serial_target_init(SSTD_t *sstd_table); +void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size); // initiator resullt #define TRANSACTION_END 0 #define TRANSACTION_NO_RESPONSE 0x1 #define TRANSACTION_DATA_ERROR 0x2 +#define TRANSACTION_TYPE_ERROR 0x4 #ifndef SERIAL_USE_MULTI_TRANSACTION int soft_serial_transaction(void); #else @@ -72,9 +81,9 @@ int soft_serial_transaction(int sstd_index); // target: // TRANSACTION_DATA_ERROR // or TRANSACTION_ACCEPTED -#define TRANSACTION_ACCEPTED 0x4 +#define TRANSACTION_ACCEPTED 0x8 #ifdef SERIAL_USE_MULTI_TRANSACTION int soft_serial_get_and_clean_status(int sstd_index); #endif -#endif /* SOFT_SERIAL_H */ \ No newline at end of file +#endif /* SOFT_SERIAL_H */ diff --git a/keyboards/fortitude60/serial_config.h b/keyboards/fortitude60/serial_config.h index 96a54afbd801..d4a42bce388e 100644 --- a/keyboards/fortitude60/serial_config.h +++ b/keyboards/fortitude60/serial_config.h @@ -2,13 +2,9 @@ #define SOFT_SERIAL_CONFIG_H /* Soft Serial defines */ -#define SERIAL_PIN_DDR DDRD -#define SERIAL_PIN_PORT PORTD -#define SERIAL_PIN_INPUT PIND -#define SERIAL_PIN_MASK _BV(PD2) -#define SERIAL_PIN_INTERRUPT INT2_vect +#define SOFT_SERIAL_PIN D2 #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2 #define SERIAL_MASTER_BUFFER_LENGTH 1 -#endif /* SOFT_SERIAL_CONFIG_H */ \ No newline at end of file +#endif /* SOFT_SERIAL_CONFIG_H */ From 46cf8cc9b33a3c8bdbb0ce7df7f48f28e4d979a5 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Wed, 14 Nov 2018 18:37:53 -0800 Subject: [PATCH 423/505] Configurator support for Octagon V2 75_ansi (#4426) --- keyboards/duck/octagon/v2/info.json | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/keyboards/duck/octagon/v2/info.json b/keyboards/duck/octagon/v2/info.json index 7bc0c6ef90ca..11bde45a5d4b 100644 --- a/keyboards/duck/octagon/v2/info.json +++ b/keyboards/duck/octagon/v2/info.json @@ -1,12 +1,16 @@ { - "keyboard_name": "Octagon V2", - "url": "", - "maintainer": "qmk", - "width": 16, - "height": 6, + "keyboard_name": "Octagon V2", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 6, "layouts": { "LAYOUT": { "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":1, "y":0}, {"label":"F2", "x":2, "y":0}, {"label":"F3", "x":3, "y":0}, {"label":"F4", "x":4, "y":0}, {"label":"F5", "x":5, "y":0}, {"label":"F6", "x":6, "y":0}, {"label":"F7", "x":7, "y":0}, {"label":"F8", "x":8, "y":0}, {"label":"F9", "x":9, "y":0}, {"label":"F10", "x":10, "y":0}, {"label":"F11", "x":11, "y":0}, {"label":"F12", "x":12, "y":0}, {"label":"PrtSc", "x":13, "y":0}, {"label":"Pause", "x":14, "y":0}, {"label":"Delete", "x":15, "y":0}, {"label":"~", "x":0, "y":1}, {"label":"!", "x":1, "y":1}, {"label":"@", "x":2, "y":1}, {"label":"#", "x":3, "y":1}, {"label":"$", "x":4, "y":1}, {"label":"%", "x":5, "y":1}, {"label":"^", "x":6, "y":1}, {"label":"&", "x":7, "y":1}, {"label":"*", "x":8, "y":1}, {"label":"(", "x":9, "y":1}, {"label":")", "x":10, "y":1}, {"label":"_", "x":11, "y":1}, {"label":"+", "x":12, "y":1}, {"label":"Backspace", "x":13, "y":1, "w":2}, {"label":"Home", "x":15, "y":1}, {"label":"Tab", "x":0, "y":2, "w":1.5}, {"label":"Q", "x":1.5, "y":2}, {"label":"W", "x":2.5, "y":2}, {"label":"E", "x":3.5, "y":2}, {"label":"R", "x":4.5, "y":2}, {"label":"T", "x":5.5, "y":2}, {"label":"Y", "x":6.5, "y":2}, {"label":"U", "x":7.5, "y":2}, {"label":"I", "x":8.5, "y":2}, {"label":"O", "x":9.5, "y":2}, {"label":"P", "x":10.5, "y":2}, {"label":"{", "x":11.5, "y":2}, {"label":"}", "x":12.5, "y":2}, {"label":"|", "x":13.5, "y":2, "w":1.5}, {"label":"Page Up", "x":15, "y":2}, {"label":"Caps Lock", "x":0, "y":3, "w":1.75}, {"label":"A", "x":1.75, "y":3}, {"label":"S", "x":2.75, "y":3}, {"label":"D", "x":3.75, "y":3}, {"label":"F", "x":4.75, "y":3}, {"label":"G", "x":5.75, "y":3}, {"label":"H", "x":6.75, "y":3}, {"label":"J", "x":7.75, "y":3}, {"label":"K", "x":8.75, "y":3}, {"label":"L", "x":9.75, "y":3}, {"label":":", "x":10.75, "y":3}, {"label":"\"", "x":11.75, "y":3}, {"x":12.75, "y":3}, {"label":"Enter", "x":13.75, "y":3, "w":1.25}, {"label":"Page Down", "x":15, "y":3}, {"label":"Shift", "x":0, "y":4, "w":1.25}, {"x":1.25, "y":4}, {"label":"Z", "x":2.25, "y":4}, {"label":"X", "x":3.25, "y":4}, {"label":"C", "x":4.25, "y":4}, {"label":"V", "x":5.25, "y":4}, {"label":"B", "x":6.25, "y":4}, {"label":"N", "x":7.25, "y":4}, {"label":"M", "x":8.25, "y":4}, {"label":"<", "x":9.25, "y":4}, {"label":">", "x":10.25, "y":4}, {"label":"?", "x":11.25, "y":4}, {"label":"Shift", "x":12.25, "y":4, "w":1.75}, {"label":"\u2191", "x":14, "y":4}, {"label":"End", "x":15, "y":4}, {"label":"Ctrl", "x":0, "y":5, "w":1.25}, {"label":"Win", "x":1.25, "y":5, "w":1.25}, {"label":"Alt", "x":2.5, "y":5, "w":1.25}, {"x":3.75, "y":5, "w":6.25}, {"label":"Alt", "x":10, "y":5}, {"label":"Fn", "x":11, "y":5}, {"label":"Ctrl", "x":12, "y":5}, {"label":"\u2190", "x":13, "y":5}, {"label":"\u2193", "x":14, "y":5}, {"label":"\u2192", "x":15, "y":5}] + }, + + "LAYOUT_75_ansi": { + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "y":1}, {"x":12, "y":1}, {"x":13, "y":1, "w":2}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.5}, {"x":1.5, "y":2}, {"x":2.5, "y":2}, {"x":3.5, "y":2}, {"x":4.5, "y":2}, {"x":5.5, "y":2}, {"x":6.5, "y":2}, {"x":7.5, "y":2}, {"x":8.5, "y":2}, {"x":9.5, "y":2}, {"x":10.5, "y":2}, {"x":11.5, "y":2}, {"x":12.5, "y":2}, {"x":13.5, "y":2, "w":1.5}, {"x":15, "y":2}, {"x":0, "y":3, "w":1.75}, {"x":1.75, "y":3}, {"x":2.75, "y":3}, {"x":3.75, "y":3}, {"x":4.75, "y":3}, {"x":5.75, "y":3}, {"x":6.75, "y":3}, {"x":7.75, "y":3}, {"x":8.75, "y":3}, {"x":9.75, "y":3}, {"x":10.75, "y":3}, {"x":11.75, "y":3}, {"x":12.75, "y":3, "w":2.25}, {"x":15, "y":3}, {"x":0, "y":4, "w":2.25}, {"x":2.25, "y":4}, {"x":3.25, "y":4}, {"x":4.25, "y":4}, {"x":5.25, "y":4}, {"x":6.25, "y":4}, {"x":7.25, "y":4}, {"x":8.25, "y":4}, {"x":9.25, "y":4}, {"x":10.25, "y":4}, {"x":11.25, "y":4}, {"x":12.25, "y":4, "w":1.75}, {"x":14, "y":4}, {"x":15, "y":4}, {"x":0, "y":5, "w":1.25}, {"x":1.25, "y":5, "w":1.25}, {"x":2.5, "y":5, "w":1.25}, {"x":3.75, "y":5, "w":6.25}, {"x":10, "y":5}, {"x":11, "y":5}, {"x":12, "y":5}, {"x":13, "y":5}, {"x":14, "y":5}, {"x":15, "y":5}] } } } From 39bd760faf2666e91d6dc5b199f02fa3206c6acd Mon Sep 17 00:00:00 2001 From: James Laird-Wah Date: Fri, 16 Nov 2018 17:22:05 +1100 Subject: [PATCH 424/505] Use a single endpoint for HID reports (#3951) * Unify multiple HID interfaces into one This reduces the number of USB endpoints required, which frees them up for other things. NKRO and EXTRAKEY always use the shared endpoint. By default, MOUSEKEY also uses it. This means it won't work as a Boot Procotol mouse in some BIOSes, etc. If you really think your keyboard needs to work as a mouse in your BIOS, set MOUSE_SHARED_EP = no in your rules.mk. By default, the core keyboard does not use the shared endpoint, as not all BIOSes are standards compliant and that's one place you don't want to find out your keyboard doesn't work.. If you are really confident, you can set KEYBOARD_SHARED_EP = yes to use the shared endpoint here too. * unify endpoints: ChibiOS protocol implementation * fixup: missing #ifdef EXTRAKEY_ENABLEs broke build on AVR with EXTRAKEY disabled * endpoints: restore error when too many endpoints required * lufa: wait up to 10ms to send keyboard input This avoids packets being dropped when two reports are sent in quick succession (eg. releasing a dual role key). * endpoints: fix compile on ARM_ATSAM * endpoint: ARM_ATSAM fixes No longer use wrong or unexpected endpoint IDs * endpoints: accommodate VUSB protocol V-USB has its own, understandably simple ideas about the report formats. It already blasts the mouse and extrakeys through one endpoint with report IDs. We just stay out of its way. * endpoints: document new endpoint configuration options * endpoints: respect keyboard_report->mods in NKRO The caller(s) of host_keyboard_send expect to be able to just drop modifiers in the mods field and not worry about whether NKRO is in use. This is a good thing. So we just shift it over if needs be. * endpoints: report.c: update for new keyboard_report format --- docs/config_options.md | 29 +++ tmk_core/common.mk | 21 ++ tmk_core/common/host.c | 22 ++ tmk_core/common/report.c | 21 +- tmk_core/common/report.h | 46 ++-- tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c | 5 +- tmk_core/protocol/chibios/usb_main.c | 176 +++++++-------- tmk_core/protocol/chibios/usb_main.h | 11 +- tmk_core/protocol/lufa/lufa.c | 92 ++++---- tmk_core/protocol/usb_descriptor.c | 213 ++++++++---------- tmk_core/protocol/usb_descriptor.h | 170 ++++++-------- 11 files changed, 426 insertions(+), 380 deletions(-) diff --git a/docs/config_options.md b/docs/config_options.md index c4921c21d762..b811fa877dc0 100644 --- a/docs/config_options.md +++ b/docs/config_options.md @@ -261,3 +261,32 @@ Use these to enable or disable building certain features. The more you have enab * Forces the keyboard to wait for a USB connection to be established before it starts up * `NO_USB_STARTUP_CHECK` * Disables usb suspend check after keyboard startup. Usually the keyboard waits for the host to wake it up before any tasks are performed. This is useful for split keyboards as one half will not get a wakeup call but must send commands to the master. + +## USB Endpoint Limitations + +In order to provide services over USB, QMK has to use USB endpoints. +These are a finite resource: each microcontroller has only a certain number. +This limits what features can be enabled together. +If the available endpoints are exceeded, a build error is thrown. + +The following features can require separate endpoints: + +* `MOUSEKEY_ENABLE` +* `EXTRAKEY_ENABLE` +* `CONSOLE_ENABLE` +* `NKRO_ENABLE` +* `MIDI_ENABLE` +* `RAW_ENABLE` +* `VIRTSER_ENABLE` + +In order to improve utilisation of the endpoints, the HID features can be combined to use a single endpoint. +By default, `MOUSEKEY`, `EXTRAKEY`, and `NKRO` are combined into a single endpoint. + +The base keyboard functionality can also be combined into the endpoint, +by setting `KEYBOARD_SHARED_EP = yes`. +This frees up one more endpoint, +but it can prevent the keyboard working in some BIOSes, +as they do not implement Boot Keyboard protocol switching. + +Combining the mouse also breaks Boot Mouse compatibility. +The mouse can be uncombined by setting `MOUSE_SHARED_EP = no` if this functionality is required. diff --git a/tmk_core/common.mk b/tmk_core/common.mk index 8eac1734f413..063115acb1ab 100644 --- a/tmk_core/common.mk +++ b/tmk_core/common.mk @@ -82,15 +82,31 @@ else TMK_COMMON_SRC += $(COMMON_DIR)/magic.c endif +SHARED_EP_ENABLE = no +MOUSE_SHARED_EP ?= yes +ifeq ($(strip $(KEYBOARD_SHARED_EP)), yes) + TMK_COMMON_DEFS += -DKEYBOARD_SHARED_EP + SHARED_EP_ENABLE = yes + # With the current usb_descriptor.c code, + # you can't share kbd without sharing mouse; + # that would be a very unexpected use case anyway + MOUSE_SHARED_EP = yes +endif ifeq ($(strip $(MOUSEKEY_ENABLE)), yes) TMK_COMMON_SRC += $(COMMON_DIR)/mousekey.c TMK_COMMON_DEFS += -DMOUSEKEY_ENABLE TMK_COMMON_DEFS += -DMOUSE_ENABLE + + ifeq ($(strip $(MOUSE_SHARED_EP)), yes) + TMK_COMMON_DEFS += -DMOUSE_SHARED_EP + SHARED_EP_ENABLE = yes + endif endif ifeq ($(strip $(EXTRAKEY_ENABLE)), yes) TMK_COMMON_DEFS += -DEXTRAKEY_ENABLE + SHARED_EP_ENABLE = yes endif ifeq ($(strip $(RAW_ENABLE)), yes) @@ -111,6 +127,7 @@ endif ifeq ($(strip $(NKRO_ENABLE)), yes) TMK_COMMON_DEFS += -DNKRO_ENABLE + SHARED_EP_ENABLE = yes endif ifeq ($(strip $(USB_6KRO_ENABLE)), yes) @@ -182,6 +199,10 @@ ifeq ($(strip $(KEYMAP_SECTION_ENABLE)), yes) endif endif +ifeq ($(strip $(SHARED_EP_ENABLE)), yes) + TMK_COMMON_DEFS += -DSHARED_EP_ENABLE +endif + # Bootloader address ifdef STM32_BOOTLOADER_ADDRESS TMK_COMMON_DEFS += -DSTM32_BOOTLOADER_ADDRESS=$(STM32_BOOTLOADER_ADDRESS) diff --git a/tmk_core/common/host.c b/tmk_core/common/host.c index e12b6221656f..f5d0416996b1 100644 --- a/tmk_core/common/host.c +++ b/tmk_core/common/host.c @@ -22,6 +22,11 @@ along with this program. If not, see . #include "util.h" #include "debug.h" +#ifdef NKRO_ENABLE + #include "keycode_config.h" + extern keymap_config_t keymap_config; +#endif + static host_driver_t *driver; static uint16_t last_system_report = 0; static uint16_t last_consumer_report = 0; @@ -46,6 +51,20 @@ uint8_t host_keyboard_leds(void) void host_keyboard_send(report_keyboard_t *report) { if (!driver) return; +#if defined(NKRO_ENABLE) && defined(NKRO_SHARED_EP) + if (keyboard_protocol && keymap_config.nkro) { + /* The callers of this function assume that report->mods is where mods go in. + * But report->nkro.mods can be at a different offset if core keyboard does not have a report ID. + */ + report->nkro.mods = report->mods; + report->nkro.report_id = REPORT_ID_NKRO; + } else +#endif + { +#ifdef KEYBOARD_SHARED_EP + report->report_id = REPORT_ID_KEYBOARD; +#endif + } (*driver->send_keyboard)(report); if (debug_keyboard) { @@ -60,6 +79,9 @@ void host_keyboard_send(report_keyboard_t *report) void host_mouse_send(report_mouse_t *report) { if (!driver) return; +#ifdef MOUSE_SHARED_EP + report->report_id = REPORT_ID_MOUSE; +#endif (*driver->send_mouse)(report); } diff --git a/tmk_core/common/report.c b/tmk_core/common/report.c index eb3b44312ffd..6a06b70c60af 100644 --- a/tmk_core/common/report.c +++ b/tmk_core/common/report.c @@ -19,6 +19,7 @@ #include "keycode_config.h" #include "debug.h" #include "util.h" +#include /** \brief has_anykey * @@ -27,8 +28,16 @@ uint8_t has_anykey(report_keyboard_t* keyboard_report) { uint8_t cnt = 0; - for (uint8_t i = 1; i < KEYBOARD_REPORT_SIZE; i++) { - if (keyboard_report->raw[i]) + uint8_t *p = keyboard_report->keys; + uint8_t lp = sizeof(keyboard_report->keys); +#ifdef NKRO_ENABLE + if (keyboard_protocol && keymap_config.nkro) { + p = keyboard_report->nkro.bits; + lp = sizeof(keyboard_report->nkro.bits); + } +#endif + while (lp--) { + if (*p++) cnt++; } return cnt; @@ -237,7 +246,11 @@ void del_key_from_report(report_keyboard_t* keyboard_report, uint8_t key) void clear_keys_from_report(report_keyboard_t* keyboard_report) { // not clear mods - for (int8_t i = 1; i < KEYBOARD_REPORT_SIZE; i++) { - keyboard_report->raw[i] = 0; +#ifdef NKRO_ENABLE + if (keyboard_protocol && keymap_config.nkro) { + memset(keyboard_report->nkro.bits, 0, sizeof(keyboard_report->nkro.bits)); + return; } +#endif + memset(keyboard_report->keys, 0, sizeof(keyboard_report->keys)); } diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index 167f382751e9..5a1a6b19c7b4 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -23,9 +23,11 @@ along with this program. If not, see . /* report id */ -#define REPORT_ID_MOUSE 1 -#define REPORT_ID_SYSTEM 2 -#define REPORT_ID_CONSUMER 3 +#define REPORT_ID_KEYBOARD 1 +#define REPORT_ID_MOUSE 2 +#define REPORT_ID_SYSTEM 3 +#define REPORT_ID_CONSUMER 4 +#define REPORT_ID_NKRO 5 /* mouse buttons */ #define MOUSE_BTN1 (1<<0) @@ -72,32 +74,35 @@ along with this program. If not, see . #define SYSTEM_WAKE_UP 0x0083 +#define NKRO_SHARED_EP /* key report size(NKRO or boot mode) */ #if defined(NKRO_ENABLE) - #if defined(PROTOCOL_PJRC) - #include "usb.h" - #define KEYBOARD_REPORT_SIZE KBD2_SIZE - #define KEYBOARD_REPORT_KEYS (KBD2_SIZE - 2) - #define KEYBOARD_REPORT_BITS (KBD2_SIZE - 1) - #elif defined(PROTOCOL_LUFA) || defined(PROTOCOL_CHIBIOS) + #if defined(PROTOCOL_LUFA) || defined(PROTOCOL_CHIBIOS) #include "protocol/usb_descriptor.h" - #define KEYBOARD_REPORT_SIZE NKRO_EPSIZE - #define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2) - #define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1) + #define KEYBOARD_REPORT_BITS (SHARED_EPSIZE - 2) #elif defined(PROTOCOL_ARM_ATSAM) #include "protocol/arm_atsam/usb/udi_device_epsize.h" - #define KEYBOARD_REPORT_SIZE NKRO_EPSIZE - #define KEYBOARD_REPORT_KEYS (NKRO_EPSIZE - 2) #define KEYBOARD_REPORT_BITS (NKRO_EPSIZE - 1) + #undef NKRO_SHARED_EP + #undef MOUSE_SHARED_EP #else #error "NKRO not supported with this protocol" + #endif #endif +#ifdef KEYBOARD_SHARED_EP +# define KEYBOARD_REPORT_SIZE 9 #else # define KEYBOARD_REPORT_SIZE 8 -# define KEYBOARD_REPORT_KEYS 6 #endif +#define KEYBOARD_REPORT_KEYS 6 + +/* VUSB hardcodes keyboard and mouse+extrakey only */ +#if defined(PROTOCOL_VUSB) + #undef KEYBOARD_SHARED_EP + #undef MOUSE_SHARED_EP +#endif #ifdef __cplusplus extern "C" { @@ -126,12 +131,18 @@ extern "C" { typedef union { uint8_t raw[KEYBOARD_REPORT_SIZE]; struct { +#ifdef KEYBOARD_SHARED_EP + uint8_t report_id; +#endif uint8_t mods; uint8_t reserved; uint8_t keys[KEYBOARD_REPORT_KEYS]; }; #ifdef NKRO_ENABLE - struct { + struct nkro_report { +#ifdef NKRO_SHARED_EP + uint8_t report_id; +#endif uint8_t mods; uint8_t bits[KEYBOARD_REPORT_BITS]; } nkro; @@ -139,6 +150,9 @@ typedef union { } __attribute__ ((packed)) report_keyboard_t; typedef struct { +#ifdef MOUSE_SHARED_EP + uint8_t report_id; +#endif uint8_t buttons; int8_t x; int8_t y; diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c index 18f9784ae68f..c263ac4aa1d9 100644 --- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c +++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c @@ -54,6 +54,7 @@ #include "udi_hid.h" #include "udi_hid_kbd.h" #include +#include "report.h" //*************************************************************************** // KBD @@ -430,7 +431,7 @@ UDC_DESC_STORAGE udi_hid_exk_report_desc_t udi_hid_exk_report_desc = { 0x05, 0x01, // Usage Page (Generic Desktop), 0x09, 0x80, // Usage (System Control), 0xA1, 0x01, // Collection (Application), - 0x85, 0x02, // Report ID (2) (System), + 0x85, REPORT_ID_SYSTEM, // Report ID (2) (System), 0x16, 0x01, 0x00, // Logical Minimum (1), 0x26, 0x03, 0x00, // Logical Maximum (3), 0x1A, 0x81, 0x00, // Usage Minimum (81) (System Power Down), @@ -445,7 +446,7 @@ UDC_DESC_STORAGE udi_hid_exk_report_desc_t udi_hid_exk_report_desc = { 0x05, 0x0C, // Usage Page (Consumer), 0x09, 0x01, // Usage (Consumer Control), 0xA1, 0x01, // Collection (Application), - 0x85, 0x03, // Report ID (3) (Consumer), + 0x85, REPORT_ID_CONSUMER, // Report ID (3) (Consumer), 0x16, 0x01, 0x00, // Logical Minimum (1), 0x26, 0x9C, 0x02, // Logical Maximum (668), 0x1A, 0x01, 0x00, // Usage Minimum (1), diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index 71892c4f496f..3028e7ea2adf 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -95,6 +95,7 @@ static const USBDescriptor *usb_get_descriptor_cb(USBDriver *usbp, uint8_t dtype return &desc; } +#ifndef KEYBOARD_SHARED_EP /* keyboard endpoint state structure */ static USBInEndpointState kbd_ep_state; /* keyboard endpoint initialization structure (IN) */ @@ -110,8 +111,9 @@ static const USBEndpointConfig kbd_ep_config = { 2, /* IN multiplier */ NULL /* SETUP buffer (not a SETUP endpoint) */ }; +#endif -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) /* mouse endpoint state structure */ static USBInEndpointState mouse_ep_state; @@ -128,45 +130,26 @@ static const USBEndpointConfig mouse_ep_config = { 2, /* IN multiplier */ NULL /* SETUP buffer (not a SETUP endpoint) */ }; -#endif /* MOUSE_ENABLE */ - -#ifdef EXTRAKEY_ENABLE -/* extrakey endpoint state structure */ -static USBInEndpointState extra_ep_state; - -/* extrakey endpoint initialization structure (IN) */ -static const USBEndpointConfig extra_ep_config = { - USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ - NULL, /* SETUP packet notification callback */ - extra_in_cb, /* IN notification callback */ - NULL, /* OUT notification callback */ - EXTRAKEY_EPSIZE, /* IN maximum packet size */ - 0, /* OUT maximum packet size */ - &extra_ep_state, /* IN Endpoint state */ - NULL, /* OUT endpoint state */ - 2, /* IN multiplier */ - NULL /* SETUP buffer (not a SETUP endpoint) */ -}; -#endif /* EXTRAKEY_ENABLE */ +#endif -#ifdef NKRO_ENABLE -/* nkro endpoint state structure */ -static USBInEndpointState nkro_ep_state; +#ifdef SHARED_EP_ENABLE +/* shared endpoint state structure */ +static USBInEndpointState shared_ep_state; -/* nkro endpoint initialization structure (IN) */ -static const USBEndpointConfig nkro_ep_config = { +/* shared endpoint initialization structure (IN) */ +static const USBEndpointConfig shared_ep_config = { USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ NULL, /* SETUP packet notification callback */ - nkro_in_cb, /* IN notification callback */ + shared_in_cb, /* IN notification callback */ NULL, /* OUT notification callback */ - NKRO_EPSIZE, /* IN maximum packet size */ + SHARED_EPSIZE, /* IN maximum packet size */ 0, /* OUT maximum packet size */ - &nkro_ep_state, /* IN Endpoint state */ + &shared_ep_state, /* IN Endpoint state */ NULL, /* OUT endpoint state */ 2, /* IN multiplier */ NULL /* SETUP buffer (not a SETUP endpoint) */ }; -#endif /* NKRO_ENABLE */ +#endif typedef struct { size_t queue_capacity_in; @@ -309,16 +292,15 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) { case USB_EVENT_CONFIGURED: osalSysLockFromISR(); /* Enable the endpoints specified into the configuration. */ +#ifndef KEYBOARD_SHARED_EP usbInitEndpointI(usbp, KEYBOARD_IN_EPNUM, &kbd_ep_config); -#ifdef MOUSE_ENABLE +#endif +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) usbInitEndpointI(usbp, MOUSE_IN_EPNUM, &mouse_ep_config); -#endif /* MOUSE_ENABLE */ -#ifdef EXTRAKEY_ENABLE - usbInitEndpointI(usbp, EXTRAKEY_IN_EPNUM, &extra_ep_config); -#endif /* EXTRAKEY_ENABLE */ -#ifdef NKRO_ENABLE - usbInitEndpointI(usbp, NKRO_IN_EPNUM, &nkro_ep_config); -#endif /* NKRO_ENABLE */ +#endif +#ifdef SHARED_EP_ENABLE + usbInitEndpointI(usbp, SHARED_IN_EPNUM, &shared_ep_config); +#endif for (int i=0;isetup fields: * 0: bmRequestType (bitmask) @@ -409,42 +402,16 @@ static bool usb_request_hook_cb(USBDriver *usbp) { case HID_GET_REPORT: switch(usbp->setup[4]) { /* LSB(wIndex) (check MSB==0?) */ case KEYBOARD_INTERFACE: -#ifdef NKRO_ENABLE - case NKRO_INTERFACE: -#endif /* NKRO_ENABLE */ usbSetupTransfer(usbp, (uint8_t *)&keyboard_report_sent, sizeof(keyboard_report_sent), NULL); return TRUE; break; -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) case MOUSE_INTERFACE: usbSetupTransfer(usbp, (uint8_t *)&mouse_report_blank, sizeof(mouse_report_blank), NULL); return TRUE; break; -#endif /* MOUSE_ENABLE */ - -#ifdef EXTRAKEY_ENABLE - case EXTRAKEY_INTERFACE: - if(usbp->setup[3] == 1) { /* MSB(wValue) [Report Type] == 1 [Input Report] */ - switch(usbp->setup[2]) { /* LSB(wValue) [Report ID] */ - case REPORT_ID_SYSTEM: - extra_report_blank[0] = REPORT_ID_SYSTEM; - usbSetupTransfer(usbp, (uint8_t *)extra_report_blank, sizeof(extra_report_blank), NULL); - return TRUE; - break; - case REPORT_ID_CONSUMER: - extra_report_blank[0] = REPORT_ID_CONSUMER; - usbSetupTransfer(usbp, (uint8_t *)extra_report_blank, sizeof(extra_report_blank), NULL); - return TRUE; - break; - default: - return FALSE; - } - } else { - return FALSE; - } - break; -#endif /* EXTRAKEY_ENABLE */ +#endif default: usbSetupTransfer(usbp, NULL, 0, NULL); @@ -472,12 +439,25 @@ static bool usb_request_hook_cb(USBDriver *usbp) { case HID_SET_REPORT: switch(usbp->setup[4]) { /* LSB(wIndex) (check MSB==0 and wLength==1?) */ case KEYBOARD_INTERFACE: -#ifdef NKRO_ENABLE - case NKRO_INTERFACE: -#endif /* NKRO_ENABLE */ +#if defined(SHARED_EP_ENABLE) && !defined(KEYBOARD_SHARED_EP) + case SHARED_INTERFACE: +#endif /* keyboard_led_stats = * keyboard_led_stats needs be word (or dword), otherwise we get an exception on F0 */ - usbSetupTransfer(usbp, (uint8_t *)&keyboard_led_stats, 1, NULL); + has_report_id = 0; +#if defined(SHARED_EP_ENABLE) + if (usbp->setup[4] == SHARED_INTERFACE) { + has_report_id = 1; + } +#endif + if (usbp->setup[4] == KEYBOARD_INTERFACE && !keyboard_protocol) { + has_report_id = 0; + } + if (has_report_id) { + usbSetupTransfer(usbp, set_report_buf, sizeof(set_report_buf), set_led_transfer_cb); + } else { + usbSetupTransfer(usbp, (uint8_t *)&keyboard_led_stats, 1, NULL); + } return TRUE; break; } @@ -591,20 +571,13 @@ void init_usb_driver(USBDriver *usbp) { * --------------------------------------------------------- */ /* keyboard IN callback hander (a kbd report has made it IN) */ +#ifndef KEYBOARD_SHARED_EP void kbd_in_cb(USBDriver *usbp, usbep_t ep) { /* STUB */ (void)usbp; (void)ep; } - -#ifdef NKRO_ENABLE -/* nkro IN callback hander (a nkro report has made it IN) */ -void nkro_in_cb(USBDriver *usbp, usbep_t ep) { - /* STUB */ - (void)usbp; - (void)ep; -} -#endif /* NKRO_ENABLE */ +#endif /* start-of-frame handler * TODO: i guess it would be better to re-implement using timers, @@ -628,9 +601,9 @@ static void keyboard_idle_timer_cb(void *arg) { } #ifdef NKRO_ENABLE - if(!keymap_config.nkro && keyboard_idle) { + if(!keymap_config.nkro && keyboard_idle && keyboard_protocol) { #else /* NKRO_ENABLE */ - if(keyboard_idle) { + if(keyboard_idle && keyboard_protocol) { #endif /* NKRO_ENABLE */ /* TODO: are we sure we want the KBD_ENDPOINT? */ if(!usbGetTransmitStatusI(usbp, KEYBOARD_IN_EPNUM)) { @@ -661,25 +634,25 @@ void send_keyboard(report_keyboard_t *report) { osalSysUnlock(); #ifdef NKRO_ENABLE - if(keymap_config.nkro) { /* NKRO protocol */ + if(keymap_config.nkro && keyboard_protocol) { /* NKRO protocol */ /* need to wait until the previous packet has made it through */ /* can rewrite this using the synchronous API, then would wait * until *after* the packet has been transmitted. I think * this is more efficient */ /* busy wait, should be short and not very common */ osalSysLock(); - if(usbGetTransmitStatusI(&USB_DRIVER, NKRO_IN_EPNUM)) { + if(usbGetTransmitStatusI(&USB_DRIVER, SHARED_IN_EPNUM)) { /* Need to either suspend, or loop and call unlock/lock during * every iteration - otherwise the system will remain locked, * no interrupts served, so USB not going through as well. * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ - osalThreadSuspendS(&(&USB_DRIVER)->epc[NKRO_IN_EPNUM]->in_state->thread); + osalThreadSuspendS(&(&USB_DRIVER)->epc[SHARED_IN_EPNUM]->in_state->thread); } - usbStartTransmitI(&USB_DRIVER, NKRO_IN_EPNUM, (uint8_t *)report, sizeof(report_keyboard_t)); + usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)report, sizeof(struct nkro_report)); osalSysUnlock(); } else #endif /* NKRO_ENABLE */ - { /* boot protocol */ + { /* regular protocol */ /* need to wait until the previous packet has made it through */ /* busy wait, should be short and not very common */ osalSysLock(); @@ -690,7 +663,15 @@ void send_keyboard(report_keyboard_t *report) { * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ osalThreadSuspendS(&(&USB_DRIVER)->epc[KEYBOARD_IN_EPNUM]->in_state->thread); } - usbStartTransmitI(&USB_DRIVER, KEYBOARD_IN_EPNUM, (uint8_t *)report, KEYBOARD_EPSIZE); + uint8_t *data, size; + if (keyboard_protocol) { + data = (uint8_t*)report; + size = KEYBOARD_REPORT_SIZE; + } else { /* boot protocol */ + data = &report->mods; + size = 8; + } + usbStartTransmitI(&USB_DRIVER, KEYBOARD_IN_EPNUM, data, size); osalSysUnlock(); } keyboard_report_sent = *report; @@ -703,11 +684,13 @@ void send_keyboard(report_keyboard_t *report) { #ifdef MOUSE_ENABLE +#ifndef MOUSE_SHARED_EP /* mouse IN callback hander (a mouse report has made it IN) */ void mouse_in_cb(USBDriver *usbp, usbep_t ep) { (void)usbp; (void)ep; } +#endif void send_mouse(report_mouse_t *report) { osalSysLock(); @@ -737,19 +720,24 @@ void send_mouse(report_mouse_t *report) { #endif /* MOUSE_ENABLE */ /* --------------------------------------------------------- - * Extrakey functions + * Shared EP functions * --------------------------------------------------------- */ - -#ifdef EXTRAKEY_ENABLE - -/* extrakey IN callback hander */ -void extra_in_cb(USBDriver *usbp, usbep_t ep) { +#ifdef SHARED_EP_ENABLE +/* shared IN callback hander */ +void shared_in_cb(USBDriver *usbp, usbep_t ep) { /* STUB */ (void)usbp; (void)ep; } +#endif + +/* --------------------------------------------------------- + * Extrakey functions + * --------------------------------------------------------- + */ +#ifdef EXTRAKEY_ENABLE static void send_extra_report(uint8_t report_id, uint16_t data) { osalSysLock(); if(usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) { @@ -762,7 +750,7 @@ static void send_extra_report(uint8_t report_id, uint16_t data) { .usage = data }; - usbStartTransmitI(&USB_DRIVER, EXTRAKEY_IN_EPNUM, (uint8_t *)&report, sizeof(report_extra_t)); + usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)&report, sizeof(report_extra_t)); osalSysUnlock(); } diff --git a/tmk_core/protocol/chibios/usb_main.h b/tmk_core/protocol/chibios/usb_main.h index 1f7eb12f8db5..55e8882cc4bf 100644 --- a/tmk_core/protocol/chibios/usb_main.h +++ b/tmk_core/protocol/chibios/usb_main.h @@ -65,6 +65,14 @@ void nkro_in_cb(USBDriver *usbp, usbep_t ep); void mouse_in_cb(USBDriver *usbp, usbep_t ep); #endif /* MOUSE_ENABLE */ +/* --------------- + * Shared EP header + * --------------- + */ + +/* shared IN request callback handler */ +void shared_in_cb(USBDriver *usbp, usbep_t ep); + /* --------------- * Extrakey header * --------------- @@ -72,9 +80,6 @@ void mouse_in_cb(USBDriver *usbp, usbep_t ep); #ifdef EXTRAKEY_ENABLE -/* extrakey IN request callback handler */ -void extra_in_cb(USBDriver *usbp, usbep_t ep); - /* extra report structure */ typedef struct { uint8_t report_id; diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c index 95e0b95b2fa9..e88e6f34aac4 100644 --- a/tmk_core/protocol/lufa/lufa.c +++ b/tmk_core/protocol/lufa/lufa.c @@ -409,19 +409,21 @@ void EVENT_USB_Device_ConfigurationChanged(void) bool ConfigSuccess = true; /* Setup Keyboard HID Report Endpoints */ +#ifndef KEYBOARD_SHARED_EP ConfigSuccess &= ENDPOINT_CONFIG(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, KEYBOARD_EPSIZE, ENDPOINT_BANK_SINGLE); +#endif -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) /* Setup Mouse HID Report Endpoint */ ConfigSuccess &= ENDPOINT_CONFIG(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, MOUSE_EPSIZE, ENDPOINT_BANK_SINGLE); #endif -#ifdef EXTRAKEY_ENABLE - /* Setup Extra HID Report Endpoint */ - ConfigSuccess &= ENDPOINT_CONFIG(EXTRAKEY_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, - EXTRAKEY_EPSIZE, ENDPOINT_BANK_SINGLE); +#ifdef SHARED_EP_ENABLE + /* Setup Shared HID Report Endpoint */ + ConfigSuccess &= ENDPOINT_CONFIG(SHARED_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, + SHARED_EPSIZE, ENDPOINT_BANK_SINGLE); #endif #ifdef RAW_ENABLE @@ -442,12 +444,6 @@ void EVENT_USB_Device_ConfigurationChanged(void) #endif #endif -#ifdef NKRO_ENABLE - /* Setup NKRO HID Report Endpoints */ - ConfigSuccess &= ENDPOINT_CONFIG(NKRO_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, - NKRO_EPSIZE, ENDPOINT_BANK_SINGLE); -#endif - #ifdef MIDI_ENABLE ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_IN_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE); ConfigSuccess &= Endpoint_ConfigureEndpoint(MIDI_STREAM_OUT_EPADDR, EP_TYPE_BULK, MIDI_STREAM_EPSIZE, ENDPOINT_BANK_SINGLE); @@ -512,8 +508,8 @@ void EVENT_USB_Device_ControlRequest(void) // Interface switch (USB_ControlRequest.wIndex) { case KEYBOARD_INTERFACE: -#ifdef NKRO_ENABLE - case NKRO_INTERFACE: +#if defined(SHARED_EP_ENABLE) && !defined(KEYBOARD_SHARED_EP) + case SHARED_INTERFACE: #endif Endpoint_ClearSETUP(); @@ -521,7 +517,17 @@ void EVENT_USB_Device_ControlRequest(void) if (USB_DeviceState == DEVICE_STATE_Unattached) return; } +#if defined(SHARED_EP_ENABLE) + uint8_t report_id = REPORT_ID_KEYBOARD; + if (keyboard_protocol) { + report_id = Endpoint_Read_8(); + } + if (report_id == REPORT_ID_KEYBOARD || report_id == REPORT_ID_NKRO) { + keyboard_led_stats = Endpoint_Read_8(); + } +#else keyboard_led_stats = Endpoint_Read_8(); +#endif Endpoint_ClearOUT(); Endpoint_ClearStatusStage(); @@ -612,16 +618,20 @@ static void send_keyboard(report_keyboard_t *report) #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]); - } + bluefruit_serial_send(0xFD); + bluefruit_serial_send(0x09); + bluefruit_serial_send(0x01); + bluefruit_serial_send(report->mods); + bluefruit_serial_send(report->reserved); + for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { + bluefruit_serial_send(report->keys[i]); + } #else bluefruit_serial_send(0xFD); - for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++) { - bluefruit_serial_send(report->raw[i]); + bluefruit_serial_send(report->mods); + bluefruit_serial_send(report->reserved); + for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { + bluefruit_serial_send(report->keys[i]); } #endif } @@ -632,30 +642,24 @@ static void send_keyboard(report_keyboard_t *report) } /* Select the Keyboard Report Endpoint */ + uint8_t ep = KEYBOARD_IN_EPNUM; + uint8_t size = KEYBOARD_REPORT_SIZE; #ifdef NKRO_ENABLE if (keyboard_protocol && keymap_config.nkro) { - /* Report protocol - NKRO */ - Endpoint_SelectEndpoint(NKRO_IN_EPNUM); - - /* Check if write ready for a polling interval around 1ms */ - while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(4); - if (!Endpoint_IsReadWriteAllowed()) return; - - /* Write Keyboard Report Data */ - Endpoint_Write_Stream_LE(report, NKRO_EPSIZE, NULL); + ep = SHARED_IN_EPNUM; + size = sizeof(struct nkro_report); } - else #endif - { - /* Boot protocol */ - Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM); - - /* Check if write ready for a polling interval around 10ms */ - while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); - if (!Endpoint_IsReadWriteAllowed()) return; + Endpoint_SelectEndpoint(ep); + /* Check if write ready for a polling interval around 10ms */ + while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); + if (!Endpoint_IsReadWriteAllowed()) return; - /* Write Keyboard Report Data */ - Endpoint_Write_Stream_LE(report, KEYBOARD_EPSIZE, NULL); + /* If we're in Boot Protocol, don't send any report ID or other funky fields */ + if (!keyboard_protocol) { + Endpoint_Write_Stream_LE(&report->mods, 8, NULL); + } else { + Endpoint_Write_Stream_LE(report, size, NULL); } /* Finalize the stream transfer to send the last packet */ @@ -718,6 +722,7 @@ static void send_mouse(report_mouse_t *report) */ static void send_system(uint16_t data) { +#ifdef EXTRAKEY_ENABLE uint8_t timeout = 255; if (USB_DeviceState != DEVICE_STATE_Configured) @@ -727,7 +732,7 @@ static void send_system(uint16_t data) .report_id = REPORT_ID_SYSTEM, .usage = data - SYSTEM_POWER_DOWN + 1 }; - Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM); + Endpoint_SelectEndpoint(SHARED_IN_EPNUM); /* Check if write ready for a polling interval around 10ms */ while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); @@ -735,6 +740,7 @@ static void send_system(uint16_t data) Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); Endpoint_ClearIN(); +#endif } /** \brief Send Consumer @@ -743,6 +749,7 @@ static void send_system(uint16_t data) */ static void send_consumer(uint16_t data) { +#ifdef EXTRAKEY_ENABLE uint8_t timeout = 255; uint8_t where = where_to_send(); @@ -786,7 +793,7 @@ static void send_consumer(uint16_t data) .report_id = REPORT_ID_CONSUMER, .usage = data }; - Endpoint_SelectEndpoint(EXTRAKEY_IN_EPNUM); + Endpoint_SelectEndpoint(SHARED_IN_EPNUM); /* Check if write ready for a polling interval around 10ms */ while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40); @@ -794,6 +801,7 @@ static void send_consumer(uint16_t data) Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL); Endpoint_ClearIN(); +#endif } diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c index cab344675245..589ad23cdd51 100644 --- a/tmk_core/protocol/usb_descriptor.c +++ b/tmk_core/protocol/usb_descriptor.c @@ -47,11 +47,18 @@ /******************************************************************************* * HID Report Descriptors ******************************************************************************/ -const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = -{ +#ifdef KEYBOARD_SHARED_EP +const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { +#define SHARED_REPORT_STARTED +#else +const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = { +#endif HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ HID_RI_USAGE(8, 0x06), /* Keyboard */ HID_RI_COLLECTION(8, 0x01), /* Application */ +# ifdef KEYBOARD_SHARED_EP + HID_RI_REPORT_ID(8, REPORT_ID_KEYBOARD), +# endif HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */ HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */ @@ -84,14 +91,25 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = HID_RI_REPORT_SIZE(8, 0x08), HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), HID_RI_END_COLLECTION(0), + +#ifndef KEYBOARD_SHARED_EP }; +#endif -#ifdef MOUSE_ENABLE -const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = -{ +#if defined(MOUSE_ENABLE) + +# if !defined(MOUSE_SHARED_EP) +const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = { +# elif !defined(SHARED_REPORT_STARTED) +const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { +#define SHARED_REPORT_STARTED +# endif HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ HID_RI_USAGE(8, 0x02), /* Mouse */ HID_RI_COLLECTION(8, 0x01), /* Application */ +# ifdef MOUSE_SHARED_EP + HID_RI_REPORT_ID(8, REPORT_ID_MOUSE), +# endif HID_RI_USAGE(8, 0x01), /* Pointer */ HID_RI_COLLECTION(8, 0x00), /* Physical */ @@ -133,12 +151,15 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = HID_RI_END_COLLECTION(0), HID_RI_END_COLLECTION(0), +# ifndef MOUSE_SHARED_EP }; +# endif #endif -#ifdef EXTRAKEY_ENABLE -const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] = -{ +#if defined(SHARED_EP_ENABLE) && !defined(SHARED_REPORT_STARTED) +const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = { +#endif +# ifdef EXTRAKEY_ENABLE HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ HID_RI_USAGE(8, 0x80), /* System Control */ HID_RI_COLLECTION(8, 0x01), /* Application */ @@ -164,6 +185,43 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtrakeyReport[] = HID_RI_REPORT_COUNT(8, 1), HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), HID_RI_END_COLLECTION(0), +# endif + +# ifdef NKRO_ENABLE + HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ + HID_RI_USAGE(8, 0x06), /* Keyboard */ + HID_RI_COLLECTION(8, 0x01), /* Application */ + HID_RI_REPORT_ID(8, REPORT_ID_NKRO), + HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ + HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */ + HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */ + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0x01), + HID_RI_REPORT_COUNT(8, 0x08), + HID_RI_REPORT_SIZE(8, 0x01), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), + + HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */ + HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */ + HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */ + HID_RI_REPORT_COUNT(8, 0x05), + HID_RI_REPORT_SIZE(8, 0x01), + HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), + HID_RI_REPORT_COUNT(8, 0x01), + HID_RI_REPORT_SIZE(8, 0x03), + HID_RI_OUTPUT(8, HID_IOF_CONSTANT), + + HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ + HID_RI_USAGE_MINIMUM(8, 0x00), /* Keyboard 0 */ + HID_RI_USAGE_MAXIMUM(8, KEYBOARD_REPORT_BITS*8-1), + HID_RI_LOGICAL_MINIMUM(8, 0x00), + HID_RI_LOGICAL_MAXIMUM(8, 0x01), + HID_RI_REPORT_COUNT(8, KEYBOARD_REPORT_BITS*8), + HID_RI_REPORT_SIZE(8, 0x01), + HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), + HID_RI_END_COLLECTION(0), +# endif +#ifdef SHARED_EP_ENABLE }; #endif @@ -211,42 +269,6 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] = }; #endif -#ifdef NKRO_ENABLE -const USB_Descriptor_HIDReport_Datatype_t PROGMEM NKROReport[] = -{ - HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ - HID_RI_USAGE(8, 0x06), /* Keyboard */ - HID_RI_COLLECTION(8, 0x01), /* Application */ - HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ - HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */ - HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */ - HID_RI_LOGICAL_MINIMUM(8, 0x00), - HID_RI_LOGICAL_MAXIMUM(8, 0x01), - HID_RI_REPORT_COUNT(8, 0x08), - HID_RI_REPORT_SIZE(8, 0x01), - HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), - - HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */ - HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */ - HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */ - HID_RI_REPORT_COUNT(8, 0x05), - HID_RI_REPORT_SIZE(8, 0x01), - HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), - HID_RI_REPORT_COUNT(8, 0x01), - HID_RI_REPORT_SIZE(8, 0x03), - HID_RI_OUTPUT(8, HID_IOF_CONSTANT), - - HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ - HID_RI_USAGE_MINIMUM(8, 0x00), /* Keyboard 0 */ - HID_RI_USAGE_MAXIMUM(8, (NKRO_EPSIZE-1)*8-1), /* Keyboard Right GUI */ - HID_RI_LOGICAL_MINIMUM(8, 0x00), - HID_RI_LOGICAL_MAXIMUM(8, 0x01), - HID_RI_REPORT_COUNT(8, (NKRO_EPSIZE-1)*8), - HID_RI_REPORT_SIZE(8, 0x01), - HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), - HID_RI_END_COLLECTION(0), -}; -#endif /******************************************************************************* * Device Descriptors @@ -303,6 +325,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = /* * Keyboard */ +#ifndef KEYBOARD_SHARED_EP .Keyboard_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, @@ -339,11 +362,12 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .EndpointSize = KEYBOARD_EPSIZE, .PollingIntervalMS = 0x0A }, +#endif /* * Mouse */ -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) .Mouse_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, @@ -383,26 +407,31 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = #endif /* - * Extra + * Shared */ -#ifdef EXTRAKEY_ENABLE - .Extrakey_Interface = +#ifdef SHARED_EP_ENABLE + .Shared_Interface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - .InterfaceNumber = EXTRAKEY_INTERFACE, + .InterfaceNumber = SHARED_INTERFACE, .AlternateSetting = 0x00, .TotalEndpoints = 1, .Class = HID_CSCP_HIDClass, +# ifdef KEYBOARD_SHARED_EP + .SubClass = HID_CSCP_BootSubclass, + .Protocol = HID_CSCP_KeyboardBootProtocol, +# else .SubClass = HID_CSCP_NonBootSubclass, .Protocol = HID_CSCP_NonBootProtocol, +#endif .InterfaceStrIndex = NO_DESCRIPTOR }, - .Extrakey_HID = + .Shared_HID = { .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, @@ -410,16 +439,16 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .CountryCode = 0x00, .TotalReportDescriptors = 1, .HIDReportType = HID_DTYPE_Report, - .HIDReportLength = sizeof(ExtrakeyReport) + .HIDReportLength = sizeof(SharedReport) }, - .Extrakey_INEndpoint = + .Shared_INEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - .EndpointAddress = (ENDPOINT_DIR_IN | EXTRAKEY_IN_EPNUM), + .EndpointAddress = (ENDPOINT_DIR_IN | SHARED_IN_EPNUM), .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = EXTRAKEY_EPSIZE, + .EndpointSize = SHARED_EPSIZE, .PollingIntervalMS = 0x0A }, #endif @@ -528,48 +557,6 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = }, #endif - /* - * NKRO - */ -#ifdef NKRO_ENABLE - .NKRO_Interface = - { - .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - - .InterfaceNumber = NKRO_INTERFACE, - .AlternateSetting = 0x00, - - .TotalEndpoints = 1, - - .Class = HID_CSCP_HIDClass, - .SubClass = HID_CSCP_NonBootSubclass, - .Protocol = HID_CSCP_NonBootProtocol, - - .InterfaceStrIndex = NO_DESCRIPTOR - }, - - .NKRO_HID = - { - .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, - - .HIDSpec = VERSION_BCD(1,1,1), - .CountryCode = 0x00, - .TotalReportDescriptors = 1, - .HIDReportType = HID_DTYPE_Report, - .HIDReportLength = sizeof(NKROReport) - }, - - .NKRO_INEndpoint = - { - .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, - - .EndpointAddress = (ENDPOINT_DIR_IN | NKRO_IN_EPNUM), - .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), - .EndpointSize = NKRO_EPSIZE, - .PollingIntervalMS = 0x01 - }, -#endif - #ifdef MIDI_ENABLE .Audio_Interface_Association = { @@ -936,19 +923,21 @@ uint16_t get_usb_descriptor(const uint16_t wValue, break; case HID_DTYPE_HID: switch (wIndex) { +#ifndef KEYBOARD_SHARED_EP case KEYBOARD_INTERFACE: Address = &ConfigurationDescriptor.Keyboard_HID; Size = sizeof(USB_HID_Descriptor_HID_t); break; -#ifdef MOUSE_ENABLE +#endif +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) case MOUSE_INTERFACE: Address = &ConfigurationDescriptor.Mouse_HID; Size = sizeof(USB_HID_Descriptor_HID_t); break; #endif -#ifdef EXTRAKEY_ENABLE - case EXTRAKEY_INTERFACE: - Address = &ConfigurationDescriptor.Extrakey_HID; +#ifdef SHARED_EP_ENABLE + case SHARED_INTERFACE: + Address = &ConfigurationDescriptor.Shared_HID; Size = sizeof(USB_HID_Descriptor_HID_t); break; #endif @@ -963,31 +952,27 @@ uint16_t get_usb_descriptor(const uint16_t wValue, Address = &ConfigurationDescriptor.Console_HID; Size = sizeof(USB_HID_Descriptor_HID_t); break; -#endif -#ifdef NKRO_ENABLE - case NKRO_INTERFACE: - Address = &ConfigurationDescriptor.NKRO_HID; - Size = sizeof(USB_HID_Descriptor_HID_t); - break; #endif } break; case HID_DTYPE_Report: switch (wIndex) { +#ifndef KEYBOARD_SHARED_EP case KEYBOARD_INTERFACE: Address = &KeyboardReport; Size = sizeof(KeyboardReport); break; -#ifdef MOUSE_ENABLE +#endif +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) case MOUSE_INTERFACE: Address = &MouseReport; Size = sizeof(MouseReport); break; #endif -#ifdef EXTRAKEY_ENABLE - case EXTRAKEY_INTERFACE: - Address = &ExtrakeyReport; - Size = sizeof(ExtrakeyReport); +#ifdef SHARED_EP_ENABLE + case SHARED_INTERFACE: + Address = &SharedReport; + Size = sizeof(SharedReport); break; #endif #ifdef RAW_ENABLE @@ -1001,12 +986,6 @@ uint16_t get_usb_descriptor(const uint16_t wValue, Address = &ConsoleReport; Size = sizeof(ConsoleReport); break; -#endif -#ifdef NKRO_ENABLE - case NKRO_INTERFACE: - Address = &NKROReport; - Size = sizeof(NKROReport); - break; #endif } break; diff --git a/tmk_core/protocol/usb_descriptor.h b/tmk_core/protocol/usb_descriptor.h index 586d07df627c..3ca0c00b34f2 100644 --- a/tmk_core/protocol/usb_descriptor.h +++ b/tmk_core/protocol/usb_descriptor.h @@ -53,26 +53,27 @@ typedef struct { USB_Descriptor_Configuration_Header_t Config; +#ifndef KEYBOARD_SHARED_EP // Keyboard HID Interface USB_Descriptor_Interface_t Keyboard_Interface; USB_HID_Descriptor_HID_t Keyboard_HID; USB_Descriptor_Endpoint_t Keyboard_INEndpoint; +#endif -#ifdef MOUSE_ENABLE +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) // Mouse HID Interface USB_Descriptor_Interface_t Mouse_Interface; USB_HID_Descriptor_HID_t Mouse_HID; USB_Descriptor_Endpoint_t Mouse_INEndpoint; #endif -#ifdef EXTRAKEY_ENABLE - // Extrakey HID Interface - USB_Descriptor_Interface_t Extrakey_Interface; - USB_HID_Descriptor_HID_t Extrakey_HID; - USB_Descriptor_Endpoint_t Extrakey_INEndpoint; +#if defined(SHARED_EP_ENABLE) + USB_Descriptor_Interface_t Shared_Interface; + USB_HID_Descriptor_HID_t Shared_HID; + USB_Descriptor_Endpoint_t Shared_INEndpoint; #endif -#ifdef RAW_ENABLE +#if defined(RAW_ENABLE) // Raw HID Interface USB_Descriptor_Interface_t Raw_Interface; USB_HID_Descriptor_HID_t Raw_HID; @@ -88,13 +89,6 @@ typedef struct USB_Descriptor_Endpoint_t Console_OUTEndpoint; #endif -#ifdef NKRO_ENABLE - // NKRO HID Interface - USB_Descriptor_Interface_t NKRO_Interface; - USB_HID_Descriptor_HID_t NKRO_HID; - USB_Descriptor_Endpoint_t NKRO_INEndpoint; -#endif - #ifdef MIDI_ENABLE USB_Descriptor_Interface_Association_t Audio_Interface_Association; // MIDI Audio Control Interface @@ -133,133 +127,105 @@ typedef struct /* index of interface */ -#define KEYBOARD_INTERFACE 0 - +enum usb_interfaces { +#if !defined(KEYBOARD_SHARED_EP) + KEYBOARD_INTERFACE, +#else +# define KEYBOARD_INTERFACE SHARED_INTERFACE +#endif // It is important that the Raw HID interface is at a constant // interface number, to support Linux/OSX platforms and chrome.hid // If Raw HID is enabled, let it be always 1. -#ifdef RAW_ENABLE -# define RAW_INTERFACE (KEYBOARD_INTERFACE + 1) -#else -# define RAW_INTERFACE KEYBOARD_INTERFACE +#if defined(RAW_ENABLE) + RAW_INTERFACE, #endif - -#ifdef MOUSE_ENABLE -# define MOUSE_INTERFACE (RAW_INTERFACE + 1) -#else -# define MOUSE_INTERFACE RAW_INTERFACE +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) + MOUSE_INTERFACE, #endif - -#ifdef EXTRAKEY_ENABLE -# define EXTRAKEY_INTERFACE (MOUSE_INTERFACE + 1) -#else -# define EXTRAKEY_INTERFACE MOUSE_INTERFACE +#if defined(SHARED_EP_ENABLE) + SHARED_INTERFACE, #endif - -#ifdef CONSOLE_ENABLE -# define CONSOLE_INTERFACE (EXTRAKEY_INTERFACE + 1) -#else -# define CONSOLE_INTERFACE EXTRAKEY_INTERFACE -#endif - -#ifdef NKRO_ENABLE -# define NKRO_INTERFACE (CONSOLE_INTERFACE + 1) -#else -# define NKRO_INTERFACE CONSOLE_INTERFACE +#if defined(CONSOLE_ENABLE) + CONSOLE_INTERFACE, #endif - -#ifdef MIDI_ENABLE -# define AC_INTERFACE (NKRO_INTERFACE + 1) -# define AS_INTERFACE (NKRO_INTERFACE + 2) -#else -# define AS_INTERFACE NKRO_INTERFACE +#if defined(MIDI_ENABLE) + AC_INTERFACE, + AS_INTERFACE, #endif - -#ifdef VIRTSER_ENABLE -# define CCI_INTERFACE (AS_INTERFACE + 1) -# define CDI_INTERFACE (AS_INTERFACE + 2) -#else -# define CDI_INTERFACE AS_INTERFACE +#if defined(VIRTSER_ENABLE) + CCI_INTERFACE, + CDI_INTERFACE, #endif + TOTAL_INTERFACES +}; -/* nubmer of interfaces */ -#define TOTAL_INTERFACES (CDI_INTERFACE + 1) - +#define NEXT_EPNUM __COUNTER__ -// Endopoint number and size -#define KEYBOARD_IN_EPNUM 1 - -#ifdef MOUSE_ENABLE -# define MOUSE_IN_EPNUM (KEYBOARD_IN_EPNUM + 1) +enum usb_endpoints { + __unused_epnum__ = NEXT_EPNUM, /* EP numbering starts at 1 */ +#if !defined(KEYBOARD_SHARED_EP) + KEYBOARD_IN_EPNUM = NEXT_EPNUM, #else -# define MOUSE_IN_EPNUM KEYBOARD_IN_EPNUM +# define KEYBOARD_IN_EPNUM SHARED_IN_EPNUM #endif - -#ifdef EXTRAKEY_ENABLE -# define EXTRAKEY_IN_EPNUM (MOUSE_IN_EPNUM + 1) +#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP) + MOUSE_IN_EPNUM = NEXT_EPNUM, #else -# define EXTRAKEY_IN_EPNUM MOUSE_IN_EPNUM +# define MOUSE_IN_EPNUM SHARED_IN_EPNUM #endif - -#ifdef RAW_ENABLE -# define RAW_IN_EPNUM (EXTRAKEY_IN_EPNUM + 1) -# define RAW_OUT_EPNUM (EXTRAKEY_IN_EPNUM + 2) -#else -# define RAW_OUT_EPNUM EXTRAKEY_IN_EPNUM +#if defined(RAW_ENABLE) + RAW_IN_EPNUM = NEXT_EPNUM, + RAW_OUT_EPNUM = NEXT_EPNUM, #endif - -#ifdef CONSOLE_ENABLE -# define CONSOLE_IN_EPNUM (RAW_OUT_EPNUM + 1) +#if defined(SHARED_EP_ENABLE) + SHARED_IN_EPNUM = NEXT_EPNUM, +#endif +#if defined(CONSOLE_ENABLE) + CONSOLE_IN_EPNUM = NEXT_EPNUM, #ifdef PROTOCOL_CHIBIOS // ChibiOS has enough memory and descriptor to actually enable the endpoint // It could use the same endpoint numbers, as that's supported by ChibiOS // But the QMK code currently assumes that the endpoint numbers are different -# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 2) + CONSOLE_OUT_EPNUM = NEXT_EPNUM, #else -# define CONSOLE_OUT_EPNUM (RAW_OUT_EPNUM + 1) +#define CONSOLE_OUT_EPNUM CONSOLE_IN_EPNUM #endif -#else -# define CONSOLE_OUT_EPNUM RAW_OUT_EPNUM #endif - -#ifdef NKRO_ENABLE -# define NKRO_IN_EPNUM (CONSOLE_OUT_EPNUM + 1) -#else -# define NKRO_IN_EPNUM CONSOLE_OUT_EPNUM -#endif - #ifdef MIDI_ENABLE -# define MIDI_STREAM_IN_EPNUM (NKRO_IN_EPNUM + 1) -// # define MIDI_STREAM_OUT_EPNUM (NKRO_IN_EPNUM + 1) -# define MIDI_STREAM_OUT_EPNUM (NKRO_IN_EPNUM + 2) + MIDI_STREAM_IN_EPNUM = NEXT_EPNUM, + MIDI_STREAM_OUT_EPNUM = NEXT_EPNUM, # define MIDI_STREAM_IN_EPADDR (ENDPOINT_DIR_IN | MIDI_STREAM_IN_EPNUM) # define MIDI_STREAM_OUT_EPADDR (ENDPOINT_DIR_OUT | MIDI_STREAM_OUT_EPNUM) -#else -# define MIDI_STREAM_OUT_EPNUM NKRO_IN_EPNUM #endif - #ifdef VIRTSER_ENABLE -# define CDC_NOTIFICATION_EPNUM (MIDI_STREAM_OUT_EPNUM + 1) -# define CDC_IN_EPNUM (MIDI_STREAM_OUT_EPNUM + 2) -# define CDC_OUT_EPNUM (MIDI_STREAM_OUT_EPNUM + 3) + CDC_NOTIFICATION_EPNUM = NEXT_EPNUM, + CDC_IN_EPNUM = NEXT_EPNUM, + CDC_OUT_EPNUM = NEXT_EPNUM, # define CDC_NOTIFICATION_EPADDR (ENDPOINT_DIR_IN | CDC_NOTIFICATION_EPNUM) # define CDC_IN_EPADDR (ENDPOINT_DIR_IN | CDC_IN_EPNUM) # define CDC_OUT_EPADDR (ENDPOINT_DIR_OUT | CDC_OUT_EPNUM) -#else -# define CDC_OUT_EPNUM MIDI_STREAM_OUT_EPNUM #endif +}; + +#if defined(PROTOCOL_LUFA) +/* LUFA tells us total endpoints including control */ +#define MAX_ENDPOINTS (ENDPOINT_TOTAL_ENDPOINTS - 1) +#elif defined(PROTOCOL_CHIBIOS) +/* ChibiOS gives us number of available user endpoints, not control */ +#define MAX_ENDPOINTS USB_MAX_ENDPOINTS +#endif +/* TODO - ARM_ATSAM */ + -#if (defined(PROTOCOL_LUFA) && CDC_OUT_EPNUM > (ENDPOINT_TOTAL_ENDPOINTS - 1)) || \ - (defined(PROTOCOL_CHIBIOS) && CDC_OUT_EPNUM > USB_MAX_ENDPOINTS) -# error "There are not enough available endpoints to support all functions. Remove some in the rules.mk file.(MOUSEKEY, EXTRAKEY, CONSOLE, NKRO, MIDI, SERIAL, STENO)" +#if (NEXT_EPNUM - 1) > MAX_ENDPOINTS +# error There are not enough available endpoints to support all functions. Remove some in the rules.mk file. (MOUSEKEY, EXTRAKEY, CONSOLE, NKRO, MIDI, SERIAL, STENO) #endif #define KEYBOARD_EPSIZE 8 +#define SHARED_EPSIZE 32 #define MOUSE_EPSIZE 8 -#define EXTRAKEY_EPSIZE 8 #define RAW_EPSIZE 32 #define CONSOLE_EPSIZE 32 -#define NKRO_EPSIZE 32 #define MIDI_STREAM_EPSIZE 64 #define CDC_NOTIFICATION_EPSIZE 8 #define CDC_EPSIZE 16 From 09813793bedd74c0bb109c6e87e3682bb864479a Mon Sep 17 00:00:00 2001 From: zvecr Date: Fri, 16 Nov 2018 15:37:15 +0000 Subject: [PATCH 425/505] Add configurator support for luddite (#4434) --- keyboards/40percentclub/luddite/info.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 keyboards/40percentclub/luddite/info.json diff --git a/keyboards/40percentclub/luddite/info.json b/keyboards/40percentclub/luddite/info.json new file mode 100644 index 000000000000..51d71ec7724a --- /dev/null +++ b/keyboards/40percentclub/luddite/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "foobar", + "url": "", + "maintainer": "qmk", + "width": 15, + "height": 5, + "layouts": { + "LAYOUT_60_ansi": { + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + } + } +} From b49f37dce97b1f84659146e7bbe4a55804407072 Mon Sep 17 00:00:00 2001 From: zvecr Date: Fri, 16 Nov 2018 16:35:04 +0000 Subject: [PATCH 426/505] Unify 68keys with mf68 (#4435) * Move 68keys keymap to mf68 folder * Remove 68keys keyboard now its been migrated to mf68 keymap * Migrate 68keys build config to mf68 keymap overrides --- .../mf68/keymaps/68keys/config.h | 15 ++++ .../mf68/keymaps/68keys/keymap.c | 11 +++ .../mf68/keymaps/68keys/readme.md} | 8 +- .../mf68/keymaps/68keys/rules.mk | 5 ++ keyboards/68keys/68keys.c | 6 -- keyboards/68keys/68keys.h | 20 ----- keyboards/68keys/config.h | 42 ---------- keyboards/68keys/info.json | 81 ------------------- keyboards/68keys/keymaps/default/keymap.c | 10 --- keyboards/68keys/rules.mk | 22 ----- 10 files changed, 35 insertions(+), 185 deletions(-) create mode 100644 keyboards/40percentclub/mf68/keymaps/68keys/config.h create mode 100644 keyboards/40percentclub/mf68/keymaps/68keys/keymap.c rename keyboards/{68keys/README.md => 40percentclub/mf68/keymaps/68keys/readme.md} (79%) create mode 100644 keyboards/40percentclub/mf68/keymaps/68keys/rules.mk delete mode 100644 keyboards/68keys/68keys.c delete mode 100644 keyboards/68keys/68keys.h delete mode 100644 keyboards/68keys/config.h delete mode 100644 keyboards/68keys/info.json delete mode 100644 keyboards/68keys/keymaps/default/keymap.c delete mode 100644 keyboards/68keys/rules.mk diff --git a/keyboards/40percentclub/mf68/keymaps/68keys/config.h b/keyboards/40percentclub/mf68/keymaps/68keys/config.h new file mode 100644 index 000000000000..a0a576b7bfa2 --- /dev/null +++ b/keyboards/40percentclub/mf68/keymaps/68keys/config.h @@ -0,0 +1,15 @@ +#pragma once + +/* USB Device descriptor parameter */ +#undef VENDOR_ID +#undef PRODUCT_ID +#undef DEVICE_VER +#undef MANUFACTURER +#undef PRODUCT +#undef DESCRIPTION +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0A0C +#define DEVICE_VER 0x0068 +#define MANUFACTURER 68Keys.io +#define PRODUCT The 68Keys.io Keyboard +#define DESCRIPTION A 68 keys mechanical keyboard diff --git a/keyboards/40percentclub/mf68/keymaps/68keys/keymap.c b/keyboards/40percentclub/mf68/keymaps/68keys/keymap.c new file mode 100644 index 000000000000..3778ea21e79f --- /dev/null +++ b/keyboards/40percentclub/mf68/keymaps/68keys/keymap.c @@ -0,0 +1,11 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_68_ansi( + 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_ESC, KC_PGUP, + 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_PGDN, + KC_CAPSLOCK, 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_UP, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT + ) +}; diff --git a/keyboards/68keys/README.md b/keyboards/40percentclub/mf68/keymaps/68keys/readme.md similarity index 79% rename from keyboards/68keys/README.md rename to keyboards/40percentclub/mf68/keymaps/68keys/readme.md index 082a47a75596..4b7cdf125913 100644 --- a/keyboards/68keys/README.md +++ b/keyboards/40percentclub/mf68/keymaps/68keys/readme.md @@ -2,22 +2,22 @@ Custom [68Keys.io](https://68keys.io) DIY keyboard. -Keyboard Maintainer: [sbstjn](https://sbstjn.com) -Hardware Supported: Pro Micro +Keymap Maintainer: [sbstjn](https://sbstjn.com) +Hardware Supported: mf68 Hardware Availability: [DIY Guide](https://68keys.io) Make example for this keyboard (after setting up your build environment): ```bash $ > cd qmk_firmware/ -$ > make 68keys:default +$ > make 40percentclub/mf68:68keys ``` Example of flashing this keyboard: ```bash $ > cd qmk_firmware/ -$ > make 68keys:default:avrdude +$ > make 40percentclub/mf68:68keys:avrdude ``` See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/40percentclub/mf68/keymaps/68keys/rules.mk b/keyboards/40percentclub/mf68/keymaps/68keys/rules.mk new file mode 100644 index 000000000000..96ce13fe73fe --- /dev/null +++ b/keyboards/40percentclub/mf68/keymaps/68keys/rules.mk @@ -0,0 +1,5 @@ +BOOTLOADER = atmel-dfu + +EXTRAKEY_ENABLE = yes +CONSOLE_ENABLE = no +BACKLIGHT_ENABLE = no diff --git a/keyboards/68keys/68keys.c b/keyboards/68keys/68keys.c deleted file mode 100644 index dcf04e6a3dd5..000000000000 --- a/keyboards/68keys/68keys.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "68keys.h" - -void matrix_init_kb(void) -{ - matrix_init_user(); -} diff --git a/keyboards/68keys/68keys.h b/keyboards/68keys/68keys.h deleted file mode 100644 index e8a2c4aeedd3..000000000000 --- a/keyboards/68keys/68keys.h +++ /dev/null @@ -1,20 +0,0 @@ -#include "quantum.h" - -#define LAYOUT_68_ansi( \ - K00, K01, K02, K03, K04, K05, K06, K07, K08, K10, K11, K12, K13, K14, K15, K16, \ - K17, K18, K20, K21, K22, K23, K24, K25, K26, K27, K28, K30, K31, K32, K33, K34, \ - K35, K36, K37, K38, K40, K41, K42, K43, K44, K45, K46, K47, K48, \ - K50, K51, K52, K53, K54, K55, K56, K57, K58, K60, K61, K62, K63, \ - K64, K65, K66, K67, K68, K70, K71, K72, K73, K74) \ - { \ - {K00, K01, K02, K03, K04, K05, K06, K07, K08}, \ - {K10, K11, K12, K13, K14, K15, K16, K17, K18}, \ - {K20, K21, K22, K23, K24, K25, K26, K27, K28}, \ - {K30, K31, K32, K33, K34, K35, K36, K37, K38}, \ - {K40, K41, K42, K43, K44, K45, K46, K47, K48}, \ - {K50, K51, K52, K53, K54, K55, K56, K57, K58}, \ - {K60, K61, K62, K63, K64, K65, K66, K67, K68}, \ - { \ - K70, K71, K72, K73, K74 \ - } \ - } diff --git a/keyboards/68keys/config.h b/keyboards/68keys/config.h deleted file mode 100644 index 07c87563d3ee..000000000000 --- a/keyboards/68keys/config.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include "config_common.h" - -/* USB Device descriptor parameter */ -#define VENDOR_ID 0xFEED -#define PRODUCT_ID 0x0A0C -#define DEVICE_VER 0x0068 -#define MANUFACTURER 68Keys.io -#define PRODUCT The 68Keys.io Keyboard -#define DESCRIPTION A 68 keys mechanical keyboard - -/* key matrix size */ -#define MATRIX_ROWS 8 -#define MATRIX_COLS 9 - -#define MATRIX_ROW_PINS \ - { \ - B6, B2, B3, B1, F7, F6, F5, F4 \ - } -#define MATRIX_COL_PINS \ - { \ - D3, D2, D1, D0, D4, C6, D7, E6, B4 \ - } -#define UNUSED_PINS - -#define DIODE_DIRECTION COL2ROW - -#define BACKLIGHT_PIN B5 -#define BACKLIGHT_BREATHING -#define BACKLIGHT_LEVELS 3 - -#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 magic key command */ -#define IS_COMMAND() ( \ - keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) diff --git a/keyboards/68keys/info.json b/keyboards/68keys/info.json deleted file mode 100644 index b24e22b0a1e8..000000000000 --- a/keyboards/68keys/info.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "keyboard_name": "68Keys.io", - "url": "https://68keys.io", - "maintainer": "qmk", - "width": 17.25, - "height": 5, - "layouts": { - "LAYOUT_68_ansi": { - "layout": [ - { "label": "~", "x": 0, "y": 0 }, - { "label": "!", "x": 1, "y": 0 }, - { "label": "@", "x": 2, "y": 0 }, - { "label": "#", "x": 3, "y": 0 }, - { "label": "$", "x": 4, "y": 0 }, - { "label": "%", "x": 5, "y": 0 }, - { "label": "^", "x": 6, "y": 0 }, - { "label": "&", "x": 7, "y": 0 }, - { "label": "*", "x": 8, "y": 0 }, - { "label": "(", "x": 9, "y": 0 }, - { "label": ")", "x": 10, "y": 0 }, - { "label": "_", "x": 11, "y": 0 }, - { "label": "+", "x": 12, "y": 0 }, - { "label": "Backspace", "x": 13, "y": 0, "w": 2 }, - { "label": "ESC", "x": 15.25, "y": 0 }, - { "label": "PGUP", "x": 16.25, "y": 0 }, - { "label": "Tab", "x": 0, "y": 1, "w": 1.5 }, - { "label": "Q", "x": 1.5, "y": 1 }, - { "label": "W", "x": 2.5, "y": 1 }, - { "label": "E", "x": 3.5, "y": 1 }, - { "label": "R", "x": 4.5, "y": 1 }, - { "label": "T", "x": 5.5, "y": 1 }, - { "label": "Y", "x": 6.5, "y": 1 }, - { "label": "U", "x": 7.5, "y": 1 }, - { "label": "I", "x": 8.5, "y": 1 }, - { "label": "O", "x": 9.5, "y": 1 }, - { "label": "P", "x": 10.5, "y": 1 }, - { "label": "{", "x": 11.5, "y": 1 }, - { "label": "}", "x": 12.5, "y": 1 }, - { "label": "|", "x": 13.5, "y": 1, "w": 1.5 }, - { "label": "DEL", "x": 15.25, "y": 1 }, - { "label": "PGDN", "x": 16.25, "y": 1 }, - { "label": "Caps Lock", "x": 0, "y": 2, "w": 1.75 }, - { "label": "A", "x": 1.75, "y": 2 }, - { "label": "S", "x": 2.75, "y": 2 }, - { "label": "D", "x": 3.75, "y": 2 }, - { "label": "F", "x": 4.75, "y": 2 }, - { "label": "G", "x": 5.75, "y": 2 }, - { "label": "H", "x": 6.75, "y": 2 }, - { "label": "J", "x": 7.75, "y": 2 }, - { "label": "K", "x": 8.75, "y": 2 }, - { "label": "L", "x": 9.75, "y": 2 }, - { "label": ":", "x": 10.75, "y": 2 }, - { "label": "\"", "x": 11.75, "y": 2 }, - { "label": "Enter", "x": 12.75, "y": 2, "w": 2.25 }, - { "label": "Shift", "x": 0, "y": 3, "w": 2.25 }, - { "label": "Z", "x": 2.25, "y": 3 }, - { "label": "X", "x": 3.25, "y": 3 }, - { "label": "C", "x": 4.25, "y": 3 }, - { "label": "V", "x": 5.25, "y": 3 }, - { "label": "B", "x": 6.25, "y": 3 }, - { "label": "N", "x": 7.25, "y": 3 }, - { "label": "M", "x": 8.25, "y": 3 }, - { "label": "<", "x": 9.25, "y": 3 }, - { "label": ">", "x": 10.25, "y": 3 }, - { "label": "?", "x": 11.25, "y": 3 }, - { "label": "Shift", "x": 12.25, "y": 3, "w": 2.75 }, - { "x": 15.25, "y": 3 }, - { "label": "CTRL", "x": 0, "y": 4, "w": 1.25 }, - { "label": "ALT", "x": 1.25, "y": 4, "w": 1.25 }, - { "label": "GUI", "x": 2.5, "y": 4, "w": 1.25 }, - { "x": 3.75, "y": 4, "w": 6.25 }, - { "label": "GUI", "x": 10, "y": 4, "w": 1.25 }, - { "label": "ALT", "x": 11.25, "y": 4, "w": 1.25 }, - { "label": "CTRL", "x": 12.5, "y": 4, "w": 1.25 }, - { "x": 14.25, "y": 4 }, - { "x": 15.25, "y": 4 }, - { "x": 16.25, "y": 4 } - ] - } - } -} diff --git a/keyboards/68keys/keymaps/default/keymap.c b/keyboards/68keys/keymaps/default/keymap.c deleted file mode 100644 index 8f23d2246266..000000000000 --- a/keyboards/68keys/keymaps/default/keymap.c +++ /dev/null @@ -1,10 +0,0 @@ -#include QMK_KEYBOARD_H -#include "68keys.h" - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT_68_ansi( - 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_ESC, KC_PGUP, - 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_PGDN, - KC_CAPSLOCK, 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_UP, - KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT)}; diff --git a/keyboards/68keys/rules.mk b/keyboards/68keys/rules.mk deleted file mode 100644 index f1a56d496d87..000000000000 --- a/keyboards/68keys/rules.mk +++ /dev/null @@ -1,22 +0,0 @@ -LAYOUTS = 68_ansi - -MCU = atmega32u4 -F_CPU = 16000000 -ARCH = AVR8 -F_USB = $(F_CPU) -OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT -BOOTLOADER = atmel-dfu - -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 # Breathing sleep LED during USB suspend -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 - From defcfb4953d49a0fc72ecf49faeac0534aafc190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Fri, 16 Nov 2018 17:55:37 +0100 Subject: [PATCH 427/505] Update whitefox/konstantin keymap (#4436) * Add more spacing in keymaps * Enable link-time optimization * Disable deprecated TMK actions, change spacing in config.h * Remove unrelated rules.mk options --- .../whitefox/keymaps/konstantin/config.h | 19 +++++++----- .../whitefox/keymaps/konstantin/keymap.c | 30 +++++++++---------- .../whitefox/keymaps/konstantin/rules.mk | 6 ++-- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/keyboards/whitefox/keymaps/konstantin/config.h b/keyboards/whitefox/keymaps/konstantin/config.h index d1c3002d270c..ee30dbece1a2 100644 --- a/keyboards/whitefox/keymaps/konstantin/config.h +++ b/keyboards/whitefox/keymaps/konstantin/config.h @@ -5,15 +5,18 @@ #undef IS_COMMAND #define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RCTL))) -#define MAGIC_KEY_LAYER0_ALT1 BSLS -#define MAGIC_KEY_BOOTLOADER ESC +#define MAGIC_KEY_LAYER0_ALT1 BSLS +#define MAGIC_KEY_BOOTLOADER ESC -#define MOUSEKEY_DELAY 50 -#define MOUSEKEY_INTERVAL 15 -#define MOUSEKEY_MAX_SPEED 4 -#define MOUSEKEY_TIME_TO_MAX 50 -#define MOUSEKEY_WHEEL_MAX_SPEED 1 -#define MOUSEKEY_WHEEL_TIME_TO_MAX 50 +#define MOUSEKEY_DELAY 50 +#define MOUSEKEY_INTERVAL 15 +#define MOUSEKEY_MAX_SPEED 4 +#define MOUSEKEY_TIME_TO_MAX 50 +#define MOUSEKEY_WHEEL_MAX_SPEED 1 +#define MOUSEKEY_WHEEL_TIME_TO_MAX 50 + +#define NO_ACTION_FUNCTION +#define NO_ACTION_MACRO #define PERMISSIVE_HOLD #define TAPPING_TERM 200 diff --git a/keyboards/whitefox/keymaps/konstantin/keymap.c b/keyboards/whitefox/keymaps/konstantin/keymap.c index 6732d9a01e94..55db5ca6b839 100644 --- a/keyboards/whitefox/keymaps/konstantin/keymap.c +++ b/keyboards/whitefox/keymaps/konstantin/keymap.c @@ -151,11 +151,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ */ [L_BASE] = LAYOUT_truefox( \ - 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_PSCR, \ - 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_DEL, \ - FN_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,RCT_RSF, KC_UP, KC_PGDN, \ - KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, RAL_RGU,FN_FNLK, KC_LEFT,KC_DOWN,KC_RGHT \ + 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_PSCR, \ + 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_DEL, \ + FN_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, RCT_RSF, KC_UP, KC_PGDN, \ + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, RAL_RGU, FN_FNLK, KC_LEFT, KC_DOWN, KC_RGHT \ ), /* Function layer @@ -172,11 +172,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ */ [L_FN] = LAYOUT_truefox( \ - _______,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, NUMPAD, KC_SLCK,KC_PAUS, \ - KC_BTN4,KC_BTN2,KC_MS_U,KC_BTN1,KC_BTN3,KC_BTN5,_______,_______,_______,KC_MSTP,KC_MPLY,KC_MPRV,KC_MNXT,CLEAR, KC_INS, \ - _______,KC_MS_L,KC_MS_D,KC_MS_R,KC_WH_U,_______,_______,_______,_______,_______,_______,_______, _______, TOP, \ - _______, KC_ACL0,KC_ACL2,KC_WH_L,KC_WH_R,_______,_______,_______,KC_VOLD,KC_VOLU,KC_MUTE,KC_APP, KC_PGUP,BOTTOM, \ - _______,DESKTOP,DSKTP_L, KC_WH_D, DSKTP_R,_______, KC_HOME,KC_PGDN,KC_END \ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, NUMPAD, KC_SLCK, KC_PAUS, \ + KC_BTN4, KC_BTN2, KC_MS_U, KC_BTN1, KC_BTN3, KC_BTN5, _______, _______, _______, KC_MSTP, KC_MPLY, KC_MPRV, KC_MNXT, CLEAR, KC_INS, \ + _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_U, _______, _______, _______, _______, _______, _______, _______, _______, TOP, \ + _______, KC_ACL0, KC_ACL2, KC_WH_L, KC_WH_R, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_APP, KC_PGUP, BOTTOM, \ + _______, DESKTOP, DSKTP_L, KC_WH_D, DSKTP_R, _______, KC_HOME, KC_PGDN, KC_END \ ), /* Numpad layer @@ -193,10 +193,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ */ [L_NUMPAD] = LAYOUT_truefox( \ - NUMPAD, _______,_______,_______,_______,_______,_______,KC_P7, KC_P8, KC_P9, KC_PMNS,MINUS, EQUALS, NUMPAD, _______,_______, \ - _______,_______,_______,_______,_______,_______,_______,KC_P4, KC_P5, KC_P6, KC_PPLS,L_PAREN,R_PAREN,_______, _______, \ - _______,_______,_______,_______,_______,_______,_______,KC_P1, KC_P2, KC_P3, KC_PAST,TIMES, KC_PENT, _______, \ - _______, _______,_______,_______,_______,_______,KC_P0, KC_P0, COMMA, KC_PDOT,KC_PSLS,DIVIDE, _______,_______, \ - _______,_______,_______, _______, _______,_______, _______,_______,_______ \ + NUMPAD, _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, KC_PMNS, MINUS, EQUALS, NUMPAD, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, KC_PPLS, L_PAREN, R_PAREN, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_PAST, TIMES, KC_PENT, _______, \ + _______, _______, _______, _______, _______, _______, KC_P0, KC_P0, COMMA, KC_PDOT, KC_PSLS, DIVIDE, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ), }; diff --git a/keyboards/whitefox/keymaps/konstantin/rules.mk b/keyboards/whitefox/keymaps/konstantin/rules.mk index 8fbc1f3af489..96722d1d5bce 100644 --- a/keyboards/whitefox/keymaps/konstantin/rules.mk +++ b/keyboards/whitefox/keymaps/konstantin/rules.mk @@ -1,15 +1,13 @@ -AUDIO_ENABLE = no BACKLIGHT_ENABLE = no -BLUETOOTH_ENABLE = no BOOTMAGIC_ENABLE = no COMMAND_ENABLE = yes CONSOLE_ENABLE = yes EXTRAKEY_ENABLE = yes -MIDI_ENABLE = no MOUSEKEY_ENABLE = yes NKRO_ENABLE = yes -RGBLIGHT_ENABLE = no SLEEP_LED_ENABLE = no TAP_DANCE_ENABLE = yes UNICODE_ENABLE = yes VISUALIZER_ENABLE = no + +EXTRAFLAGS += -flto From 774bee642685b6349e00603a9fd8a94432a7e893 Mon Sep 17 00:00:00 2001 From: Elliot Powell <32494740+e11i0t23@users.noreply.github.com> Date: Fri, 16 Nov 2018 19:31:44 +0000 Subject: [PATCH 428/505] Moved ep40 to ep/40 for easier adding of next ep keyboard (#4439) * add initial ep40 files * fixed issues * updated keymap * Added media control * Update keyboards/handwired/ep40/rules.mk Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * Fixed requested changes * Fixed more requested changes * Added delete key to layor 1 * Updated defualt keympap to have a Backspace mod del key * removed place holder Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * removed obsolete code Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * Moved ep40 to ep/40 * Fixed file names for moved code * Fixed readme --- keyboards/{handwired/ep40/ep40.c => ep/40/40.c} | 2 +- keyboards/{handwired/ep40/ep40.h => ep/40/40.h} | 0 keyboards/{handwired/ep40 => ep/40}/config.h | 0 keyboards/{handwired/ep40 => ep/40}/info.json | 0 keyboards/{handwired/ep40 => ep/40}/keymaps/default/keymap.c | 0 keyboards/{handwired/ep40 => ep/40}/keymaps/default/readme.md | 0 keyboards/{handwired/ep40 => ep/40}/readme.md | 4 ++-- keyboards/{handwired/ep40 => ep/40}/rules.mk | 0 8 files changed, 3 insertions(+), 3 deletions(-) rename keyboards/{handwired/ep40/ep40.c => ep/40/40.c} (98%) rename keyboards/{handwired/ep40/ep40.h => ep/40/40.h} (100%) rename keyboards/{handwired/ep40 => ep/40}/config.h (100%) rename keyboards/{handwired/ep40 => ep/40}/info.json (100%) rename keyboards/{handwired/ep40 => ep/40}/keymaps/default/keymap.c (100%) rename keyboards/{handwired/ep40 => ep/40}/keymaps/default/readme.md (100%) rename keyboards/{handwired/ep40 => ep/40}/readme.md (77%) rename keyboards/{handwired/ep40 => ep/40}/rules.mk (100%) diff --git a/keyboards/handwired/ep40/ep40.c b/keyboards/ep/40/40.c similarity index 98% rename from keyboards/handwired/ep40/ep40.c rename to keyboards/ep/40/40.c index 257f9fa807d1..7c235f3ce5cb 100644 --- a/keyboards/handwired/ep40/ep40.c +++ b/keyboards/ep/40/40.c @@ -13,7 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "ep40.h" +#include "40.h" void matrix_init_kb(void) { // put your keyboard start-up code here diff --git a/keyboards/handwired/ep40/ep40.h b/keyboards/ep/40/40.h similarity index 100% rename from keyboards/handwired/ep40/ep40.h rename to keyboards/ep/40/40.h diff --git a/keyboards/handwired/ep40/config.h b/keyboards/ep/40/config.h similarity index 100% rename from keyboards/handwired/ep40/config.h rename to keyboards/ep/40/config.h diff --git a/keyboards/handwired/ep40/info.json b/keyboards/ep/40/info.json similarity index 100% rename from keyboards/handwired/ep40/info.json rename to keyboards/ep/40/info.json diff --git a/keyboards/handwired/ep40/keymaps/default/keymap.c b/keyboards/ep/40/keymaps/default/keymap.c similarity index 100% rename from keyboards/handwired/ep40/keymaps/default/keymap.c rename to keyboards/ep/40/keymaps/default/keymap.c diff --git a/keyboards/handwired/ep40/keymaps/default/readme.md b/keyboards/ep/40/keymaps/default/readme.md similarity index 100% rename from keyboards/handwired/ep40/keymaps/default/readme.md rename to keyboards/ep/40/keymaps/default/readme.md diff --git a/keyboards/handwired/ep40/readme.md b/keyboards/ep/40/readme.md similarity index 77% rename from keyboards/handwired/ep40/readme.md rename to keyboards/ep/40/readme.md index 5acd8892dd53..647842bade8d 100644 --- a/keyboards/handwired/ep40/readme.md +++ b/keyboards/ep/40/readme.md @@ -4,12 +4,12 @@ A simple 40% keyboard -Keyboard Maintainer: [Elliot Powell](https://reddit.com/u/e11i0t23, https://github.com/e11i0t23) +Keyboard Maintainer: [Elliot Powell](https://github.com/e11i0t23), [/u/e11i0t23 on reddit](https://reddit.com/u/e11i0t23) Hardware Supported: EP40 PCB Hardware Availability: None at the moment Make example for this keyboard (after setting up your build environment): - make ep40:default + make ep/40:default See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/handwired/ep40/rules.mk b/keyboards/ep/40/rules.mk similarity index 100% rename from keyboards/handwired/ep40/rules.mk rename to keyboards/ep/40/rules.mk From d9453a93f34a71f5dd5bf8cd2ef75fe21a2dcc7b Mon Sep 17 00:00:00 2001 From: Boy_314 <32818287+Boy-314@users.noreply.github.com> Date: Fri, 16 Nov 2018 17:47:06 -0500 Subject: [PATCH 429/505] Updating Boy_314's XD75 Layout (#4440) * fixed arrow keys and left control * added right shift * latest version * reverted arrow keys * edited readme * added osu layer * updated osu layout * updated osu layout * added full arrow keys to osu layout * in case i mess up creating macros * added the best meme key in the world * added plover steno layer * updated boy314 layout * removed unused layers * added boy314 xd75 layout, inspired by preonic layout * added boy314 xd75 layout, inspired by preonic layout * version 2 of boy314's xd75 layout * added readme notes * updated readme for boy314 xd75 layout * qwerty support, brackets on bottom row, caps lock underglow * fixed readme/ * small changes to allow merging * minor changes to format * fixed up default readme * added numpad and tweaked bottom row --- keyboards/xd75/keymaps/boy_314/keymap.c | 73 ++++++++++++++----------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/keyboards/xd75/keymaps/boy_314/keymap.c b/keyboards/xd75/keymaps/boy_314/keymap.c index 8658fde6e473..d807d1d8618e 100644 --- a/keyboards/xd75/keymaps/boy_314/keymap.c +++ b/keyboards/xd75/keymaps/boy_314/keymap.c @@ -3,9 +3,9 @@ // Layer shorthand #define _DV 0 #define _QW 1 -#define _FN1 2 -#define _FN2 3 -#define _NP 4 +#define _NP 2 +#define _FN1 3 +#define _FN2 4 #define RGBLIGHT_LIGHT_VAL 255 const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {10, 10, 10}; @@ -23,7 +23,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| * | LSHIFT | ; | Q | J | K | X | END | UP | PG DN | M | W | W | V | Z | RSHIFT | * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| - * | LCTRL | DEL | LALT | WIN | FN1 | SPACE | LEFT | DOWN | RIGHT | SPACE | FN2 | [ | ] | { | } | + * | LCTRL | DEL | LALT | WIN | FN1 | SPACE | LEFT | DOWN | RIGHT | SPACE | FN2 | LEFT | DOWN | UP | RIGHT | * '--------------------------------------------------------------------------------------------------------------------------------------' */ @@ -32,7 +32,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { { KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_LBRC, KC_BSLS, KC_RBRC, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH }, { KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I, KC_HOME, KC_DEL, KC_PGUP, KC_D, KC_H, KC_T, KC_N, KC_S, KC_ENT }, { KC_LSPO, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_END, KC_UP, KC_PGDN, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSPC }, - { KC_LCTL, KC_DEL, KC_LALT, KC_LGUI, MO(_FN1),KC_SPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_SPC, MO(_FN2),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR }, + { KC_LCTL, KC_DEL, KC_LALT, KC_LGUI, MO(_FN1),KC_SPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_SPC, MO(_FN2),KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT }, }, /* QWERTY @@ -45,7 +45,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| * | LSHIFT | Z | X | C | V | B | END | UP | PG DN | N | M | , | . | / | RSHIFT | * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| - * | LCTRL | DEL | LALT | WIN | FN1 | SPACE | LEFT | DOWN | RIGHT | SPACE | FN2 | [ | ] | { | } | + * | LCTRL | DEL | LALT | WIN | FN1 | SPACE | LEFT | DOWN | RIGHT | SPACE | FN2 | LEFT | DOWN | UP | RIGHT | * '--------------------------------------------------------------------------------------------------------------------------------------' */ @@ -54,9 +54,31 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { { KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_BSLS, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_ENT }, { KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_HOME, KC_DEL, KC_PGUP, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT }, { KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, KC_UP, KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC }, - { KC_LCTL, KC_DEL, KC_LALT, KC_LGUI, MO(_FN1),KC_SPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_SPC, MO(_FN2),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR }, + { KC_LCTL, KC_DEL, KC_LALT, KC_LGUI, MO(_FN1),KC_SPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_SPC, MO(_FN2),KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT }, }, +/* NUMPAD + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | | | | | | | / | * | - | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | 7 | 8 | 9 | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | 4 | 5 | 6 | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | 1 | 2 | 3 | | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | | | | | + | 0 | . | | | | | | | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_NP] = { /* NUMPAD */ + { _______, _______, _______, _______, _______, _______, KC_SLSH, KC_ASTR, KC_MINS, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, KC_7, KC_8, KC_9, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, KC_4, KC_5, KC_6, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, _______, _______, _______, _______, _______, _______ }, + { _______, _______, _______, _______, _______, _______, KC_PLUS, KC_0, KC_DOT, _______, _______, _______, _______, _______, _______ }, + }, + /* FUNCTION1 * .--------------------------------------------------------------------------------------------------------------------------------------. * | ` | ! | @ | # | $ | % | | | | ^ | & | * | ( | ) | BACKSP | @@ -84,7 +106,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * .--------------------------------------------------------------------------------------------------------------------------------------. * | ` | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | BACKSP | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | ` | | | UP | | | RESET |RGB HUE-|RGB HUE+| | | | | | | + * | ` | | | UP | | | RESET |RGB HUE-|RGB HUE+| NUMPAD | | | | | | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| * | DEL | | LEFT | DOWN | RIGHT | | |RGB SAT-|RGB SAT+| DVORAK | - | = | [ | ] | \ | * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| @@ -96,32 +118,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_FN2] = { /* FUNCTION2 */ { 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_UP, _______, _______, RESET, RGB_HUD, RGB_HUI, _______, _______, _______, _______, _______, KC_DEL }, - { KC_DEL, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, RGB_SAD, RGB_SAI, TO(_DV), KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS }, - { _______, _______, _______, _______, _______, _______, _______, RGB_VAD, RGB_VAI, TO(_QW), _______, _______, KC_PGDN, KC_PGUP, _______ }, + { KC_GRV, _______, _______, KC_UP, _______, _______, RESET, RGB_HUD, RGB_HUI, TG(_NP), _______, _______, _______, _______, KC_DEL }, + { KC_DEL, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, RGB_SAD, RGB_SAI, TG(_DV), KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS }, + { _______, _______, _______, _______, _______, _______, _______, RGB_VAD, RGB_VAI, TG(_QW), _______, _______, KC_PGDN, KC_PGUP, _______ }, { _______, _______, _______, _______, _______, _______, _______,RGB_RMOD, RGB_MOD, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY }, - }, - -/* NUMPAD - * .--------------------------------------------------------------------------------------------------------------------------------------. - * | | | | | | / | * | - | | | | | | | | - * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | | | | | | 7 | 8 | 9 | | | | | | | | - * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | | | | | | 4 | 5 | 6 | | | | | | | | - * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | | | | | | 1 | 2 | 3 | | | | | | | | - * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| - * | | | | | | 0 | 0 | . | | | | | | | | - * '--------------------------------------------------------------------------------------------------------------------------------------' - */ - - [_NP] = { /* NUMPAD */ - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, - { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, } }; @@ -149,6 +149,13 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) return MACRO_NONE; }; +void matrix_init_user(void) { + if (!(host_keyboard_leds() & (1< Date: Sun, 18 Nov 2018 16:52:14 +0100 Subject: [PATCH 430/505] Update to my keymaps and userspace (#4447) * fix to prime o keymap * changed ortho keymaps * added some symbols to lower layer * set lower to be a higher layer than raise * added split layout option with center numpad to prime_o keymap * added some gaming functionality * added alt f4 ortho keymaps and userspace * fixed small error --- .../niu_mini/keymaps/spacebarracecar/keymap.c | 27 +- .../planck/keymaps/spacebarracecar/keymap.c | 25 +- .../prime_o/keymaps/spacebarracecar/keymap.c | 346 ++++++++++++------ .../prime_o/keymaps/spacebarracecar/readme.md | 2 +- users/spacebarracecar/spacebarracecar.h | 2 + 5 files changed, 280 insertions(+), 122 deletions(-) diff --git a/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c b/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c index c3f6fb09a106..9bee87f38f9c 100644 --- a/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c +++ b/keyboards/niu_mini/keymaps/spacebarracecar/keymap.c @@ -6,8 +6,8 @@ enum layers { _BASE, - _LOWER, - _RAISE + _RAISE, + _LOWER }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -45,7 +45,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LOWER] = LAYOUT_ortho_4x12( DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, - _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, + _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), @@ -64,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_RAISE] = LAYOUT_ortho_4x12( CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), @@ -89,21 +89,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Navigation ,-----------------------------------------------------------------------------------------------------------------------. -|ESCT |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | +|ALT F4 |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| | |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| | |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|RESET | | | | | | | | | | |Game | +|RESET |ESCT | | | | | | | | | |Game | `-----------------------------------------------------------------------------------------------------------------------' */ [_NAV] = LAYOUT_ortho_4x12( - CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, + ALTF4, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, RGB_M_P, KC_ENT, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, RGB_TOG, RGB_MOD, RGB_HUI, CU_RGBV, _______, - RESET, _______, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME + RESET, CU_ESCT, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME ) }; @@ -121,6 +121,17 @@ switch (keycode) { } else { return true; } + case KC_LALT: + if (game) { + if (record->event.pressed){ + layer_on(_RAISE); + } else { + layer_off(_RAISE); + } + return false; + } else { + return true; + } default: return true; } diff --git a/keyboards/planck/keymaps/spacebarracecar/keymap.c b/keyboards/planck/keymaps/spacebarracecar/keymap.c index db91231bf720..b1c0e3148a55 100644 --- a/keyboards/planck/keymaps/spacebarracecar/keymap.c +++ b/keyboards/planck/keymaps/spacebarracecar/keymap.c @@ -6,8 +6,8 @@ enum layers { _BASE, - _LOWER, _RAISE, + _LOWER, _MUSICMODE }; @@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LOWER] = LAYOUT_ortho_4x12( DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, - _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, + _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), @@ -65,7 +65,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_RAISE] = LAYOUT_ortho_4x12( CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), @@ -97,21 +97,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Navigation ,-----------------------------------------------------------------------------------------------------------------------. -|ESCT |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | +|ALT F4 |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| | |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| | |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|RESET | | | | | | | | | | |Game | +|RESET |ESCT | | | | | | | | | |Game | `-----------------------------------------------------------------------------------------------------------------------' */ [_NAV] = LAYOUT_ortho_4x12( - CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, + ALTF4, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, MU_ON, XXXXXXX, XXXXXXX, XXXXXXX, _______, - RESET, _______, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME + RESET, CU_ESCT, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME ) }; @@ -129,6 +129,17 @@ switch (keycode) { } else { return true; } + case KC_LALT: + if (game) { + if (record->event.pressed){ + layer_on(_RAISE); + } else { + layer_off(_RAISE); + } + return false; + } else { + return true; + } case MU_ON: if(record->event.pressed) { layer_off(_LOWER); diff --git a/keyboards/primekb/prime_o/keymaps/spacebarracecar/keymap.c b/keyboards/primekb/prime_o/keymaps/spacebarracecar/keymap.c index d38ff0d1d601..6e2011770f71 100644 --- a/keyboards/primekb/prime_o/keymaps/spacebarracecar/keymap.c +++ b/keyboards/primekb/prime_o/keymaps/spacebarracecar/keymap.c @@ -8,122 +8,244 @@ enum layers { _BASE, - _LOWER, _RAISE, + _LOWER, _GAME = _NAV+1 }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -#ifndef LEFTNUM +#ifdef LEFTNUM + /* Base ,---------------------------------------------------------------------------------------------------------------------------------------------------------------. -|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |\ |Numlock |/ |* |= | +|- |* |/ |Numlock |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |\ | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace|7 |8 |9 |- | +|+ |7 |8 |9 |Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace| +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|= |4 |5 |6 |Esc/Nav |A |S |D |F |G |H |J |K |L |; |' | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|Esc/Nav |A |S |D |F |G |H |J |K |L |; |' |4 |5 |6 |+ | +|Enter |1 |2 |3 |(/LShift |Y |X |C |V |B |N |M |, |. |/ |)/RShift | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Backspace|. |0 |00 |RCtrl | |Alt |Win |Lower |Space |Enter |Raise |Win |AltGr | |LCtrl | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_BASE] = LAYOUT( + KC_PMNS, KC_PAST, KC_PSLS, KC_NLCK, CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, CU_BSLS, + KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, + CU_EQL, KC_P4, KC_P5, KC_P6, CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, + KC_PENT, KC_P1, KC_P2, KC_P3, CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, + KC_BSPC, KC_PDOT, KC_P0, KC_P00, KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL +), + +/* Lower +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|- |* |/ |Numlock |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|(/LShift |Y |X |C |V |B |N |M |, |. |/ |)/RShift |1 |2 |3 |Enter | +|+ |7 |8 |9 |~ |! |" |# |$ |% |^ |& |* |( |) | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|= |4 |5 |6 | |@ |Strg+X |Strg+C |Strg+V | | |_ |+ |{ |} || | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|RCtrl | |Alt |Win |Lower |Space |Enter |Raise |Win |AltGr | |LCtrl |00 |0 |. |Tab | +|Enter |1 |2 |3 | |? | | | | | | | | | | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Backspace|. |0 |00 | | | | | | | | | | | | | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_LOWER] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, + _______, _______, _______, _______, _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, + _______, _______, _______, _______, _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Raise +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|- |* |/ |Numlock |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|+ |7 |8 |9 |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|= |4 |5 |6 | |F1 |F2 |F3 |F4 |F5 |F6 |- |= |[ |] |\ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Enter |1 |2 |3 | |F7 |F8 |F9 |F10 |F11 |F12 | | | | | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Backspace|. |0 |00 | | | | | | | | | | | | | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_RAISE] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, + _______, _______, _______, _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, + _______, _______, _______, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), + +/* Deadkey +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|- |* |/ |Numlock | | | | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|+ |7 |8 |9 | | | | | | | |Ü | |Ö | | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|= |4 |5 |6 | |Ä |ß | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Enter |1 |2 |3 | | | | | | | | | | | | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Backspace|. |0 |00 | | | | | |" |" | | | | | | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_DEADKEY] = LAYOUT( + _______, _______, _______, _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, + _______, _______, _______, _______, KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, _______, + _______, _______, _______, _______, _______, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, + _______, _______, _______, _______, _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, CU_DDQ, CU_DDQ, _______, _______, _______, _______, _______ +), + +/* Navigation +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|- |* |/ |Numlock |Escape | | | | | | | | | | | | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|+ |7 |8 |9 |ALT F4 |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|= |4 |5 |6 | |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Enter |1 |2 |3 | |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | +|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Backspace|. |0 |00 |RESET |ESCT | | | | | | | | | |Game | +`---------------------------------------------------------------------------------------------------------------------------------------------------------------' +*/ + +[_NAV] = LAYOUT( + _______, _______, _______, _______, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + _______, _______, _______, _______, ALTF4, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, + _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, + _______, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + _______, _______, _______, _______, RESET, CU_ESCT, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME +), + +// Can be used to place macros on the numpad +[_GAME] = LAYOUT( + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) + +#elif defined CENTERNUM + +/* Base +,---------------------------------------------------------------------------------------------------------------------------------------------------------------. +|` |1 |2 |3 |4 |5 |Numlock |/ |* |= |6 |7 |8 |9 |0 |\ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Tab |Q |W |E |R |T |7 |8 |9 |- |Z |U |I |O |P |Backspace| +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|Esc/Nav |A |S |D |F |G |4 |5 |6 |+ |H |J |K |L |; |' | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|(/LShift |Y |X |C |V |B |1 |2 |3 |Enter |N |M |, |. |/ |)/RShift | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|RCtrl | |Alt |Win |Lower |Space |00 |0 |. |Tab |Enter |Raise |Win |AltGr | |LCtrl | `---------------------------------------------------------------------------------------------------------------------------------------------------------------' */ [_BASE] = LAYOUT( - CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, CU_BSLS, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, - KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, KC_P7, KC_P8, KC_P9, KC_PPLS, - CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, KC_P4, KC_P5, KC_P6, KC_PEQL, - CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, KC_P1, KC_P2, KC_P3, KC_PENT, - KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_P00, KC_P0, KC_PDOT, KC_TAB + CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, CU_6, CU_7, CU_8, CU_9, CU_0, CU_BSLS, + KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, KC_P7, KC_P8, KC_P9, KC_PPLS, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, + CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, KC_P4, KC_P5, KC_P6, CU_EQL, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, + CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, KC_P1, KC_P2, KC_P3, KC_PENT, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, + KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_P00, KC_P0, KC_PDOT, KC_TAB, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL ), /* Lower ,---------------------------------------------------------------------------------------------------------------------------------------------------------------. -|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |Numlock |/ |* |- | +|` |1 |2 |3 |4 |5 |Numlock |/ |* |- |6 |7 |8 |9 |0 | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|~ |! |" |# |$ |% |^ |& |* |( |) | |7 |8 |9 |+ | +|~ |! |" |# |$ |% |7 |8 |9 |+ |^ |& |* |( |) | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| |@ |Strg+X |Strg+C |Strg+V | | |_ |+ |{ |} || |4 |5 |6 |= | +| |@ |Strg+X |Strg+C |Strg+V | |4 |5 |6 |= | |_ |+ |{ |} || | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| |? | | | | | | | | | | |1 |2 |3 |Enter | +| |? | | | | |1 |2 |3 |Enter | | | | | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| | | | | | | | | | | | |00 |0 |. |Tab | +| | | | | | |00 |0 |. |Tab | | | | | | | `---------------------------------------------------------------------------------------------------------------------------------------------------------------' */ [_LOWER] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, _______, _______, _______, _______, - _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, _______, _______, _______, _______, - _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, + DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, _______, _______, _______, _______, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, + _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, _______, _______, _______, _______, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, + _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, XXXXXXX, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), /* Raise ,---------------------------------------------------------------------------------------------------------------------------------------------------------------. -|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |Numlock |/ |* |- | +|` |1 |2 |3 |4 |5 |Numlock |/ |* |- |6 |7 |8 |9 |0 | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |7 |8 |9 |+ | +|` |1 |2 |3 |4 |5 |7 |8 |9 |+ |6 |7 |8 |9 |0 | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| |F1 |F2 |F3 |F4 |F5 |F6 |- |= |[ |] |\ |4 |5 |6 |= | +| |F1 |F2 |F3 |F4 |F5 |4 |5 |6 |= |F6 |- |= |[ |] |\ | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| |F7 |F8 |F9 |F10 |F11 |F12 | | | | | |1 |2 |3 |Enter | +| |F7 |F8 |F9 |F10 |F11 |1 |2 |3 |Enter |F12 | | | | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| | | | | | | | | | | | |00 |0 |. |Tab | +| | | | | | |00 |0 |. |Tab | | | | | | | `---------------------------------------------------------------------------------------------------------------------------------------------------------------' */ [_RAISE] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, _______, _______, _______, _______, - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, _______, _______, _______, _______, - _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, _______, _______, + CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, _______, _______, _______, _______, CU_6, CU_7, CU_8, CU_9, CU_0, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, _______, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______, _______, _______, _______, KC_F12, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), /* Deadkey ,---------------------------------------------------------------------------------------------------------------------------------------------------------------. -| | | | | | | | | | | | |Numlock |/ |* |- | +| | | | | | |Numlock |/ |* |- | | | | | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| | | | | | | |Ü | |Ö | | |7 |8 |9 |+ | +| | | | | | |7 |8 |9 |+ | |Ü | |Ö | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| |Ä |ß | | | | | | | | | |4 |5 |6 |= | +| |Ä |ß | | | |4 |5 |6 |= | | | | | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| | | | | | | | | | | | |1 |2 |3 |Enter | +| | | | | | |1 |2 |3 |Enter | | | | | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| | | | | |" |" | | | | | |00 |0 |. |Tab | +| | | | | |" |00 |0 |. |Tab |" | | | | | | `---------------------------------------------------------------------------------------------------------------------------------------------------------------' */ [_DEADKEY] = LAYOUT( - CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, - KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, _______, _______, _______, _______, _______, - _______, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, _______, _______, _______, _______, - _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, CU_DDQ, CU_DDQ, _______, _______, _______, _______, _______, _______, _______, _______, _______ + CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, + KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, _______, + _______, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, + _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, + _______, _______, _______, _______, _______, CU_DDQ, _______, _______, _______, _______, CU_DDQ, _______, _______, _______, _______, _______ ), /* Navigation ,---------------------------------------------------------------------------------------------------------------------------------------------------------------. -|Escape | | | | | | | | | | | |Numlock |/ |* |- | +|Escape | | | | | |Numlock |/ |* |- | | | | | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|ESCT |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del |7 |8 |9 |+ | +|ALT F4 |PageDown |Up |PageUp |Home | |7 |8 |9 |+ | | |Win+Up | | |Del | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter |4 |5 |6 |= | +| |Left |Down |Right |End | |4 |5 |6 |= | |Win+Left |Win+Down |Win+Right| |Enter | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -| |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | |1 |2 |3 |Enter | +| |Prev |Pause |Next |LowerVol |RaiseVol |1 |2 |3 |Enter |Mute | | | | | | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|RESET | | | | | | | | | | |Game |00 |0 |. |Tab | +|RESET |ESCT | | | | |00 |0 |. |Tab | | | | | |Game | `---------------------------------------------------------------------------------------------------------------------------------------------------------------' */ [_NAV] = LAYOUT( - KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, - CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, _______, _______, _______, _______, - _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, _______, _______, _______, _______, - _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, - RESET, _______, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME, _______, _______, _______, _______ + KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + ALTF4, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, _______, _______, _______, _______, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, + _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, _______, _______, _______, _______, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, + _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, _______, _______, _______, _______, KC_MUTE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, + RESET, CU_ESCT, _______, _______, _______, KC_SPC, _______, _______, _______, _______, KC_ENT, _______, _______, _______, _______, CU_GAME ), // Can be used to place macros on the numpad @@ -134,117 +256,117 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) -#endif -#ifdef LEFTNUM +#else + /* Base ,---------------------------------------------------------------------------------------------------------------------------------------------------------------. -|- |* |/ |Numlock |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |\ | +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |\ |Numlock |/ |* |= | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|+ |7 |8 |9 |Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace| -|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|= |4 |5 |6 |Esc/Nav |A |S |D |F |G |H |J |K |L |; |' | +|Tab |Q |W |E |R |T |Z |U |I |O |P |Backspace|7 |8 |9 |- | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|Enter |1 |2 |3 |(/LShift |Y |X |C |V |B |N |M |, |. |/ |)/RShift | -|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|Backspace|. |0 |00 |RCtrl | |Alt |Win |Lower |Space |Enter |Raise |Win |AltGr | |LCtrl | +|Esc/Nav |A |S |D |F |G |H |J |K |L |; |' |4 |5 |6 |+ | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|(/LShift |Y |X |C |V |B |N |M |, |. |/ |)/RShift |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|RCtrl | |Alt |Win |Lower |Space |Enter |Raise |Win |AltGr | |LCtrl |00 |0 |. |Tab | `---------------------------------------------------------------------------------------------------------------------------------------------------------------' */ [_BASE] = LAYOUT( - KC_PMNS, KC_PAST, KC_PSLS, KC_NLCK, CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, CU_BSLS, - KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, - KC_PEQL, KC_P4, KC_P5, KC_P6, CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, - KC_PENT, KC_P1, KC_P2, KC_P3, CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, - KC_BSPC, KC_PDOT, KC_P0, KC_P00, KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL + CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, CU_BSLS, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_TAB, DE_Q, DE_W, DE_E, DE_R, DE_T, CU_Z, DE_U, DE_I, DE_O, DE_P, KC_BSPC, KC_P7, KC_P8, KC_P9, KC_PPLS, + CU_NAV, DE_A, DE_S, DE_D, DE_F, DE_G, DE_H, DE_J, DE_K, DE_L, CU_SCLN, CU_QUOT, KC_P4, KC_P5, KC_P6, CU_EQL, + CU_LSFT, CU_Y, DE_X, DE_C, DE_V, DE_B, DE_N, DE_M, CU_COMM, CU_DOT, CU_SLSH, CU_RSFT, KC_P1, KC_P2, KC_P3, KC_PENT, + KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_P00, KC_P0, KC_PDOT, KC_TAB ), /* Lower ,---------------------------------------------------------------------------------------------------------------------------------------------------------------. -|- |* |/ |Numlock |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | | +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |Numlock |/ |* |- | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|+ |7 |8 |9 |~ |! |" |# |$ |% |^ |& |* |( |) | | -|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|= |4 |5 |6 | |@ |Strg+X |Strg+C |Strg+V | | |_ |+ |{ |} || | +|~ |! |" |# |$ |% |^ |& |* |( |) | |7 |8 |9 |+ | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|Enter |1 |2 |3 | |? | | | | | | | | | | | -|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|Backspace|. |0 |00 | | | | | | | | | | | | | +| |@ |Strg+X |Strg+C |Strg+V | | |_ |+ |{ |} || |4 |5 |6 |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |? | | | | | | | | | | |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | |00 |0 |. |Tab | `---------------------------------------------------------------------------------------------------------------------------------------------------------------' */ [_LOWER] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, - _______, _______, _______, _______, _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, - _______, _______, _______, _______, _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, + DE_TILD, DE_EXLM, DE_DQOT, DE_HASH, DE_DLR, DE_PERC, CU_CIRC, DE_AMPR, DE_ASTR, DE_LPRN, DE_RPRN, _______, _______, _______, _______, _______, + _______, DE_AT, CTRLX, CTRLC, CTRLV, XXXXXXX, XXXXXXX, DE_UNDS, DE_PLUS, DE_LCBR, DE_RCBR, DE_PIPE, _______, _______, _______, _______, + _______, DE_EURO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), /* Raise ,---------------------------------------------------------------------------------------------------------------------------------------------------------------. -|- |* |/ |Numlock |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | | +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |Numlock |/ |* |- | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|+ |7 |8 |9 |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | | -|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|= |4 |5 |6 | |F1 |F2 |F3 |F4 |F5 |F6 |- |= |[ |] |\ | +|` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 | |7 |8 |9 |+ | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|Enter |1 |2 |3 | |F7 |F8 |F9 |F10 |F11 |F12 | | | | | | -|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|Backspace|. |0 |00 | | | | | | | | | | | | | +| |F1 |F2 |F3 |F4 |F5 |F6 |- |= |[ |] |\ |4 |5 |6 |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |F7 |F8 |F9 |F10 |F11 |F12 | | | | | |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | |00 |0 |. |Tab | `---------------------------------------------------------------------------------------------------------------------------------------------------------------' */ [_RAISE] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, - _______, _______, _______, _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, - _______, _______, _______, _______, _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______, + CU_GRV, DE_1, DE_2, CU_3, DE_4, DE_5, CU_6, CU_7, CU_8, CU_9, CU_0, _______, _______, _______, _______, _______, + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, DE_MINS, CU_EQL, CU_LBRC, CU_RBRC, CU_BSLS, _______, _______, _______, _______, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), /* Deadkey ,---------------------------------------------------------------------------------------------------------------------------------------------------------------. -|- |* |/ |Numlock | | | | | | | | | | | | | +| | | | | | | | | | | | |Numlock |/ |* |- | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|+ |7 |8 |9 | | | | | | | |Ü | |Ö | | | -|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|= |4 |5 |6 | |Ä |ß | | | | | | | | | | +| | | | | | | |Ü | |Ö | | |7 |8 |9 |+ | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|Enter |1 |2 |3 | | | | | | | | | | | | | -|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|Backspace|. |0 |00 | | | | | |" |" | | | | | | +| |Ä |ß | | | | | | | | | |4 |5 |6 |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | | | | | | | | |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| | | | | |" |" | | | | | |00 |0 |. |Tab | `---------------------------------------------------------------------------------------------------------------------------------------------------------------' */ [_DEADKEY] = LAYOUT( - _______, _______, _______, _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, - _______, _______, _______, _______, KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, _______, - _______, _______, _______, _______, _______, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, - _______, _______, _______, _______, _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, CU_DDQ, CU_DDQ, _______, _______, _______, _______, _______ + CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, + KC_TAB, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_UE, CU_ED, CU_OE, CU_ED, _______, _______, _______, _______, _______, + _______, CU_AE, CU_SS, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_DDQ, _______, _______, _______, _______, + _______, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, CU_ED, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, CU_DDQ, CU_DDQ, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), /* Navigation ,---------------------------------------------------------------------------------------------------------------------------------------------------------------. -|- |* |/ |Numlock |Escape | | | | | | | | | | | | +|Escape | | | | | | | | | | | |Numlock |/ |* |- | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|+ |7 |8 |9 |ESCT |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del | -|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|= |4 |5 |6 | |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter | +|ALT F4 |PageDown |Up |PageUp |Home | | | |Win+Up | | |Del |7 |8 |9 |+ | |---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|Enter |1 |2 |3 | |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | | -|---------+---------+---------+---------|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| -|Backspace|. |0 |00 |RESET | | | | | | | | | | |Game | +| |Left |Down |Right |End | | |Win+Left |Win+Down |Win+Right| |Enter |4 |5 |6 |= | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +| |Prev |Pause |Next |LowerVol |RaiseVol |Mute | | | | | |1 |2 |3 |Enter | +|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------| +|RESET |ESCT | | | | | | | | | |Game |00 |0 |. |Tab | `---------------------------------------------------------------------------------------------------------------------------------------------------------------' */ [_NAV] = LAYOUT( - _______, _______, _______, _______, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, - _______, _______, _______, _______, CU_ESCT, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, - _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, - _______, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, - _______, _______, _______, _______, RESET, _______, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME + KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, + ALTF4, KC_PGDN, KC_UP, KC_PGUP, KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, GUIU, XXXXXXX, XXXXXXX, KC_DEL, _______, _______, _______, _______, + _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, XXXXXXX, XXXXXXX, GUIL, GUID, GUIR, XXXXXXX, KC_ENT, _______, _______, _______, _______, + _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, _______, + RESET, CU_ESCT, _______, _______, _______, KC_SPC, KC_ENT, _______, _______, _______, _______, CU_GAME, _______, _______, _______, _______ ), // Can be used to place macros on the numpad @@ -255,6 +377,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) + #endif }; @@ -272,6 +395,17 @@ switch (keycode) { } else { return true; } + case KC_LALT: + if (game) { + if (record->event.pressed){ + layer_on(_RAISE); + } else { + layer_off(_RAISE); + } + return false; + } else { + return true; + } case CU_GAME: if(record->event.pressed) { if (game) diff --git a/keyboards/primekb/prime_o/keymaps/spacebarracecar/readme.md b/keyboards/primekb/prime_o/keymaps/spacebarracecar/readme.md index eb8da3fa78f3..7e78330f07a6 100644 --- a/keyboards/primekb/prime_o/keymaps/spacebarracecar/readme.md +++ b/keyboards/primekb/prime_o/keymaps/spacebarracecar/readme.md @@ -3,4 +3,4 @@ This keymap emulates most keys of the US-International layout on PCs that have German set as input language. This allows the use of the keyboard on any PC in Germany without the need to change any settings. The keymap is mostly based on the Planck default layout but adds essential features for german input, like access to Ä, Ö, Ü, ß. -Righthand Numpad is enabled by default, enable lefthand Numpad with #define LEFTNUM. +Righthand numpad is enabled by default, enable lefthand numpad with #define LEFTNUM and center numpad with #define CENTERNUM. diff --git a/users/spacebarracecar/spacebarracecar.h b/users/spacebarracecar/spacebarracecar.h index 1e18253510cb..035c1ac79099 100644 --- a/users/spacebarracecar/spacebarracecar.h +++ b/users/spacebarracecar/spacebarracecar.h @@ -81,6 +81,8 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record); #define CTRLC LCTL(KC_C) #define CTRLV LCTL(KC_V) +#define ALTF4 LALT(KC_F4) + #define GUIU LGUI(KC_UP) #define GUID LGUI(KC_DOWN) #define GUIL LGUI(KC_LEFT) From 9ee2991c3db72fbd4074f2b83185ef830d53cba4 Mon Sep 17 00:00:00 2001 From: Charlie McMackin Date: Sun, 18 Nov 2018 09:52:53 -0600 Subject: [PATCH 431/505] Default JIS TKL keymap for Pegasus Hoof (#4446) * Add TKL JIS layout for Pegasus Hoof Tested with a JIS Majestouch 2 TKL * Add default_jis keymap for Pegasus Hoof * Remove unnecessary keycode definition * Remove legacy fn_actions in favor of MO(1) * Remove unnecessary build directive --- .../pegasushoof/keymaps/default_jis/keymap.c | 54 +++++++++++++++++++ .../pegasushoof/keymaps/default_jis/rules.mk | 17 ++++++ keyboards/bpiphany/pegasushoof/pegasushoof.h | 18 +++++++ 3 files changed, 89 insertions(+) create mode 100644 keyboards/bpiphany/pegasushoof/keymaps/default_jis/keymap.c create mode 100644 keyboards/bpiphany/pegasushoof/keymaps/default_jis/rules.mk diff --git a/keyboards/bpiphany/pegasushoof/keymaps/default_jis/keymap.c b/keyboards/bpiphany/pegasushoof/keymaps/default_jis/keymap.c new file mode 100644 index 000000000000..a77474182260 --- /dev/null +++ b/keyboards/bpiphany/pegasushoof/keymaps/default_jis/keymap.c @@ -0,0 +1,54 @@ +/* +Copyright 2016 Daniel Svensson + 2018 Charlie McMackin + +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 QMK_KEYBOARD_H + +#define KM_JIS 0 +#define KM_MEDIA 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = + { + /* Layer 0: Standard JIS layer */ + [KM_JIS] = LAYOUT_tkl_jis(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_JYEN, KC_BSPC, KC_INS, KC_HOME,KC_PGUP, \ + 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_DEL, KC_END, KC_PGDN, \ + 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_BSLS,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_RO, KC_RSFT, KC_UP, \ + KC_LCTL, KC_LGUI,KC_LALT,KC_MHEN, KC_SPC, KC_HENK,KC_KANA,KC_RALT,MO(1), KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT), + /* Layer 1: Function layer */ + [KM_MEDIA] = LAYOUT_tkl_jis(_______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, KC_WAKE,KC_PWR, KC_SLEP, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,KC_VOLU, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,KC_VOLD, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, \ + _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, KC_MPLY, \ + _______,_______,_______,_______, _______, _______,_______,_______,_______,RESET , KC_MPRV,KC_MSTP,KC_MNXT) + }; + +void led_set_user(uint8_t usb_led) { + if (usb_led & (1 << USB_LED_CAPS_LOCK)) { + ph_caps_led_on(); + } else { + ph_caps_led_off(); + } + + if (usb_led & (1 << USB_LED_SCROLL_LOCK)) { + ph_sclk_led_on(); + } else { + ph_sclk_led_off(); + } +} diff --git a/keyboards/bpiphany/pegasushoof/keymaps/default_jis/rules.mk b/keyboards/bpiphany/pegasushoof/keymaps/default_jis/rules.mk new file mode 100644 index 000000000000..8254a83891d1 --- /dev/null +++ b/keyboards/bpiphany/pegasushoof/keymaps/default_jis/rules.mk @@ -0,0 +1,17 @@ +# 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 = yes # 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 +CUSTOM_MATRIX = yes # Custom matrix file for the Pegasus Hoof due to the 2x74HC42 +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. diff --git a/keyboards/bpiphany/pegasushoof/pegasushoof.h b/keyboards/bpiphany/pegasushoof/pegasushoof.h index d031e3ed25d6..939a854cd468 100644 --- a/keyboards/bpiphany/pegasushoof/pegasushoof.h +++ b/keyboards/bpiphany/pegasushoof/pegasushoof.h @@ -41,6 +41,24 @@ along with this program. If not, see . /* 7 */ { ___ , ___ , ___ , ___ , ___ , KF7 , KG7 , KH7 , KI7 , KJ7 , KK7 , KL7 , KM7 , KN7 , ___ , KP7 , ___ , ___ }, \ } +#define LAYOUT_tkl_jis( \ + KG6, KH4, KI4, KI2, KI6, KP5, KL6, KM2, KM4, KO4, KO5, KO6, KO0, KN5, KN7, KP7, \ + KG4, KG5, KH5, KI5, KJ5, KJ4, KK4, KK5, KL5, KM5, KF5, KF4, KL4, KO7, KO2, KR4, KC4, KE4, \ + KG2, KG7, KH7, KI7, KJ7, KJ2, KK2, KK7, KL7, KM7, KF7, KF2, KL2, KQ4, KC5, KE5, \ + KH2, KG3, KH3, KI3, KJ3, KJ6, KK6, KK3, KL3, KM3, KF3, KF6, KO3, KO1, \ + KB2, KG1, KH1, KI1, KJ1, KJ0, KK0, KK1, KL1, KM1, KF0, KL0, KB3, KC6, \ + KP4, KD2, KN6, KG0, KQ6, KH0, KI0, KN0, KM0, KP1, KC0, KQ0, KR0 \ + ) { /* 00-A 01-B 02-C 03-D 04-E 05-F 06-G 07-H 08-I 09-J 10-K 11-L 12-M 13-N 14-O 15-P 16-Q 17-R */ \ + /* 0 */ { ___ , ___ , KC0 , ___ , ___ , KF0 , KG0 , KH0 , KI0 , KJ0 , KK0 , KL0 , KM0 , KN0 , KO0 , ___ , KQ0 , KR0 }, \ + /* 1 */ { ___ , ___ , ___ , ___ , ___ , ___ , KG1 , KH1 , KI1 , KJ1 , KK1 , KL1 , KM1 , ___ , KO1 , KP1 , ___ , ___ }, \ + /* 2 */ { ___ , KB2 , ___ , KD2 , ___ , KF2 , KG2 , KH2 , KI2 , KJ2 , KK2 , KL2 , KM2 , ___ , KO2 , ___ , ___ , ___ }, \ + /* 3 */ { ___ , KB3 , ___ , ___ , ___ , KF3 , KG3 , KH3 , KI3 , KJ3 , KK3 , KL3 , KM3 , ___ , KO3 , ___ , ___ , ___ }, \ + /* 4 */ { ___ , ___ , KC4 , ___ , KE4 , KF4 , KG4 , KH4 , KI4 , KJ4 , KK4 , KL4 , KM4 , ___ , KO4 , KP4 , KQ4 , KR4 }, \ + /* 5 */ { ___ , ___ , KC5 , ___ , KE5 , KF5 , KG5 , KH5 , KI5 , KJ5 , KK5 , KL5 , KM5 , KN5 , KO5 , KP5 , ___ , ___ }, \ + /* 6 */ { ___ , ___ , KC6 , ___ , ___ , KF6 , KG6 , ___ , KI6 , KJ6 , KK6 , KL6 , ___ , KN6 , KO6 , ___ , KQ6 , ___ }, \ + /* 7 */ { ___ , ___ , ___ , ___ , ___ , KF7 , KG7 , KH7 , KI7 , KJ7 , KK7 , KL7 , KM7 , KN7 , KO7 , KP7 , ___ , ___ }, \ +} + inline void ph_caps_led_on(void) { DDRC |= (1<<6); PORTC &= ~(1<<6); } inline void ph_caps_led_off(void) { DDRC &= ~(1<<6); PORTC &= ~(1<<6); } From 31298be2b17a1b9f203c8fd1d7bae8f923557cc0 Mon Sep 17 00:00:00 2001 From: zvecr Date: Sun, 18 Nov 2018 15:53:33 +0000 Subject: [PATCH 432/505] Add personal zvecr dz60 keymap (#4443) * Add Configurator support for dz60 ansi split space * Add keymap and fix layout macro --- keyboards/dz60/dz60.h | 27 ++++++++++++++++++ keyboards/dz60/info.json | 4 +++ keyboards/dz60/keymaps/zvecr/keymap.c | 40 +++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 keyboards/dz60/keymaps/zvecr/keymap.c diff --git a/keyboards/dz60/dz60.h b/keyboards/dz60/dz60.h index 2cf2eec7a08c..62f6338cd430 100644 --- a/keyboards/dz60/dz60.h +++ b/keyboards/dz60/dz60.h @@ -170,6 +170,33 @@ { k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \ } +/* LAYOUT_60_ansi_split + * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ + * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0e │ + * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ + * │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │ + * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ + * │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │ + * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ + * │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │ + * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ + * │40 │41 │43 │44 │46 │48 │4a │4b │4d │4e │ + * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ +*/ +#define LAYOUT_60_ansi_split( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, \ + k10, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \ + k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, \ + k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3d, \ + k40, k41, k43, k44, k46, k48, k4a, k4b, k4d, k4e \ +) { \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, KC_NO, k0e }, \ + { k10, KC_NO, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \ + { k20, KC_NO, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \ + { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, KC_NO, k3d, KC_NO }, \ + { k40, k41, KC_NO, k43, k44, KC_NO, k46, KC_NO, k48, KC_NO, k4a, k4b, KC_NO, k4d, k4e } \ +} + /* LAYOUT_60_iso * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ * │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0e │ diff --git a/keyboards/dz60/info.json b/keyboards/dz60/info.json index a163cc6a467a..9ec7274531e1 100644 --- a/keyboards/dz60/info.json +++ b/keyboards/dz60/info.json @@ -25,6 +25,10 @@ "key_count": 61, "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] }, + "LAYOUT_60_ansi_split": { + "key_count": 61, + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"label":"FN", "x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] + }, "LAYOUT_60_iso": { "key_count": 62, "layout": [{"label":"¬", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"£", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"CapsLock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}] diff --git a/keyboards/dz60/keymaps/zvecr/keymap.c b/keyboards/dz60/keymaps/zvecr/keymap.c new file mode 100644 index 000000000000..9127fa0a7e65 --- /dev/null +++ b/keyboards/dz60/keymaps/zvecr/keymap.c @@ -0,0 +1,40 @@ +#include QMK_KEYBOARD_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 // Base Layer +#define FL 1 // Function Layer +#define ML 2 // Macro Layer + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [BL] = LAYOUT_60_ansi_split( + KC_GESC, 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, MO(FL), KC_SPC, KC_RALT, KC_RGUI, MO(ML), KC_RCTL), + + [FL] = LAYOUT_60_ansi_split( + 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, + _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, KC_PSCR, KC_SLCK, KC_PAUS, RESET, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, KC_HOME, KC_PGUP, _______, + _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, BL_STEP, _______, KC_DEL, KC_END, KC_PGDN, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + + [ML] = LAYOUT_60_ansi_split( + _______, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + +}; From de173e344e89ee356cfd0be75742122afac766d0 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sun, 18 Nov 2018 08:23:51 -0800 Subject: [PATCH 433/505] Satan: add LAYOUT_60_ansi_split_rshift to info.json (#4441) --- keyboards/satan/info.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/keyboards/satan/info.json b/keyboards/satan/info.json index d0beb723b744..2b2e96ed19c6 100644 --- a/keyboards/satan/info.json +++ b/keyboards/satan/info.json @@ -20,8 +20,11 @@ "LAYOUT_60_iso_split_bs_rshift": { "layout": [{"label":"k00", "x":0, "y":0}, {"label":"k01", "x":1, "y":0}, {"label":"k02", "x":2, "y":0}, {"label":"k03", "x":3, "y":0}, {"label":"k04", "x":4, "y":0}, {"label":"k05", "x":5, "y":0}, {"label":"k06", "x":6, "y":0}, {"label":"k07", "x":7, "y":0}, {"label":"k08", "x":8, "y":0}, {"label":"k09", "x":9, "y":0}, {"label":"k0a", "x":10, "y":0}, {"label":"k0b", "x":11, "y":0}, {"label":"k0c", "x":12, "y":0}, {"label":"k0d", "x":13, "y":0}, {"label":"k49", "x":14, "y":0}, {"label":"k10", "x":0, "y":1, "w":1.5}, {"label":"k11", "x":1.5, "y":1}, {"label":"k12", "x":2.5, "y":1}, {"label":"k13", "x":3.5, "y":1}, {"label":"k14", "x":4.5, "y":1}, {"label":"k15", "x":5.5, "y":1}, {"label":"k16", "x":6.5, "y":1}, {"label":"k17", "x":7.5, "y":1}, {"label":"k18", "x":8.5, "y":1}, {"label":"k19", "x":9.5, "y":1}, {"label":"k1a", "x":10.5, "y":1}, {"label":"k1b", "x":11.5, "y":1}, {"label":"k1c", "x":12.5, "y":1}, {"label":"k20", "x":0, "y":2, "w":1.75}, {"label":"k21", "x":1.75, "y":2}, {"label":"k22", "x":2.75, "y":2}, {"label":"k23", "x":3.75, "y":2}, {"label":"k24", "x":4.75, "y":2}, {"label":"k25", "x":5.75, "y":2}, {"label":"k26", "x":6.75, "y":2}, {"label":"k27", "x":7.75, "y":2}, {"label":"k28", "x":8.75, "y":2}, {"label":"k29", "x":9.75, "y":2}, {"label":"k2a", "x":10.75, "y":2}, {"label":"k2b", "x":11.75, "y":2}, {"label":"k2c", "x":12.75, "y":2}, {"label":"k2d", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"k30", "x":0, "y":3, "w":1.25}, {"label":"k31", "x":1.25, "y":3}, {"label":"k32", "x":2.25, "y":3}, {"label":"k33", "x":3.25, "y":3}, {"label":"k34", "x":4.25, "y":3}, {"label":"k35", "x":5.25, "y":3}, {"label":"k36", "x":6.25, "y":3}, {"label":"k37", "x":7.25, "y":3}, {"label":"k38", "x":8.25, "y":3}, {"label":"k39", "x":9.25, "y":3}, {"label":"k3a", "x":10.25, "y":3}, {"label":"k3b", "x":11.25, "y":3}, {"label":"k3d", "x":12.25, "y":3, "w":1.75}, {"label":"k3c", "x":14, "y":3}, {"label":"k40", "x":0, "y":4, "w":1.5}, {"label":"k41", "x":1.5, "y":4}, {"label":"k42", "x":2.5, "y":4, "w":1.5}, {"label":"k45", "x":4, "y":4, "w":6}, {"label":"k4a", "x":10, "y":4, "w":1.5}, {"label":"k4b", "x":11.5, "y":4}, {"label":"k4c", "x":12.5, "y":4}, {"label":"k4d", "x":13.5, "y":4, "w":1.5}] }, + "LAYOUT_60_ansi_split_rshift": { + "layout": [{"label":"k00", "x":0, "y":0}, {"label":"k01", "x":1, "y":0}, {"label":"k02", "x":2, "y":0}, {"label":"k03", "x":3, "y":0}, {"label":"k04", "x":4, "y":0}, {"label":"k05", "x":5, "y":0}, {"label":"k06", "x":6, "y":0}, {"label":"k07", "x":7, "y":0}, {"label":"k08", "x":8, "y":0}, {"label":"k09", "x":9, "y":0}, {"label":"k0a", "x":10, "y":0}, {"label":"k0b", "x":11, "y":0}, {"label":"k0c", "x":12, "y":0}, {"label":"k0d", "x":13, "y":0, "w":2}, {"label":"k10", "x":0, "y":1, "w":1.5}, {"label":"k11", "x":1.5, "y":1}, {"label":"k12", "x":2.5, "y":1}, {"label":"k13", "x":3.5, "y":1}, {"label":"k14", "x":4.5, "y":1}, {"label":"k15", "x":5.5, "y":1}, {"label":"k16", "x":6.5, "y":1}, {"label":"k17", "x":7.5, "y":1}, {"label":"k18", "x":8.5, "y":1}, {"label":"k19", "x":9.5, "y":1}, {"label":"k1a", "x":10.5, "y":1}, {"label":"k1b", "x":11.5, "y":1}, {"label":"k1c", "x":12.5, "y":1}, {"label":"k1d", "x":13.5, "y":1, "w":1.5}, {"label":"k20", "x":0, "y":2, "w":1.75}, {"label":"k21", "x":1.75, "y":2}, {"label":"k22", "x":2.75, "y":2}, {"label":"k23", "x":3.75, "y":2}, {"label":"k24", "x":4.75, "y":2}, {"label":"k25", "x":5.75, "y":2}, {"label":"k26", "x":6.75, "y":2}, {"label":"k27", "x":7.75, "y":2}, {"label":"k28", "x":8.75, "y":2}, {"label":"k29", "x":9.75, "y":2}, {"label":"k2a", "x":10.75, "y":2}, {"label":"k2b", "x":11.75, "y":2}, {"label":"k2d", "x":12.75, "y":2, "w":2.25}, {"label":"k30", "x":0, "y":3, "w":2.25}, {"label":"k32", "x":2.25, "y":3}, {"label":"k33", "x":3.25, "y":3}, {"label":"k34", "x":4.25, "y":3}, {"label":"k35", "x":5.25, "y":3}, {"label":"k36", "x":6.25, "y":3}, {"label":"k37", "x":7.25, "y":3}, {"label":"k38", "x":8.25, "y":3}, {"label":"k39", "x":9.25, "y":3}, {"label":"k3a", "x":10.25, "y":3}, {"label":"k3b", "x":11.25, "y":3}, {"label":"k3d", "x":12.25, "y":3, "w":1.75}, {"label":"k3c", "x":14, "y":3}, {"label":"k40", "x":0, "y":4, "w":1.25}, {"label":"k41", "x":1.25, "y":4, "w":1.25}, {"label":"k42", "x":2.5, "y":4, "w":1.25}, {"label":"k45", "x":3.75, "y":4, "w":6.25}, {"label":"k4a", "x":10, "y":4, "w":1.25}, {"label":"k4b", "x":11.25, "y":4, "w":1.25}, {"label":"k4c", "x":12.5, "y":4, "w":1.25}, {"label":"k4d", "x":13.75, "y":4, "w":1.25}] + }, "LAYOUT_60_iso_split_rshift": { "layout": [{"label":"k00", "x":0, "y":0}, {"label":"k01", "x":1, "y":0}, {"label":"k02", "x":2, "y":0}, {"label":"k03", "x":3, "y":0}, {"label":"k04", "x":4, "y":0}, {"label":"k05", "x":5, "y":0}, {"label":"k06", "x":6, "y":0}, {"label":"k07", "x":7, "y":0}, {"label":"k08", "x":8, "y":0}, {"label":"k09", "x":9, "y":0}, {"label":"k0a", "x":10, "y":0}, {"label":"k0b", "x":11, "y":0}, {"label":"k0c", "x":12, "y":0}, {"label":"k0d", "x":13, "y":0, "w":2}, {"label":"k10", "x":0, "y":1, "w":1.5}, {"label":"k11", "x":1.5, "y":1}, {"label":"k12", "x":2.5, "y":1}, {"label":"k13", "x":3.5, "y":1}, {"label":"k14", "x":4.5, "y":1}, {"label":"k15", "x":5.5, "y":1}, {"label":"k16", "x":6.5, "y":1}, {"label":"k17", "x":7.5, "y":1}, {"label":"k18", "x":8.5, "y":1}, {"label":"k19", "x":9.5, "y":1}, {"label":"k1a", "x":10.5, "y":1}, {"label":"k1b", "x":11.5, "y":1}, {"label":"k1c", "x":12.5, "y":1}, {"label":"k20", "x":0, "y":2, "w":1.75}, {"label":"k21", "x":1.75, "y":2}, {"label":"k22", "x":2.75, "y":2}, {"label":"k23", "x":3.75, "y":2}, {"label":"k24", "x":4.75, "y":2}, {"label":"k25", "x":5.75, "y":2}, {"label":"k26", "x":6.75, "y":2}, {"label":"k27", "x":7.75, "y":2}, {"label":"k28", "x":8.75, "y":2}, {"label":"k29", "x":9.75, "y":2}, {"label":"k2a", "x":10.75, "y":2}, {"label":"k2b", "x":11.75, "y":2}, {"label":"k2c", "x":12.75, "y":2}, {"label":"k2d", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"k30", "x":0, "y":3, "w":1.25}, {"label":"k31", "x":1.25, "y":3}, {"label":"k32", "x":2.25, "y":3}, {"label":"k33", "x":3.25, "y":3}, {"label":"k34", "x":4.25, "y":3}, {"label":"k35", "x":5.25, "y":3}, {"label":"k36", "x":6.25, "y":3}, {"label":"k37", "x":7.25, "y":3}, {"label":"k38", "x":8.25, "y":3}, {"label":"k39", "x":9.25, "y":3}, {"label":"k3a", "x":10.25, "y":3}, {"label":"k3b", "x":11.25, "y":3}, {"label":"k3d", "x":12.25, "y":3, "w":1.75}, {"label":"k3c", "x":14, "y":3}, {"label":"k40", "x":0, "y":4, "w":1.25}, {"label":"k41", "x":1.25, "y":4, "w":1.25}, {"label":"k42", "x":2.5, "y":4, "w":1.25}, {"label":"k45", "x":3.75, "y":4, "w":6.25}, {"label":"k4a", "x":10, "y":4, "w":1.25}, {"label":"k4b", "x":11.25, "y":4, "w":1.25}, {"label":"k4c", "x":12.5, "y":4, "w":1.25}, {"label":"k4d", "x":13.75, "y":4, "w":1.25}] } } -} \ No newline at end of file +} From 504bf11769f1340711d749e8dc818f39a56a4dfb Mon Sep 17 00:00:00 2001 From: Florian Didron Date: Mon, 19 Nov 2018 01:24:41 +0900 Subject: [PATCH 434/505] Allows disabling rgb effects in userspace (#4422) * Allows disabling animations in user space * Describe disabling effects in the docs * Allows disabling individual reactive modes * Adds the list ode defines --- docs/feature_rgb_matrix.md | 24 ++++++ quantum/rgb_matrix.c | 170 ++++++++++++++++++++++++------------- quantum/rgb_matrix.h | 44 ++++++++-- 3 files changed, 173 insertions(+), 65 deletions(-) diff --git a/docs/feature_rgb_matrix.md b/docs/feature_rgb_matrix.md index 809d034bdc1a..0af1e4947960 100644 --- a/docs/feature_rgb_matrix.md +++ b/docs/feature_rgb_matrix.md @@ -150,6 +150,30 @@ These are the effects that are currently available: #endif RGB_MATRIX_EFFECT_MAX }; + +You can disable a single effect by defining `DISABLE_[EFFECT_NAME]` in your `config.h`: + + +|Define |Description | +|---------------------------------------------------|--------------------------------------------| +|`#define DISABLE_RGB_MATRIX_ALPHAS_MODS` |Disables `RGB_MATRIX_ALPHAS_MODS` | +|`#define DISABLE_RGB_MATRIX_DUAL_BEACON` |Disables `RGB_MATRIX_DUAL_BEACON` | +|`#define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN` |Disables `RGB_MATRIX_GRADIENT_UP_DOWN` | +|`#define DISABLE_RGB_MATRIX_RAINDROPS` |Disables `RGB_MATRIX_RAINDROPS` | +|`#define DISABLE_RGB_MATRIX_CYCLE_ALL` |Disables `RGB_MATRIX_CYCLE_ALL` | +|`#define DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT` |Disables `RGB_MATRIX_CYCLE_LEFT_RIGHT` | +|`#define DISABLE_RGB_MATRIX_CYCLE_UP_DOWN` |Disables `RGB_MATRIX_CYCLE_UP_DOWN` | +|`#define DISABLE_RGB_MATRIX_RAINBOW_BEACON` |Disables `RGB_MATRIX_RAINBOW_BEACON` | +|`#define DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS` |Disables `RGB_MATRIX_RAINBOW_PINWHEELS` | +|`#define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON`|Disables `RGB_MATRIX_RAINBOW_MOVING_CHEVRON`| +|`#define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS` |Disables `RGB_MATRIX_JELLYBEAN_RAINDROPS` | +|`#define DISABLE_RGB_MATRIX_DIGITAL_RAIN` |Disables `RGB_MATRIX_DIGITAL_RAIN` | +|`#define DISABLE_RGB_MATRIX_SOLID_REACTIVE` |Disables `RGB_MATRIX_SOLID_REACTIVE` | +|`#define DISABLE_RGB_MATRIX_SPLASH` |Disables `RGB_MATRIX_SPLASH` | +|`#define DISABLE_RGB_MATRIX_MULTISPLASH` |Disables `RGB_MATRIX_MULTISPLASH` | +|`#define DISABLE_RGB_MATRIX_SOLID_SPLASH` |Disables `RGB_MATRIX_SOLID_SPLASH` | +|`#define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH` |Disables `RGB_MATRIX_SOLID_MULTISPLASH` | + ## Custom layer effects diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index 26ee57f5c2c4..15bd13671669 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -55,6 +55,10 @@ rgb_config_t rgb_matrix_config; #define RGB_DIGITAL_RAIN_DROPS 24 #endif +#if !defined(DISABLE_RGB_MATRIX_RAINDROPS) || !defined(DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS) || !defined(DISABLE_RGB_MATRIX_DIGITAL_RAIN) + #define TRACK_PREVIOUS_EFFECT +#endif + bool g_suspend_state = false; // Global tick at 20 Hz @@ -79,7 +83,12 @@ void eeconfig_update_rgb_matrix(uint32_t val) { void eeconfig_update_rgb_matrix_default(void) { dprintf("eeconfig_update_rgb_matrix_default\n"); rgb_matrix_config.enable = 1; +#ifndef DISABLE_RGB_MATRIX_CYCLE_ALL rgb_matrix_config.mode = RGB_MATRIX_CYCLE_LEFT_RIGHT; +#else + // fallback to solid colors if RGB_MATRIX_CYCLE_LEFT_RIGHT is disabled in userspace + rgb_matrix_config.mode = RGB_MATRIX_SOLID_COLOR; +#endif rgb_matrix_config.hue = 0; rgb_matrix_config.sat = 255; rgb_matrix_config.val = RGB_MATRIX_MAXIMUM_BRIGHTNESS; @@ -499,7 +508,7 @@ void rgb_matrix_digital_rain( const bool initialize ) { map_row_column_to_led(row, col, &led, &led_count); if (map[col][row] > pure_green_intensity) { - const uint8_t boost = (uint8_t) ((uint16_t) max_brightness_boost + const uint8_t boost = (uint8_t) ((uint16_t) max_brightness_boost * (map[col][row] - pure_green_intensity) / (max_intensity - pure_green_intensity)); rgb_matrix_set_color(led, boost, max_intensity, boost); } @@ -618,12 +627,16 @@ void rgb_matrix_custom(void) { } void rgb_matrix_task(void) { - static uint8_t toggle_enable_last = 255; + #ifdef TRACK_PREVIOUS_EFFECT + static uint8_t toggle_enable_last = 255; + #endif if (!rgb_matrix_config.enable) { - rgb_matrix_all_off(); - rgb_matrix_indicators(); - toggle_enable_last = rgb_matrix_config.enable; - return; + rgb_matrix_all_off(); + rgb_matrix_indicators(); + #ifdef TRACK_PREVIOUS_EFFECT + toggle_enable_last = rgb_matrix_config.enable; + #endif + return; } // delay 1 second before driving LEDs or doing anything else static uint8_t startup_tick = 0; @@ -658,13 +671,16 @@ void rgb_matrix_task(void) { (RGB_DISABLE_AFTER_TIMEOUT > 0 && g_any_key_hit > RGB_DISABLE_AFTER_TIMEOUT * 60 * 20)); uint8_t effect = suspend_backlight ? 0 : rgb_matrix_config.mode; - // Keep track of the effect used last time, - // detect change in effect, so each effect can - // have an optional initialization. - static uint8_t effect_last = 255; - bool initialize = (effect != effect_last) || (rgb_matrix_config.enable != toggle_enable_last); - effect_last = effect; - toggle_enable_last = rgb_matrix_config.enable; + #ifdef TRACK_PREVIOUS_EFFECT + // Keep track of the effect used last time, + // detect change in effect, so each effect can + // have an optional initialization. + + static uint8_t effect_last = 255; + bool initialize = (effect != effect_last) || (rgb_matrix_config.enable != toggle_enable_last); + effect_last = effect; + toggle_enable_last = rgb_matrix_config.enable; + #endif // this gets ticked at 20 Hz. // each effect can opt to do calculations @@ -673,59 +689,93 @@ void rgb_matrix_task(void) { case RGB_MATRIX_SOLID_COLOR: rgb_matrix_solid_color(); break; - case RGB_MATRIX_ALPHAS_MODS: - rgb_matrix_alphas_mods(); - break; - case RGB_MATRIX_DUAL_BEACON: - rgb_matrix_dual_beacon(); - break; - case RGB_MATRIX_GRADIENT_UP_DOWN: - rgb_matrix_gradient_up_down(); - break; - case RGB_MATRIX_RAINDROPS: - rgb_matrix_raindrops( initialize ); - break; - case RGB_MATRIX_CYCLE_ALL: - rgb_matrix_cycle_all(); - break; - case RGB_MATRIX_CYCLE_LEFT_RIGHT: - rgb_matrix_cycle_left_right(); - break; - case RGB_MATRIX_CYCLE_UP_DOWN: - rgb_matrix_cycle_up_down(); - break; - case RGB_MATRIX_RAINBOW_BEACON: - rgb_matrix_rainbow_beacon(); - break; - case RGB_MATRIX_RAINBOW_PINWHEELS: - rgb_matrix_rainbow_pinwheels(); - break; - case RGB_MATRIX_RAINBOW_MOVING_CHEVRON: - rgb_matrix_rainbow_moving_chevron(); - break; - case RGB_MATRIX_JELLYBEAN_RAINDROPS: - rgb_matrix_jellybean_raindrops( initialize ); - break; - case RGB_MATRIX_DIGITAL_RAIN: - rgb_matrix_digital_rain( initialize ); - break; - #ifdef RGB_MATRIX_KEYPRESSES - case RGB_MATRIX_SOLID_REACTIVE: - rgb_matrix_solid_reactive(); + #ifndef DISABLE_RGB_MATRIX_ALPHAS_MODS + case RGB_MATRIX_ALPHAS_MODS: + rgb_matrix_alphas_mods(); break; - case RGB_MATRIX_SPLASH: - rgb_matrix_splash(); + #endif + #ifndef DISABLE_RGB_MATRIX_DUAL_BEACON + case RGB_MATRIX_DUAL_BEACON: + rgb_matrix_dual_beacon(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN + case RGB_MATRIX_GRADIENT_UP_DOWN: + rgb_matrix_gradient_up_down(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_RAINDROPS + case RGB_MATRIX_RAINDROPS: + rgb_matrix_raindrops( initialize ); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_CYCLE_ALL + case RGB_MATRIX_CYCLE_ALL: + rgb_matrix_cycle_all(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT + case RGB_MATRIX_CYCLE_LEFT_RIGHT: + rgb_matrix_cycle_left_right(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_CYCLE_UP_DOWN + case RGB_MATRIX_CYCLE_UP_DOWN: + rgb_matrix_cycle_up_down(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_RAINBOW_BEACON + case RGB_MATRIX_RAINBOW_BEACON: + rgb_matrix_rainbow_beacon(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS + case RGB_MATRIX_RAINBOW_PINWHEELS: + rgb_matrix_rainbow_pinwheels(); break; - case RGB_MATRIX_MULTISPLASH: - rgb_matrix_multisplash(); + #endif + #ifndef DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON + case RGB_MATRIX_RAINBOW_MOVING_CHEVRON: + rgb_matrix_rainbow_moving_chevron(); break; - case RGB_MATRIX_SOLID_SPLASH: - rgb_matrix_solid_splash(); + #endif + #ifndef DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS + case RGB_MATRIX_JELLYBEAN_RAINDROPS: + rgb_matrix_jellybean_raindrops( initialize ); break; - case RGB_MATRIX_SOLID_MULTISPLASH: - rgb_matrix_solid_multisplash(); + #endif + #ifndef DISABLE_RGB_MATRIX_DIGITAL_RAIN + case RGB_MATRIX_DIGITAL_RAIN: + rgb_matrix_digital_rain( initialize ); break; #endif + #ifdef RGB_MATRIX_KEYPRESSES + #ifndef DISABLE_RGB_MATRIX_SOLID_REACTIVE + case RGB_MATRIX_SOLID_REACTIVE: + rgb_matrix_solid_reactive(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_SPLASH + case RGB_MATRIX_SPLASH: + rgb_matrix_splash(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_MULTISPLASH + case RGB_MATRIX_MULTISPLASH: + rgb_matrix_multisplash(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_SOLID_SPLASH + case RGB_MATRIX_SOLID_SPLASH: + rgb_matrix_solid_splash(); + break; + #endif + #ifndef DISABLE_RGB_MATRIX_SOLID_MULTISPLASH + case RGB_MATRIX_SOLID_MULTISPLASH: + rgb_matrix_solid_multisplash(); + break; + #endif + #endif default: rgb_matrix_custom(); break; diff --git a/quantum/rgb_matrix.h b/quantum/rgb_matrix.h index d2450a7d999b..3cd248ffc43c 100644 --- a/quantum/rgb_matrix.h +++ b/quantum/rgb_matrix.h @@ -70,24 +70,58 @@ typedef union { enum rgb_matrix_effects { RGB_MATRIX_SOLID_COLOR = 1, +#ifndef DISABLE_RGB_MATRIX_ALPHAS_MODS RGB_MATRIX_ALPHAS_MODS, +#endif +#ifndef DISABLE_RGB_MATRIX_DUAL_BEACON RGB_MATRIX_DUAL_BEACON, +#endif +#ifndef DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN RGB_MATRIX_GRADIENT_UP_DOWN, +#endif +#ifndef DISABLE_RGB_MATRIX_RAINDROPS RGB_MATRIX_RAINDROPS, +#endif +#ifndef DISABLE_RGB_MATRIX_CYCLE_ALL RGB_MATRIX_CYCLE_ALL, +#endif +#ifndef DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT RGB_MATRIX_CYCLE_LEFT_RIGHT, +#endif +#ifndef DISABLE_RGB_MATRIX_CYCLE_UP_DOWN RGB_MATRIX_CYCLE_UP_DOWN, +#endif +#ifndef DISABLE_RGB_MATRIX_RAINBOW_BEACON RGB_MATRIX_RAINBOW_BEACON, +#endif +#ifndef DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS RGB_MATRIX_RAINBOW_PINWHEELS, +#endif +#ifndef DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON RGB_MATRIX_RAINBOW_MOVING_CHEVRON, +#endif +#ifndef DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS RGB_MATRIX_JELLYBEAN_RAINDROPS, +#endif +#ifndef DISABLE_RGB_MATRIX_DIGITAL_RAIN RGB_MATRIX_DIGITAL_RAIN, +#endif #ifdef RGB_MATRIX_KEYPRESSES - RGB_MATRIX_SOLID_REACTIVE, - RGB_MATRIX_SPLASH, - RGB_MATRIX_MULTISPLASH, - RGB_MATRIX_SOLID_SPLASH, - RGB_MATRIX_SOLID_MULTISPLASH, + #ifndef DISABLE_RGB_MATRIX_SOLID_REACTIVE + RGB_MATRIX_SOLID_REACTIVE, + #endif + #ifndef DISABLE_RGB_MATRIX_SPLASH + RGB_MATRIX_SPLASH, + #endif + #ifndef DISABLE_RGB_MATRIX_MULTISPLASH + RGB_MATRIX_MULTISPLASH, + #endif + #ifndef DISABLE_RGB_MATRIX_SOLID_SPLASH + RGB_MATRIX_SOLID_SPLASH, + #endif + #ifndef DISABLE_RGB_MATRIX_SOLID_MULTISPLASH + RGB_MATRIX_SOLID_MULTISPLASH, + #endif #endif RGB_MATRIX_EFFECT_MAX }; From bdd41715af2acdfbdbe78283d7519664dd01088e Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Fri, 16 Nov 2018 17:03:41 -0800 Subject: [PATCH 435/505] Make Ergodox EZ Glow's rgb matrix user configurable --- keyboards/ergodox_ez/ergodox_ez.c | 1 + 1 file changed, 1 insertion(+) diff --git a/keyboards/ergodox_ez/ergodox_ez.c b/keyboards/ergodox_ez/ergodox_ez.c index 61f910711ac0..3b2c943506f1 100644 --- a/keyboards/ergodox_ez/ergodox_ez.c +++ b/keyboards/ergodox_ez/ergodox_ez.c @@ -269,6 +269,7 @@ const is31_led g_is31_leds[DRIVER_LED_TOTAL] = { }; +__attribute__ ((weak)) const rgb_led g_rgb_leds[DRIVER_LED_TOTAL] = { /*{row | col << 4} From 223b3d2be79594eddd3837067348ab97da2df8ae Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sun, 18 Nov 2018 08:55:45 -0800 Subject: [PATCH 436/505] Fix i2c_master.d listed more than once warning --- keyboards/ergodox_ez/keymaps/default/keymap.c | 2 -- keyboards/ergodox_ez/rules.mk | 8 ++++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/keyboards/ergodox_ez/keymaps/default/keymap.c b/keyboards/ergodox_ez/keymaps/default/keymap.c index ef70decd531f..49de6077373f 100644 --- a/keyboards/ergodox_ez/keymaps/default/keymap.c +++ b/keyboards/ergodox_ez/keymaps/default/keymap.c @@ -1,6 +1,4 @@ #include QMK_KEYBOARD_H -#include "debug.h" -#include "action_layer.h" #include "version.h" #define BASE 0 // default layer diff --git a/keyboards/ergodox_ez/rules.mk b/keyboards/ergodox_ez/rules.mk index ef2aefbb9ae0..446ba3e21a52 100644 --- a/keyboards/ergodox_ez/rules.mk +++ b/keyboards/ergodox_ez/rules.mk @@ -15,8 +15,7 @@ #---------------------------------------------------------------------------- # # project specific files -SRC = matrix.c \ - i2c_master.c +SRC += matrix.c # MCU name MCU = atmega32u4 @@ -85,4 +84,9 @@ API_SYSEX_ENABLE = no RGBLIGHT_ENABLE = yes RGB_MATRIX_ENABLE = no # enable later +ifeq ($(strip $(RGB_MATRIX_ENABLE)), no) + SRC += i2c_master.c +endif + + LAYOUTS = ergodox From 4d66df5091412bb907bd95eef09a0b7e6567ab55 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sun, 18 Nov 2018 08:59:52 -0800 Subject: [PATCH 437/505] Add default glow board --- .../ergodox_ez/keymaps/default_glow/keymap.c | 1 + .../ergodox_ez/keymaps/default_glow/readme.md | 15 +++++++++++++++ .../ergodox_ez/keymaps/default_glow/rules.mk | 4 ++++ 3 files changed, 20 insertions(+) create mode 100644 keyboards/ergodox_ez/keymaps/default_glow/keymap.c create mode 100644 keyboards/ergodox_ez/keymaps/default_glow/readme.md create mode 100644 keyboards/ergodox_ez/keymaps/default_glow/rules.mk diff --git a/keyboards/ergodox_ez/keymaps/default_glow/keymap.c b/keyboards/ergodox_ez/keymaps/default_glow/keymap.c new file mode 100644 index 000000000000..526c364029f7 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/default_glow/keymap.c @@ -0,0 +1 @@ +// Placeholder. See ../default/keymap.c for details diff --git a/keyboards/ergodox_ez/keymaps/default_glow/readme.md b/keyboards/ergodox_ez/keymaps/default_glow/readme.md new file mode 100644 index 000000000000..1150a4f70983 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/default_glow/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](https://i.imgur.com/Be53jH7.png) \ No newline at end of file diff --git a/keyboards/ergodox_ez/keymaps/default_glow/rules.mk b/keyboards/ergodox_ez/keymaps/default_glow/rules.mk new file mode 100644 index 000000000000..360c3c51b899 --- /dev/null +++ b/keyboards/ergodox_ez/keymaps/default_glow/rules.mk @@ -0,0 +1,4 @@ +RGBLIGHT_ENABLE = no +RGB_MATRIX_ENABLE = yes # enable later + +SRC += ../default/keymap.c From e0690096f8b5199cd6f602bc3a11c234b4309fb2 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Sun, 18 Nov 2018 15:20:21 -0800 Subject: [PATCH 438/505] Fix my community layouts (#4449) * fix formatting of keymap * update readme with boards I currently own * made the wrong assumption that every board would use the same space for backspace * update readme with boards I currently own --- .../60_ansi/mechmerlin-ansi/keymap.c | 26 +++++++++---------- .../60_ansi/mechmerlin-ansi/readme.md | 7 ++--- .../mechmerlin-split/keymap.c | 24 ++++++++--------- .../mechmerlin-split/readme.md | 3 ++- 4 files changed, 31 insertions(+), 29 deletions(-) diff --git a/layouts/community/60_ansi/mechmerlin-ansi/keymap.c b/layouts/community/60_ansi/mechmerlin-ansi/keymap.c index 4128c4cf2d46..12ed6868021d 100644 --- a/layouts/community/60_ansi/mechmerlin-ansi/keymap.c +++ b/layouts/community/60_ansi/mechmerlin-ansi/keymap.c @@ -3,24 +3,24 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BL] = LAYOUT_60_ansi( - KC_GESC, 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_BSLASH, \ - KC_CTCP, 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_SPACE, KC_FNX, KC_RALT, KC_RGUI, KC_RCTL), + KC_GESC, 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_BSLASH, \ + KC_CTCP, 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_SPACE, KC_FNX, KC_RALT, KC_RGUI, KC_RCTL), [_FL] = LAYOUT_60_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, \ - RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + KC_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, \ + RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), [_AL] = LAYOUT_60_ansi( KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RSFT_T(KC_UP), \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RSFT_T(KC_UP), \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT) }; diff --git a/layouts/community/60_ansi/mechmerlin-ansi/readme.md b/layouts/community/60_ansi/mechmerlin-ansi/readme.md index 1c40def2a288..aefd6a992984 100644 --- a/layouts/community/60_ansi/mechmerlin-ansi/readme.md +++ b/layouts/community/60_ansi/mechmerlin-ansi/readme.md @@ -5,9 +5,10 @@ This is the 60% layout used by u/merlin36, host of the [MechMerlin](www.youtube. YouTube channel. It is used on his -[Duck Eagle V2](https://github.com/qmk/qmk_firmware/tree/master/keyboards/eagle_viper/v2) -[KBP V60 Type R Polestar](https://github.com/qmk/qmk_firmware/tree/master/keyboards/v60_type_r) -[NPKC KC60](https://github.com/qmk/qmk_firmware/tree/master/keyboards/kc60) +[Duck Eagle V2](https://github.com/qmk/qmk_firmware/tree/master/keyboards/eagle_viper/v2) +[NPKC KC60](https://github.com/qmk/qmk_firmware/tree/master/keyboards/kc60) +[1up60HSE](https://github.com/qmk/qmk_firmware/tree/master/keyboards/1upkeyboards/1up60hse) +[HS60 V1](https://github.com/qmk/qmk_firmware/tree/master/keyboards/hs60/v1) ## Keymap Notes - Arrow toggle switch is tapping the `FN` key once. diff --git a/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c b/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c index 2464dcaa7091..96c3a32f2692 100644 --- a/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c +++ b/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/keymap.c @@ -3,24 +3,24 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BL] = LAYOUT_60_ansi_split_bs_rshift( - KC_GESC, 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_NO, 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_BSLASH, \ - KC_CTCP, 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, TG(2), \ + KC_GESC, 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_BSLASH, \ + KC_CTCP, 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, TG(2), \ KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, MO(1), KC_RALT, KC_RGUI, KC_RCTL), [_FL] = LAYOUT_60_ansi_split_bs_rshift( - 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_NO, KC_DEL, \ - RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, \ + 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, \ + RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), [_AL] = LAYOUT_60_ansi_split_bs_rshift( - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RSFT_T(KC_UP), KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RSFT_T(KC_UP), KC_TRNS, \ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT) }; diff --git a/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/readme.md b/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/readme.md index 9f7cef347c09..855fd5ac9ec4 100644 --- a/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/readme.md +++ b/layouts/community/60_ansi_split_bs_rshift/mechmerlin-split/readme.md @@ -6,7 +6,8 @@ host of the [MechMerlin](www.youtube.com/mechmerlin) YouTube channel. It is used on his [Sentraq S60-X RGB](https://github.com/qmk/qmk_firmware/tree/master/keyboards/s60_x) -[MechanicalKeyboards.com FaceW](https://github.com/qmk/qmk_firmware/tree/master/keyboards/bfake) +[Zeal60 Rev4](https://github.com/qmk/qmk_firmware/tree/master/keyboards/zeal60) +[DO60](https://github.com/qmk/qmk_firmware/tree/master/keyboards/do60) ## Keymap Notes - Highly influenced by the KBP V60 and WKL B.Face standard layouts From 9e0f68a6522a86625f2586003959fd12b18dd86b Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sun, 18 Nov 2018 17:51:00 -0800 Subject: [PATCH 439/505] Delete readme.md --- .../ergodox_ez/keymaps/default_glow/readme.md | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 keyboards/ergodox_ez/keymaps/default_glow/readme.md diff --git a/keyboards/ergodox_ez/keymaps/default_glow/readme.md b/keyboards/ergodox_ez/keymaps/default_glow/readme.md deleted file mode 100644 index 1150a4f70983..000000000000 --- a/keyboards/ergodox_ez/keymaps/default_glow/readme.md +++ /dev/null @@ -1,15 +0,0 @@ -# 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](https://i.imgur.com/Be53jH7.png) \ No newline at end of file From f03fd950009fdfd9fa0dcb6d343fe22c6ab386cb Mon Sep 17 00:00:00 2001 From: Maarten Dekkers Date: Mon, 19 Nov 2018 21:15:16 +0100 Subject: [PATCH 440/505] Fix permanently on capslock led on Atom47 (#4452) --- keyboards/atom47/rev2/rev2.c | 3 +++ keyboards/atom47/rev3/rev3.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/keyboards/atom47/rev2/rev2.c b/keyboards/atom47/rev2/rev2.c index 31a8561f0c5e..06fce06dad41 100644 --- a/keyboards/atom47/rev2/rev2.c +++ b/keyboards/atom47/rev2/rev2.c @@ -17,6 +17,9 @@ void matrix_scan_kb(void) { void led_init_ports(void) { // * Set our LED pins as output DDRB &= ~(1<<5); + + //Set output high, so the capslock led is off + PORTB |= (1 << 5); } void led_set_kb(uint8_t usb_led) { diff --git a/keyboards/atom47/rev3/rev3.c b/keyboards/atom47/rev3/rev3.c index 2cd04fa767bc..c541ed559c69 100644 --- a/keyboards/atom47/rev3/rev3.c +++ b/keyboards/atom47/rev3/rev3.c @@ -17,6 +17,9 @@ void matrix_scan_kb(void) { void led_init_ports(void) { // * Set our LED pins as output DDRE |= (1 << 6); + + //Set output high, so the capslock led is off + PORTE |= (1 << 6); } void led_set_kb(uint8_t usb_led) { From 26156e84e8913754586b16fecd41f268ede722df Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 19 Nov 2018 16:37:49 -0800 Subject: [PATCH 441/505] Fix UCIS code Revert code change that broke UCIS due to bad suggestions --- quantum/process_keycode/process_ucis.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/quantum/process_keycode/process_ucis.c b/quantum/process_keycode/process_ucis.c index 380199771db6..8deb24a86747 100644 --- a/quantum/process_keycode/process_ucis.c +++ b/quantum/process_keycode/process_ucis.c @@ -93,6 +93,8 @@ void register_ucis(const char *hex) { } bool process_ucis (uint16_t keycode, keyrecord_t *record) { + uint8_t i; + unicode_input_mode_init(); if (!qk_ucis_state.in_progress) @@ -122,7 +124,7 @@ bool process_ucis (uint16_t keycode, keyrecord_t *record) { if (keycode == KC_ENT || keycode == KC_SPC || keycode == KC_ESC) { bool symbol_found = false; - for (uint8_t i = qk_ucis_state.count; i > 0; i--) { + for (i = qk_ucis_state.count; i > 0; i--) { register_code (KC_BSPC); unregister_code (KC_BSPC); wait_ms(UNICODE_TYPE_DELAY); @@ -134,7 +136,7 @@ bool process_ucis (uint16_t keycode, keyrecord_t *record) { } unicode_input_start(); - for (uint8_t i = 0; ucis_symbol_table[i].symbol; i++) { + for (i = 0; ucis_symbol_table[i].symbol; i++) { if (is_uni_seq (ucis_symbol_table[i].symbol)) { symbol_found = true; register_ucis(ucis_symbol_table[i].code + 2); From ad91454574ad1f0fad73923d04d6d1e037e45fed Mon Sep 17 00:00:00 2001 From: Michael Graf Date: Tue, 20 Nov 2018 15:55:35 +0100 Subject: [PATCH 442/505] Adaptive debounce logic The debounce filtering reports a key/switch change directly, without any extra delay. After that the debounce logic will filter all further changes, until the key/switch reports the same state for the given count of scans. So a perfect switch will get a short debounce period and a bad key will get a much longer debounce period. The result is an adaptive debouncing period for each switch. This value defines how often the same key/switch state has to be detected in successive reads until the next key state can be reported. In other words this value defines the minimum debouncing period for a switch. --- keyboards/ergodox_ez/config.h | 17 +++++++----- keyboards/ergodox_ez/matrix.c | 49 ++++++++++++++++++++--------------- 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/keyboards/ergodox_ez/config.h b/keyboards/ergodox_ez/config.h index 7a350183b190..ee768853a981 100644 --- a/keyboards/ergodox_ez/config.h +++ b/keyboards/ergodox_ez/config.h @@ -85,17 +85,20 @@ along with this program. If not, see . #define RGBW 1 -/* "debounce" is measured in keyboard scans. Some users reported - * needing values as high as 15, which was at the time around 50ms. +/* + * The debounce filtering reports a key/switch change directly, + * without any extra delay. After that the debounce logic will filter + * all further changes, until the key/switch reports the same state for + * the given count of scans. + * So a perfect switch will get a short debounce period and + * a bad key will get a much longer debounce period. + * The result is an adaptive debouncing period for each switch. + * * If you don't define it here, the matrix code will default to * 5, which is now closer to 10ms, but still plenty according to * manufacturer specs. - * - * Default is quite high, because of reports with some production - * runs seeming to need it. This may change when configuration for - * this is more directly exposed. */ -#define DEBOUNCE 15 +#define DEBOUNCE 10 #define USB_MAX_POWER_CONSUMPTION 500 diff --git a/keyboards/ergodox_ez/matrix.c b/keyboards/ergodox_ez/matrix.c index 2e95c83b65c6..6d5bfca31a24 100644 --- a/keyboards/ergodox_ez/matrix.c +++ b/keyboards/ergodox_ez/matrix.c @@ -57,6 +57,11 @@ along with this program. If not, see . /* matrix state(1:on, 0:off) */ static matrix_row_t matrix[MATRIX_ROWS]; +/* + * matrix state(1:on, 0:off) + * contains the raw values without debounce filtering of the last read cycle. + */ +static matrix_row_t raw_matrix[MATRIX_ROWS]; // Debouncing: store for each key the number of scans until it's eligible to // change. When scanning the matrix, ignore any changes in keys that have @@ -118,6 +123,7 @@ void matrix_init(void) // initialize matrix state: all keys off for (uint8_t i=0; i < MATRIX_ROWS; i++) { matrix[i] = 0; + raw_matrix[i] = 0; for (uint8_t j=0; j < MATRIX_COLS; ++j) { debounce_matrix[i * MATRIX_COLS + j] = 0; } @@ -151,26 +157,30 @@ void matrix_power_up(void) { // Returns a matrix_row_t whose bits are set if the corresponding key should be // eligible to change in this scan. -matrix_row_t debounce_mask(uint8_t row) { +matrix_row_t debounce_mask(matrix_row_t rawcols, uint8_t row) { matrix_row_t result = 0; - for (uint8_t j=0; j < MATRIX_COLS; ++j) { - if (debounce_matrix[row * MATRIX_COLS + j]) { - --debounce_matrix[row * MATRIX_COLS + j]; + matrix_row_t change = rawcols ^ raw_matrix[row]; + raw_matrix[row] = rawcols; + for (uint8_t i = 0; i < MATRIX_COLS; ++i) { + if (debounce_matrix[row * MATRIX_COLS + i]) { + --debounce_matrix[row * MATRIX_COLS + i]; } else { - result |= (1 << j); + result |= (1 << i); } - } - return result; -} - -// Report changed keys in the given row. Resets the debounce countdowns -// corresponding to each set bit in 'change' to DEBOUNCE. -void debounce_report(matrix_row_t change, uint8_t row) { - for (uint8_t i = 0; i < MATRIX_COLS; ++i) { if (change & (1 << i)) { debounce_matrix[row * MATRIX_COLS + i] = DEBOUNCE; } } + return result; +} + +matrix_row_t debounce_read_cols(uint8_t row) { + // Read the row without debouncing filtering and store it for later usage. + matrix_row_t cols = read_cols(row); + // Get the Debounce mask. + matrix_row_t mask = debounce_mask(cols, row); + // debounce the row and return the result. + return (cols & mask) | (matrix[row] & ~mask);; } uint8_t matrix_scan(void) @@ -214,15 +224,12 @@ uint8_t matrix_scan(void) select_row(i + MATRIX_ROWS_PER_SIDE); // we don't need a 30us delay anymore, because selecting a // left-hand row requires more than 30us for i2c. - matrix_row_t mask = debounce_mask(i); - matrix_row_t cols = (read_cols(i) & mask) | (matrix[i] & ~mask); - debounce_report(cols ^ matrix[i], i); - matrix[i] = cols; + + // grab cols from left hand + matrix[i] = debounce_read_cols(i); // grab cols from right hand - mask = debounce_mask(i + MATRIX_ROWS_PER_SIDE); - cols = (read_cols(i + MATRIX_ROWS_PER_SIDE) & mask) | (matrix[i + MATRIX_ROWS_PER_SIDE] & ~mask); - debounce_report(cols ^ matrix[i + MATRIX_ROWS_PER_SIDE], i + MATRIX_ROWS_PER_SIDE); - matrix[i + MATRIX_ROWS_PER_SIDE] = cols; + matrix[i + MATRIX_ROWS_PER_SIDE] = debounce_read_cols(i + MATRIX_ROWS_PER_SIDE); + unselect_rows(); } From 93c0362552603f2d2517ff3b5afe2667968e3bda Mon Sep 17 00:00:00 2001 From: Nick Piazza Date: Tue, 20 Nov 2018 12:07:20 -0600 Subject: [PATCH 443/505] Update Levinson readme to support elite-c (#4445) * init - updated levinson readme to support elite-c * updated readme per PR comment * added trailing spaces to lines 6 7 8 * updated readme bootloader instructions * updated readme * updated readme --- keyboards/levinson/readme.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/keyboards/levinson/readme.md b/keyboards/levinson/readme.md index 79e64d332e61..8cb4ff1cf795 100644 --- a/keyboards/levinson/readme.md +++ b/keyboards/levinson/readme.md @@ -4,17 +4,25 @@ Levinson A split 40% split 4x12 ortholinear keyboard made and sold by Keebio. It's essentially a Let's Split with LED backlight support and 2u thumb key support. [More info at Keebio](https://keeb.io). Keyboard Maintainer: [Bakingpy/nooges](https://github.com/nooges) -Hardware Supported: Pro Micro +Hardware Supported: Pro Micro, Elite-C Hardware Availability: [Keebio](https://keeb.io) Make example for this keyboard (after setting up your build environment): make levinson/rev2:default -Example of flashing this keyboard: +Example of flashing this keyboard with Pro micro: make levinson/rev2:default:avrdude -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. +Example of flashing this keyboard with Elite-C: + +You'll need to add `BOOTLOADER = atmel-dfu` to your `rules.mk` to ensure that resetting the board works properly. + +Hold the reset button on the Elite-C board, or the reset button on the keyboard if already assembled, then release the button and run: + + make levinson/rev2:default:dfu + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). A build guide for this keyboard can be found here: [Levinson Build Guide](https://docs.keeb.io) From 303fa4ec3337760922a17fb19150c1aa3f58a3b3 Mon Sep 17 00:00:00 2001 From: Michael Kemp <20897849+mkem114@users.noreply.github.com> Date: Wed, 21 Nov 2018 07:11:23 +1300 Subject: [PATCH 444/505] Keyboard: Add Handwired 108 Key with Trackpoint (#4448) * Include both base keyboards * Merge the keymap * Merge the configs * Add wiring diagram for clarity of documentation * Merge rules * Merge keyboard sources * Change names to compile * Update documentation to suit * Add qwerty layout to 108keyTrackpoint * Separate the dvorak standard layout from a media focused one * Update documentation to reflect new keymaps * [style] Add empty lines at ends of files * [style] Meet current QMK style guide * Bring READEME closer to the QMK template * [style] Change all "108keyTrackpoint" to "108key_trackpoint" * [style] Use "LAYOUT" instead of "KEYMAP" QMK terminology has changed Co-Authored-By: mkem114 <20897849+mkem114@users.noreply.github.com> * Add two spaces after maintainer in README This is required to render properly Co-Authored-By: mkem114 <20897849+mkem114@users.noreply.github.com> * Remove redundant line "PREVENT_STUCK_MODIFIERS" is default on for QMK Co-Authored-By: mkem114 <20897849+mkem114@users.noreply.github.com> * Change include of keymaps to use QMK_KEYBOARD_H This includes automatically * Update make rules to match template * Change from KC_MENU to KC_APP The button functionality actually wanted is the context menu key * [style] Change "dvorakMedia" to "dvorak_media" * Update README to reflect minor changes --- .../108key_trackpoint/108key_trackpoint.c | 1 + .../108key_trackpoint/108key_trackpoint.h | 23 ++++++ .../handwired/108key_trackpoint/README.md | 23 ++++++ .../handwired/108key_trackpoint/config.h | 73 +++++++++++++++++ .../keymaps/default/keymap.c | 14 ++++ .../108key_trackpoint/keymaps/dvorak/keymap.c | 14 ++++ .../keymaps/dvorak_media/keymap.c | 14 ++++ .../handwired/108key_trackpoint/rules.mk | 82 +++++++++++++++++++ 8 files changed, 244 insertions(+) create mode 100644 keyboards/handwired/108key_trackpoint/108key_trackpoint.c create mode 100644 keyboards/handwired/108key_trackpoint/108key_trackpoint.h create mode 100644 keyboards/handwired/108key_trackpoint/README.md create mode 100644 keyboards/handwired/108key_trackpoint/config.h create mode 100644 keyboards/handwired/108key_trackpoint/keymaps/default/keymap.c create mode 100644 keyboards/handwired/108key_trackpoint/keymaps/dvorak/keymap.c create mode 100644 keyboards/handwired/108key_trackpoint/keymaps/dvorak_media/keymap.c create mode 100644 keyboards/handwired/108key_trackpoint/rules.mk diff --git a/keyboards/handwired/108key_trackpoint/108key_trackpoint.c b/keyboards/handwired/108key_trackpoint/108key_trackpoint.c new file mode 100644 index 000000000000..3834f89613f0 --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/108key_trackpoint.c @@ -0,0 +1 @@ +#include "108key_trackpoint.h" diff --git a/keyboards/handwired/108key_trackpoint/108key_trackpoint.h b/keyboards/handwired/108key_trackpoint/108key_trackpoint.h new file mode 100644 index 000000000000..100f4cb93284 --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/108key_trackpoint.h @@ -0,0 +1,23 @@ +#pragma once + +#include "quantum.h" + +#define LAYOUT( \ + K000, K002, K003, K004, K005, K007, K008, K009, K010, K011, K012, K013, K014, K015, K016, K017, K019, K020, K021, K022, \ + \ + K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K215, K216, K217, K219, K220, K221, K222, \ + K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, K319, K320, K321, \ + K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K419, K420, K421, K422, \ + K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, K513, K516, K519, K520, K521, \ + K600, K601, K603, K606, K610, K611, K613, K614, K615, K616, K617, K619, K621, K622, \ + K705, K706, K707 \ +) { \ + { K000, KC_NO, K002, K003, K004, K005, KC_NO, K007, K008, K009, K010, K011, K012, K013, K014, K015, K016, K017, KC_NO, K019, K020, K021, K022 }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \ + { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, KC_NO, K214, K215, K216, K217, KC_NO, K219, K220, K221, K222 }, \ + { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, KC_NO, K319, K320, K321, KC_NO }, \ + { K400, KC_NO, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K419, K420, K421, K422 }, \ + { KC_NO, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, KC_NO, K513, KC_NO, KC_NO, K516, KC_NO, KC_NO, K519, K520, K521, KC_NO }, \ + { K600, K601, KC_NO, K603, KC_NO, KC_NO, K606, KC_NO, KC_NO, KC_NO, K610, K611, KC_NO, K613, K614, K615, K616, K617, KC_NO, K619, KC_NO, K621, K622 }, \ + { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K705, K706, K707, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ +} diff --git a/keyboards/handwired/108key_trackpoint/README.md b/keyboards/handwired/108key_trackpoint/README.md new file mode 100644 index 000000000000..247043e1711d --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/README.md @@ -0,0 +1,23 @@ +# 108 Key with TrackPoint + +![wiring](https://raw.githubusercontent.com/qmk/qmk.fm/gh-pages/keyboards/handwired/108key_trackpoint/wiring.JPG) + +This is based off the handwired/trackpoint keyboard and generated code from [Keyboard Firmware Builder](https://kbfirmware.com/). + +Keyboard Maintainer: [mkem114](https://github.com/mkem114) +Hardware Supported (tested): Teensy++ 2.0 + +Make example for this keyboard (after setting up your build environment): + + make handwired/108keyTrackpoint:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + +You may have to modify the source code to suit 104 keys, RGB back-lights, different micro-controllers, or big ass enter. + +There are three keymaps: +* qwerty with the four extra keys being: mute, media prev, media next, and media play +* dvorak with the four extra keys being: mute, media prev, media next, and media play +* dvorak_media with the caps lock being media play and the four extra keys being: mute, volume down, volume up, and media next + +To figure out how to wire your specific TrackPoint have a look out: [How to integrate a trackpoint in a mechanical keyboard](https://github.com/alonswartz/trackpoint). diff --git a/keyboards/handwired/108key_trackpoint/config.h b/keyboards/handwired/108key_trackpoint/config.h new file mode 100644 index 000000000000..7a63fe262861 --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/config.h @@ -0,0 +1,73 @@ +#pragma once + +#include "config_common.h" + +#define VENDOR_ID 0x1234 +#define PRODUCT_ID 0x5678 +#define DEVICE_VER 0x0001 +#define MANUFACTURER QMK +#define PRODUCT 108Key-Trackpoint +#define DESCRIPTION A 108 key ANSI keyboard with a trackpoint and three mouse buttons + +#define MATRIX_ROWS 8 +#define MATRIX_COLS 23 + +#ifdef PS2_USE_USART + #define PS2_CLOCK_PORT PORTD + #define PS2_CLOCK_PIN PIND + #define PS2_CLOCK_DDR DDRD + #define PS2_CLOCK_BIT 5 + #define PS2_DATA_PORT PORTD + #define PS2_DATA_PIN PIND + #define PS2_DATA_DDR DDRD + #define PS2_DATA_BIT 2 + + /* synchronous, odd parity, 1-bit stop, 8-bit data, sample at falling edge */ + /* set DDR of CLOCK as input to be slave */ + #define PS2_USART_INIT() do { \ + PS2_CLOCK_DDR &= ~(1<mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \ +) + diff --git a/keyboards/handwired/108key_trackpoint/keymaps/default/keymap.c b/keyboards/handwired/108key_trackpoint/keymaps/default/keymap.c new file mode 100644 index 000000000000..3345aca16977 --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/keymaps/default/keymap.c @@ -0,0 +1,14 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT ( + 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_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, + + 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_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_PPLS, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_P1, KC_P2, KC_P3, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, KC_LGUI, KC_APP, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT, + KC_BTN1, KC_BTN3, KC_BTN2 + ) +}; diff --git a/keyboards/handwired/108key_trackpoint/keymaps/dvorak/keymap.c b/keyboards/handwired/108key_trackpoint/keymaps/dvorak/keymap.c new file mode 100644 index 000000000000..0181ad9f77b9 --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/keymaps/dvorak/keymap.c @@ -0,0 +1,14 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT ( + 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_MUTE, KC_MPRV, KC_MNXT, KC_MPLY, + + 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, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_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, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + KC_CAPS, 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_P4, KC_P5, KC_P6, KC_PPLS, + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_LSFT, KC_UP, KC_P1, KC_P2, KC_P3, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, KC_LGUI, KC_APP, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT, + KC_BTN1, KC_BTN3, KC_BTN2 + ) +}; diff --git a/keyboards/handwired/108key_trackpoint/keymaps/dvorak_media/keymap.c b/keyboards/handwired/108key_trackpoint/keymaps/dvorak_media/keymap.c new file mode 100644 index 000000000000..d6223c496eb7 --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/keymaps/dvorak_media/keymap.c @@ -0,0 +1,14 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT ( + 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_MUTE, KC_VOLD, KC_VOLU, KC_MNXT, + + 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, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, + KC_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, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, + KC_MPLY, 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_P4, KC_P5, KC_P6, KC_PPLS, + KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_LSFT, KC_UP, KC_P1, KC_P2, KC_P3, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, KC_LGUI, KC_APP, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT, + KC_BTN1, KC_BTN3, KC_BTN2 + ) +}; diff --git a/keyboards/handwired/108key_trackpoint/rules.mk b/keyboards/handwired/108key_trackpoint/rules.mk new file mode 100644 index 000000000000..84ec52eee9f2 --- /dev/null +++ b/keyboards/handwired/108key_trackpoint/rules.mk @@ -0,0 +1,82 @@ +# MCU name +MCU = at90usb1286 +#MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = halfkay + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = 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 = yes # USB Nkey Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) +PS2_MOUSE_ENABLE = yes +PS2_USE_USART = yes From 8837b9d99e59f9d815992352a28a1a515893e805 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Wed, 21 Nov 2018 07:49:28 -0800 Subject: [PATCH 445/505] Fix row 11 --- keyboards/ergodox_ez/matrix.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/keyboards/ergodox_ez/matrix.c b/keyboards/ergodox_ez/matrix.c index 2e95c83b65c6..3ff1c7ab458a 100644 --- a/keyboards/ergodox_ez/matrix.c +++ b/keyboards/ergodox_ez/matrix.c @@ -379,7 +379,7 @@ static void select_row(uint8_t row) break; case 11: DDRD |= (1<<2); - PORTD &= ~(1<<3); + PORTD &= ~(1<<2); break; case 12: DDRD |= (1<<3); @@ -392,4 +392,3 @@ static void select_row(uint8_t row) } } } - From 2f34252278280c34b6958066240e38a2ee6a7237 Mon Sep 17 00:00:00 2001 From: Joe Wasson Date: Wed, 21 Nov 2018 13:18:18 -0800 Subject: [PATCH 446/505] Keymap: Update keymap to match latest changes to Wilba's firmware. (#4432) * Fix firmware to work with latest Wilba changes (i.e. dynamic keymap) and M60a. * Get back RGB Backlight codes. * More tweaks. * Update users/talljoe/rules.mk Co-Authored-By: Talljoe --- keyboards/rama/m60_a/rules.mk | 6 +- .../minivan}/keymaps/talljoe-minivan/config.h | 10 +- .../minivan}/keymaps/talljoe-minivan/keymap.c | 0 .../minivan}/keymaps/talljoe-minivan/rules.mk | 0 .../60_ansi_split_bs_rshift/talljoe/config.h | 2 +- .../60_ansi_split_bs_rshift/talljoe/keymap.c | 95 +------------------ .../community/60_hhkb/talljoe-hhkb/config.h | 3 + .../community/tkl_ansi/talljoe-tkl/keymap.c | 90 +----------------- users/talljoe/config.h | 4 + users/talljoe/rules.mk | 2 + users/talljoe/talljoe.c | 34 ++++++- 11 files changed, 52 insertions(+), 194 deletions(-) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/talljoe-minivan/config.h (94%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/talljoe-minivan/keymap.c (100%) rename keyboards/{tv44 => thevankeyboards/minivan}/keymaps/talljoe-minivan/rules.mk (100%) diff --git a/keyboards/rama/m60_a/rules.mk b/keyboards/rama/m60_a/rules.mk index 7ab1b7d3ba97..9c1a2d9df75e 100644 --- a/keyboards/rama/m60_a/rules.mk +++ b/keyboards/rama/m60_a/rules.mk @@ -54,7 +54,7 @@ BOOTLOADER = atmel-dfu OPT_DEFS += -DNO_SUSPEND_POWER_DOWN # Build Options -# change to "no" to disable the options, or define them in the Makefile in +# 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) @@ -68,7 +68,7 @@ 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. +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend @@ -76,3 +76,5 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend RAW_ENABLE = yes DYNAMIC_KEYMAP_ENABLE = yes CIE1931_CURVE = yes + +LAYOUTS = 60_hhkb diff --git a/keyboards/tv44/keymaps/talljoe-minivan/config.h b/keyboards/thevankeyboards/minivan/keymaps/talljoe-minivan/config.h similarity index 94% rename from keyboards/tv44/keymaps/talljoe-minivan/config.h rename to keyboards/thevankeyboards/minivan/keymaps/talljoe-minivan/config.h index fa1f43adce19..26d5e207e809 100644 --- a/keyboards/tv44/keymaps/talljoe-minivan/config.h +++ b/keyboards/thevankeyboards/minivan/keymaps/talljoe-minivan/config.h @@ -11,7 +11,7 @@ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ -) KEYMAP_ARROW( \ +) LAYOUT_arrow( \ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1D, \ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K0D, \ @@ -24,7 +24,7 @@ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ -) KEYMAP_ARROW( \ +) LAYOUT_arrow( \ K00, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1D, \ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2C, \ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \ @@ -37,14 +37,14 @@ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \ K40, K41, K42, K44, K45, K46, K48, K49, K4B, K4C \ -) KEYMAP_ARROW( \ +) LAYOUT_arrow( \ K00, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K2D, \ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2C, \ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \ - K40, K49, K42, K44, K45, K48, K0B, K0C, K4C \ + K40, K41, K42, K44, K45, K48, K0B, K0C, K4C \ ) -#define TEMPLATE_RESET KEYMAP_ARROW( \ +#define TEMPLATE_RESET LAYOUT_arrow( \ RESET, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RESET, \ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \ diff --git a/keyboards/tv44/keymaps/talljoe-minivan/keymap.c b/keyboards/thevankeyboards/minivan/keymaps/talljoe-minivan/keymap.c similarity index 100% rename from keyboards/tv44/keymaps/talljoe-minivan/keymap.c rename to keyboards/thevankeyboards/minivan/keymaps/talljoe-minivan/keymap.c diff --git a/keyboards/tv44/keymaps/talljoe-minivan/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/talljoe-minivan/rules.mk similarity index 100% rename from keyboards/tv44/keymaps/talljoe-minivan/rules.mk rename to keyboards/thevankeyboards/minivan/keymaps/talljoe-minivan/rules.mk diff --git a/layouts/community/60_ansi_split_bs_rshift/talljoe/config.h b/layouts/community/60_ansi_split_bs_rshift/talljoe/config.h index bf18fd9f7d00..65568d3abf3f 100644 --- a/layouts/community/60_ansi_split_bs_rshift/talljoe/config.h +++ b/layouts/community/60_ansi_split_bs_rshift/talljoe/config.h @@ -34,7 +34,7 @@ { K40, K41, K42, {}, {}, {}, {}, K47, {}, {}, K4A, K4B, K4C, K4D } \ } -#ifdef KEYBOARD_zeal60 +#if defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_M60_A) #define ZEAL_RGB diff --git a/layouts/community/60_ansi_split_bs_rshift/talljoe/keymap.c b/layouts/community/60_ansi_split_bs_rshift/talljoe/keymap.c index cfad9da8a31f..7812add812b3 100644 --- a/layouts/community/60_ansi_split_bs_rshift/talljoe/keymap.c +++ b/layouts/community/60_ansi_split_bs_rshift/talljoe/keymap.c @@ -1,94 +1 @@ -#ifdef KEYBOARD_zeal60 -#include "config.h" -#include "zeal60.h" -#include "rgb_backlight.h" -#include "action_layer.h" -#include "solarized.h" -#include "talljoe.h" - -// from zeal_backlight.c -// we want to be able to set indicators for the spacebar stabs -// but they are not represented by a row/index. -extern backlight_config g_config; -void map_row_column_to_led( uint8_t row, uint8_t column, uint8_t *led ); - -void set_backlight_defaults(void) { - uint8_t space; - uint8_t caps_lock; - map_row_column_to_led(3, 12, &caps_lock); - map_row_column_to_led(4, 7, &space); - backlight_config default_values = { - .use_split_backspace = USE_SPLIT_BACKSPACE, - .use_split_left_shift = USE_SPLIT_LEFT_SHIFT, - .use_split_right_shift = USE_SPLIT_RIGHT_SHIFT, - .use_7u_spacebar = USE_7U_SPACEBAR, - .use_iso_enter = USE_ISO_ENTER, - .disable_when_usb_suspended = 1, - .disable_after_timeout = 0, - .brightness = 255, - .effect = 10, - .color_1 = solarized.base2, - .color_2 = solarized.base02, - .caps_lock_indicator = { .index = caps_lock, .color = solarized.red }, - .layer_1_indicator = { .index = space, .color = solarized.blue }, - .layer_2_indicator = { .index = space, .color = solarized.yellow }, - .layer_3_indicator = { .index = 254, .color = solarized.red }, - .alphas_mods = { - RGB_BACKLIGHT_ALPHAS_MODS_ROW_0, - RGB_BACKLIGHT_ALPHAS_MODS_ROW_1, - RGB_BACKLIGHT_ALPHAS_MODS_ROW_2, - RGB_BACKLIGHT_ALPHAS_MODS_ROW_3, - RGB_BACKLIGHT_ALPHAS_MODS_ROW_4 } - }; - memcpy(&g_config, &default_values, sizeof(backlight_config)); - backlight_config_save(); - -#undef CUSTOM_RGB_LAYOUTS -#ifdef CUSTOM_RGB_LAYOUTS - solarized_t* S = &solarized; - HSV alphas = S->base2; - HSV custom_color_map[MATRIX_ROWS][MATRIX_COLS] = CM( - S->red, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, S->red, - S->orange, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, S->orange, - S->green, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, S->green, - S->blue, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, S->blue, S->blue, - S->violet, S->magenta, S->yellow, alphas, S->yellow, S->magenta, S->violet, S->green - ); - for (uint8_t row = 0; row < MATRIX_ROWS; ++row) { - for (uint8_t col = 0; col < MATRIX_COLS; ++col) { - uint8_t index; - map_row_column_to_led( row, col, &index ); - set_key_color(index, custom_color_map[row][col]); - } - } -#endif // CUSTOM_RGB_LAYOUTS -} - -bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { - static uint8_t last_effect; - switch (keycode) { - case DFAULTS: - if (IS_PRESSED(record->event)) set_backlight_defaults(); - return false; - case BL_TOGG: - if (IS_PRESSED(record->event)) { - if (g_config.effect) { - last_effect = g_config.effect; - g_config.effect = 0; - } else { - g_config.effect = last_effect; - } - } - return false; - case EFFECT...EFFECT_END: - if (IS_PRESSED(record->event)) { - uint8_t effect = keycode - EFFECT; - g_config.effect = effect; - backlight_config_save(); - } - return false; - } - - return true; -} -#endif +// This space intentionally left blank diff --git a/layouts/community/60_hhkb/talljoe-hhkb/config.h b/layouts/community/60_hhkb/talljoe-hhkb/config.h index 9e907feeb53a..54756a940b63 100644 --- a/layouts/community/60_hhkb/talljoe-hhkb/config.h +++ b/layouts/community/60_hhkb/talljoe-hhkb/config.h @@ -19,4 +19,7 @@ K41, K42, K45, K48, K4C \ ) +#ifdef RGB_BACKLIGHT_M60_A + #define ZEAL_RGB +#endif #endif //CONFIG_USER_H diff --git a/layouts/community/tkl_ansi/talljoe-tkl/keymap.c b/layouts/community/tkl_ansi/talljoe-tkl/keymap.c index b5dc54492761..7812add812b3 100644 --- a/layouts/community/tkl_ansi/talljoe-tkl/keymap.c +++ b/layouts/community/tkl_ansi/talljoe-tkl/keymap.c @@ -1,89 +1 @@ -#ifdef KEYBOARD_zeal60 -#include "config.h" -#include "zeal60.h" -#include "zeal_backlight.h" -#include "action_layer.h" -#include "solarized.h" -#include "talljoe.h" - -// from zeal_backlight.c -// we want to be able to set indicators for the spacebar stabs -// but they are not represented by a row/index. -extern zeal_backlight_config g_config; -void map_row_column_to_led( uint8_t row, uint8_t column, uint8_t *led ); - -void set_backlight_defaults(void) { - uint8_t space; - uint8_t caps_lock; - map_row_column_to_led(3, 12, &caps_lock); - map_row_column_to_led(4, 7, &space); - zeal_backlight_config default_values = { - .use_split_backspace = USE_SPLIT_BACKSPACE, - .use_split_left_shift = USE_SPLIT_LEFT_SHIFT, - .use_split_right_shift = USE_SPLIT_RIGHT_SHIFT, - .use_7u_spacebar = USE_7U_SPACEBAR, - .use_iso_enter = USE_ISO_ENTER, - .disable_when_usb_suspended = 1, - .disable_after_timeout = 0, - .brightness = 255, - .effect = 10, - .color_1 = solarized.base2, - .color_2 = solarized.base02, - .caps_lock_indicator = { .index = caps_lock, .color = solarized.red }, - .layer_1_indicator = { .index = space, .color = solarized.blue }, - .layer_2_indicator = { .index = space, .color = solarized.yellow }, - .layer_3_indicator = { .index = 254, .color = solarized.red }, - .alphas_mods = { - BACKLIGHT_ALPHAS_MODS_ROW_0, - BACKLIGHT_ALPHAS_MODS_ROW_1, - BACKLIGHT_ALPHAS_MODS_ROW_2, - BACKLIGHT_ALPHAS_MODS_ROW_3, - BACKLIGHT_ALPHAS_MODS_ROW_4 } - }; - memcpy(&g_config, &default_values, sizeof(zeal_backlight_config)); - backlight_config_save(); - - solarized_t* S = &solarized; - HSV alphas = S->base2; - HSV custom_color_map[MATRIX_ROWS][MATRIX_COLS] = CM( - S->red, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, S->red, - S->orange, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, S->orange, - S->green, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, S->green, - S->blue, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, alphas, S->blue, S->blue, - S->violet, S->magenta, S->yellow, alphas, S->yellow, S->magenta, S->violet, S->green - ); - for (uint8_t row = 0; row < MATRIX_ROWS; ++row) { - for (uint8_t col = 0; col < MATRIX_COLS; ++col) { - backlight_set_key_color(row, col, custom_color_map[row][col]); - } - } -} - -bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { - static uint8_t last_effect; - switch (keycode) { - case DFAULTS: - if (IS_PRESSED(record->event)) set_backlight_defaults(); - return false; - case BL_TOGG: - if (IS_PRESSED(record->event)) { - if (g_config.effect) { - last_effect = g_config.effect; - g_config.effect = 0; - } else { - g_config.effect = last_effect; - } - } - return false; - case EFFECT...EFFECT_END: - if (IS_PRESSED(record->event)) { - uint8_t effect = keycode - EFFECT; - g_config.effect = effect; - backlight_config_save(); - } - return false; - } - - return true; -} -#endif +// This space intentionally left blank diff --git a/users/talljoe/config.h b/users/talljoe/config.h index 0d06a0b12d8a..33374014dfae 100644 --- a/users/talljoe/config.h +++ b/users/talljoe/config.h @@ -5,4 +5,8 @@ #define RESET_LAYER 15 +#define BOOTMAGIC_KEY_SALT KC_ESC +#define BOOTMAGIC_KEY_SKIP KC_I +#define BOOTMAGIC_KEY_EEPROM_CLEAR KC_E + #endif // !USERSPACE_CONFIG_H diff --git a/users/talljoe/rules.mk b/users/talljoe/rules.mk index 0f1f6f26a61e..e0a71561f467 100644 --- a/users/talljoe/rules.mk +++ b/users/talljoe/rules.mk @@ -5,3 +5,5 @@ EXTRAFLAGS+=-flto TAP_DANCE_ENABLE=yes CONSOLE_ENABLE=no COMMAND_ENABLE=no +DYNAMIC_KEYMAP_ENABLE=no +BOOTMAGIC_ENABLE=full diff --git a/users/talljoe/talljoe.c b/users/talljoe/talljoe.c index 7a343e7768c5..e72dc6c3e0e5 100644 --- a/users/talljoe/talljoe.c +++ b/users/talljoe/talljoe.c @@ -1,13 +1,16 @@ #include QMK_KEYBOARD_H #include "talljoe.h" +#ifdef ZEAL_RGB +#include "../../../keyboards/zeal60/rgb_backlight.h" +#endif const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_BASE] = TEMPLATE_TKL( 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, MO_ADJ , US_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 , US_BSLS, KC_INS , KC_HOME, KC_PGUP, US_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_DEL , KC_END , KC_PGDN, - CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G , KC_H, KC_J, KC_K, KC_L, US_SCLN, US_QUOT, US_ENT , + CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G , KC_H, KC_J, KC_K, KC_L, US_SCLN, KC_QUOT, US_ENT , SH_LBRC, KC_Z, KC_X, KC_C, KC_V, KC_B , KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SH_RBRC, KC_UP , KC_LCTL, KC_LGUI, KC_LALT, KC_SPC2, KC_SPC1, KC_SPC3, KC_RALT, KC_RGUI, KC_RCTL, KC_PTT , KC_LEFT, KC_DOWN, KC_RGHT), [_WORKMAN] = TEMPLATE( @@ -52,7 +55,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_PTT , KC_PGDN, KC_SPC , KC_SPC , KC_SPC , KC_RALT, KC_APP , KC_RCTL, KC_PTT ), #endif [_NAV] = TEMPLATE_NAV( - KC_GRV , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, + 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 , XXXXXXX, XXXXXXX, US_TAB , KC_EXLM, KC_AT , KC_HASH, KC_DLR , KC_PERC, KC_INS , KC_PGUP, KC_UP , KC_PGDN, KC_BTN1, KC_BTN3, KC_BTN2, KC_DEL , CTL_ESC, KC_LCBR, KC_RCBR, KC_LPRN, KC_RPRN, KC_AMPR, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END , US_QUOT, TG_ADJ , KC_LSFT, KC_EQL, KC_PLUS, KC_MINS, KC_UNDS, KC_ASTR, KC_CALC, US_GRV , KC_WBAK, KC_WFWD, KC_WREF, KC_RSFT, KC_APP , @@ -65,7 +68,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_LCTL, KC_LGUI, KC_LALT, NM_SPC2, NM_SPC1, NM_SPC3, KC_PDOT, KC_PCMM, KC_RCTL, KC_PTT ), // Adjust layer is on the split-shift key; or NAV+Enter (for non-split keyboards) [_ADJUST] = TEMPLATE_ADJUST( - MO_RST , FX(1) , FX(2) , FX(3) , FX(4) , FX(5) , FX(8) , FX(9) , FX(10) , FX(20) , FX(0) , BR_DEC , BR_INC , XXXXXXX, MO_RST , + MO_RST , FX(1) , FX(2) , FX(3) , FX(4) , FX(5) , FX(6) , FX(7) , FX(8) , FX(9) , FX(10) , BR_DEC , BR_INC , XXXXXXX, MO_RST , MO_RST , H1_INC , S1_INC , H2_INC , S2_INC , EF_INC , RGB_HUI, RGB_SAI, RGB_MOD, RGB_M_P, DFAULTS, RGB_VAD, RGB_VAI, MO_RST , XXXXXXX, H1_DEC , S1_DEC , H2_DEC , S2_DEC , EF_DEC , RGB_HUD, RGB_SAD, RGB_RMOD,RGB_M_K, RGB_M_B, RGB_M_G, TG_ADJ , TG_NKRO, LY_QWER, LY_WORK, LY_NRMN, LY_DVRK, LY_CLMK, XXXXXXX, LY_MALT, XXXXXXX, XXXXXXX, KC_MAKE, KC_CAPS, XXXXXXX, @@ -101,7 +104,11 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { return true; } +#ifdef ZEAL_RGB +extern backlight_config g_config; +#endif bool process_record_user(uint16_t keycode, keyrecord_t *record) { + static uint8_t last_effect; #ifdef RGBLIGHT_ENABLE static uint32_t savedRgbMode; @@ -144,6 +151,27 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { } return false; break; +#ifdef ZEAL_RGB + case BL_TOGG: + if (IS_PRESSED(record->event)) { + if (g_config.effect) { + last_effect = g_config.effect; + g_config.effect = 0; + } else { + g_config.effect = last_effect; + } + } + return false; + case EFFECT...EFFECT_END: + if (IS_PRESSED(record->event)) { + uint8_t effect = keycode - EFFECT; + if(effect == g_config.effect) + effect = 0; // Toggle effect on second press + g_config.effect = effect; + backlight_config_save(); + } + return false; +#endif } return process_record_keymap(keycode, record); } From 87f06e7297c10020912beaba10013f11d2e8e570 Mon Sep 17 00:00:00 2001 From: yiancar Date: Wed, 21 Nov 2018 15:12:40 -0800 Subject: [PATCH 447/505] Fix raw hid define for chibios (#4460) --- tmk_core/protocol/chibios/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c index 6cceccd23c7a..ee9571c950de 100644 --- a/tmk_core/protocol/chibios/main.c +++ b/tmk_core/protocol/chibios/main.c @@ -75,7 +75,7 @@ host_driver_t chibios_driver = { void virtser_task(void); #endif -#ifdef RAW_HID_ENABLE +#ifdef RAW_ENABLE void raw_hid_task(void); #endif @@ -220,7 +220,7 @@ int main(void) { #ifdef VIRTSER_ENABLE virtser_task(); #endif -#ifdef RAW_HID_ENABLE +#ifdef RAW_ENABLE raw_hid_task(); #endif } From 2943d19ecd9f91db2390da6f6d09cf58ea2f8dde Mon Sep 17 00:00:00 2001 From: Milton Griffin Date: Thu, 22 Nov 2018 13:15:46 -0500 Subject: [PATCH 448/505] Keymap: Clone layout for Massdrop's xd75 (#4461) * Added default75. No lighting. * Added default75. No lighting. * Update keyboards/idobo/keymaps/default75/config.h Co-Authored-By: griffinmilton3 * Update keyboards/idobo/keymaps/default75/config.h Co-Authored-By: griffinmilton3 * Update keyboards/idobo/keymaps/default75/config.h Co-Authored-By: griffinmilton3 * Update keyboards/idobo/keymaps/default75/config.h Co-Authored-By: griffinmilton3 * Fixes for pull request * Updated keyboard declartion structure --- keyboards/idobo/keymaps/default75/config.h | 21 +++++++ keyboards/idobo/keymaps/default75/keymap.c | 67 +++++++++++++++++++++ keyboards/idobo/keymaps/default75/readme.md | 1 + keyboards/idobo/keymaps/default75/rules.mk | 14 +++++ 4 files changed, 103 insertions(+) create mode 100644 keyboards/idobo/keymaps/default75/config.h create mode 100644 keyboards/idobo/keymaps/default75/keymap.c create mode 100644 keyboards/idobo/keymaps/default75/readme.md create mode 100644 keyboards/idobo/keymaps/default75/rules.mk diff --git a/keyboards/idobo/keymaps/default75/config.h b/keyboards/idobo/keymaps/default75/config.h new file mode 100644 index 000000000000..17c7addb3858 --- /dev/null +++ b/keyboards/idobo/keymaps/default75/config.h @@ -0,0 +1,21 @@ +/* Copyright 2017 Benjamin Kesselring + * + * 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 + + +// place overrides here + diff --git a/keyboards/idobo/keymaps/default75/keymap.c b/keyboards/idobo/keymaps/default75/keymap.c new file mode 100644 index 000000000000..d607e11f6684 --- /dev/null +++ b/keyboards/idobo/keymaps/default75/keymap.c @@ -0,0 +1,67 @@ +/* Copyright 2018 Milton Griffin + * + * 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 QMK_KEYBOARD_H + +// Keyboard Layers +#define _QW 0 +#define _FN 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* QWERTY + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | - | ` | = | 6 | 7 | 8 | 9 | 0 | BACKSP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * | TAB | Q | W | E | R | T | [ | \ | ] | Y | U | I | O | P | ' | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------| + * | CAP LK | A | S | D | F | G | HOME | DEL | PG UP | H | J | K | L | ; | ENTER | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| + * | LSHIFT | Z | X | C | V | B | END | UP | PG DN | N | M | , | . | / | RSHIFT | + * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| + * | LCTRL | LGUI | LALT | FN | SPACE | SPACE | LEFT | DOWN | RIGHT | SPACE | SPACE | FN | RALT | RGUI | RCTRL | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_QW] = LAYOUT_ortho_5x15( /* QWERTY */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_GRV, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_BSLS, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_QUOT, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_HOME, KC_DEL, KC_PGUP, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, KC_UP, KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, MO(_FN), KC_SPC, KC_SPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_SPC, KC_SPC, MO(_FN), KC_RALT, KC_RGUI, KC_RCTL \ + ), + +/* FUNCTION + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | NUM LK | P/ | P* | F7 | F8 | F9 | F10 | F11 | F12 | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | SELECT | CALC | MYCOMP | MAIL | RGB HD | RGB HI | P7 | P8 | P9 | - | | | PR SCR | SCR LK | PAUSE | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | PREV | PLAY | NEXT | STOP | RGB SD | RGB SI | P4 | P5 | P6 | + | | RESET | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | VOL- | MUTE | VOL+ | APP | RGB VD | RGB VI | P1 | P2 | P3 | PENT | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | RGB TG | FN | RGB RMD| RGB MD | P0 | | P. | PENT | PENT | FN | | | | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_FN] = LAYOUT_ortho_5x15( /* FUNCTION */ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_NLCK, KC_SLSH, KC_ASTR, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + KC_MSEL, KC_CALC, KC_MYCM, KC_MAIL, RGB_HUD, RGB_HUI, KC_P7, KC_P8, KC_P9, KC_MINS, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, \ + KC_MPRV, KC_MPLY, KC_MNXT, KC_MSTP, RGB_SAD, RGB_SAI, KC_P4, KC_P5, KC_P6, KC_PLUS, _______, RESET, _______, _______, _______, \ + KC_VOLD, KC_MUTE, KC_VOLU, KC_APP, RGB_VAD, RGB_VAI, KC_P1, KC_P2, KC_P3, KC_PENT, _______, _______, _______, _______, _______, \ + _______, _______, RGB_TOG, MO(_FN), RGB_RMOD,RGB_MOD, KC_P0, _______, KC_PDOT, KC_PENT, KC_PENT, MO(_FN), _______, _______, _______ \ + ), +}; diff --git a/keyboards/idobo/keymaps/default75/readme.md b/keyboards/idobo/keymaps/default75/readme.md new file mode 100644 index 000000000000..a1c0236ed9cd --- /dev/null +++ b/keyboards/idobo/keymaps/default75/readme.md @@ -0,0 +1 @@ +# The default keymap for xd75, with led controls \ No newline at end of file diff --git a/keyboards/idobo/keymaps/default75/rules.mk b/keyboards/idobo/keymaps/default75/rules.mk new file mode 100644 index 000000000000..7efceba50a84 --- /dev/null +++ b/keyboards/idobo/keymaps/default75/rules.mk @@ -0,0 +1,14 @@ +# 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 . From 3dd6d53942bd3fafb57d170ecdaccf57e459a62c Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Thu, 22 Nov 2018 21:53:01 +0100 Subject: [PATCH 449/505] ergodox: update algernon's layout to v1.12 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is the final version of my layout. Overall changes =============== * Updated to work with QMK master. Miscellaneous ============= * The `😂` symbol can be entered with UCIS. * `LEAD r` now inputs `Right Alt`. Signed-off-by: Gergely Nagy --- layouts/community/ergodox/algernon/NEWS.md | 13 +++++++++++++ .../ergodox/algernon/images/adore-layer.png | Bin 0 -> 105611 bytes .../ergodox/algernon/images/base-layer.png | Bin 0 -> 106956 bytes .../ergodox/algernon/images/heatmap.png | Bin 0 -> 139351 bytes .../ergodox/algernon/images/steno-layer.png | Bin 0 -> 64086 bytes layouts/community/ergodox/algernon/keymap.c | 8 +++++++- layouts/community/ergodox/algernon/readme.md | 12 +++++++++--- layouts/community/ergodox/algernon/rules.mk | 3 ++- 8 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 layouts/community/ergodox/algernon/images/adore-layer.png create mode 100644 layouts/community/ergodox/algernon/images/base-layer.png create mode 100644 layouts/community/ergodox/algernon/images/heatmap.png create mode 100644 layouts/community/ergodox/algernon/images/steno-layer.png diff --git a/layouts/community/ergodox/algernon/NEWS.md b/layouts/community/ergodox/algernon/NEWS.md index 1bc2b5dc6aa4..a6ce9813baf7 100644 --- a/layouts/community/ergodox/algernon/NEWS.md +++ b/layouts/community/ergodox/algernon/NEWS.md @@ -1,5 +1,18 @@ +## v1.12 + +*2018-11-22* + +### Overall changes + +* Updated to work with QMK master. + +### Miscellaneous + +* The `😂` symbol can be entered with UCIS. +* `LEAD r` now inputs `Right Alt`. + ## v1.11 *2017-10-01* diff --git a/layouts/community/ergodox/algernon/images/adore-layer.png b/layouts/community/ergodox/algernon/images/adore-layer.png new file mode 100644 index 0000000000000000000000000000000000000000..75d2ca4f08b23b8233b298b0a30cb62b4072f0a3 GIT binary patch literal 105611 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

xqo?w3DlN6!_qw#HiY181nm>q#U@mnY&IM#Z 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μ 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 b_teo#A$ozE$1_6VotDnm{r-UW|3c5md literal 0 HcmV?d00001 diff --git a/layouts/community/ergodox/algernon/images/heatmap.png b/layouts/community/ergodox/algernon/images/heatmap.png new file mode 100644 index 0000000000000000000000000000000000000000..4f55c5adff5703a3b61ac5198694375ad49a405b GIT binary patch literal 139351 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%0D`~mx$kQG~ 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 EiAZ?2R`sI*BO+iJbgi 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�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 Z|BMfpRh#Y%&J|?<0#8>zmvv4FO#mw&Ym)!~ literal 0 HcmV?d00001 diff --git a/layouts/community/ergodox/algernon/images/steno-layer.png b/layouts/community/ergodox/algernon/images/steno-layer.png new file mode 100644 index 0000000000000000000000000000000000000000..9a2ba55effaa0b96f9bf9d31b81f3c2101c93ab9 GIT binary patch literal 64086 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

    I(Bex;?A5`xsbLM>%eo#im~+Z z;!rcdVK)^9{_rP4l-A!8uV(I2BoSs}2WbF@PP7**bk)D;5e*YQ>p*I~I?yZ|pO3Mul-teB1vDy>QJ4gTF1t42-;g*fP zxCrFDHctD5+YXnvSkvv^_393mpDYn)Ekx z|1?naod;VwhX~P!*z_FhmgtxmA_Pg;o1GDPTuxS+Mb%iRhd`0-%Pt(E0ebsrjFBET z9p+ZOERptl5Rt4-0~!y*%!|fAH&^EYCxA7hS3?xTUNW&NIc? z`!+r}lcKmU-|^qIYboDRSq0Ys(njM8OF~J&Qt{V=@VScRQmFl)#o)SurcW}D4vmh2c0z`QD;_J$aIq++){e4@WAu+dFG_S| zH?h@FxmNR_*R>8_e*(v2`(vR+T9Xbg13Bc;6&xOtTB-r_h6HAz<_84Tzn3(O-f!RG zGPitVBv#>5l3qLYM=tkM?ZE2jBC;geHZo(Y><(8_y@mg-lHkOINL4K7eV`fSw-3Gp z-bTC__vSHj(+Yy}Qrx_(mq=NXKS35eh+09*v$hxQ*NlMo5?WP&^A2OnYWvhIS!BGQ zuOMnrKVA5j>8m0@eKXQRmSh{~*^bUXUh@zl%89~NAzkzeon{_h65tNXkjqK3ZLNa=;-t9I7UccQx>44Ou`>^M?+QYOM|>K#2Abs#9}XaS4M>(~J87`oXXM ze|S|l)W_$N`7wHX+-wlJR~5fb7bSujgLAa3!iBAvauPzr(DLZ+-tdYj9)t@S)_@*1 z!9QLRv@N^xfEm`3sKD4A_1{lHV#qEJHpS}bbI!AS!rP(oAeOoC&jL7^o zwBZkC%<$Fk;?MwMz<FT1O-;7{ z*u*no`${MiqnN% ztv_#bp!dv`*C5b47zcpOx(kn^oq7!=(BSU;y`4xAThXb87(-y{ulYtb)Z!ml)~^Ie zSH{P`1rOk2D!V_Pn)VnN9chQM=;}To!RhL&@)Ug1 z3ioO3bX$OkRn10W9DXPyUz~-2oJqPTyi1ZMcY4PWqyJ=+w(Kz&#zz$EDbf+;o=ro>KkGSNFNU-+PM6Pz%%tD6x9l9huJ# z-}+w*f+wu8&`f{*OAi61v{TdW=`A-d1V3PX{!PBYD6eYag$3Y{>Fks>58Ur|^!Utj z$b8?>=<4@$cgAW*)Uxya?vX+@+?O|kf$E%K^%S(n9637RZWVBGZDs?UioK{xax4yR zTKaAObEbO>#tkSiYI-G^?P&KAhduaIj+-}chMv^xZAofrY4yh08wmR${E8ei_D*?@IPDLY)R?24X5VA0E=SRE`0hU^ECE zZL;Nk7)P7gXBM)3YFEgYTJYI1JXu#h-C01*<|Zyai3M%EMObN8Wv>#4RwNl@cjd(t7a`&QJ4=;F}-@VD)&lLVZ< zpx9Joi69nZApd=L#H{oS1Q{m#msocHe4u+WyQM3$315v038Nl-feeGW6<1okr9kPJ zdQ!Ldsgj6yh)_~e*711k5o6yO4@rv;iy%#$Eg*v9V@)0NPaOLsapy26L!nQh^p
    CcLe37MIpPU7c2mSwI|7<>w0ruuV?0Ylbvs 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�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 Cm1|c3 literal 0 HcmV?d00001 diff --git a/layouts/community/ergodox/algernon/keymap.c b/layouts/community/ergodox/algernon/keymap.c index ebdc4ab4e499..fb6de1b721d5 100644 --- a/layouts/community/ergodox/algernon/keymap.c +++ b/layouts/community/ergodox/algernon/keymap.c @@ -13,6 +13,7 @@ #include "eeconfig.h" #include "wait.h" #include "version.h" +#include "print.h" /* Layers */ @@ -1033,6 +1034,10 @@ void matrix_scan_user(void) { } #endif + SEQ_ONE_KEY (KC_R) { + ang_tap(KC_RALT, 0); + } + SEQ_ONE_KEY (KC_T) { time_travel = !time_travel; } @@ -1126,7 +1131,8 @@ const qk_ucis_symbol_t ucis_symbol_table[] = UCIS_TABLE UCIS_SYM("micro", 0x00b5), UCIS_SYM("tm", 0x2122), UCIS_SYM("child", 0x1f476), - UCIS_SYM("family", 0x1F46A) + UCIS_SYM("family", 0x1F46A), + UCIS_SYM("joy", 0x1F602) ); bool process_record_user (uint16_t keycode, keyrecord_t *record) { diff --git a/layouts/community/ergodox/algernon/readme.md b/layouts/community/ergodox/algernon/readme.md index 03b094edb2cb..a25018a7bc66 100644 --- a/layouts/community/ergodox/algernon/readme.md +++ b/layouts/community/ergodox/algernon/readme.md @@ -3,7 +3,12 @@ algernon's layout ======================= -This is an unconventional layout for the [ErgoDox EZ][ez]. For more details about the history of the layout, see my [blog posts about my ErgoDox journey][blog-ergodox]. +This is the layout I used to use on my [ErgoDox EZ][ez], while I was using [QMK][qmk]. I no longer do so, and this repository is obsolete, and not updated anymore. My current firmware is based on [Kaleidoscope][kaleidoscope], and is located [elsewhere][ergodox-sketch]. I'm keeping the repo around for historical and educational purposes. + + [kaleidoscope]: https://github.com/keyboardio/Kaleidoscope + [ergodox-sketch]: https://git.madhouse-project.org/algernon/ErgoDox-sketch + +Nevertheless, this is an unconventional layout for the [ErgoDox EZ][ez]. For more details about the history of the layout, see my [blog posts about my ErgoDox journey][blog-ergodox]. [ez]: https://ergodox-ez.com/ [blog-ergodox]: https://asylum.madhouse-project.org/blog/tags/ergodox/ @@ -57,6 +62,7 @@ At its core, this is a Dvorak layout, with some minor changes. The more interest - `LEAD d` toggles logging keypress positions to the HID console. - `LEAD t` toggles time travel. Figuring out the current `date` is left as an exercise to the reader. - `LEAD u` enters the [Unicode symbol input](#unicode-symbol-input) mode. + - `LEAD r` inputs `Right Alt`, which is the `Compose` key of my choice. The symbols on the front in the image above have the same color as the key that activates them, with the exception of the **Arrow** layer, which is just black on the front. @@ -128,13 +134,13 @@ $ git clone https://github.com/qmk/qmk_firmware.git $ cd qmk_firmware $ git clone https://github.com/algernon/ergodox-layout.git \ layouts/community/ergodox/algernon_master -$ make ergodox_ez-algernon_master +$ make ergodox_ez:algernon_master ``` From time to time, updates may be submitted back to the QMK repository. If you are reading it there, you can build the firmware like any other firmware included with it (assuming you are in the root directory of the firmware): ``` -$ make ergodox_ez-algernon +$ make ergodox_ez:algernon ``` ## Using on Windows diff --git a/layouts/community/ergodox/algernon/rules.mk b/layouts/community/ergodox/algernon/rules.mk index 53dec5153afe..1b4c0995f63e 100644 --- a/layouts/community/ergodox/algernon/rules.mk +++ b/layouts/community/ergodox/algernon/rules.mk @@ -9,8 +9,9 @@ KEYLOGGER_ENABLE ?= yes UCIS_ENABLE = yes MOUSEKEY_ENABLE = no LEADER_ENABLE = yes +RGBLIGHT_ENABLE = no -AUTOLOG_ENABLE ?= no +AUTOLOG_ENABLE ?= yes ifeq (${FORCE_NKRO},yes) OPT_DEFS += -DFORCE_NKRO From ee8627e078dccab722f05fbf9bb152eca1b2ee7b Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Fri, 23 Nov 2018 20:07:53 -0800 Subject: [PATCH 450/505] Add EEPROM_RESET keycode to keycodes.md doc (#4473) --- docs/keycodes.md | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/docs/keycodes.md b/docs/keycodes.md index 30fe60278f10..1c5f46d6ecea 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -206,18 +206,19 @@ This is a reference only. Each group of keys links to the page documenting their ## [Quantum Keycodes](quantum_keycodes.md#qmk-keycodes) -|Key |Aliases |Description | -|-------------|-----------|---------------------------------------------------------------------| -|`RESET` | |Put the keyboard into DFU mode for flashing | -|`DEBUG` | |Toggle debug mode | -|`KC_GESC` |`GRAVE_ESC`|Escape when tapped, ` when pressed with Shift or GUI| -|`KC_LSPO` | |Left Shift when held, `(` when tapped | -|`KC_RSPC` | |Right Shift when held, `)` when tapped | -|`KC_LEAD` | |The [Leader key](feature_leader_key.md) | -|`KC_LOCK` | |The [Lock key](feature_key_lock.md) | -|`FUNC(n)` |`F(n)` |Call `fn_action(n)` (deprecated) | -|`M(n)` | |Call macro `n` | -|`MACROTAP(n)`| |Macro-tap `n` idk FIXME | +|Key |Aliases |Description | +|---------------|-----------|---------------------------------------------------------------------| +|`RESET` | |Put the keyboard into DFU mode for flashing | +|`DEBUG` | |Toggle debug mode | +|`EEPROM_RESET` |`EEP_RST` |Resets EEPROM state by reinitializing it | +|`KC_GESC` |`GRAVE_ESC`|Escape when tapped, ` when pressed with Shift or GUI| +|`KC_LSPO` | |Left Shift when held, `(` when tapped | +|`KC_RSPC` | |Right Shift when held, `)` when tapped | +|`KC_LEAD` | |The [Leader key](feature_leader_key.md) | +|`KC_LOCK` | |The [Lock key](feature_key_lock.md) | +|`FUNC(n)` |`F(n)` |Call `fn_action(n)` (deprecated) | +|`M(n)` | |Call macro `n` | +|`MACROTAP(n)` | |Macro-tap `n` idk FIXME | ## [Audio Keys](feature_audio.md) From 7bc7c34d4f7e8bda5859696fba9bacc5e47de512 Mon Sep 17 00:00:00 2001 From: Jasper Lievisse Adriaanse Date: Sat, 24 Nov 2018 17:40:48 +0100 Subject: [PATCH 451/505] Add RCTL to my Planck layout (#4475) --- keyboards/planck/keymaps/jasperla/keymap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboards/planck/keymaps/jasperla/keymap.c b/keyboards/planck/keymaps/jasperla/keymap.c index 14f445d0f20f..b9eb72b073c8 100644 --- a/keyboards/planck/keymaps/jasperla/keymap.c +++ b/keyboards/planck/keymaps/jasperla/keymap.c @@ -46,14 +46,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------|------+------+------+------+------+------| * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift | * |------+------+------+------+------+------+------+------+------+------+------+------| - * | Ctrl | | LGUI | Alt |Lower | SPC | Enter|Raise |Point.| | LOCK | | + * | Ctrl | | LGUI | Alt |Lower | SPC | Enter|Raise |Point.| | LOCK | Ctrl | * `-----------------------------------------------------------------------------------' */ [_QWERTY] = LAYOUT_planck_grid( 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_RSFT , - KC_LCTL, _______, KC_LGUI, KC_LALT, LOWER, KC_SPC, KC_ENT, RAISE, PT, _______, LOCK, _______ + 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, LOWER, KC_SPC, KC_ENT, RAISE, PT, _______, LOCK, KC_RCTL ), /* Lower From 3363743bf78fa5efc9a6a70f13925f4c95745641 Mon Sep 17 00:00:00 2001 From: xjacobx Date: Sat, 24 Nov 2018 11:41:39 -0500 Subject: [PATCH 452/505] Adding my new keymap for the Idobo (#4468) * Adding my new keymap, based of xd75, with leds enabled via the rules.mk file * cleaned up the rules file * Per Change Requests: removed deprecated functions along with updated the map to use the layout macro instead of raw matrix --- .../idobo/keymaps/xaceofspaidsx/config.h | 19 ++++++ .../idobo/keymaps/xaceofspaidsx/keymap.c | 67 +++++++++++++++++++ .../idobo/keymaps/xaceofspaidsx/readme.md | 1 + .../idobo/keymaps/xaceofspaidsx/rules.mk | 19 ++++++ 4 files changed, 106 insertions(+) create mode 100644 keyboards/idobo/keymaps/xaceofspaidsx/config.h create mode 100644 keyboards/idobo/keymaps/xaceofspaidsx/keymap.c create mode 100644 keyboards/idobo/keymaps/xaceofspaidsx/readme.md create mode 100644 keyboards/idobo/keymaps/xaceofspaidsx/rules.mk diff --git a/keyboards/idobo/keymaps/xaceofspaidsx/config.h b/keyboards/idobo/keymaps/xaceofspaidsx/config.h new file mode 100644 index 000000000000..a3ed4f762a6e --- /dev/null +++ b/keyboards/idobo/keymaps/xaceofspaidsx/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 MechMerlin + * + * 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 + +// place overrides here diff --git a/keyboards/idobo/keymaps/xaceofspaidsx/keymap.c b/keyboards/idobo/keymaps/xaceofspaidsx/keymap.c new file mode 100644 index 000000000000..c157317e2dec --- /dev/null +++ b/keyboards/idobo/keymaps/xaceofspaidsx/keymap.c @@ -0,0 +1,67 @@ +/* Copyright 2018 xAceOfSpaidsx + * + * 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 QMK_KEYBOARD_H + +// Layer shorthand +#define _QW 0 +#define _FN 1 + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* QWERTY - based off xd75 default map with a couple modifications for my preference + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | ESC | 1 | 2 | 3 | 4 | 5 | F2 | ` | F5 | 6 | 7 | 8 | 9 | 0 | BACKSP | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------| + * | TAB | Q | W | E | R | T | - | \ | = | Y | U | I | O | P | ' | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------| + * | CAP LK | A | S | D | F | G | HOME | DEL | PG UP | H | J | K | L | ; | ENTER | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------| + * | LSHIFT | Z | X | C | V | B | END | UP | PG DN | N | M | , | . | / | RSHIFT | + * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------| + * | LCTRL | LGUI | LALT | FN | SPACE | SPACE | LEFT | DOWN | RIGHT | [ | ] | FN | RALT | RGUI | RCTRL | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_QW] = LAYOUT_ortho_5x15( /* QWERTY */ + KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_F2, KC_GRV, KC_F5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \ + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_MINS, KC_BSLS, KC_EQL, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_QUOT, \ + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_HOME, KC_DEL, KC_PGUP, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, \ + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_END, KC_UP, KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \ + KC_LCTL, KC_LGUI, KC_LALT, MO(_FN), KC_SPC, KC_SPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_LBRC, KC_RBRC, MO(_FN), KC_RALT, KC_RGUI, KC_RCTL \ + ), + +/* FUNCTION Layer - removed the rgb hue saturation and vibrance for audio controls and added some functionality I use from other boards. + * .--------------------------------------------------------------------------------------------------------------------------------------. + * | F1 | F2 | F3 | F4 | F5 | F6 | NUM LK | P/ | P* | F7 | F8 | F9 | F10 | F11 | F12 | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | SELECT | CALC | UP | | | NEXT | P7 | P8 | P9 | - | | | PR SCR | SCR LK | PAUSE | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | PREV | LEFT | DOWN | RIGHT | DEL | PLAY | P4 | P5 | P6 | + | | RESET | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | VOL- | MUTE | VOL+ | APP | | STOP | P1 | P2 | P3 | PENT | | | | | | + * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + * | | | RGB TG | FN | RGB RMD| RGB MD | P0 | | P. | PENT | PENT | FN | | | | + * '--------------------------------------------------------------------------------------------------------------------------------------' + */ + + [_FN] = LAYOUT_ortho_5x15( /* FUNCTION */ + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_NLCK, KC_SLSH, KC_ASTR, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \ + KC_MSEL, KC_CALC, KC_UP , _______, _______, KC_MNXT, KC_P7, KC_P8, KC_P9, KC_MINS, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, \ + KC_MPRV, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL , KC_MPLY, KC_P4, KC_P5, KC_P6, KC_PLUS, _______, RESET, _______, _______, _______, \ + KC_VOLD, KC_MUTE, KC_VOLU, KC_APP, _______, KC_MSTP, KC_P1, KC_P2, KC_P3, KC_PENT, _______, _______, _______, _______, _______, \ + _______, _______, RGB_TOG, MO(_FN), RGB_RMOD,RGB_MOD, KC_P0, _______, KC_PDOT, KC_PENT, KC_PENT, MO(_FN), _______, _______, _______ \ + ), +}; diff --git a/keyboards/idobo/keymaps/xaceofspaidsx/readme.md b/keyboards/idobo/keymaps/xaceofspaidsx/readme.md new file mode 100644 index 000000000000..ac6e74702c0a --- /dev/null +++ b/keyboards/idobo/keymaps/xaceofspaidsx/readme.md @@ -0,0 +1 @@ +# Updated the keymap, based off XD75 default, to meet my needs. Refer to rules.mk to enable or disable rgb and other features. diff --git a/keyboards/idobo/keymaps/xaceofspaidsx/rules.mk b/keyboards/idobo/keymaps/xaceofspaidsx/rules.mk new file mode 100644 index 000000000000..b973e9d8b3dd --- /dev/null +++ b/keyboards/idobo/keymaps/xaceofspaidsx/rules.mk @@ -0,0 +1,19 @@ +# 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 . + +#Had to disable the first 2 to get the firmware size down enough after enabling the rgb controls. +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +COMMAND_ENABLE = no # Commands for debug and configuration +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow From f0db40ff113a768f53de1197817b3a31bc32e9ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= Date: Sat, 24 Nov 2018 16:48:42 +0000 Subject: [PATCH 453/505] fix diffutils arch package name (#4470) --- util/linux_install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/linux_install.sh b/util/linux_install.sh index 0e8296c0d22b..70b389c0da54 100755 --- a/util/linux_install.sh +++ b/util/linux_install.sh @@ -61,9 +61,9 @@ elif grep ID /etc/os-release | grep -q 'arch\|manjaro'; then avr-binutils \ avr-libc \ avr-gcc \ - base-devel \ + base-devel \ dfu-util \ - diff-utils \ + diffutils \ gcc \ git \ unzip \ From d7ab738ca687a6ea923ce286f7cb81a5125b86ba Mon Sep 17 00:00:00 2001 From: Colin Kahn Date: Sun, 25 Nov 2018 18:38:46 -0800 Subject: [PATCH 454/505] Adding keymap layers for 40precentclub/foobar (#4481) --- .../foobar/keymaps/default/config.h | 2 + .../foobar/keymaps/default/keymap.c | 57 ++++++++++++++++--- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/keyboards/40percentclub/foobar/keymaps/default/config.h b/keyboards/40percentclub/foobar/keymaps/default/config.h index 6173b63272f6..bedc27ba85e7 100644 --- a/keyboards/40percentclub/foobar/keymaps/default/config.h +++ b/keyboards/40percentclub/foobar/keymaps/default/config.h @@ -17,3 +17,5 @@ #pragma once // place overrides here + +#define PERMISSIVE_HOLD diff --git a/keyboards/40percentclub/foobar/keymaps/default/keymap.c b/keyboards/40percentclub/foobar/keymaps/default/keymap.c index 774f1e854266..1be4b38dd9d6 100644 --- a/keyboards/40percentclub/foobar/keymaps/default/keymap.c +++ b/keyboards/40percentclub/foobar/keymaps/default/keymap.c @@ -15,19 +15,62 @@ */ #include QMK_KEYBOARD_H -#define FN1_Q LT(1, KC_Q) +enum foobar_layers { + QWERTY, + FN1, + FN2, + FN3, + FN4, + FN5 +}; + +#define FN1_SPC LT(FN1, KC_SPC) +#define FN2_BSC LT(FN2, KC_BSPC) +#define FN3_C LT(FN3, KC_C) +#define FN4_V LT(FN4, KC_V) +#define FN5_B LT(FN5, KC_B) +#define RALT_N RALT_T(KC_N) +#define LALT_X LALT_T(KC_X) +#define LCTL_Z LCTL_T(KC_Z) +#define RCTL_M RCTL_T(KC_M) +#define LSFT_ENT LSFT_T(KC_ENT) +#define RGUI_ESC RGUI_T(KC_ESC) const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT_split( - FN1_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_ESC, - KC_Z, KC_X, KC_C, KC_V, KC_BSPC, KC_SPC, KC_B, KC_N, KC_M, KC_ENT + [QWERTY] = LAYOUT_split( + 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, RGUI_ESC, + LCTL_Z, LALT_X, FN3_C, FN4_V, FN2_BSC, FN1_SPC, FN5_B, RALT_N, RCTL_M, LSFT_ENT + ), + + [FN1] = LAYOUT_split( + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, + KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, + _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, _______ + ), + + [FN2] = LAYOUT_split( + KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, + KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, _______, KC_GRV, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + + [FN3] = LAYOUT_split( + _______, _______, _______, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, + KC_TAB, _______, _______, _______, _______, KC_COMM, KC_DOT, KC_SLSH, KC_SCLN, KC_QUOT, + _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT + ), + + [FN4] = LAYOUT_split( + _______, _______, _______, _______, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, + KC_TAB, _______, _______, _______, _______, KC_LABK, KC_RABK, KC_QUES, KC_COLN, KC_DQUO, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), - [1] = LAYOUT_split( + [FN5] = LAYOUT_split( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, RESET, _______, _______, _______ + _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______ ), }; From 834b555eca47392ec0bf367b7f20694919d79a00 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sun, 25 Nov 2018 18:40:48 -0800 Subject: [PATCH 455/505] Keymap FAQ: fix positions of KC_HENK and KC_MHEN for JIS layout (#4482) These keys were previously in each other's positions. --- docs/faq_keymap.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/faq_keymap.md b/docs/faq_keymap.md index 07d74d6cf3ef..4e842d363cee 100644 --- a/docs/faq_keymap.md +++ b/docs/faq_keymap.md @@ -11,8 +11,8 @@ Keycodes are actually defined in [common/keycode.h](https://github.com/qmk/qmk_f There are 3 standard keyboard layouts in use around the world- ANSI, ISO, and JIS. North America primarily uses ANSI, Europe and Africa primarily use ISO, and Japan uses JIS. Regions not mentioned typically use either ANSI or ISO. The keycodes corresponding to these layouts are shown here: - -![Keyboard Layout Image](https://i.imgur.com/gvlNUpQ.png) + +![Keyboard Layout Image](https://i.imgur.com/5wsh5wM.png) ## Some Of My Keys Are Swapped Or Not Working From ccd4da941cb38839b60994302d453821fb88a1b1 Mon Sep 17 00:00:00 2001 From: Will Homer <392260+WillFour20@users.noreply.github.com> Date: Mon, 26 Nov 2018 15:57:30 +0000 Subject: [PATCH 456/505] Add Espectro ISO layout (#4479) * Add Espectro ISO layout * Remove unused define from Espectro ISO layout --- keyboards/espectro/keymaps/iso/keymap.c | 88 +++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100755 keyboards/espectro/keymaps/iso/keymap.c diff --git a/keyboards/espectro/keymaps/iso/keymap.c b/keyboards/espectro/keymaps/iso/keymap.c new file mode 100755 index 000000000000..d22e7aac4b78 --- /dev/null +++ b/keyboards/espectro/keymaps/iso/keymap.c @@ -0,0 +1,88 @@ +/* Copyright 2018 @TurboMech /u/TurboMech @A9entOran9e#6134 + * + * 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 QMK_KEYBOARD_H + +#define _BL 0 //Base layer +#define _FN1 1 //Function layer + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* BL +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | | | | | | +| ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DELETE | P SCN | HOME | END | P UP | P DOWN | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| ` | | | | | | | | | | | | | BACK | NUM | | | | +| ¬ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | _ - | = + | SPACE | LOCK | / | * | - | +|________|________|________|________|________|________|________|________|________|________|________|________|________|_________________|________|________|________|________| +| | | | | | | | | | | | [ | ] | | | | | | +| TAB | Q | W | E | R | T | Y | U | I | O | P | { | } | | 7 | 8 | 9 | | +|____________|________|________|________|________|________|________|________|________|________|________|________|________|__ ENTER |________|________|________| + | +| | | | | | | | | | | ; | ' | # | | | | | | +| CAPS LOCK | A | S | D | F | G | H | J | K | L | : | @ | ~ | | 4 | 5 | 6 | | +|______________|________|________|________|________|________|________|________|________|________|________|________|________|___________|________|________|________|________| +| | \ | | | | | | | | , | . | / | | | | | | | +| SHIFT | | | Z | X | C | V | B | N | M | < | > | ? | SHIFT | UP | 1 | 2 | 3 | | +|__________|_______|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| ENTER | +| | | | | | | MO | | | | | | | +| CTRL | LGUI | L ALT | SPACE | R ALT | R CTRL | _FN | LEFT | DOWN | RIGHT | 0 | . | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| + */ + + [_BL] = LAYOUT_split_shift_and_bs( + 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_DEL, KC_PSCR, KC_HOME, KC_END, KC_PGUP, KC_PGDN, + 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_NO, KC_BSPC, 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_NUHS, 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_NO, 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_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT, KC_NO + ), + +/* FN_1 +____________________________________________________________________________________________________________________________________________________________________________ +| | | | | | | | | | | | | | | VOL | VOL | NEXT | | | +| RESET | | | | | | | | | | | | | MUTE | DOWN | UP | TRACK | HOME | END | +|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________|________| +| | RGB | RGB | RGB | RGB | RGB | RGB | RGB | RGB | | | | | | | | | | +| | TOGGLE | MODE |INCREASE|DECREASE| HUE | HUE | SAT | | | | | | DELETE | | | | | +|________|________|________|________|________|INCREASE|DECREASE|INCREASE|DECREASE|________|________|________|________|_________________|________|________|________|________| +| | BACK | BACK | | | | | | | | | | | | | | | | +| | LIGHT | LIGHT | | | | | | | | | | | | | | | | +|____________| TOGGLE |INCREASE|DECREASE|________|________|________|________|________|________|________|________|________|__ |________|________|________| | +| | | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | | +|______________|________|________|________|________|________|________|________|________|________|________|________|________|___________|________|________|________|________| +| | | | | | | | | | | | | | | | | | | +| | | | | | | | | | | | | | | | | | | +|__________|_______|________|________|________|________|________|________|________|________|________|________|________________|________|________|________|________| | +| | | | | | | | | | | | | | +| | | | | | | | | | | | | | +|__________|__________|__________|________________________________________________________|________|________|________|________|________|________|________|________|________| + */ + + [_FN1] = LAYOUT_split_shift_and_bs( + RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT, KC_HOME, KC_END, + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, _______, _______, KC_DEL, _______, _______, _______, _______, + _______, BL_TOGG, BL_INC, BL_DEC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + ), + +}; + From 6266c172b9363aa950cf13c52bed7674aae0375d Mon Sep 17 00:00:00 2001 From: Elliot Powell <32494740+e11i0t23@users.noreply.github.com> Date: Mon, 26 Nov 2018 15:58:53 +0000 Subject: [PATCH 457/505] added ep/96 as a supported keyboard (#4476) * added ep/96 * Update keyboards/ep/96/readme.md Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * removed led code * Update keyboards/ep/96/config.h Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * Update keyboards/ep/96/info.json Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> * Update keyboards/ep/96/readme.md Co-Authored-By: e11i0t23 <32494740+e11i0t23@users.noreply.github.com> --- keyboards/ep/96/96.c | 43 +++ keyboards/ep/96/96.h | 47 +++ keyboards/ep/96/config.h | 212 +++++++++++ keyboards/ep/96/info.json | 426 ++++++++++++++++++++++ keyboards/ep/96/keymaps/default/keymap.c | 67 ++++ keyboards/ep/96/keymaps/default/readme.md | 1 + keyboards/ep/96/readme.md | 15 + keyboards/ep/96/rules.mk | 81 ++++ 8 files changed, 892 insertions(+) create mode 100644 keyboards/ep/96/96.c create mode 100644 keyboards/ep/96/96.h create mode 100644 keyboards/ep/96/config.h create mode 100644 keyboards/ep/96/info.json create mode 100644 keyboards/ep/96/keymaps/default/keymap.c create mode 100644 keyboards/ep/96/keymaps/default/readme.md create mode 100644 keyboards/ep/96/readme.md create mode 100644 keyboards/ep/96/rules.mk diff --git a/keyboards/ep/96/96.c b/keyboards/ep/96/96.c new file mode 100644 index 000000000000..9fdd51977d4c --- /dev/null +++ b/keyboards/ep/96/96.c @@ -0,0 +1,43 @@ +/* Copyright 2018 Elliot Powell + * + * 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 "96.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/ep/96/96.h b/keyboards/ep/96/96.h new file mode 100644 index 000000000000..1887eb472c02 --- /dev/null +++ b/keyboards/ep/96/96.h @@ -0,0 +1,47 @@ +/* Copyright 2018 Elliot Powell + * + * 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 EP96_H +#define EP96_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define xxxx KC_NO + +#define LAYOUT( \ + K000, K001, K002, k003, k004, k005, k006, k007, k008, k009, k010, k011, k012, k013, k014, k015, k016, k017, k018, \ + K100, K101, K102, k103, k104, k105, k106, k107, k108, k109, k110, k111, k112, k114, k115, k116, k117, k118, \ + K200, K202, k203, k204, k205, k206, k207, k208, k209, k210, k211, k212, k213, k215, k216, k217, \ + K300, K302, k303, k304, k305, k306, k307, k308, k309, k310, k311, k312, k313, k314, k315, k316, k317, k318, \ + K400, K401, K402, k403, k404, k405, k406, k407, k408, k409, k410, k411, k413, k414, k415, k416, k417, \ + K500, K501, K502, k506, k511, k512, k513, k514, k515, k516, k517, k518) \ +{ \ + {K000, K001, K002, k003, k004, k005, k006, k007, k008, k009, k010, k011, k012, k013, k014, k015, k016, k017, k018}, \ + {K100, K101, K102, k103, k104, k105, k106, k107, k108, k109, k110, k111, k112, xxxx, k114, k115, k116, k117, k118}, \ + {K200, xxxx, K202, k203, k204, k205, k206, k207, k208, k209, k210, k211, k212, k213, xxxx, k215, k216, k217, xxxx}, \ + {K300, xxxx, K302, k303, k304, k305, k306, k307, k308, k309, k310, k311, k312, k313, k314, k315, k316, k317, k318}, \ + {K400, K401, K402, k403, k404, k405, k406, k407, k408, k409, k410, k411, xxxx, k413, k414, k415, k416, k417, xxxx}, \ + {K500, K501, K502, xxxx, xxxx, xxxx, k506, xxxx, xxxx, xxxx, xxxx, k511, k512, k513, k514, k515, k516, k517, k518} \ +} + +#endif diff --git a/keyboards/ep/96/config.h b/keyboards/ep/96/config.h new file mode 100644 index 000000000000..0c37e4c5960e --- /dev/null +++ b/keyboards/ep/96/config.h @@ -0,0 +1,212 @@ +/* +Copyright 2018 Elliot Powell + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x9696 +#define DEVICE_VER 0x0001 +#define MANUFACTURER Elliot Powell +#define PRODUCT ep96 +#define DESCRIPTION A simple 96 key keyboard + +/* key matrix size */ +#define MATRIX_ROWS 6 +#define MATRIX_COLS 19 + +/* + * 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 { B0, B1, B3, B2, B7, C6 } +#define MATRIX_COL_PINS { D0, D1, D2, D3, D5, D4, D6, D7, B4, B5, B6, C7, F7, F6, F5, F4, F1, F0, E6 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +// #endif + +/* 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 + + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + diff --git a/keyboards/ep/96/info.json b/keyboards/ep/96/info.json new file mode 100644 index 000000000000..4be41b24c3fa --- /dev/null +++ b/keyboards/ep/96/info.json @@ -0,0 +1,426 @@ +{ + "keyboard_name": "ep96", + "maintainer": "e11i0t23", + "width": 19, + "height": 6, + "layouts": { + "LAYOUT": { + "key_count": 100, + "layout": [{ + "label": "Esc", + "x": 0, + "y": 0 + }, { + "label": "F1", + "x": 1, + "y": 0 + }, { + "label": "F2", + "x": 2, + "y": 0 + }, { + "label": "F3", + "x": 3, + "y": 0 + }, { + "label": "F4", + "x": 4, + "y": 0 + }, { + "label": "F5", + "x": 5, + "y": 0 + }, { + "label": "F6", + "x": 6, + "y": 0 + }, { + "label": "F7", + "x": 7, + "y": 0 + }, { + "label": "F8", + "x": 8, + "y": 0 + }, { + "label": "F9", + "x": 9, + "y": 0 + }, { + "label": "F10", + "x": 10, + "y": 0 + }, { + "label": "F11", + "x": 11, + "y": 0 + }, { + "label": "F12", + "x": 12, + "y": 0 + }, { + "label": "Prt Sc", + "x": 13, + "y": 0 + }, { + "label": "Delete", + "x": 14, + "y": 0 + }, { + "label": "home", + "x": 15, + "y": 0 + }, { + "label": "Menu", + "x": 16, + "y": 0 + }, { + "label": "Pg Up", + "x": 17, + "y": 0 + }, { + "label": "Pg Dn", + "x": 18, + "y": 0 + }, { + "label": "~", + "x": 0, + "y": 1 + }, { + "label": "!", + "x": 1, + "y": 1 + }, { + "label": "@", + "x": 2, + "y": 1 + }, { + "label": "#", + "x": 3, + "y": 1 + }, { + "label": "$", + "x": 4, + "y": 1 + }, { + "label": "%", + "x": 5, + "y": 1 + }, { + "label": "^", + "x": 6, + "y": 1 + }, { + "label": "&", + "x": 7, + "y": 1 + }, { + "label": "*", + "x": 8, + "y": 1 + }, { + "label": "(", + "x": 9, + "y": 1 + }, { + "label": ")", + "x": 10, + "y": 1 + }, { + "label": "_", + "x": 11, + "y": 1 + }, { + "label": "+", + "x": 12, + "y": 1 + }, { + "label": "Backspace", + "x": 13, + "y": 1, + "w": 2 + }, { + "label": "Num Lock", + "x": 15, + "y": 1 + }, { + "label": "/", + "x": 16, + "y": 1 + }, { + "label": "*", + "x": 17, + "y": 1 + }, { + "label": "-", + "x": 18, + "y": 1 + }, { + "label": "Tab", + "x": 0, + "y": 2, + "w": 1.5 + }, { + "label": "Q", + "x": 1.5, + "y": 2 + }, { + "label": "W", + "x": 2.5, + "y": 2 + }, { + "label": "E", + "x": 3.5, + "y": 2 + }, { + "label": "R", + "x": 4.5, + "y": 2 + }, { + "label": "T", + "x": 5.5, + "y": 2 + }, { + "label": "Y", + "x": 6.5, + "y": 2 + }, { + "label": "U", + "x": 7.5, + "y": 2 + }, { + "label": "I", + "x": 8.5, + "y": 2 + }, { + "label": "O", + "x": 9.5, + "y": 2 + }, { + "label": "P", + "x": 10.5, + "y": 2 + }, { + "label": "{", + "x": 11.5, + "y": 2 + }, { + "label": "}", + "x": 12.5, + "y": 2 + }, { + "label": "Enter", + "x": 13.75, + "y": 2, + "w": 1.25, + "h": 2 + }, { + "label": "7", + "x": 15, + "y": 2 + }, { + "label": "8", + "x": 16, + "y": 2 + }, { + "label": "9", + "x": 17, + "y": 2 + }, { + "label": "+", + "x": 18, + "y": 2, + "h": 2 + }, { + "label": "Caps Lock", + "x": 0, + "y": 3, + "w": 1.75 + }, { + "label": "A", + "x": 1.75, + "y": 3 + }, { + "label": "S", + "x": 2.75, + "y": 3 + }, { + "label": "D", + "x": 3.75, + "y": 3 + }, { + "label": "F", + "x": 4.75, + "y": 3 + }, { + "label": "G", + "x": 5.75, + "y": 3 + }, { + "label": "H", + "x": 6.75, + "y": 3 + }, { + "label": "J", + "x": 7.75, + "y": 3 + }, { + "label": "K", + "x": 8.75, + "y": 3 + }, { + "label": "L", + "x": 9.75, + "y": 3 + }, { + "label": ":", + "x": 10.75, + "y": 3 + }, { + "label": "\"", + "x": 11.75, + "y": 3 + }, { + "label": "~", + "x": 12.75, + "y": 3 + }, { + "label": "4", + "x": 15, + "y": 3 + }, { + "label": "5", + "x": 16, + "y": 3 + }, { + "label": "6", + "x": 17, + "y": 3 + }, { + "label": "Shift", + "x": 0, + "y": 4, + "w": 1.25 + }, { + "label": "|", + "x": 1.25, + "y": 4 + }, { + "label": "Z", + "x": 2.25, + "y": 4 + }, { + "label": "X", + "x": 3.25, + "y": 4 + }, { + "label": "C", + "x": 4.25, + "y": 4 + }, { + "label": "V", + "x": 5.25, + "y": 4 + }, { + "label": "B", + "x": 6.25, + "y": 4 + }, { + "label": "N", + "x": 7.25, + "y": 4 + }, { + "label": "M", + "x": 8.25, + "y": 4 + }, { + "label": "<", + "x": 9.25, + "y": 4 + }, { + "label": ">", + "x": 10.25, + "y": 4 + }, { + "label": "?", + "x": 11.25, + "y": 4 + }, { + "label": "Shift", + "x": 12.25, + "y": 4, + "w": 1.75 + }, { + "label": "\u2191", + "x": 14, + "y": 4 + }, { + "label": "1", + "x": 15, + "y": 4 + }, { + "label": "2", + "x": 16, + "y": 4 + }, { + "label": "3", + "x": 17, + "y": 4 + }, { + "label": "Enter", + "x": 18, + "y": 4, + "h": 2 + }, { + "label": "Ctrl", + "x": 0, + "y": 5, + "w": 1.25 + }, { + "label": "Win", + "x": 1.25, + "y": 5, + "w": 1.25 + }, { + "label": "Alt", + "x": 2.5, + "y": 5, + "w": 1.25 + }, { + "x": 3.75, + "y": 5, + "w": 6.25 + }, { + "label": "Alt", + "x": 10, + "y": 5, + "w": 1.5 + }, { + "label": "Crtl", + "x": 11.5, + "y": 5, + "w": 1.5 + }, { + "label": "\u2190", + "x": 13, + "y": 5 + }, { + "label": "\u2193", + "x": 14, + "y": 5 + }, { + "label": "\u2192", + "x": 15, + "y": 5 + }, { + "label": "0", + "x": 16, + "y": 5 + }, { + "label": ".", + "x": 17, + "y": 5 + }] + } + } +} diff --git a/keyboards/ep/96/keymaps/default/keymap.c b/keyboards/ep/96/keymaps/default/keymap.c new file mode 100644 index 000000000000..d5120415359d --- /dev/null +++ b/keyboards/ep/96/keymaps/default/keymap.c @@ -0,0 +1,67 @@ +/* Copyright 2018 Elliot Powell + * + * 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 QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( /* Base */ + 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_DEL, KC_HOME, KC_END, KC_PGUP, KC_PGDN, \ + 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_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_P7, KC_P8, KC_P9, \ + 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_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS, \ + KC_LSFT, KC_BSLS, 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_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT \ + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/ep/96/keymaps/default/readme.md b/keyboards/ep/96/keymaps/default/readme.md new file mode 100644 index 000000000000..81e87464f0ce --- /dev/null +++ b/keyboards/ep/96/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for ep96 \ No newline at end of file diff --git a/keyboards/ep/96/readme.md b/keyboards/ep/96/readme.md new file mode 100644 index 000000000000..404419b63ae1 --- /dev/null +++ b/keyboards/ep/96/readme.md @@ -0,0 +1,15 @@ +# ep96 + +![ep96](https://i.imgur.com/PZ2C7a8.jpg) + +A simple 96 key keyboard + +Keyboard Maintainer: Keyboard Maintainer: [Elliot Powell](https://github.com/e11i0t23), [/u/e11i0t23](https://reddit.com/u/e11i0t23) +Hardware Supported: EP96 PCB +Hardware Availability: Possible availability upon request + +Make example for this keyboard (after setting up your build environment): + + make ep/96:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/ep/96/rules.mk b/keyboards/ep/96/rules.mk new file mode 100644 index 000000000000..407135de2e20 --- /dev/null +++ b/keyboards/ep/96/rules.mk @@ -0,0 +1,81 @@ +# MCU name +#MCU = at90usb1286 +MCU = atmega32u4 + +# Processor frequency. +# This will define a symbol, F_CPU, in all source code files equal to the +# processor frequency in Hz. You can then use this symbol in your source code to +# calculate timings. Do NOT tack on a 'UL' at the end, this will be done +# automatically to create a 32-bit value in your source code. +# +# This will be an integer division of F_USB below, as it is sourced by +# F_USB after it has run through any CPU prescalers. Note that this value +# does not *change* the processor frequency - it should merely be updated to +# reflect the processor speed set externally so that the code can use accurate +# software delays. +F_CPU = 16000000 + + +# +# LUFA specific +# +# Target architecture (see library "Board Types" documentation). +ARCH = AVR8 + +# Input clock frequency. +# This will define a symbol, F_USB, in all source code files equal to the +# input clock frequency (before any prescaling is performed) in Hz. This value may +# differ from F_CPU if prescaling is used on the latter, and is required as the +# raw input clock is fed directly to the PLL sections of the AVR for high speed +# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL' +# at the end, this will be done automatically to create a 32-bit value in your +# source code. +# +# If no clock division is performed on the input clock inside the AVR (via the +# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU. +F_USB = $(F_CPU) + +# Interrupt driven control endpoint task(+60) +OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = 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 +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From 8bc19c8dcf8b32c57baff7e548793be756a5e4f4 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 26 Nov 2018 08:09:37 -0800 Subject: [PATCH 458/505] Fix Blockey compiler (and size) issues (#4390) --- keyboards/blockey/rules.mk | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/keyboards/blockey/rules.mk b/keyboards/blockey/rules.mk index e217305bff24..fb628cfaa3ad 100644 --- a/keyboards/blockey/rules.mk +++ b/keyboards/blockey/rules.mk @@ -1,5 +1,3 @@ -SRC += ws2812.c - # MCU name #MCU = at90usb1286 MCU = atmega32u4 @@ -54,7 +52,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 # change yes to no to disable # 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 = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration From 97ab3211e2ace7a5cbf7bd2a21723ed751286c99 Mon Sep 17 00:00:00 2001 From: mwpeterson Date: Mon, 26 Nov 2018 12:26:26 -0500 Subject: [PATCH 459/505] Keymap: add Interrobang (#4420) * remove clmk and dvrk and backlight; switch esc and enter to be modtap; add meh key * change songs * space cadet; move enter; move '"; move pgup pgdn * remove extra songs * update from noahfredrick keymap * make it easier to type ../../thing/*/* * move pipe * requested changes * add interrobang support * add shift-insert to raise-v and lower-v, move pipe to raise-/lower-n --- keyboards/planck/keymaps/mwpeterson/keymap.c | 27 ++++++++++++++++---- keyboards/planck/keymaps/mwpeterson/rules.mk | 13 +++++----- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/keyboards/planck/keymaps/mwpeterson/keymap.c b/keyboards/planck/keymaps/mwpeterson/keymap.c index bfb015c7a8bc..961b8394bccd 100644 --- a/keyboards/planck/keymaps/mwpeterson/keymap.c +++ b/keyboards/planck/keymaps/mwpeterson/keymap.c @@ -35,6 +35,19 @@ enum planck_layers { #define WM_W LALT(LGUI(KC_LEFT)) #define WM_CNTR LALT(LGUI(KC_C)) +#define SFT_INS LSFT(KC_INS) + +// Unicode +#ifdef UNICODEMAP_ENABLE +enum unicode_name { + IBANG // ‽ +}; + +const uint32_t PROGMEM unicode_map[] = { + [IBANG] = 0x0203D // ‽ +}; +#endif // UNICODEMAP_ENABLE + // Custom key codes enum planck_keycodes { QWERTY = SAFE_RANGE, @@ -81,7 +94,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * window ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ * switcher │ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ │ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ - * │ │ - │ + │ ` │ | │ : │ │ │ , │ . │ \ │ │ + * │ │ - │ + │ ` │SFTIN│ : │ | │ ‽ │ , │ . │ \ │ │ * ├─────┼─────┼─────┼─────┼─────┼─────┴─────┼─────┼─────┼─────┼─────┼─────┤ * │ │ │ │ │ │ Backspace │ │ │ │ │ │ * └─────┴─────┴─────┴─────┴─────┴───────────┴─────┴─────┴─────┴─────┴─────┘ @@ -89,8 +102,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LOWER_LAYER] = LAYOUT_planck_grid( KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, S(KC_3), _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, - _______, KC_MINS, KC_PLUS, KC_GRV, KC_PIPE, KC_COLN, XXXXXXX, XXXXXXX, KC_COMM, KC_DOT, KC_BSLS, _______, - _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, _______, _______, _______, _______ + _______, KC_MINS, KC_PLUS, KC_GRV, SFT_INS, KC_COLN, KC_PIPE, X(IBANG), KC_COMM, KC_DOT, KC_BSLS, _______, + _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, _______, _______, _______, _______ ), /* Symbol layer @@ -99,7 +112,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ * │ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ' │ " │ │ \ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ |-- Mostly shifted version - * │ │ _ │ = │ ~ │ | │ : │ │ │ , │ . │ / │ │ / of lower layer + * │ │ _ │ = │ ~ │SFTIN│ : │ | │ │ , │ . │ / │ │ / of lower layer * ├─────┼─────┼─────┼─────┼─────┼─────┴─────┼─────┼─────┼─────┼─────┼─────┤ * │ │ │ │ │ │ Delete │ │ │ │ │ │ * └─────┴─────┴─────┴─────┴─────┴───────────┴─────┴─────┴─────┴─────┴─────┘ @@ -107,7 +120,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [RAISE_LAYER] = LAYOUT_planck_grid( S(KC_GRV), KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, S(KC_3), _______, S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), KC_QUOT, S(KC_QUOT), _______, - _______, KC_UNDS, KC_EQL, KC_TILD, KC_PIPE, KC_COLN, XXXXXXX, XXXXXXX, KC_COMM, KC_DOT, KC_SLSH, _______, + _______, KC_UNDS, KC_EQL, KC_TILD, SFT_INS, KC_COLN, KC_PIPE, XXXXXXX, KC_COMM, KC_DOT, KC_SLSH, _______, _______, _______, _______, _______, _______, KC_DEL, KC_DEL, _______, _______, _______, _______, _______ ), @@ -241,6 +254,10 @@ void plover_lookup(void) { unregister_code(PV_RG); } +void matrix_init_user(void) { + set_unicode_input_mode(UC_LNX); +}; + uint32_t layer_state_set_user(uint32_t state) { return update_tri_layer_state(state, LOWER_LAYER, RAISE_LAYER, ADJUST_LAYER); } diff --git a/keyboards/planck/keymaps/mwpeterson/rules.mk b/keyboards/planck/keymaps/mwpeterson/rules.mk index de8aa389c4a0..e82617028134 100644 --- a/keyboards/planck/keymaps/mwpeterson/rules.mk +++ b/keyboards/planck/keymaps/mwpeterson/rules.mk @@ -1,6 +1,7 @@ -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -CONSOLE_ENABLE = no # Console for debug -COMMAND_ENABLE = no # Disable shift combination, which conflicts with shift-parens -MOUSEKEY_ENABLE = yes # Mouse keys (disabled to save space) -NKRO_ENABLE = no # N-key rollover required for use as a steno board -AUDIO_ENABLE = yes # Audio output on port C6 +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Disable shift combination, which conflicts with shift-parens +MOUSEKEY_ENABLE = yes # Mouse keys (disabled to save space) +NKRO_ENABLE = no # N-key rollover required for use as a steno board +AUDIO_ENABLE = yes # Audio output on port C6 +UNICODEMAP_ENABLE = yes # Enable extended unicode From 0031e461913d23e37a9aebd1da5daf1c93a149ee Mon Sep 17 00:00:00 2001 From: zvecr Date: Mon, 26 Nov 2018 17:27:07 +0000 Subject: [PATCH 460/505] Keyboard: 40percentclub - enable 4x4 and 5x5 community keymaps (#4437) * Enable 4x4 and 5x5 community keymap support * Pull 4x4 community keymap fixes from @noroadsleft * Build fixes for guidoism keymap - move keymap to layouts/community/planck_mit as it uses the LAYOUT_planck_mit macro --- keyboards/40percentclub/4x4/4x4.h | 13 +++++++++++++ keyboards/40percentclub/4x4/rules.mk | 3 +-- keyboards/40percentclub/5x5/rules.mk | 3 +-- layouts/community/ortho_4x12/bakingpy/rules.mk | 2 ++ layouts/community/ortho_4x12/wanleg/rules.mk | 4 ++-- layouts/community/ortho_4x12/xyverz/rules.mk | 2 ++ .../{ortho_4x12 => planck_mit}/guidoism/config.h | 0 .../guidoism/generate_c.py | 0 .../guidoism/guidoism.json | 0 .../{ortho_4x12 => planck_mit}/guidoism/keymap.c | 0 .../{ortho_4x12 => planck_mit}/guidoism/keys.json | 0 .../{ortho_4x12 => planck_mit}/guidoism/readme.md | 0 12 files changed, 21 insertions(+), 6 deletions(-) rename layouts/community/{ortho_4x12 => planck_mit}/guidoism/config.h (100%) rename layouts/community/{ortho_4x12 => planck_mit}/guidoism/generate_c.py (100%) rename layouts/community/{ortho_4x12 => planck_mit}/guidoism/guidoism.json (100%) rename layouts/community/{ortho_4x12 => planck_mit}/guidoism/keymap.c (100%) rename layouts/community/{ortho_4x12 => planck_mit}/guidoism/keys.json (100%) rename layouts/community/{ortho_4x12 => planck_mit}/guidoism/readme.md (100%) diff --git a/keyboards/40percentclub/4x4/4x4.h b/keyboards/40percentclub/4x4/4x4.h index 8cc5a150aaa3..359cdc80a161 100644 --- a/keyboards/40percentclub/4x4/4x4.h +++ b/keyboards/40percentclub/4x4/4x4.h @@ -56,3 +56,16 @@ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, K2c, K2d, K2e, K2f }, \ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3c, K3d, K3e, K3f } \ } + +#define LAYOUT_kc_ortho_4x12( \ + 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 \ +) \ +{ \ + { 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_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, 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_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2a, KC_##K2b, ___, ___, ___, ___}, \ + { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3a, KC_##K3b, ___, ___, ___, ___} \ +} diff --git a/keyboards/40percentclub/4x4/rules.mk b/keyboards/40percentclub/4x4/rules.mk index a513357988e2..4ab5e7431c9f 100644 --- a/keyboards/40percentclub/4x4/rules.mk +++ b/keyboards/40percentclub/4x4/rules.mk @@ -76,5 +76,4 @@ AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) -#FIXME: Community keymap build are currently failing due to missing functionality -#LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12 ortho_4x16 +LAYOUTS = ortho_4x4 ortho_4x8 ortho_4x12 ortho_4x16 diff --git a/keyboards/40percentclub/5x5/rules.mk b/keyboards/40percentclub/5x5/rules.mk index ae041412698d..237de6497708 100644 --- a/keyboards/40percentclub/5x5/rules.mk +++ b/keyboards/40percentclub/5x5/rules.mk @@ -77,5 +77,4 @@ AUDIO_ENABLE = no # Audio output on port C6 FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) -#FIXME: Community keymap build are currently failing due to missing functionality -#LAYOUTS = ortho_5x5 ortho_5x10 ortho_5x15 +LAYOUTS = ortho_5x5 ortho_5x10 ortho_5x15 diff --git a/layouts/community/ortho_4x12/bakingpy/rules.mk b/layouts/community/ortho_4x12/bakingpy/rules.mk index 490ebbf77934..9be2f01d4d5d 100644 --- a/layouts/community/ortho_4x12/bakingpy/rules.mk +++ b/layouts/community/ortho_4x12/bakingpy/rules.mk @@ -5,6 +5,8 @@ endif AUDIO_ENABLE = no ifeq ($(strip $(KEYBOARD)), zlant) BACKLIGHT_ENABLE = no +else ifeq ($(strip $(KEYBOARD)), 40percentclub/4x4) + BACKLIGHT_ENABLE = no else BACKLIGHT_ENABLE = yes endif diff --git a/layouts/community/ortho_4x12/wanleg/rules.mk b/layouts/community/ortho_4x12/wanleg/rules.mk index fa433a6b0dae..835022f4bfd7 100644 --- a/layouts/community/ortho_4x12/wanleg/rules.mk +++ b/layouts/community/ortho_4x12/wanleg/rules.mk @@ -5,10 +5,10 @@ ifeq ($(strip $(KEYBOARD)), jj40) SWAP_HANDS_ENABLE = no endif -ifeq ($(strip $(KEYBOARD)), 4x4) +ifeq ($(strip $(KEYBOARD)), 40percentclub/4x4) SWAP_HANDS_ENABLE = no endif ifeq ($(strip $(KEYBOARD)), zlant) SWAP_HANDS_ENABLE = no -endif \ No newline at end of file +endif diff --git a/layouts/community/ortho_4x12/xyverz/rules.mk b/layouts/community/ortho_4x12/xyverz/rules.mk index 852e38f24e6e..c181e11072c5 100644 --- a/layouts/community/ortho_4x12/xyverz/rules.mk +++ b/layouts/community/ortho_4x12/xyverz/rules.mk @@ -3,6 +3,8 @@ AUDIO_ENABLE = no # Audio output on port C6 ifeq ("$(KEYBOARD)","vitamins_included") RGBLIGHT_ENABLE = no +else ifeq ($(strip $(KEYBOARD)), 40percentclub/4x4) + RGBLIGHT_ENABLE = no else RGBLIGHT_ENABLE = yes endif diff --git a/layouts/community/ortho_4x12/guidoism/config.h b/layouts/community/planck_mit/guidoism/config.h similarity index 100% rename from layouts/community/ortho_4x12/guidoism/config.h rename to layouts/community/planck_mit/guidoism/config.h diff --git a/layouts/community/ortho_4x12/guidoism/generate_c.py b/layouts/community/planck_mit/guidoism/generate_c.py similarity index 100% rename from layouts/community/ortho_4x12/guidoism/generate_c.py rename to layouts/community/planck_mit/guidoism/generate_c.py diff --git a/layouts/community/ortho_4x12/guidoism/guidoism.json b/layouts/community/planck_mit/guidoism/guidoism.json similarity index 100% rename from layouts/community/ortho_4x12/guidoism/guidoism.json rename to layouts/community/planck_mit/guidoism/guidoism.json diff --git a/layouts/community/ortho_4x12/guidoism/keymap.c b/layouts/community/planck_mit/guidoism/keymap.c similarity index 100% rename from layouts/community/ortho_4x12/guidoism/keymap.c rename to layouts/community/planck_mit/guidoism/keymap.c diff --git a/layouts/community/ortho_4x12/guidoism/keys.json b/layouts/community/planck_mit/guidoism/keys.json similarity index 100% rename from layouts/community/ortho_4x12/guidoism/keys.json rename to layouts/community/planck_mit/guidoism/keys.json diff --git a/layouts/community/ortho_4x12/guidoism/readme.md b/layouts/community/planck_mit/guidoism/readme.md similarity index 100% rename from layouts/community/ortho_4x12/guidoism/readme.md rename to layouts/community/planck_mit/guidoism/readme.md From f3ffd6ad50f0a4bf24f0a0453cc5502b4b88f390 Mon Sep 17 00:00:00 2001 From: epaew Date: Tue, 27 Nov 2018 02:50:45 +0900 Subject: [PATCH 461/505] Keymap: Refactor edvorakjp user library (#4480) * Refactor edvorakjp user library * add tap dance support * update keymaps * edvorakjp: add SWAP_SCLN option * fix behavior of SWAP_SCLN --- .../helix/rev2/keymaps/edvorakjp/config.h | 1 + .../helix/rev2/keymaps/edvorakjp/keymap.c | 2 +- .../rev2/keymaps/edvorakjp/keymap_4rows.c | 2 +- .../rev2/keymaps/edvorakjp/keymap_5rows.c | 2 +- keyboards/helix/rev2/keymaps/edvorakjp/oled.c | 15 +- keyboards/iris/keymaps/edvorakjp/config.h | 1 + keyboards/iris/keymaps/edvorakjp/keymap.c | 7 +- users/edvorakjp/edvorakjp.c | 222 +----------------- users/edvorakjp/edvorakjp.h | 37 +-- users/edvorakjp/edvorakjp_process_record.c | 206 ++++++++++++++++ users/edvorakjp/edvorakjp_status.c | 75 ++++++ users/edvorakjp/edvorakjp_tap_dance.c | 71 ++++++ users/edvorakjp/readme.md | 12 +- users/edvorakjp/rules.mk | 8 +- 14 files changed, 406 insertions(+), 255 deletions(-) create mode 100644 users/edvorakjp/edvorakjp_process_record.c create mode 100644 users/edvorakjp/edvorakjp_status.c create mode 100644 users/edvorakjp/edvorakjp_tap_dance.c diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/config.h b/keyboards/helix/rev2/keymaps/edvorakjp/config.h index 643220383c5a..769988cdb580 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/config.h +++ b/keyboards/helix/rev2/keymaps/edvorakjp/config.h @@ -4,6 +4,7 @@ #undef TAPPING_FORCE_HOLD #undef TAPPING_TERM #define TAPPING_TERM 120 +#define SWAP_SCLN // If you need more program area, try select and reduce rgblight modes to use. diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/keymap.c b/keyboards/helix/rev2/keymaps/edvorakjp/keymap.c index 22940f7cbe51..fd324a859ae5 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/keymap.c +++ b/keyboards/helix/rev2/keymaps/edvorakjp/keymap.c @@ -11,7 +11,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { switch(keycode) { case KC_LOCK: if (record->event.pressed) { - if (edvorakjp_config.enable_kc_lang) { + if (get_enable_kc_lang()) { SEND_STRING( SS_LCTRL(SS_LSFT(SS_TAP(X_POWER))) ); } else { SEND_STRING( SS_LGUI("l") ); diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/keymap_4rows.c b/keyboards/helix/rev2/keymaps/edvorakjp/keymap_4rows.c index d8257d81f8dd..805e6b17b752 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/keymap_4rows.c +++ b/keyboards/helix/rev2/keymaps/edvorakjp/keymap_4rows.c @@ -5,7 +5,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_EDVORAK] = LAYOUT_kc( //,----+----+----+----+----+----. ,----+----+----+----+----+----. - LBRC,RBRC,COMM,DOT , P , Y , F , G , R , W , Q ,BSLS, + LBRC,RBRC,COMM,DOT , Y , P , F , G , R , W , Q ,BSLS, //|----+----+----+----+----+----| |----+----+----+----+----+----| EQL , A , O , E , I , U , D , T , N , S , M ,MINS, //|----+----+----+----+----+----| |----+----+----+----+----+----| diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/keymap_5rows.c b/keyboards/helix/rev2/keymaps/edvorakjp/keymap_5rows.c index 9116b39665a5..ef1b9d358c6a 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/keymap_5rows.c +++ b/keyboards/helix/rev2/keymaps/edvorakjp/keymap_5rows.c @@ -7,7 +7,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //,----+----+----+----+----+----. ,----+----+----+----+----+----. GRV ,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,BSPC, //|----+----+----+----+----+----| |----+----+----+----+----+----| - LBRC,RBRC,COMM,DOT , P , Y , F , G , R , W , Q ,BSLS, + LBRC,RBRC,COMM,DOT , Y , P , F , G , R , W , Q ,BSLS, //|----+----+----+----+----+----| |----+----+----+----+----+----| EQL , A , O , E , I , U , D , T , N , S , M ,MINS, //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----| diff --git a/keyboards/helix/rev2/keymaps/edvorakjp/oled.c b/keyboards/helix/rev2/keymaps/edvorakjp/oled.c index 5ced1d4fad71..227e2c56f82f 100644 --- a/keyboards/helix/rev2/keymaps/edvorakjp/oled.c +++ b/keyboards/helix/rev2/keymaps/edvorakjp/oled.c @@ -23,15 +23,10 @@ void render_status(struct CharacterMatrix *matrix) { // Render to mode icon static char logo[][2][3] = {{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; - if (edvorakjp_config.enable_kc_lang) { - matrix_write(matrix, logo[0][0]); - matrix_write_P(matrix, PSTR("\n")); - matrix_write(matrix, logo[0][1]); - } else { - matrix_write(matrix, logo[1][0]); - matrix_write_P(matrix, PSTR("\n")); - matrix_write(matrix, logo[1][1]); - } + int mode_number = get_enable_kc_lang() ? 0 : 1; + matrix_write(matrix, logo[mode_number][0]); + matrix_write(matrix, "\n"); + matrix_write(matrix, logo[mode_number][1]); // Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below char buf[40]; @@ -63,7 +58,7 @@ void render_status(struct CharacterMatrix *matrix) { // Host Keyboard LED Status char led[40]; snprintf(led, sizeof(led), "\n%s %s %s %s", - edvorakjp_config.enable_jp_extra_layer && japanese_mode ? "EXT" : " ", + get_enable_jp_extra_layer() && get_japanese_mode() ? "EXT" : " ", (host_keyboard_leds() & (1<event.pressed) { - if (edvorakjp_config.enable_kc_lang) { + if (get_enable_kc_lang()) { SEND_STRING( SS_LCTRL(SS_LSFT(SS_TAP(X_POWER))) ); } else { SEND_STRING( SS_LGUI("l") ); diff --git a/users/edvorakjp/edvorakjp.c b/users/edvorakjp/edvorakjp.c index cff1a123e481..1ac61079426a 100644 --- a/users/edvorakjp/edvorakjp.c +++ b/users/edvorakjp/edvorakjp.c @@ -1,47 +1,12 @@ -#include "eeprom.h" #include "edvorakjp.h" -bool japanese_mode; -uint16_t time_on_pressed; - -edvorakjp_config_t edvorakjp_config; - -uint8_t eeconfig_read_edvorakjp(void) { - return eeprom_read_byte(EECONFIG_EDVORAK); -} - -void eeconfig_update_edvorakjp(uint8_t val) { - eeprom_update_byte(EECONFIG_EDVORAK, val); -} - void dvorakj_layer_off(void) { layer_off(_EDVORAKJ1); layer_off(_EDVORAKJ2); } -void update_japanese_mode(bool new_state) { - japanese_mode = new_state; - if (japanese_mode) { - if (edvorakjp_config.enable_kc_lang) { - SEND_STRING(SS_TAP(X_LANG1)); - } else { - SEND_STRING(SS_LALT("`")); - } - } else { - dvorakj_layer_off(); - if (edvorakjp_config.enable_kc_lang) { - SEND_STRING(SS_TAP(X_LANG2)); - } else { - SEND_STRING(SS_LALT("`")); - } - } -} - void matrix_init_user(void) { - japanese_mode = false; - time_on_pressed = 0; - edvorakjp_config.raw = eeconfig_read_edvorakjp(); - + edvorakjp_status_init(); matrix_init_keymap(); } @@ -58,189 +23,16 @@ uint32_t layer_state_set_keymap(uint32_t state) { return state; } -/* - * Each process_record_* methods defined here are - * return false if handle edvorak_keycodes, or return true others. - */ -__attribute__ ((weak)) -bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { - return true; -} - -bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record) { - if (!(edvorakjp_config.enable_jp_extra_layer &&\ - (default_layer_state == 1UL<<_EDVORAK) &&\ - japanese_mode &&\ - record->event.pressed)) { - return true; - } - - // consonant keys - // layer_on(J1) or layer_on(J2) are defined based on key positions. - switch (keycode) { - // right hand's left side w/o N - case KC_F: - case KC_G: - case KC_R: - case KC_D: - case KC_T: - case KC_B: - case KC_H: - case KC_J: - layer_on(_EDVORAKJ1); - register_code(keycode); - unregister_code(keycode); - return false; - - // N: toggle layer - case KC_N: - biton32(layer_state) == _EDVORAK ? layer_on(_EDVORAKJ1) : dvorakj_layer_off(); - register_code(keycode); - unregister_code(keycode); - return false; - - // left hand and right hand's right side - case KC_X: - case KC_C: - case KC_V: - case KC_Z: - case KC_P: - case KC_Y: - case KC_W: - case KC_Q: - case KC_S: - case KC_M: - case KC_K: - case KC_L: - layer_on(_EDVORAKJ2); - register_code(keycode); - unregister_code(keycode); - return false; - } - - // vowel keys, symbol keys and modifier keys - dvorakj_layer_off(); - switch (keycode) { - // combination vowel keys - case KC_AI: - SEND_STRING("ai"); - return false; - case KC_OU: - SEND_STRING("ou"); - return false; - case KC_EI: - SEND_STRING("ei"); - return false; - case KC_ANN: - SEND_STRING("ann"); - return false; - case KC_ONN: - SEND_STRING("onn"); - return false; - case KC_ENN: - SEND_STRING("enn"); - return false; - case KC_INN: - SEND_STRING("inn"); - return false; - case KC_UNN: - SEND_STRING("unn"); - return false; - - // AOEIU and other (symbol, modifier) keys - default: - return true; - } -} - -bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case KC_MAC: - edvorakjp_config.enable_kc_lang = true; - eeconfig_update_edvorakjp(edvorakjp_config.raw); - return false; - case KC_WIN: - edvorakjp_config.enable_kc_lang = false; - eeconfig_update_edvorakjp(edvorakjp_config.raw); - return false; - case KC_EXTON: - edvorakjp_config.enable_jp_extra_layer = true; - eeconfig_update_edvorakjp(edvorakjp_config.raw); - return false; - case KC_EXTOFF: - edvorakjp_config.enable_jp_extra_layer = false; - eeconfig_update_edvorakjp(edvorakjp_config.raw); - return false; - } - return true; -} - -bool process_record_layer(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case EDVORAK: - if (record->event.pressed) { - set_single_persistent_default_layer(_EDVORAK); - } - return false; - case QWERTY: - if (record->event.pressed) { - dvorakj_layer_off(); - set_single_persistent_default_layer(_QWERTY); - } - return false; - case LOWER: - if (record->event.pressed) { - layer_on(_LOWER); - time_on_pressed = record->event.time; - } else { - layer_off(_LOWER); - - if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) { - update_japanese_mode(false); - } - time_on_pressed = 0; - } - return false; - case RAISE: - if (record->event.pressed) { - layer_on(_RAISE); - time_on_pressed = record->event.time; - } else { - layer_off(_RAISE); - - if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) { - update_japanese_mode(true); - } - time_on_pressed = 0; - } - return false; - default: - return true; - } -} - -bool process_record_ime(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - case KC_JPN: - if (record->event.pressed) { - update_japanese_mode(true); - } - return false; - case KC_ENG: - if (record->event.pressed) { - update_japanese_mode(false); - } - return false; - default: - return true; - } -} - bool process_record_user(uint16_t keycode, keyrecord_t *record) { - return process_record_keymap(keycode, record) &&\ process_record_edvorakjp_ext(keycode, record) &&\ + process_record_edvorakjp_swap_scln(keycode, record) &&\ process_record_edvorakjp_config(keycode, record) &&\ process_record_layer(keycode, record) &&\ process_record_ime(keycode, record); } + +__attribute__ ((weak)) +bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { + return true; +} diff --git a/users/edvorakjp/edvorakjp.h b/users/edvorakjp/edvorakjp.h index f67400686a4c..e781bf2378e8 100644 --- a/users/edvorakjp/edvorakjp.h +++ b/users/edvorakjp/edvorakjp.h @@ -1,5 +1,5 @@ -#ifndef USERSPACE -#define USERSPACE +#ifndef EDVORAKJP +#define EDVORAKJP #include "quantum.h" #include "action_layer.h" @@ -8,15 +8,6 @@ extern keymap_config_t keymap_config; -typedef union { - uint8_t raw; - struct { - bool enable_jp_extra_layer : 1; - bool enable_kc_lang : 1; // for macOS - }; -} edvorakjp_config_t; -extern edvorakjp_config_t edvorakjp_config; - enum edvorakjp_layers { _EDVORAK = 0, _EDVORAKJ1, @@ -50,26 +41,38 @@ enum edvorakjp_keycodes { NEW_SAFE_RANGE }; -uint8_t eeconfig_read_edvorakjp(void); -void eeconfig_update_edvorakjp(uint8_t val); +enum tap_dance_code { + TD_LOWER = 0, + TD_RAISE +}; +// base void dvorakj_layer_off(void); -void update_japanese_mode(bool new_state); void matrix_init_user(void); void matrix_init_keymap(void); uint32_t layer_state_set_user(uint32_t state); uint32_t layer_state_set_keymap(uint32_t state); +bool process_record_user(uint16_t keycode, keyrecord_t *record); +bool process_record_keymap(uint16_t keycode, keyrecord_t *record); + +// status +void edvorakjp_status_init(void); +bool get_enable_jp_extra_layer(void); +void set_enable_jp_extra_layer(bool new_state); +bool get_enable_kc_lang(void); +void set_enable_kc_lang(bool new_state); +bool get_japanese_mode(void); +void set_japanese_mode(bool new_state); /* * Each process_record_* methods defined here are * return false if processed, or return true if not processed. * You can add your original macros in process_record_keymap() in keymap.c. */ -bool process_record_keymap(uint16_t keycode, keyrecord_t *record); bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record); +bool process_record_edvorakjp_swap_scln(uint16_t keycode, keyrecord_t *record); bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record); bool process_record_layer(uint16_t keycode, keyrecord_t *record); bool process_record_ime(uint16_t keycode, keyrecord_t *record); -bool process_record_user(uint16_t keycode, keyrecord_t *record); -#endif +#endif // EDVORAKJP diff --git a/users/edvorakjp/edvorakjp_process_record.c b/users/edvorakjp/edvorakjp_process_record.c new file mode 100644 index 000000000000..dc70522b4706 --- /dev/null +++ b/users/edvorakjp/edvorakjp_process_record.c @@ -0,0 +1,206 @@ +#include "edvorakjp.h" + +#if TAP_DANCE_ENABLE != yes +static uint16_t time_on_pressed; +#endif +/* + * Each process_record_* methods defined here are + * return false if handle edvorak_keycodes, or return true others. + */ +bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record) { + if (!(default_layer_state == 1UL<<_EDVORAK && + get_enable_jp_extra_layer() && get_japanese_mode())) { + return true; + } + + // consonant keys + // layer_on(J1) or layer_on(J2) are defined based on key positions. + switch (keycode) { + // right hand's left side w/o N + case KC_F: + case KC_G: + case KC_R: + case KC_D: + case KC_T: + case KC_B: + case KC_H: + case KC_J: + if (record->event.pressed) { + layer_on(_EDVORAKJ1); + } + return true; + + // N: toggle layer + case KC_N: + if (record->event.pressed) { + biton32(layer_state) == _EDVORAK ? layer_on(_EDVORAKJ1) : dvorakj_layer_off(); + } + return true; + + // left hand and right hand's right side + case KC_X: + case KC_C: + case KC_V: + case KC_Z: + case KC_Y: + case KC_P: + case KC_W: + case KC_Q: + case KC_S: + case KC_M: + case KC_K: + case KC_L: + if (record->event.pressed) { + layer_on(_EDVORAKJ2); + } + return true; + } + + // vowel keys, symbol keys and modifier keys + if (record->event.pressed) { + dvorakj_layer_off(); + } + switch (keycode) { + // combination vowel keys + case KC_AI: + if (record->event.pressed) { + SEND_STRING("ai"); + } + return false; + case KC_OU: + if (record->event.pressed) { + SEND_STRING("ou"); + } + return false; + case KC_EI: + if (record->event.pressed) { + SEND_STRING("ei"); + } + return false; + case KC_ANN: + if (record->event.pressed) { + SEND_STRING("ann"); + } + return false; + case KC_ONN: + if (record->event.pressed) { + SEND_STRING("onn"); + } + return false; + case KC_ENN: + if (record->event.pressed) { + SEND_STRING("enn"); + } + return false; + case KC_INN: + if (record->event.pressed) { + SEND_STRING("inn"); + } + return false; + case KC_UNN: + if (record->event.pressed) { + SEND_STRING("unn"); + } + return false; + } + // AOEIU and other (symbol, modifier) keys + return true; +} + +bool process_record_edvorakjp_swap_scln(uint16_t keycode, keyrecord_t *record) { +#ifdef SWAP_SCLN + static const uint8_t shift_bits = MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT); + static uint8_t last_mods_status; + if (keycode == KC_SCLN) { + if (record->event.pressed) { + last_mods_status = get_mods(); + + // invert shift_bits + if (last_mods_status & shift_bits) { + set_mods(last_mods_status & ~shift_bits); + } else { + set_mods(last_mods_status | MOD_BIT(KC_LSFT)); + } + } else { + set_mods(last_mods_status); + last_mods_status = 0; + } + } +#endif + return true; +} + +bool process_record_edvorakjp_config(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MAC: + case KC_WIN: + if (record->event.pressed) { + set_enable_kc_lang(keycode == KC_MAC); + } + return false; + case KC_EXTON: + case KC_EXTOFF: + if (record->event.pressed) { + set_enable_jp_extra_layer(keycode == KC_EXTON); + } + return false; + } + return true; +} + +bool process_record_layer(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case EDVORAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_EDVORAK); + } + return false; + case QWERTY: + if (record->event.pressed) { + dvorakj_layer_off(); + set_single_persistent_default_layer(_QWERTY); + } + return false; +#if TAP_DANCE_ENABLE != yes + case LOWER: + if (record->event.pressed) { + layer_on(_LOWER); + time_on_pressed = record->event.time; + } else { + layer_off(_LOWER); + + if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) { + set_japanese_mode(false); + } + time_on_pressed = 0; + } + return false; + case RAISE: + if (record->event.pressed) { + layer_on(_RAISE); + time_on_pressed = record->event.time; + } else { + layer_off(_RAISE); + + if (TIMER_DIFF_16(record->event.time, time_on_pressed) < TAPPING_TERM) { + set_japanese_mode(true); + } + time_on_pressed = 0; + } + return false; +#endif + } + return true; +} + +bool process_record_ime(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_JPN: + case KC_ENG: + if (record->event.pressed) { + set_japanese_mode(keycode == KC_JPN); + } + return false; + } + return true; +} diff --git a/users/edvorakjp/edvorakjp_status.c b/users/edvorakjp/edvorakjp_status.c new file mode 100644 index 000000000000..a60c8d853b0a --- /dev/null +++ b/users/edvorakjp/edvorakjp_status.c @@ -0,0 +1,75 @@ +#include "eeprom.h" +#include "edvorakjp.h" + +typedef union { + uint8_t raw; + struct { + bool enable_jp_extra_layer : 1; + bool enable_kc_lang : 1; // for macOS + }; +} edvorakjp_config_t; +static edvorakjp_config_t edvorakjp_config; + +typedef struct { + bool japanese_mode; +} edvorakjp_state_t; +static edvorakjp_state_t edvorakjp_state; + +/* + * private methods + */ +uint8_t eeconfig_read_edvorakjp(void) { + return eeprom_read_byte(EECONFIG_EDVORAK); +} + +void eeconfig_update_edvorakjp(uint8_t val) { + eeprom_update_byte(EECONFIG_EDVORAK, val); +} + +/* + * public methods + */ +void edvorakjp_status_init(void) { + edvorakjp_state.japanese_mode = false; + edvorakjp_config.raw = eeconfig_read_edvorakjp(); +} + +bool get_enable_jp_extra_layer(void) { + return edvorakjp_config.enable_jp_extra_layer; +} + +void set_enable_jp_extra_layer(bool new_state) { + edvorakjp_config.enable_jp_extra_layer = new_state; + eeconfig_update_edvorakjp(edvorakjp_config.raw); +} + +bool get_enable_kc_lang(void) { + return edvorakjp_config.enable_kc_lang; +} + +void set_enable_kc_lang(bool new_state) { + edvorakjp_config.enable_kc_lang = new_state; + eeconfig_update_edvorakjp(edvorakjp_config.raw); +} + +bool get_japanese_mode(void) { + return edvorakjp_state.japanese_mode; +} + +void set_japanese_mode(bool new_state) { + edvorakjp_state.japanese_mode = new_state; + if (edvorakjp_state.japanese_mode) { + if (edvorakjp_config.enable_kc_lang) { + SEND_STRING(SS_TAP(X_LANG1)); + } else { + SEND_STRING(SS_LALT("`")); + } + } else { + dvorakj_layer_off(); + if (edvorakjp_config.enable_kc_lang) { + SEND_STRING(SS_TAP(X_LANG2)); + } else { + SEND_STRING(SS_LALT("`")); + } + } +} diff --git a/users/edvorakjp/edvorakjp_tap_dance.c b/users/edvorakjp/edvorakjp_tap_dance.c new file mode 100644 index 000000000000..62c0c100a22b --- /dev/null +++ b/users/edvorakjp/edvorakjp_tap_dance.c @@ -0,0 +1,71 @@ +#include "edvorakjp.h" +#include "process_keycode/process_tap_dance.h" + +enum tap_state { + NONE = 0, + SINGLE_TAP = 1, + DOUBLE_TAP = 2, + HOLD +}; + +static int td_status_lower = NONE; +static int td_status_raise = NONE; + +int cur_dance(qk_tap_dance_state_t *state) { + if (state->interrupted || !state->pressed) { + return state->count == 1 ? SINGLE_TAP : DOUBLE_TAP; + } else { + return HOLD; + } +} + +void td_lower_finished(qk_tap_dance_state_t *state, void *user_data) { + td_status_lower = cur_dance(state); + switch(td_status_lower) { + case SINGLE_TAP: + set_japanese_mode(false); + register_code(KC_ESC); + break; + case DOUBLE_TAP: + set_japanese_mode(false); + break; + case HOLD: + break; + } + layer_on(_LOWER); +} + +void td_lower_reset(qk_tap_dance_state_t *state, void *user_data) { + if (td_status_lower == SINGLE_TAP) { + unregister_code(KC_ESC); + } + layer_off(_LOWER); + td_status_lower = NONE; +} + +void td_raise_finished(qk_tap_dance_state_t *state, void *user_data) { + td_status_raise = cur_dance(state); + switch(td_status_raise) { + case SINGLE_TAP: + case DOUBLE_TAP: + set_japanese_mode(true); + break; + case HOLD: + break; + } + layer_on(_RAISE); +} + +void td_raise_reset(qk_tap_dance_state_t *state, void *user_data) { + layer_off(_RAISE); + td_status_raise = NONE; +} + +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_LOWER] = ACTION_TAP_DANCE_FN_ADVANCED_TIME( + NULL, td_lower_finished, td_lower_reset, TAPPING_TERM * 1.5 + ), + [TD_RAISE] = ACTION_TAP_DANCE_FN_ADVANCED_TIME( + NULL, td_raise_finished, td_raise_reset, TAPPING_TERM * 1.5 + ) +}; diff --git a/users/edvorakjp/readme.md b/users/edvorakjp/readme.md index d7ec7428526e..077ba4abdcfc 100644 --- a/users/edvorakjp/readme.md +++ b/users/edvorakjp/readme.md @@ -10,7 +10,7 @@ This is a sample. You can swap any symbol keys and modifier keys. //+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+ ` , ! , @ , # , $ , % , ^ , & , * , ( , ) , [ , ] , BSPC , //+----+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+-------+ - TAB , ' , , , . , P , Y , F , G , R , W , Q , / , = , \ , + TAB , ' , , , . , Y , P , F , G , R , W , Q , / , = , \ , //+------++---++---++---++---++---++---++---++---++---++---++---++---+-------+ CAPS , A , O , E , I , U , D , T , N , S , M , - , ENT , //+-------+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-----------+ @@ -25,7 +25,7 @@ This is a sample. You can swap any symbol keys and modifier keys. //+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+ ` , ! , @ , # , $ , % , ^ , & , * , ( , ) , [ , ] , BSPC , //+----+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+-------+ - TAB , ' , , , . , P , Y , F , G , R , W , C , / , = , + TAB , ' , , , . , Y , P , F , G , R , W , C , / , = , //+------++---++---++---++---++---++---++---++---++---++---++---++---++ CAPS , A , O , E , I , U , D , T , N , S , M , ; , - , ENT , //+-------+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+-+--+------+ @@ -78,11 +78,15 @@ This is a sample. You can swap any symbol keys and modifier keys. ## for Programmer - Dvorak 配列をベースに、ショートカットでよく利用される XCV は QWERTY 配列の位置を維持 -- Vimユーザのために、HJKL キーを横並びで配置 +- 一部にVimユーザ用のキー配置を実施 + - HJKL キーを横並びで配置 + - Shift押下時と非押下時で、";"キーの挙動を入れ替え(`config.h` 内で `#define SWAP_SCLN` の宣言が必要です) - デフォルトレイヤーには、数字キーの代わりに記号 `!@#$%^&*()` を配置 - mainly based on Dvorak layout, but XCV is available in the same position of QWERTY layout -- HJKL is lining side by side, for Vim users +- for Vim users + - HJKL is lining side by side + - swap the ";" key behavior. i.e. send ":" normally and send ";" when you hold shift. (need `#define SWAP_SCLN` in your `config.h`) - we can type `!@#$%^&*()` keys without shift keys in base layer ## License diff --git a/users/edvorakjp/rules.mk b/users/edvorakjp/rules.mk index 4fb739186408..587c3b8d2e66 100644 --- a/users/edvorakjp/rules.mk +++ b/users/edvorakjp/rules.mk @@ -1 +1,7 @@ -SRC += edvorakjp.c +SRC += edvorakjp.c \ + edvorakjp_process_record.c \ + edvorakjp_status.c + +ifeq ($(TAP_DANCE_ENABLE), yes) +SRC += edvorakjp_tap_dance.c +endif From 4ebd27002a344b017276dc70796435a8e718f46a Mon Sep 17 00:00:00 2001 From: listofoptions <39714365+listofoptions@users.noreply.github.com> Date: Mon, 26 Nov 2018 12:53:49 -0500 Subject: [PATCH 462/505] Keyboard: 5291 firmware to replace the existing soarers controller firmware (#4483) * compiles but is not working * still testing 5291 * compiles but is not working * still testing 5291 * fixed a but in the layout (reversed key order in row) * compiles but is not working * still testing 5291 * fixed a but in the layout (reversed key order in row) * fixed some issues * doumentation needed * doumentation needed * documentation needed * documentation needed * Update readme.md documentation * Update readme.md i dislike markdown <_> * merge preperation --- keyboards/converter/ibm_5291/config.h | 42 +++ keyboards/converter/ibm_5291/ibm_5291.c | 3 + keyboards/converter/ibm_5291/ibm_5291.h | 69 +++++ keyboards/converter/ibm_5291/info.json | 6 + .../ibm_5291/keymaps/default/keymap.c | 233 ++++++++++++++ .../keymaps/kbdbabel_doc_ibm5291_kbd.pdf | Bin 0 -> 13054 bytes keyboards/converter/ibm_5291/matrix.c | 284 ++++++++++++++++++ keyboards/converter/ibm_5291/matrix.csv | 96 ++++++ keyboards/converter/ibm_5291/readme.md | 70 +++++ keyboards/converter/ibm_5291/rules.mk | 72 +++++ 10 files changed, 875 insertions(+) create mode 100644 keyboards/converter/ibm_5291/config.h create mode 100644 keyboards/converter/ibm_5291/ibm_5291.c create mode 100644 keyboards/converter/ibm_5291/ibm_5291.h create mode 100644 keyboards/converter/ibm_5291/info.json create mode 100644 keyboards/converter/ibm_5291/keymaps/default/keymap.c create mode 100644 keyboards/converter/ibm_5291/keymaps/kbdbabel_doc_ibm5291_kbd.pdf create mode 100644 keyboards/converter/ibm_5291/matrix.c create mode 100644 keyboards/converter/ibm_5291/matrix.csv create mode 100644 keyboards/converter/ibm_5291/readme.md create mode 100644 keyboards/converter/ibm_5291/rules.mk diff --git a/keyboards/converter/ibm_5291/config.h b/keyboards/converter/ibm_5291/config.h new file mode 100644 index 000000000000..5c9ca1e4a976 --- /dev/null +++ b/keyboards/converter/ibm_5291/config.h @@ -0,0 +1,42 @@ +/* +Copyright 2018 listofoptions + +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 + +#include "config_common.h" + +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 1 +#define MANUFACTURER QMK +#define PRODUCT 5291 keyboard converter +#define DESCRIPTION 5291 keyboard converter + +#define MATRIX_ROWS 24 +#define MATRIX_COLS 4 + +#define MATRIX_ROW_PINS {B2, B3, B4, B5, B6} +#define MATRIX_COL_PINS {B0, B1} +#define MATRIX_DATA_PIN D0 +#define MATRIX_STROBE_PIN D1 +#define LED_PIN D6 + + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 0 + + diff --git a/keyboards/converter/ibm_5291/ibm_5291.c b/keyboards/converter/ibm_5291/ibm_5291.c new file mode 100644 index 000000000000..9b937a545ae2 --- /dev/null +++ b/keyboards/converter/ibm_5291/ibm_5291.c @@ -0,0 +1,3 @@ +#include "ibm_5291.h" +#include +#include "quantum.h" \ No newline at end of file diff --git a/keyboards/converter/ibm_5291/ibm_5291.h b/keyboards/converter/ibm_5291/ibm_5291.h new file mode 100644 index 000000000000..aa1b403242e2 --- /dev/null +++ b/keyboards/converter/ibm_5291/ibm_5291.h @@ -0,0 +1,69 @@ +/* +Copyright 2018 listofoptions + +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 + +#include "quantum.h" + +/* + * ,-------. ,--------------------------------------------------------------------------. + * | F1| F2| |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BS |NumLck |ScrLck | + * |-------| |--------------------------------------------------------------------------| + * | F3| F4| | Tab | Q| W| E| R| T| Y| U| I| O| P| [| ] | | 7| 8| 9| -| + * |-------| |------------------------------------------------------|Ent|---------------| + * | F5| F6| | Ctrl | A| S| D| F| G| H| J| K| L| ;| '| `| | 4| 5| 6| | + * |-------| |----------------------------------------------------------------------| | + * | F7| F8| |Shif| \| Z| X| C| V| B| N| M| ,| .| /|Shift|PrS| 1| 2| 3| +| + * |-------| |----------------------------------------------------------------------| | + * | F9|F10| | Alt | Space |CapsLck| 0 | . | | + * `-------' `--------------------------------------------------------------------------' +*/ + +#define LAYOUT_5291( \ + KEY_F1,KEY_F2, KEY_ESC, KEY_1, KEY_2,KEY_3,KEY_4,KEY_5,KEY_6,KEY_7,KEY_8,KEY_9, KEY_0, KEY_MIN, KEY_EQU, KEY_BACK, KEY_NLOCK, KEY_SLOCK, \ + KEY_F3,KEY_F4, KEY_TAB, KEY_Q, KEY_W,KEY_E,KEY_R,KEY_T,KEY_Y,KEY_U,KEY_I,KEY_O, KEY_P, KEY_LBRC,KEY_RBRC, KEY_PAD7,KEY_PAD8, KEY_PAD9,KEY_PMIN, \ + KEY_F5,KEY_F6, KEY_LCTR,KEY_A, KEY_S,KEY_D,KEY_F,KEY_G,KEY_H,KEY_J,KEY_K,KEY_L, KEY_SEMI,KEY_QUOT,KEY_TICK, KEY_ENTR,KEY_PAD4,KEY_PAD5, KEY_PAD6, \ + KEY_F7,KEY_F8, KEY_LSFS,KEY_BSLS,KEY_Z,KEY_X,KEY_C,KEY_V,KEY_B,KEY_N,KEY_M,KEY_COMM,KEY_DOT, KEY_SLS,KEY_RSFS, KEY_PAST,KEY_PAD1,KEY_PAD2, KEY_PAD3,KEY_PPLS, \ + KEY_F9,KEY_F10, KEY_LALT, KEY_SPACE, KEY_CLOCK, KEY_PAD0, KEY_PDOT \ +) \ +{ {KEY_Z, KEY_S, KEY_W, KEY_3 }\ +, {KEY_X, KEY_D, KEY_E, KEY_4 }\ +, {KEY_C, KEY_F, KEY_R, KEY_5 }\ +, {KEY_V, KEY_G, KEY_T, KEY_6 }\ +, {KEY_B, KEY_H, KEY_Y, KEY_7 }\ +, {KEY_N, KEY_J, KEY_U, KEY_8 }\ +, {KEY_PAD2, KEY_PAD5,KEY_PAD8,KEY_NLOCK }\ +, {KEY_M, KEY_K, KEY_I, KEY_9 }\ +, {KEY_COMM, KEY_L, KEY_O, KEY_0 }\ +, {KEY_DOT, KEY_SEMI,KEY_P, KEY_MIN }\ +, {KEY_SLS, KEY_QUOT,KEY_LBRC,KEY_EQU }\ +, {KEY_SPACE, KEY_RSFS,KEY_TICK,KEY_RBRC }\ +, {KEY_CLOCK, KEY_PAST,KEY_ENTR,KEY_BACK }\ +, {KEY_PAD0, KEY_PAD1,KEY_PAD4,KEY_PAD7 }\ +, {KEY_PPLS, KC_NO, KEY_PMIN,KEY_SLOCK }\ +, {KEY_PDOT, KEY_PAD3,KEY_PAD6,KEY_PAD9 }\ +, {KEY_BSLS, KEY_A, KEY_Q, KEY_2 }\ +, {KEY_LALT, KC_NO, KC_NO, KEY_1 }\ +, {KEY_F7, KEY_F5, KEY_F3, KEY_F1 }\ +, {KEY_F8, KEY_F6, KEY_F4, KEY_F2 }\ +, {KC_F10, KC_NO, KC_NO, KC_NO }\ +, {KC_F9, KC_NO, KC_NO, KC_NO }\ +, {KEY_LSFS, KEY_LCTR,KEY_TAB, KEY_ESC }\ +, {KC_NO, KC_NO, KC_NO, KC_NO }\ +} + +#define LAYOUT LAYOUT_5291 \ No newline at end of file diff --git a/keyboards/converter/ibm_5291/info.json b/keyboards/converter/ibm_5291/info.json new file mode 100644 index 000000000000..080a16336ee6 --- /dev/null +++ b/keyboards/converter/ibm_5291/info.json @@ -0,0 +1,6 @@ +{ + "keyboard_name": "IBM 5291", + "keyboard_folder": "converter/5291", + "url": "https://deskthority.net/wiki/IBM_Model_F#IBM_5291_Keyboard", + "maintainer": "listofoptions", +} diff --git a/keyboards/converter/ibm_5291/keymaps/default/keymap.c b/keyboards/converter/ibm_5291/keymaps/default/keymap.c new file mode 100644 index 000000000000..9b286c887d61 --- /dev/null +++ b/keyboards/converter/ibm_5291/keymaps/default/keymap.c @@ -0,0 +1,233 @@ +/* +Copyright 2018 listofoptions + +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 QMK_KEYBOARD_H +/* +enum xt_keycodes + { XT_PAST = SAFE_RANGE // XT pad asterisk / print screen + , XT_SLCK // XT scroll lock / break + , XT_F6 // F6 / app key + , XT_F5 // F5 / gui + , XT_F9 // F9 / F11 + , XT_F10 // F10 / F12 + } ; + +static bool shift_pressed = false , + alt_pressed = false , + ctrl_pressed = false , + xt_pscr_pressed = false , + xt_brk_pressed = false , + xt_app_pressed = false , + xt_gui_pressed = false , + xt_lout_pressed = false , + xt_f11_pressed = false , + xt_f12_pressed = false ; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_LSFT: + case KC_RSFT: + if (record->event.pressed) { + shift_pressed = true ; + } else { + shift_pressed = false ; + } + return true; + break; + + case KC_LALT: + if (record->event.pressed) { + alt_pressed = true ; + } else { + alt_pressed = false ; + } + return true; + break; + + case KC_LCTL: + if (record->event.pressed) { + ctrl_pressed = true ; + } else { + ctrl_pressed = false ; + } + return true; + break; + + case XT_PAST: + if (record->event.pressed) { + if (shift_pressed) { + xt_pscr_pressed = true ; + register_code(KC_PSCR); + } else { + register_code(KC_PAST); + } + } else { + if (xt_pscr_pressed) { + xt_pscr_pressed = false ; + unregister_code(KC_PSCR); + } else { + unregister_code(KC_PAST); + } + } + return false; + break; + + case XT_SLCK: + if (record->event.pressed) { + if (ctrl_pressed) { + xt_brk_pressed = true ; + register_code(KC_BRK); + } else { + register_code(KC_SLCK); + } + } else { + if (xt_brk_pressed) { + xt_brk_pressed = false ; + unregister_code(KC_BRK); + } else { + unregister_code(KC_SLCK); + } + } + return false; + break; + + case XT_F6: + if (record->event.pressed) { + if (shift_pressed) { + xt_app_pressed = true ; + register_code(KC_APP); + } else { + register_code(KC_F6); + } + } else { + if (xt_app_pressed) { + xt_app_pressed = false ; + unregister_code(KC_APP); + } else { + unregister_code(KC_F6); + } + } + return false; + break; + + case XT_F5: + if (record->event.pressed) { + if (shift_pressed) { + xt_gui_pressed = true ; + register_code(KC_LGUI); + } else if (ctrl_pressed) { + xt_lout_pressed = true ; + register_code (KC_LGUI) ; + register_code (KC_L) ; + } else { + register_code(KC_F5); + } + } else { + if (xt_gui_pressed) { + xt_gui_pressed = false ; + unregister_code(KC_LGUI); + } else if (xt_lout_pressed) { + xt_lout_pressed = false ; + unregister_code (KC_LGUI) ; + unregister_code (KC_L) ; + } else { + unregister_code(KC_F5); + } + } + return false; + break; + + case XT_F9: + if (record->event.pressed) { + if (shift_pressed) { + xt_f11_pressed = true ; + register_code(KC_F11); + } else { + register_code(KC_F9); + } + } else { + if (xt_f11_pressed) { + xt_f11_pressed = false ; + unregister_code(KC_F11); + } else { + unregister_code(KC_F9); + } + } + return false; + break; + + case XT_F10: + if (record->event.pressed) { + if (shift_pressed) { + xt_f12_pressed = true ; + register_code(KC_F12); + } else { + register_code(KC_F10); + } + } else { + if (xt_f12_pressed) { + xt_f12_pressed = false ; + unregister_code(KC_F12); + } else { + unregister_code(KC_F10); + } + } + return false; + break; + + default: + return true; + break; + } + + return true; +} +*/ + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +// default layout is the standard XT layout +/* + * ,-------. ,--------------------------------------------------------------------------. + * | F1| F2| |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| BS |NumLck |ScrLck | + * |-------| |--------------------------------------------------------------------------| + * | F3| F4| | Tab | Q| W| E| R| T| Y| U| I| O| P| [| ] | | 7| 8| 9| -| + * |-------| |------------------------------------------------------|Ent|---------------| + * | F5| F6| | Ctrl | A| S| D| F| G| H| J| K| L| ;| '| `| | 4| 5| 6| | + * |-------| |----------------------------------------------------------------------| | + * | F7| F8| |Shif| \| Z| X| C| V| B| N| M| ,| .| /|Shift| *| 1| 2| 3| +| + * |-------| |----------------------------------------------------------------------| | + * | F9|F10| | Alt | Space |CapsLck| 0 | . | | + * `-------' `--------------------------------------------------------------------------' +*/ +/* + [0] = LAYOUT ( + KC_F1,KC_F2, 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_NLCK, XT_SLCK, + KC_F3,KC_F4, 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_P7,KC_P8, KC_P9, KC_PMNS, + XT_F5,XT_F6, 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_GRV, KC_ENT, KC_P4,KC_P5, KC_P6, + KC_F7,KC_F8, KC_LSFT,KC_BSLS,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT, KC_SLSH,KC_RSFT,XT_PAST,KC_P1,KC_P2, KC_P3, KC_PPLS, + XT_F9,XT_F10,KC_LALT, KC_SPACE, KC_CAPS, KC_P0, KC_PDOT + ) +*/ + [0] = LAYOUT ( + KC_F1,KC_F2, 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_NLCK, KC_SLCK, + KC_F3,KC_F4, 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_P7,KC_P8, KC_P9, KC_PMNS, + KC_F5,KC_F6, 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_GRV, KC_ENT, KC_P4,KC_P5, KC_P6, + KC_F7,KC_F8, KC_LSFT,KC_BSLS,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT, KC_SLSH,KC_RSFT,KC_PAST,KC_P1,KC_P2, KC_P3, KC_PPLS, + KC_F9,KC_F10,KC_LALT, KC_SPACE, KC_CAPS, KC_P0, KC_PDOT + ) +} ; + diff --git a/keyboards/converter/ibm_5291/keymaps/kbdbabel_doc_ibm5291_kbd.pdf b/keyboards/converter/ibm_5291/keymaps/kbdbabel_doc_ibm5291_kbd.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3560598f02b8bacc12ef9426875a5b7076e32eab GIT binary patch literal 13054 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 literal 0 HcmV?d00001 diff --git a/keyboards/converter/ibm_5291/matrix.c b/keyboards/converter/ibm_5291/matrix.c new file mode 100644 index 000000000000..58f6e37b6508 --- /dev/null +++ b/keyboards/converter/ibm_5291/matrix.c @@ -0,0 +1,284 @@ +/* +Copyright 2018 listofoptions + +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 +#if defined(__AVR__) +#include +#endif +#include + +#include "wait.h" +#include "print.h" +#include "debug.h" +#include "util.h" +#include "matrix.h" +#include "timer.h" + +#include "config.h" + + +#ifndef DEBOUNCING_DELAY +# define DEBOUNCING_DELAY 5 +#endif + +#define print_matrix_header() print("\nr/c 01234567\n") +#define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) +#define matrix_bitpop(i) bitpop(matrix[i]) +#define ROW_SHIFTER ((uint8_t)1) +#define check_bit(var,pos) ((var) & (1<<(pos))) + +#define NUM_ROW_PINS 5 +#define NUM_COL_PINS 2 + +static const uint8_t row_pins [NUM_ROW_PINS] = MATRIX_ROW_PINS ; +static const uint8_t col_pins [NUM_ROW_PINS] = MATRIX_COL_PINS ; + +#if ( DEBOUNCING_DELAY > 0 ) +static uint16_t debouncing_time ; +static bool debouncing = false ; +#endif + +static uint8_t matrix [MATRIX_ROWS] = {0}; + +#if ( DEBOUNCING_DELAY > 0 ) +static uint8_t matrix_debounce [MATRIX_ROWS] = {0}; +#endif + +static +inline +void toggle_led(void) { + uint8_t pin = LED_PIN ; + _SFR_IO8((pin >> 4) + 2) ^= _BV(pin & 0xF); +} + +static +inline +void init_led(void) { + uint8_t pin = LED_PIN ; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW +} + +static +inline +void init_data(void) { + uint8_t pin = MATRIX_DATA_PIN ; + _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // LO +} + +static +inline +void init_strobe(void) { + uint8_t pin = MATRIX_STROBE_PIN ; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI +} + +static +inline +void init_rows(void) { + for ( uint8_t i = 0 ; i < NUM_ROW_PINS; ++i ) { + uint8_t pin = row_pins[i]; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + } +} + +static +inline +void init_cols(void) { + for ( uint8_t i = 0 ; i < NUM_COL_PINS; ++i ) { + uint8_t pin = col_pins[i]; + _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + } +} + +static +inline +void select_row(uint8_t current_row) { + for ( uint8_t i = 0 ; i < NUM_ROW_PINS; ++i ) { + uint8_t pin = row_pins[i] ; + if ( check_bit( current_row, i ) ) { + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } else { + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + } + } + wait_us(30) ; +} + +static +inline +void select_col(uint8_t current_col) { + for ( uint8_t i = 0 ; i < NUM_COL_PINS; ++i ) { + uint8_t pin = col_pins[i] ; + if ( check_bit( current_col, i ) ) { + _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI + } else { + _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW + } + } + wait_us(30) ; +} + +static +inline +uint8_t matrix_strobe(uint8_t col_index) { + uint8_t strobe_pin = MATRIX_STROBE_PIN ; + uint8_t data_pin = MATRIX_DATA_PIN ; + + // set strobe pin low + _SFR_IO8((strobe_pin >> 4) + 2) &= ~_BV(strobe_pin & 0xF); + + wait_us(30) ; + + // read data + uint8_t data = (_SFR_IO8(data_pin >> 4) & _BV(data_pin & 0xF)) ; + + // set strobe pin hi + _SFR_IO8((strobe_pin >> 4) + 2) |= _BV(strobe_pin & 0xF); + + uint8_t out = data ? (1 << col_index) : 0 ; + return out ; +} + +static +bool matrix_read(uint8_t current_matrix[], uint8_t current_row) { + // Store last value of row prior to reading + uint8_t last_row_value = current_matrix[current_row]; + + // Clear data in matrix row + current_matrix[current_row] = 0; + + select_row(current_row); + + // For each col... + for(uint8_t col_index = 0; col_index < MATRIX_COLS; ++col_index) { + + select_col(col_index) ; + + // strobe the matrix + // Populate the matrix row with the state of the data pin + current_matrix[current_row] |= matrix_strobe(col_index) ; + } + + bool test = last_row_value != current_matrix[current_row] ; + return test ; +} + +__attribute__ ((weak)) +void matrix_init_quantum(void) { + matrix_init_kb(); +} + +__attribute__ ((weak)) +void matrix_scan_quantum(void) { + matrix_scan_kb(); +} + +__attribute__ ((weak)) +void matrix_init_kb(void) { + matrix_init_user(); +} + +__attribute__ ((weak)) +void matrix_scan_kb(void) { + matrix_scan_user(); +} + +__attribute__ ((weak)) +void matrix_init_user(void) { +} + +__attribute__ ((weak)) +void matrix_scan_user(void) { +} + +inline +uint8_t matrix_rows(void) { + return MATRIX_ROWS; +} + +inline +uint8_t matrix_cols(void) { + return MATRIX_COLS; +} + +inline +uint8_t matrix_get_row(uint8_t row) { + return matrix[row]; +} + +void matrix_init(void) { + init_led() ; + init_rows() ; + init_cols() ; + init_data() ; + init_strobe() ; + + // initialize matrix state: all keys off + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = 0; +# if (DEBOUNCING_DELAY > 0) + matrix_debounce [i] = 0; +# endif + } + + matrix_init_quantum() ; +} + +uint8_t matrix_scan(void) { + for ( uint8_t current_row = 0; current_row < MATRIX_ROWS; ++current_row ) { +# if (DEBOUNCING_DELAY > 0) + bool matrix_changed = matrix_read(matrix_debounce, current_row); + + if (matrix_changed) { + debouncing = true ; + debouncing_time = timer_read(); + } + +# else + matrix_read(matrix, current_row); +# endif + } + +# if (DEBOUNCING_DELAY > 0) + if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) { + for (uint8_t i = 0; i < MATRIX_ROWS; i++) { + matrix[i] = matrix_debounce[i]; + } + debouncing = false; + } +# endif + + matrix_scan_quantum(); + return 1; +} + +void matrix_print(void) { + print_matrix_header(); + + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + phex(row); print(": "); + print_matrix_row(row); + print("\n"); + } +} diff --git a/keyboards/converter/ibm_5291/matrix.csv b/keyboards/converter/ibm_5291/matrix.csv new file mode 100644 index 000000000000..40462c2143ef --- /dev/null +++ b/keyboards/converter/ibm_5291/matrix.csv @@ -0,0 +1,96 @@ +0,Z +1,S +2,W +3,3 +4,X +5,D +6,E +7,4 +8,C +9,F +10,R +11,5 +12,V +13,G +14,T +15,6 +16,B +17,H +18,Y +19,7 +20,N +21,J +22,U +23,8 +24,PAD_2 +25,PAD_5 +26,PAD_8 +27,NUM_LOCK +28,M +29,K +30,I +31,9 +32,COMMA +33,L +34,O +35,0 +36,PERIOD +37,SEMICOLON +38,P +39,MINUS +40,SLASH +41,QUOTE +42,LEFT_BRACE +43,EQUAL +44,SPACE +45,RSHIFT +46,BACK_QUOTE +47,RIGHT_BRACE +48,CAPS_LOCK +49,PAD_ASTERIX +50,ENTER +51,BACKSPACE +52,PAD_0 +53,PAD_1 +54,PAD_4 +55,PAD_7 +56,PAD_PLUS +57,UNASSIGNED +58,PAD_MINUS +59,SCROLL_LOCK +60,PAD_PERIOD +61,PAD_3 +62,PAD_6 +63,PAD_9 +64,BACKSLASH +65,A +66,Q +67,2 +68,LALT +69,UNASSIGNED +70,UNASSIGNED +71,1 +72,F7 +73,F5 +74,F3 +75,F1 +76,F8 +77,F6 +78,F4 +79,F2 +80,F10 +81,UNASSIGNED +82,UNASSIGNED +83,UNASSIGNED +84,F9 +85,UNASSIGNED +86,UNASSIGNED +87,UNASSIGNED +88,LSHIFT +89,LCTRL +90,TAB +91,ESC +92,UNASSIGNED +93,UNASSIGNED +94,UNASSIGNED +95,UNASSIGNED diff --git a/keyboards/converter/ibm_5291/readme.md b/keyboards/converter/ibm_5291/readme.md new file mode 100644 index 000000000000..06ae2e994e73 --- /dev/null +++ b/keyboards/converter/ibm_5291/readme.md @@ -0,0 +1,70 @@ +# IBM 5291 keyboard converter + +![5291](https://deskthority.net/wiki/IBM_Model_F#IBM_5291_Keyboard) + +A converter for the eponymous keyboard. + +Keyboard Maintainer: [Listofoptions](https://github.com/listofoptions) +Hardware Supported: IBM 5291, Teensy 2.0 + +Make example for this keyboard (after setting up your build environment): + + make converter/ibm_5291:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). + + +the pinout is as follows: + +IBM−5291−Cable to Pinhead−14 + +| pin | description +----|------------------------ +1 | GND +2 | NC +3 | GND +4 | GN) +5 | +5V +6 | D0 +7 | D1 +8 | D2 +9 | D3 +10| D4 +11| D5 +12| D6 +13| Strobe +14| Out + +the pins on this connector are organized ![here](https://geekhack.org/index.php?action=dlattach;topic=48950.0;attach=36759;image) + +IBM−5291−2 Cable with DB15M connector + +| pin | description +----|------------- +|1,2,3 | GND +|4 | +5V +|5 | D0 +|6 | D1 +|7 | D2 +|8 | D3 +|9 | D4 +|10 | D5 +|11 | D6 +|12 | Strobe +|13 | Out +|14 | PE +|15 | NC + +the above connector is actually numbered so it should be easier to determine +where the needed connections are. + +to connect to the teensy, the following are pins are needed (if you should choose not set your own): +* PB0 -> PB6 are connected to D0 -> D6 +* +5V is connected to the corresponding teensy pin +* gnd is as well, only one of the gnd pins needs to be connected though. +* strobe is connected to pin PD1 +* data is connected to PD0 +* PE does not need to be connected to anything, but it could also be connected to gnd + +sources: + http://www.retrocomputing.eu/documents/5291_MaintenanceLibrary.pdf diff --git a/keyboards/converter/ibm_5291/rules.mk b/keyboards/converter/ibm_5291/rules.mk new file mode 100644 index 000000000000..ca0c850c0bab --- /dev/null +++ b/keyboards/converter/ibm_5291/rules.mk @@ -0,0 +1,72 @@ +# 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 + +# Bootloader +# This definition is optional, and if your keyboard supports multiple bootloaders of +# different sizes, comment this out, and the correct address will be loaded +# automatically (+60). See bootloader.mk for all options. +BOOTLOADER = halfkay + +# 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 = 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 +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. +API_SYSEX_ENABLE = no +SPLIT_KEYBOARD = no +WAIT_FOR_USB = yes + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +LAYOUTS_HAS_RGB = NO + +CUSTOM_MATRIX = yes +SRC = matrix.c \ No newline at end of file From fe68599a34af5e4f4f905a4127077fa321dbc0de Mon Sep 17 00:00:00 2001 From: zgtm Date: Mon, 26 Nov 2018 19:01:34 +0100 Subject: [PATCH 463/505] Keyboard: add generic ortho 5x15 layout support to Idobo (#4486) --- keyboards/idobo/rules.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/keyboards/idobo/rules.mk b/keyboards/idobo/rules.mk index 383a3594b474..246d152c9706 100644 --- a/keyboards/idobo/rules.mk +++ b/keyboards/idobo/rules.mk @@ -79,3 +79,5 @@ 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 HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) + +LAYOUTS = ortho_5x15 From b91dfa04e3bad560fb6fe2360dd51fb95d95fcbf Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 26 Nov 2018 14:35:01 -0800 Subject: [PATCH 464/505] Add support for PR and Issue templates to QMK_firmware GitHub (#4491) * Add support document * Add Bug Report * Add GitHub Pull Request Template * Feature request issue template * Touch up feature request template * Add 'other issues' template * move support doc --- .github/ISSUE_TEMPLATE/bug_report.md | 27 ++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 15 ++++++++ .github/ISSUE_TEMPLATE/other_issues.md | 7 ++++ .github/PULL_REQUEST_TEMPLATE.md | 22 ++++++++++++ docs/support.md | 43 +++++++++++++++++++++++ 5 files changed, 114 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/other_issues.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 docs/support.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000000..ed5d56ce32b8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,27 @@ +--- +name: Bug report +about: Create a report to help us improve the QMK Firmware +--- + +**Describe the bug** + +A clear and concise description of what the bug is. + +**System Information** + - Keyboard: + - Revision (if applicable): + - Operating System: + - avr-gcc version: + (Run `avr-gcc --version` to find out) + - arm gcc version: + (Run `arm-none-eabi-gcc --version` to find out) + - QMK Firmware version: + (you can run `git describe --abbrev=0 --tags` to find this out) + - Any keyboard related software installed? + - [ ] Auto Hot Key + - [ ] Karabiner + - [ ] Other + +**Additional context** + +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000000..ac924b3ac7f8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,15 @@ +--- +name: Feature request +about: Suggest a new feature or changes to existing features + +--- + +## Feature Request Type + +- [ ] Core Functionality +- [ ] Add-on hardware support (eg audio, rgb, oled screen, etc) +- [ ] Alteration (enhancement/optimization) of existing Feature(s) +- [ ] New behavior + +## Description +A few sentances describing what it is that you'd like to see. Additional information (such as links to spec sheets, licensing info, other related issues or PR's, etc) would be helpful. diff --git a/.github/ISSUE_TEMPLATE/other_issues.md b/.github/ISSUE_TEMPLATE/other_issues.md new file mode 100644 index 000000000000..53481f9ab89a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/other_issues.md @@ -0,0 +1,7 @@ +--- +name: Other issues +about: Anything else that doesn't fall into the above categories. + +--- + +Please check https://docs.qmk.fm/SUPPORT.md for additional resources first. If that doesn't answer your question, check the bug report option, as that may be more appropriate. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000000..36410da266fe --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,22 @@ +## Code Change Type +- [ ] Core +- [ ] Feature +- [ ] Bugfix +- [ ] Keyboard +- [ ] Keymap/Layout/Userspace +- [ ] Enhancement/Optimization +- [ ] Documentation + +## Description +A few sentences describing the overall goals of the pull request's commits. + +## Todo +- [ ] Tests +- [ ] Documentation + +## Issues Fixed or Closed by this PR + +* + +## Long Description +If needed, a longer description and a list of changes should be added here to make it clear what exactly this PR's goals are. diff --git a/docs/support.md b/docs/support.md new file mode 100644 index 000000000000..28894c2c3158 --- /dev/null +++ b/docs/support.md @@ -0,0 +1,43 @@ +# Support + +If you need help with something, the best place to get quick support is going to be on our [Discord Server](https://discord.gg/Uq7gcHh). There is usually somebody online, and there are a bunch of very helpful people there. + +Don't forget to read our [Code of Conduct](https://qmk.fm/coc/). + +## Help! I don't know where to start! + +If this is the case, then you should start with our [Newbs Guide](https://docs.qmk.fm/#/newbs). There is a lot of great info there, and that should cover everything you need to get started. + +If that's an issue, hop onto the [QMK Configurator](https://config.qmk.fm), as that will handle a majority of what you need there. + +## Help! I'm having issues flashing! + +First, head to the [Compiling/Flashing FAQ Page](https://docs.qmk.fm/#/faq_build). There is a good deal of info there, and you'll find a bunch of solutions to common issues there. + +## Help, I have an issue that isn't covered by the links above + +Okay, that's fine. Then please check the [open issues in our GitHub](https://github.com/qmk/qmk_firmware/issues) to see if somebody is experiencing the same thing (make sure it's not just similar, but actually the same). + +If you can't find anything, then please open a [new issue](https://github.com/qmk/qmk_firmware/issues)! + +## What if I found a bug? + +Then please open an issue, and if you know how to fix it, open up a Pull Request on GitHub with the fix. + +## But `git` and `GitHub` are intimidating! + +Don't worry, we have some pretty nice [Guidelines](https://docs.qmk.fm/#/newbs_best_practices) on how to start using `git` and GitHub to make things easier to develop. + +Additionally, you can find additional `git` and GitHub related links [here](https://docs.qmk.fm/#/newbs_learn_more_resources). + +## I have a Keyboard that I want to add support for + +Awesome! Open up a Pull Request for it. We'll review the code, and merge it! + +### What if I want to do brand it with `QMK`? + +That's amazing! We would love to assist you with that! + +In fact, we have a [whol page](https://qmk.fm/powered/) dedicated to adding QMK Branding to your page and keyboard. This covers pretty much everything you need (knowledge and images) to officially support QMK. + +If you have any questions about this, open an issue or head to [Discord](https://discord.gg/Uq7gcHh). From b7b20cd9dfc8928b3c31560a410c75e9a9ec232a Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 26 Nov 2018 14:35:48 -0800 Subject: [PATCH 465/505] Revert "Add support for PR and Issue templates to QMK_firmware GitHub (#4491)" (#4492) This reverts commit b91dfa04e3bad560fb6fe2360dd51fb95d95fcbf. --- .github/ISSUE_TEMPLATE/bug_report.md | 27 -------------- .github/ISSUE_TEMPLATE/feature_request.md | 15 -------- .github/ISSUE_TEMPLATE/other_issues.md | 7 ---- .github/PULL_REQUEST_TEMPLATE.md | 22 ------------ docs/support.md | 43 ----------------------- 5 files changed, 114 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 .github/ISSUE_TEMPLATE/other_issues.md delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 docs/support.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index ed5d56ce32b8..000000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve the QMK Firmware ---- - -**Describe the bug** - -A clear and concise description of what the bug is. - -**System Information** - - Keyboard: - - Revision (if applicable): - - Operating System: - - avr-gcc version: - (Run `avr-gcc --version` to find out) - - arm gcc version: - (Run `arm-none-eabi-gcc --version` to find out) - - QMK Firmware version: - (you can run `git describe --abbrev=0 --tags` to find this out) - - Any keyboard related software installed? - - [ ] Auto Hot Key - - [ ] Karabiner - - [ ] Other - -**Additional context** - -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index ac924b3ac7f8..000000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -name: Feature request -about: Suggest a new feature or changes to existing features - ---- - -## Feature Request Type - -- [ ] Core Functionality -- [ ] Add-on hardware support (eg audio, rgb, oled screen, etc) -- [ ] Alteration (enhancement/optimization) of existing Feature(s) -- [ ] New behavior - -## Description -A few sentances describing what it is that you'd like to see. Additional information (such as links to spec sheets, licensing info, other related issues or PR's, etc) would be helpful. diff --git a/.github/ISSUE_TEMPLATE/other_issues.md b/.github/ISSUE_TEMPLATE/other_issues.md deleted file mode 100644 index 53481f9ab89a..000000000000 --- a/.github/ISSUE_TEMPLATE/other_issues.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -name: Other issues -about: Anything else that doesn't fall into the above categories. - ---- - -Please check https://docs.qmk.fm/SUPPORT.md for additional resources first. If that doesn't answer your question, check the bug report option, as that may be more appropriate. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 36410da266fe..000000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,22 +0,0 @@ -## Code Change Type -- [ ] Core -- [ ] Feature -- [ ] Bugfix -- [ ] Keyboard -- [ ] Keymap/Layout/Userspace -- [ ] Enhancement/Optimization -- [ ] Documentation - -## Description -A few sentences describing the overall goals of the pull request's commits. - -## Todo -- [ ] Tests -- [ ] Documentation - -## Issues Fixed or Closed by this PR - -* - -## Long Description -If needed, a longer description and a list of changes should be added here to make it clear what exactly this PR's goals are. diff --git a/docs/support.md b/docs/support.md deleted file mode 100644 index 28894c2c3158..000000000000 --- a/docs/support.md +++ /dev/null @@ -1,43 +0,0 @@ -# Support - -If you need help with something, the best place to get quick support is going to be on our [Discord Server](https://discord.gg/Uq7gcHh). There is usually somebody online, and there are a bunch of very helpful people there. - -Don't forget to read our [Code of Conduct](https://qmk.fm/coc/). - -## Help! I don't know where to start! - -If this is the case, then you should start with our [Newbs Guide](https://docs.qmk.fm/#/newbs). There is a lot of great info there, and that should cover everything you need to get started. - -If that's an issue, hop onto the [QMK Configurator](https://config.qmk.fm), as that will handle a majority of what you need there. - -## Help! I'm having issues flashing! - -First, head to the [Compiling/Flashing FAQ Page](https://docs.qmk.fm/#/faq_build). There is a good deal of info there, and you'll find a bunch of solutions to common issues there. - -## Help, I have an issue that isn't covered by the links above - -Okay, that's fine. Then please check the [open issues in our GitHub](https://github.com/qmk/qmk_firmware/issues) to see if somebody is experiencing the same thing (make sure it's not just similar, but actually the same). - -If you can't find anything, then please open a [new issue](https://github.com/qmk/qmk_firmware/issues)! - -## What if I found a bug? - -Then please open an issue, and if you know how to fix it, open up a Pull Request on GitHub with the fix. - -## But `git` and `GitHub` are intimidating! - -Don't worry, we have some pretty nice [Guidelines](https://docs.qmk.fm/#/newbs_best_practices) on how to start using `git` and GitHub to make things easier to develop. - -Additionally, you can find additional `git` and GitHub related links [here](https://docs.qmk.fm/#/newbs_learn_more_resources). - -## I have a Keyboard that I want to add support for - -Awesome! Open up a Pull Request for it. We'll review the code, and merge it! - -### What if I want to do brand it with `QMK`? - -That's amazing! We would love to assist you with that! - -In fact, we have a [whol page](https://qmk.fm/powered/) dedicated to adding QMK Branding to your page and keyboard. This covers pretty much everything you need (knowledge and images) to officially support QMK. - -If you have any questions about this, open an issue or head to [Discord](https://discord.gg/Uq7gcHh). From edb6c98fd23ab102069037f3dbfbd46c6067e86a Mon Sep 17 00:00:00 2001 From: zvecr Date: Mon, 26 Nov 2018 22:58:22 +0000 Subject: [PATCH 466/505] Keyboard: Enable community ortho 4x12 layouts for lets split eh (#4487) * Enable ortho_4x12 community layouts for lets_split_eh * Keymap build fixes now that ortho_4x12 is enabled * Keymap build fixes now that ortho_4x12 is enabled --- .../lets_split_eh/keymaps/doxish_dvorak/keymap.c | 4 +--- keyboards/lets_split_eh/lets_split_eh.c | 15 +++++++++++++++ keyboards/lets_split_eh/rules.mk | 2 ++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/keyboards/lets_split_eh/keymaps/doxish_dvorak/keymap.c b/keyboards/lets_split_eh/keymaps/doxish_dvorak/keymap.c index 8976081542d8..721312623e30 100644 --- a/keyboards/lets_split_eh/keymaps/doxish_dvorak/keymap.c +++ b/keyboards/lets_split_eh/keymaps/doxish_dvorak/keymap.c @@ -1,6 +1,4 @@ -#include "eeconfig.h" - -extern keymap_config_t keymap_config; +#include QMK_KEYBOARD_H // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. diff --git a/keyboards/lets_split_eh/lets_split_eh.c b/keyboards/lets_split_eh/lets_split_eh.c index d5a312085d12..7249f54cf262 100644 --- a/keyboards/lets_split_eh/lets_split_eh.c +++ b/keyboards/lets_split_eh/lets_split_eh.c @@ -1 +1,16 @@ #include "lets_split_eh.h" + +#ifdef SWAP_HANDS_ENABLE +__attribute__ ((weak)) +const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { + + {{0, 4}, {1, 4}, {2, 4}, {3, 4}, {4, 4}, {5, 4}}, + {{0, 5}, {1, 5}, {2, 5}, {3, 5}, {4, 5}, {5, 5}}, + {{0, 6}, {1, 6}, {2, 6}, {3, 6}, {4, 6}, {5, 6}}, + {{0, 7}, {1, 7}, {2, 7}, {3, 7}, {4, 7}, {5, 7}}, + {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}}, + {{0, 1}, {1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}}, + {{0, 2}, {1, 2}, {2, 2}, {3, 2}, {4, 2}, {5, 2}}, + {{0, 3}, {1, 3}, {2, 3}, {3, 3}, {4, 3}, {5, 3}}, +}; +#endif diff --git a/keyboards/lets_split_eh/rules.mk b/keyboards/lets_split_eh/rules.mk index dffeb9fa3c01..99b1ba23449e 100644 --- a/keyboards/lets_split_eh/rules.mk +++ b/keyboards/lets_split_eh/rules.mk @@ -67,4 +67,6 @@ SPLIT_KEYBOARD = yes # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +LAYOUTS = ortho_4x12 + DEFAULT_FOLDER = lets_split_eh/eh From ecd21b44a8efd5c7241ebf48c65fc7b30134865f Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 26 Nov 2018 16:45:24 -0800 Subject: [PATCH 467/505] Update to drashna userspace and keymaps (#4459) * Fix reversed bool check in layer_state_set * Add Quefrency 65 for a friend * Add Ergodox EZ Glow keymap * Add RGB Matrix Code * Further changes to rgb matrix ErgoDox EZ * Update bjohnson keymaps * Fix CRKBD display * Overhaul to corne keyboard * Narrow scope for keylogger * Minor layout tweaks to Corne Keyboard * additional CRKBD tweaks * Minor tweaks to CRKBD * Add all characters for keylogger * Ergodox EZ Glow overhaul * Fix Ergodox EZ Glow layer colors * Increase Tapping Term for Corne Keyboard * Fix unicode-ish * Revert some changes * Add layer specific lighting effects * Some minor tweaks to ergodox glow config * revert changes to ergodox files * Update Glow readme * Add more tapping term defines * Fix changes * Fix ergodox keymap * Hopefully fix sleeping * Disable layer indications if rgb matrix is disabled * Add support for sleeping and rgb layer change toggle to ergodox ez glow * Make RGB Layer Indication Great Again * Make Unicode Great Again * Remove placeholder define Co-Authored-By: drashna * Remove placeholder define Co-Authored-By: drashna * Remove old EEPROM Reset keycode --- keyboards/crkbd/keymaps/drashna/config.h | 7 +- keyboards/crkbd/keymaps/drashna/keymap.c | 153 +++++++++++++----- keyboards/crkbd/keymaps/drashna/rules.mk | 8 +- keyboards/iris/keymaps/drashna/keymap.c | 2 +- keyboards/iris/keymaps/drashna/rules.mk | 2 +- keyboards/orthodox/keymaps/drashna/keymap.c | 2 +- keyboards/quefrency/keymaps/bjohnson/config.h | 41 +++++ keyboards/quefrency/keymaps/bjohnson/keymap.c | 33 ++++ keyboards/quefrency/keymaps/bjohnson/rules.mk | 22 +++ keyboards/viterbi/keymaps/drashna/keymap.c | 4 +- layouts/community/ergodox/drashna/keymap.c | 120 +++++++++++++- .../community/ergodox/drashna_glow/README.md | 1 + .../community/ergodox/drashna_glow/config.h | 11 ++ .../community/ergodox/drashna_glow/keymap.c | 67 ++++++++ .../community/ergodox/drashna_glow/rules.mk | 9 ++ layouts/community/ortho_4x12/drashna/keymap.c | 2 +- users/drashna/config.h | 4 +- users/drashna/drashna.c | 22 +-- users/drashna/drashna.h | 8 +- users/drashna/rgb_stuff.c | 86 +++++++--- users/drashna/rgb_stuff.h | 2 +- users/drashna/rules.mk | 17 ++ users/drashna/send_unicode.c | 54 +++++++ users/drashna/template.c | 7 - users/drashna/template.h | 4 +- 25 files changed, 576 insertions(+), 112 deletions(-) create mode 100644 keyboards/quefrency/keymaps/bjohnson/config.h create mode 100644 keyboards/quefrency/keymaps/bjohnson/keymap.c create mode 100644 keyboards/quefrency/keymaps/bjohnson/rules.mk create mode 100644 layouts/community/ergodox/drashna_glow/README.md create mode 100644 layouts/community/ergodox/drashna_glow/config.h create mode 100644 layouts/community/ergodox/drashna_glow/keymap.c create mode 100644 layouts/community/ergodox/drashna_glow/rules.mk diff --git a/keyboards/crkbd/keymaps/drashna/config.h b/keyboards/crkbd/keymaps/drashna/config.h index adfd79044d91..cbc3feeb6165 100644 --- a/keyboards/crkbd/keymaps/drashna/config.h +++ b/keyboards/crkbd/keymaps/drashna/config.h @@ -41,5 +41,10 @@ along with this program. If not, see . #define RGBLIGHT_HUE_STEP 8 #define RGBLIGHT_SAT_STEP 8 #define RGBLIGHT_VAL_STEP 8 -#define RGBLIGHT_LIMIT_VAL 120 +#define RGBLIGHT_LIMIT_VAL 100 +#endif + +#ifdef AUDIO_ENABLE +#define B6_AUDIO +// #define NO_MUSIC_MODE #endif diff --git a/keyboards/crkbd/keymaps/drashna/keymap.c b/keyboards/crkbd/keymaps/drashna/keymap.c index 99dcdb4e1736..282ee2572534 100644 --- a/keyboards/crkbd/keymaps/drashna/keymap.c +++ b/keyboards/crkbd/keymaps/drashna/keymap.c @@ -26,10 +26,10 @@ enum crkbd_keycodes { K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A \ ) \ LAYOUT_wrapper( \ - KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_BSPC, \ - KC_TAB, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ + KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_MINS, \ + KC_TAB, ALT_T(K11), K12, K13, K14, K15, K16, K17, K18, K19, K1A, RGUI_T(KC_QUOT), \ OS_LSFT, CTL_T(K21), K22, K23, K24, K25, K26, K27, K28, K29, CTL_T(K2A), OS_RSFT, \ - LT(_LOWER,KC_GRV), KC_SPC, LALT_T(KC_BSPC), KC_DEL, KC_ENT, RAISE \ + LT(_LOWER,KC_GRV), KC_SPC, KC_BSPC, KC_DEL, KC_ENT, RAISE \ ) #define LAYOUT_crkbd_base_wrapper(...) LAYOUT_crkbd_base(__VA_ARGS__) @@ -66,14 +66,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), [_LOWER] = LAYOUT_wrapper( - KC_TILD, _________________LOWER_L1__________________, _________________LOWER_R1__________________, KC_BSPC, - KC_F11, _________________LOWER_L2__________________, _________________LOWER_R2__________________, KC_PIPE, - KC_F12, _________________LOWER_L3__________________, _________________LOWER_R3__________________, _______, + KC_F11, _________________LOWER_L1__________________, _________________LOWER_R1__________________, KC_F11, + KC_F12, _________________LOWER_L2__________________, _________________LOWER_R2__________________, KC_PIPE, + _______, _________________LOWER_L3__________________, _________________LOWER_R3__________________, _______, _______, _______, _______, _______, _______, _______ ), [_RAISE] = LAYOUT_wrapper( \ - KC_GRV, _________________RAISE_L1__________________, _________________RAISE_R1__________________, KC_BSPC, + _______, _________________RAISE_L1__________________, _________________RAISE_R1__________________, _______, _______, _________________RAISE_L2__________________, _________________RAISE_R2__________________, KC_BSLS, _______, _________________RAISE_L3__________________, _________________RAISE_R3__________________, _______, _______, _______, _______, _______, _______, _______ @@ -81,18 +81,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = LAYOUT_wrapper( \ KC_MAKE, _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, KC_RESET, - VRSN, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, EPRM, - TG_MODS, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, KC_MPLY, - _______, _______, _______, _______, _______, _______ + VRSN, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, EEP_RST, + _______, _________________ADJUST_L3_________________, _________________ADJUST_R3_________________, KC_MPLY, + _______, _______, _______, KC_NUKE, TG_MODS, _______ ) }; -int RGB_current_mode; - void matrix_init_keymap(void) { - #ifdef RGBLIGHT_ENABLE - RGB_current_mode = rgblight_config.mode; - #endif //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h #ifdef SSD1306OLED iota_gfx_init(!has_usb()); // turns on the display @@ -102,53 +97,118 @@ void matrix_init_keymap(void) { PORTD &= ~(1<<5); DDRB &= ~(1<<0); - PORTB &= ~(1<<0);} + PORTB &= ~(1<<0); +} //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h #ifdef SSD1306OLED // When add source files to SRC in rules.mk, you can use functions. -const char *read_layer_state(void); const char *read_logo(void); -void set_keylog(uint16_t keycode, keyrecord_t *record); -const char *read_keylog(void); -const char *read_keylogs(void); char layer_state_str[24]; +char modifier_state_str[24]; +char host_led_state_str[24]; +char keylog_str[24] = {}; +char keylogs_str[21] = {}; +int keylogs_str_idx = 0; + // const char *read_mode_icon(bool swap); -const char *read_host_led_state(void); // void set_timelog(void); // const char *read_timelog(void); +const char code_to_name[60] = { + ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', + 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\', + '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '}; + +void set_keylog(uint16_t keycode, keyrecord_t *record) { + char name = ' '; + if (keycode < 60) { + name = code_to_name[keycode]; + } + + // update keylog + snprintf(keylog_str, sizeof(keylog_str), "%dx%d, k%2d : %c", + record->event.key.row, record->event.key.col, + keycode, name); + + // update keylogs + if (keylogs_str_idx == sizeof(keylogs_str) - 1) { + keylogs_str_idx = 0; + for (int i = 0; i < sizeof(keylogs_str) - 1; i++) { + keylogs_str[i] = ' '; + } + } + + keylogs_str[keylogs_str_idx] = name; + keylogs_str_idx++; +} + +const char *read_keylog(void) { + return keylog_str; +} + +const char *read_keylogs(void) { + return keylogs_str; +} + + +const char* read_modifier_state(void) { + uint8_t modifiers = get_mods(); + uint8_t one_shot = get_oneshot_mods(); + + snprintf(modifier_state_str, sizeof(modifier_state_str), "Mods:%s %s %s %s", + (modifiers & MODS_CTRL_MASK || one_shot & MODS_CTRL_MASK) ? "CTL" : " ", + (modifiers & MODS_GUI_MASK || one_shot & MODS_GUI_MASK) ? "GUI" : " ", + (modifiers & MODS_ALT_MASK || one_shot & MODS_ALT_MASK) ? "ALT" : " ", + (modifiers & MODS_SHIFT_MASK || one_shot & MODS_SHIFT_MASK) ? "SFT" : " " + ); + + return modifier_state_str; +} + +const char *read_host_led_state(void) { + uint8_t leds = host_keyboard_leds(); + + snprintf(host_led_state_str, sizeof(host_led_state_str), "NL:%s CL:%s SL:%s", + (leds & (1 << USB_LED_NUM_LOCK)) ? "on" : "- ", + (leds & (1 << USB_LED_CAPS_LOCK)) ? "on" : "- ", + (leds & (1 << USB_LED_SCROLL_LOCK)) ? "on" : "- " + ); + + return host_led_state_str; +} const char* read_layer_state(void) { - switch (layer_state) { - case _QWERTY: - switch (default_layer_state) { + switch (biton32(layer_state)) { + case _RAISE: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Raise "); + break; + case _LOWER: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Lower "); + break; + case _ADJUST: + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Adjust "); + break; + default: + switch (biton32(default_layer_state)) { case _QWERTY: - snprintf(layer_state_str, sizeof(layer_state_str), "Layer: QWERTY"); + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Qwerty "); break; case _COLEMAK: snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Colemak"); break; case _DVORAK: - snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Dvorak"); + snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Dvorak "); break; case _WORKMAN: snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Workman"); break; } break; - case _RAISE: - snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Raise"); - break; - case _LOWER: - snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Lower"); - break; - case _ADJUST: - snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Adjust"); - break; - default: - snprintf(layer_state_str, sizeof(layer_state_str), "Layer: Undef-%ld", layer_state); } return layer_state_str; @@ -160,12 +220,13 @@ void matrix_scan_keymap(void) { void matrix_render_user(struct CharacterMatrix *matrix) { if (is_master) { - // If you want to change the display of OLED, you need to change here + //If you want to change the display of OLED, you need to change here matrix_write_ln(matrix, read_layer_state()); - matrix_write_ln(matrix, read_keylog()); + matrix_write_ln(matrix, read_modifier_state()); + // matrix_write_ln(matrix, read_keylog()); matrix_write_ln(matrix, read_keylogs()); - //matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui)); - matrix_write_ln(matrix, read_host_led_state()); + // matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui)); + matrix_write(matrix, read_host_led_state()); //matrix_write_ln(matrix, read_timelog()); } else { matrix_write(matrix, read_logo()); @@ -187,8 +248,14 @@ void iota_gfx_task_user(void) { } bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { - if (record->event.pressed) { - set_keylog(keycode, record); + switch (keycode) { + case KC_A ... KC_SLASH: + case KC_F1 ... KC_F12: + case KC_INSERT ... KC_UP: + case KC_KP_SLASH ... KC_KP_DOT: + case KC_F13 ... KC_F24: + if (record->event.pressed) { set_keylog(keycode, record); } + break; // set_timelog(); } return true; diff --git a/keyboards/crkbd/keymaps/drashna/rules.mk b/keyboards/crkbd/keymaps/drashna/rules.mk index ccf8e2b7c8d1..4b70f66f7bb2 100644 --- a/keyboards/crkbd/keymaps/drashna/rules.mk +++ b/keyboards/crkbd/keymaps/drashna/rules.mk @@ -20,12 +20,14 @@ SWAP_HANDS_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 +BOOTLOADER = qmk-dfu + # If you want to change the display of OLED, you need to change here SRC += ./lib/glcdfont.c \ ./lib/rgb_state_reader.c \ ./lib/logo_reader.c \ - ./lib/keylogger.c \ - ./lib/host_led_state_reader.c \ - # ./lib/layer_state_reader.c \ + # ./lib/keylogger.c \ + # ./lib/host_led_state_reader.c \ # ./lib/mode_icon_reader.c \ + # ./lib/layer_state_reader.c \ # ./lib/timelogger.c \ diff --git a/keyboards/iris/keymaps/drashna/keymap.c b/keyboards/iris/keymaps/drashna/keymap.c index 21e3151c0fe1..ba6f18edde5a 100644 --- a/keyboards/iris/keymaps/drashna/keymap.c +++ b/keyboards/iris/keymaps/drashna/keymap.c @@ -79,7 +79,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = LAYOUT_wrapper( KC_MAKE, _______, _______, _______, _______, _______, _________________ADJUST_R1_________________, KC_RST, - VRSN, _________________ADJUST_L1_________________, KC_NUKE, _______, _______, _______, _______, EPRM, + VRSN, _________________ADJUST_L1_________________, KC_NUKE, _______, _______, _______, _______, EEP_RST, _______, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, TG_MODS, _______, _________________ADJUST_L3_________________, TG_GAME, _______, _________________ADJUST_R3_________________, KC_MPLY, _______, _______, _______, _______, _______, _______ diff --git a/keyboards/iris/keymaps/drashna/rules.mk b/keyboards/iris/keymaps/drashna/rules.mk index 89e568f39912..ccc33c06f3d0 100644 --- a/keyboards/iris/keymaps/drashna/rules.mk +++ b/keyboards/iris/keymaps/drashna/rules.mk @@ -8,7 +8,7 @@ RGBLIGHT_ENABLE = yes AUDIO_ENABLE = yes NKRO_ENABLE = yes BACKLIGHT_ENABLE = no -SWAP_HANDS_ENABLE = yes +SWAP_HANDS_ENABLE = no INDICATOR_LIGHTS = yes MACROS_ENABLED = no diff --git a/keyboards/orthodox/keymaps/drashna/keymap.c b/keyboards/orthodox/keymaps/drashna/keymap.c index 545ad25dcd30..346ca4f12343 100644 --- a/keyboards/orthodox/keymaps/drashna/keymap.c +++ b/keyboards/orthodox/keymaps/drashna/keymap.c @@ -91,7 +91,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = LAYOUT_wrapper(\ KC_MAKE, _________________ADJUST_L1_________________, _________________ADJUST_R1_________________, KC_RESET, - VRSN, _________________ADJUST_L2_________________, _______, _______, _______, KC_NUKE, _________________ADJUST_R2_________________, EPRM, + VRSN, _________________ADJUST_L2_________________, _______, _______, _______, KC_NUKE, _________________ADJUST_R2_________________, EEP_RST, TG_MODS, _________________ADJUST_L3_________________, _______, _______, _______, _______, _______, _______, _________________ADJUST_R3_________________, KC_MPLY ) }; diff --git a/keyboards/quefrency/keymaps/bjohnson/config.h b/keyboards/quefrency/keymaps/bjohnson/config.h new file mode 100644 index 000000000000..37c6d6672df6 --- /dev/null +++ b/keyboards/quefrency/keymaps/bjohnson/config.h @@ -0,0 +1,41 @@ +/* +This is the c configuration file for the keymap + +Copyright 2012 Jun Wako +Copyright 2015 Jack Humbert +Copyright 2018 Danny Nguyen + +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 + +/* Use I2C or Serial, not both */ + +#define USE_SERIAL +// #define USE_I2C + +#define TAPPING_TERM 500 + +#define IGNORE_MOD_TAP_INTERRUPT +#define PERMISSIVE_HOLD +#define FORCE_NKRO +#define RETRO_TAPPING + +#define TAPPING_TOGGLE 1 + +#define NO_ACTION_MACRO +#define NO_ACTION_FUNCTION + +#define RGBLIGHT_SLEEP diff --git a/keyboards/quefrency/keymaps/bjohnson/keymap.c b/keyboards/quefrency/keymaps/bjohnson/keymap.c new file mode 100644 index 000000000000..434a0a305812 --- /dev/null +++ b/keyboards/quefrency/keymaps/bjohnson/keymap.c @@ -0,0 +1,33 @@ +#include QMK_KEYBOARD_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 _BASE 0 +#define _FN1 1 + +enum custom_keycodes { + QWERTY = SAFE_RANGE, +}; + + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [_BASE] = LAYOUT_65( + 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, XXXXXXX, KC_BSPC, KC_HOME, \ + 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_END, \ + 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_DEL, \ + 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_INS, \ + KC_LCTL, KC_LGUI, KC_LALT, LT(_FN1,KC_SPC),KC_SPC, KC_SPC, XXXXXXX, KC_RALT, KC_RGUI, XXXXXXX, KC_APP, KC_RCTL, TT(_FN1) + ), + + [_FN1] = LAYOUT_65( + KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, KC_BSPC, KC_PGUP, \ + _______, _______, KC_UP, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, _______, _______, _______, _______, KC_PGDN, \ + _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, _______, _______, \ + _______, RGB_MOD, RGB_HUI, RGB_HUD, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, KC_P0, XXXXXXX, _______, _______, XXXXXXX, _______, _______, _______ + ) +}; diff --git a/keyboards/quefrency/keymaps/bjohnson/rules.mk b/keyboards/quefrency/keymaps/bjohnson/rules.mk new file mode 100644 index 000000000000..70fa7110092c --- /dev/null +++ b/keyboards/quefrency/keymaps/bjohnson/rules.mk @@ -0,0 +1,22 @@ +BOOTLOADER = atmel-dfu + +# 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 = lite # 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 +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 = yes # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +SPLIT_KEYBOARD = yes diff --git a/keyboards/viterbi/keymaps/drashna/keymap.c b/keyboards/viterbi/keymaps/drashna/keymap.c index acda8a0d258d..a343205197ee 100644 --- a/keyboards/viterbi/keymaps/drashna/keymap.c +++ b/keyboards/viterbi/keymaps/drashna/keymap.c @@ -60,7 +60,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_MEDIA] = LAYOUT_ortho_5x7( KC_MAKE, KC_RESET,MU_TOG, AU_ON, AU_OFF, CK_TOGG, RGB_SAD, - MEDIA, EPRM, KC_RGB_T,RGB_M_P, RGB_M_B, RGB_M_R, RGB_SAI, + MEDIA, EEP_RST, KC_RGB_T,RGB_M_P, RGB_M_B, RGB_M_R, RGB_SAI, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_M_SW,RGB_M_SN,RGB_M_K, RGB_HUD, KC_MPLY, KC_MPRV, KC_MNXT, RGB_M_X, RGB_M_G, RGB_M_P, RGB_HUI, KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, XXXXXXX, RGB_VAD, RGB_VAI @@ -94,5 +94,3 @@ void matrix_init_keymap(void) { DDRB &= ~(1<<0); PORTB &= ~(1<<0); } - - diff --git a/layouts/community/ergodox/drashna/keymap.c b/layouts/community/ergodox/drashna/keymap.c index 360a2d9c6d05..df9be62b7779 100644 --- a/layouts/community/ergodox/drashna/keymap.c +++ b/layouts/community/ergodox/drashna/keymap.c @@ -20,8 +20,13 @@ along with this program. If not, see . #ifdef UNICODEMAP_ENABLE #include "drashna_unicode.h" #endif // UNICODEMAP_ENABLE +extern uint8_t input_mode; - +#ifdef RGB_MATRIX_ENABLE +extern bool g_suspend_state; +extern rgb_config_t rgb_matrix_config; +#endif +extern userspace_config_t userspace_config; //enum more_custom_keycodes { // KC_P00 = NEW_SAFE_RANGE @@ -40,7 +45,7 @@ bool skip_leds = false; KC_TAB, K01, K02, K03, K04, K05, TG(_DIABLO), TG(_DIABLO), K06, K07, K08, K09, K0A, KC_BSLS, \ KC_C1R3, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, KC_QUOT, \ KC_MLSF, CTL_T(K21), K22, K23, K24, K25, TG(_GAMEPAD), TG(_GAMEPAD), K26, K27, K28, K29, CTL_T(K2A), KC_MRSF, \ - KC_GRV, OSM(MOD_MEH),OSM(MOD_LGUI),KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, UC_SHRG, \ + KC_GRV, OS_MEH, OS_HYPR, KC_LBRC, KC_RBRC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, UC(0x2E2E), \ OS_LALT, OS_LGUI, OS_RGUI, CTL_T(KC_ESCAPE), \ KC_HOME, KC_PGUP, \ LT(_LOWER, KC_SPACE),KC_BSPC, KC_END, KC_PGDN, KC_DEL, LT(_RAISE, KC_ENTER) \ @@ -198,7 +203,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { */ [_GAMEPAD] = LAYOUT_ergodox_pretty_wrapper( KC_ESC, KC_NO, KC_1, KC_2, KC_3, HYPR(KC_Q), HYPR(KC_GRV), KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO, - KC_F1, KC_K, KC_Q, KC_W, KC_E, KC_R, KC_T, UC_SHRG, UC_DISA, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_F1, KC_K, KC_Q, KC_W, KC_E, KC_R, KC_T, UC_SHRG, UC_DISA, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TAB, KC_G, KC_A, KC_S, KC_D, KC_F, KC_I, KC_O, KC_NO, KC_NO, KC_NO, KC_NO, KC_LCTL, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_TRNS, TG(_GAMEPAD), KC_N, KC_M, KC_NO, KC_NO, KC_NO, KC_NO, KC_GRV, KC_U, KC_I, KC_Y, KC_T, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO, @@ -263,7 +268,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = LAYOUT_ergodox_pretty_wrapper( KC_MAKE, _______, _______, _______, _______, _______, _______, KC_NUKE, _________________ADJUST_R1_________________, KC_RST, - VRSN, _________________ADJUST_L1_________________, _______, _______, _______, _______, _______, _______, _______, EPRM, + VRSN, _________________ADJUST_L1_________________, _______, _______, _______, _______, _______, _______, _______, EEP_RST, _______, _________________ADJUST_L2_________________, _________________ADJUST_R2_________________, TG(_MODS), _______, _________________ADJUST_L3_________________, _______, _______, _________________ADJUST_R3_________________, KC_MPLY, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, @@ -290,10 +295,6 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { return true; } -void matrix_init_keymap(void) { // Runs boot tasks for keyboard -}; - - void matrix_scan_keymap(void) { // runs frequently to update info uint8_t modifiers = get_mods(); uint8_t led_usb_state = host_keyboard_leds(); @@ -335,3 +336,106 @@ bool indicator_is_this_led_used_keyboard(uint8_t index) { return false; } } + + +#ifdef RGB_MATRIX_ENABLE + +void suspend_power_down_keymap(void) { + rgb_matrix_set_suspend_state(true); + rgb_matrix_config.enable = false; +} + +void suspend_wakeup_init_keymap(void) { + rgb_matrix_config.enable = true; + rgb_matrix_set_suspend_state(false); +} + +void rgb_matrix_layer_helper (uint8_t red, uint8_t green, uint8_t blue) { + rgb_led led; + for (int i = 0; i < DRIVER_LED_TOTAL; i++) { + led = g_rgb_leds[i]; + if (led.matrix_co.raw < 0xFF) { + if (led.modifier) { + rgb_matrix_set_color( i, red, green, blue ); + } + } + } +} + +void rgb_matrix_indicators_user(void) { + if (g_suspend_state || !rgb_matrix_config.enable || !userspace_config.rgb_layer_change) return; + + switch (biton32(layer_state)) { + case _MODS: + rgb_matrix_layer_helper(0xFF, 0xFF, 0x00); break; + case _GAMEPAD: + rgb_matrix_layer_helper(0xFF, 0x80, 0x00); + rgb_matrix_set_color(32, 0x00, 0xFF, 0x00); // Q + rgb_matrix_set_color(31, 0x00, 0xFF, 0xFF); // W + rgb_matrix_set_color(30, 0xFF, 0x00, 0x00); // E + rgb_matrix_set_color(29, 0xFF, 0x80, 0x00); // R + rgb_matrix_set_color(37, 0x00, 0xFF, 0xFF); // A + rgb_matrix_set_color(36, 0x00, 0xFF, 0xFF); // S + rgb_matrix_set_color(35, 0x00, 0xFF, 0xFF); // D + rgb_matrix_set_color(34, 0x7A, 0x00, 0xFF); // F + + rgb_matrix_set_color(27, 0xFF, 0xFF, 0xFF); // 1 + rgb_matrix_set_color(26, 0x00, 0xFF, 0x00); // 2 + rgb_matrix_set_color(25, 0x7A, 0x00, 0xFF); // 3 + + break; + case _DIABLO: + rgb_matrix_layer_helper(0xFF, 0x00, 0x00); break; + case _RAISE: + rgb_matrix_layer_helper(0xFF, 0xFF, 0x00); break; + case _LOWER: + rgb_matrix_layer_helper(0x00, 0xFF, 0x00); break; + case _ADJUST: + rgb_matrix_layer_helper(0xFF, 0x00, 0x00); break; + default: + switch (biton32(default_layer_state)) { + case _QWERTY: + rgb_matrix_layer_helper(0x00, 0xFF, 0xFF); break; + case _COLEMAK: + rgb_matrix_layer_helper(0xFF, 0x00, 0xFF); break; + case _DVORAK: + rgb_matrix_layer_helper(0x00, 0xFF, 0x00); break; + case _WORKMAN: + rgb_matrix_layer_helper(0xD9, 0xA5, 0x21); break; + } + } +#if 0 + if (this_mod & MODS_SHIFT_MASK || this_led & (1<event.pressed) { - eeconfig_init(); - } - break; case VRSN: // Prints firmware version if (record->event.pressed) { send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), MACRO_TIMER); @@ -392,7 +390,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { #endif } return process_record_keymap(keycode, record) && -#ifdef RGBLIGHT_ENABLE +#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) process_record_user_rgb(keycode, record) && #endif // RGBLIGHT_ENABLE process_record_secrets(keycode, record); @@ -413,7 +411,11 @@ uint32_t layer_state_set_user(uint32_t state) { uint32_t default_layer_state_set_user(uint32_t state) { - return default_layer_state_set_keymap(state); + state = default_layer_state_set_keymap(state); +#ifdef RGBLIGHT_ENABLE + state = default_layer_state_set_rgb(state); +#endif // RGBLIGHT_ENABLE + return state; } diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h index 573cb26fd0cf..06e726714c9b 100644 --- a/users/drashna/drashna.h +++ b/users/drashna/drashna.h @@ -73,6 +73,8 @@ typedef union { }; } userspace_config_t; +extern userspace_config_t userspace_config; + #if defined(KEYMAP_SAFE_RANGE) #define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE #else @@ -80,8 +82,7 @@ typedef union { #endif enum userspace_custom_keycodes { - EPRM = PLACEHOLDER_SAFE_RANGE, // Resets EEPROM do defaults (as in eeconfig_init) - VRSN, // Prints QMK Firmware and board info + VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info KC_QWERTY, // Sets default layer to QWERTY KC_COLEMAK, // Sets default layer to COLEMAK KC_DVORAK, // Sets default layer to DVORAK @@ -159,6 +160,9 @@ enum userspace_custom_keycodes { #define OS_RCTL OSM(MOD_RCTL) #define OS_LALT OSM(MOD_LALT) #define OS_RALT OSM(MOD_RALT) +#define OS_MEH OSM(MOD_MEH) +#define OS_HYPR OSM(MOD_HYPR) + #define ALT_APP ALT_T(KC_APP) #define MG_NKRO MAGIC_TOGGLE_NKRO diff --git a/users/drashna/rgb_stuff.c b/users/drashna/rgb_stuff.c index b6de4d39e53a..d238c20651dc 100644 --- a/users/drashna/rgb_stuff.c +++ b/users/drashna/rgb_stuff.c @@ -2,8 +2,11 @@ #include "rgb_stuff.h" #include "eeprom.h" +#if defined(RGBLIGHT_ENABLE) extern rgblight_config_t rgblight_config; -extern userspace_config_t userspace_config; +#elif defined(RGB_MATRIX_ENABLE) +extern rgb_config_t rgb_matrix_config; +#endif #ifdef RGBLIGHT_ENABLE void rgblight_sethsv_default_helper(uint8_t index) { @@ -209,7 +212,7 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { return true; break; #endif // RGBLIGHT_TWINKLE case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal -#ifdef RGBLIGHT_ENABLE +#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE) if (record->event.pressed) { userspace_config.rgb_layer_change ^= 1; xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change); @@ -237,24 +240,25 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) { -void matrix_init_rgb(void) { + void matrix_init_rgb(void) { - if (userspace_config.rgb_layer_change) { - rgblight_init(); - rgblight_enable_noeeprom(); - switch (biton32(eeconfig_read_default_layer())) { - case _COLEMAK: - rgblight_sethsv_noeeprom_magenta(); break; - case _DVORAK: - rgblight_sethsv_noeeprom_springgreen(); break; - case _WORKMAN: - rgblight_sethsv_noeeprom_goldenrod(); break; - default: - rgblight_sethsv_noeeprom_cyan(); break; - } - rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); - } -} +// #ifdef RGBLIGHT_ENABLE +// if (userspace_config.rgb_layer_change) { +// rgblight_enable_noeeprom(); +// switch (biton32(eeconfig_read_default_layer())) { +// case _COLEMAK: +// rgblight_sethsv_noeeprom_magenta(); break; +// case _DVORAK: +// rgblight_sethsv_noeeprom_springgreen(); break; +// case _WORKMAN: +// rgblight_sethsv_noeeprom_goldenrod(); break; +// default: +// rgblight_sethsv_noeeprom_cyan(); break; +// } +// rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); +// } +// #endif + } void matrix_scan_rgb(void) { #ifdef RGBLIGHT_TWINKLE @@ -270,7 +274,6 @@ void matrix_scan_rgb(void) { uint32_t layer_state_set_rgb(uint32_t state) { #ifdef RGBLIGHT_ENABLE - static bool has_ran; if (userspace_config.rgb_layer_change) { switch (biton32(state)) { case _MACROS: @@ -312,12 +315,7 @@ uint32_t layer_state_set_rgb(uint32_t state) { default: rgblight_sethsv_noeeprom_cyan(); break; } - if (has_ran) { - biton32(state) == _MODS ? rgblight_mode(RGBLIGHT_MODE_BREATHING) : rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT); // if _MODS layer is on, then breath to denote it - } else { - biton32(state) == _MODS ? rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING) : rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); // if _MODS layer is on, then breath to denote it - has_ran = true; - } + biton32(state) == _MODS ? rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING) : rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); // if _MODS layer is on, then breath to denote it break; } // layer_state_set_indicator(); // Runs every scan, so need to call this here .... since I can't get it working "right" anyhow @@ -326,3 +324,39 @@ uint32_t layer_state_set_rgb(uint32_t state) { return state; } + +uint32_t default_layer_state_set_rgb(uint32_t state) { +#ifdef RGBLIGHT_ENABLE + if (userspace_config.rgb_layer_change) { + rgblight_config_t temp_rgblight_config = rgblight_config; + switch (biton32(state)) { + case _COLEMAK: + temp_rgblight_config.hue = 300; + temp_rgblight_config.val = 255; + temp_rgblight_config.sat = 255; + temp_rgblight_config.mode = 1; + break; + case _DVORAK: + temp_rgblight_config.hue = 150; + temp_rgblight_config.val = 255; + temp_rgblight_config.sat = 255; + temp_rgblight_config.mode = 1; + case _WORKMAN: + temp_rgblight_config.hue = 43; + temp_rgblight_config.val = 218; + temp_rgblight_config.sat = 218; + temp_rgblight_config.mode = 1; + default: + temp_rgblight_config.hue = 180; + temp_rgblight_config.val = 255; + temp_rgblight_config.sat = 255; + temp_rgblight_config.mode = 1; + } + if (temp_rgblight_config.raw != eeconfig_read_rgblight()) { + xprintf("rgblight set default layer hsv [EEPROM]: %u,%u,%u,%u\n", temp_rgblight_config.hue, temp_rgblight_config.sat, temp_rgblight_config.val, temp_rgblight_config.mode); + eeconfig_update_rgblight(temp_rgblight_config.raw); + } + } +#endif // RGBLIGHT_ENABLE + return state; +} diff --git a/users/drashna/rgb_stuff.h b/users/drashna/rgb_stuff.h index 50c75c8c3ce9..3db068a31dbf 100644 --- a/users/drashna/rgb_stuff.h +++ b/users/drashna/rgb_stuff.h @@ -12,4 +12,4 @@ void scan_rgblight_fadeout(void); void matrix_init_rgb(void); void matrix_scan_rgb(void); uint32_t layer_state_set_rgb(uint32_t state); - +uint32_t default_layer_state_set_rgb(uint32_t state); diff --git a/users/drashna/rules.mk b/users/drashna/rules.mk index 964c96c52277..49b1ddae979e 100644 --- a/users/drashna/rules.mk +++ b/users/drashna/rules.mk @@ -27,6 +27,11 @@ ifeq ($(strip $(RGBLIGHT_ENABLE)), yes) endif endif +ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) + SRC += rgb_stuff.c +endif + + ifeq ($(strip $(MACROS_ENABLED)), yes) OPT_DEFS += -DMACROS_ENABLED endif @@ -37,3 +42,15 @@ ifdef CONSOLE_ENABLE endif endif + +ifeq ($(strip $(UCIS_ENABLE)), yes) + SRC += send_unicode.c +endif + +ifeq ($(strip $(UNICODEMAP_ENABLE)), yes) + SRC += send_unicode.c +endif + +ifeq ($(strip $(UNICODE_ENABLE)), yes) + SRC += send_unicode.c +endif diff --git a/users/drashna/send_unicode.c b/users/drashna/send_unicode.c index cacfe1dc8524..ff35368da7f5 100644 --- a/users/drashna/send_unicode.c +++ b/users/drashna/send_unicode.c @@ -56,3 +56,57 @@ void send_unicode_hex_string(const char* str) { // If you need a good converter: https://r12a.github.io/app-conversion/ +uint8_t saved_mods; + +void unicode_input_start (void) { + // save current mods + saved_mods = get_mods(); // Save current mods + clear_mods(); // Unregister mods to start from a clean state + + switch(get_unicode_input_mode()) { + case UC_OSX: + register_code(KC_LALT); + break; + case UC_OSX_RALT: + register_code(KC_RALT); + 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); + break; + } + wait_ms(UNICODE_TYPE_DELAY); +} + +void unicode_input_finish (void) { + switch(get_unicode_input_mode()) { + case UC_OSX: + case UC_WIN: + unregister_code(KC_LALT); + break; + case UC_OSX_RALT: + unregister_code(KC_RALT); + break; + case UC_LNX: + register_code(KC_SPC); + unregister_code(KC_SPC); + break; + } + + set_mods(saved_mods); // Reregister previously set mods +} diff --git a/users/drashna/template.c b/users/drashna/template.c index e6b50c961b62..0e188f3a5ebb 100644 --- a/users/drashna/template.c +++ b/users/drashna/template.c @@ -50,12 +50,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return false; break; - 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); @@ -128,4 +122,3 @@ void shutdown_keymap(void) {} void shutdown_user (void) { shutdown_keymap(); } - diff --git a/users/drashna/template.h b/users/drashna/template.h index 5b3a93de5fb7..dd1c487604ae 100644 --- a/users/drashna/template.h +++ b/users/drashna/template.h @@ -9,9 +9,7 @@ #define BASE 0 enum custom_keycodes { - PLACEHOLDER = SAFE_RANGE, // can always be here - EPRM, - VRSN, + VRSN = SAFE_RANGE, // can always be here KC_MAKE, KC_RESET, NEWPLACEHOLDER //use "NEWPLACEHOLDER for keymap specific codes From bada74e2a10224849719d1caa1dff8493cf39c58 Mon Sep 17 00:00:00 2001 From: Joe Wasson Date: Mon, 26 Nov 2018 17:39:29 -0800 Subject: [PATCH 468/505] Keymap: Fix build errors for non-Zeal boards. (#4496) --- users/talljoe/talljoe.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/users/talljoe/talljoe.c b/users/talljoe/talljoe.c index e72dc6c3e0e5..345b5604bb02 100644 --- a/users/talljoe/talljoe.c +++ b/users/talljoe/talljoe.c @@ -108,7 +108,9 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { extern backlight_config g_config; #endif bool process_record_user(uint16_t keycode, keyrecord_t *record) { +#ifdef ZEAL_RGB static uint8_t last_effect; +#endif #ifdef RGBLIGHT_ENABLE static uint32_t savedRgbMode; From 952a30ef345e05051f62fa39960f88475817821d Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Mon, 26 Nov 2018 20:57:15 -0800 Subject: [PATCH 469/505] handwired/arrow_pad Refactor and Configurator support (#4498) * handwired/arrow_pad: layout macro and keymap refactor - Layout macros moved from the keymaps to arrow_pad.h. - LAYOUT_pad21 refactored to only accept keys that are physical present (no KC_NO entries required in keymap) - Keymaps now use #include QMK_KEYBOARD_H - Keymaps refactored to use process_record_user function (from action_get_macro) * handwired/arrow_pad: Readme cleanup Fixed the make commands and updated the layout macro. * handwired/arrow_pad: Configurator support --- keyboards/handwired/arrow_pad/arrow_pad.h | 30 ++++ keyboards/handwired/arrow_pad/info.json | 62 +++++++ .../arrow_pad/keymaps/default/keymap.c | 146 ++++++---------- .../arrow_pad/keymaps/pad_21/keymap.c | 165 +++++++----------- .../arrow_pad/keymaps/pad_24/keymap.c | 146 ++++++---------- keyboards/handwired/arrow_pad/readme.md | 12 +- 6 files changed, 265 insertions(+), 296 deletions(-) create mode 100644 keyboards/handwired/arrow_pad/info.json diff --git a/keyboards/handwired/arrow_pad/arrow_pad.h b/keyboards/handwired/arrow_pad/arrow_pad.h index 62882b9b54cb..b93fd113f273 100644 --- a/keyboards/handwired/arrow_pad/arrow_pad.h +++ b/keyboards/handwired/arrow_pad/arrow_pad.h @@ -10,4 +10,34 @@ #include #include +// This is the 21-key keypad to 4x6 element matrix mapping +#define LAYOUT( \ + KM_ESC, KM_TAB, KM_BSL, KM_ARR, \ + KM_NUM, KM_FSL, KM_AST, KM_MIN, \ + KM___7, KM___8, KM___9, KM_EQU, \ + KM___4, KM___5, KM___6, KM_PLS, \ + KM___1, KM___2, KM___3, ___ENT, \ + KM___0, _____0, KM_DOT, KM_ENT \ +) { \ + { KM_ESC, KM_TAB, KM_BSL, KM_ARR }, \ + { KM_NUM, KM_FSL, KM_AST, KM_MIN }, \ + { KM___7, KM___8, KM___9, KM_EQU }, \ + { KM___4, KM___5, KM___6, KM_PLS }, \ + { KM___1, KM___2, KM___3, KC_NO }, \ + { KM___0, KC_NO, KM_DOT, KM_ENT } \ +} + +// This is the 21-key keypad to 2x11 element matrix mapping +#define LAYOUT_pad21( \ + KM_ESC, KM_TAB, KM_BSL, KM_ARR, \ + KM_NUM, KM_FSL, KM_AST, KM_MIN, \ + KM___7, KM___8, KM___9, \ + KM___4, KM___5, KM___6, KM_PLS, \ + KM___1, KM___2, KM___3, \ + KM___0, KM_DOT, KM_ENT \ +) { \ + { KM_ESC, KM_TAB, KM_BSL, KM_ARR, KM___7, KM___8, KM___9, KM_PLS, KM___1, KM___2, KM___3, }, \ + { KM_NUM, KM_FSL, KM_AST, KM_MIN, KM___4, KM___5, KM___6, KM_ENT, KC_NO, KM___0, KM_DOT, }, \ +} + #endif diff --git a/keyboards/handwired/arrow_pad/info.json b/keyboards/handwired/arrow_pad/info.json new file mode 100644 index 000000000000..ad15e8e740e1 --- /dev/null +++ b/keyboards/handwired/arrow_pad/info.json @@ -0,0 +1,62 @@ +{ + "keyboard_name": "arrow_pad", + "url": "", + "maintainer": "qmk", + "width": 4, + "height": 6, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"KM_ESC", "x":0, "y":0}, + {"label":"KM_TAB", "x":1, "y":0}, + {"label":"KM_BSL", "x":2, "y":0}, + {"label":"KM_ARR", "x":3, "y":0}, + {"label":"KM_NUM", "x":0, "y":1}, + {"label":"KM_FSL", "x":1, "y":1}, + {"label":"KM_AST", "x":2, "y":1}, + {"label":"KM_MIN", "x":3, "y":1}, + {"label":"KM___7", "x":0, "y":2}, + {"label":"KM___8", "x":1, "y":2}, + {"label":"KM___9", "x":2, "y":2}, + {"label":"KM_EQU", "x":3, "y":2}, + {"label":"KM___4", "x":0, "y":3}, + {"label":"KM___5", "x":1, "y":3}, + {"label":"KM___6", "x":2, "y":3}, + {"label":"KM_PLS", "x":3, "y":3}, + {"label":"KM___1", "x":0, "y":4}, + {"label":"KM___2", "x":1, "y":4}, + {"label":"KM___3", "x":2, "y":4}, + {"label":"___ENT", "x":3, "y":4}, + {"label":"KM___0", "x":0, "y":5}, + {"label":"_____0", "x":1, "y":5}, + {"label":"KM_DOT", "x":2, "y":5}, + {"label":"KM_ENT", "x":3, "y":5} + ] + }, + "LAYOUT_pad21": { + "layout": [ + {"label":"KM_ESC", "x":0, "y":0}, + {"label":"KM_TAB", "x":1, "y":0}, + {"label":"KM_BSL", "x":2, "y":0}, + {"label":"KM_ARR", "x":3, "y":0}, + {"label":"KM_NUM", "x":0, "y":1}, + {"label":"KM_FSL", "x":1, "y":1}, + {"label":"KM_AST", "x":2, "y":1}, + {"label":"KM_MIN", "x":3, "y":1}, + {"label":"KM___7", "x":0, "y":2}, + {"label":"KM___8", "x":1, "y":2}, + {"label":"KM___9", "x":2, "y":2}, + {"label":"KM___4", "x":0, "y":3}, + {"label":"KM___5", "x":1, "y":3}, + {"label":"KM___6", "x":2, "y":3}, + {"label":"KM_PLS", "x":3, "y":2, "h":2}, + {"label":"KM___1", "x":0, "y":4}, + {"label":"KM___2", "x":1, "y":4}, + {"label":"KM___3", "x":2, "y":4}, + {"label":"KM___0", "x":0, "y":5, "w":2}, + {"label":"KM_DOT", "x":2, "y":5}, + {"label":"KM_ENT", "x":3, "y":4, "h":2} + ] + } + } +} diff --git a/keyboards/handwired/arrow_pad/keymaps/default/keymap.c b/keyboards/handwired/arrow_pad/keymaps/default/keymap.c index b5d3047081e9..dd729c59a10d 100644 --- a/keyboards/handwired/arrow_pad/keymaps/default/keymap.c +++ b/keyboards/handwired/arrow_pad/keymaps/default/keymap.c @@ -1,35 +1,18 @@ -#include "arrow_pad.h" +#include QMK_KEYBOARD_H #include "led.h" -// This is the 21-key keypad to 2x11 element matrix mapping -#define LAYOUT( \ - KM_ESC, KM_TAB, KM_BSL, KM_ARR, \ - KM_NUM, KM_FSL, KM_AST, KM_MIN, \ - KM___7, KM___8, KM___9, KM_EQU, \ - KM___4, KM___5, KM___6, KM_PLS, \ - KM___1, KM___2, KM___3, ___ENT, \ - KM___0, _____0, KM_DOT, KM_ENT \ -) { \ - { KM_ESC, KM_TAB, KM_BSL, KM_ARR }, \ - { KM_NUM, KM_FSL, KM_AST, KM_MIN }, \ - { KM___7, KM___8, KM___9, KM_EQU }, \ - { KM___4, KM___5, KM___6, KM_PLS }, \ - { KM___1, KM___2, KM___3, KC_NO }, \ - { KM___0, KC_NO, KM_DOT, KM_ENT } \ -} - -#define LAYER_BASE 0 -#define LAYER_EDIT 1 -#define LAYER_FUNCTION 2 - -#define MACRO_COPY_CUT 0 -#define MACRO_SHIFT_CONTROL 1 -#define MACRO_CONTROL_ALT 2 +enum layers { + LAYER_BASE, + LAYER_EDIT, + LAYER_FUNCTION +}; -#define M_COPY KC_FN5 -#define M_SHFCT KC_FN6 -#define M_CTALT KC_FN7 +enum custom_keycodes { + M_COPY = SAFE_RANGE, // KC_FN5: MACRO_COPY_CUT + M_SHFCT, // KC_FN6: MACRO_SHIFT_CONTROL + M_CTALT // KC_FN7: MACRO_CONTROL_ALT +}; #define SC_UNDO LCTL(KC_Z) #define SC_REDO LCTL(KC_Y) @@ -42,13 +25,10 @@ #define SC_ACLS LALT(KC_F4) #define SC_CCLS LCTL(KC_F4) -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LAYER_BASE] = LAYOUT( \ - KC_ESC, KC_TAB, KC_BSLS, KC_FN0, \ + KC_ESC, KC_TAB, KC_BSLS, MO(2), \ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ KC_P7, KC_P8, KC_P9, KC_PEQL, \ KC_P4, KC_P5, KC_P6, KC_PPLS, \ @@ -57,15 +37,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LAYER_EDIT] = LAYOUT( \ KC_ESC, KC_TAB, KC_SPC, _______, \ - KC_FN1, SC_PSTE, SC_REDO, SC_UNDO, \ + TG(1), SC_PSTE, SC_REDO, SC_UNDO, \ KC_HOME, KC_UP, KC_PGUP, KC_LALT, \ KC_LEFT, M_COPY, KC_RGHT, KC_LCTL, \ KC_END, KC_DOWN, KC_PGDN, XXXXXXX, \ - KC_BSPC, KC_PENT, KC_DEL, M_SHFCT), + KC_BSPC, KC_PENT, KC_DEL, M_SHFCT ), [LAYER_FUNCTION] = LAYOUT( \ - KC_FN2, KC_FN3, KC_FN4, _______, \ - KC_FN1, _______, _______, _______, \ + BL_TOGG, BL_INC, BL_DEC, _______, \ + TG(1), _______, _______, _______, \ _______, _______, _______, _______, \ _______, _______, _______, _______, \ _______, _______, _______, XXXXXXX, \ @@ -74,68 +54,46 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(LAYER_FUNCTION), - [1] = ACTION_LAYER_TOGGLE(LAYER_EDIT), - [2] = ACTION_BACKLIGHT_TOGGLE(), - [3] = ACTION_BACKLIGHT_INCREASE(), - [4] = ACTION_BACKLIGHT_DECREASE(), - [5] = ACTION_MACRO_TAP(MACRO_COPY_CUT), - [6] = ACTION_MACRO_TAP(MACRO_SHIFT_CONTROL), - [7] = ACTION_MACRO_TAP(MACRO_CONTROL_ALT), - -}; - - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) -{ -} +bool process_record_user(uint16_t keycode, keyrecord_t * record) { + // MACRODOWN only works in this function + switch (keycode) { + + case M_COPY: + if (record->event.pressed) { + register_code(KC_LCTL); + if (record->tap.count == 1) { + register_code(KC_C); + unregister_code(KC_C); + } else if (record->tap.count == 2) { + register_code(KC_X); + unregister_code(KC_X); + } + unregister_code(KC_LCTL); + } + break; + case M_SHFCT: + if (record->event.pressed) { + if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT)); + if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL)); + if (record->tap.count == 3) register_code(KC_PENT);; + } else { + unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL)); + unregister_code(KC_PENT); + } + break; -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch (id) { - - case MACRO_COPY_CUT: - if (record->event.pressed) { - register_code(KC_LCTL); - if (record->tap.count == 1) { - register_code(KC_C); - unregister_code(KC_C); - } - else if (record->tap.count == 2) { - register_code(KC_X); - unregister_code(KC_X); - } - unregister_code(KC_LCTL); - } - break; - - case MACRO_SHIFT_CONTROL: - if (record->event.pressed) { - if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT)); - if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL)); - if (record->tap.count == 3) register_code(KC_PENT);; - } - else { - unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL)); - unregister_code(KC_PENT); - } - break; - - case MACRO_CONTROL_ALT: - if (record->event.pressed) { - if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL)); - if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT)); - } - else { - unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); - } - break; + case M_CTALT: + if (record->event.pressed) { + if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL)); + if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT)); + } else { + unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); } + break; + } - return MACRO_NONE; + return true; } void led_set_user(uint8_t usb_led) diff --git a/keyboards/handwired/arrow_pad/keymaps/pad_21/keymap.c b/keyboards/handwired/arrow_pad/keymaps/pad_21/keymap.c index a29f9e101175..1692976357b9 100644 --- a/keyboards/handwired/arrow_pad/keymaps/pad_21/keymap.c +++ b/keyboards/handwired/arrow_pad/keymaps/pad_21/keymap.c @@ -1,32 +1,18 @@ -#include "arrow_pad.h" +#include QMK_KEYBOARD_H #include "led.h" -// This is the 21-key keypad to 2x11 element matrix mapping -#define LAYOUT( \ - KM_ESC, KM_TAB, KM_BSL, KM_ARR, \ - KM_NUM, KM_FSL, KM_AST, KM_MIN, \ - KM___7, KM___8, KM___9, ___PLS, \ - KM___4, KM___5, KM___6, KM_PLS, \ - KM___1, KM___2, KM___3, ___ENT, \ - KM___0, _____0, KM_DOT, KM_ENT \ -) { \ - { KM_ESC, KM_TAB, KM_BSL, KM_ARR, KM___7, KM___8, KM___9, KM_PLS, KM___1, KM___2, KM___3, }, \ - { KM_NUM, KM_FSL, KM_AST, KM_MIN, KM___4, KM___5, KM___6, KM_ENT, KC_NO, KM___0, KM_DOT, }, \ -} - - -#define LAYER_BASE 0 -#define LAYER_EDIT 1 -#define LAYER_FUNCTION 2 - -#define MACRO_COPY_CUT 0 -#define MACRO_SHIFT_CONTROL 1 -#define MACRO_CONTROL_ALT 2 +enum layers { + LAYER_BASE, + LAYER_EDIT, + LAYER_FUNCTION +}; -#define M_COPY KC_FN5 -#define M_SHFCT KC_FN6 -#define M_CTALT KC_FN7 +enum custom_keycodes { + M_COPY = SAFE_RANGE, // KC_FN5: MACRO_COPY_CUT + M_SHFCT, // KC_FN6: MACRO_SHIFT_CONTROL + M_CTALT // KC_FN7: MACRO_CONTROL_ALT +}; #define SC_UNDO LCTL(KC_Z) #define SC_REDO LCTL(KC_Y) @@ -39,100 +25,75 @@ #define SC_ACLS LALT(KC_F4) #define SC_CCLS LCTL(KC_F4) -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { -[LAYER_BASE] = LAYOUT( \ - KC_ESC, KC_TAB, KC_BSLS, KC_FN0, \ +[LAYER_BASE] = LAYOUT_pad21( \ + KC_ESC, KC_TAB, KC_BSLS, MO(2), \ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ - KC_P7, KC_P8, KC_P9, XXXXXXX, \ + KC_P7, KC_P8, KC_P9, \ KC_P4, KC_P5, KC_P6, KC_PPLS, \ - KC_P1, KC_P2, KC_P3, XXXXXXX, \ - KC_P0, XXXXXXX, KC_PDOT, KC_PENT ), + KC_P1, KC_P2, KC_P3, \ + KC_P0, KC_PDOT, KC_PENT ), -[LAYER_EDIT] = LAYOUT( \ +[LAYER_EDIT] = LAYOUT_pad21( \ KC_ESC, KC_TAB, KC_SPC, _______, \ - KC_FN1, SC_PSTE, SC_REDO, SC_UNDO, \ - KC_HOME, KC_UP, KC_PGUP, XXXXXXX, \ + TG(1), SC_PSTE, SC_REDO, SC_UNDO, \ + KC_HOME, KC_UP, KC_PGUP, \ KC_LEFT, M_COPY, KC_RGHT, M_CTALT, \ - KC_END, KC_DOWN, KC_PGDN, XXXXXXX, \ - KC_BSPC, XXXXXXX, KC_DEL, M_SHFCT), + KC_END, KC_DOWN, KC_PGDN, \ + KC_BSPC, KC_DEL, M_SHFCT), -[LAYER_FUNCTION] = LAYOUT( \ - KC_FN2, KC_FN3, KC_FN4, _______, \ - KC_FN1, _______, _______, _______, \ - _______, _______, _______, XXXXXXX, \ +[LAYER_FUNCTION] = LAYOUT_pad21( \ + BL_TOGG, BL_INC, BL_DEC, _______, \ + TG(1), _______, _______, _______, \ + _______, _______, _______, \ _______, _______, _______, _______, \ - _______, _______, _______, XXXXXXX, \ - RESET, XXXXXXX, _______, _______ ), - -}; - - -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(LAYER_FUNCTION), - [1] = ACTION_LAYER_TOGGLE(LAYER_EDIT), - [2] = ACTION_BACKLIGHT_TOGGLE(), - [3] = ACTION_BACKLIGHT_INCREASE(), - [4] = ACTION_BACKLIGHT_DECREASE(), - [5] = ACTION_MACRO_TAP(MACRO_COPY_CUT), - [6] = ACTION_MACRO_TAP(MACRO_SHIFT_CONTROL), - [7] = ACTION_MACRO_TAP(MACRO_CONTROL_ALT), + _______, _______, _______, \ + RESET, _______, _______ ), }; -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) -{ -} +bool process_record_user(uint16_t keycode, keyrecord_t * record) { + // MACRODOWN only works in this function + switch (keycode) { + + case M_COPY: + if (record->event.pressed) { + register_code(KC_LCTL); + if (record->tap.count == 1) { + register_code(KC_C); + unregister_code(KC_C); + } else if (record->tap.count == 2) { + register_code(KC_X); + unregister_code(KC_X); + } + unregister_code(KC_LCTL); + } + break; + case M_SHFCT: + if (record->event.pressed) { + if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT)); + if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL)); + if (record->tap.count == 3) register_code(KC_PENT);; + } else { + unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL)); + unregister_code(KC_PENT); + } + break; -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch (id) { - - case MACRO_COPY_CUT: - if (record->event.pressed) { - register_code(KC_LCTL); - if (record->tap.count == 1) { - register_code(KC_C); - unregister_code(KC_C); - } - else if (record->tap.count == 2) { - register_code(KC_X); - unregister_code(KC_X); - } - unregister_code(KC_LCTL); - } - break; - - case MACRO_SHIFT_CONTROL: - if (record->event.pressed) { - if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT)); - if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL)); - if (record->tap.count == 3) register_code(KC_PENT);; - } - else { - unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL)); - unregister_code(KC_PENT); - } - break; - - case MACRO_CONTROL_ALT: - if (record->event.pressed) { - if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL)); - if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT)); - } - else { - unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); - } - break; + case M_CTALT: + if (record->event.pressed) { + if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL)); + if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT)); + } else { + unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); } + break; + } - return MACRO_NONE; + return true; } void led_set_user(uint8_t usb_led) diff --git a/keyboards/handwired/arrow_pad/keymaps/pad_24/keymap.c b/keyboards/handwired/arrow_pad/keymaps/pad_24/keymap.c index b5d3047081e9..dd729c59a10d 100644 --- a/keyboards/handwired/arrow_pad/keymaps/pad_24/keymap.c +++ b/keyboards/handwired/arrow_pad/keymaps/pad_24/keymap.c @@ -1,35 +1,18 @@ -#include "arrow_pad.h" +#include QMK_KEYBOARD_H #include "led.h" -// This is the 21-key keypad to 2x11 element matrix mapping -#define LAYOUT( \ - KM_ESC, KM_TAB, KM_BSL, KM_ARR, \ - KM_NUM, KM_FSL, KM_AST, KM_MIN, \ - KM___7, KM___8, KM___9, KM_EQU, \ - KM___4, KM___5, KM___6, KM_PLS, \ - KM___1, KM___2, KM___3, ___ENT, \ - KM___0, _____0, KM_DOT, KM_ENT \ -) { \ - { KM_ESC, KM_TAB, KM_BSL, KM_ARR }, \ - { KM_NUM, KM_FSL, KM_AST, KM_MIN }, \ - { KM___7, KM___8, KM___9, KM_EQU }, \ - { KM___4, KM___5, KM___6, KM_PLS }, \ - { KM___1, KM___2, KM___3, KC_NO }, \ - { KM___0, KC_NO, KM_DOT, KM_ENT } \ -} - -#define LAYER_BASE 0 -#define LAYER_EDIT 1 -#define LAYER_FUNCTION 2 - -#define MACRO_COPY_CUT 0 -#define MACRO_SHIFT_CONTROL 1 -#define MACRO_CONTROL_ALT 2 +enum layers { + LAYER_BASE, + LAYER_EDIT, + LAYER_FUNCTION +}; -#define M_COPY KC_FN5 -#define M_SHFCT KC_FN6 -#define M_CTALT KC_FN7 +enum custom_keycodes { + M_COPY = SAFE_RANGE, // KC_FN5: MACRO_COPY_CUT + M_SHFCT, // KC_FN6: MACRO_SHIFT_CONTROL + M_CTALT // KC_FN7: MACRO_CONTROL_ALT +}; #define SC_UNDO LCTL(KC_Z) #define SC_REDO LCTL(KC_Y) @@ -42,13 +25,10 @@ #define SC_ACLS LALT(KC_F4) #define SC_CCLS LCTL(KC_F4) -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LAYER_BASE] = LAYOUT( \ - KC_ESC, KC_TAB, KC_BSLS, KC_FN0, \ + KC_ESC, KC_TAB, KC_BSLS, MO(2), \ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \ KC_P7, KC_P8, KC_P9, KC_PEQL, \ KC_P4, KC_P5, KC_P6, KC_PPLS, \ @@ -57,15 +37,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [LAYER_EDIT] = LAYOUT( \ KC_ESC, KC_TAB, KC_SPC, _______, \ - KC_FN1, SC_PSTE, SC_REDO, SC_UNDO, \ + TG(1), SC_PSTE, SC_REDO, SC_UNDO, \ KC_HOME, KC_UP, KC_PGUP, KC_LALT, \ KC_LEFT, M_COPY, KC_RGHT, KC_LCTL, \ KC_END, KC_DOWN, KC_PGDN, XXXXXXX, \ - KC_BSPC, KC_PENT, KC_DEL, M_SHFCT), + KC_BSPC, KC_PENT, KC_DEL, M_SHFCT ), [LAYER_FUNCTION] = LAYOUT( \ - KC_FN2, KC_FN3, KC_FN4, _______, \ - KC_FN1, _______, _______, _______, \ + BL_TOGG, BL_INC, BL_DEC, _______, \ + TG(1), _______, _______, _______, \ _______, _______, _______, _______, \ _______, _______, _______, _______, \ _______, _______, _______, XXXXXXX, \ @@ -74,68 +54,46 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { }; -const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(LAYER_FUNCTION), - [1] = ACTION_LAYER_TOGGLE(LAYER_EDIT), - [2] = ACTION_BACKLIGHT_TOGGLE(), - [3] = ACTION_BACKLIGHT_INCREASE(), - [4] = ACTION_BACKLIGHT_DECREASE(), - [5] = ACTION_MACRO_TAP(MACRO_COPY_CUT), - [6] = ACTION_MACRO_TAP(MACRO_SHIFT_CONTROL), - [7] = ACTION_MACRO_TAP(MACRO_CONTROL_ALT), - -}; - - -void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) -{ -} +bool process_record_user(uint16_t keycode, keyrecord_t * record) { + // MACRODOWN only works in this function + switch (keycode) { + + case M_COPY: + if (record->event.pressed) { + register_code(KC_LCTL); + if (record->tap.count == 1) { + register_code(KC_C); + unregister_code(KC_C); + } else if (record->tap.count == 2) { + register_code(KC_X); + unregister_code(KC_X); + } + unregister_code(KC_LCTL); + } + break; + case M_SHFCT: + if (record->event.pressed) { + if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT)); + if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL)); + if (record->tap.count == 3) register_code(KC_PENT);; + } else { + unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL)); + unregister_code(KC_PENT); + } + break; -const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) -{ - // MACRODOWN only works in this function - switch (id) { - - case MACRO_COPY_CUT: - if (record->event.pressed) { - register_code(KC_LCTL); - if (record->tap.count == 1) { - register_code(KC_C); - unregister_code(KC_C); - } - else if (record->tap.count == 2) { - register_code(KC_X); - unregister_code(KC_X); - } - unregister_code(KC_LCTL); - } - break; - - case MACRO_SHIFT_CONTROL: - if (record->event.pressed) { - if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT)); - if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL)); - if (record->tap.count == 3) register_code(KC_PENT);; - } - else { - unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL)); - unregister_code(KC_PENT); - } - break; - - case MACRO_CONTROL_ALT: - if (record->event.pressed) { - if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL)); - if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT)); - } - else { - unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); - } - break; + case M_CTALT: + if (record->event.pressed) { + if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL)); + if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT)); + } else { + unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); } + break; + } - return MACRO_NONE; + return true; } void led_set_user(uint8_t usb_led) diff --git a/keyboards/handwired/arrow_pad/readme.md b/keyboards/handwired/arrow_pad/readme.md index d0d172272ee4..43a0e33c4062 100644 --- a/keyboards/handwired/arrow_pad/readme.md +++ b/keyboards/handwired/arrow_pad/readme.md @@ -94,13 +94,13 @@ More info can be found on [GeekHack](https://geekhack.org/index.php?topic=73632. The second ArrowPad was a conversion from a 21-key Genovation keypad. It used a 2 row x 11 column matrix. ``` -#define KEYMAP( \ +#define LAYOUT_pad21( \ KM_ESC, KM_TAB, KM_BSL, KM_ARR, \ KM_NUM, KM_FSL, KM_AST, KM_MIN, \ - KM___7, KM___8, KM___9, ___PLS, \ + KM___7, KM___8, KM___9, \ KM___4, KM___5, KM___6, KM_PLS, \ - KM___1, KM___2, KM___3, ___ENT, \ - KM___0, _____0, KM_DOT, KM_ENT \ + KM___1, KM___2, KM___3, \ + KM___0, KM_DOT, KM_ENT \ ) { \ { KM_ESC, KM_TAB, KM_BSL, KM_ARR, KM___7, KM___8, KM___9, KM_PLS, KM___1, KM___2, KM___3, }, \ { KM_NUM, KM_FSL, KM_AST, KM_MIN, KM___4, KM___5, KM___6, KM_ENT, KC_NO, KM___0, KM_DOT, }, \ @@ -119,7 +119,7 @@ Download or clone the whole firmware and navigate to the keyboards/arrow_pad fol 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`. +To build with the default keymap, simply run `make handwired/arrow_pad: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 file named `.c` in the keymaps folder, and see keymap document (you can find in top readme.md) and existent keymap files. @@ -127,7 +127,7 @@ Several version of keymap are available in advance but you are recommended to de To build the firmware binary hex file with a keymap just do `make` with a keymap like this: ``` -$ make [default|pad_21|pad_24|] +$ make handwired/arrow_pad:[default|pad_21|pad_24|] ``` Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder. From a054b5a06c00cf148fa416fae8f5a56586a10876 Mon Sep 17 00:00:00 2001 From: Takeshi ISHII <2170248+mtei@users.noreply.github.com> Date: Wed, 28 Nov 2018 00:22:47 +0900 Subject: [PATCH 470/505] Fix Helix ws2812.c listed more than once warning. (#4499) Remove `SRC += ws2812.c` from helix/rev2/rules.mk and helix/pico/rules.mk. Because it will be added in common_features.mk. --- keyboards/helix/pico/rules.mk | 5 ++--- keyboards/helix/rev2/rules.mk | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/keyboards/helix/pico/rules.mk b/keyboards/helix/pico/rules.mk index c994ac8deaef..75bf0a5ef8c4 100644 --- a/keyboards/helix/pico/rules.mk +++ b/keyboards/helix/pico/rules.mk @@ -1,3 +1,2 @@ -SRC += pico/matrix.c \ - pico/split_util.c \ - ws2812.c +SRC += pico/matrix.c +SRC += pico/split_util.c diff --git a/keyboards/helix/rev2/rules.mk b/keyboards/helix/rev2/rules.mk index 4ea623c43689..5582a0f9c40f 100644 --- a/keyboards/helix/rev2/rules.mk +++ b/keyboards/helix/rev2/rules.mk @@ -1,4 +1,3 @@ SRC += rev2/matrix.c SRC += rev2/split_util.c SRC += rev2/split_scomm.c -SRC += ws2812.c From faef966a4d66b802babf9332cbf3045edf47c729 Mon Sep 17 00:00:00 2001 From: Mattia Dal Ben Date: Tue, 27 Nov 2018 17:59:53 +0100 Subject: [PATCH 471/505] Keymap: Set serial connection as default for the Redox rev1.0 keyboard (#4488) * Set serial as default for Redox * Updated rules.mk file * Removed unused rule Co-Authored-By: mattdibi * Removed unused rule Co-Authored-By: mattdibi --- keyboards/redox/keymaps/default/config.h | 6 ++---- keyboards/redox/keymaps/finex/config.h | 2 -- keyboards/redox/keymaps/german/config.h | 8 +++----- keyboards/redox/keymaps/italian/config.h | 6 ++---- keyboards/redox/keymaps/jeherve/config.h | 4 +--- keyboards/redox/rules.mk | 4 +--- 6 files changed, 9 insertions(+), 21 deletions(-) diff --git a/keyboards/redox/keymaps/default/config.h b/keyboards/redox/keymaps/default/config.h index 0670bf294fb6..a3ef209a05d9 100644 --- a/keyboards/redox/keymaps/default/config.h +++ b/keyboards/redox/keymaps/default/config.h @@ -18,12 +18,10 @@ along with this program. If not, see . #pragma once /* Use I2C or Serial, not both */ - -// #define USE_SERIAL -#define USE_I2C +#define USE_SERIAL +// #define USE_I2C /* Select hand configuration */ - #define MASTER_LEFT // #define MASTER_RIGHT // #define EE_HANDS diff --git a/keyboards/redox/keymaps/finex/config.h b/keyboards/redox/keymaps/finex/config.h index 9adbcedf49eb..b23342ce0fa0 100644 --- a/keyboards/redox/keymaps/finex/config.h +++ b/keyboards/redox/keymaps/finex/config.h @@ -18,12 +18,10 @@ along with this program. If not, see . #pragma once /* Use I2C or Serial, not both */ - #define USE_SERIAL // #define USE_I2C /* Select hand configuration */ - #define MASTER_LEFT // #define MASTER_RIGHT // #define EE_HANDS diff --git a/keyboards/redox/keymaps/german/config.h b/keyboards/redox/keymaps/german/config.h index 0eb19ab1ef35..a3ef209a05d9 100644 --- a/keyboards/redox/keymaps/german/config.h +++ b/keyboards/redox/keymaps/german/config.h @@ -18,14 +18,12 @@ along with this program. If not, see . #pragma once /* Use I2C or Serial, not both */ - -// #define USE_SERIAL -#define USE_I2C +#define USE_SERIAL +// #define USE_I2C /* Select hand configuration */ - -// #define MASTER_LEFT #define MASTER_LEFT +// #define MASTER_RIGHT // #define EE_HANDS #undef RGBLED_NUM diff --git a/keyboards/redox/keymaps/italian/config.h b/keyboards/redox/keymaps/italian/config.h index 0670bf294fb6..a3ef209a05d9 100644 --- a/keyboards/redox/keymaps/italian/config.h +++ b/keyboards/redox/keymaps/italian/config.h @@ -18,12 +18,10 @@ along with this program. If not, see . #pragma once /* Use I2C or Serial, not both */ - -// #define USE_SERIAL -#define USE_I2C +#define USE_SERIAL +// #define USE_I2C /* Select hand configuration */ - #define MASTER_LEFT // #define MASTER_RIGHT // #define EE_HANDS diff --git a/keyboards/redox/keymaps/jeherve/config.h b/keyboards/redox/keymaps/jeherve/config.h index 939d0c8d83d7..b9b67c999f64 100644 --- a/keyboards/redox/keymaps/jeherve/config.h +++ b/keyboards/redox/keymaps/jeherve/config.h @@ -17,16 +17,14 @@ along with this program. If not, see . #pragma once -/* Use I2C or Serial, not both */ - /* Change the default tapping toggle value (normally 5) */ #define TAPPING_TOGGLE 2 +/* Use I2C or Serial, not both */ #define USE_SERIAL //#define USE_I2C /* Select hand configuration */ - #define MASTER_LEFT // #define MASTER_RIGHT // #define EE_HANDS diff --git a/keyboards/redox/rules.mk b/keyboards/redox/rules.mk index 748d89dcfbd0..c0edb5428b40 100644 --- a/keyboards/redox/rules.mk +++ b/keyboards/redox/rules.mk @@ -66,9 +66,7 @@ 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 -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. -SUBPROJECT_rev1 = yes -USE_I2C = yes +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SPLIT_KEYBOARD = yes From 77ed9e3a7305b1921d079e2facfb8e6d3d137e19 Mon Sep 17 00:00:00 2001 From: abishalom Date: Tue, 27 Nov 2018 12:22:49 -0500 Subject: [PATCH 472/505] Keymap: Added abishalom keymaps (#4495) * Added abishalom keymaps Added personal keymaps for Massdrop Alt and Tada68 * Update keyboards/tada68/keymaps/abishalom/rules.mk Co-Authored-By: abishalom * Update keyboards/tada68/keymaps/abishalom/rules.mk Co-Authored-By: abishalom * Update keyboards/tada68/keymaps/abishalom/config.h Co-Authored-By: abishalom * Update keyboards/tada68/keymaps/abishalom/keymap.c Co-Authored-By: abishalom * Update keyboards/tada68/keymaps/abishalom/keymap.c Co-Authored-By: abishalom * Update keyboards/tada68/keymaps/abishalom/rules.mk Co-Authored-By: abishalom * Update keyboards/tada68/keymaps/abishalom/keymap.c Co-Authored-By: abishalom * Update keyboards/tada68/keymaps/abishalom/keymap.c Co-Authored-By: abishalom * Updated keymaps * Bugfix Tada68 * Update keyboards/tada68/keymaps/abishalom/keymap.c Co-Authored-By: abishalom --- .../massdrop/alt/keymaps/abishalom/keymap.c | 189 ++++++++++++++++++ keyboards/tada68/keymaps/abishalom/config.h | 3 + keyboards/tada68/keymaps/abishalom/keymap.c | 96 +++++++++ keyboards/tada68/keymaps/abishalom/readme.md | 6 + keyboards/tada68/keymaps/abishalom/rules.mk | 18 ++ 5 files changed, 312 insertions(+) create mode 100644 keyboards/massdrop/alt/keymaps/abishalom/keymap.c create mode 100644 keyboards/tada68/keymaps/abishalom/config.h create mode 100644 keyboards/tada68/keymaps/abishalom/keymap.c create mode 100644 keyboards/tada68/keymaps/abishalom/readme.md create mode 100644 keyboards/tada68/keymaps/abishalom/rules.mk diff --git a/keyboards/massdrop/alt/keymaps/abishalom/keymap.c b/keyboards/massdrop/alt/keymaps/abishalom/keymap.c new file mode 100644 index 000000000000..7ffa53dcaa38 --- /dev/null +++ b/keyboards/massdrop/alt/keymaps/abishalom/keymap.c @@ -0,0 +1,189 @@ +#include QMK_KEYBOARD_H + +enum alt_keycodes { + L_BRI = SAFE_RANGE, //LED Brightness Increase + L_BRD, //LED Brightness Decrease + L_PTN, //LED Pattern Select Next + L_PTP, //LED Pattern Select Previous + L_PSI, //LED Pattern Speed Increase + L_PSD, //LED Pattern Speed Decrease + L_T_MD, //LED Toggle Mode + L_T_ONF, //LED Toggle On / Off + L_ON, //LED On + L_OFF, //LED Off + L_T_BR, //LED Toggle Breath Effect + L_T_PTD, //LED Toggle Scrolling Pattern Direction + U_T_AUTO, //USB Extra Port Toggle Auto Detect / Always Active + U_T_AGCR, //USB Toggle Automatic GCR control + DBG_TOG, //DEBUG Toggle On / Off + DBG_MTRX, //DEBUG Toggle Matrix Prints + DBG_KBD, //DEBUG Toggle Keyboard Prints + DBG_MOU, //DEBUG Toggle Mouse Prints + MD_BOOT, //Restart into bootloader after hold timeout +}; + +#define TG_NKRO MAGIC_TOGGLE_NKRO //Toggle 6KRO / NKRO mode + +keymap_config_t keymap_config; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + 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_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_HOME, \ + 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_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT \ + ), + [1] = LAYOUT( + KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_MUTE, \ + L_T_BR, L_PSD, L_BRI, L_PSI, KC_TRNS, KC_TRNS, KC_TRNS, U_T_AUTO,U_T_AGCR,KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_END, \ + L_T_PTD, L_PTP, L_BRD, L_PTN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, \ + KC_TRNS, L_T_MD, L_T_ONF, KC_TRNS, KC_TRNS, MD_BOOT, TG_NKRO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_VOLD, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END \ + ), + /* + [X] = LAYOUT( + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \ + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \ + ), + */ +}; + +// 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) { +}; + +#define MODS_SHIFT (keyboard_report->mods & MOD_BIT(KC_LSHIFT) || keyboard_report->mods & MOD_BIT(KC_RSHIFT)) +#define MODS_CTRL (keyboard_report->mods & MOD_BIT(KC_LCTL) || keyboard_report->mods & MOD_BIT(KC_RCTRL)) +#define MODS_ALT (keyboard_report->mods & MOD_BIT(KC_LALT) || keyboard_report->mods & MOD_BIT(KC_RALT)) + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + static uint32_t key_timer; + + switch (keycode) { + case L_BRI: + if (record->event.pressed) { + if (LED_GCR_STEP > LED_GCR_MAX - gcr_desired) gcr_desired = LED_GCR_MAX; + else gcr_desired += LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_BRD: + if (record->event.pressed) { + if (LED_GCR_STEP > gcr_desired) gcr_desired = 0; + else gcr_desired -= LED_GCR_STEP; + if (led_animation_breathing) gcr_breathe = gcr_desired; + } + return false; + case L_PTN: + if (record->event.pressed) { + if (led_animation_id == led_setups_count - 1) led_animation_id = 0; + else led_animation_id++; + } + return false; + case L_PTP: + if (record->event.pressed) { + if (led_animation_id == 0) led_animation_id = led_setups_count - 1; + else led_animation_id--; + } + return false; + case L_PSI: + if (record->event.pressed) { + led_animation_speed += ANIMATION_SPEED_STEP; + } + return false; + case L_PSD: + if (record->event.pressed) { + led_animation_speed -= ANIMATION_SPEED_STEP; + if (led_animation_speed < 0) led_animation_speed = 0; + } + return false; + case L_T_MD: + if (record->event.pressed) { + led_lighting_mode++; + if (led_lighting_mode > LED_MODE_MAX_INDEX) led_lighting_mode = LED_MODE_NORMAL; + } + return false; + case L_T_ONF: + if (record->event.pressed) { + led_enabled = !led_enabled; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_ON: + if (record->event.pressed) { + led_enabled = 1; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_OFF: + if (record->event.pressed) { + led_enabled = 0; + I2C3733_Control_Set(led_enabled); + } + return false; + case L_T_BR: + if (record->event.pressed) { + led_animation_breathing = !led_animation_breathing; + if (led_animation_breathing) { + gcr_breathe = gcr_desired; + led_animation_breathe_cur = BREATHE_MIN_STEP; + breathe_dir = 1; + } + } + return false; + case L_T_PTD: + if (record->event.pressed) { + led_animation_direction = !led_animation_direction; + } + return false; + case U_T_AUTO: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); + } + return false; + case U_T_AGCR: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); + } + return false; + case DBG_TOG: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); + } + return false; + case DBG_MTRX: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); + } + return false; + case DBG_KBD: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); + } + return false; + case DBG_MOU: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); + } + return false; + case MD_BOOT: + if (record->event.pressed) { + key_timer = timer_read32(); + } else { + if (timer_elapsed32(key_timer) >= 500) { + reset_keyboard(); + } + } + return false; + default: + return true; //Process all other keycodes normally + } +} diff --git a/keyboards/tada68/keymaps/abishalom/config.h b/keyboards/tada68/keymaps/abishalom/config.h new file mode 100644 index 000000000000..af01528b434d --- /dev/null +++ b/keyboards/tada68/keymaps/abishalom/config.h @@ -0,0 +1,3 @@ +#pragma once + +#define BACKLIGHT_BREATHING diff --git a/keyboards/tada68/keymaps/abishalom/keymap.c b/keyboards/tada68/keymaps/abishalom/keymap.c new file mode 100644 index 000000000000..94217948e033 --- /dev/null +++ b/keyboards/tada68/keymaps/abishalom/keymap.c @@ -0,0 +1,96 @@ +#include QMK_KEYBOARD_H + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +#define _BL 0 +#define _FL 1 +#define _NL 2 + +#define SEMI_FN LT(_FL, KC_SCLN) + +//Tap Dance Declarations +enum { + TD_WIN_LOCK = 0 +}; + +//BL_BRTG - breathing mode. Would like to put in. + +//Tap Dance Definitions +qk_tap_dance_action_t tap_dance_actions[] = { + [TD_WIN_LOCK] = ACTION_TAP_DANCE_DOUBLE(MAGIC_NO_GUI, MAGIC_UNNO_GUI) +}; + +// +////In Layer declaration, add tap dance item in place of a key code +//TD(TD_WIN_LOCK) + +// Double Tap Fn button to get caps. FN + Tab to get to number layer -> Maybe switch to FN + space?. +// Press fn+GUI once to lock, double tap to unlock. + +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| [| ]| \ |Del | + * |----------------------------------------------------------------| + * |FNCAP| A| S| D| F| G| H| J| K| L| ;| '|Enter |PgUp | + * |----------------------------------------------------------------| + * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn| + * |----------------------------------------------------------------| + * |Ctrl|Win |Alt | Space |Alt| FN|Ctrl|Lef|Dow|Rig | + * `----------------------------------------------------------------' + */ +[_BL] = LAYOUT_ansi( + KC_GESC, 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_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, \ + LT(_FL, KC_CAPS), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, SEMI_FN,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_SPC, KC_RALT,MO(_FL),KC_RCTRL, KC_LEFT,KC_DOWN,KC_RGHT), + + /* Keymap _FL: Function Layer + * ,----------------------------------------------------------------. + * | | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del | | + * |----------------------------------------------------------------| + * |#PAD |Pre| U |NXT| | | |PGD| U |PGU|PSC| | | |Ins | + * |----------------------------------------------------------------| + * | |L | D | R |PPl| | | L | D | R | | | |Home| + * |----------------------------------------------------------------| + * | CAPS |MUT|VU-|VU+| | | |BRG|BL-|BL+|BLT| |Stp|End | + * |----------------------------------------------------------------| + * | |WTOG| | | | | |Pre|PPl|Nxt | + * `----------------------------------------------------------------' + */ +[_FL] = LAYOUT_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, _______ , \ + TO(_NL),KC_MPRV, KC_UP ,KC_MNXT,_______, _______,_______,KC_PGDN,KC_UP,KC_PGUP,KC_PSCR,_______,_______, _______,KC_INSERT, \ + _______,KC_LEFT,KC_DOWN,KC_RGHT,KC_MPLY,_______,_______,KC_LEFT,KC_DOWN,KC_RGHT,_______,_______, _______,KC_HOME, \ + _______,KC_MUTE,KC_VOLD,KC_VOLU, _______,_______, _______,BL_BRTG,BL_DEC,BL_INC,BL_TOGG,_______, KC_STOP, KC_END, \ + _______,TD(TD_WIN_LOCK),_______, _______, _______,KC_TRNS,_______,KC_MPRV,KC_MPLY, KC_MNXT), + + +//Press either of function keys to get back to base layer. + + /* Keymap _NL: Number Layer + * ,----------------------------------------------------------------. + * |ESC| F1 | F2| F3| F4| |#L | 7 | 8 | 9 | - | | = | | | + * |----------------------------------------------------------------| + * | TAB | | UP| | | | / | 4 | 5 | 6 | + | | | | DEL| + * |----------------------------------------------------------------| + * | _BL |LFT|DWN|RGT| | | * | 1 | 2 | 3 |ENT| | ENT |PgUp| + * |----------------------------------------------------------------| + * | SHIFT | | | | | | 0 | 0 | , | . |BKS| SHIFT| U |PgDn| + * |----------------------------------------------------------------| + * |CTRL|WIN |ALT | |ALT| _BL |CTRL| L | D | R| + * `----------------------------------------------------------------' + */ +[_NL] = LAYOUT_ansi( + _______, KC_F1 ,KC_F2, KC_F3, KC_F4, _______, KC_NLCK, KC_P7, KC_P8, KC_P9, KC_PMNS, KC_PEQL, KC_PEQL, _______, _______ , \ + KC_TAB,_______, KC_UP,_______,_______, _______,KC_PSLS,KC_P4,KC_P5,KC_P6,KC_PPLS,_______,_______, _______,KC_DEL, \ + TO(_BL),KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,KC_PAST,KC_P1,KC_P2,KC_P3,KC_PENT,_______, KC_ENT,KC_PGUP, \ + KC_LSFT,_______,_______,_______, _______,_______, KC_P0,KC_P0,KC_PCMM,KC_PDOT,KC_BSPC,KC_RSFT, KC_UP, KC_PGDN, \ + KC_LCTRL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,TO(_BL),KC_RCTRL,KC_LEFT,KC_DOWN, KC_RGHT), + +}; diff --git a/keyboards/tada68/keymaps/abishalom/readme.md b/keyboards/tada68/keymaps/abishalom/readme.md new file mode 100644 index 000000000000..511704223ba7 --- /dev/null +++ b/keyboards/tada68/keymaps/abishalom/readme.md @@ -0,0 +1,6 @@ +# Godolphins13 Tada68 + +My Tada68 layout. +Caps lock acts as a function key when held, otherwise just caps lock. +In the function layer, arrow keys mapped to both wasd and ijkl, as I haven't really decided which I like best. + diff --git a/keyboards/tada68/keymaps/abishalom/rules.mk b/keyboards/tada68/keymaps/abishalom/rules.mk new file mode 100644 index 000000000000..b3eaa6215011 --- /dev/null +++ b/keyboards/tada68/keymaps/abishalom/rules.mk @@ -0,0 +1,18 @@ +# 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 = yes # Breathing sleep LED during USB suspend +TAP_DANCE_ENABLE = yes # Tappa Dance Bitch From 90f9fb4eee0da25e5408e54ed872c6da2a40c5f3 Mon Sep 17 00:00:00 2001 From: mtei <2170248+mtei@users.noreply.github.com> Date: Fri, 5 Oct 2018 14:54:22 +0900 Subject: [PATCH 473/505] Fixed docs/newbs_testing_debugging.md and tmk_core/common/print.h --- docs/newbs_testing_debugging.md | 2 +- tmk_core/common/print.h | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/newbs_testing_debugging.md b/docs/newbs_testing_debugging.md index 1d8021dec8f1..45509110a557 100644 --- a/docs/newbs_testing_debugging.md +++ b/docs/newbs_testing_debugging.md @@ -28,6 +28,6 @@ Sometimes it's useful to print debug messages from within your [custom code](cus After that you can use a few different print functions: * `print("string")`: Print a simple string. -* `sprintf("%s string", var)`: Print a formatted string +* `uprintf("%s string", var)`: Print a formatted string * `dprint("string")` Print a simple string, but only when debug mode is enabled * `dprintf("%s string", var)`: Print a formatted string, but only when debug mode is enabled diff --git a/tmk_core/common/print.h b/tmk_core/common/print.h index 06c6cbd7f166..2d7184bd0d40 100644 --- a/tmk_core/common/print.h +++ b/tmk_core/common/print.h @@ -60,7 +60,7 @@ # define println(s) xputs(PSTR(s "\r\n")) # define uprint(s) print(s) # define uprintln(s) println(s) -# define uprintf(fmt, ...) xprintf(fmt, ...) +# define uprintf(fmt, ...) xprintf(fmt, ##__VA_ARGS__) # endif /* USER_PRINT / NORMAL PRINT */ @@ -125,7 +125,7 @@ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t)); # define println(s) xprintf(s "\r\n") # define uprint(s) print(s) # define uprintln(s) println(s) -# define uprintf(fmt, ...) xprintf(fmt, ...) +# define uprintf(fmt, ...) xprintf(fmt, ##__VA_ARGS__) # endif /* USER_PRINT / NORMAL PRINT */ @@ -141,19 +141,19 @@ void print_set_sendchar(int8_t (*print_sendchar_func)(uint8_t)); # define xprintf(fmt, ...) // Create user print defines -# define uprintf(fmt, ...) __xprintf(fmt, ...) +# define uprintf(fmt, ...) __xprintf(fmt, ##__VA_ARGS__) # define uprint(s) xprintf(s) # define uprintln(s) xprintf(s "\r\n") # else /* NORMAL PRINT */ // Create user & normal print defines -# define xprintf(fmt, ...) __xprintf(fmt, ...) +# define xprintf(fmt, ...) __xprintf(fmt, ##__VA_ARGS__) # define print(s) xprintf(s) # define println(s) xprintf(s "\r\n") # define uprint(s) print(s) # define uprintln(s) println(s) -# define uprintf(fmt, ...) xprintf(fmt, ...) +# define uprintf(fmt, ...) xprintf(fmt, ##__VA_ARGS__) # endif /* USER_PRINT / NORMAL PRINT */ From d79b5e67b691e367897a24008ec3f2188b1642f3 Mon Sep 17 00:00:00 2001 From: John Pettigrew Date: Tue, 27 Nov 2018 15:43:48 -0600 Subject: [PATCH 474/505] Puck Macropad (#4274) * Add Puck * Update Manufacturer name in metadata * Add num lock to high layer * update pins * update pin settings * fix numlock key * Cleanup config.h * Update device info * updates after review --- keyboards/puck/config.h | 31 +++++++++++ keyboards/puck/keymaps/default/keymap.c | 64 +++++++++++++++++++++++ keyboards/puck/puck.c | 1 + keyboards/puck/puck.h | 15 ++++++ keyboards/puck/readme.md | 11 ++++ keyboards/puck/rules.mk | 68 +++++++++++++++++++++++++ 6 files changed, 190 insertions(+) create mode 100644 keyboards/puck/config.h create mode 100644 keyboards/puck/keymaps/default/keymap.c create mode 100644 keyboards/puck/puck.c create mode 100644 keyboards/puck/puck.h create mode 100644 keyboards/puck/readme.md create mode 100644 keyboards/puck/rules.mk diff --git a/keyboards/puck/config.h b/keyboards/puck/config.h new file mode 100644 index 000000000000..b2cb1b23e362 --- /dev/null +++ b/keyboards/puck/config.h @@ -0,0 +1,31 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x6060 +#define DEVICE_VER 0x0001 +#define MANUFACTURER OkKeebs LLC +#define PRODUCT Puck +#define DESCRIPTION 4x3 macropad + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 3 + +#define MATRIX_ROW_PINS { D2, D3, C6, C7 } +#define MATRIX_COL_PINS { B4, D7, D6 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION ROW2COL + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCING_DELAY 5 + +/* number of backlight levels */ +#define BACKLIGHT_LEVELS 3 + +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE diff --git a/keyboards/puck/keymaps/default/keymap.c b/keyboards/puck/keymaps/default/keymap.c new file mode 100644 index 000000000000..6ba70a88bb59 --- /dev/null +++ b/keyboards/puck/keymaps/default/keymap.c @@ -0,0 +1,64 @@ +#include QMK_KEYBOARD_H + +#define _BL 0 +#define _HL 1 +#define _LL 2 + +enum keycodes { + LOW, + HIGH +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + /* + * Base Layer (Numbers) + */ + [_BL] = LAYOUT( + KC_KP_7, KC_KP_8, KC_KP_9, + KC_KP_4, KC_KP_5, KC_KP_6, + KC_KP_1, KC_KP_2, KC_KP_3, + LOW, KC_KP_0, HIGH + ), + /* + * High Layer (Work) + */ + [_HL] = LAYOUT( + KC_NUMLOCK, KC_PAST, KC_NO, + KC_PMNS, KC_PENT, KC_PPLS, + KC_NO, KC_PSLS, KC_NO, + KC_NO, KC_PDOT, KC_NO + ), + /* + * Low Layer (Media) + */ + [_LL] = LAYOUT( + KC_NO, KC_VOLU, KC_NO, + KC_MPRV, KC_MPLY, KC_MNXT, + KC_NO, KC_VOLD, KC_NO, + KC_NO, KC_NO, KC_NO + ), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch(keycode) { + case HIGH: + if (record->event.pressed) { + layer_on(_HL); + }else{ + layer_off(_HL); + layer_off(_LL); + } + return false; + break; + case LOW: + if (record->event.pressed) { + layer_on(_LL); + }else{ + layer_off(_LL); + layer_off(_HL); + } + return false; + break; + } + return true; +} diff --git a/keyboards/puck/puck.c b/keyboards/puck/puck.c new file mode 100644 index 000000000000..0e26b9c3cd83 --- /dev/null +++ b/keyboards/puck/puck.c @@ -0,0 +1 @@ +#include "puck.h" diff --git a/keyboards/puck/puck.h b/keyboards/puck/puck.h new file mode 100644 index 000000000000..4467614fdb80 --- /dev/null +++ b/keyboards/puck/puck.h @@ -0,0 +1,15 @@ +#ifndef PUCK_H +#define PUCK_H + +#include "quantum.h" + +#define LAYOUT( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B \ +) { \ + { K00, K01, K02 }, \ + { K03, K04, K05 }, \ + { K06, K07, K08 }, \ + { K09, K0A, K0B }, \ +} + +#endif diff --git a/keyboards/puck/readme.md b/keyboards/puck/readme.md new file mode 100644 index 000000000000..45e438c4719e --- /dev/null +++ b/keyboards/puck/readme.md @@ -0,0 +1,11 @@ +A 4 x 3 macropad. + +Keyboard Maintainer: [john-pettigrew](https://github.com/john-pettigrew) +Hardware Supported: Puck PCB. +Hardware Availability: [OkKeebs.com](https://okkeebs.com/products/puck-pcb) + +Make example for this keyboard (after setting up your build environment): + + make puck:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/puck/rules.mk b/keyboards/puck/rules.mk new file mode 100644 index 000000000000..48144534d47f --- /dev/null +++ b/keyboards/puck/rules.mk @@ -0,0 +1,68 @@ + + +# 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 +BOOTLOADER = halfkay + +# 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 +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 From 82c02d9b8d30cac7ab0b0d21e9d81c1a70df73c1 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 27 Nov 2018 13:45:01 -0800 Subject: [PATCH 475/505] Update MSYS to use the 5.4.0 toolchain (#4106) --- util/msys2_install.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/util/msys2_install.sh b/util/msys2_install.sh index d9459580c7dd..a0548ad9bcd9 100755 --- a/util/msys2_install.sh +++ b/util/msys2_install.sh @@ -13,9 +13,11 @@ source "$dir/win_shared_install.sh" function install_avr { rm -f -r "$avrtools" - wget "http://ww1.microchip.com/downloads/en/DeviceDoc/avr8-gnu-toolchain-installer-3.5.4.91-win32.any.x86.exe" - 7z x avr8-gnu-toolchain-installer-3.5.4.91-win32.any.x86.exe - rm avr8-gnu-toolchain-installer-3.5.4.91-win32.any.x86.exe + wget "http://ww1.microchip.com/downloads/en/DeviceDoc/avr8-gnu-toolchain-3.6.1.1752-win32.any.x86.zip" + 7z x avr8-gnu-toolchain-3.6.1.1752-win32.any.x86.zip + mv avr8-gnu-toolchain-win32_x86/ avr8-gnu-toolchain + rm __MACOSX -R + rm avr8-gnu-toolchain-3.6.1.1752-win32.any.x86.zip pacman --needed -S mingw-w64-x86_64-avrdude } From 929e6a3231d7b873bad475a7040f140712fb9c9d Mon Sep 17 00:00:00 2001 From: Alex Mayer Date: Tue, 27 Nov 2018 17:00:01 -0500 Subject: [PATCH 476/505] Ergodox EZ: Remove Unused Code From Keymap --- keyboards/ergodox_ez/keymaps/default/keymap.c | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/keyboards/ergodox_ez/keymaps/default/keymap.c b/keyboards/ergodox_ez/keymaps/default/keymap.c index 49de6077373f..0cd6d6c2ce5f 100644 --- a/keyboards/ergodox_ez/keymaps/default/keymap.c +++ b/keyboards/ergodox_ez/keymaps/default/keymap.c @@ -145,24 +145,6 @@ 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) { - 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. @@ -197,11 +179,6 @@ void matrix_init_user(void) { #endif }; -// Runs constantly in the background, in a loop. -void matrix_scan_user(void) { - -}; - // Runs whenever there is a layer state change. uint32_t layer_state_set_user(uint32_t state) { ergodox_board_led_off(); From 6983c71efd9991e7f6b8290dff24a023bbe4eeb1 Mon Sep 17 00:00:00 2001 From: Alex Mayer Date: Tue, 27 Nov 2018 17:04:29 -0500 Subject: [PATCH 477/505] Ergodox EZ: Clean Up process_record_user Function Set ERPM = SAFE_RANGE --- keyboards/ergodox_ez/keymaps/default/keymap.c | 35 +++++++------------ 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/keyboards/ergodox_ez/keymaps/default/keymap.c b/keyboards/ergodox_ez/keymaps/default/keymap.c index 0cd6d6c2ce5f..12d6cf6fa634 100644 --- a/keyboards/ergodox_ez/keymaps/default/keymap.c +++ b/keyboards/ergodox_ez/keymaps/default/keymap.c @@ -6,8 +6,7 @@ #define MDIA 2 // media keys enum custom_keycodes { - PLACEHOLDER = SAFE_RANGE, // can always be here - EPRM, + EPRM = SAFE_RANGE, VRSN, RGB_SLD }; @@ -146,28 +145,20 @@ const uint16_t PROGMEM fn_actions[] = { }; bool process_record_user(uint16_t keycode, keyrecord_t *record) { - switch (keycode) { - // dynamically generate these. - case EPRM: - if (record->event.pressed) { + if (record->event.pressed) { + switch (keycode) { + case EPRM: eeconfig_init(); - } - return false; - break; - case VRSN: - if (record->event.pressed) { + return false; + case VRSN: 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 false; + #ifdef RGBLIGHT_ENABLE + case RGB_SLD: + rgblight_mode(1); + return false; + #endif + } } return true; } From e4dfcf896ef641701564bec5ea1ea7aa81b072bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Tue, 27 Nov 2018 23:29:59 +0100 Subject: [PATCH 478/505] Add tap_code16 function (#4362) --- quantum/quantum.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/quantum/quantum.h b/quantum/quantum.h index fe670c8eb458..41c7d8351a9a 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -240,8 +240,9 @@ void reset_keyboard(void); void startup_user(void); void shutdown_user(void); -void register_code16 (uint16_t code); -void unregister_code16 (uint16_t code); +void register_code16(uint16_t code); +void unregister_code16(uint16_t code); +inline void tap_code16(uint16_t code) { register_code16(code); unregister_code16(code); } #ifdef BACKLIGHT_ENABLE void backlight_init_ports(void); From dd7534cccabd9e1cea86e69741ed8c68cb3d0299 Mon Sep 17 00:00:00 2001 From: epaew Date: Wed, 28 Nov 2018 08:18:11 +0900 Subject: [PATCH 479/505] Keyboard: fix for debug crkbd (#4469) --- keyboards/crkbd/crkbd.c | 10 +++++++--- keyboards/crkbd/rev1/split_scomm.c | 5 ++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/keyboards/crkbd/crkbd.c b/keyboards/crkbd/crkbd.c index 32f7af776ee0..d420ccda270f 100644 --- a/keyboards/crkbd/crkbd.c +++ b/keyboards/crkbd/crkbd.c @@ -1,6 +1,10 @@ #include "crkbd.h" -#include "ssd1306.h" +#include "ssd1306.h" bool process_record_kb(uint16_t keycode, keyrecord_t *record) { - return process_record_gfx(keycode,record) && process_record_user(keycode, record); -} \ No newline at end of file +#ifdef SSD1306OLED + return process_record_gfx(keycode,record) && process_record_user(keycode, record); +#else + return process_record_user(keycode, record); +#endif +} diff --git a/keyboards/crkbd/rev1/split_scomm.c b/keyboards/crkbd/rev1/split_scomm.c index ada7867960b9..a1fe6ba5b823 100644 --- a/keyboards/crkbd/rev1/split_scomm.c +++ b/keyboards/crkbd/rev1/split_scomm.c @@ -63,10 +63,9 @@ int serial_update_buffers(int master_update) if( smatstatus == TRANSACTION_END ) { s_change_old = s_change_new; #ifdef CONSOLE_ENABLE - uprintf("slave matrix = %b %b %b %b %b\n", + uprintf("slave matrix = %b %b %b %b\n", serial_slave_buffer[0], serial_slave_buffer[1], - serial_slave_buffer[2], serial_slave_buffer[3], - serial_slave_buffer[4] ); + serial_slave_buffer[2], serial_slave_buffer[3]); #endif } } else { From 55c32148779baf1dcacb3bedc74f8179a1e0b2d7 Mon Sep 17 00:00:00 2001 From: Christon DeWan Date: Tue, 27 Nov 2018 15:20:17 -0800 Subject: [PATCH 480/505] fixed misplaced paranthesis in arm usb mouse send function (#4478) bug was causing lots of dropped events for me. --- tmk_core/protocol/chibios/usb_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c index 3028e7ea2adf..8223d9722867 100644 --- a/tmk_core/protocol/chibios/usb_main.c +++ b/tmk_core/protocol/chibios/usb_main.c @@ -704,7 +704,7 @@ void send_mouse(report_mouse_t *report) { * every iteration - otherwise the system will remain locked, * no interrupts served, so USB not going through as well. * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */ - if (osalThreadSuspendTimeoutS(&(&USB_DRIVER)->epc[MOUSE_IN_EPNUM]->in_state->thread, MS2ST(10)==MSG_TIMEOUT)) { + if (osalThreadSuspendTimeoutS(&(&USB_DRIVER)->epc[MOUSE_IN_EPNUM]->in_state->thread, MS2ST(10))==MSG_TIMEOUT) { osalSysUnlock(); return; } From 19043197459c5c8ed4a7039f1a4c1da180da45e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20=C4=90or=C4=91evi=C4=87?= Date: Wed, 28 Nov 2018 00:34:06 +0100 Subject: [PATCH 481/505] Remove RGB_SMOD alias and replace uses with RGB_MOD (#4319) --- docs/feature_rgblight.md | 2 -- keyboards/bface/keymaps/default/keymap.c | 2 +- keyboards/crkbd/keymaps/default/keymap.c | 4 ++-- keyboards/crkbd/keymaps/like_jis/keymap.c | 4 ++-- keyboards/daisy/keymaps/default/keymap.c | 2 +- keyboards/do60/keymaps/default/keymap.c | 2 +- keyboards/do60/keymaps/test/keymap.c | 2 +- keyboards/handwired/woodpad/keymaps/drashna/keymap.c | 2 +- keyboards/helix/pico/keymaps/default/keymap.c | 2 +- keyboards/helix/rev2/keymaps/default/keymap.c | 4 ++-- keyboards/helix/rev2/keymaps/five_rows/README.md | 2 +- keyboards/helix/rev2/keymaps/five_rows/README_jp.md | 2 +- keyboards/helix/rev2/keymaps/five_rows/keymap.c | 2 +- keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c | 2 +- keyboards/helix/rev2/keymaps/yshrsmz/keymap.c | 4 ++-- keyboards/jj40/keymaps/like_jis/keymap.c | 4 ++-- keyboards/nyquist/keymaps/kim-kim/keymap.c | 2 +- keyboards/pearl/keymaps/jetpacktuxedo/keymap.c | 2 +- keyboards/playkbtw/ca66/keymaps/olivia/keymap.c | 2 +- keyboards/xd75/keymaps/kim-kim/keymap.c | 2 +- quantum/quantum_keycodes.h | 1 - users/turbomech/backupturbomech.c | 1 - 22 files changed, 24 insertions(+), 28 deletions(-) diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md index 0205ebe91a7c..4610467b02bd 100644 --- a/docs/feature_rgblight.md +++ b/docs/feature_rgblight.md @@ -63,8 +63,6 @@ Changing the **Value** sets the overall brightness. |`RGB_MODE_GRADIENT`|`RGB_M_G` |Static gradient animation mode | |`RGB_MODE_RGBTEST` |`RGB_M_T` |Red, Green, Blue test animation mode | -?> For backwards compatibility, `RGB_SMOD` is another alias of `RGB_MOD`. - ## Configuration Your RGB lighting can be configured by placing these `#define`s in your `config.h`: diff --git a/keyboards/bface/keymaps/default/keymap.c b/keyboards/bface/keymaps/default/keymap.c index c29ce9abfa35..9c41014bcbaf 100644 --- a/keyboards/bface/keymaps/default/keymap.c +++ b/keyboards/bface/keymaps/default/keymap.c @@ -29,7 +29,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,BL_INC, BL_DEC, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, - KC_TRNS,KC_TRNS,RGB_SMOD,KC_TRNS,BL_ON, BL_OFF, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, + KC_TRNS,KC_TRNS,RGB_MOD,KC_TRNS,BL_ON, BL_OFF, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS ), /* You can copy this layer as base for a new fn layer * / diff --git a/keyboards/crkbd/keymaps/default/keymap.c b/keyboards/crkbd/keymaps/default/keymap.c index c7c9582e8368..1e2e57a2b452 100644 --- a/keyboards/crkbd/keymaps/default/keymap.c +++ b/keyboards/crkbd/keymaps/default/keymap.c @@ -52,7 +52,7 @@ enum macro_keycodes { #define KC_LSAD RGB_SAD #define KC_LVAI RGB_VAI #define KC_LVAD RGB_VAD -#define KC_LSMOD RGB_SMOD +#define KC_LMOD RGB_MOD #define KC_CTLTB CTL_T(KC_TAB) #define KC_GUIEI GUI_T(KC_LANG2) #define KC_ALTKN ALT_T(KC_LANG1) @@ -100,7 +100,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|------+------+------+------+------+------| |------+------+------+------+------+------| LTOG, LHUI, LSAI, LVAI, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\ //|------+------+------+------+------+------| |------+------+------+------+------+------| - LSMOD, LHUD, LSAD, LVAD, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\ + LMOD, LHUD, LSAD, LVAD, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\ //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------| GUIEI, LOWER, SPC, ENT, RAISE, ALTKN \ //`--------------------' `--------------------' diff --git a/keyboards/crkbd/keymaps/like_jis/keymap.c b/keyboards/crkbd/keymaps/like_jis/keymap.c index 05d31845c831..42d36de44978 100644 --- a/keyboards/crkbd/keymaps/like_jis/keymap.c +++ b/keyboards/crkbd/keymaps/like_jis/keymap.c @@ -50,7 +50,7 @@ enum custom_keycodes { #define KC_LSAD RGB_SAD #define KC_LVAI RGB_VAI #define KC_LVAD RGB_VAD -#define KC_LSMOD RGB_SMOD +#define KC_LMOD RGB_MOD #define KC_KNRM AG_NORM #define KC_KSWP AG_SWAP @@ -99,7 +99,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|------+-------+------+------+------+-----| |------+------+------+------+------+------| _____, LTOG, LHUI, LSAI, LVAI,XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, PGUP, XXXXX,\ //|------+-------+------+------+------+-----| |------+------+------+------+------+------| - _____, LSMOD, LHUD, LSAD, LVAD,XXXXX, XXXXX, XXXXX, XXXXX, HOME, PGDN, END,\ + _____, LMOD, LHUD, LSAD, LVAD,XXXXX, XXXXX, XXXXX, XXXXX, HOME, PGDN, END,\ //|------+------+------+------+------+------+------| |------+------+------+------+------+------+------| _____, _____, XXXXX, _____, _____, XXXXX \ //`--------------------' `--------------------' diff --git a/keyboards/daisy/keymaps/default/keymap.c b/keyboards/daisy/keymaps/default/keymap.c index 833620b01f2b..f1a5e353fae3 100644 --- a/keyboards/daisy/keymaps/default/keymap.c +++ b/keyboards/daisy/keymaps/default/keymap.c @@ -64,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_RS] = LAYOUT( RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_TRNS, KC_HOME, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_END, KC_PGDN, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_SMOD, RGB_HUD, RGB_HUI, RGB_VAD, RGB_VAI, RGB_SAD, RGB_SAI, BL_STEP, KC_TRNS, + KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_VAD, RGB_VAI, RGB_SAD, RGB_SAI, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), diff --git a/keyboards/do60/keymaps/default/keymap.c b/keyboards/do60/keymaps/default/keymap.c index 1a8b98a46b15..7c66f0ac0b1f 100644 --- a/keyboards/do60/keymaps/default/keymap.c +++ b/keyboards/do60/keymaps/default/keymap.c @@ -15,7 +15,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_all( RESET, 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_NO, KC_NO, \ KC_NO, RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, BL_TOGG,BL_ON, BL_INC, KC_INS, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_DEL, \ - KC_NO, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SMOD, BL_STEP,BL_OFF, BL_DEC, KC_NO, KC_NO, KC_HOME, KC_PGUP, KC_NO, KC_ENT, \ + KC_NO, RGB_HUD, RGB_SAD, RGB_VAD, RGB_RMOD, BL_STEP,BL_OFF, BL_DEC, KC_NO, KC_NO, KC_HOME, KC_PGUP, KC_NO, KC_ENT, \ KC_LSFT, KC_NO, KC_NO, KC_APP, BL_STEP, KC_NO, KC_NO, KC_VOLD,KC_VOLU,KC_MUTE, KC_END, KC_RSFT, KC_NO , KC_PGUP, KC_INS, \ KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC,KC_SPC, KC_DEL, KC_RGUI, F(0), KC_HOME, KC_PGDOWN,KC_END), diff --git a/keyboards/do60/keymaps/test/keymap.c b/keyboards/do60/keymaps/test/keymap.c index 04b5f44bb1c7..6bac713fdafe 100644 --- a/keyboards/do60/keymaps/test/keymap.c +++ b/keyboards/do60/keymaps/test/keymap.c @@ -15,7 +15,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_all( RESET, 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_NO, KC_NO, \ KC_NO, RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, KC_HOME,KC_CALC,KC_NO, KC_INS, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_DEL, \ - KC_NO, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SMOD, KC_END, KC_PGDN,KC_NO, KC_NO, KC_NO, KC_HOME, KC_PGUP, KC_NO, KC_ENT, \ + KC_NO, RGB_HUD, RGB_SAD, RGB_VAD, RGB_RMOD, KC_END, KC_PGDN,KC_NO, KC_NO, KC_NO, KC_HOME, KC_PGUP, KC_NO, KC_ENT, \ KC_LSFT, KC_NO, KC_NO, KC_APP, BL_STEP, KC_NO, KC_NO, KC_VOLD,KC_VOLU,KC_MUTE, KC_END, KC_RSFT, KC_NO , KC_PGUP, KC_INS, \ KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC,KC_SPC, KC_DEL, KC_RGUI, F(0), KC_HOME, KC_PGDOWN,KC_END), diff --git a/keyboards/handwired/woodpad/keymaps/drashna/keymap.c b/keyboards/handwired/woodpad/keymaps/drashna/keymap.c index fd1ff005351f..f7df5eac7929 100644 --- a/keyboards/handwired/woodpad/keymaps/drashna/keymap.c +++ b/keyboards/handwired/woodpad/keymaps/drashna/keymap.c @@ -64,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_RESET, KC_MUTE, KC_VOLD, KC_VOLU,\ KC_MAKE, _______, RGB_HUI, RGB_HUD, \ KC_MPLY, KC_MSTP, KC_MPRV, KC_MNXT, \ - RGB_TOG, RGB_SMOD, RGB_SAI, RGB_VAI, \ + RGB_TOG, RGB_MOD, RGB_SAI, RGB_VAI, \ _______, KC_RGB_T, RGB_SAD, RGB_VAD \ ), diff --git a/keyboards/helix/pico/keymaps/default/keymap.c b/keyboards/helix/pico/keymaps/default/keymap.c index 4c5878517926..5273bb4a0170 100644 --- a/keyboards/helix/pico/keymaps/default/keymap.c +++ b/keyboards/helix/pico/keymaps/default/keymap.c @@ -164,7 +164,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, AU_ON, AU_OFF, MU_TOG, MU_MOD, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ _______, CK_TOGG, CK_RST, CK_UP, CK_DOWN, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD \ ) }; diff --git a/keyboards/helix/rev2/keymaps/default/keymap.c b/keyboards/helix/rev2/keymaps/default/keymap.c index 92393208ce60..0fb821affbd4 100644 --- a/keyboards/helix/rev2/keymaps/default/keymap.c +++ b/keyboards/helix/rev2/keymaps/default/keymap.c @@ -183,7 +183,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, RESET, RGBRST, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD \ ) }; @@ -296,7 +296,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD \ ) }; diff --git a/keyboards/helix/rev2/keymaps/five_rows/README.md b/keyboards/helix/rev2/keymaps/five_rows/README.md index 4feaac2efbfd..10a4fa942cb2 100644 --- a/keyboards/helix/rev2/keymaps/five_rows/README.md +++ b/keyboards/helix/rev2/keymaps/five_rows/README.md @@ -46,7 +46,7 @@ Mac mode swap Alt/Win(GUI) key. | ---- | ---- | --- | |on/off|Adjust + e(Qwerty)|RGB_TOG| | |Adjust + i(Qwerty)| | -|change mode|Adjust + d(Qwerty) |RGB_SMOD| +|change mode|Adjust + d(Qwerty) |RGB_MOD| | |Adjust + k(Qwerty)| | |HUE +|Adjust + Left Control|RGB_HUI| | |Adjust + Right Control| | diff --git a/keyboards/helix/rev2/keymaps/five_rows/README_jp.md b/keyboards/helix/rev2/keymaps/five_rows/README_jp.md index 932e200a5638..317ffdd71ddb 100644 --- a/keyboards/helix/rev2/keymaps/five_rows/README_jp.md +++ b/keyboards/helix/rev2/keymaps/five_rows/README_jp.md @@ -68,7 +68,7 @@ Winモードでは、該当のキーはどちらも共に Alt + `(日本語IME | ---- | ---- | --- | |オン/オフ|Adjust + e(Qwerty)|RGB_TOG| | |Adjust + i(Qwerty)| | -|モード切り替え|Adjust + d(Qwerty) |RGB_SMOD| +|モード切り替え|Adjust + d(Qwerty) |RGB_MOD| | |Adjust + k(Qwerty)| | |色相 +|Adjust + Left Control|RGB_HUI| | |Adjust + Right Control| | diff --git a/keyboards/helix/rev2/keymaps/five_rows/keymap.c b/keyboards/helix/rev2/keymaps/five_rows/keymap.c index 983bbe93786a..e293f590055d 100644 --- a/keyboards/helix/rev2/keymaps/five_rows/keymap.c +++ b/keyboards/helix/rev2/keymaps/five_rows/keymap.c @@ -280,7 +280,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_ADJUST] = LAYOUT( \ XXXXXXX, KEYPAD, DVORAK, COLEMAK, EUCALYN, QWERTY, QWERTY, EUCALYN, COLEMAK, DVORAK, KEYPAD, XXXXXXX, \ XXXXXXX, RESET, RGBRST, RGB_TOG, AU_ON, AG_SWAP, AG_SWAP, AU_ON, RGB_TOG, RGBRST, XXXXXXX, XXXXXXX, \ - RGB_HUI, RGB_SAI, RGB_VAI,RGB_SMOD, AU_OFF, AG_NORM, AG_NORM, AU_OFF,RGB_SMOD, RGB_VAI, RGB_SAI, RGB_HUI, \ + RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD, AU_OFF, AG_NORM, AG_NORM, AU_OFF, RGB_MOD, RGB_VAI, RGB_SAI, RGB_HUI, \ RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, RGB_VAD, RGB_SAD, RGB_HUD, \ _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______ \ ), diff --git a/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c b/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c index df00366e3935..8c2040d5beee 100644 --- a/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c +++ b/keyboards/helix/rev2/keymaps/five_rows_jis/keymap.c @@ -204,7 +204,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { XXXXXXX, RESET, RGBRST, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, RGBRST, XXXXXXX, XXXXXXX, XXXXXXX, \ XXXXXXX, DL_BAS, DL_BASE, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, DL_BAS, DL_BASE, AG_NORM, AG_SWAP, XXXXXXX, \ XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, \ - XXXXXXX, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, \ + XXXXXXX, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ), }; diff --git a/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c b/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c index 049a864c1ad0..1bde66e8856e 100644 --- a/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c +++ b/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c @@ -158,7 +158,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD \ ) }; @@ -253,7 +253,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \ _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD \ ) }; diff --git a/keyboards/jj40/keymaps/like_jis/keymap.c b/keyboards/jj40/keymaps/like_jis/keymap.c index 4724933eabe7..24db91947206 100644 --- a/keyboards/jj40/keymaps/like_jis/keymap.c +++ b/keyboards/jj40/keymaps/like_jis/keymap.c @@ -30,7 +30,7 @@ enum custom_keycodes { #define KC_LSAD RGB_SAD #define KC_LVAI RGB_VAI #define KC_LVAD RGB_VAD -#define KC_LSMOD RGB_SMOD +#define KC_LMOD RGB_MOD #define KC_BTOG BL_TOGG #define KC_BINC BL_INC #define KC_BDEC BL_DEC @@ -90,7 +90,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { //|------+------+------+------+------+------|------+------+------+------+------+------| XXXXX, LTOG, LHUI, LSAI, LVAI, BTOG, BINC, WH_R, WH_D, END, PGDN, XXXXX,\ //|------+------+------+------+------+------|------+------+------+------+------+------| - XXXXX, LSMOD, LHUD, LSAD, LVAD, XXXXX, BDEC, XXXXX, BTN1, BTN2, MS_U, XXXXX,\ + XXXXX, LMOD, LHUD, LSAD, LVAD, XXXXX, BDEC, XXXXX, BTN1, BTN2, MS_U, XXXXX,\ //|------+------+------+------+------+-------------+------+------+------+------+------| _____, _____, _____, _____, _____, XXXXX, XXXXX, _____, _____, MS_L, MS_D, MS_R \ //|------+------+------+------+------+-------------+------+------+------+------+------| diff --git a/keyboards/nyquist/keymaps/kim-kim/keymap.c b/keyboards/nyquist/keymaps/kim-kim/keymap.c index c8b081b25f7f..4051f296ee24 100644 --- a/keyboards/nyquist/keymaps/kim-kim/keymap.c +++ b/keyboards/nyquist/keymaps/kim-kim/keymap.c @@ -53,7 +53,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LW] = LAYOUT( \ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, _______, _______, _______, \ _______, KC_MPRV, KC_MNXT, KC_VOLU, RGB_TOG, KC_F11, _______, _______, _______, _______, _______, _______, \ - _______, KC_MPLY, KC_MSTP, KC_VOLD, RGB_SMOD, _______, _______, _______, _______, _______, _______, _______, \ + _______, KC_MPLY, KC_MSTP, KC_VOLD, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ), diff --git a/keyboards/pearl/keymaps/jetpacktuxedo/keymap.c b/keyboards/pearl/keymaps/jetpacktuxedo/keymap.c index b94fb673ff83..759c6fdc7d23 100644 --- a/keyboards/pearl/keymaps/jetpacktuxedo/keymap.c +++ b/keyboards/pearl/keymaps/jetpacktuxedo/keymap.c @@ -10,7 +10,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [1] = LAYOUT_all( 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_QUOT, KC_TRNS, - KC_TRNS, RGB_TOG, RGB_SMOD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSLS, KC_TRNS, + KC_TRNS, RGB_TOG, RGB_MOD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSLS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ), [2] = LAYOUT_all( diff --git a/keyboards/playkbtw/ca66/keymaps/olivia/keymap.c b/keyboards/playkbtw/ca66/keymaps/olivia/keymap.c index f27824e57aa0..ed3d625e47f9 100644 --- a/keyboards/playkbtw/ca66/keymaps/olivia/keymap.c +++ b/keyboards/playkbtw/ca66/keymaps/olivia/keymap.c @@ -11,7 +11,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { LAYOUT( 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, RESET, - KC_CAPS, RGB_RMOD,RGB_SMOD,RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_TOG, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, + KC_CAPS, RGB_RMOD,RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_TOG, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_EJCT, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), diff --git a/keyboards/xd75/keymaps/kim-kim/keymap.c b/keyboards/xd75/keymaps/kim-kim/keymap.c index 85c00023094a..0ec506e179d8 100644 --- a/keyboards/xd75/keymaps/kim-kim/keymap.c +++ b/keyboards/xd75/keymaps/kim-kim/keymap.c @@ -67,7 +67,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [_LW] = { /* LOWERED */ { _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11, _______, _______, _______, _______, _______, _______, _______, _______ }, { _______, KC_MPRV, KC_MNXT, KC_VOLU, _______, _______, RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______ }, - { _______, KC_MPLY, KC_MSTP, KC_VOLD, _______, _______, RGB_SMOD, _______, _______, _______, _______, _______, _______, _______, _______ }, + { _______, KC_MPLY, KC_MSTP, KC_VOLD, _______, _______, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______ }, { _______, _______, _______, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, { _______, MO(_RT), MO(_RT), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ }, }, diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index 14f8c2b812a9..7670d53e96cc 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -581,7 +581,6 @@ enum quantum_keycodes { #define CK_OFF CLICKY_DISABLE #define RGB_MOD RGB_MODE_FORWARD -#define RGB_SMOD RGB_MODE_FORWARD #define RGB_RMOD RGB_MODE_REVERSE #define RGB_M_P RGB_MODE_PLAIN diff --git a/users/turbomech/backupturbomech.c b/users/turbomech/backupturbomech.c index 49bcded552b4..2815aa452f37 100644 --- a/users/turbomech/backupturbomech.c +++ b/users/turbomech/backupturbomech.c @@ -269,7 +269,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { /*case RGB_MOD: -case RGB_SMOD: case RGB_HUI: case RGB_HUD: case RGB_SAI: From a495326aed8292138577387d9124a4b980904d37 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Tue, 27 Nov 2018 16:54:43 -0800 Subject: [PATCH 482/505] Turn off Mousekeys for several ps2avrGB keyboards (#4502) * Turn off Mousekeys for jc65 * Turn off Mousekeys for ps2avrGB templates * Disable mousekeys for bmini and canoe as well --- keyboards/bmini/rules.mk | 6 +++--- keyboards/canoe/rules.mk | 6 +++--- keyboards/jc65/v32a/rules.mk | 4 ++-- keyboards/pearl/rules.mk | 8 ++++---- keyboards/ps2avrGB/rules.mk | 6 +++--- quantum/template/ps2avrgb/rules.mk | 4 ++-- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/keyboards/bmini/rules.mk b/keyboards/bmini/rules.mk index 73c361e2a826..3d7bc0215d2d 100644 --- a/keyboards/bmini/rules.mk +++ b/keyboards/bmini/rules.mk @@ -26,13 +26,13 @@ F_CPU = 12000000 # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = bootloadHID # build options -BOOTMAGIC_ENABLE = yes -MOUSEKEY_ENABLE = yes +BOOTMAGIC_ENABLE = full +MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = yes COMMAND_ENABLE = yes diff --git a/keyboards/canoe/rules.mk b/keyboards/canoe/rules.mk index 73c361e2a826..3d7bc0215d2d 100644 --- a/keyboards/canoe/rules.mk +++ b/keyboards/canoe/rules.mk @@ -26,13 +26,13 @@ F_CPU = 12000000 # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = bootloadHID # build options -BOOTMAGIC_ENABLE = yes -MOUSEKEY_ENABLE = yes +BOOTMAGIC_ENABLE = full +MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = yes COMMAND_ENABLE = yes diff --git a/keyboards/jc65/v32a/rules.mk b/keyboards/jc65/v32a/rules.mk index 5c8e63283db0..fac85172ecc0 100644 --- a/keyboards/jc65/v32a/rules.mk +++ b/keyboards/jc65/v32a/rules.mk @@ -31,8 +31,8 @@ F_CPU = 12000000 BOOTLOADER = bootloadHID # build options -BOOTMAGIC_ENABLE = yes -MOUSEKEY_ENABLE = yes +BOOTMAGIC_ENABLE = full +MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = yes COMMAND_ENABLE = yes diff --git a/keyboards/pearl/rules.mk b/keyboards/pearl/rules.mk index c5b61c6d392e..fac85172ecc0 100644 --- a/keyboards/pearl/rules.mk +++ b/keyboards/pearl/rules.mk @@ -26,13 +26,13 @@ F_CPU = 12000000 # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = bootloadHID # build options -BOOTMAGIC_ENABLE = yes -MOUSEKEY_ENABLE = yes +BOOTMAGIC_ENABLE = full +MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = yes COMMAND_ENABLE = yes @@ -47,4 +47,4 @@ CUSTOM_MATRIX = yes SRC = matrix.c i2c.c # programming options -PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex \ No newline at end of file +PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex diff --git a/keyboards/ps2avrGB/rules.mk b/keyboards/ps2avrGB/rules.mk index c7c12dcf17e6..1be9edc24f88 100644 --- a/keyboards/ps2avrGB/rules.mk +++ b/keyboards/ps2avrGB/rules.mk @@ -26,13 +26,13 @@ F_CPU = 12000000 # Bootloader # This definition is optional, and if your keyboard supports multiple bootloaders of -# different sizes, comment this out, and the correct address will be loaded +# different sizes, comment this out, and the correct address will be loaded # automatically (+60). See bootloader.mk for all options. BOOTLOADER = atmel-dfu # build options -BOOTMAGIC_ENABLE = yes -MOUSEKEY_ENABLE = yes +BOOTMAGIC_ENABLE = full +MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = yes COMMAND_ENABLE = yes diff --git a/quantum/template/ps2avrgb/rules.mk b/quantum/template/ps2avrgb/rules.mk index 68d50aec67a1..85603f955cbd 100644 --- a/quantum/template/ps2avrgb/rules.mk +++ b/quantum/template/ps2avrgb/rules.mk @@ -31,8 +31,8 @@ F_CPU = 12000000 BOOTLOADER = bootloadHID # build options -BOOTMAGIC_ENABLE = yes -MOUSEKEY_ENABLE = yes +BOOTMAGIC_ENABLE = full +MOUSEKEY_ENABLE = no EXTRAKEY_ENABLE = yes CONSOLE_ENABLE = yes COMMAND_ENABLE = yes From 6d2730eeff424ee096a334bab9d130e9f26230d0 Mon Sep 17 00:00:00 2001 From: zfhrp6 Date: Thu, 29 Nov 2018 00:33:08 +0900 Subject: [PATCH 483/505] [fortitude60] match default keymap comment to the implementation. (#4508) --- keyboards/fortitude60/keymaps/default/keymap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keyboards/fortitude60/keymaps/default/keymap.c b/keyboards/fortitude60/keymaps/default/keymap.c index 9d724a8ec63d..f0b9964ab5d7 100644 --- a/keyboards/fortitude60/keymaps/default/keymap.c +++ b/keyboards/fortitude60/keymaps/default/keymap.c @@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| * | Shift| Z | X | C | V | B | [ | ] | N | M | , | . | / |Enter | * `-------------+------+------+------+------+------+------+------+------+------+------+-------------' - * | GUI | Ctrl |Lower |Space | Ctrl |Enter |Space |Raise | Alt | GUI | + * | GUI | Alt |Lower |Space | Ctrl |Enter |Space |Raise | Alt | GUI | * `---------------------------------------------------------------------' */ [_QWERTY] = LAYOUT( \ @@ -62,7 +62,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| * | Shift| Z | X | C | V | B | [ | ] | K | M | , | . | / |Enter | * `-------------+------+------+------+------+------+------+------+------+------+------+-------------' - * | GUI | Ctrl |Lower |Space | Ctrl |Enter |Space |Raise | Alt | GUI | + * | GUI | Alt |Lower |Space | Ctrl |Enter |Space |Raise | Alt | GUI | * `---------------------------------------------------------------------' */ [_COLEMAK] = LAYOUT( \ @@ -83,7 +83,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| * | Shift| ; | Q | J | K | X | [ | ] | B | M | W | V | Z |Enter | * `-------------+------+------+------+------+------+------+------+------+------+------+-------------' - * | GUI | Ctrl |Lower |Space | Ctrl |Enter |Space |Raise | Alt | GUI | + * | GUI | Alt |Lower |Space | Ctrl |Enter |Space |Raise | Alt | GUI | * `---------------------------------------------------------------------' */ [_DVORAK] = LAYOUT( \ From 3b42cff51607171285754ced097392332b40b5fd Mon Sep 17 00:00:00 2001 From: Paul Massendari Date: Wed, 28 Nov 2018 16:56:34 +0100 Subject: [PATCH 484/505] Added Rick Roll to song lists (#4510) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🙂 --- quantum/audio/song_list.h | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/quantum/audio/song_list.h b/quantum/audio/song_list.h index e63616a99402..9946084977cf 100644 --- a/quantum/audio/song_list.h +++ b/quantum/audio/song_list.h @@ -472,4 +472,34 @@ H__NOTE(_AS4), W__NOTE(_GS4), W__NOTE(_GS4), W__NOTE(_FS4), W__NOTE(_GS4), \ H__NOTE(_AS4), WD_NOTE(_DS4) +#define RICK_ROLL \ + Q__NOTE(_F4), \ + Q__NOTE(_G4), \ + Q__NOTE(_BF4), \ + Q__NOTE(_G4), \ + HD_NOTE(_D5), \ + HD_NOTE(_D5), \ + W__NOTE(_C5), \ + S__NOTE(_REST), \ + Q__NOTE(_F4), \ + Q__NOTE(_G4), \ + Q__NOTE(_BF4), \ + Q__NOTE(_G4), \ + HD_NOTE(_C5), \ + HD_NOTE(_C5), \ + W__NOTE(_BF4), \ + S__NOTE(_REST), \ + Q__NOTE(_F4), \ + Q__NOTE(_G4), \ + Q__NOTE(_BF4), \ + Q__NOTE(_G4), \ + W__NOTE(_BF4), \ + H__NOTE(_C5), \ + H__NOTE(_A4), \ + H__NOTE(_A4), \ + H__NOTE(_G4), \ + H__NOTE(_F4), \ + H__NOTE(_F4), \ + W__NOTE(_C5), \ + W__NOTE(_BF4), #endif From 8b85ec2a987d378fb95eea1468eadea70aec2cbf Mon Sep 17 00:00:00 2001 From: Giuseppe Rota Date: Wed, 28 Nov 2018 17:19:07 +0100 Subject: [PATCH 485/505] Add Extrakey support for Brightness up/down (#4477) --- docs/keycode.txt | 2 ++ docs/keycodes.md | 2 ++ docs/keycodes_basic.md | 2 ++ quantum/keymap_common.c | 2 +- tmk_core/common/keycode.h | 6 +++++- tmk_core/common/report.h | 7 ++++++- 6 files changed, 18 insertions(+), 3 deletions(-) diff --git a/docs/keycode.txt b/docs/keycode.txt index b2070f7117d6..bd93b0a941b6 100644 --- a/docs/keycode.txt +++ b/docs/keycode.txt @@ -209,6 +209,8 @@ KC_WWW_FORWARD KC_WFWD KC_WWW_STOP KC_WSTP KC_WWW_REFRESH KC_WREF KC_WWW_FAVORITES KC_WFAV +KC_BRIGHTNESS_UP KC_BRIU +KC_BRIGHTNESS_DOWN KC_BRID /* Mousekey */ KC_MS_UP KC_MS_U Mouse Cursor Up KC_MS_DOWN KC_MS_D Mouse Cursor Down diff --git a/docs/keycodes.md b/docs/keycodes.md index 1c5f46d6ecea..75b01389c5d1 100644 --- a/docs/keycodes.md +++ b/docs/keycodes.md @@ -203,6 +203,8 @@ This is a reference only. Each group of keys links to the page documenting their |`KC_WWW_FAVORITES` |`KC_WFAV` |Browser Favorites (Windows) | |`KC_MEDIA_FAST_FORWARD`|`KC_MFFD` |Next Track (macOS) | |`KC_MEDIA_REWIND` |`KC_MRWD` |Previous Track (macOS) | +|`KC_BRIGHTNESS_UP` |`KC_BRIU` |Brightness Up | +|`KC_BRIGHTNESS_DOWN` |`KC_BRID` |Brightness Down | ## [Quantum Keycodes](quantum_keycodes.md#qmk-keycodes) diff --git a/docs/keycodes_basic.md b/docs/keycodes_basic.md index ada9cc0e5a21..9cc00f03252d 100644 --- a/docs/keycodes_basic.md +++ b/docs/keycodes_basic.md @@ -219,6 +219,8 @@ Windows and macOS use different keycodes for "next track" and "previous track". |`KC_WWW_FAVORITES` |`KC_WFAV`|Browser Favorites (Windows) | |`KC_MEDIA_FAST_FORWARD`|`KC_MFFD`|Next Track (macOS) | |`KC_MEDIA_REWIND` |`KC_MRWD`|Previous Track (macOS) | +|`KC_BRIGHTNESS_UP` |`KC_BRIU`|Brightness Up | +|`KC_BRIGHTNESS_DOWN` |`KC_BRID`|Brightness Down | ## Number Pad diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 50af15d62696..f6c8b70d28b9 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c @@ -64,7 +64,7 @@ action_t action_for_key(uint8_t layer, keypos_t key) case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); break; - case KC_AUDIO_MUTE ... KC_MEDIA_REWIND: + case KC_AUDIO_MUTE ... KC_BRIGHTNESS_DOWN: action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); break; case KC_MS_UP ... KC_MS_ACCEL2: diff --git a/tmk_core/common/keycode.h b/tmk_core/common/keycode.h index 61642ae84fb3..d6fef2bebf0e 100644 --- a/tmk_core/common/keycode.h +++ b/tmk_core/common/keycode.h @@ -33,7 +33,7 @@ along with this program. If not, see . #define IS_SPECIAL(code) ((0xA5 <= (code) && (code) <= 0xDF) || (0xE8 <= (code) && (code) <= 0xFF)) #define IS_SYSTEM(code) (KC_PWR <= (code) && (code) <= KC_WAKE) -#define IS_CONSUMER(code) (KC_MUTE <= (code) && (code) <= KC_MRWD) +#define IS_CONSUMER(code) (KC_MUTE <= (code) && (code) <= KC_BRID) #define IS_FN(code) (KC_FN0 <= (code) && (code) <= KC_FN31) @@ -170,6 +170,8 @@ along with this program. If not, see . #define KC_WFAV KC_WWW_FAVORITES #define KC_MFFD KC_MEDIA_FAST_FORWARD #define KC_MRWD KC_MEDIA_REWIND +#define KC_BRIU KC_BRIGHTNESS_UP +#define KC_BRID KC_BRIGHTNESS_DOWN /* Mouse Keys */ #define KC_MS_U KC_MS_UP @@ -457,6 +459,8 @@ enum internal_special_keycodes { KC_WWW_FAVORITES, KC_MEDIA_FAST_FORWARD, KC_MEDIA_REWIND, + KC_BRIGHTNESS_UP, + KC_BRIGHTNESS_DOWN, /* Fn keys */ KC_FN0 = 0xC0, diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h index 5a1a6b19c7b4..eb9afb727e44 100644 --- a/tmk_core/common/report.h +++ b/tmk_core/common/report.h @@ -38,6 +38,7 @@ along with this program. If not, see . /* Consumer Page(0x0C) * following are supported by Windows: http://msdn.microsoft.com/en-us/windows/hardware/gg463372.aspx + * see also https://docs.microsoft.com/en-us/windows-hardware/drivers/hid/display-brightness-control */ #define AUDIO_MUTE 0x00E2 #define AUDIO_VOL_UP 0x00E9 @@ -47,6 +48,8 @@ along with this program. If not, see . #define TRANSPORT_STOP 0x00B7 #define TRANSPORT_STOP_EJECT 0x00CC #define TRANSPORT_PLAY_PAUSE 0x00CD +#define BRIGHTNESSUP 0x006F +#define BRIGHTNESSDOWN 0x0070 /* application launch */ #define AL_CC_CONFIG 0x0183 #define AL_EMAIL 0x018A @@ -189,7 +192,9 @@ typedef struct { (key == KC_WWW_FORWARD ? AC_FORWARD : \ (key == KC_WWW_STOP ? AC_STOP : \ (key == KC_WWW_REFRESH ? AC_REFRESH : \ - (key == KC_WWW_FAVORITES ? AC_BOOKMARKS : 0))))))))))))))))))))) + (key == KC_BRIGHTNESS_UP ? BRIGHTNESSUP : \ + (key == KC_BRIGHTNESS_DOWN ? BRIGHTNESSDOWN : \ + (key == KC_WWW_FAVORITES ? AC_BOOKMARKS : 0))))))))))))))))))))))) uint8_t has_anykey(report_keyboard_t* keyboard_report); uint8_t get_first_key(report_keyboard_t* keyboard_report); From fff6f22cf652aeb601ea4901399b70fb9a3f757c Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Wed, 28 Nov 2018 08:51:16 -0800 Subject: [PATCH 486/505] Keyboard: handwired/bluepill Configurator support and readme cleanup (#4509) * handwired/bluepill/bluepill70: Configurator support * handwired/bluepill: readme cleanup Formatting fixes to make the file easier to read. --- .../handwired/bluepill/bluepill70/info.json | 187 ++++++++++++++++++ keyboards/handwired/bluepill/readme.md | 20 +- 2 files changed, 197 insertions(+), 10 deletions(-) create mode 100644 keyboards/handwired/bluepill/bluepill70/info.json diff --git a/keyboards/handwired/bluepill/bluepill70/info.json b/keyboards/handwired/bluepill/bluepill70/info.json new file mode 100644 index 000000000000..3f08b50e5518 --- /dev/null +++ b/keyboards/handwired/bluepill/bluepill70/info.json @@ -0,0 +1,187 @@ +{ + "keyboard_name": "BluePill 70", + "url": "", + "maintainer": "qmk", + "width": 16, + "height": 6, + "layouts": { + "LAYOUT_seventy_ansi": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":1, "y":0}, + {"label":"F2", "x":2, "y":0}, + {"label":"F3", "x":3, "y":0}, + {"label":"F4", "x":4, "y":0}, + {"label":"F5", "x":5, "y":0}, + {"label":"F6", "x":6, "y":0}, + {"label":"F7", "x":7, "y":0}, + {"label":"F8", "x":8, "y":0}, + {"label":"F9", "x":9, "y":0}, + {"label":"F10", "x":10, "y":0}, + {"label":"F11", "x":11, "y":0}, + {"label":"F12", "x":12, "y":0}, + {"label":"Print Screen", "x":13, "y":0}, + {"label":"Home", "x":14, "y":0}, + {"label":"End", "x":15, "y":0}, + {"label":"`", "x":0, "y":1}, + {"label":"1", "x":1, "y":1}, + {"label":"2", "x":2, "y":1}, + {"label":"3", "x":3, "y":1}, + {"label":"4", "x":4, "y":1}, + {"label":"5", "x":5, "y":1}, + {"label":"6", "x":6, "y":1}, + {"label":"7", "x":7, "y":1}, + {"label":"8", "x":8, "y":1}, + {"label":"9", "x":9, "y":1}, + {"label":"0", "x":10, "y":1}, + {"label":"-", "x":11, "y":1}, + {"label":"=", "x":12, "y":1}, + {"label":"Backspace", "x":13, "y":1, "w":2}, + {"label":"Delete", "x":15, "y":1}, + {"label":"Tab", "x":0, "y":2, "w":1.5}, + {"label":"Q", "x":1.5, "y":2}, + {"label":"W", "x":2.5, "y":2}, + {"label":"E", "x":3.5, "y":2}, + {"label":"R", "x":4.5, "y":2}, + {"label":"T", "x":5.5, "y":2}, + {"label":"Y", "x":6.5, "y":2}, + {"label":"U", "x":7.5, "y":2}, + {"label":"I", "x":8.5, "y":2}, + {"label":"O", "x":9.5, "y":2}, + {"label":"P", "x":10.5, "y":2}, + {"label":"[", "x":11.5, "y":2}, + {"label":"]", "x":12.5, "y":2}, + {"label":"Page Up", "x":15, "y":2}, + {"label":"Caps Lock", "x":0, "y":3, "w":1.75}, + {"label":"A", "x":1.75, "y":3}, + {"label":"S", "x":2.75, "y":3}, + {"label":"D", "x":3.75, "y":3}, + {"label":"F", "x":4.75, "y":3}, + {"label":"G", "x":5.75, "y":3}, + {"label":"H", "x":6.75, "y":3}, + {"label":"J", "x":7.75, "y":3}, + {"label":"K", "x":8.75, "y":3}, + {"label":"L", "x":9.75, "y":3}, + {"label":";", "x":10.75, "y":3}, + {"label":"'", "x":11.75, "y":3}, + {"label":"Enter", "x":12.75, "y":3, "w":2.25}, + {"label":"\\", "x":13.5, "y":2, "w":1.5}, + {"label":"Page Down", "x":15, "y":3}, + {"label":"Shift", "x":0, "y":4, "w":1.25}, + {"label":"ISO \\", "x":1.25, "y":4}, + {"label":"Z", "x":2.25, "y":4}, + {"label":"X", "x":3.25, "y":4}, + {"label":"C", "x":4.25, "y":4}, + {"label":"V", "x":5.25, "y":4}, + {"label":"B", "x":6.25, "y":4}, + {"label":"N", "x":7.25, "y":4}, + {"label":"M", "x":8.25, "y":4}, + {"label":",", "x":9.25, "y":4}, + {"label":".", "x":10.25, "y":4}, + {"label":"/", "x":11.25, "y":4}, + {"label":"Shift", "x":12.25, "y":4, "w":1.75}, + {"label":"Up", "x":14, "y":4}, + {"label":"TT(2)", "x":15, "y":4}, + {"label":"Ctrl", "x":0, "y":5, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5, "w":6.25}, + {"label":"Alt", "x":10, "y":5}, + {"label":"Fn", "x":11, "y":5}, + {"label":"Ctrl", "x":12, "y":5}, + {"label":"Left", "x":13, "y":5}, + {"label":"Down", "x":14, "y":5}, + {"label":"Right", "x":15, "y":5} + ] + }, + "LAYOUT_seventy_iso": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":1, "y":0}, + {"label":"F2", "x":2, "y":0}, + {"label":"F3", "x":3, "y":0}, + {"label":"F4", "x":4, "y":0}, + {"label":"F5", "x":5, "y":0}, + {"label":"F6", "x":6, "y":0}, + {"label":"F7", "x":7, "y":0}, + {"label":"F8", "x":8, "y":0}, + {"label":"F9", "x":9, "y":0}, + {"label":"F10", "x":10, "y":0}, + {"label":"F11", "x":11, "y":0}, + {"label":"F12", "x":12, "y":0}, + {"label":"Print Screen", "x":13, "y":0}, + {"label":"Home", "x":14, "y":0}, + {"label":"End", "x":15, "y":0}, + {"label":"`", "x":0, "y":1}, + {"label":"1", "x":1, "y":1}, + {"label":"2", "x":2, "y":1}, + {"label":"3", "x":3, "y":1}, + {"label":"4", "x":4, "y":1}, + {"label":"5", "x":5, "y":1}, + {"label":"6", "x":6, "y":1}, + {"label":"7", "x":7, "y":1}, + {"label":"8", "x":8, "y":1}, + {"label":"9", "x":9, "y":1}, + {"label":"0", "x":10, "y":1}, + {"label":"-", "x":11, "y":1}, + {"label":"=", "x":12, "y":1}, + {"label":"Backspace", "x":13, "y":1, "w":2}, + {"label":"Delete", "x":15, "y":1}, + {"label":"Tab", "x":0, "y":2, "w":1.5}, + {"label":"Q", "x":1.5, "y":2}, + {"label":"W", "x":2.5, "y":2}, + {"label":"E", "x":3.5, "y":2}, + {"label":"R", "x":4.5, "y":2}, + {"label":"T", "x":5.5, "y":2}, + {"label":"Y", "x":6.5, "y":2}, + {"label":"U", "x":7.5, "y":2}, + {"label":"I", "x":8.5, "y":2}, + {"label":"O", "x":9.5, "y":2}, + {"label":"P", "x":10.5, "y":2}, + {"label":"[", "x":11.5, "y":2}, + {"label":"]", "x":12.5, "y":2}, + {"label":"Page Up", "x":15, "y":2}, + {"label":"Caps Lock", "x":0, "y":3, "w":1.75}, + {"label":"A", "x":1.75, "y":3}, + {"label":"S", "x":2.75, "y":3}, + {"label":"D", "x":3.75, "y":3}, + {"label":"F", "x":4.75, "y":3}, + {"label":"G", "x":5.75, "y":3}, + {"label":"H", "x":6.75, "y":3}, + {"label":"J", "x":7.75, "y":3}, + {"label":"K", "x":8.75, "y":3}, + {"label":"L", "x":9.75, "y":3}, + {"label":";", "x":10.75, "y":3}, + {"label":",", "x":11.75, "y":3}, + {"label":"ISO #", "x":12.75, "y":3}, + {"label":"Enter", "x":13.75, "y":2, "w":1.25, "h":2}, + {"label":"Page Down", "x":15, "y":3}, + {"label":"Shift", "x":0, "y":4, "w":1.25}, + {"label":"ISO \\", "x":1.25, "y":4}, + {"label":"Z", "x":2.25, "y":4}, + {"label":"X", "x":3.25, "y":4}, + {"label":"C", "x":4.25, "y":4}, + {"label":"V", "x":5.25, "y":4}, + {"label":"B", "x":6.25, "y":4}, + {"label":"N", "x":7.25, "y":4}, + {"label":"M", "x":8.25, "y":4}, + {"label":",", "x":9.25, "y":4}, + {"label":".", "x":10.25, "y":4}, + {"label":"/", "x":11.25, "y":4}, + {"label":"Shift", "x":12.25, "y":4, "w":1.75}, + {"label":"Up", "x":14, "y":4}, + {"label":"TT(2)", "x":15, "y":4}, + {"label":"Ctrl", "x":0, "y":5, "w":1.25}, + {"label":"GUI", "x":1.25, "y":5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5, "w":1.25}, + {"label":"Space", "x":3.75, "y":5, "w":6.25}, + {"label":"Alt", "x":10, "y":5}, + {"label":"Fn", "x":11, "y":5}, + {"label":"Ctrl", "x":12, "y":5}, + {"label":"Left", "x":13, "y":5}, + {"label":"Down", "x":14, "y":5}, + {"label":"Right", "x":15, "y":5} + ] + } + } +} diff --git a/keyboards/handwired/bluepill/readme.md b/keyboards/handwired/bluepill/readme.md index 8b53f12f46e4..b8ca96992cf1 100644 --- a/keyboards/handwired/bluepill/readme.md +++ b/keyboards/handwired/bluepill/readme.md @@ -3,15 +3,15 @@ Keyboards using a BluePill controller (generic Chinese STM32F103C8T6) and based on the [KC64 of Xydane](https://github.com/Xydane/qmk_firmware). -Keyboard Maintainer: [FPazos](https://github.com/fpazos), but I hope to leave the project in better hands. -Hardware Supported: Bluepill STM32F103C8T6 +Keyboard Maintainer: [FPazos](https://github.com/fpazos), but I hope to leave the project in better hands. +Hardware Supported: Bluepill STM32F103C8T6 Hardware Availability: Everywhere Make example for BluePill70 (after setting up your build environment): -make handwired/bluepill/bluepill70:default + make handwired/bluepill/bluepill70:default -See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). Read everything before using it. @@ -47,14 +47,14 @@ That's the pinout; A4 LCT| WIN| ALT| ESPACE | ALG| FN | RCT| LEF| DOW| RIG And the wiring: -ISO +ISO ![Wiring](https://i.imgur.com/ZCaxVzs.jpg) -ANSI +ANSI ![Wiring](https://i.imgur.com/dBUJCdD.jpg) -It also uses: +It also uses: PC13: Caps Lock led. -Backlight dual color leds, my version is for common anode that's more common, for leds with common anode just replace the palSetPad with palClearPad and viceversa. -PA1: Backlight color A. -PA0: Backlight color B. \ No newline at end of file +Backlight dual color leds, my version is for common anode that's more common, for leds with common anode just replace the palSetPad with palClearPad and viceversa. +PA1: Backlight color A. +PA0: Backlight color B. From 87e6d0137484fdc8e076eb79dbbed47836eba2c5 Mon Sep 17 00:00:00 2001 From: GO <44800276+GoTakigawa@users.noreply.github.com> Date: Thu, 29 Nov 2018 02:20:46 +0900 Subject: [PATCH 487/505] Keyboard: add newgame (#4466) * Add files via upload * Add files via upload * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/newgame40.h Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/config.h Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/config.h Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/config.h Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/config.h Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/config.h Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/keymaps/default/keymap.c Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/config.h Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/rules.mk Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/rules.mk Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Add readme (newgame40) * Update keyboards/newgame40/readme.md Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keyboards/newgame40/readme.md Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Update keymap.c * Update keyboards/newgame40/rules.mk Co-Authored-By: GoTakigawa <44800276+GoTakigawa@users.noreply.github.com> * Add files via upload * remove community/ortho_4x10 --- keyboards/newgame40/config.h | 75 +++++++ keyboards/newgame40/info.json | 13 ++ keyboards/newgame40/keymaps/default/config.h | 5 + keyboards/newgame40/keymaps/default/keymap.c | 208 ++++++++++++++++++ keyboards/newgame40/newgame40.c | 5 + keyboards/newgame40/newgame40.h | 19 ++ keyboards/newgame40/readme.md | 17 ++ keyboards/newgame40/rules.mk | 74 +++++++ .../ortho_4x10/default_ortho_4x10/keymap.c | 10 + layouts/default/ortho_4x10/layout.json | 4 + layouts/default/ortho_4x10/readme.md | 3 + 11 files changed, 433 insertions(+) create mode 100644 keyboards/newgame40/config.h create mode 100644 keyboards/newgame40/info.json create mode 100644 keyboards/newgame40/keymaps/default/config.h create mode 100644 keyboards/newgame40/keymaps/default/keymap.c create mode 100644 keyboards/newgame40/newgame40.c create mode 100644 keyboards/newgame40/newgame40.h create mode 100644 keyboards/newgame40/readme.md create mode 100644 keyboards/newgame40/rules.mk create mode 100644 layouts/default/ortho_4x10/default_ortho_4x10/keymap.c create mode 100644 layouts/default/ortho_4x10/layout.json create mode 100644 layouts/default/ortho_4x10/readme.md diff --git a/keyboards/newgame40/config.h b/keyboards/newgame40/config.h new file mode 100644 index 000000000000..01c9142f7719 --- /dev/null +++ b/keyboards/newgame40/config.h @@ -0,0 +1,75 @@ +/* +Copyright 2018 Go Takigawa + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER GoTakigawa +#define PRODUCT NEWGAME40 +#define DESCRIPTION 4x10key keyboard + +/* key matrix size */ +#define MATRIX_ROWS 4 +#define MATRIX_COLS 10 + +/* pin-out */ +#define MATRIX_ROW_PINS { F7, B1, B3, B2 } +#define MATRIX_COL_PINS { D3, D2, D1, D0, D4, C6, D7, E6, B4, B5 } +#define UNUSED_PINS + +/* ws2812 RGB LED */ +#define RGB_DI_PIN F6 +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 25 // Number of LEDs +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 + +#ifndef IOS_DEVICE_ENABLE + #if RGBLED_NUM <= 6 + #define RGBLIGHT_LIMIT_VAL 255 + #else + #define RGBLIGHT_LIMIT_VAL 130 + #endif + #define RGBLIGHT_VAL_STEP 17 +#else + #if RGBLED_NUM <= 6 + #define RGBLIGHT_LIMIT_VAL 90 + #else + #define RGBLIGHT_LIMIT_VAL 45 + #endif + #define RGBLIGHT_VAL_STEP 4 +#endif +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 + +#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE) + #define USB_MAX_POWER_CONSUMPTION 400 +#else + // fix iPhone and iPad power adapter issue + // iOS device need lessthan 100 + #define USB_MAX_POWER_CONSUMPTION 100 +#endif +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +#define TAPPING_TERM 200 + diff --git a/keyboards/newgame40/info.json b/keyboards/newgame40/info.json new file mode 100644 index 000000000000..0239614082b9 --- /dev/null +++ b/keyboards/newgame40/info.json @@ -0,0 +1,13 @@ +{ + "keyboard_name": "NEWGAME40", + "url": "", + "maintainer": "qmk", + "width": 10, + "height": 4, + "layouts": { + "LAYOUT_ortho_4x10": { + "key_count": 40, + "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":2}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":3, "y":3}, {"x":4, "y":3}, {"x":5, "y":3}, {"x":6, "y":3}, {"x":7, "y":3}, {"x":8, "y":3}, {"x":9, "y":3}] + } + } +} diff --git a/keyboards/newgame40/keymaps/default/config.h b/keyboards/newgame40/keymaps/default/config.h new file mode 100644 index 000000000000..d533d806c90c --- /dev/null +++ b/keyboards/newgame40/keymaps/default/config.h @@ -0,0 +1,5 @@ + + +#pragma once + +// place overrides here diff --git a/keyboards/newgame40/keymaps/default/keymap.c b/keyboards/newgame40/keymaps/default/keymap.c new file mode 100644 index 000000000000..b42fef00fe03 --- /dev/null +++ b/keyboards/newgame40/keymaps/default/keymap.c @@ -0,0 +1,208 @@ +/* Copyright 2018 GoTakigawa + * + * 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 QMK_KEYBOARD_H + + extern keymap_config_t keymap_config; + +enum layers { + _QWERTY, + _COLEMAK, + _DVORAK, + _EUCALYN, + _LOWER, + _RAISE, + _ADJUST, +}; + + enum custom_keycodes { + QWERTY = SAFE_RANGE, + COLEMAK, + DVORAK, + LOWER, + RAISE, + EUCALYN, + ADJUST, + }; + + // Fillers to make layering more clear + #define LOWER MO(_LOWER) + #define RAISE MO(_RAISE) + + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + /* Qwerty + * ,---------------------------------------------------------------------. + * | Q | W | E | R | T | Y | U | I | O | P | + * |------+------+------+------+------+------|------+------+------+------| + * | A | S | D | F | G | H | J | K | L | - | + * |------+------+------+------+------+------+-------------+------+------| + * | Z | X | C | V | B | N | M | , | . | / | + * |-------------+------+------+------+------+------+------+------+------' + * |Shift | GUI |Lower | Ctrl |Space | Bksp |Enter |Raise | Left |Right | + * `---------------------------------------------------------------------' + */ + [_QWERTY] = LAYOUT_ortho_4x10( \ + 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_MINS, \ + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, \ + KC_LSFT, KC_LGUI, LT(_LOWER,KC_LANG2), KC_LCTL, KC_SPC, KC_BSPC, KC_ENT, LT(_RAISE,KC_LANG1), KC_LEFT, KC_RGHT\ + ), + + /* Colemak + * ,---------------------------------------------------------------------. + * | Q | W | F | P | G | J | L | U | Y | - | + * |------+------+------+------+------+------|------+------+------+------| + * | A | R | S | T | D | H | N | E | I | O | + * |------+------+------+------+------+------+-------------+------+------| + * | Z | X | C | V | B | K | M | , | . | / | + * |-------------+------+------+------+------+------+------+------+------' + * |Shift | GUI |Lower | Ctrl |Space | Bksp |Enter |Raise | Left |Right | + * `---------------------------------------------------------------------' + */ + [_COLEMAK] = LAYOUT_ortho_4x10( \ + KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_MINS, \ + KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, \ + KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, \ + KC_LSFT, KC_LGUI, LT(_LOWER,KC_LANG2), KC_LCTL, KC_SPC, KC_BSPC, KC_ENT, LT(_RAISE,KC_LANG1), KC_LEFT, KC_RGHT\ + ), + + /* Dvorak + * ,---------------------------------------------------------------------. + * | " | , | . | P | Y | F | G | C | R | L | + * |------+------+------+------+------+------|------+------+------+------| + * | A | O | E | U | I | D | H | T | N | S | + * |------+------+------+------+------+------+-------------+------+------| + * | ; | Q | J | K | X | B | M | W | V | Z | + * |-------------+------+------+------+------+------+------+------+------' + * |Shift | GUI |Lower | Ctrl |Space | Bksp |Enter |Raise | Left |Right | + * `---------------------------------------------------------------------' + */ + [_DVORAK] = LAYOUT_ortho_4x10( \ + KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, \ + KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, \ + KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, \ + KC_LSFT, KC_LGUI, LT(_LOWER,KC_LANG2), KC_LCTL, KC_SPC, KC_BSPC, KC_ENT, LT(_RAISE,KC_LANG1), KC_LEFT, KC_RGHT\ + ), + + /* Lower + * ,---------------------------------------------------------------------. + * | Esc | | | | | | | | | | + * |------+------+------+------+------+------|------+------+------+------| + * | | | | | | | | | | | + * |------+------+------+------+------+------+-------------+------+------| + * | F13 | F14 | F15 | F16 | F17 | F18 | F19 | F20 | F21 | F22 | + * |-------------+------+------+------+------+------+------+------+------' + * | F1 | F2 | | F3 | F4 | F5 | F6 | | F7 | F8 | + * `---------------------------------------------------------------------' + */ + [_LOWER] = LAYOUT_ortho_4x10( \ + KC_ESC, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ + KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, \ + KC_F1, KC_F2, _______, KC_F3, KC_F4, KC_F5, KC_F6, _______, KC_F7, KC_F8 \ + ), + + /* Raise + * ,---------------------------------------------------------------------. + * | 1 | 2 |  3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | + * |------+------+------+------+------+------|------+------+------+------| + * | ! | " | # | $ | % | & | ' | (  | ) | _ | + * |------+------+------+------+------+------+-------------+------+------| + * | = | ¥ | { | } | * | ~ | | | < | > | ? | + * |-------------+------+------+------+------+------+------+------+------' + * | F1 | Alt | | [ | ] | ; | : | | \ | / | + * `---------------------------------------------------------------------' + */ + [_RAISE] = LAYOUT_ortho_4x10( \ + KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \ + KC_EXLM, KC_DQT, KC_HASH, KC_DLR, KC_PERC, KC_AMPR, KC_QUOT, KC_LPRN, KC_RPRN, KC_UNDS, \ + KC_EQL, KC_JYEN, KC_LCBR, KC_RCBR, KC_ASTR, KC_TILD, KC_PIPE, KC_LABK, KC_RABK, KC_QUES, \ + KC_F1, KC_LALT, _______, KC_LBRC, KC_RBRC, KC_SCLN, KC_COLN, _______, KC_BSLS, KC_SLSH \ + ), + + /* EUCALYN + * ,---------------------------------------------------------------------. + * | Q | W | , | . | ; | M | R | D | Y | P | + * |------+------+------+------+------+------|------+------+------+------| + * | A | O | E | I | U | G | T | K | S | N | + * |------+------+------+------+------+------+-------------+------+------| + * | Z | X | C | V | F | B | H | J | L | / | + * `-------------+------+------+------+------+------+------+-------------' + * |Shift | GUI |Lower | Ctrl |Space | Bksp |Enter |Raise | Left |Right | + * `---------------------------------------------------------------------' + */ + [_EUCALYN] = LAYOUT_ortho_4x10( \ + KC_Q, KC_W, KC_COMM, KC_DOT, KC_SCLN, KC_M, KC_R, KC_D, KC_Y, KC_P, \ + KC_A, KC_O, KC_E, KC_I, KC_U, KC_G, KC_T, KC_K, KC_S, KC_N, \ + KC_Z, KC_X, KC_C, KC_V, KC_F, KC_B, KC_H, KC_J, KC_L, KC_SLSH, \ + KC_LSFT, KC_LGUI, LT(_LOWER,KC_LANG2), KC_LCTL, KC_SPC, KC_BSPC, KC_ENT, LT(_RAISE,KC_LANG1), KC_LEFT, KC_RGHT\ + ), + + /* Adjust (Lower + Raise) + * ,---------------------------------------------------------------------. + * | |RGB Tg|RGB Md|Hue Up|Hue Dn|Sat Up|Sat Dn|Val Up|Val Dn| | + * |------+------+------+------+------+------.------+------+------+------| + * | | | |Aud on|Audoff|AGnorm|AGswap| |BL TOG|BL STP| + * |------+------+------+------+------+------+------+------+------+------| + * |Qwerty|Colemk|Dvorak|Eucalyn| | | | | | | + * |------+------+------+------+------+------+------+------+------+------| + * | | | | | | | | | | | + * `---------------------------------------------------------------------' + */ + [_ADJUST] = LAYOUT_ortho_4x10( \ + _______, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, \ + _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, _______, BL_TOGG, BL_STEP, \ + QWERTY, COLEMAK, DVORAK, EUCALYN, _______, _______, _______, _______, _______, _______, \ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + ) + + + }; + + uint32_t layer_state_set_user(uint32_t state) { + return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); + } + + bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case COLEMAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_COLEMAK); + } + return false; + break; + case DVORAK: + if (record->event.pressed) { + set_single_persistent_default_layer(_DVORAK); + } + return false; + break; + case EUCALYN: + if (record->event.pressed) { + set_single_persistent_default_layer(_EUCALYN); + } + return false; + break; + } + return true; + } diff --git a/keyboards/newgame40/newgame40.c b/keyboards/newgame40/newgame40.c new file mode 100644 index 000000000000..e55b25b3d0d7 --- /dev/null +++ b/keyboards/newgame40/newgame40.c @@ -0,0 +1,5 @@ +#include "newgame40.h" + +void matrix_init_kb(void) { + matrix_init_user(); +} diff --git a/keyboards/newgame40/newgame40.h b/keyboards/newgame40/newgame40.h new file mode 100644 index 000000000000..6044f3765747 --- /dev/null +++ b/keyboards/newgame40/newgame40.h @@ -0,0 +1,19 @@ +#ifndef NEWGAME40_H +#define NEWGAME40_H + +#include "quantum.h" + +#define LAYOUT_ortho_4x10( \ + k101, k102, k103, k104, k105, k106, k107, k108, k109, k110, \ + k201, k202, k203, k204, k205, k206, k207, k208, k209, k210, \ + k301, k302, k303, k304, k305, k306, k307, k308, k309, k310, \ + k401, k402, k403, k404, k405, k406, k407, k408, k409, k410 \ +) \ +{ \ + {k101, k102, k103, k104, k105, k106, k107, k108, k109, k110}, \ + {k201, k202, k203, k204, k205, k206, k207, k208, k209, k210}, \ + {k301, k302, k303, k304, k305, k306, k307, k308, k309, k310}, \ + {k401, k402, k403, k404, k405, k406, k407, k408, k409, k410} \ +} + +#endif diff --git a/keyboards/newgame40/readme.md b/keyboards/newgame40/readme.md new file mode 100644 index 000000000000..2aa568cfb09a --- /dev/null +++ b/keyboards/newgame40/readme.md @@ -0,0 +1,17 @@ +# NEWGAME40 + +![NEWGAME40](https://i.imgur.com/HtujXda.jpg) + +40% (4x10) ortholinear keyboard. + +Keyboard Maintainer: +[GoTakigawa](https://github.com/GoTakigawa) +[@Go_Drums](https://twitter.com/Go_Drums) +Hardware Supported: The NEWGAME40 PCBs, ProMicro supported +Hardware Availability: Group buy soon + +Make example for this keyboard (after setting up your build environment): + + make newgame40:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/newgame40/rules.mk b/keyboards/newgame40/rules.mk new file mode 100644 index 000000000000..cca40ce8e2cf --- /dev/null +++ b/keyboards/newgame40/rules.mk @@ -0,0 +1,74 @@ +# 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 +BOOTLOADER = caterina + +# 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 = lite # 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 = yes # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. +IOS_DEVICE_ENABLE = no # connect to IOS Device + + ifeq ($(strip $(IOS_DEVICE_ENABLE )), yes) + OPT_DEFS += -DIOS_DEVICE_ENABLE + endif + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +LAYOUTS = ortho_4x10 diff --git a/layouts/default/ortho_4x10/default_ortho_4x10/keymap.c b/layouts/default/ortho_4x10/default_ortho_4x10/keymap.c new file mode 100644 index 000000000000..3f6285e2ddbf --- /dev/null +++ b/layouts/default/ortho_4x10/default_ortho_4x10/keymap.c @@ -0,0 +1,10 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_ortho_4x10( + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, + KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J + ) +}; diff --git a/layouts/default/ortho_4x10/layout.json b/layouts/default/ortho_4x10/layout.json new file mode 100644 index 000000000000..86f098e27eb6 --- /dev/null +++ b/layouts/default/ortho_4x10/layout.json @@ -0,0 +1,4 @@ +["","","","","","","","","",""], +["","","","","","","","","",""], +["","","","","","","","","",""], +["","","","","","","","","",""] diff --git a/layouts/default/ortho_4x10/readme.md b/layouts/default/ortho_4x10/readme.md new file mode 100644 index 000000000000..c5c29251c812 --- /dev/null +++ b/layouts/default/ortho_4x10/readme.md @@ -0,0 +1,3 @@ +# ortho_4x10 + + LAYOUT_ortho_4x10 From fbf59ba2e5a4ccd8842d044f7ffa75e91e1894cb Mon Sep 17 00:00:00 2001 From: Paul Massendari Date: Thu, 29 Nov 2018 16:33:45 +0100 Subject: [PATCH 488/505] Typo fix (#4515) --- docs/feature_unicode.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/feature_unicode.md b/docs/feature_unicode.md index b1527b848ae5..c98a4022877f 100644 --- a/docs/feature_unicode.md +++ b/docs/feature_unicode.md @@ -30,7 +30,7 @@ Make sure that the order for both matches. ## UCIS_ENABLE -Supports Unicode up to 0xFFFFFFFF. As with `UNICODE_MAP`, you may want to main a mapping table in your keymap file. However, there is no keycodes for this feature, you will have to add a keycode or function to call `qk_ucis_start()`. Once you've run that, you can just type the text for your unicode, and then hit space or enter to complete it, or ESC to cancel it. And if it matches an entry in your table, it will automatically "backspace" the trigger word (from your table) and then will input the unicode sequence. +Supports Unicode up to 0xFFFFFFFF. As with `UNICODE_MAP`, you may want to maintain a mapping table in your keymap file. However, there is no keycodes for this feature, you will have to add a keycode or function to call `qk_ucis_start()`. Once you've run that, you can just type the text for your unicode, and then hit space or enter to complete it, or ESC to cancel it. And if it matches an entry in your table, it will automatically "backspace" the trigger word (from your table) and then will input the unicode sequence. For instance, you would need to have a table like this in your keymap: From 81ce35c10a89214a586773e013e647eeb701fee5 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Thu, 29 Nov 2018 07:57:06 -0800 Subject: [PATCH 489/505] New Keyboard: Cyclops (#4512) * initial commit * add correct atmega32u4 pins used * add a basic layout * add simple keymap * update readme * Add QMK Configurator support * add whitespace for formatting --- keyboards/cyclops/config.h | 214 ++++++++++++++++++++ keyboards/cyclops/cyclops.c | 43 ++++ keyboards/cyclops/cyclops.h | 43 ++++ keyboards/cyclops/info.json | 12 ++ keyboards/cyclops/keymaps/default/config.h | 19 ++ keyboards/cyclops/keymaps/default/keymap.c | 65 ++++++ keyboards/cyclops/keymaps/default/readme.md | 1 + keyboards/cyclops/readme.md | 13 ++ keyboards/cyclops/rules.mk | 80 ++++++++ 9 files changed, 490 insertions(+) create mode 100644 keyboards/cyclops/config.h create mode 100644 keyboards/cyclops/cyclops.c create mode 100644 keyboards/cyclops/cyclops.h create mode 100644 keyboards/cyclops/info.json create mode 100644 keyboards/cyclops/keymaps/default/config.h create mode 100644 keyboards/cyclops/keymaps/default/keymap.c create mode 100644 keyboards/cyclops/keymaps/default/readme.md create mode 100644 keyboards/cyclops/readme.md create mode 100644 keyboards/cyclops/rules.mk diff --git a/keyboards/cyclops/config.h b/keyboards/cyclops/config.h new file mode 100644 index 000000000000..d6b637345e52 --- /dev/null +++ b/keyboards/cyclops/config.h @@ -0,0 +1,214 @@ +/* +Copyright 2018 'mechmerlin' + +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 + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0000 +#define DEVICE_VER 0x0001 +#define MANUFACTURER You +#define PRODUCT cyclops +#define DESCRIPTION A custom 66% keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 15 + +/* + * 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 { D1, D0, D7, B4, F0 } +#define MATRIX_COL_PINS { D3, D2, D5, D6, B6, B1, B2, B3, C6, C7, F7, F6, F4, F5, F1 } +#define UNUSED_PINS + +/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */ +#define DIODE_DIRECTION COL2ROW + +/* 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 + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + +/* + * 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 + +/* + * 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 1 + +/* + * HD44780 LCD Display Configuration + */ +/* +#define LCD_LINES 2 //< number of visible lines of the display +#define LCD_DISP_LENGTH 16 //< visibles characters per line of the display + +#define LCD_IO_MODE 1 //< 0: memory mapped mode, 1: IO port mode + +#if LCD_IO_MODE +#define LCD_PORT PORTB //< port for the LCD lines +#define LCD_DATA0_PORT LCD_PORT //< port for 4bit data bit 0 +#define LCD_DATA1_PORT LCD_PORT //< port for 4bit data bit 1 +#define LCD_DATA2_PORT LCD_PORT //< port for 4bit data bit 2 +#define LCD_DATA3_PORT LCD_PORT //< port for 4bit data bit 3 +#define LCD_DATA0_PIN 4 //< pin for 4bit data bit 0 +#define LCD_DATA1_PIN 5 //< pin for 4bit data bit 1 +#define LCD_DATA2_PIN 6 //< pin for 4bit data bit 2 +#define LCD_DATA3_PIN 7 //< pin for 4bit data bit 3 +#define LCD_RS_PORT LCD_PORT //< port for RS line +#define LCD_RS_PIN 3 //< pin for RS line +#define LCD_RW_PORT LCD_PORT //< port for RW line +#define LCD_RW_PIN 2 //< pin for RW line +#define LCD_E_PORT LCD_PORT //< port for Enable line +#define LCD_E_PIN 1 //< pin for Enable line +#endif +*/ + +/* Bootmagic Lite key configuration */ +// #define BOOTMAGIC_LITE_ROW 0 +// #define BOOTMAGIC_LITE_COLUMN 0 diff --git a/keyboards/cyclops/cyclops.c b/keyboards/cyclops/cyclops.c new file mode 100644 index 000000000000..8a15e8950e2d --- /dev/null +++ b/keyboards/cyclops/cyclops.c @@ -0,0 +1,43 @@ +/* Copyright 2018 'mechmerlin' + * + * 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 "cyclops.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/cyclops/cyclops.h b/keyboards/cyclops/cyclops.h new file mode 100644 index 000000000000..d85b4e9031cc --- /dev/null +++ b/keyboards/cyclops/cyclops.h @@ -0,0 +1,43 @@ +/* Copyright 2018 'mechmerlin' + * + * 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 CYCLOPS_H +#define CYCLOPS_H + +#include "quantum.h" + +/* This a shortcut to help you visually see your layout. + * + * The first section contains all of the arguments representing the physical + * layout of the board and position of the keys. + * + * The second converts the arguments into a two-dimensional array which + * represents the switch matrix. + */ +#define LAYOUT( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \ + K10, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \ + K20, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \ + K40, K41, K42, K46, K4A, K4B, K4C, K4D, K4E \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \ + { K10, KC_NO, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \ + { K20, KC_NO, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \ + { K40, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D, K4E } \ +} + +#endif diff --git a/keyboards/cyclops/info.json b/keyboards/cyclops/info.json new file mode 100644 index 000000000000..e0e91222bc20 --- /dev/null +++ b/keyboards/cyclops/info.json @@ -0,0 +1,12 @@ +{ + "keyboard_name": "cyclops", + "url": "", + "maintainer": "qmk", + "width": 16.5, + "height": 5, + "layouts": { + "LAYOUT": { + "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Page Up", "x":15.5, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Page Down", "x":15.5, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Shift", "x":0, "y":3, "w":1.5}, {"label":"|", "x":1.5, "y":3}, {"label":"Z", "x":2.5, "y":3}, {"label":"X", "x":3.5, "y":3}, {"label":"C", "x":4.5, "y":3}, {"label":"V", "x":5.5, "y":3}, {"label":"B", "x":6.5, "y":3}, {"label":"N", "x":7.5, "y":3}, {"label":"M", "x":8.5, "y":3}, {"label":"<", "x":9.5, "y":3}, {"label":">", "x":10.5, "y":3}, {"label":"?", "x":11.5, "y":3}, {"x":12.5, "y":3}, {"label":"Shift", "x":13.5, "y":3}, {"label":"\u2191", "x":14.5, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.5}, {"label":"Win", "x":1.5, "y":4, "w":1.25}, {"label":"Alt", "x":2.75, "y":4, "w":1.5}, {"x":4.25, "y":4, "w":6.5}, {"label":"Alt", "x":10.75, "y":4, "w":1.5}, {"label":"Ctrl", "x":12.25, "y":4, "w":1.25}, {"label":"\u2190", "x":13.5, "y":4}, {"label":"\u2193", "x":14.5, "y":4}, {"label":"\u2192", "x":15.5, "y":4}] + } + } +} diff --git a/keyboards/cyclops/keymaps/default/config.h b/keyboards/cyclops/keymaps/default/config.h new file mode 100644 index 000000000000..6278fae65853 --- /dev/null +++ b/keyboards/cyclops/keymaps/default/config.h @@ -0,0 +1,19 @@ +/* Copyright 2018 'mechmerlin' + * + * 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 + +// place overrides here diff --git a/keyboards/cyclops/keymaps/default/keymap.c b/keyboards/cyclops/keymaps/default/keymap.c new file mode 100644 index 000000000000..875fbe244f24 --- /dev/null +++ b/keyboards/cyclops/keymaps/default/keymap.c @@ -0,0 +1,65 @@ +/* Copyright 2018 'mechmerlin' + * + * 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 QMK_KEYBOARD_H + +// Defines the keycodes used by our macros in process_record_user +enum custom_keycodes { + QMKBEST = SAFE_RANGE, + QMKURL +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT( + 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_PGUP, + 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_PGDN, + 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_NUHS, KC_RGHT, + KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(1), KC_0, KC_UP, + KC_CAPS, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_ENT, KC_DOWN), +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QMKBEST: + if (record->event.pressed) { + // when keycode QMKBEST is pressed + SEND_STRING("QMK is the best thing ever!"); + } else { + // when keycode QMKBEST is released + } + break; + case QMKURL: + if (record->event.pressed) { + // when keycode QMKURL is pressed + SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER)); + } else { + // when keycode QMKURL is released + } + break; + } + return true; +} + +void matrix_init_user(void) { + +} + +void matrix_scan_user(void) { + +} + +void led_set_user(uint8_t usb_led) { + +} diff --git a/keyboards/cyclops/keymaps/default/readme.md b/keyboards/cyclops/keymaps/default/readme.md new file mode 100644 index 000000000000..b1e2b84a3bff --- /dev/null +++ b/keyboards/cyclops/keymaps/default/readme.md @@ -0,0 +1 @@ +# The default keymap for cyclops diff --git a/keyboards/cyclops/readme.md b/keyboards/cyclops/readme.md new file mode 100644 index 000000000000..fcf6c1546675 --- /dev/null +++ b/keyboards/cyclops/readme.md @@ -0,0 +1,13 @@ +# Cyclops + +66% Alps Keyboard in ISO layout. + +Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin) +Hardware Supported: 66% Alps Keyboard +Hardware Availability: A very limited number were made. + +Make example for this keyboard (after setting up your build environment): + + make cyclops:default + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/cyclops/rules.mk b/keyboards/cyclops/rules.mk new file mode 100644 index 000000000000..bc370be0397c --- /dev/null +++ b/keyboards/cyclops/rules.mk @@ -0,0 +1,80 @@ +# 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 + + +# Bootloader selection +# Teensy halfkay +# Pro Micro caterina +# Atmel DFU atmel-dfu +# LUFA DFU lufa-dfu +# QMK DFU qmk-dfu +# atmega32a bootloadHID +BOOTLOADER = atmel-dfu + + +# If you don't know the bootloader type, then you can specify the +# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line +# Teensy halfKay 512 +# Teensy++ halfKay 1024 +# Atmel DFU loader 4096 +# LUFA bootloader 4096 +# USBaspLoader 2048 +# OPT_DEFS += -DBOOTLOADER_SIZE=4096 + + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = yes # Mouse keys(+4700) +EXTRAKEY_ENABLE = yes # Audio control and System control(+450) +CONSOLE_ENABLE = 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 +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +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 +FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches +HD44780_ENABLE = no # Enable support for HD44780 based LCDs (+400) From b10aad45b60326c7e9f2d1fc67e45bd201341552 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Fri, 30 Nov 2018 00:14:55 -0500 Subject: [PATCH 490/505] Test out i18n of the docs (#4519) * add zh-cn readme * edit readme * Round 1 of edits - Mandarin translation of QMK products is off, best to use the English name. - Fix some terminology and grammar. * trying re-translating the first paragraph --- docs/zh-cn/README.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 docs/zh-cn/README.md diff --git a/docs/zh-cn/README.md b/docs/zh-cn/README.md new file mode 100644 index 000000000000..bb9d1371f1e1 --- /dev/null +++ b/docs/zh-cn/README.md @@ -0,0 +1,32 @@ +# QMK鍵盤固件 + +[![當前版本](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags) +[![築邦](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/qmk/qmk_firmware) +[![不和諧](https://img.shields.io/discord/440868230475677696.svg)](https://discord.gg/Uq7gcHh) +[![文檔狀態](https://img.shields.io/badge/docs-ready-orange.svg)](https://docs.qmk.fm) +[![GitHub的貢獻者](https://img.shields.io/github/contributors/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/pulse/monthly) +[![GitHub的叉](https://img.shields.io/github/forks/qmk/qmk_firmware.svg?style=social&label=Fork)](https://github.com/qmk/qmk_firmware/) + +## 什麼是QMK固件? + +QMK是一個由社群維護的開源鍵盤韌體,其中包含了QMK Toolbox、qmk.fm和其它文件。QMK韌體是以[tmk\_keyboard](http://github.com/tmk/tmk_keyboard)為基礎,讓一些有用的功能在Atmel AVR控制器實現,使用於[OLKB](https://olkb.com)、[ergodox EZ](http://www.ergodox-ez.com),和[Clueboard](http://clueboard.co/)的產品中。它也被移植到使用ChibiOS的ARM晶片上。你也可以用它來讓你徒手佈線,或是客製的鍵盤PCB發揮功能。 + +## 如何得到QMK + +如果你打算貢獻鍵盤佈局,鍵盤或功能QMK,最容易做的事情是[叉通過Github上爬行](https://github.com/qmk/qmk_firmware#fork-destination-box),和克隆你爬在本地進行更改,推動他們,然後打開從你的叉子[拉請求](https://github.com/qmk/qmk_firmware/pulls)。 + +否則,您可以直接下載([拉鍊](https://github.com/qmk/qmk_firmware/zipball/master) [焦油](https://github.com/qmk/qmk_firmware/tarball/master)),或者通過GIT中克隆它(`git@github.com:qmk/qmk_firmware.git`)或HTTP(`https://github.com/qmk/qmk_firmware.git`)。 + +## 如何編譯 + +你可以編譯之前,你需要[安裝環境](getting_started_build_tools.md)用於AVR或/和ARM開發。一旦完成,你會使用`make`命令建立一個鍵盤並用以下符號鍵盤佈局 + + make planck/rev4:default + +這將建立`rev4` `planck`的修訂與`default`鍵盤映射。並非所有鍵盤有一個修訂版(也稱為子項目或文件夾),在這種情況下,它可以被省略: + + make preonic:default + +## 如何赶近 + +QMK有很多[特點](features.md)探索和很好的協議[參考文獻](http://docs.qmk.fm)挖通的。大部分功能通過修改[鍵盤映射(keymap.md),並改變[鍵碼](keycodes.md)冤大頭。 From d7f1e072a859d7fcbaccd675b4bad7d02d214e52 Mon Sep 17 00:00:00 2001 From: Wilba Date: Sat, 1 Dec 2018 03:43:34 +1100 Subject: [PATCH 491/505] Added macros to Dynamic Keymaps, Zeal60 RGB backlight improvements (#4520) * Refactored M6-B to use Zeal60 RGB backlight code * Fixed M6-B LED co-ordinates * Minor changes to RGB config for Zeal65 * Added dynamic keymaps to WT80-A, WT60-A, WT-80A, U80-A * Macro implementation * Implemented macros, API protocol version 8, RGB backlight fixes * Improved radial effects for M6-B * Fixed undefined references when building an RGB keyboard after M6-A --- keyboards/rama/m60_a/config.h | 13 ++- keyboards/rama/m60_a/rules.mk | 4 +- keyboards/rama/m6_a/config.h | 14 ++- keyboards/rama/m6_a/rules.mk | 2 +- keyboards/rama/m6_b/config.h | 11 +- keyboards/rama/m6_b/rules.mk | 4 +- keyboards/rama/u80_a/config.h | 10 +- keyboards/wilba_tech/wt60_a/config.h | 12 ++- keyboards/wilba_tech/wt65_a/config.h | 12 ++- keyboards/wilba_tech/wt80_a/config.h | 12 ++- keyboards/wilba_tech/wt_main.c | 92 +++++++++++++++-- keyboards/zeal60/config.h | 10 +- keyboards/zeal60/rgb_backlight.c | 131 ++++++++++++++++++++---- keyboards/zeal60/rgb_backlight.h | 25 +++-- keyboards/zeal60/rgb_backlight_api.h | 3 +- keyboards/zeal60/zeal60.c | 88 +++++++++++----- keyboards/zeal60/zeal60_api.h | 10 +- keyboards/zeal60/zeal60_keycodes.h | 18 +++- keyboards/zeal65/config.h | 10 +- keyboards/zeal65/rules.mk | 4 +- quantum/dynamic_keymap.c | 147 ++++++++++++++++++++++++++- quantum/dynamic_keymap.h | 35 +++++++ 22 files changed, 561 insertions(+), 106 deletions(-) diff --git a/keyboards/rama/m60_a/config.h b/keyboards/rama/m60_a/config.h index 03794965fcfc..01cfe05a5f04 100644 --- a/keyboards/rama/m60_a/config.h +++ b/keyboards/rama/m60_a/config.h @@ -31,7 +31,7 @@ #define MATRIX_ROWS 5 #define MATRIX_COLS 14 -// Zeal60 PCB default pin-out +// M60-A PCB default pin-out #define MATRIX_ROW_PINS { F0, F1, F4, F6, F7 } #define MATRIX_COL_PINS { F5, D5, B1, B2, B3, D3, D2, C7, C6, B6, B5, B4, D7, D6 } #define UNUSED_PINS @@ -118,11 +118,14 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION 0x08 #define EEPROM_VERSION_ADDR 34 // Backlight config starts after EEPROM version #define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 - +// Dynamic keymap starts after backlight config (35+31) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 66 +// Dynamic macro starts after dynamic keymaps (66+(4*5*14*2)) = (66+560) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 626 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 398 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/rama/m60_a/rules.mk b/keyboards/rama/m60_a/rules.mk index 9c1a2d9df75e..09ed03e95143 100644 --- a/keyboards/rama/m60_a/rules.mk +++ b/keyboards/rama/m60_a/rules.mk @@ -1,8 +1,8 @@ # project specific files -SRC = ../zeal60/zeal60.c \ - ../zeal60/rgb_backlight.c \ +SRC = keyboards/zeal60/zeal60.c \ + keyboards/zeal60/rgb_backlight.c \ quantum/color.c \ drivers/issi/is31fl3731.c \ drivers/avr/i2c_master.c diff --git a/keyboards/rama/m6_a/config.h b/keyboards/rama/m6_a/config.h index 63da7927453f..049749bd7d51 100644 --- a/keyboards/rama/m6_a/config.h +++ b/keyboards/rama/m6_a/config.h @@ -119,11 +119,17 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION 0x08 #define EEPROM_VERSION_ADDR 34 +// NOTE: M6-A doesn't use RGB backlight, but we keep this +// consistent with M6-B which does. + // Backlight config starts after EEPROM version #define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 - +// Dynamic keymap starts after backlight config (35+43) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 78 +// Dynamic macro starts after dynamic keymaps (78+(4*6*2)) = (78+48) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 126 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 898 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/rama/m6_a/rules.mk b/keyboards/rama/m6_a/rules.mk index ff1706918279..399e9e80d61f 100644 --- a/keyboards/rama/m6_a/rules.mk +++ b/keyboards/rama/m6_a/rules.mk @@ -1,5 +1,5 @@ # project specific files -SRC = ../zeal60/zeal60.c +SRC = keyboards/zeal60/zeal60.c # MCU name MCU = atmega32u4 diff --git a/keyboards/rama/m6_b/config.h b/keyboards/rama/m6_b/config.h index c016703e0465..67034ef8ce4e 100644 --- a/keyboards/rama/m6_b/config.h +++ b/keyboards/rama/m6_b/config.h @@ -150,11 +150,14 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION 0x08 #define EEPROM_VERSION_ADDR 34 // Backlight config starts after EEPROM version #define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 - +// Dynamic keymap starts after backlight config (35+43) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 78 +// Dynamic macro starts after dynamic keymaps (78+(4*6*2)) = (78+48) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 126 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 898 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/rama/m6_b/rules.mk b/keyboards/rama/m6_b/rules.mk index 1a7466af37df..b7a76b8dddfe 100644 --- a/keyboards/rama/m6_b/rules.mk +++ b/keyboards/rama/m6_b/rules.mk @@ -1,6 +1,6 @@ # project specific files -SRC = ../zeal60/zeal60.c \ - ../zeal60/rgb_backlight.c \ +SRC = keyboards/zeal60/zeal60.c \ + keyboards/zeal60/rgb_backlight.c \ quantum/color.c \ drivers/issi/is31fl3218.c \ drivers/avr/i2c_master.c diff --git a/keyboards/rama/u80_a/config.h b/keyboards/rama/u80_a/config.h index 9c74735ad525..b5dc27598ab6 100644 --- a/keyboards/rama/u80_a/config.h +++ b/keyboards/rama/u80_a/config.h @@ -198,7 +198,9 @@ #define EEPROM_VERSION 0x07 #define EEPROM_VERSION_ADDR 34 -// Backlight config starts after EEPROM version -#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 +// Dynamic keymap starts after EEPROM version +#define DYNAMIC_KEYMAP_EEPROM_ADDR 35 +// Dynamic macro starts after dynamic keymaps (35+(4*6*17*2)) = (35+816) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 851 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 173 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/wilba_tech/wt60_a/config.h b/keyboards/wilba_tech/wt60_a/config.h index 26f9ed2ba44d..8c18582a88e6 100644 --- a/keyboards/wilba_tech/wt60_a/config.h +++ b/keyboards/wilba_tech/wt60_a/config.h @@ -195,10 +195,12 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION 0x08 #define EEPROM_VERSION_ADDR 34 -// Backlight config starts after EEPROM version -#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 +// Dynamic keymap starts after EEPROM version +#define DYNAMIC_KEYMAP_EEPROM_ADDR 35 +// Dynamic macro starts after dynamic keymaps (35+(4*5*14*2)) = (35+560) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 595 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 429 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/wilba_tech/wt65_a/config.h b/keyboards/wilba_tech/wt65_a/config.h index 5f535c6a79af..88e902353960 100644 --- a/keyboards/wilba_tech/wt65_a/config.h +++ b/keyboards/wilba_tech/wt65_a/config.h @@ -195,10 +195,12 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION 0x08 #define EEPROM_VERSION_ADDR 34 -// Backlight config starts after EEPROM version -#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 +// Dynamic keymap starts after EEPROM version +#define DYNAMIC_KEYMAP_EEPROM_ADDR 35 +// Dynamic macro starts after dynamic keymaps (35+(4*5*15*2)) = (35+600) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 635 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 389 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/wilba_tech/wt80_a/config.h b/keyboards/wilba_tech/wt80_a/config.h index f78ce7fb34ee..ca03c366e9da 100644 --- a/keyboards/wilba_tech/wt80_a/config.h +++ b/keyboards/wilba_tech/wt80_a/config.h @@ -195,10 +195,12 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION 0x08 #define EEPROM_VERSION_ADDR 34 -// Backlight config starts after EEPROM version -#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 +// Dynamic keymap starts after EEPROM version +#define DYNAMIC_KEYMAP_EEPROM_ADDR 35 +// Dynamic macro starts after dynamic keymaps (35+(4*6*17*2)) = (35+816) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 851 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 173 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/wilba_tech/wt_main.c b/keyboards/wilba_tech/wt_main.c index 23f07d7eb144..de6d7b92c176 100644 --- a/keyboards/wilba_tech/wt_main.c +++ b/keyboards/wilba_tech/wt_main.c @@ -17,6 +17,7 @@ #include "quantum.h" #include "keyboards/wilba_tech/wt_mono_backlight.h" #include "keyboards/zeal60/zeal60_api.h" // Temporary hack +#include "keyboards/zeal60/zeal60_keycodes.h" // Temporary hack #include "raw_hid.h" #include "dynamic_keymap.h" @@ -91,22 +92,57 @@ void raw_hid_receive( uint8_t *data, uint8_t length ) dynamic_keymap_reset(); break; } -#endif // DYNAMIC_KEYMAP_ENABLE - case id_backlight_config_set_value: + case id_dynamic_keymap_macro_get_count: + { + command_data[0] = dynamic_keymap_macro_get_count(); + break; + } + case id_dynamic_keymap_macro_get_buffer_size: + { + uint16_t size = dynamic_keymap_macro_get_buffer_size(); + command_data[0] = size >> 8; + command_data[1] = size & 0xFF; + break; + } + case id_dynamic_keymap_macro_get_buffer: + { + uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; + uint16_t size = command_data[2]; // size <= 28 + dynamic_keymap_macro_get_buffer( offset, size, &command_data[3] ); + break; + } + case id_dynamic_keymap_macro_set_buffer: + { + uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; + uint16_t size = command_data[2]; // size <= 28 + dynamic_keymap_macro_set_buffer( offset, size, &command_data[3] ); + break; + } + case id_dynamic_keymap_macro_reset: + { + dynamic_keymap_macro_reset(); + break; + } + case id_dynamic_keymap_get_layer_count: { - //backlight_config_set_value(command_data); + command_data[0] = dynamic_keymap_get_layer_count(); break; } - case id_backlight_config_get_value: + case id_dynamic_keymap_get_buffer: { - //backlight_config_get_value(command_data); + uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; + uint16_t size = command_data[2]; // size <= 28 + dynamic_keymap_get_buffer( offset, size, &command_data[3] ); break; } - case id_backlight_config_save: + case id_dynamic_keymap_set_buffer: { - //backlight_config_save(); + uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; + uint16_t size = command_data[2]; // size <= 28 + dynamic_keymap_set_buffer( offset, size, &command_data[3] ); break; } +#endif // DYNAMIC_KEYMAP_ENABLE case id_eeprom_reset: { eeprom_reset(); @@ -151,6 +187,8 @@ void main_init(void) #ifdef DYNAMIC_KEYMAP_ENABLE // This resets the keymaps in EEPROM to what is in flash. dynamic_keymap_reset(); + // This resets the macros in EEPROM to nothing. + dynamic_keymap_macro_reset(); #endif // Save the magic number last, in case saving was interrupted eeprom_set_valid(true); @@ -196,3 +234,43 @@ void matrix_scan_kb(void) backlight_update_pwm_buffers(); matrix_scan_user(); } + +bool process_record_kb(uint16_t keycode, keyrecord_t *record) +{ + switch(keycode) { + case FN_MO13: + if (record->event.pressed) { + layer_on(1); + update_tri_layer(1, 2, 3); + } else { + layer_off(1); + update_tri_layer(1, 2, 3); + } + return false; + break; + case FN_MO23: + if (record->event.pressed) { + layer_on(2); + update_tri_layer(1, 2, 3); + } else { + layer_off(2); + update_tri_layer(1, 2, 3); + } + return false; + break; + } + +#ifdef DYNAMIC_KEYMAP_ENABLE + // Handle macros + if (record->event.pressed) { + if ( keycode >= MACRO00 && keycode <= MACRO15 ) + { + uint8_t id = keycode - MACRO00; + dynamic_keymap_macro_send(id); + return false; + } + } +#endif //DYNAMIC_KEYMAP_ENABLE + + return process_record_user(keycode, record); +} diff --git a/keyboards/zeal60/config.h b/keyboards/zeal60/config.h index baa4978a8349..d1bd3f6a1a48 100644 --- a/keyboards/zeal60/config.h +++ b/keyboards/zeal60/config.h @@ -115,11 +115,15 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION 0x08 #define EEPROM_VERSION_ADDR 34 // Backlight config starts after EEPROM version #define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 +// Dynamic keymap starts after backlight config (35+31) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 66 +// Dynamic macro starts after dynamic keymaps (66+(4*5*14*2)) = (66+560) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 626 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 398 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/zeal60/rgb_backlight.c b/keyboards/zeal60/rgb_backlight.c index c3dade123c90..64b95059e134 100644 --- a/keyboards/zeal60/rgb_backlight.c +++ b/keyboards/zeal60/rgb_backlight.c @@ -15,9 +15,9 @@ */ #if RGB_BACKLIGHT_ENABLED -#if defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_ZEAL65) || defined (RGB_BACKLIGHT_M60_A) || defined(RGB_BACKLIGHT_M6_B) +#if defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_ZEAL65) || defined (RGB_BACKLIGHT_M60_A) || defined(RGB_BACKLIGHT_M6_B) || defined(RGB_BACKLIGHT_KOYU) #else -#error None of the following was defined: RGB_BACKLIGHT_ZEAL60, RGB_BACKLIGHT_ZEAL65, RGB_BACKLIGHT_M60_A, RGB_BACKLIGHT_M6_B +#error None of the following was defined: RGB_BACKLIGHT_ZEAL60, RGB_BACKLIGHT_ZEAL65, RGB_BACKLIGHT_M60_A, RGB_BACKLIGHT_M6_B, RGB_BACKLIGHT_KOYU #endif #include "quantum.h" @@ -55,18 +55,21 @@ backlight_config g_config = { .brightness = 255, .effect = RGB_BACKLIGHT_EFFECT, .effect_speed = 0, - .color_1 = { .h = 0, .s = 255, .v = 255 }, - .color_2 = { .h = 127, .s = 255, .v = 255 }, - .caps_lock_indicator = { .color = { .h = 0, .s = 0, .v = 255 }, .index = 255 }, - .layer_1_indicator = { .color = { .h = 0, .s = 0, .v = 255 }, .index = 255 }, - .layer_2_indicator = { .color = { .h = 0, .s = 0, .v = 255 }, .index = 255 }, - .layer_3_indicator = { .color = { .h = 0, .s = 0, .v = 255 }, .index = 255 }, + .color_1 = { .h = 0, .s = 255 }, + .color_2 = { .h = 127, .s = 255 }, + .caps_lock_indicator = { .color = { .h = 0, .s = 0 }, .index = 255 }, + .layer_1_indicator = { .color = { .h = 0, .s = 0 }, .index = 255 }, + .layer_2_indicator = { .color = { .h = 0, .s = 0 }, .index = 255 }, + .layer_3_indicator = { .color = { .h = 0, .s = 0 }, .index = 255 }, .alphas_mods = { RGB_BACKLIGHT_ALPHAS_MODS_ROW_0, RGB_BACKLIGHT_ALPHAS_MODS_ROW_1, RGB_BACKLIGHT_ALPHAS_MODS_ROW_2, RGB_BACKLIGHT_ALPHAS_MODS_ROW_3, - RGB_BACKLIGHT_ALPHAS_MODS_ROW_4 } + RGB_BACKLIGHT_ALPHAS_MODS_ROW_4 }, +#if defined(RGB_BACKLIGHT_M6_B) + .custom_color = { { 0, 255 }, { 43, 255 }, { 85, 255 }, { 128, 255 }, { 171, 255 }, { 213, 255 } } +#endif }; bool g_suspend_state = false; @@ -199,7 +202,7 @@ const Point g_map_led_to_point[BACKLIGHT_LED_COUNT] PROGMEM = { }; const Point g_map_led_to_point_polar[BACKLIGHT_LED_COUNT] PROGMEM = { // LA0..LA17 - {64,128}, {75,132}, {84,145}, {91,164}, {97,187}, {102,213}, {105,242}, {109,255}, {128,247}, + {64,128}, {75,132}, {84,145}, {91,164}, {97,187}, {102,213}, {105,242}, {109,255}, {128,243}, {61,255}, {67,255}, {72,255}, {77,255}, {82,255}, {86,255}, {90,255}, {93,255}, {96,255}, // LB0..LB17 {56,255}, {51,255}, {46,255}, {42,255}, {37,255}, {35,255}, {32,255}, {19,255}, {0,255}, @@ -208,8 +211,37 @@ const Point g_map_led_to_point_polar[BACKLIGHT_LED_COUNT] PROGMEM = { {184,255}, {179,135}, {170,149}, {163,169}, {157,193}, {153,220}, {255,255}, {167,255}, {165,255}, {128,26}, {128,60}, {128,94}, {128,128}, {128,162}, {128,196}, {145,233}, {148,255}, {161,255}, // LD0..LD17 - {0,9}, {0,43}, {0,77}, {0,111}, {0,145}, {255,201}, {224,181}, {230,217}, {235,255}, - {189,128}, {200,131}, {210,141}, {218,159}, {201,228}, {201,228}, {206,255}, {213,255}, {218,255} + {0,9}, {0,43}, {0,77}, {0,111}, {0,145}, {0,201}, {224,181}, {230,217}, {235,255}, + {189,128}, {200,131}, {210,141}, {218,159}, {255,255}, {201,228}, {206,255}, {213,255}, {218,255} +}; +#elif defined (RGB_BACKLIGHT_KOYU) +const Point g_map_led_to_point[BACKLIGHT_LED_COUNT] PROGMEM = { + // LA0..LA17 + {120,16}, {104,16}, {88,16}, {72,16}, {56,16}, {40,16}, {24,16}, {4,16}, {4,32}, + {128,0}, {112,0}, {96,0}, {80,0}, {64,0}, {48,0}, {32,0}, {16,0}, {0,0}, + // LB0..LB17 + {144,0}, {160,0}, {176,0}, {192,0}, {208,0}, {224,0}, {240,0}, {240,16}, {240,32}, + {136,16}, {152,16}, {168,16}, {184,16}, {200,16}, {220,16}, {240,48}, {240,64}, {224,64}, + // LC0..LC17 + {112,64}, {100,48}, {84,48}, {68,48}, {52,48}, {36,48}, {64,60}, {44,60}, {24,64}, + {108,32}, {92,32}, {76,32}, {60,32}, {44,32}, {28,32}, {255,255}, {10,48}, {4,64}, + // LD0..LD17 + {124,32}, {140,32}, {156,32}, {172,32}, {188,32}, {214,32}, {180,48}, {202,48}, {224,48}, + {116,48}, {132,48}, {148,48}, {164,48}, {255,255}, {160,60}, {180,64}, {208,64}, {255,255} +}; +const Point g_map_led_to_point_polar[BACKLIGHT_LED_COUNT] PROGMEM = { + // LA0..LA17 + {64,128}, {75,132}, {84,145}, {91,164}, {97,187}, {102,213}, {105,242}, {109,255}, {128,243}, + {61,255}, {67,255}, {72,255}, {77,255}, {82,255}, {86,255}, {90,255}, {93,255}, {96,255}, + // LB0..LB17 + {56,255}, {51,255}, {46,255}, {42,255}, {38,255}, {35,255}, {32,255}, {19,255}, {0,255}, + {53,132}, {44,145}, {37,164}, {31,187}, {26,213}, {22,249}, {237,255}, {224,255}, {221,255}, + // LC0..LC17 + {189,255}, {179,135}, {170,149}, {163,169}, {157,193}, {153,220}, {172,252}, {169,255}, {165,255}, + {128,26}, {128,60}, {128,94}, {128,128}, {128,162}, {128,196}, {255,255}, {148,255}, {161,255}, + // LD0..LD17 + {0,9}, {0,43}, {0,77}, {0,111}, {0,145}, {0,201}, {224,181}, {230,217}, {235,255}, + {189,128}, {200,131}, {210,141}, {218,159}, {255,255}, {207,238}, {211,255}, {218,255}, {255,255} }; #elif defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_M60_A) const Point g_map_led_to_point[BACKLIGHT_LED_COUNT] PROGMEM = { @@ -248,7 +280,7 @@ const Point g_map_led_to_point[BACKLIGHT_LED_COUNT] PROGMEM = { {0,0}, {0,16}, {16,16}, {16,0}, {32,16}, {32,0} }; const Point g_map_led_to_point_polar[BACKLIGHT_LED_COUNT] PROGMEM = { - {0,0}, {0,16}, {16,16}, {16,0}, {32,16}, {32,0} + {160,255}, {96,255}, {77,255}, {179,255}, {51,255}, {205,255} }; #endif @@ -318,7 +350,7 @@ void map_led_to_point_polar( uint8_t index, Point *point ) #if defined (RGB_BACKLIGHT_ZEAL65) -// Note: Left spacebar stab is at 4,3 (LC7) +// Note: Left spacebar stab is at 4,2 (LC7) // Right spacebar stab is at 4,9 (D14) // // A17, A16, A15, A14, A13, A12, A11, A10, A9, B0, B1, B2, B3, B4, B6 @@ -333,6 +365,22 @@ const uint8_t g_map_row_column_to_led[MATRIX_ROWS][MATRIX_COLS] PROGMEM = { { 36+16, 36+15, 36+5, 36+4, 36+3, 36+2, 36+1, 54+9, 54+10, 54+11, 54+12, 54+6, 54+7, 54+8, 18+15 }, { 36+17, 36+8, 36+7, 255, 255, 255, 255, 36+0, 255, 54+14, 54+15, 54+16, 54+17, 18+17, 18+16 } }; +#elif defined(RGB_BACKLIGHT_KOYU) +// Note: Left spacebar stab is at 4,4 (LC6) +// Right spacebar stab is at 4,10 (D14) +// +// A17, A16, A15, A14, A13, A12, A11, A10, A9, B0, B1, B2, B3, B4, B6 +// A7, A6, A5, A4, A3, A2, A1, A0, B9, B10, B11, B12, B13, B14, B7 +// A8, C14, C13, C12, C11, C10, C9, D0, D1, D2, D3, D4, D5, B5, B8 +// C16, C15, C5, C4, C3, C2, C1, D9, D10, D11, D12, D6, D7, D8, B15 +// C17, C8, C7, C6, ---, ---, ---, C0, ---, ---, D14, D15, D16, B17, B16 +const uint8_t g_map_row_column_to_led[MATRIX_ROWS][MATRIX_COLS] PROGMEM = { + { 0+17, 0+16, 0+15, 0+14, 0+13, 0+12, 0+11, 0+10, 0+9, 18+0, 18+1, 18+2, 18+3, 18+4, 18+6 }, + { 0+7, 0+6, 0+5, 0+4, 0+3, 0+2, 0+1, 0+0, 18+9, 18+10, 18+11, 18+12, 18+13, 18+14, 18+7 }, + { 0+8, 36+14, 36+13, 36+12, 36+11, 36+10, 36+9, 54+0, 54+1, 54+2, 54+3, 54+4, 54+5, 18+5, 18+8 }, + { 36+16, 36+15, 36+5, 36+4, 36+3, 36+2, 36+1, 54+9, 54+10, 54+11, 54+12, 54+6, 54+7, 54+8, 18+15 }, + { 36+17, 36+8, 36+7, 36+6, 255, 255, 255, 36+0, 255, 255, 54+14, 54+15, 54+16, 18+17, 18+16 } +}; #elif defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_M60_A) // Note: Left spacebar stab is at 4,3 (LC6) // Right spacebar stab is at 4,9 (LD13) or 4,10 (LD14) @@ -781,8 +829,24 @@ void backlight_effect_cycle_radial2(void) } } -void backlight_effect_indicators_set_colors( uint8_t index, HSV hsv ) +#if defined(RGB_BACKLIGHT_M6_B) +void backlight_effect_custom_colors(void) { + RGB rgb; + for ( uint8_t i = 0; i < 6; i++ ) + { + HSV hsv = { .h = g_config.custom_color[i].h, .s = g_config.custom_color[i].s, .v = g_config.brightness }; + rgb = hsv_to_rgb( hsv ); + uint8_t led; + map_row_column_to_led( 0, i, &led ); + backlight_set_color( led, rgb.r, rgb.g, rgb.b ); + } +} +#endif + +void backlight_effect_indicators_set_colors( uint8_t index, HS color ) +{ + HSV hsv = { .h = color.h, .s = color.s, .v = g_config.brightness }; RGB rgb = hsv_to_rgb( hsv ); if ( index == 254 ) { @@ -799,6 +863,9 @@ void backlight_effect_indicators_set_colors( uint8_t index, HSV hsv ) #if defined (RGB_BACKLIGHT_ZEAL65) backlight_set_color( 36+7, rgb.r, rgb.g, rgb.b ); // LC7 backlight_set_color( 54+14, rgb.r, rgb.g, rgb.b ); // LD14 +#elif defined (RGB_BACKLIGHT_KOYU) + backlight_set_color( 36+6, rgb.r, rgb.g, rgb.b ); // LC6 + backlight_set_color( 54+14, rgb.r, rgb.g, rgb.b ); // LD14 #elif defined (RGB_BACKLIGHT_ZEAL60) || defined (RGB_BACKLIGHT_M60_A) backlight_set_color( 36+6, rgb.r, rgb.g, rgb.b ); // LC6 backlight_set_color( 54+13, rgb.r, rgb.g, rgb.b ); // LD13 @@ -911,7 +978,11 @@ ISR(TIMER3_COMPA_vect) backlight_effect_solid_color(); break; case 2: +#if defined(RGB_BACKLIGHT_M6_B) + backlight_effect_custom_colors(); +#else backlight_effect_alphas_mods(); +#endif break; case 3: backlight_effect_gradient_up_down(); @@ -989,18 +1060,16 @@ void backlight_get_indicator_row_col( uint8_t index, uint8_t *row, uint8_t *colu } // Some helpers for setting/getting HSV -void _set_color( HSV *color, uint8_t *data ) +void _set_color( HS *color, uint8_t *data ) { color->h = data[0]; color->s = data[1]; - color->v = data[2]; } -void _get_color( HSV *color, uint8_t *data ) +void _get_color( HS *color, uint8_t *data ) { data[0] = color->h; data[1] = color->s; - data[2] = color->v; } void backlight_config_set_value( uint8_t *data ) @@ -1132,6 +1201,16 @@ void backlight_config_set_value( uint8_t *data ) g_config.alphas_mods[i] = ( *(value_data+i*2) << 8 ) | ( *(value_data+i*2+1) ); } } +#if defined(RGB_BACKLIGHT_M6_B) + case id_custom_color: + { + uint8_t index = value_data[0]; + if ( index >= 0 && index <= 6 ) + { + _set_color( &(g_config.custom_color[index]), &(value_data[1]) ); + } + } +#endif } if ( reinitialize ) @@ -1259,6 +1338,16 @@ void backlight_config_get_value( uint8_t *data ) *(value_data+i*2+1) = g_config.alphas_mods[i] & 0xFF; } } +#if defined(RGB_BACKLIGHT_M6_B) + case id_custom_color: + { + uint8_t index = value_data[0]; + if ( index >= 0 && index <= 6 ) + { + _get_color( &(g_config.custom_color[index]), &(value_data[1]) ); + } + } +#endif } } @@ -1301,6 +1390,10 @@ void backlight_init_drivers(void) bool enabled = !( ( index == 18+5 && !g_config.use_split_backspace ) || // LB5 ( index == 36+6 ) || // LC6 ( index == 54+13 ) ); // LD13 +#elif defined (RGB_BACKLIGHT_KOYU) + bool enabled = !( ( index == 36+15 ) || // LC15 + ( index == 54+13 ) || // LD13 + ( index == 54+17 ) ); // LD17 #elif defined (RGB_BACKLIGHT_M60_A) bool enabled = !( // LB6 LB7 LB8 LB15 LB16 LB17 not present on M60-A diff --git a/keyboards/zeal60/rgb_backlight.h b/keyboards/zeal60/rgb_backlight.h index 60f2ace51af0..aa24e3491d6a 100644 --- a/keyboards/zeal60/rgb_backlight.h +++ b/keyboards/zeal60/rgb_backlight.h @@ -25,9 +25,15 @@ #include "quantum/color.h" +typedef struct PACKED +{ + uint8_t h; + uint8_t s; +} HS; + typedef struct { - HSV color; + HS color; uint8_t index; } backlight_config_indicator; @@ -45,14 +51,17 @@ typedef struct uint8_t brightness; // 1 byte uint8_t effect; // 1 byte uint8_t effect_speed; // 1 byte - HSV color_1; // 3 bytes - HSV color_2; // 3 bytes - backlight_config_indicator caps_lock_indicator; // 4 bytes - backlight_config_indicator layer_1_indicator; // 4 bytes - backlight_config_indicator layer_2_indicator; // 4 bytes - backlight_config_indicator layer_3_indicator; // 4 bytes + HS color_1; // 2 bytes + HS color_2; // 2 bytes + backlight_config_indicator caps_lock_indicator; // 3 bytes + backlight_config_indicator layer_1_indicator; // 3 bytes + backlight_config_indicator layer_2_indicator; // 3 bytes + backlight_config_indicator layer_3_indicator; // 3 bytes uint16_t alphas_mods[5]; // 10 bytes -} backlight_config; // = 37 bytes +#if defined(RGB_BACKLIGHT_M6_B) + HS custom_color[6]; // 12 bytes +#endif +} backlight_config; // = 31 bytes (M6-B = 43 bytes) void backlight_config_load(void); void backlight_config_save(void); diff --git a/keyboards/zeal60/rgb_backlight_api.h b/keyboards/zeal60/rgb_backlight_api.h index 01827e849fc3..680ba4d99c26 100644 --- a/keyboards/zeal60/rgb_backlight_api.h +++ b/keyboards/zeal60/rgb_backlight_api.h @@ -38,5 +38,6 @@ enum backlight_config_value id_layer_2_indicator_row_col = 0x13, id_layer_3_indicator_color = 0x14, id_layer_3_indicator_row_col = 0x15, - id_alphas_mods = 0x16 + id_alphas_mods = 0x16, + id_custom_color = 0x17 }; diff --git a/keyboards/zeal60/zeal60.c b/keyboards/zeal60/zeal60.c index b3b5d03fd021..5f93c571ad8b 100644 --- a/keyboards/zeal60/zeal60.c +++ b/keyboards/zeal60/zeal60.c @@ -94,6 +94,56 @@ void raw_hid_receive( uint8_t *data, uint8_t length ) dynamic_keymap_reset(); break; } + case id_dynamic_keymap_macro_get_count: + { + command_data[0] = dynamic_keymap_macro_get_count(); + break; + } + case id_dynamic_keymap_macro_get_buffer_size: + { + uint16_t size = dynamic_keymap_macro_get_buffer_size(); + command_data[0] = size >> 8; + command_data[1] = size & 0xFF; + break; + } + case id_dynamic_keymap_macro_get_buffer: + { + uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; + uint16_t size = command_data[2]; // size <= 28 + dynamic_keymap_macro_get_buffer( offset, size, &command_data[3] ); + break; + } + case id_dynamic_keymap_macro_set_buffer: + { + uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; + uint16_t size = command_data[2]; // size <= 28 + dynamic_keymap_macro_set_buffer( offset, size, &command_data[3] ); + break; + } + case id_dynamic_keymap_macro_reset: + { + dynamic_keymap_macro_reset(); + break; + } + case id_dynamic_keymap_get_layer_count: + { + command_data[0] = dynamic_keymap_get_layer_count(); + break; + } + case id_dynamic_keymap_get_buffer: + { + uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; + uint16_t size = command_data[2]; // size <= 28 + dynamic_keymap_get_buffer( offset, size, &command_data[3] ); + break; + } + case id_dynamic_keymap_set_buffer: + { + uint16_t offset = ( command_data[0] << 8 ) | command_data[1]; + uint16_t size = command_data[2]; // size <= 28 + dynamic_keymap_set_buffer( offset, size, &command_data[3] ); + break; + } #endif // DYNAMIC_KEYMAP_ENABLE #if RGB_BACKLIGHT_ENABLED case id_backlight_config_set_value: @@ -160,6 +210,8 @@ void main_init(void) #ifdef DYNAMIC_KEYMAP_ENABLE // This resets the keymaps in EEPROM to what is in flash. dynamic_keymap_reset(); + // This resets the macros in EEPROM to nothing. + dynamic_keymap_macro_reset(); #endif // Save the magic number last, in case saving was interrupted eeprom_set_valid(true); @@ -238,7 +290,19 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) return false; break; } - + +#ifdef DYNAMIC_KEYMAP_ENABLE + // Handle macros + if (record->event.pressed) { + if ( keycode >= MACRO00 && keycode <= MACRO15 ) + { + uint8_t id = keycode - MACRO00; + dynamic_keymap_macro_send(id); + return false; + } + } +#endif //DYNAMIC_KEYMAP_ENABLE + return process_record_user(keycode, record); } @@ -263,28 +327,6 @@ uint16_t keymap_function_id_to_action( uint16_t function_id ) } } -#if USE_KEYMAPS_IN_EEPROM - -#if 0 - // This is how to implement actions stored in EEPROM. - // Not yet implemented. Not sure if it's worth the trouble - // before we have a nice GUI for keymap editing. - if ( eeprom_is_valid() && - function_id < 32 ) // TODO: replace magic number - { - uint16_t action = keymap_action_load(function_id); - - // If action is not "empty", return it, otherwise - // drop down to return the one in flash - if ( action != 0x0000 ) // TODO: replace magic number - { - return action; - } - } -#endif - -#endif // USE_KEYMAPS_IN_EEPROM - return pgm_read_word(&fn_actions[function_id]); } diff --git a/keyboards/zeal60/zeal60_api.h b/keyboards/zeal60/zeal60_api.h index a65bf2f509f8..8061146fdede 100644 --- a/keyboards/zeal60/zeal60_api.h +++ b/keyboards/zeal60/zeal60_api.h @@ -15,7 +15,7 @@ */ #pragma once -#define PROTOCOL_VERSION 0x0007 +#define PROTOCOL_VERSION 0x0008 enum zeal60_command_id { @@ -30,6 +30,14 @@ enum zeal60_command_id id_backlight_config_save, id_eeprom_reset, id_bootloader_jump, + id_dynamic_keymap_macro_get_count, + id_dynamic_keymap_macro_get_buffer_size, + id_dynamic_keymap_macro_get_buffer, + id_dynamic_keymap_macro_set_buffer, + id_dynamic_keymap_macro_reset, + id_dynamic_keymap_get_layer_count, + id_dynamic_keymap_get_buffer, + id_dynamic_keymap_set_buffer, id_unhandled = 0xFF, }; diff --git a/keyboards/zeal60/zeal60_keycodes.h b/keyboards/zeal60/zeal60_keycodes.h index 9511801eb26d..d9abf602b6bb 100644 --- a/keyboards/zeal60/zeal60_keycodes.h +++ b/keyboards/zeal60/zeal60_keycodes.h @@ -22,7 +22,23 @@ // Backlight keycodes are in range 0x5F00-0x5F0F enum zeal60_keycodes { FN_MO13 = 0x5F10, - FN_MO23 + FN_MO23, + MACRO00, + MACRO01, + MACRO02, + MACRO03, + MACRO04, + MACRO05, + MACRO06, + MACRO07, + MACRO08, + MACRO09, + MACRO10, + MACRO11, + MACRO12, + MACRO13, + MACRO14, + MACRO15, }; // Zeal60 specific "action functions" diff --git a/keyboards/zeal65/config.h b/keyboards/zeal65/config.h index 683df2038ae7..63ce1c12a2a9 100644 --- a/keyboards/zeal65/config.h +++ b/keyboards/zeal65/config.h @@ -115,11 +115,15 @@ // Bump this every time we change what we store // This will automatically reset the EEPROM with defaults // and avoid loading invalid data from the EEPROM -#define EEPROM_VERSION 0x07 +#define EEPROM_VERSION 0x08 #define EEPROM_VERSION_ADDR 34 // Backlight config starts after EEPROM version #define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR 35 -// Dynamic keymap starts after backlight config (35+37) -#define DYNAMIC_KEYMAP_EEPROM_ADDR 72 +// Dynamic keymap starts after backlight config (35+31) +#define DYNAMIC_KEYMAP_EEPROM_ADDR 66 +// Dynamic macro starts after dynamic keymaps (66+(4*5*15*2)) = (66+600) +#define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR 666 +#define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE 358 +#define DYNAMIC_KEYMAP_MACRO_COUNT 16 diff --git a/keyboards/zeal65/rules.mk b/keyboards/zeal65/rules.mk index 7ab1b7d3ba97..596c1e6496d9 100644 --- a/keyboards/zeal65/rules.mk +++ b/keyboards/zeal65/rules.mk @@ -1,8 +1,8 @@ # project specific files -SRC = ../zeal60/zeal60.c \ - ../zeal60/rgb_backlight.c \ +SRC = keyboards/zeal60/zeal60.c \ + keyboards/zeal60/rgb_backlight.c \ quantum/color.c \ drivers/issi/is31fl3731.c \ drivers/avr/i2c_master.c diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c index ee39a20251b3..14627a93d6de 100644 --- a/quantum/dynamic_keymap.c +++ b/quantum/dynamic_keymap.c @@ -18,7 +18,7 @@ #include "keymap.h" // to get keymaps[][][] #include "tmk_core/common/eeprom.h" #include "progmem.h" // to read default from flash - +#include "quantum.h" // for send_string() #include "dynamic_keymap.h" #ifdef DYNAMIC_KEYMAP_ENABLE @@ -31,6 +31,23 @@ #error DYNAMIC_KEYMAP_LAYER_COUNT not defined #endif +#ifndef DYNAMIC_KEYMAP_MACRO_COUNT +#error DYNAMIC_KEYMAP_MACRO_COUNT not defined +#endif + +#ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR +#error DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR not defined +#endif + +#ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE +#error DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE not defined +#endif + +uint8_t dynamic_keymap_get_layer_count(void) +{ + return DYNAMIC_KEYMAP_LAYER_COUNT; +} + void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column) { // TODO: optimize this with some left shifts @@ -69,6 +86,36 @@ void dynamic_keymap_reset(void) } } +void dynamic_keymap_get_buffer( uint16_t offset, uint16_t size, uint8_t *data ) +{ + uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2; + void *source = (void*)(DYNAMIC_KEYMAP_EEPROM_ADDR+offset); + uint8_t *target = data; + for ( uint16_t i = 0; i < size; i++ ) { + if ( offset + i < dynamic_keymap_eeprom_size ) { + *target = eeprom_read_byte(source); + } else { + *target = 0x00; + } + source++; + target++; + } +} + +void dynamic_keymap_set_buffer( uint16_t offset, uint16_t size, uint8_t *data ) +{ + uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2; + void *target = (void*)(DYNAMIC_KEYMAP_EEPROM_ADDR+offset); + uint8_t *source = data; + for ( uint16_t i = 0; i < size; i++ ) { + if ( offset + i < dynamic_keymap_eeprom_size ) { + eeprom_update_byte(target, *source); + } + source++; + target++; + } +} + // This overrides the one in quantum/keymap_common.c uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) { @@ -81,5 +128,103 @@ uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) } } + + +uint8_t dynamic_keymap_macro_get_count(void) +{ + return DYNAMIC_KEYMAP_MACRO_COUNT; +} + +uint16_t dynamic_keymap_macro_get_buffer_size(void) +{ + return DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE; +} + +void dynamic_keymap_macro_get_buffer( uint16_t offset, uint16_t size, uint8_t *data ) +{ + void *source = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+offset); + uint8_t *target = data; + for ( uint16_t i = 0; i < size; i++ ) { + if ( offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE ) { + *target = eeprom_read_byte(source); + } else { + *target = 0x00; + } + source++; + target++; + } +} + +void dynamic_keymap_macro_set_buffer( uint16_t offset, uint16_t size, uint8_t *data ) +{ + void *target = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+offset); + uint8_t *source = data; + for ( uint16_t i = 0; i < size; i++ ) { + if ( offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE ) { + eeprom_update_byte(target, *source); + } + source++; + target++; + } +} + +void dynamic_keymap_macro_reset(void) +{ + void *p = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR); + void *end = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE); + while ( p != end ) { + eeprom_update_byte(p, 0); + ++p; + } +} + +void dynamic_keymap_macro_send( uint8_t id ) +{ + if ( id >= DYNAMIC_KEYMAP_MACRO_COUNT ) { + return; + } + + // Check the last byte of the buffer. + // If it's not zero, then we are in the middle + // of buffer writing, possibly an aborted buffer + // write. So do nothing. + void *p = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE-1); + if ( eeprom_read_byte(p) != 0 ) { + return; + } + + // Skip N null characters + // p will then point to the Nth macro + p = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR); + void *end = (void*)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR+DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE); + while ( id > 0 ) { + // If we are past the end of the buffer, then the buffer + // contents are garbage, i.e. there were not DYNAMIC_KEYMAP_MACRO_COUNT + // nulls in the buffer. + if ( p == end ) { + return; + } + if ( eeprom_read_byte(p) == 0 ) { + --id; + } + ++p; + } + + // Send the macro string one char at a time + // by making temporary 1 char strings + char data[2] = { 0, 0 }; + // We already checked there was a null at the end of + // the buffer, so this cannot go past the end + while ( 1 ) { + data[0] = eeprom_read_byte(p); + // Stop at the null terminator of this macro string + if ( data[0] == 0 ) { + break; + } + send_string(data); + ++p; + } +} + #endif // DYNAMIC_KEYMAP_ENABLE diff --git a/quantum/dynamic_keymap.h b/quantum/dynamic_keymap.h index bd76adae209a..63653f6cb718 100644 --- a/quantum/dynamic_keymap.h +++ b/quantum/dynamic_keymap.h @@ -18,11 +18,46 @@ #include #include +uint8_t dynamic_keymap_get_layer_count(void); void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column); uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column); void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode); void dynamic_keymap_reset(void); +// These get/set the keycodes as stored in the EEPROM buffer +// Data is big-endian 16-bit values (the keycodes) +// Order is by layer/row/column +// Thus offset 0 = 0,0,0, offset MATRIX_COLS*2 = 0,1,0, offset MATRIX_ROWS*MATRIX_COLS*2 = 1,0,0 +// Note the *2, because offset is in bytes and keycodes are two bytes +// This is only really useful for host applications that want to get a whole keymap fast, +// by reading 14 keycodes (28 bytes) at a time, reducing the number of raw HID transfers by +// a factor of 14. +void dynamic_keymap_get_buffer( uint16_t offset, uint16_t size, uint8_t *data ); +void dynamic_keymap_set_buffer( uint16_t offset, uint16_t size, uint8_t *data ); // This overrides the one in quantum/keymap_common.c // uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key); + + +// Note regarding dynamic_keymap_macro_set_buffer(): +// The last byte of the buffer is used as a valid flag, +// so macro sending is disabled during writing a new buffer, +// should it happen during, or after an interrupted transfer. +// +// Users writing to the buffer must first set the last byte of the buffer +// to non-zero (i.e. 0xFF). After (or during) the final write, set the +// last byte of the buffer to zero. +// +// Since the contents of the buffer must be a list of null terminated +// strings, the last byte must be a null when at maximum capacity, +// and it not being null means the buffer can be considered in an +// invalid state. + +uint8_t dynamic_keymap_macro_get_count(void); +uint16_t dynamic_keymap_macro_get_buffer_size(void); +void dynamic_keymap_macro_get_buffer( uint16_t offset, uint16_t size, uint8_t *data ); +void dynamic_keymap_macro_set_buffer( uint16_t offset, uint16_t size, uint8_t *data ); +void dynamic_keymap_macro_reset(void); + +void dynamic_keymap_macro_send( uint8_t id ); + From 8c033497c62970087ae16c3e7c42fd72f3e1ecbe Mon Sep 17 00:00:00 2001 From: Alex Mayer Date: Fri, 30 Nov 2018 17:51:45 -0500 Subject: [PATCH 492/505] Planck: Align Keycode Columns (#4523) Remove Extra Newlines --- keyboards/planck/keymaps/default/keymap.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/keyboards/planck/keymaps/default/keymap.c b/keyboards/planck/keymaps/default/keymap.c index 0b787cd122c6..03cc0049e4eb 100644 --- a/keyboards/planck/keymaps/default/keymap.c +++ b/keyboards/planck/keymaps/default/keymap.c @@ -144,7 +144,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Exit | | | A | O | | E | U | | | | * `-----------------------------------------------------------------------------------' */ - [_PLOVER] = LAYOUT_planck_grid( 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, @@ -164,13 +163,12 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * `-----------------------------------------------------------------------------------' */ [_ADJUST] = LAYOUT_planck_grid( - _______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL , - _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______, + _______, RESET, DEBUG, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_DEL , + _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______, _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, TERM_ON, TERM_OFF, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ) - }; #ifdef AUDIO_ENABLE From 5803012eda70d2ad85434e53820f2c93c310f92e Mon Sep 17 00:00:00 2001 From: Jason Thigpen Date: Sat, 1 Dec 2018 08:17:50 -0800 Subject: [PATCH 493/505] Add a layout to support tsangan bottom row with split bs and rshift (#4521) * Add a layout to support tsangan bottom row with split bs and rshift * Move the new layout to defaults * Rename layout to be more accurately representative * Rename files to match renamed layout def --- .../keymap.c | 21 +++++++++++++++++++ .../layout.json | 5 +++++ .../60_ansi_tsangan_split_bs_rshift/readme.md | 3 +++ 3 files changed, 29 insertions(+) create mode 100644 layouts/default/60_ansi_tsangan_split_bs_rshift/default_60_ansi_tsangan_split_bs_rshift/keymap.c create mode 100644 layouts/default/60_ansi_tsangan_split_bs_rshift/layout.json create mode 100644 layouts/default/60_ansi_tsangan_split_bs_rshift/readme.md diff --git a/layouts/default/60_ansi_tsangan_split_bs_rshift/default_60_ansi_tsangan_split_bs_rshift/keymap.c b/layouts/default/60_ansi_tsangan_split_bs_rshift/default_60_ansi_tsangan_split_bs_rshift/keymap.c new file mode 100644 index 000000000000..17b47eecf97a --- /dev/null +++ b/layouts/default/60_ansi_tsangan_split_bs_rshift/default_60_ansi_tsangan_split_bs_rshift/keymap.c @@ -0,0 +1,21 @@ +#include QMK_KEYBOARD_H + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_60_ansi_tsangan_split_bs_rshift( + 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_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_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL + ) +}; + +// 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) { + +}; diff --git a/layouts/default/60_ansi_tsangan_split_bs_rshift/layout.json b/layouts/default/60_ansi_tsangan_split_bs_rshift/layout.json new file mode 100644 index 000000000000..117d26d4194c --- /dev/null +++ b/layouts/default/60_ansi_tsangan_split_bs_rshift/layout.json @@ -0,0 +1,5 @@ +[{a:7},"","","","","","","","","","","","","","",""], +[{w:1.5},"","","","","","","","","","","","","",{w:1.5},""], +[{w:1.75},"","","","","","","","","","","","",{w:2.25},""], +[{w:2.25},"","","","","","","","","","","",{w:1.75},"",{w:1},""], +[{w:1.5},"",{w:1},"",{w:1.5},"",{w:7},"",{w:1.5},"",{w:1},"",{w:1.5},""] diff --git a/layouts/default/60_ansi_tsangan_split_bs_rshift/readme.md b/layouts/default/60_ansi_tsangan_split_bs_rshift/readme.md new file mode 100644 index 000000000000..ad1c598b3438 --- /dev/null +++ b/layouts/default/60_ansi_tsangan_split_bs_rshift/readme.md @@ -0,0 +1,3 @@ +# 60_ansi_tsangan_split_bs_rshift + + LAYOUT_60_ansi_tsangan_split_bs_rshift \ No newline at end of file From 75a51659abfbc68874f2e9326f0adf1258fc5458 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Sat, 1 Dec 2018 08:21:06 -0800 Subject: [PATCH 494/505] Add tap_random_base64 and software timer info to Useful Functions doc (#4360) * Update docs * Add security caveat Co-Authored-By: drashna * Wordsmithing Co-Authored-By: drashna * Update docs/ref_functions.md Co-Authored-By: drashna --- docs/faq_keymap.md | 17 ----------------- docs/ref_functions.md | 21 +++++++++++++++++++++ 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/docs/faq_keymap.md b/docs/faq_keymap.md index 4e842d363cee..ae01e938780a 100644 --- a/docs/faq_keymap.md +++ b/docs/faq_keymap.md @@ -211,20 +211,3 @@ here real_mods lost state for 'physical left shift'. weak_mods is ORed with real_mods when keyboard report is sent. https://github.com/tmk/tmk_core/blob/master/common/action_util.c#L57 - -## Timer Functionality - -It's possible to start timers and read values for time-specific events - here's an example: - -```c -static uint16_t key_timer; -key_timer = timer_read(); - -if (timer_elapsed(key_timer) < 100) { - // do something if less than 100ms have passed -} else { - // do something if 100ms or more have passed -} -``` - -It's best to declare the `static uint16_t key_timer;` at the top of the file, outside of any code blocks you're using it in. diff --git a/docs/ref_functions.md b/docs/ref_functions.md index 9b5be7a883ff..174d9a95a6f4 100644 --- a/docs/ref_functions.md +++ b/docs/ref_functions.md @@ -96,3 +96,24 @@ And to do so, add `reset_keyboard()` to your function or macro, and this will re If you're having issues with Audio, RGB Underglow, backlighting or keys acting weird, then you can reset the EEPROM (persistent setting storage). Bootmagic is one way to do this, but if that isn't enabled, then you can use a custom macro to do so. To wipe the EEPROM, run `eeconfig_init()` from your function or macro to reset most of the settings to default. + +## Tap random key + +If you want to send a random character to the host computer, you can use the `tap_random_base64()` function. This [pseudorandomly](https://en.wikipedia.org/wiki/Pseudorandom_number_generator) selects a number between 0 and 63, and then sends a key press based on that selection. (0–25 is `A`–`Z`, 26–51 is `a`–`z`, 52–61 is `0`–`9`, 62 is `+` and 63 is `/`). + +?> Needless to say, but this is _not_ a cryptographically secure method of generating random Base64 keys or passwords. + +## Software Timers + +It's possible to start timers and read values for time-specific events. Here's an example: + +```c +static uint16_t key_timer; +key_timer = timer_read(); + +if (timer_elapsed(key_timer) < 100) { + // do something if less than 100ms have passed +} else { + // do something if 100ms or more have passed +} +``` From 0b0c98929b7d9375661a101740f2b1be8ca3e0fc Mon Sep 17 00:00:00 2001 From: Erovia Date: Sat, 1 Dec 2018 17:57:30 +0100 Subject: [PATCH 495/505] Add support for S7 Elephant (#4511) * Add support for S7 Elephant A high-end 70% custom keyboard designed and produced by jacky from Geekhack. * Polish S7 Elephant code Implement drashna's suggestions: - specify bootloader - remove unnecessary defines - use led_set_user() for LED logic * Correct info.json and s7_elephant.h Correct info.json and s7_elepant.h to follow QMK convention and fix a missing curly bracket. --- keyboards/s7_elephant/config.h | 47 + keyboards/s7_elephant/info.json | 129 +++ .../s7_elephant/keymaps/default/config.h | 1 + .../s7_elephant/keymaps/default/keymap.c | 64 ++ .../s7_elephant/keymaps/default/readme.md | 35 + keyboards/s7_elephant/readme.md | 17 + keyboards/s7_elephant/rules.mk | 52 ++ keyboards/s7_elephant/s7_elephant.c | 1 + keyboards/s7_elephant/s7_elephant.h | 855 ++++++++++++++++++ 9 files changed, 1201 insertions(+) create mode 100644 keyboards/s7_elephant/config.h create mode 100644 keyboards/s7_elephant/info.json create mode 100644 keyboards/s7_elephant/keymaps/default/config.h create mode 100644 keyboards/s7_elephant/keymaps/default/keymap.c create mode 100644 keyboards/s7_elephant/keymaps/default/readme.md create mode 100644 keyboards/s7_elephant/readme.md create mode 100644 keyboards/s7_elephant/rules.mk create mode 100644 keyboards/s7_elephant/s7_elephant.c create mode 100644 keyboards/s7_elephant/s7_elephant.h diff --git a/keyboards/s7_elephant/config.h b/keyboards/s7_elephant/config.h new file mode 100644 index 000000000000..55baa4c37b7f --- /dev/null +++ b/keyboards/s7_elephant/config.h @@ -0,0 +1,47 @@ +#pragma once + +#include "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0xFEED +#define PRODUCT_ID 0x0007 +#define DEVICE_VER 0x0001 +#define MANUFACTURER jacky +#define PRODUCT S7 Elephant +#define DESCRIPTION A high-end 70% custom keyboard + +/* key matrix size */ +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { B0, B1, B2, B3, B4 } +#define MATRIX_COL_PINS { B6, D0, D1, D2, D3, D4, D5, D6, D7, C6, C7, F4, F5, F6, F7, F1 } +#define UNUSED_PINS + +/* COL2ROW or ROW2COL */ +#define DIODE_DIRECTION COL2ROW + +/* 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)) \ +) + +#define RGB_DI_PIN E6 +#ifdef RGB_DI_PIN +#define RGBLIGHT_ANIMATIONS +#define RGBLED_NUM 2 +#define RGBLIGHT_HUE_STEP 8 +#define RGBLIGHT_SAT_STEP 8 +#define RGBLIGHT_VAL_STEP 8 +#define RGBLIGHT_SLEEP +#endif diff --git a/keyboards/s7_elephant/info.json b/keyboards/s7_elephant/info.json new file mode 100644 index 000000000000..37f98d79d50c --- /dev/null +++ b/keyboards/s7_elephant/info.json @@ -0,0 +1,129 @@ +{ + "keyboard_name": "S7 Elephant", + "url": "https://geekhack.org/index.php?topic=96434.0", + "maintainer": "qmk", + "width": 18, + "height": 5, + "layouts": { + "LAYOUT_ansi": { + "key_count": 72, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_small_lshift": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_small_bspc": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_small_lshift_small_bspc": { + "key_count": 74, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_1u": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_1u_small_lshift": { + "key_count": 74, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_1u_small_bspc": { + "key_count": 74, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_1u_small_lshift_small_bspc": { + "key_count": 75, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_7u": { + "key_count": 71, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_7u_small_lshift": { + "key_count": 72, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_7u_small_bspc": { + "key_count": 72, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_7u_small_lshift_small_bspc": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_blocker": { + "key_count": 72, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_blocker_small_lshift": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_blocker_small_bspc": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_blocker_small_lshift_small_bspc": { + "key_count": 74, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_blocker_7u": { + "key_count": 71, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_blocker_7u_small_lshift": { + "key_count": 72, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_blocker_7u_small_bspc": { + "key_count": 72, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":2.25}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_ansi_blocker_7u_small_lshift_small_bspc": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"|", "x":15.5, "y":1, "w":1.5}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"Enter", "x":14.75, "y":2, "w":2.25}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_small_bspc": { + "key_count": 74, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_1u": { + "key_count": 74, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_1u_small_bspc": { + "key_count": 75, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4}, {"label":"Alt", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_7u": { + "key_count": 72, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_7u_small_bspc": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4, "w":1.5}, {"x":5, "y":4, "w":7}, {"label":"Fn", "x":12, "y":4, "w":1.5}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_blocker": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_blocker_small_bspc": { + "key_count": 74, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.25}, {"label":"Win", "x":3.25, "y":4, "w":1.25}, {"label":"Alt", "x":4.5, "y":4, "w":1.25}, {"x":5.75, "y":4, "w":6.25}, {"label":"Fn", "x":12, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.25, "y":4, "w":1.25}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_blocker_7u": { + "key_count": 72, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0, "w":2}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + }, + "LAYOUT_iso_blocker_7u_small_bspc": { + "key_count": 73, + "layout": [{"label":"F1", "x":0, "y":0}, {"label":"Esc", "x":2, "y":0}, {"label":"!", "x":3, "y":0}, {"label":"@", "x":4, "y":0}, {"label":"#", "x":5, "y":0}, {"label":"$", "x":6, "y":0}, {"label":"%", "x":7, "y":0}, {"label":"^", "x":8, "y":0}, {"label":"&", "x":9, "y":0}, {"label":"*", "x":10, "y":0}, {"label":"(", "x":11, "y":0}, {"label":")", "x":12, "y":0}, {"label":"_", "x":13, "y":0}, {"label":"+", "x":14, "y":0}, {"label":"Backspace", "x":15, "y":0}, {"x":16, "y":0}, {"label":"Home", "x":17, "y":0}, {"label":"F2", "x":0, "y":1}, {"label":"Tab", "x":2, "y":1, "w":1.5}, {"label":"Q", "x":3.5, "y":1}, {"label":"W", "x":4.5, "y":1}, {"label":"E", "x":5.5, "y":1}, {"label":"R", "x":6.5, "y":1}, {"label":"T", "x":7.5, "y":1}, {"label":"Y", "x":8.5, "y":1}, {"label":"U", "x":9.5, "y":1}, {"label":"I", "x":10.5, "y":1}, {"label":"O", "x":11.5, "y":1}, {"label":"P", "x":12.5, "y":1}, {"label":"{", "x":13.5, "y":1}, {"label":"}", "x":14.5, "y":1}, {"label":"Enter", "x":15.75, "y":1, "w":1.25, "h":2}, {"label":"End", "x":17, "y":1}, {"label":"F3", "x":0, "y":2}, {"label":"Caps Lock", "x":2, "y":2, "w":1.75}, {"label":"A", "x":3.75, "y":2}, {"label":"S", "x":4.75, "y":2}, {"label":"D", "x":5.75, "y":2}, {"label":"F", "x":6.75, "y":2}, {"label":"G", "x":7.75, "y":2}, {"label":"H", "x":8.75, "y":2}, {"label":"J", "x":9.75, "y":2}, {"label":"K", "x":10.75, "y":2}, {"label":"L", "x":11.75, "y":2}, {"label":":", "x":12.75, "y":2}, {"label":"\"", "x":13.75, "y":2}, {"label":"|", "x":14.75, "y":2}, {"label":"Ins", "x":17, "y":2}, {"label":"F4", "x":0, "y":3}, {"label":"Shift", "x":2, "y":3, "w":1.25}, {"x":3.25, "y":3}, {"label":"Z", "x":4.25, "y":3}, {"label":"X", "x":5.25, "y":3}, {"label":"C", "x":6.25, "y":3}, {"label":"V", "x":7.25, "y":3}, {"label":"B", "x":8.25, "y":3}, {"label":"N", "x":9.25, "y":3}, {"label":"M", "x":10.25, "y":3}, {"label":"<", "x":11.25, "y":3}, {"label":">", "x":12.25, "y":3}, {"label":"?", "x":13.25, "y":3}, {"label":"Shift", "x":14.25, "y":3, "w":1.75}, {"label":"Up", "x":16, "y":3}, {"label":"Del", "x":17, "y":3}, {"label":"F5", "x":0, "y":4}, {"label":"Ctrl", "x":2, "y":4, "w":1.5}, {"label":"Win", "x":3.5, "y":4}, {"label":"Alt", "x":4.5, "y":4, "w":1.5}, {"x":6, "y":4, "w":6.75}, {"label":"Fn", "x":12.75, "y":4, "w":1.5}, {"label":"Left", "x":15, "y":4}, {"label":"Down", "x":16, "y":4}, {"label":"Right", "x":17, "y":4}] + } + } +} diff --git a/keyboards/s7_elephant/keymaps/default/config.h b/keyboards/s7_elephant/keymaps/default/config.h new file mode 100644 index 000000000000..85f62371e9f0 --- /dev/null +++ b/keyboards/s7_elephant/keymaps/default/config.h @@ -0,0 +1 @@ +#define RGBLIGHT_LIMIT_VAL 80 diff --git a/keyboards/s7_elephant/keymaps/default/keymap.c b/keyboards/s7_elephant/keymaps/default/keymap.c new file mode 100644 index 000000000000..339f2d379c65 --- /dev/null +++ b/keyboards/s7_elephant/keymaps/default/keymap.c @@ -0,0 +1,64 @@ +#include QMK_KEYBOARD_H + +enum custom_layers { + _QWERTY, + _FN +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +/* Qwerty + * ,------. ,-------------------------------------------------------------------------------------------------. + * | F1 | | Esc`~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc |Home | + * |------| |-------------------------------------------------------------------------------------------------| + * | F2 | | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | End | + * |------| |-------------------------------------------------------------------------------------------------| + * | F3 | | Caps | A | S | D | F | G | H | J | K | L | ; | ' | Enter | Ins | + * |------| |-------------------------------------------------------------------------------------------------| + * | F4 | | Shift | Z | X | C | V | B | N | M | , | . | / | RShift | U | Del | + * |------| |-------------------------------------------------------------------------------------------------| + * | F5 | | Ctrl | Gui | Alt | Space | FN | RCtrl | L | D | R | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +[_QWERTY] = LAYOUT_ansi( +KC_F1, KC_GESC, 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_F2, 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_F3, 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_HOME, +KC_F4, 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_END, +KC_F5, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT +), + +/* FN + * ,------. ,-------------------------------------------------------------------------------------------------. + * |Reset | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | PScr | ScrLck |Pause| + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | |Prev |Play |Next | | | | |VolD |Mute |VolU | | |PgUp | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | |PgDn | + * |------| |-------------------------------------------------------------------------------------------------| + * |EEPRST| | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +[_FN] = LAYOUT_ansi( +RESET, 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_MPRV, KC_MPLY, KC_MNXT, _______, _______, _______, _______, KC_VOLD, KC_MUTE, KC_VOLU, _______, _______, KC_PGUP, +_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, +EEP_RST, _______, _______, _______, _______, _______, _______, _______, _______, _______ +), +}; + +void led_set_user(uint8_t usb_led) { + // Turn LEDs On/Off for Caps Lock + if (host_keyboard_leds() & (1 << USB_LED_CAPS_LOCK)) { + rgblight_enable_noeeprom(); + rgblight_sethsv_noeeprom(0, 0, 80); + } else { + rgblight_sethsv_noeeprom(0, 0, 80); + rgblight_disable_noeeprom(); + } +} diff --git a/keyboards/s7_elephant/keymaps/default/readme.md b/keyboards/s7_elephant/keymaps/default/readme.md new file mode 100644 index 000000000000..c4fe30acdd58 --- /dev/null +++ b/keyboards/s7_elephant/keymaps/default/readme.md @@ -0,0 +1,35 @@ +# Default keymap for S7 Elephant + +**Features** + +* LEDs are functioning as Caps-Lock indicators + +## QWERTY (Normal) Layer +``` +,------. ,-------------------------------------------------------------------------------------------------. +| F1 | | Esc`~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc |Home | +|------| |-------------------------------------------------------------------------------------------------| +| F2 | | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | End | +|------| |-------------------------------------------------------------------------------------------------| +| F3 | | Caps | A | S | D | F | G | H | J | K | L | ; | ' | Enter | Ins | +|------| |-------------------------------------------------------------------------------------------------| +| F4 | | Shift | Z | X | C | V | B | N | M | , | . | / | RShift | U | Del | +|------| |-------------------------------------------------------------------------------------------------| +| F5 | | Ctrl | Gui | Alt | Space | FN | RAlt | RCtrl | L | D | R | +`------' `-------------------------------------------------------------------------------------------------' +``` + +## FN Layer +``` +,------. ,-------------------------------------------------------------------------------------------------. +|Reset | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | PScr | ScrLck |Pause| +|------| |-------------------------------------------------------------------------------------------------| +| | | | | | | | | | | | | | | | | | +|------| |-------------------------------------------------------------------------------------------------| +| | | |Prev |Play |Next | | | | |VolD |Mute |VolU | | |PgUp | +|------| |-------------------------------------------------------------------------------------------------| +| | | | | | | | | | | | | | | |PgDn | +|------| |-------------------------------------------------------------------------------------------------| +|EPRM | | | | | | | | | | | | +`------' `-------------------------------------------------------------------------------------------------' +``` diff --git a/keyboards/s7_elephant/readme.md b/keyboards/s7_elephant/readme.md new file mode 100644 index 000000000000..466e3f7316de --- /dev/null +++ b/keyboards/s7_elephant/readme.md @@ -0,0 +1,17 @@ +# S7 Elephant + +![S7 Elephant](https://i.imgur.com/CaHxKBJ.jpg) + +A high-end 70% custom keyboard designed and produced by [jacky](https://geekhack.org/index.php?action=profile;u=63864) from Geekhack. + +Keyboard Maintainer: QMK Community +Hardware Supported: S7 Elephant +Hardware Availability: [The GB has ended with little chance to run again.](https://geekhack.org/index.php?topic=96434.0) + +Make example for this keyboard (after setting up your build environment): + + make s7_elephant:default:dfu + +To enter the bootloader, either short the pins on the PCB or the RESET button on the FN layer. + +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). diff --git a/keyboards/s7_elephant/rules.mk b/keyboards/s7_elephant/rules.mk new file mode 100644 index 000000000000..7f0ad6d3c572 --- /dev/null +++ b/keyboards/s7_elephant/rules.mk @@ -0,0 +1,52 @@ +# 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 + +BOOTLOADER = atmel-dfu + +# Build Options +# comment out to disable the options. +# +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 +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = yes # Enable keyboard underlight functionality diff --git a/keyboards/s7_elephant/s7_elephant.c b/keyboards/s7_elephant/s7_elephant.c new file mode 100644 index 000000000000..a869f46dbe57 --- /dev/null +++ b/keyboards/s7_elephant/s7_elephant.c @@ -0,0 +1 @@ +#include "s7_elephant.h" diff --git a/keyboards/s7_elephant/s7_elephant.h b/keyboards/s7_elephant/s7_elephant.h new file mode 100644 index 000000000000..c351ffdb91bb --- /dev/null +++ b/keyboards/s7_elephant/s7_elephant.h @@ -0,0 +1,855 @@ +#ifndef S7_ELEPHANT_H +#define S7_ELEPHANT_H + +#include "quantum.h" + +#define ____ KC_NO + +/* ANSI + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with small shift + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_small_lshift( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with small backspace + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with small shift and small backspace + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_small_lshift_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* **************************************************************************************************************************************** */ +/* ANSI with 1u keys in the bottom row + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_1u( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K412, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, K412, K413, K414, K415 } \ +} + +/* ANSI with small shift and 1u keys in the bottom row + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_1u_small_lshift( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K412, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, K412, K413, K414, K415 } \ +} + +/* ANSI with small backspace and 1u keys in the bottom row + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_1u_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K412, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, K412, K413, K414, K415 } \ +} + +/* ANSI with small shift and small backspace and 1u keys in the bottom row + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_1u_small_lshift_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K412, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, K412, K413, K414, K415 } \ +} + +/* **************************************************************************************************************************************** */ +/* ANSI with 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_7u( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, ____, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with small shift and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_7u_small_lshift( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, ____, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with small backspace and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_7u_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, ____, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with small shift and small backspace and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_ansi_7u_small_lshift_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, ____, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* **************************************************************************************************************************************** */ +/* ANSI with blocker + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------- -------------------' + */ + +#define LAYOUT_ansi_blocker( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with blocker and small shift + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------- -------------------' + */ + +#define LAYOUT_ansi_blocker_small_lshift( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with blocker and small backspace + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------- -------------------' + */ + +#define LAYOUT_ansi_blocker_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ANSI with blocker and small shift and small backspace + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------- -------------------' + */ + +#define LAYOUT_ansi_blocker_small_lshift_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* **************************************************************************************************************************************** */ +/* ANSI with blocker and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `--------------------------------------------------------------------------- ------------------' + */ + +#define LAYOUT_ansi_blocker_7u( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, ____, ____, K413, K414, K415 } \ +} + +/* ANSI with blocker and small shift and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `--------------------------------------------------------------------------- ------------------' + */ + +#define LAYOUT_ansi_blocker_7u_small_lshift( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, ____, ____, K413, K414, K415 } \ +} + +/* ANSI with blocker and small backspace and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `--------------------------------------------------------------------------- ------------------' + */ + +#define LAYOUT_ansi_blocker_7u_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, ____, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, ____, ____, K413, K414, K415 } \ +} + +/* ANSI with blocker and small shift and small backspace and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `--------------------------------------------------------------------------- ------------------' + */ + +#define LAYOUT_ansi_blocker_7u_small_lshift_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, ____, ____, K413, K414, K415 } \ +} + +/* **************************************************************************************************************************************** */ +/* ISO + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_iso( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ISO with small backspace + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_iso_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* **************************************************************************************************************************************** */ +/* ISO with 1u keys in the bottom row + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_iso_1u( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K412, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, K412, K413, K414, K415 } \ +} + +/* ISO with small backspace and 1u keys in the bottom row + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_iso_1u_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K412, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, K412, K413, K414, K415 } \ +} + +/* **************************************************************************************************************************************** */ +/* ISO with 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_iso_7u( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, ____, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ISO with small backspace and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------------------------------' + */ + +#define LAYOUT_iso_7u_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, ____, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} +/* **************************************************************************************************************************************** */ +/* ISO with blocker + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------- -------------------' + */ + +#define LAYOUT_iso_blocker( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* ISO with blocker and small backspace + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | + * `------' `-------------------------------------------------------------------------- -------------------' + */ + +#define LAYOUT_iso_blocker_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K411, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, K411, ____, K413, K414, K415 } \ +} + +/* **************************************************************************************************************************************** */ +/* ISO with blocker and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `--------------------------------------------------------------------------- ------------------' + */ + +#define LAYOUT_iso_blocker_7u( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, ____, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, ____, ____, K413, K414, K415 } \ +} + +/* ISO with blocker and small backspace and 7u spacebar + * ,------. ,-------------------------------------------------------------------------------------------------. + * | | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + | | | | | | | | | | | | | | | | | | + * |------| |------------------------------------------------------------------------------------ |-----| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | | | | | | | + * |------| |-------------------------------------------------------------------------------------------------| + * | | | | | | | | | | | | + * `------' `--------------------------------------------------------------------------- ------------------' + */ + +#define LAYOUT_iso_blocker_7u_small_bspc( \ +K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K013, K214, K015, \ +K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K115, \ +K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K114, K213, K215, \ +K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \ +K400, K401, K402, K403, K407, K410, K413, K414, K415 \ +) { \ +{ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015 }, \ +{ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \ +{ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215 }, \ +{ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \ +{ K400, K401, K402, K403, ____, ____, ____, K407, ____, ____, K410, ____, ____, K413, K414, K415 } \ +} +#endif From a90331aec21a47ef3a9fe47425c9c7204bc768b5 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 1 Dec 2018 16:28:32 -0800 Subject: [PATCH 496/505] handwired/ortho5x13 default keymap refactor, Configurator support, and readme update (#4525) * handwired/ortho5x13: default keymap refactor - keymap now uses LAYOUT macro - keymap now uses #include QMK_KEYBOARD_H - removed redundant KC_TRNS and KC_NO definitions * handwired/ortho5x13: Configurator support * handwired/ortho5x13: fix Docs links in readme --- keyboards/handwired/ortho5x13/info.json | 77 ++++++ .../ortho5x13/keymaps/default/keymap.c | 237 +++++++++--------- keyboards/handwired/ortho5x13/readme.md | 2 +- 3 files changed, 192 insertions(+), 124 deletions(-) create mode 100644 keyboards/handwired/ortho5x13/info.json diff --git a/keyboards/handwired/ortho5x13/info.json b/keyboards/handwired/ortho5x13/info.json new file mode 100644 index 000000000000..15a65081a166 --- /dev/null +++ b/keyboards/handwired/ortho5x13/info.json @@ -0,0 +1,77 @@ +{ + "keyboard_name": "ortho5x13", + "url": "", + "maintainer": "qmk", + "width": 13, + "height": 6, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"1", "x":1, "y":0}, + {"label":"2", "x":2, "y":0}, + {"label":"3", "x":3, "y":0}, + {"label":"4", "x":4, "y":0}, + {"label":"5", "x":5, "y":0}, + {"label":"6", "x":6, "y":0}, + {"label":"7", "x":7, "y":0}, + {"label":"8", "x":8, "y":0}, + {"label":"9", "x":9, "y":0}, + {"label":"0", "x":10, "y":0}, + {"label":"-", "x":11, "y":0}, + {"label":"=", "x":12, "y":0}, + {"label":"Tab", "x":0, "y":1}, + {"label":"Q", "x":1, "y":1}, + {"label":"W", "x":2, "y":1}, + {"label":"E", "x":3, "y":1}, + {"label":"R", "x":4, "y":1}, + {"label":"T", "x":5, "y":1}, + {"label":"Y", "x":6, "y":1}, + {"label":"U", "x":7, "y":1}, + {"label":"I", "x":8, "y":1}, + {"label":"O", "x":9, "y":1}, + {"label":"P", "x":10, "y":1}, + {"label":"[", "x":11, "y":1}, + {"label":"]", "x":12, "y":1}, + {"label":"`", "x":0, "y":2}, + {"label":"A", "x":1, "y":2}, + {"label":"S", "x":2, "y":2}, + {"label":"D", "x":3, "y":2}, + {"label":"F", "x":4, "y":2}, + {"label":"G", "x":5, "y":2}, + {"label":"H", "x":6, "y":2}, + {"label":"J", "x":7, "y":2}, + {"label":"K", "x":8, "y":2}, + {"label":"L", "x":9, "y":2}, + {"label":";", "x":10, "y":2}, + {"label":",", "x":11, "y":2}, + {"label":"\\", "x":12, "y":2}, + {"label":"Shift", "x":0, "y":3}, + {"label":"Z", "x":1, "y":3}, + {"label":"X", "x":2, "y":3}, + {"label":"C", "x":3, "y":3}, + {"label":"V", "x":4, "y":3}, + {"label":"B", "x":5, "y":3}, + {"label":"N", "x":6, "y":3}, + {"label":"M", "x":7, "y":3}, + {"label":",", "x":8, "y":3}, + {"label":".", "x":9, "y":3}, + {"label":"/", "x":10, "y":3}, + {"label":"Enter", "x":11, "y":3}, + {"label":"Up", "x":12, "y":3}, + {"label":"Hyper", "x":0, "y":4}, + {"label":"Ctrl", "x":1, "y":4}, + {"label":"Alt", "x":2, "y":4}, + {"label":"GUI", "x":3, "y":4}, + {"label":"Lower", "x":4, "y":4}, + {"label":"Space", "x":5, "y":4, "w":2}, + {"label":"Raise", "x":7, "y":4}, + {"label":"Backspace", "x":8, "y":4}, + {"label":"Shift", "x":9, "y":4}, + {"label":"Left", "x":10, "y":4}, + {"label":"Right", "x":11, "y":4}, + {"label":"Down", "x":12, "y":4} + ] + } + } +} diff --git a/keyboards/handwired/ortho5x13/keymaps/default/keymap.c b/keyboards/handwired/ortho5x13/keymaps/default/keymap.c index 0d5d0c430b3a..0c8bbb055ea0 100644 --- a/keyboards/handwired/ortho5x13/keymaps/default/keymap.c +++ b/keyboards/handwired/ortho5x13/keymaps/default/keymap.c @@ -1,9 +1,4 @@ -#include "ortho5x13.h" -#include "action_layer.h" -#include "eeconfig.h" -#ifdef AUDIO_ENABLE - #include "audio.h" -#endif +#include QMK_KEYBOARD_H // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. @@ -25,146 +20,142 @@ enum custom_keycodes { 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 + /* 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] = LAYOUT( + //,--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------. + 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_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_GRV ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,KC_QUOT ,KC_BSLS , + //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------| + 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_UP , + //|--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+--------+--------| + KC_HYPR ,KC_LCTL ,KC_LALT ,KC_LGUI ,KC_L1 , KC_SPC ,KC_L2 ,KC_BSPC ,KC_RSFT ,KC_LEFT ,KC_RGHT ,KC_DOWN + //`--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+--------+--------' + ), + +/* Colemak * ,------------------------------------------------------------------------------------------. - * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | + * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | | * |------+------+------+------+------+------+------+------+------+------+------+------+------| - * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | + * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del | | * |------+------+------+------+------+-------------+------+------+------+------+------+------| - * | ` | A | S | D | F | G | H | J | K | L | ; | ' | \ | + * | Esc | A | R | S | T | D | H | N | E | I | O | " | | * |------+------+------+------+------+------|------+------+------+------+------+------+------| - * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | Up | + * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | | * |------+------+------+------+------+------+------+------+------+------+------+------+------| - * | Hyper| Ctrl | Alt | GUI |Lower | Space |Raise | Bksp |Shift | Left | Down |Right | + * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | | * `------------------------------------------------------------------------------------------' */ -[_QWERTY] = LAYOUT_compact( - //,----+----+----+----+----+----+----+----+----+----+----+----+----. - 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} -}, +[_COLEMAK] = LAYOUT( + 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, 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 | - * `-----------------------------------------------------------------------------------' + * ,------------------------------------------------------------------------------------------. + * | ` | 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} -}, +[_DVORAK] = LAYOUT( + 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, 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 | - * `-----------------------------------------------------------------------------------' + * ,------------------------------------------------------------------------------------------. + * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | 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} -}, +[_LOWER] = LAYOUT( + 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 | - * `-----------------------------------------------------------------------------------' + * ,------------------------------------------------------------------------------------------. + * | ` | 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} -}, +[_RAISE] = LAYOUT( + 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| | | | | | | | - * |------+------+------+------+------+------+------+------+------+------+------+------| - * | | | | | | | | | | | | - * `-----------------------------------------------------------------------------------' + * ,------------------------------------------------------------------------------------------. + * | 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, _______, _______, _______, _______, _______}, - {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} -} +[_ADJUST] = LAYOUT( + 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, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ +) }; @@ -286,4 +277,4 @@ void music_scale_user(void) PLAY_SONG(music_scale); } -#endif \ No newline at end of file +#endif diff --git a/keyboards/handwired/ortho5x13/readme.md b/keyboards/handwired/ortho5x13/readme.md index 7241ddae8a80..444cfec96e9b 100644 --- a/keyboards/handwired/ortho5x13/readme.md +++ b/keyboards/handwired/ortho5x13/readme.md @@ -10,4 +10,4 @@ Make example for this keyboard (after setting up your build environment): make handwired/ortho5x13:default -See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. \ No newline at end of file +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). From 064d9e21750e8c717aca5f79263ad93b6606e125 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 1 Dec 2018 16:29:16 -0800 Subject: [PATCH 497/505] handwired/promethium Refactor and Configurator support (#4524) * handwired/promethium: refactor - config.h files - updated to use #pragma once - removed redundant config.h includes - layout macro moved from config.h to promethium.h - layout macro renamed from KEYMAP_CUSTOM to LAYOUT * handwired/promethium: Configurator support --- keyboards/handwired/promethium/config.h | 27 +------- keyboards/handwired/promethium/info.json | 68 +++++++++++++++++++ .../promethium/keymaps/default/config.h | 7 +- .../promethium/keymaps/default/keymap.c | 30 ++++---- .../promethium/keymaps/priyadi/config.h | 7 +- .../promethium/keymaps/priyadi/keymap.c | 30 ++++---- keyboards/handwired/promethium/promethium.h | 19 ++++++ 7 files changed, 120 insertions(+), 68 deletions(-) create mode 100644 keyboards/handwired/promethium/info.json diff --git a/keyboards/handwired/promethium/config.h b/keyboards/handwired/promethium/config.h index ea5f2b76e8c9..dca0aec2e4e9 100644 --- a/keyboards/handwired/promethium/config.h +++ b/keyboards/handwired/promethium/config.h @@ -15,8 +15,7 @@ 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 +#pragma once #include "config_common.h" @@ -159,27 +158,6 @@ along with this program. If not, see . #define MAX_VOLTAGE 4.2 #define MIN_VOLTAGE 3.2 -#define ___ KC_NO - -#define KEYMAP_CUSTOM( \ - k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \ - k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, \ - k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, \ - k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, \ - tp1, tp2, tp3 \ -) \ -{ \ - {k11, k12, k13, k14, k15, k16}, \ - {k21, k22, k23, k24, k25, k26}, \ - {k31, k32, k33, k34, k35, k36}, \ - {k41, k42, k43, k44, k45, k46}, \ - {k17, k18, k19, k1a, k1b, k1c}, \ - {k27, k28, k29, k2a, k2b, k2c}, \ - {k37, k38, k39, k3a, k3b, k3c}, \ - {k47, k48, k49, k4a, k4b, k4c}, \ - {tp1, tp2, tp3, ___, ___, ___} \ -} - #ifndef __ASSEMBLER__ // assembler doesn't like enum in .h file enum led_sequence { LED_IND_LINUX, @@ -351,6 +329,3 @@ enum led_sequence { #define PS2_USART_ERROR (UCSR1A & ((1< Date: Sat, 1 Dec 2018 17:19:33 -0800 Subject: [PATCH 498/505] Keyboard: Add HHKB layout support to the DO60 (#4526) * add 60_hhkb support * add qmk configurator support for the new 60_hhkb layout * allow community layout support for the 60_hhkb * fixup readme to adhere to new QMK standards --- keyboards/do60/do60.h | 14 ++++++++++++++ keyboards/do60/info.json | 4 ++++ keyboards/do60/readme.md | 17 ++++++++++------- keyboards/do60/rules.mk | 2 +- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/keyboards/do60/do60.h b/keyboards/do60/do60.h index 30615d1d3dd0..8ee90220415c 100644 --- a/keyboards/do60/do60.h +++ b/keyboards/do60/do60.h @@ -39,6 +39,20 @@ inline void setdefaultrgb(void){ rgblight_sethsv(100,100,100); } { K40, K41, K42, KC_NO,KC_NO,K45, K46, K47, KC_NO,KC_NO,K4A, K4B, K4C, K4D, K4E } \ } +#define LAYOUT_60_hhkb( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2E, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3E, \ + K41, K42, K46, K4A, K4B \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, KC_NO, K1E }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, KC_NO, K2E }, \ + { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, K3E }, \ + { KC_NO, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, KC_NO, KC_NO, KC_NO } \ +} + #define LAYOUT_60_ansi( \ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0E, \ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, \ diff --git a/keyboards/do60/info.json b/keyboards/do60/info.json index 6acfa08ef18b..4c98bd851334 100644 --- a/keyboards/do60/info.json +++ b/keyboards/do60/info.json @@ -9,6 +9,10 @@ "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"~", "x":13, "y":0}, {"label":"\u2190", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":2, "w":1.25}, {"label":"Shift", "x":0, "y":3}, {"x":1, "y":3}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"x":12, "y":3}, {"label":"\u2191", "x":13, "y":3}, {"label":"Del", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"label":"3u(Space)", "x":3.75, "y":4, "w":2.75}, {"x":6.5, "y":4}, {"label":"3u(Space)", "x":7.5, "y":4, "w":2.25}, {"label":"Alt", "x":9.75, "y":4, "w":1.25}, {"label":"win", "x":11, "y":4}, {"label":"\u2190", "x":12, "y":4}, {"label":"\u2193", "x":13, "y":4}, {"label":"\u2192", "x":14, "y":4}] }, + "LAYOUT_60_hhkb": { + "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"|", "x":13, "y":0}, {"label":"~", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Delete", "x":13.5, "y":1, "w":1.5}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"Fn", "x":14, "y":3}, {"label":"Os", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Os", "x":12.5, "y":4}] + }, + "LAYOUT_chiwi60_default": { "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"~", "x":13, "y":0}, {"label":"\u2190", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3, "w":1.75}, {"label":"\u2191", "x":13, "y":3}, {"label":"Del", "x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"label":"3u(Space)", "x":3.75, "y":4, "w":3}, {"label":"3u(Space)", "x":6.75, "y":4, "w":3}, {"label":"Alt", "x":9.75, "y":4, "w":1.25}, {"label":"win", "x":11, "y":4}, {"label":"\u2190", "x":12, "y":4}, {"label":"\u2193", "x":13, "y":4}, {"label":"\u2192", "x":14, "y":4}] }, diff --git a/keyboards/do60/readme.md b/keyboards/do60/readme.md index fce7c922c547..c4122361f23b 100644 --- a/keyboards/do60/readme.md +++ b/keyboards/do60/readme.md @@ -1,11 +1,14 @@ -# QMK Firmware for DoyuStudio DO60 PCB +# DoyuStudio DO60 PCB +60% board supporting in-switch LEDs (two-pin, single colour) +Build-in WS2182 RGB LED for underglow lighting. -## Quantum MK Firmware -For the full Quantum feature list, see [the parent readme.md](/readme.md). +Keyboard Maintainer: QMK Community +Hardware Supported: Doyu Studios 60% PCB +Hardware Availability: [Doyustudio](https://shopkey.doyustudio.com/001pcb60) -Board supports in-switch LEDs (two-pin, single colour) -Build-in WS2182 RGB LED for underglow lighting. +Make example for this keyboard (after setting up your build environment): + + make do60:default -## Build -To build the default keymap, simply run `make do60:default`. \ No newline at end of file +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). \ No newline at end of file diff --git a/keyboards/do60/rules.mk b/keyboards/do60/rules.mk index 8003914fa70c..7370a6262e86 100644 --- a/keyboards/do60/rules.mk +++ b/keyboards/do60/rules.mk @@ -63,4 +63,4 @@ RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend UNICODE_ENABLE = no # Unicode -LAYOUTS = 60_ansi 60_ansi_split_bs_rshift \ No newline at end of file +LAYOUTS = 60_ansi 60_hhkb 60_ansi_split_bs_rshift \ No newline at end of file From 0db6bb10e0b2810d306d37ef7342b22a43f4bdf9 Mon Sep 17 00:00:00 2001 From: MechMerlin <30334081+mechmerlin@users.noreply.github.com> Date: Sat, 1 Dec 2018 17:28:35 -0800 Subject: [PATCH 499/505] Keyboard: Enable Lights by Default for Kira 75 (#4527) * enable rgb underglow and backlights by default for use with QMK Configurator * disable mousekeys --- keyboards/kira75/rules.mk | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/keyboards/kira75/rules.mk b/keyboards/kira75/rules.mk index 45eb6ee3766f..610410ae4ca9 100644 --- a/keyboards/kira75/rules.mk +++ b/keyboards/kira75/rules.mk @@ -52,7 +52,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 # change yes to no to disable # 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 = yes # Console for debug(+400) COMMAND_ENABLE = yes # Commands for debug and configuration @@ -60,7 +60,8 @@ COMMAND_ENABLE = yes # Commands for debug and configuration 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 +BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default +RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow 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 From dbc776168842439718334aa120f1afcbee9a96d9 Mon Sep 17 00:00:00 2001 From: noroadsleft <18669334+noroadsleft@users.noreply.github.com> Date: Sat, 1 Dec 2018 23:22:40 -0800 Subject: [PATCH 500/505] Keyboard: handwired/atreus50 Refactor, Configurator support, and readme cleanup (#4530) * handwired/atreus50: refactor - layout macro renames: - KEYMAP is now LAYOUT - COMPACT_KEYMAP is now LAYOUT_kc - keymap updates: - both keymaps now use #include QMK_KEYBOARD_H - removed redundant KC_TRNS and KC_NO definitions - default keymap now uses LAYOUT macro instead of LAYOUT_kc * handwired/atreus50: readme cleanup Reformatted the readme to be more closely aligned to current QMK template, and fixed some typos/grammar. * handwired/atreus50: Configurator support --- keyboards/handwired/atreus50/atreus50.h | 4 +- keyboards/handwired/atreus50/info.json | 70 +++++++++++ .../atreus50/keymaps/ajp10304/keymap.c | 34 +++--- .../atreus50/keymaps/default/keymap.c | 109 ++++++------------ keyboards/handwired/atreus50/readme.md | 18 ++- 5 files changed, 134 insertions(+), 101 deletions(-) create mode 100644 keyboards/handwired/atreus50/info.json diff --git a/keyboards/handwired/atreus50/atreus50.h b/keyboards/handwired/atreus50/atreus50.h index de06f255e8e5..eb31ca1b8e66 100644 --- a/keyboards/handwired/atreus50/atreus50.h +++ b/keyboards/handwired/atreus50/atreus50.h @@ -5,7 +5,7 @@ // The first section contains all of the arguements // The second converts the arguments into a two-dimensional array -#define KEYMAP( \ +#define LAYOUT( \ 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, \ @@ -18,7 +18,7 @@ { k30, k31, k32, k33, k34, k35, km1, k36, k37, k38, k39, k3a, k3b } \ } -#define COMPACT_KEYMAP( \ +#define LAYOUT_kc( \ 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, \ diff --git a/keyboards/handwired/atreus50/info.json b/keyboards/handwired/atreus50/info.json new file mode 100644 index 000000000000..4e3b4ac49735 --- /dev/null +++ b/keyboards/handwired/atreus50/info.json @@ -0,0 +1,70 @@ +{ + "keyboard_name": "Atreus50", + "url": "", + "maintainer": "qmk", + "width": 15, + "height": 4.5, + "layouts": { + "LAYOUT": { + "layout": [ + {"label":"Tab", "x":0, "y":0.5}, + {"label":"Q", "x":1, "y":0.5}, + {"label":"W", "x":2, "y":0.25}, + {"label":"E", "x":3, "y":0}, + {"label":"R", "x":4, "y":0.25}, + {"label":"T", "x":5, "y":0.5}, + + {"label":"Y", "x":9, "y":0.5}, + {"label":"U", "x":10, "y":0.25}, + {"label":"I", "x":11, "y":0}, + {"label":"O", "x":12, "y":0.25}, + {"label":"P", "x":13, "y":0.5}, + {"label":"-", "x":14, "y":0.5}, + + {"label":"Ctrl/Esc", "x":0, "y":1.5}, + {"label":"A", "x":1, "y":1.5}, + {"label":"S", "x":2, "y":1.25}, + {"label":"D", "x":3, "y":1}, + {"label":"F", "x":4, "y":1.25}, + {"label":"G", "x":5, "y":1.5}, + + {"label":"H", "x":9, "y":1.5}, + {"label":"J", "x":10, "y":1.25}, + {"label":"K", "x":11, "y":1}, + {"label":"L", "x":12, "y":1.25}, + {"label":";", "x":13, "y":1.5}, + {"label":"'", "x":14, "y":1.5}, + + {"label":"LShift", "x":0, "y":2.5}, + {"label":"Z", "x":1, "y":2.5}, + {"label":"X", "x":2, "y":2.25}, + {"label":"C", "x":3, "y":2}, + {"label":"V", "x":4, "y":2.25}, + {"label":"B", "x":5, "y":2.5}, + + {"label":"N", "x":9, "y":2.5}, + {"label":"M", "x":10, "y":2.25}, + {"label":",", "x":11, "y":2}, + {"label":".", "x":12, "y":2.25}, + {"label":"/", "x":13, "y":2.5}, + {"label":"Shift/Enter", "x":14, "y":2.5}, + + {"label":"`", "x":0, "y":3.5}, + {"label":"LCtrl", "x":1, "y":3.5}, + {"label":"LAlt", "x":2, "y":3.25}, + {"label":"LGUI", "x":3, "y":3}, + {"label":"Lower", "x":4, "y":3.25}, + {"label":"Space", "x":5, "y":3.5}, + {"label":"Fn", "x":6, "y":2.75, "h":1.5}, + + {"label":"RShift", "x":8, "y":2.75, "h":1.5}, + {"label":"Back Space", "x":9, "y":3.5}, + {"label":"Raise", "x":10, "y":3.25}, + {"label":"Left", "x":11, "y":3}, + {"label":"Down", "x":12, "y":3.25}, + {"label":"Up", "x":13, "y":3.5}, + {"label":"Right", "x":14, "y":3.5} + ] + } + } +} diff --git a/keyboards/handwired/atreus50/keymaps/ajp10304/keymap.c b/keyboards/handwired/atreus50/keymaps/ajp10304/keymap.c index 5b13224b0bbb..1e53d050b0bd 100644 --- a/keyboards/handwired/atreus50/keymaps/ajp10304/keymap.c +++ b/keyboards/handwired/atreus50/keymaps/ajp10304/keymap.c @@ -1,6 +1,4 @@ -#include "atreus50.h" -#include "action_layer.h" -#include "eeconfig.h" +#include QMK_KEYBOARD_H #include "keymap_uk.h" extern keymap_config_t keymap_config; @@ -37,10 +35,6 @@ enum planck_keycodes { #include "dynamic_macro.h" -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Qwerty @@ -54,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Fn | Ctrl | Alt | GUI |Lower | Bksp | Ctrl | Alt |Space |Raise | Shift| MENU | Ctrl | Fn2 | * `-------------------------------------------------------------------------------------------------' */ -[_QWERTY] = KEYMAP( +[_QWERTY] = LAYOUT( KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC , MT(MOD_LSFT, KC_TAB), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, MT(MOD_RSFT, KC_ENT) , KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSHIFT , @@ -72,7 +66,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Fn | Ctrl | Alt | GUI |Lower | Bksp | Ctrl | Alt |Space |Mouse | MENU | Alt | Ctrl | Fn | * `-------------------------------------------------------------------------------------------------' */ -[_FUNC] = KEYMAP( +[_FUNC] = LAYOUT( 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_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, UK_TILD, KC_INSERT , KC_LSHIFT, KC_NONUS_BSLASH, KC_GRAVE, KC_NONUS_HASH, KC_PAST, KC_MINS, KC_EQL, KC_BSLASH, KC_LBRC, KC_RBRC, KC_QUOT, MT(MOD_RSFT, KC_ENT) , @@ -90,7 +84,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | |Lower | Del | Ctrl | Alt |Space | | Next | Vol- | Vol+ | Play | * `-------------------------------------------------------------------------------------------------' */ -[_LOWER] = KEYMAP( +[_LOWER] = LAYOUT( KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, KC_BSPC , LSFT(KC_1), LSFT(KC_2), LSFT(KC_3), LSFT(KC_4), LSFT(KC_5), LSFT(KC_6), LSFT(KC_7), LSFT(KC_8), LSFT(KC_9), LSFT(KC_0), LCTL(KC_DEL), LCTL(KC_BSPC) , KC_LSPO, KC_NONUS_BSLASH, KC_GRAVE, KC_NONUS_HASH, KC_QUOT, KC_MINS, KC_EQL, KC_NONUS_HASH, KC_LBRC, KC_RBRC, KC_QUOT, MT(MOD_RSFT, KC_ENT) , @@ -108,7 +102,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | Mouse| | | | | Alt | Ctrl | Alt |Enter |Raise | | | | | * `-------------------------------------------------------------------------------------------------' */ -[_RAISE] = KEYMAP( +[_RAISE] = LAYOUT( KC_GRV, XXXXXXX, M(1), KC_LBRC, KC_RBRC, XXXXXXX, XXXXXXX, KC_PGUP, KC_HOME, KC_PGDOWN, XXXXXXX, KC_PSCREEN , KC_GRV, XXXXXXX, XXXXXXX, LSFT(KC_9), LSFT(KC_0), XXXXXXX, XXXXXXX, KC_HOME, KC_UP, KC_END, XXXXXXX, LCTL(LSFT(KC_EQL)) , _______, XXXXXXX, XXXXXXX, LSFT(KC_LBRC), LSFT(KC_RBRC), XXXXXXX, LCTL(KC_LEFT), KC_LEFT, KC_DOWN, KC_RIGHT, LCTL(KC_RIGHT), LCTL(KC_MINS) , @@ -126,11 +120,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | | | * `-------------------------------------------------------------------------------------------------' */ -[_ADJUST] = KEYMAP( +[_ADJUST] = LAYOUT( M(0), RESET, QWERTY, _______, _______, DYN_REC_START1, DYN_REC_START2, _______, _______, _______, _______, KC_DEL , KC_CAPS, _______, _______, _______, _______, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, KC_AUDIO_MUTE, KC_AUDIO_VOL_UP, KC_MEDIA_PLAY_PAUSE, _______, _______ , TG(_MAC), _______, _______, _______, _______, DYN_REC_STOP, DYN_REC_STOP, KC_MEDIA_PREV_TRACK, KC_AUDIO_VOL_DOWN, KC_MEDIA_NEXT_TRACK, _______, _______ , - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), /* Mouse @@ -144,7 +138,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | | | * `-------------------------------------------------------------------------------------------------' */ -[_MOUSE] = KEYMAP( +[_MOUSE] = LAYOUT( KC_ESC , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, _______, _______, _______, _______, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, _______, _______ , KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, _______, _______, _______, _______, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, _______, _______ , @@ -162,42 +156,42 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | | | * `-------------------------------------------------------------------------------------------------' */ -[_FUNC2] = KEYMAP( +[_FUNC2] = LAYOUT( _______, _______, M(1), _______, _______, _______, M(5), _______, _______, _______, _______, _______, _______, _______, M(3), M(7), _______, _______, _______, M(10), _______, _______, _______, _______, _______, LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V), _______, _______, _______, _______, _______, _______, M(98) , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -[_MAC] = KEYMAP( +[_MAC] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, MFNC, _______, _______, _______, MLWR, _______, _______, _______, _______, MRSE, _______, _______, _______, MFNC2 ), -[_MLWR] = KEYMAP( +[_MLWR] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -[_MRSE] = KEYMAP( +[_MRSE] = LAYOUT( _______, _______, M(2), _______, _______, _______, _______, _______, _______, _______, _______, _______ , _______, _______, _______, _______, _______, _______, _______, LCTL(KC_A), _______, LCTL(KC_E), _______, LGUI(KC_EQL) , _______, _______, _______, _______, _______, _______, LALT(KC_LEFT), _______, _______, _______, LALT(KC_RIGHT), LGUI(KC_MINS) , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -[_MFNC] = KEYMAP( +[_MFNC] = LAYOUT( _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, LGUI(KC_PENT) , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ), -[_MFNC2] = KEYMAP( +[_MFNC2] = LAYOUT( _______, _______, M(2), _______, _______, _______, M(6), _______, _______, _______, _______, _______, _______, _______, M(4), M(8), _______, _______, _______, M(10), _______, _______, _______, _______, _______, LGUI(KC_Z), LGUI(KC_X), LGUI(KC_C), LGUI(KC_V), _______, _______, _______, _______, _______, _______, M(99) , diff --git a/keyboards/handwired/atreus50/keymaps/default/keymap.c b/keyboards/handwired/atreus50/keymaps/default/keymap.c index 21d91a8797e3..97b90a6db6ea 100644 --- a/keyboards/handwired/atreus50/keymaps/default/keymap.c +++ b/keyboards/handwired/atreus50/keymaps/default/keymap.c @@ -1,9 +1,4 @@ -#include "atreus50.h" -#include "action_layer.h" -#include "eeconfig.h" -#ifdef AUDIO_ENABLE - #include "audio.h" -#endif +#include QMK_KEYBOARD_H // Each layer gets a name for readability, which is then used in the keymap matrix below. // The underscores don't mean anything - you can have a layer called STUFF or any other name. @@ -28,86 +23,52 @@ enum custom_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 +#define X0 MT(MOD_LCTL, KC_ESC) // Hold for Left Ctrl, Tap for ESC +#define X3 MO(_MOVEMENT) +#define X4 MT(MOD_LSFT, KC_ENT) // Hold for Left Shift, Tap for Enter const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [_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 - //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + [_QWERTY] = LAYOUT( + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, + X0, 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, X4, + KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, X3, 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 - //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + [_COLEMAK] = LAYOUT( + KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_MINS, + X0, 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, X4, + KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, X3, 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 , T , 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 - //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + [_DVORAK] = LAYOUT( + KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_MINS, + X0, 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, X4, + KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, X3, KC_RSFT, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT ), - [_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 - //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + [_LOWER] = LAYOUT( + 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, KC_END, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, 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 - //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + [_RAISE] = LAYOUT( + 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] = 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 - //`----+----+----+----+----+----+----+----+----+----+----+----+----+----' + [_MOVEMENT] = LAYOUT( + KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, 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_RGHT, KC_RCBR, KC_PIPE, + _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_END, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, KC_PGUP, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY ), /* Adjust (Lower + Raise) @@ -121,7 +82,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * | | | | | | | | | | | | | | | * `-------------------------------------------------------------------------------------------------' */ - [_ADJUST] = KEYMAP( \ + [_ADJUST] = LAYOUT( \ _______, 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, _______, _______, _______, _______, _______, \ diff --git a/keyboards/handwired/atreus50/readme.md b/keyboards/handwired/atreus50/readme.md index 0c24f67db2ce..9449d66e5b39 100644 --- a/keyboards/handwired/atreus50/readme.md +++ b/keyboards/handwired/atreus50/readme.md @@ -1,7 +1,9 @@ -Handwired Atreus50 -================== +# Handwired Atreus50 -This firmware is for a Handwired Atreus50 using an Arduino Pro Micro. +This firmware is for a handwired Atreus50 using an Arduino Pro Micro. + +Keyboard Maintainer: [The QMK Community](https://github.com/qmk) +Hardware Supported: Arduino Pro Micro ## Pinout @@ -11,6 +13,12 @@ The following pins are used: ## Compiling and loading the firmware -To build the firmware, run `make`. +Make example for this keyboard (after setting up your build environment): + + make handwired/atreus50:default + +To flash the firmware onto the microcontroller, run `make avrdude`, and press the reset button. + + make handwired/atreus50:default:avrdude -To flash the firemware onto the microcontroller, run `make avrdude`, and press the reset button. +See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). From d5a06aec8386ef16e0751572c5182410b8d348f7 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sun, 2 Dec 2018 15:12:54 -0500 Subject: [PATCH 501/505] Second try at configuring i18n for docsify and gitbook (#4531) * add zh-cn readme * edit readme * Round 1 of edits - Mandarin translation of QMK products is off, best to use the English name. - Fix some terminology and grammar. * trying re-translating the first paragraph * add fallback langurages * Create LANGS.md * Rename docs/zh-cn/README.md to docs/zh/README.md * Update LANGS.md * Update index.html --- docs/LANGS.md | 4 ++++ docs/index.html | 3 ++- docs/zh/README.md | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 docs/LANGS.md create mode 100644 docs/zh/README.md diff --git a/docs/LANGS.md b/docs/LANGS.md new file mode 100644 index 000000000000..4b48f2d3d891 --- /dev/null +++ b/docs/LANGS.md @@ -0,0 +1,4 @@ +# Languages + +* [English](/) +* [Chinese](zh/) diff --git a/docs/index.html b/docs/index.html index f0b1fae07e78..f5aa92b531c2 100644 --- a/docs/index.html +++ b/docs/index.html @@ -25,7 +25,8 @@ placeholder: 'Search Documentation...', noData: 'We could not find any documents matching your search.', depth: 6 - } + }, + fallbackLanguages: ['zh'] } diff --git a/docs/zh/README.md b/docs/zh/README.md new file mode 100644 index 000000000000..bb9d1371f1e1 --- /dev/null +++ b/docs/zh/README.md @@ -0,0 +1,32 @@ +# QMK鍵盤固件 + +[![當前版本](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags) +[![築邦](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/qmk/qmk_firmware) +[![不和諧](https://img.shields.io/discord/440868230475677696.svg)](https://discord.gg/Uq7gcHh) +[![文檔狀態](https://img.shields.io/badge/docs-ready-orange.svg)](https://docs.qmk.fm) +[![GitHub的貢獻者](https://img.shields.io/github/contributors/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/pulse/monthly) +[![GitHub的叉](https://img.shields.io/github/forks/qmk/qmk_firmware.svg?style=social&label=Fork)](https://github.com/qmk/qmk_firmware/) + +## 什麼是QMK固件? + +QMK是一個由社群維護的開源鍵盤韌體,其中包含了QMK Toolbox、qmk.fm和其它文件。QMK韌體是以[tmk\_keyboard](http://github.com/tmk/tmk_keyboard)為基礎,讓一些有用的功能在Atmel AVR控制器實現,使用於[OLKB](https://olkb.com)、[ergodox EZ](http://www.ergodox-ez.com),和[Clueboard](http://clueboard.co/)的產品中。它也被移植到使用ChibiOS的ARM晶片上。你也可以用它來讓你徒手佈線,或是客製的鍵盤PCB發揮功能。 + +## 如何得到QMK + +如果你打算貢獻鍵盤佈局,鍵盤或功能QMK,最容易做的事情是[叉通過Github上爬行](https://github.com/qmk/qmk_firmware#fork-destination-box),和克隆你爬在本地進行更改,推動他們,然後打開從你的叉子[拉請求](https://github.com/qmk/qmk_firmware/pulls)。 + +否則,您可以直接下載([拉鍊](https://github.com/qmk/qmk_firmware/zipball/master) [焦油](https://github.com/qmk/qmk_firmware/tarball/master)),或者通過GIT中克隆它(`git@github.com:qmk/qmk_firmware.git`)或HTTP(`https://github.com/qmk/qmk_firmware.git`)。 + +## 如何編譯 + +你可以編譯之前,你需要[安裝環境](getting_started_build_tools.md)用於AVR或/和ARM開發。一旦完成,你會使用`make`命令建立一個鍵盤並用以下符號鍵盤佈局 + + make planck/rev4:default + +這將建立`rev4` `planck`的修訂與`default`鍵盤映射。並非所有鍵盤有一個修訂版(也稱為子項目或文件夾),在這種情況下,它可以被省略: + + make preonic:default + +## 如何赶近 + +QMK有很多[特點](features.md)探索和很好的協議[參考文獻](http://docs.qmk.fm)挖通的。大部分功能通過修改[鍵盤映射(keymap.md),並改變[鍵碼](keycodes.md)冤大頭。 From 5d47231f2a9353645aab07e14c1de21f00b7fc2f Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sun, 2 Dec 2018 15:35:53 -0500 Subject: [PATCH 502/505] Add sidebar for ZH (#4533) * add zh-cn readme * edit readme * Round 1 of edits - Mandarin translation of QMK products is off, best to use the English name. - Fix some terminology and grammar. * trying re-translating the first paragraph * add fallback langurages * Create LANGS.md * Rename docs/zh-cn/README.md to docs/zh/README.md * Update LANGS.md * Update index.html * Delete README.md * add sidebar for zh --- docs/zh-cn/README.md | 32 -------------- docs/zh/_sidebar.md | 99 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 32 deletions(-) delete mode 100644 docs/zh-cn/README.md create mode 100644 docs/zh/_sidebar.md diff --git a/docs/zh-cn/README.md b/docs/zh-cn/README.md deleted file mode 100644 index bb9d1371f1e1..000000000000 --- a/docs/zh-cn/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# QMK鍵盤固件 - -[![當前版本](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags) -[![築邦](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/qmk/qmk_firmware) -[![不和諧](https://img.shields.io/discord/440868230475677696.svg)](https://discord.gg/Uq7gcHh) -[![文檔狀態](https://img.shields.io/badge/docs-ready-orange.svg)](https://docs.qmk.fm) -[![GitHub的貢獻者](https://img.shields.io/github/contributors/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/pulse/monthly) -[![GitHub的叉](https://img.shields.io/github/forks/qmk/qmk_firmware.svg?style=social&label=Fork)](https://github.com/qmk/qmk_firmware/) - -## 什麼是QMK固件? - -QMK是一個由社群維護的開源鍵盤韌體,其中包含了QMK Toolbox、qmk.fm和其它文件。QMK韌體是以[tmk\_keyboard](http://github.com/tmk/tmk_keyboard)為基礎,讓一些有用的功能在Atmel AVR控制器實現,使用於[OLKB](https://olkb.com)、[ergodox EZ](http://www.ergodox-ez.com),和[Clueboard](http://clueboard.co/)的產品中。它也被移植到使用ChibiOS的ARM晶片上。你也可以用它來讓你徒手佈線,或是客製的鍵盤PCB發揮功能。 - -## 如何得到QMK - -如果你打算貢獻鍵盤佈局,鍵盤或功能QMK,最容易做的事情是[叉通過Github上爬行](https://github.com/qmk/qmk_firmware#fork-destination-box),和克隆你爬在本地進行更改,推動他們,然後打開從你的叉子[拉請求](https://github.com/qmk/qmk_firmware/pulls)。 - -否則,您可以直接下載([拉鍊](https://github.com/qmk/qmk_firmware/zipball/master) [焦油](https://github.com/qmk/qmk_firmware/tarball/master)),或者通過GIT中克隆它(`git@github.com:qmk/qmk_firmware.git`)或HTTP(`https://github.com/qmk/qmk_firmware.git`)。 - -## 如何編譯 - -你可以編譯之前,你需要[安裝環境](getting_started_build_tools.md)用於AVR或/和ARM開發。一旦完成,你會使用`make`命令建立一個鍵盤並用以下符號鍵盤佈局 - - make planck/rev4:default - -這將建立`rev4` `planck`的修訂與`default`鍵盤映射。並非所有鍵盤有一個修訂版(也稱為子項目或文件夾),在這種情況下,它可以被省略: - - make preonic:default - -## 如何赶近 - -QMK有很多[特點](features.md)探索和很好的協議[參考文獻](http://docs.qmk.fm)挖通的。大部分功能通過修改[鍵盤映射(keymap.md),並改變[鍵碼](keycodes.md)冤大頭。 diff --git a/docs/zh/_sidebar.md b/docs/zh/_sidebar.md new file mode 100644 index 000000000000..c16761292969 --- /dev/null +++ b/docs/zh/_sidebar.md @@ -0,0 +1,99 @@ +* [完全指南菜鳥](zh/newbs.md) + * [入門](zh/newbs_getting_started.md) + * [構建第一個固件](zh/newbs_building_firmware.md) + * [刷新固件](zh/newbs_flashing.md) + * [測試和調試](zh/newbs_testing_debugging.md) + * [最佳實踐](zh/newbs_best_practices.md) + * [學習資源](zh/newbs_learn_more_resources.md) + +* [QMK基礎](zh/README.md) + * [QMK簡介](zh/getting_started_introduction.md) + * [特約QMK](zh/contributing.md) + * [如何使用Github上](zh/getting_started_github.md) + * [獲得幫助](zh/getting_started_getting_help.md) + +* [常問問題](zh/faq.md) + * [常問問題](zh/faq_general.md) + * [構建/編譯QMK](zh/faq_build.md) + * [調試/故障排除QMK](zh/faq_debug.md) + * [鍵盤佈局](zh/faq_keymap.md) + +* 詳細指南 + * [安裝編譯工具](zh/getting_started_build_tools.md) + * [流浪漢指南](zh/getting_started_vagrant.md) + * [構建/編譯器指令](zh/getting_started_make_guide.md) + * [刷新固件](zh/flashing.md) + * [定制功能](zh/custom_quantum_functions.md) + * [鍵盤映射概述](zh/keymap.md) + +* [硬件](zh/hardware.md) + * [AVR處理器](zh/hardware_avr.md) + * [司機](zh/hardware_drivers.md) + +* 參考 + * [Keyboard Guidelines](zh/hardware_keyboard_guidelines.md) + * [Config Options](zh/config_options.md) + * [Keycodes](zh/keycodes.md) + * [Documentation Best Practices](zh/documentation_best_practices.md) + * [Documentation Templates](zh/documentation_templates.md) + * [Glossary](zh/reference_glossary.md) + * [Unit Testing](zh/unit_testing.md) + * [Useful Functions](zh/ref_functions.md) + * [Configurator Support](zh/reference_configurator_support.md) + +* [特點](zh/features.md) + * [Basic Keycodes](zh/keycodes_basic.md) + * [Quantum Keycodes](zh/quantum_keycodes.md) + * [Advanced Keycodes](zh/feature_advanced_keycodes.md) + * [Audio](zh/feature_audio.md) + * [Auto Shift](zh/feature_auto_shift.md) + * [Backlight](zh/feature_backlight.md) + * [Bluetooth](zh/feature_bluetooth.md) + * [Bootmagic](zh/feature_bootmagic.md) + * [Combos](zh/feature_combo) + * [Command](zh/feature_command.md) + * [Dynamic Macros](zh/feature_dynamic_macros.md) + * [Encoders](zh/feature_encoders.md) + * [Grave Escape](zh/feature_grave_esc.md) + * [Key Lock](zh/feature_key_lock.md) + * [Layouts](zh/feature_layouts.md) + * [Leader Key](zh/feature_leader_key.md) + * [Macros](zh/feature_macros.md) + * [Mouse Keys](zh/feature_mouse_keys.md) + * [One Shot Keys](zh/feature_advanced_keycodes.md#one-shot-keys) + * [Pointing Device](zh/feature_pointing_device.md) + * [PS/2 Mouse](zh/feature_ps2_mouse.md) + * [RGB Lighting](zh/feature_rgblight.md) + * [RGB Matrix](zh/feature_rgb_matrix.md) + * [Space Cadet Shift](zh/feature_space_cadet_shift.md) + * [Space Cadet Shift Enter](zh/feature_space_cadet_shift_enter.md) + * [Stenography](zh/feature_stenography.md) + * [Swap Hands](zh/feature_swap_hands.md) + * [Tap Dance](zh/feature_tap_dance.md) + * [Terminal](zh/feature_terminal.md) + * [Thermal Printer](zh/feature_thermal_printer.md) + * [Unicode](zh/feature_unicode.md) + * [Userspace](zh/feature_userspace.md) + * [US ANSI Shifted Keys](zh/keycodes_us_ansi_shifted.md) + +* 對於製造商和遊戲模組 + * [Hand Wiring Guide](zh/hand_wire.md) + * [ISP Flashing Guide](zh/isp_flashing_guide.md) + * [ARM Debugging Guide](zh/arm_debugging.md) + * [I2C Driver](zh/i2c_driver.md) + +* 為了更深入的了解 + * [How Keyboards Work](zh/how_keyboards_work.md) + * [Understanding QMK](zh/understanding_qmk.md) + +* 其它主題 + * [Using Eclipse with QMK](zh/eclipse.md) + +* QMK內部(進行中) + * [Defines](zh/internals_defines.md) + * [Input Callback Reg](zh/internals_input_callback_reg.md) + * [Midi Device](zh/internals_midi_device.md) + * [Midi Device Setup Process](zh/internals_midi_device_setup_process.md) + * [Midi Util](zh/internals_midi_util.md) + * [Send Functions](zh/internals_send_functions.md) + * [Sysex Tools](zh/internals_sysex_tools.md) From fe982caf5d69fdb2d6f1dec123a630df11a98282 Mon Sep 17 00:00:00 2001 From: epaew Date: Tue, 4 Dec 2018 01:00:00 +0900 Subject: [PATCH 503/505] Add edvorakjp kepmap for crkbd (#4537) * edvorakjp layout for crkbd * bugfix of edvorakjp QMK cannot send keycode that doesn't exists on new layer. --- keyboards/crkbd/keymaps/edvorakjp/config.h | 24 +++ keyboards/crkbd/keymaps/edvorakjp/keymap.c | 158 ++++++++++++++++++++ keyboards/crkbd/keymaps/edvorakjp/oled.c | 82 ++++++++++ keyboards/crkbd/keymaps/edvorakjp/oled.h | 24 +++ keyboards/crkbd/keymaps/edvorakjp/readme.md | 21 +++ keyboards/crkbd/keymaps/edvorakjp/rules.mk | 32 ++++ users/edvorakjp/edvorakjp_process_record.c | 18 ++- 7 files changed, 354 insertions(+), 5 deletions(-) create mode 100644 keyboards/crkbd/keymaps/edvorakjp/config.h create mode 100644 keyboards/crkbd/keymaps/edvorakjp/keymap.c create mode 100644 keyboards/crkbd/keymaps/edvorakjp/oled.c create mode 100644 keyboards/crkbd/keymaps/edvorakjp/oled.h create mode 100644 keyboards/crkbd/keymaps/edvorakjp/readme.md create mode 100644 keyboards/crkbd/keymaps/edvorakjp/rules.mk diff --git a/keyboards/crkbd/keymaps/edvorakjp/config.h b/keyboards/crkbd/keymaps/edvorakjp/config.h new file mode 100644 index 000000000000..515591a4292f --- /dev/null +++ b/keyboards/crkbd/keymaps/edvorakjp/config.h @@ -0,0 +1,24 @@ +#ifndef CONFIG_USER_H +#define CONFIG_USER_H + +/* Select hand configuration */ + +#define MASTER_LEFT +// #define MASTER_RIGHT +// #define EE_HANDS + +#define SSD1306OLED +#define SWAP_SCLN + +// #define TAPPING_FORCE_HOLD +#define TAPPING_TERM 120 + +#undef RGBLED_NUM +#define RGBLIGHT_EFFECT_STATIC_GRADIENT +#define RGBLED_NUM 27 +#define RGBLIGHT_LIMIT_VAL 100 +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 + +#endif // CONFIG_USER_H diff --git a/keyboards/crkbd/keymaps/edvorakjp/keymap.c b/keyboards/crkbd/keymaps/edvorakjp/keymap.c new file mode 100644 index 000000000000..ae2f710a03a0 --- /dev/null +++ b/keyboards/crkbd/keymaps/edvorakjp/keymap.c @@ -0,0 +1,158 @@ +#include QMK_KEYBOARD_H +#ifdef PROTOCOL_LUFA + #include "split_util.h" +#endif +#ifdef SSD1306OLED + #include "oled.h" +#endif + +#include "edvorakjp.h" + +/* + * enum custom_keycodes { + * KC_LOCK = NEW_SAFE_RANGE, + * }; + */ + +#define KC_ KC_TRNS + +#define KC_TMB1 LGUI_T(KC_TAB) +#define KC_TMB2 LSFT_T(KC_SPC) +#define KC_TMB3 TD(TD_LOWER) // act as LOWER when hold, as KC_LANG2(=English) when tapped +#define KC_TMB4 TD(TD_RAISE) // act as RAISE when hold, as KC_LANG1(=Japanese) when tapped +#define KC_TMB5 RCTL_T(KC_BSPC) +#define KC_TMB6 RALT_T(KC_ENT) +#define KC_TMB7 KC_DEL +#define KC_TMB8 RALT(KC_ENT) +#define KC_TMB9 LGUI(KC_TAB) + +#define KC_RST RESET +#define KC_DBUG DEBUG +#define KC_RTOG RGB_TOG +#define KC_EDJP EDVORAK +#define KC_QWER QWERTY + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_EDVORAK] = LAYOUT_kc( + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ESC ,QUOT,COMM,DOT , Y , P , F , G , R , W , Q ,BSLS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + EQL , A , O , E , I , U , D , T , N , S , M ,MINS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + GRV ,SCLN, X , C , V , Z , B , H , J , K , L ,SLSH, + //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----' + TMB1,TMB2,TMB3, TMB4,TMB5,TMB6 + // `----+----+----' `----+----+----' + ), + + [_EDVORAKJ1] = LAYOUT_kc( + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , AI , OU , EI , , , , , , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , Y , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ,ANN ,ONN ,ENN ,INN ,UNN , , , , , , , + //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----' + , , , , , + // `----+----+----' `----+----+----' + ), + + [_EDVORAKJ2] = LAYOUT_kc( + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , AI , OU , EI , , , , , , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , Y , , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ,ANN ,ONN ,ENN ,INN ,UNN , , , , , , , + //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----' + , , , , , + // `----+----+----' `----+----+----' + ), + + [_QWERTY] = LAYOUT_kc( + //|----+----+----+----+----+----| |----+----+----+----+----+----| + TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + EQL , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, + //|----+----+----+----+----+----| |----+----+----+----+----+----| + GRV , Z , X , C , V , B , N , M ,COMM,DOT ,SLSH,BSLS, + //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----' + , , , , , + // `----+----+----' `----+----+----' + ), + + [_LOWER] = LAYOUT_kc( + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , 1 ,EXLM, AT ,HASH,DLR , PERC,CIRC,AMPR,ASTR, 0 , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , LT ,LCBR,LPRN,LBRC, RBRC,RPRN,RCBR, GT , , , + //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----' + , , , ,TMB7,TMB8 + // `----+----+----' `----+----+----' + ), + + [_RAISE] = LAYOUT_kc( + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + ,F11 ,F12 ,PSCR,SLCK,PAUS, ,HOME,PGDN,PGUP,END , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , ,LEFT,DOWN, UP ,RGHT, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----' + TMB9, , , , , + // `----+----+----' `----+----+----' + ), + + [_ADJUST] = LAYOUT_kc( + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , ,EXTOFF, , ,EXTON, , , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , ,QWER,WIN ,RST , RTOG,MAC ,EDJP, , , , + //|----+----+----+----+----+----| |----+----+----+----+----+----| + , , , , , , , , , , , , + //`----+----+----+----+----+----+----| |----+----+----+----+----+----+----' + , , , , , + // `----+----+----' `----+----+----' + ) +}; + +#ifdef SSD1306OLED +void matrix_init_keymap(void) { + //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h + iota_gfx_init(!has_usb()); // turns on the display +} + +void matrix_scan_user(void) { + iota_gfx_task(); // this is what updates the display continuously +} +#endif + +#ifdef RGBLIGHT_EFFECT_STATIC_GRADIENT +uint32_t layer_state_set_keymap(uint32_t state) { + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); + switch (biton32(state)) { + case _EDVORAKJ1: + case _EDVORAKJ2: + // _EDVORAKJ1 & J2 are same colored + rgblight_sethsv_noeeprom_white(); + break; + case _LOWER: + rgblight_sethsv_noeeprom_red(); + break; + case _RAISE: + rgblight_sethsv_noeeprom_blue(); + break; + case _ADJUST: + rgblight_sethsv_noeeprom_green(); + break; + default: // for any other layers, or the default layer + rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_GRADIENT + 3); + rgblight_sethsv_noeeprom_red(); + break; + } + return state; +} +#endif diff --git a/keyboards/crkbd/keymaps/edvorakjp/oled.c b/keyboards/crkbd/keymaps/edvorakjp/oled.c new file mode 100644 index 000000000000..e4cccf3e7f83 --- /dev/null +++ b/keyboards/crkbd/keymaps/edvorakjp/oled.c @@ -0,0 +1,82 @@ +#include +#include "oled.h" + +// NOTE: Redefined to avoid to use snprintf(); It makes size of firmware big. +const char *read_mode_icon(bool windows_mode) { + static const char logo[][2][3] = {{{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}}; + static char mode_icon[10]; + + int mode_number = windows_mode ? 1 : 0; + strcpy(mode_icon, logo[mode_number][0]); + + strcat(mode_icon, "\n"); + strcat(mode_icon, logo[mode_number][1]); + + return mode_icon; +} + +const char *read_layer_state(void) { + static char layer_state_str[24]; + char layer_name[17]; + + switch (biton32(layer_state)) { + case L_BASE: + strcpy(layer_name, default_layer_state == 1UL<<_EDVORAK ? "EDVORAK" : "QWERTY"); + break; + case _EDVORAKJ1: + case _EDVORAKJ2: + strcpy(layer_name, "JP_EXT"); + break; + case _RAISE: + strcpy(layer_name, "Raise"); + break; + case _LOWER: + strcpy(layer_name, "Lower"); + break; + case _ADJUST: + strcpy(layer_name, "Adjust"); + break; + default: + snprintf(layer_name, sizeof(layer_name), "Undef-%ld", layer_state); + } + + strcpy(layer_state_str, "Layer: "); + + strcat(layer_state_str, layer_name); + strcat(layer_state_str, "\n"); + return layer_state_str; +} + +const char *read_host_led_state(void) { + static char led_str[24]; + bool ext_status = get_enable_jp_extra_layer() && get_japanese_mode(); + strcpy(led_str, ext_status ? "EXT" : " "); + + strcat(led_str, (host_keyboard_leds() & (1<display, source->display, sizeof(dest->display))) { + memcpy(dest->display, source->display, sizeof(dest->display)); + dest->dirty = true; + } +} + +void iota_gfx_task_user(void) { + struct CharacterMatrix matrix; + + matrix_clear(&matrix); + if (is_master) { + matrix_write(&matrix, read_mode_icon(!get_enable_kc_lang())); + matrix_write(&matrix, " "); + matrix_write(&matrix, read_layer_state()); + matrix_write(&matrix, read_host_led_state()); + } else { + matrix_write(&matrix, read_logo()); + } + matrix_update(&display, &matrix); +} diff --git a/keyboards/crkbd/keymaps/edvorakjp/oled.h b/keyboards/crkbd/keymaps/edvorakjp/oled.h new file mode 100644 index 000000000000..896347aea98e --- /dev/null +++ b/keyboards/crkbd/keymaps/edvorakjp/oled.h @@ -0,0 +1,24 @@ +#ifndef OLED_USER_H +#define OLED_USER_H + +//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h +#include "ssd1306.h" +#include "edvorakjp.h" + +//assign the right code to your layers for OLED display +#define L_BASE 0 + +extern uint8_t is_master; +extern bool japanese_mode; + +// method prototypes defined in crkbd/lib +extern const char *read_logo(void); + +const char *read_mode_icon(bool swap); +const char *read_layer_state(void); +const char *read_host_led_state(void); +void matrix_update(struct CharacterMatrix *dest, + const struct CharacterMatrix *source); +void iota_gfx_task_user(void); + +#endif // OLED_CONFIG_USER_H diff --git a/keyboards/crkbd/keymaps/edvorakjp/readme.md b/keyboards/crkbd/keymaps/edvorakjp/readme.md new file mode 100644 index 000000000000..dd406523d241 --- /dev/null +++ b/keyboards/crkbd/keymaps/edvorakjp/readme.md @@ -0,0 +1,21 @@ +# edvorakjp + +Epaew's Enhanced Dvorak layout for Japanese Programmer +see [here](/users/edvorakjp) for more informations. + +## License + +Copyright 2018 Ryo Maeda epaew.333@gmail.com @epaew + +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 . diff --git a/keyboards/crkbd/keymaps/edvorakjp/rules.mk b/keyboards/crkbd/keymaps/edvorakjp/rules.mk new file mode 100644 index 000000000000..b4f6d2f1f15d --- /dev/null +++ b/keyboards/crkbd/keymaps/edvorakjp/rules.mk @@ -0,0 +1,32 @@ +# 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 = no # 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 +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. +SWAP_HANDS_ENABLE = no # Enable one-hand typing +TAP_DANCE_ENABLE = yes + +# 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 you want to change the display of OLED, you need to change here +SRC += ./lib/glcdfont.c \ + ./lib/logo_reader.c \ + oled.c \ + # ./lib/rgb_state_reader.c \ + # ./lib/layer_state_reader.c \ + # ./lib/keylogger.c \ + # ./lib/mode_icon_reader.c \ + # ./lib/host_led_state_reader.c \ + # ./lib/timelogger.c \ diff --git a/users/edvorakjp/edvorakjp_process_record.c b/users/edvorakjp/edvorakjp_process_record.c index dc70522b4706..2dcdab2a25f9 100644 --- a/users/edvorakjp/edvorakjp_process_record.c +++ b/users/edvorakjp/edvorakjp_process_record.c @@ -37,11 +37,7 @@ bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record) { } return true; - // left hand and right hand's right side - case KC_X: - case KC_C: - case KC_V: - case KC_Z: + // left hand up and right hand's right side case KC_Y: case KC_P: case KC_W: @@ -54,6 +50,18 @@ bool process_record_edvorakjp_ext(uint16_t keycode, keyrecord_t *record) { layer_on(_EDVORAKJ2); } return true; + // left hand down + // If return true, QMK sends keycode in new layer, + // but these keys are only available in old layer. + case KC_X: + case KC_C: + case KC_V: + case KC_Z: + if (record->event.pressed) { + layer_on(_EDVORAKJ2); + tap_code(keycode); + } + return false; } // vowel keys, symbol keys and modifier keys From da1afe152af5a6dfb5c0bb28d86d34940162f960 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 3 Dec 2018 10:27:15 -0800 Subject: [PATCH 504/505] Fix up RGB Matrix code (#4503) * Fix up RGB Matrix code * Convert RGBLIGHT functions to rgbmatrix ones, and add defines --- quantum/rgb_matrix.c | 60 ++++++++++++++++++++++++++++++++------------ quantum/rgb_matrix.h | 59 ++++++++++++++++++++++++++++++++----------- quantum/rgblight.c | 4 +-- 3 files changed, 91 insertions(+), 32 deletions(-) diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c index 15bd13671669..82d36177b5bd 100644 --- a/quantum/rgb_matrix.c +++ b/quantum/rgb_matrix.c @@ -842,13 +842,13 @@ void rgb_matrix_init(void) { } // Deals with the messy details of incrementing an integer -uint8_t increment( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { +static uint8_t increment( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { int16_t new_value = value; new_value += step; return MIN( MAX( new_value, min ), max ); } -uint8_t decrement( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { +static uint8_t decrement( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { int16_t new_value = value; new_value -= step; return MIN( MAX( new_value, min ), max ); @@ -887,77 +887,105 @@ uint32_t rgb_matrix_get_tick(void) { return g_tick; } -void rgblight_toggle(void) { +void rgb_matrix_toggle(void) { rgb_matrix_config.enable ^= 1; eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_step(void) { +void rgb_matrix_enable(void) { + rgb_matrix_config.enable = 1; + eeconfig_update_rgb_matrix(rgb_matrix_config.raw); +} + +void rgb_matrix_enable_noeeprom(void) { + rgb_matrix_config.enable = 1; +} + +void rgb_matrix_disable(void) { + rgb_matrix_config.enable = 0; + eeconfig_update_rgb_matrix(rgb_matrix_config.raw); +} + +void rgb_matrix_disable_noeeprom(void) { + rgb_matrix_config.enable = 0; +} + +void rgb_matrix_step(void) { rgb_matrix_config.mode++; if (rgb_matrix_config.mode >= RGB_MATRIX_EFFECT_MAX) rgb_matrix_config.mode = 1; eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_step_reverse(void) { +void rgb_matrix_step_reverse(void) { rgb_matrix_config.mode--; if (rgb_matrix_config.mode < 1) rgb_matrix_config.mode = RGB_MATRIX_EFFECT_MAX - 1; eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_increase_hue(void) { +void rgb_matrix_increase_hue(void) { rgb_matrix_config.hue = increment( rgb_matrix_config.hue, 8, 0, 255 ); eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_decrease_hue(void) { +void rgb_matrix_decrease_hue(void) { rgb_matrix_config.hue = decrement( rgb_matrix_config.hue, 8, 0, 255 ); eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_increase_sat(void) { +void rgb_matrix_increase_sat(void) { rgb_matrix_config.sat = increment( rgb_matrix_config.sat, 8, 0, 255 ); eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_decrease_sat(void) { +void rgb_matrix_decrease_sat(void) { rgb_matrix_config.sat = decrement( rgb_matrix_config.sat, 8, 0, 255 ); eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_increase_val(void) { +void rgb_matrix_increase_val(void) { rgb_matrix_config.val = increment( rgb_matrix_config.val, 8, 0, RGB_MATRIX_MAXIMUM_BRIGHTNESS ); eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_decrease_val(void) { +void rgb_matrix_decrease_val(void) { rgb_matrix_config.val = decrement( rgb_matrix_config.val, 8, 0, RGB_MATRIX_MAXIMUM_BRIGHTNESS ); eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -void rgblight_increase_speed(void) { +void rgb_matrix_increase_speed(void) { rgb_matrix_config.speed = increment( rgb_matrix_config.speed, 1, 0, 3 ); eeconfig_update_rgb_matrix(rgb_matrix_config.raw);//EECONFIG needs to be increased to support this } -void rgblight_decrease_speed(void) { +void rgb_matrix_decrease_speed(void) { rgb_matrix_config.speed = decrement( rgb_matrix_config.speed, 1, 0, 3 ); eeconfig_update_rgb_matrix(rgb_matrix_config.raw);//EECONFIG needs to be increased to support this } -void rgblight_mode(uint8_t mode) { +void rgb_matrix_mode(uint8_t mode) { rgb_matrix_config.mode = mode; eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } -uint32_t rgblight_get_mode(void) { +void rgb_matrix_mode_noeeprom(uint8_t mode) { + rgb_matrix_config.mode = mode; +} + +uint32_t rgb_matrix_get_mode(void) { return rgb_matrix_config.mode; } -void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val) { +void rgb_matrix_sethsv(uint16_t hue, uint8_t sat, uint8_t val) { rgb_matrix_config.hue = hue; rgb_matrix_config.sat = sat; rgb_matrix_config.val = val; eeconfig_update_rgb_matrix(rgb_matrix_config.raw); } + +void rgb_matrix_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val) { + rgb_matrix_config.hue = hue; + rgb_matrix_config.sat = sat; + rgb_matrix_config.val = val; +} diff --git a/quantum/rgb_matrix.h b/quantum/rgb_matrix.h index 3cd248ffc43c..0cfeb4e069a8 100644 --- a/quantum/rgb_matrix.h +++ b/quantum/rgb_matrix.h @@ -127,6 +127,7 @@ enum rgb_matrix_effects { }; void rgb_matrix_set_color( int index, uint8_t red, uint8_t green, uint8_t blue ); +void rgb_matrix_set_color_all( uint8_t red, uint8_t green, uint8_t blue ); // This runs after another backlight effect and replaces // colors already set @@ -160,20 +161,50 @@ void rgb_matrix_decrease(void); uint32_t rgb_matrix_get_tick(void); -void rgblight_toggle(void); -void rgblight_step(void); -void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val); -void rgblight_step_reverse(void); -void rgblight_increase_hue(void); -void rgblight_decrease_hue(void); -void rgblight_increase_sat(void); -void rgblight_decrease_sat(void); -void rgblight_increase_val(void); -void rgblight_decrease_val(void); -void rgblight_increase_speed(void); -void rgblight_decrease_speed(void); -void rgblight_mode(uint8_t mode); -uint32_t rgblight_get_mode(void); +void rgb_matrix_toggle(void); +void rgb_matrix_enable(void); +void rgb_matrix_enable_noeeprom(void); +void rgb_matrix_disable(void); +void rgb_matrix_disable_noeeprom(void); +void rgb_matrix_step(void); +void rgb_matrix_sethsv(uint16_t hue, uint8_t sat, uint8_t val); +void rgb_matrix_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val); +void rgb_matrix_step_reverse(void); +void rgb_matrix_increase_hue(void); +void rgb_matrix_decrease_hue(void); +void rgb_matrix_increase_sat(void); +void rgb_matrix_decrease_sat(void); +void rgb_matrix_increase_val(void); +void rgb_matrix_decrease_val(void); +void rgb_matrix_increase_speed(void); +void rgb_matrix_decrease_speed(void); +void rgb_matrix_mode(uint8_t mode); +void rgb_matrix_mode_noeeprom(uint8_t mode); +uint32_t rgb_matrix_get_mode(void); + +#ifndef RGBLIGHT_ENABLE +#define rgblight_toggle() rgb_matrix_toggle() +#define rgblight_enable() rgb_matrix_enable() +#define rgblight_enable_noeeprom() rgb_matrix_enable_noeeprom() +#define rgblight_disable() rgb_matrix_disable() +#define rgblight_disable_noeeprom() rgb_matrix_disable_noeeprom() +#define rgblight_step() rgb_matrix_step() +#define rgblight_sethsv(hue, sat, val) rgb_matrix_sethsv(hue, sat, val) +#define rgblight_sethsv_noeeprom(hue, sat, val) rgb_matrix_sethsv_noeeprom(hue, sat, val) +#define rgblight_step_reverse() rgb_matrix_step_reverse() +#define rgblight_increase_hue() rgb_matrix_increase_hue() +#define rgblight_decrease_hue() rgb_matrix_decrease_hue() +#define rgblight_increase_sat() rgb_matrix_increase_sat() +#define rgblight_decrease_sat() rgb_matrix_decrease_sat() +#define rgblight_increase_val() rgb_matrix_increase_val() +#define rgblight_decrease_val() rgb_matrix_decrease_val() +#define rgblight_increase_speed() rgb_matrix_increase_speed() +#define rgblight_decrease_speed() rgb_matrix_decrease_speed() +#define rgblight_mode(mode) rgb_matrix_mode(mode) +#define rgblight_mode_noeeprom(mode) rgb_matrix_mode_noeeprom(mode) +#define rgblight_get_mode() rgb_matrix_get_mode() + +#endif typedef struct { /* Perform any initialisation required for the other driver functions to work. */ diff --git a/quantum/rgblight.c b/quantum/rgblight.c index 9ce3b2309253..a2d6fe7a07ac 100644 --- a/quantum/rgblight.c +++ b/quantum/rgblight.c @@ -325,13 +325,13 @@ void rgblight_disable_noeeprom(void) { // Deals with the messy details of incrementing an integer -uint8_t increment( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { +static uint8_t increment( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { int16_t new_value = value; new_value += step; return MIN( MAX( new_value, min ), max ); } -uint8_t decrement( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { +static uint8_t decrement( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { int16_t new_value = value; new_value -= step; return MIN( MAX( new_value, min ), max ); From 3a0f3a5bd0aff18934431ad471b1db390c3b33d1 Mon Sep 17 00:00:00 2001 From: Drashna Jaelre Date: Mon, 3 Dec 2018 16:42:57 -0800 Subject: [PATCH 505/505] Make ARM Audio max volume configurable (#4540) * Make ARM Audio max volume configurable * Update docs/feature_audio.md Co-Authored-By: drashna * Update docs/feature_audio.md Co-Authored-By: drashna --- docs/feature_audio.md | 7 +++++++ quantum/audio/audio_arm.c | 2 ++ 2 files changed, 9 insertions(+) diff --git a/docs/feature_audio.md b/docs/feature_audio.md index 82e0ed9503dc..a39c456873f3 100644 --- a/docs/feature_audio.md +++ b/docs/feature_audio.md @@ -65,6 +65,13 @@ The available keycodes for audio are: * `AU_OFF` - Turn audio mode off * `AU_TOG` - Toggle audio mode +## ARM Audio Volume + +For ARM devices, you can adjust the DAC sample values. If your board is too loud for you or your coworkers, you can set the max using `DAC_SAMPLE_MAX` in your `config.h`: + +```c +#define DAC_SAMPLE_MAX 65535U +``` ## Music Mode diff --git a/quantum/audio/audio_arm.c b/quantum/audio/audio_arm.c index 18e8a8c66db6..989f7a64becd 100644 --- a/quantum/audio/audio_arm.c +++ b/quantum/audio/audio_arm.c @@ -80,7 +80,9 @@ float startup_song[][2] = STARTUP_SONG; static void gpt_cb8(GPTDriver *gptp); #define DAC_BUFFER_SIZE 720 +#ifndef DAC_SAMPLE_MAX #define DAC_SAMPLE_MAX 65535U +#endif #define START_CHANNEL_1() gptStart(&GPTD6, &gpt6cfg1); \ gptStartContinuous(&GPTD6, 2U)

p<8JqN28pH2mC;gjx$8M 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�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 Lf>^DHLD2sPg=7|Q literal 0 HcmV?d00001 diff --git a/layouts/community/ergodox/algernon/images/base-layer.png b/layouts/community/ergodox/algernon/images/base-layer.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca7a273bed32e630522ed70618a930037537029 GIT binary patch literal 106956 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

W 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�{1ax_{kN$0#) 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%0AX-%N$=*AUYL*`vcwXN1FYYxKyFOU* z;8xoie?my(AFoQt*S;%>BvWA4_*Oq@D!2+g2fcMdl}7eC>Q#bUofd%J8MSmt<6Yp8M+}LGQF?%Xz1W|6+OzQ1t$wNY>z_2ngL)O} zJ2K<-uGr|7R`zh}X>Syf$fwIu5aS(xI*GLy*d*6_c!9~;<;RTUpg112!8}`fBzD4r zTeBxa@Wcye<;g2;^9h4*%5$Gy_^a?3t(jwxEyAfjYG)jd`KHe#OU!cwj5Y@5<$oH6 zDDI|KSmOXRq(WE{T}OJs$;sWDD5$LqD$t`WlPSVUlZL@n?e(c9u%7Ki^Txyn$x=RC zdK`WgN-aj((nPqpjfgBf*unXL^yaJUJ~WyqmdC@^K+b-@TFJQa-j!{#$|xAfiqa`W;QI4fKiKzL)O$5+$pyTp zDH;=$9mac_)fSpQgQ32WY?4aI`?pAQka}Z3%C=C9el5u6li0F+QLpRTT)G@qNeD2R zp_P{ej@ZR=w;F6V^UpN;ittsX3Z!kxg}7?)0S7 z?xnd|7U3E^2^@7l-2>aTTwGx6iIwEFD#3R>gmX_RA|dkuo>*4Lhb+F`5xc(C;e*Ki z>`;avF!%MYOIy|TJI$=t4;{N5h`Vq@4l$8dth9|vNK ztFj|EeG8r@@%NC4Wv8R8#Ixnj6?4$9_*N#Jd8#G6w-*rH%W>vr2_!i}N$r~IG+%~~ z4b(>Y#L6VftizQju_wRst@yk-XQy1uw$|ZfiY&=(CnN*L@DE>c_|{(9jU{NBDs^f* z$=Kj*ygzxU>TM37v%;qmG>|R^Grf;~okt4_mBPqw6T z+j+P}C6s^qMaziQu4uXrrAkynxb^p@#i>fL31f)I8-f&^aqFL2 zl_aj+`~8obQ^1( z)Vx6@sfsyaXIWgw8x!*>BbN69tJyu>!lc(S#JdRyv4ReJx6su_l55^2&f6Pzy1nA< zmPv-#vy?qg*R@g9wP(CxZ8YLDC;{a~+NwSAL7DHZUtvGH$$3&e-!E|9)tRg47t3%V zl5sRMMi>RiC=YUbiqS$VWJ{CkS<<{fn$pW{rrPhffU@pFKJfKDf5x*QwAS@4ZLhU8 zUnbTt>XFCtk>4Y!KT5Zx=+?Sw2`$RTuQu6IKb1(w2j84=T`r#!#c}qzn+6mCgQo#c zPCMqbZA8f@Ez1oalPqz`rj{_W24_RaU;faeH>|47gpAi z8I@RXIpfPGoYs-hR=(sHc2Ke^TFI8cPyi?BX^CkhccjS}45~1yyaGEB{c0^+#5P(i zyJXZO21yx%k@v^2^s3S7lIm>UO8ICMG;%Tj09l^GwU0A0ZYZ_p!*2_T?h-#QB~-3D zo`>F@4yPD^yb6ux0;>4WIsO{t@2A({*5h)DQCsJK;ZS>jv}R?%8S7C$J0q#u|9I(=)J zw$iSGrN*mym6?WF_}JO#wPM#wv4-vjGXX42STwSI@$~kpbSWoyay_isYgh3WtE^1| z+B}fMozh7F`P+^KL8f?dbvwlK^*C29$nnZcd8&Vz&*f7>E-am%JA>z}TcVyN1qOWq z>%}-hsNTkwwvk36j}j}Ybz*QpJ$F^77)H_1n@UepUf)Q9))=F>)8&a`$l8s!X#V*3 z_O0zVNC<=M&@^hP#(r!MT>iPG(rm4?izT_g)D6R@-`p}2(>eUAwa1F1w{xf4M)Amg zbGxIdJx8!3k?t$co1B@~6&S5eT~kAb-qI_3Mp+TTc~y@Mp855vnsuQr!OVoFj$%st;4mb3#*`^+!aMVI9m#wRxash8szCNIpTwC*RVm-vcZQ zeQ|pjIl#6GaDDUrDnAlymJjC{rHb4}a|_D&4toMeYQVhI?h@Sj(YP5cz~K7h&>HnA zQ*B<>I4Vxs39m^9+1Bdn(4_F(F<8)_x<_1es&Z=!1FxTJC8wOAJ4oLv1N>O@`qeA> z?S$*ATujO5{_D#Vk}?KBK9rh@OLJ^3*4Rk9b0?U2BOiA@-K()hSml)6&W6ibxPsN5 z(Ke)u5kG@izOqpoXOq;p!xx!QooBJe;b{Nk->o*cir z)l$|`B6+c?npSN2YuJ(N?^||06gG34+q<}gQUGq`UWlK}G}KSr=-^ z2G$(pbLmP|6jp*%+j^K9M~5{DuO_>DH;LdIe||S@8NeWVn$>+8%5oyq?hz->WG=*D z4)_&4-n7UT75&o?${4RISHHQeIdyB>nASTq0^w!cTIA(hKf->!u|ji^S|ZKOmXT=- zUTK=NH%YLIcEc+}AUGg`I$&@|tz*fo*tDP7>!-ZSA}EN$2Myde^UtMTe+o*MgH*Sb zrhA3kJWVD9Ky%Wx?R+G*S8IK3rp8uXqC$ zFZO(p$>t=D{*q4Ag!IAgN#~Dh0Rjcdw)MIFF9I<2aF+89gU{xa{%9x%(%I#vQjyn-u)K@HZIp))P3?XE4 zZ)3_b{L!h}Sb7|O6!O>~KGjjk$7*bVBo8>^7*0zu`=s%l(^^!9)9ol?Xx2hbc`kqW zn%NLT4aLlCRoEs$X$fDLjPQPx%gdn+ymL);0Q<~|-|+RQH4R0StI4#igsEI(c>|z5 zfULQ1oT0a}W?;t=tbi9*?nlzKjBbplQAC#GU$~P-kz}|?qdShtBl)CYe&-#jZZ9rl zQFhiKs-m*V2m{Oi0A%~t75<|-YJP3Bi?{_aJ4P9I_aBW-r|S22wvLyOI$R8Srx=Wk z=YjoeURxub)NPv5YnDby?c;G4=$Cc7I4*g^5YVcTxM@jK7x`fn5P0*kNVXIX>8-`=xNy!=Pshnb9MHEeW~84jNxI1J~5AO z)hSZ*v{!^%pi#0GCoX@y2=(upp>idXQed`bgJ=A-`^5Jd{#8kJ71J4`@+BmV%H_9Y zdJOlgO6G1>JN+wB(N2o(8GBjC#6&;c_CBZ5ur+&>gU!EK8|7RxyoWL$#<9QQC6%H{ zPF505_}t-v{`P72Gc53y5=ktP$L32LHdmgQ9gnR~C7sIloXEWm01lVctTgud%HQNo}W&CAB_OY<9K)Wn~?N(>kC5a-kh#`5Mvl~VU zm2uD?O3CQ#TG*B^w#4eQvMW9|!VV9xCahefcCi)HeEA<4-Tmi1cVni`1ne&lS{iM*~MJ zpM8|$oOPy%?M1XqWN|3CZTNCa5!`wKUWM@k!FmOWp6|gohU-pQ0>WlLy^W9FRz309 zj@a}y!`h~t(Rp@7;*vLDS(`tPHJoM^F(kIQH)VY7>mzT4I(ck6vF}>48#RPjYi{ zZUm%843WZccVnluOqzYYzO5DfH*F(FF;q}a+;hlYl-0XPt=L->iZeR`W&~bv-Z-IjCg2x6}OK9HcTv&wSnE zPp7ATD<<;jYLVL*zF#>10HZl_H>mzTJ9o*dS8sA;?25iP)ijpy=&^frYnZ2LKX;Jm za5*O(>ea3Nv4Y!1iqOPzcSr!*%)>i@>zwB`l-?bZY3?Svjz*2n$YhEBQgg}AT-B{R z!Y0F1v}v_NIFfJlA1#PPJ5N#Hj`h9cYaHJ5WxM$&l4BjTzIldW8;f@50CqJDmY2{p zK4?R4ocVF5&V%@iAL~%w-d))`#im;YxDu4P*r3Kx^l|8O)S87s)J?{jXRJjWvPYSi zp~zFz0r+5=SVkCwYnJ9_dv`&PxZ?fa;1!>7*)5^Z!}a(#D;lS%*%Plcapuy`qoXw8%E}w4+XdlEu*Y5HeNSk z7%4osC#^ww8MjvQBX)~^U~SnX4&&af-bj{Lil%S2??q|K{{YJ{M+?vL6Ch3)Xvblq+uSXr zRu3d{C?gjbaCsYy5+m_6Bt8u6-(M1)4w$|m20Y03LzSTqRcktV0;@P2D zW@v@S3Xu+^fz+Ji&~wM2(3Mu?sJOq0ZMNt6VIzEnd69j;J}LLQP?fx!t9efL2XJhv@z9ROv>{D5QN4-= zvo?SnOC!mUi;kRiKAx2Z1hIn=l0`;4O0Uerr$0*0Qog0eCrcZ7tkFj@k2W9<*2!Qx zbJ~_0xnU7VkhTl$l1z`6@uo*_aVd&1X@)Mviku8%y)h$e*_s{zSiVA|##Xvw5fMOHTxZU1hXb%3 zIpms=Wt{*%N|>2S&%cu6{hvxXt~7=`EenFF`?8>A+b&0`&tPgPOhf)YKmk-p&73PH zYE~g2Y3;Gc$iiGR{XUf&Jbqw#5vE6M6hb~yJNtbpmWrlw`JLt58M%-y0!P^X6br)@ zyW7U<@e+2ju21VjrpUyO#QBnym4M)P0FO$A;8_|=eME0&QHO=LDg)mg=o+~s5w)`~ zo>;mK=+1BmJqNjx(t7{L!w4*`D}1CA!jsgR!MnXL zrp*Cpoz={U@^y>1Ugy%bwV73s?;iofEC@lunE>Z2*b&~joA-##cGmIN1 zWL0trjN=&|)lMkgt-RTSFfLRn>M_)eb*n7W*?#@zibj!w?b*zW{oHmGo~UM}mCIaj zme2-l29`1Na5&sO2kBb&QcElk9oSfmhcU~u8xOc0YYs>}}e6 zRa?1N|!VsA$xR#N92d7#|B#uHPiPlZYghgY)?$nJfxgn-TUH274djX{he7tRs0>)7_GO{SwI%L_T-g5Ee(&m)3yk;WU>H4oaOhTbcQ z0+>=pV&H&|4+T%RzgmyVfU?K3Naix(E!t8>&r$1&mhM%6x;?Ag+u9QlKf8GpVo5uk zby4Y>k)V<|KG1-$35Eo7^!NJIQ0ce2i!{;Q!ve=P)_IQ-f3xjKW}j1nCASS6f@WVa z{_fGnarjiWG_?{h^mURHQ5MAW04bf>Jk@z*onUo|;*6rSkpmwDp8o*-YJ7{mFy-vd)Tuua$a^g z3<&v0w;ifp#iUlg)224-ZxAbt8D&PpNykCx2d8?H;v|;jPYiM#M4RL-oSb7m)nr-8 zE@T1aWykKp!2Erx8-U_zWVS;%@>S$8@JS!Tk3sEG%wH*98EpL1=G?^#6Z4}#%v5*4 zsh-FSGniSUX$*o!lRqvxeJV(;S~(=NvNo~JJ~uqSF_Vnr*a~g+sD}PK1i4Q>Nt8%q zCvMyxp!6J4yJaYhRS-(I)-%KAGGaG%+@Oy5J?WooLm-X>ECXexhYG4sP(?{Cwd~ja zL@KJPnN`_`Cz~nB+k?A2k74gl3i2aHup{MHVO1IW=9bppSc2NbNpm4ByPzcJBhrS-NQQXg zHqCtL=Bl#=efvagINC?@s8_Z+BegH+raqn7ove-;!iq#p28Jd0n04m_) zfmN<;#E_D<-g1`8vh*FZp4B&H*oNHQB#y>L0b*6!6O_ktdvQ|4s~wECWVD`PCO2{S z828OG_Ts`e5y^I=YJ(yP3giLM`qY*?r?qR3FbL4^Q}?%z!iK>ik=aWcg}IFkiJj|$ z2=ph?ncIw}4k?^o1XK@=>C%+eMYEi9QbCuRI8E$;0sr)Y)2j^Y^n z!4$`Fl{1f&;}{*sZau18iseN(ts}X$^JKDOM64|(cE-}D8;9Zi>0-8+2S~2eNMplG zEO}=c>Z7(hX0FPc?&KZ z(jr7_i3}$4ISVjVl|j$f*b16OPFnKvKPq(*#?dJm+Ick^-&tG99+e!bWd!-Kr!1;@ z&U^hST3ML|zn*}`F|tU{%%`9Rq^l80ewIw?sP6)zc?>x|g z-O1p(c8wPUd$|DM0tcb=6t?r)z>IC<1jyNDFOrNqk4l5>!Y7Iwi>T9bZ8EA3xb*d? zZZ2QQd81I<7v|Z5N&f&ns>0>zlFIVjNf?zxYR;UadN!*W8vAw%SveItIayINy zlKDT*kpY0D6J>I{U)2ce3H7TDJa+Lk_O_)0WtCO;Gk!l_)f}_F<(A}-fdG(|93Q8x zJBWqdV~fnVMkRMNNS`TYJu&PBSygi!EQlD&wkMbD%P8F2A~BdgHZ2 z1a~(JEPrN`XkEdTxn<8LnpXo(*7+^uX=0fpPWEoyKgelVsMLuiAc#g z#_aLMLj{$!;{BFoF-Iv1#JA{3`c{GP^@C23K@4I$h=39tgTK0-J*hh(q}fb^BwJJm zUB?(W$nI)(wVG)bE#f<1+hZ^M4UTes@mCI=Z3Jx-+{Vp}I>b&>&}O5S*q9Vvz|xpm zjIn|Kw07gzRP&YW**2Bop?4>pbuZcXaGb`U{acK5A4P6*VC@9g6o?!8<12T(uy)r+euoiL*wTbM0os9(vo z*z>C9No2`T2TXM0pthFo>g3y5z^KZ4NHDD4qO_LA*5wf-8Go8bcVaLqc;bMD8rl%P?yvmQ(`O8caDU{!Lv53l1_BD6c4Te+1^3vKP|jQi5bGP3#2 zG-xr9T{*|$PLW-$p47;`Tt7Op@K_)J098Ys%@jt*13X5|lPqO2+gAmBv(}up(V0>> z$j|WOpyRzKkm+#N&P!$`caXL-o{D{{^fM%p#b`?46Sye*g!j!vq{>l5A7qkMW%BZf z2izFJ^`KTfEU2zyPf3W66wXf(NZNt`<`W zX$rYJqbv8Yd!JA$7HJKf(d>V<9D_e%nc;x%^ro&$MJaU4Yx|g`b~~0rv80TCaw=GK z3n=B!*$O*jK3K-n?~1c!D(^_diz`6eiII3i)A2vbu97S*+UEMAju%~z^nF> z*q%Wa3rh(%+TD4qxGpjGSJOTDsHC`#dxpOvIRH_#0fk>vkLy$(?%8fq05=mWTSwLLJ<=}3`Qj1{PMy0jMb1dXVBrI|Jk%QN#`Rh{2Zka%_U@I02 zo(c3m)r6YNW!LQ1@)Wt^U{rjE9liak=rc&6Fh=3Q2ZcE6R!=f5HSmp$>2D;h871OI z#^LlmYK88vVQ}L1Fht~S5UIn(f!p4OjqYzEjVB0O0g3y=>yF;^qr$RV-dtT}WL<%j zY$Su-$F((JyDi5hyzweqqoOQ$N#tzx>z{fJ#1Xhl)Qii6f~mV`aC?1CHaQY2QVKgr z2KQy@k8gT{NhVu~7R6zeL;x(aCgoCku=f;N;N6EdqvYMlZ3+GB4UjqegU}k6`&TGk zZaz}Qc4Lrx)()cuj-2wP)c$V74EGHKC}X5NenR$EJ*Q?r)I}FB+@n6MDpb=6mB-S zbIUM4pzlTPo%~_*B1dr|Wx*Lcex0hnp8o)3+dIYx$tq4*d;3)+iEM4Jo94@EmvKY@ z%0khfm=o7<=qkicuM~EM=^8{N{_vau>N8a#0I}F)a958}{>iCkguSc7cMJJUfWs*m z+Wp6`N~_4Si({!y)_cKEABw{_%89~D*pvO{9 zKRUaUV(f5QCYs(;r<*De>k@Jh9<>CwmWgbT+^kt7otXjRAKu;T?L^n0!t9RGyla9$ z>OZ?!TBVfJTezKY3ElGXyXrd7yurI{Xn2QRG0Z2^u44h!QUfC7t_M?MA>@ zqoPO=Lmh)-oM7kBRtS@8i)T4>K+%R70MjP8xPn7&io2Ns0f>eH^}wx7Gg7yO8pc~Tew zLzsgfnW`CX^$#vZv+~;{0Pegf?tZ48;wX02-j4=nFik+KT+;(~5!&8@={ z6iFjEY=;UkKRTsnt2NJ`Jn^GOu0b&z0yFoAr_!_Tu5Sr9A1kRFQFaV*)EaHMd#Mw8 z2$h!(NWcTQ#Y?#y+MT9@=jvK>UAzwHz~R*6jP z+!Te^<}1Kd_5A7c*ukn>l`@x;8<~;u^5>3}tY0%|zchClX#UOS9iV`Z!Ov>Xy*CLQ zs}mj0IT<+r0P9lQ=~7t7<}1kZyrczb2?z&otu`eu9?>w6yoAb|NIiW$C`7q38+mnW zsZdU+*8w*9OfiW2K7GASEzlAH1m03@a1aCckFUK~xt{OsNTMyojgp{T9iyi{p0x$F z`>YZRkpzfxq@ch~dV|`vAhKtc)=_68Mo>O-tMeafCiBcLi3U|y&5@NxS2bHrw7#88 z(Xb^B+jF-k@%0|{V^5mF$CGp>ja8Xtl0$&U)Oreg2uM~DbtKCSZ?Yv>1D*gq{)d7{xjm9h5ElF6hB|Fu2+eLrutwYE!wn znkC$jgP)dQtJF~MEY@OFMKQA#Z9;ITILi6M2|?KVakagIKf zoqczGGw&e)k`c6p)${XAwkZ=rxfO>K1S#!b#s7gk1 z_*(Mn+wE}PG=!)U#DL{btzEG2wa%RJ$ndj9?Z)nLj--25)sB-mb1j0X9$v-`&g0zs z3blJJwU!j#Aqa|52<4l;52a@7$>@zEN+`rSZS~F2WmHH>`JIRG{{W3`>E0T=7UfQu z?x!LGy%_%hcxIB;?t8h6x6K3FqK_^_k6~PO1b3!Ci5k-7mK*XSn*)RQN4Mo!N>XNu zDHZiyB5g7iaivJ3aor1_nY~Cp)o>VXJ>TCc6ZeB1LYBN2nCiZ3WUDc&H)|EXo*t#31Ao^zT$|$+MDJzQZ&`D(_c0 z&%dy%O@C=AGuk_e=4@<{hCZNHP2=2N+&fKlMnG4_c^V{cF^$8^?&;T$@u}_Ph3=9WC6OLw`A~GnQ(A0g zdz9Z!-qJI<4$$Ug85>l0^rVgj$c)AvT!E0-Bi}WsvD*lDtjbs%1$OP8hN<3Z+LX5f zNc@o_E=)+h7vHrtE0W`3V-0B1O*C&X3AZW2kMXJP?<_=d`S&Xja!VKLnD!Mty{yy1 zBJ#|D3hU(U5Op9)2K9i@}YA&yms2h)np z){ISKLA}|7EV_m5xV5+ds*%)u(h@QkJ*XZVzw;JGiI;SM{nND@9D$1HH4Ql|t}WBe zEQU-OLf~T*9Y#4V*2#D5NeeC;kUd35wZ6ul$t}!Cw9Ud5kf*^6DCNcM)CP>GMSxZLEyIq@8&LbR>Sil~|1;yi|-?G*ICA zJD3(A^*-a?rc-trf<)Sk5IiX@v@yqP2tHfw#E#yX9cq&_x?F#2hUO^zqr?&}=@_2J z&~w(bCDU%>u@Q$Vu77nQUBySPDz&bQYVI!eN0H|YLb>h%>IeANT+69^tjWFCFK-d8 zEo_=cFS#SY8&CJD&90HD>PscX-Nwall)^_D1FmafQ_LPst%|bBNG|E~pY~7En-ptp zC?7hA*DsOsF!blCq0L)CC~K)$_)qt+*fT8g$e_;PoCPB|&$VyaSm|1A%g1d5C(MK? zbB(y`!S$@TuO~S!qud+`h5-?r4iBfP6_mN8Xp~W@ zZ$6*l=Q1=7Bq(3DUA;b-tf?>KmGf%qv14&v`C#PoKhLct?x7^DAU84o>NU)*(+99V zwUJ|UbF8DtvPTSXl2RsLnT~LJQ3`!nITz;CvzY=N@sP@FIL)jdwzO}JAmH*n63 z14krn!9Bq>71V~#?kO7Qc?1+V;ZJUR{VDM27uQzd#C~CtVx*|XSf0bMtrAFv+Zk;0 zPn+ctvm^B@l~o*M4_cV!-3b%A7HqEXxChg*KD6y7*4by43&wr0{D=nyn>>$vRg1`M zBSU#CuZYJHllT3p-3doRmDEt&TP>l5)r`B*gLeAUteK!MX}d9#^2`S)f4%SYri<7T z;eP9tImFQ2Qj&*j&n(2QNHa2Pe4hK9zq{ zu$uM+TS;Mx1<6TdK}gILrrwKSR}j$~1Yk<+Np zN_S-1D1E$;!ZzH>s^&e-67^s9v)}1O#kx2INF1O-M+Nw^j4Zva23}iZ628F z4O_MF-Szd^^6fz^HpP|W-iIi48jSiGHy4xKMuOTv(RGeS9FOs-VS-tc&YDg$gWDeX zt$j;Jj>>;BCq*cr1tTHOImIGr^2cZ{*o<^JT!xUB9OqUY|OJ9|}KTTmK` zCKN`2aF|}W@5fx?qnW)6QA<-sOY?fF*6~D&tNXa*>UiosstL3i;ed;w=Xt1hNTUNj z!`i4pddP-XW|5S9xF2)d>ss1IrE_~Ub}wx2<}OuFMErl9OVF#PQ~@Ap<0-KR4I^`t z=qqDQKvr38VP-<0GA|`hu6tE$$u!$3lHKhmc@Ocsj31}4^{Nf2q;MMxc}_lOLUhMJ2vnP-v^_Sb<#872UngYIc=u5K;ET(#mng>X;y=@@G3+)9G5pMWYtvT1{GO zsXWVO$})LU6 zH?YNMmg9Qo%~d!IJ5~$Z-TjqjoaMmS4lrc{p{9p)jW;GhIpMq0RFJvNOPz7dOQ)(u z3|?;M-hqw}sjR!5W#y7WvJ9c*gs1Cq+$DDP>IH+Q{nO z3-`yjy-jMC&|N~0BEmrmfc(Vz=hW0U6pMc*g@-rUaTGVYRtzk)~ zm*#JqZtQ@5howg)thSR083|N;qLjd5M_NQiK+6r$W~LveQ{E1T1;AW$e(S7NTm5u)RGU@h%Rpy;hhl=l%bB%jlQIMntj#gm2$!< zE_NiNCmqS^2<=nNE0t*2t7)%|Jx(o^q!JZ&ATsRiN4-O?c%u7KarQYOQlsZoj02BO zDm&S25VfQ`0|B_Oe%_rcGV)#06}5>>gbWtwYgooD+{#jRu{D%8vqK}#l8kr+aHsm! zy$P(LW=UfnV>j-kQRz`=dS1Dx$Sz@nDyITDPS8(rTGn=!Ej|_*WdZiIWMGCJMsZ4W ziqhkR8`RO8Pqw-U(JXLHDgOXgzr?uVk7}nim)T}zW{gO<*@5@l{3`X4{>^lGHpm)Z z-Na5Ay+J;LopExK&m5jo7BZ2!7vzhM`RHqxo!sj7YQ%F4KZeKJfZd zjUgeu`y5d)R|7kNELif#AIhhS-)wKFF%ZWajEw%ZCG-y>G_h(1DIGyc{{XrNp{2|m zsHQC=wofIa^H@0u>f~+qVcgNDYQY`f%8qX>h>|89NbR2AT9VevNC}P|ⅈ?SdU)4 zNvT&#@+T{CXjz;FDVz{J>D_e;GM=q(HNr)CD1sQ|EPRN`45u9ru6tFBUxv4uwV1n- zM%yZeKu!vt`TqbK(~N0W+F$M>-Ero(F58NO(2V+0Sa^_IB({Ed3KtA>_lKzTq^e7n z$T=e3r5k?&-r8iC)m@`1B{Ao49;5oyheOm7;@ilyK@K-2_{JTvf-6ez#S0UuMsMBY zYO{%b{(kalOH4!&}1;_zh^0TWRj$xBFN4Hlb(jE z>i!Z-xg@^Q?-8SjfT_3UQQxOrdiz%Ih2O!KS1+b`hUsGp+@tWh&1QI(T`Nu1Crv)( zq={qPsFG(Vu^!Z-=BH#5P;u14dq%V^V-@1GU}rA5Vh>z<)DYZxgDm=pje1bPQCvQ`qdY?|v?ru~R7*%_?V@ZGtjzQZP^#F7@;;a|BvT!UMvCdK7=28C1r#sJb`=n9|^1vYeRP{k* zM{B1-meU()P=!Oi81o?G@~YC8Nj!#ig-H$ONH{;0YiO4O&E>pUQD%24Rz&0KKMIG$ zR<`$XE#u4P0Og8CIo*z*N)(;!!K9Hzg_IW&KAuY}d1cfU zEoH*2nJfYH_9m9NA&k=8+#MlCdT>)JEbNgnnF8d3eV5em8%f)lj@;Rw&iXuEd-k zp2nlHhW6q{x{#1#BotiWcH~vr8M(H}FD_asOksC}_k#2ys$5*OPvyZBrB6HLKXcrB zR=%C!>z0mN{YLI3k7+R|CnV>nsNmB|?%L`Q5Lcr2VkL85u4(WjXEsd8u_Q5v6u# z*=Z3Y?g$HmoO<)zR;`bMr@Ki!yD7KEzG*0M7O&}XqRz2-JINqtXgD8Q--qp5WxS9H zV|3m(Hr!=;g|2FqbuUG7;EF{vML z^&rxdb{a&pMSE)=MZBI;^RqeHD@RJUg7Qt57klLk(S|k?RByFt+SsL%CzW)K9PrD| z5N@5Y@AU`nw0PEKub9v$&TKCG9VH{+Fvc#Md-A}(-y{Gtj z9mUkmAqRkY$T{!rSL|aL`^<$>P3Vi7kBFtYwvp~EB~%?X; z{*5~iDR($Ocbe&~G@0RtYD%bwC6gIA^%bM`JvPEIc{HG`uivLq+s+w;VCUy z=bAN^sdsSkToa!#4c(9XHQwnS4%8CTSGsR5Wn7~-Po-mOw^}qap^ZGD5z0)hjxoq# z-k_i24gIS5E9TF+N-vkuJJ6oB$`(4Xr`dEt39dG}2k$smj|Odh0XXw5om zoOF}BGn<^YEm_BZcL=s%iEig}Bd-TMoYjks8%Vaj7nVS)#&@cTNhIT+pr+YdUQSje zJ6)F&nK%Id0C0UNZ2thV?52G_^6_NOaAABhvG31e=~L)h^DI5sf>`H+YX$jSik4}k^P_ShF)l_sWc4*lT|itZ*jy0Db2q18 zJ!-tyQwWQ&`2%1$99Hn6`k2b1v2yZzp@-k{;1jp+G4!RLV;#t4k;3f+uYP+P&bN@Q z#v^~8LIRgLABUw`OF3td8=RtSw>EC>F-zUErqm=C9J9?QWP=ePo@P#q>|96#kZ+J zyf>;v`}1g42^j3&Fmc=(iB@POYgV@lG5-KnxaD!}U8bJ})~JtdJ1cp)02Rht*owx~ zZD)!>GAfxM&f-_0>G)Q0t#@W<=~%C9)}fIe5aCz-Ab$xx$NA}7Ci>o4Vhd{;FhDJk z<7vn9s`h>qoh;Oglvrm4rjkN(4^l_9Z}>C9g8mi0y=c6oEw(t%BoE@pY}Y+%u)c=0 z>9%Lb084wRm?2j}2#r7qll0)$eU^i$MJmfIB3F&~#<{}d(E8VNKZmr`lu2taW?&TC z{{RaQdarQ>poq^SV&`%F*&Ok}z^-3!EmJmhk})l#zk)JN(uZa{q$z@@&<@z?PqnkQ zAy)qJVT%Md^VPj-{;>tZD(Vk3Y>c5}P@I#Gx_wPix7YMYk>l57flPU3hE5!Q9q3%r zS|HIoGVYh6SgDO7$VOxPz}d(>4t=Xe&qkhI_Rhdajkv$4^&Wz-F1{&SO5bJE?A1^p z3RN?lbvf-=7rNJq{758&O%iTq*jhFt6xA6?>!K5>6|vsxclr&8+hr(bDtA1O%VYTr z)g{zHk|` zP@Ya(&~&P^`1?!K%idVp#kqLMQIn6Yb2h#d@f5*tE@j)X!`#I?5M#$xty|c1cp*tv z>K3+}{a8blBOL8L>b;y(-sGvawk|J-^=)G*X$Dc4$@c~nk>AjJRm**1+Tv*73aunT zR!kBMjDM$~tn}3)OLdOL<135}hbB%t`&CPr^#+z#OQl`#1&&i6N6t-Gv*u&=i5+de zsbgx=BeF4$PFHSoQ`~BgxCP;!M(6_Qhcdu4rVL;F>&ES`0Z zuOG?5gq(Sq>~qqk&`Fl7T^icNm+x%eMc2q=1sQXMY;s4`RV!QTh~s~@&K09mwq3a6 z{A#_N*QBho+A>BIG*CNaq4YTGPPmP&=187X8#``8AmEYIds9$LKyuW%F0RG|p4u@s z&~e5CA9^fwom%Pzog{mS0VJn6{QU(`hgA`iJ=-GzmLUh-UtCqGz9eay9kfzGwTW%6 z5r#qaIq65UmGndQkxK28>Jl?q`94u;B0n;N_m67kbv;$!nMK4bha|L$c7?}Lj`c&t zUlC=wyOKKu^PSs1Y;Ax6?nP6y(fmcI;dKclxq}>LJYY9)YiQ6>SDUfTI{ePi)U|W* z0za}Fn^$B6fCO!Z814xAbfR5%#NH&d+xBK#T$Fb5`IFb)rPKTa6|VAQ^QCe;vIh(5 zaa+x4YySWs_|DMrf%1$Wd{UK4Fn;Q|qYBbq@k7H}J1_lcD&N!_# zx3;u@v_yt7*;a(N%DDEY#%*mZOkt83QHI23Ai2*VpIW7Ts6!G+vrKm{F<@h#Ls;`l zqc!DGLOkyyZH334ib9-xtUF`SRf|0)>7!F6^jRl6*B)TAcpC~7g!@twoqPg+b zmk^6b@;vDgSgDMH2|Nxf3rDloH3hbk;{4hx5RGhd+rF*aHK4k3X)>+su!z{mM2z^~ z_fumGa);EO)FrjM-_sJ9mL%j;r;AwB z)E~C_F`|9ogl}wjBCTo(r`b%?n4H_(A1x%tNH`{@)2-}vTSFpiUuR}gk+yPBj@a%+ zbgLz?mD}oN!KU2V5~p0am1ImZoRGx!_Qh!~qjP9YyGUR6U^I+#yYuN(Cy!CLRkIN^ zt+?h@O{h4=$t1MAZXc?ICDv`U6*dJP^qV*DO6t1tM`!r}|a!Zm-=OKaUKl=4% z(&F(RIm|=|&RH2oa5`ePBk*O-%g1W)qRlF93pnYX*#4C1bf%6)fuND+RLi0cChY5Ph{F1=-jvC%FEZtqT{l(=_94sKkMtx!eH_p2OHyex)>4?$c~{5wFj* zas^{tYo0(;YFbBm4#-*af<1HVS|~Z9T$EY4eXA^yNp8`ghG+7nR>Nd==e1Y3)-Ha| zUf$(lD85?6L2bC`*&TE5Sr+Sgs9gxw+=Y_^Byry>{{YvmD{l_jk19CJ`LZz+ktRYY z?m?^4^3 zRe~Y6F_p+583^igT=t==GfciiHqC&aMcNKB$2}IPTg~>F5#thWga?_CvGRNR{VQWi(jjzhLO~iAVgs*Ro`zDE<;VA9~B%#Txq-&L-bNa1jwe zX-}6N#~-_6>MH)9pj_(Y9Wu$KYfOn6Jb>8X=Ct)FEh95Fkp5FDgKqMC+ndy5tyWE2 zRMVs_7Ow<5ZIme)QEzOr;3GMTYL&V)ocXQI5!SjD8-qW*t6zt6?;oRR&oV zhs+O6*&VAHHSe{~ut<#4nFp5A4z1XaVNd?k)Z7tc69QZJvoPTMW74I?l%$c-X}VqW zy2A`k?%ijUe5dQ_Q~v;GY4Qg|)IeukC|r=lbpo<&H4Q@PTrJYXuDeuV}2SS4f)2(FFOwl!Ab%-s}6ovzYa0JSyoc()qQ2zjDYWMD@;#0$5h6jK+ z2Q_ZO29aIbc-knK;4qrj0-@+!5Oq4tCI`3+{8a+9O1ddZ?_V z6?lLgH?3H0@F> z-5P}idJ#@7%$AgN9~^063C+CH7v?t4;z%B~BWikD#3G0Rb8x>ZD}u*wQ;%=!S$5JF zwQ29*ndaI`q*7xCJP*pWbjZ@glLnYe&VG4Hg35Y@C%03M)Z~&vOl(r>7No^&%If6i z7mo*?xv0nXrLiXJ?g=C6Bz58=>5uDETxNTC;hq^5SDl26t}?ywNamXbou#F-v`pm4 z7`(Eas5$MPl{Z0VSD)>Z%(6!;Y|5E!gXM5PokgeH$vp0tsLd%sv;%^z*LTwuE$M>k z4cb5k2GtRCIPL)GDt$IjJ(}U|PnJ|G?id*ziL2&GXe(T*blC1*Q5Bnctq2Kl7!bqU zdJjss2BU4K+&W1dLv6aG^JAGk!0k@HwA3a~wc2JGKH^M?xijcjw;la!Ge^?(IPQ!y z$Q7DXxm`1q{_y&mPHIuqIc&}OAet+GK1mgeCRH=@4?uk?y_K@P>cu2Y#vN8y&g}K$ zy=>|BFbcTjed+*dqXld?8;in}d&NdvN7 z%&WL$Futq^2lIpG%BZa9CbhJii1<| zex(#2#o_rb446JkTm#7CB9m0{j;lOZ5Zc=`O>YXc5TX0I z>~Y?@loDLAMqJl-Y?@CFy`+lwTB1y0T!(f%7XA~S^&B^rmToO<>?FEYml8FygU37! z_6M~$!#*C@yk!rUe;iT7Snq&0&AaM4X1hyo3tISc%j|Zce{#5D{Z#vV`_^?TDtbLx zaf6$o)P6<4ZZYgw_i_0dRZ)_uPGXa~B-2LqK70)WJ+8V}^zN9u<8`{8@VZPHN+#S~{ zxCM_mz#IWqKeFyjiXlJg4BK#^{n6O}06Nlr4J_bRlJrPJ5}sQhoBTy)-fPg>O|m(` zoD7Il?-5w8X|r7-i7lf`OQ=NGGI?iq^Ul;B=eea{66qRzxR&6}k_jXM_z!C4{8i(f zHZ3WvH0yhb11TkvL6GOM_pUoz@dd@mfv3A-(G%snC;~C)*y?===M~WmET^k7opl|L zLh%=mbg8Z!X|RF&y{y7qt2d@QSDN^f#QrAMrr4K6`CEoSJPyL5wbi4YB#C1LOOnM# zG4Gm5bSu|bo<(GiR>I1MDo~?%3EVJXK29nu9C;YaV%|b93a5IaRgZ^Pgc)kimBou z4UFN3ocB5HC&Ksd99fLYUC!whK<&Wxu8!Nmm$n=$LcVS@=O%h`M;$9l?%v`UEbg@U z5UUctOZ=|uj1&3P`h3z&EON`dM;YQ4UP0)2t{Rw`GqRlsM5k!>*0%}_3XdXiqX%&H z2fb+A$>!Ol3m8HN@UBZA?_;(qMvf*sEj02G4)$b0i1WcC>*-bGlkBpah$RgsG3B0t zeGjRwSyXb|-A9y`+xuzu+{Uhav%m)mz<(;yn$`_9-ssMQcn=|2GEn~jcb`v6p!e5O zKrN#E++s4)%EO}Pouj$_RaVFu*#+D?Rz@ZjR^i9@zeeF zF$a$%JV*d7j@k64Sm~N{uD33Ycoh!Q6q^iQp}j}F5v% z6MjfzioXt-KIt_wiV6-RbjqH2829bzSKiVjVDZAz?%*=E0AEaZsbP#{M!Dr@2;EF=5bJLKakxB#@OcFx|Pm51_4d z(Wld|7CY$#YOsb^SpH>fai3Arqqp)%61}skt9;WtV`=rrrCqw$gG8yR+ma((3D+2L z*m{5{l}Slz!A2;|f$k%PVASOd(n!b7RobjQ4NPxK$Yzq^QG$$2{N+agW}9}eZs4HF z3S@{d$jKEF+Q}rs-6Jfr#0K1O&U*bTJ;t{;tk+Jrw_&M6CM5xyB_&@N;eo7eP7`?k zQCO#Wn`D?>r4zP3l;)mD<12T2yg{pRFV#yH>uRy>mhn#VlRlEje1?+$u<)hUbIN>xIbP@VZ5 z{+*~+xU9y#%!)%m@vtL}ry;@XkF6wk!%&U1)e_lBzxRJ=84BNrQCk+i9n%@1ge;ku z7X8u2#>eUOsBW}NW|}x+l*nOS`5EeX{JpD7p>necAl~dXIh8ItF3@nq9)r@f^t(t& zQ+PKk{H{>of!pa#y|fm@&asu5F|bH@lhg{`(sX5#@CfY*V;F70xMBU@tt~BaD6>24 zw(-Q)itin?&9RvP;6NY04s*{LsKi%MMIeS@JofPBP$T=%^xz*)O4^RfOG%jp%A2G< zXOtH^MtB(Y{#BcOEV5i~nqsHT!-WBIPh;s#G|FnjWg2y#*(G3-Nx$Z^bB&`MIO7zp zdjztBZE|i2lbIoW3=YH|fKoo49qXHMDf7Vn!#Ktp`-l2fbcal~w)-S#$>;8hN!x{1 z&&)CF#T$`w?WLsGk+txYs!1V;L`Dk#0Jc89wH>|n#hW#hqiNl`J;xyP(~e1~;hSVX zWMwY#uHpl7$p`6b)q-2-f7?cQe90UlMUF?Q zK9!Yw6f!x6a=8nZWgL;)>-4JE+M~xZ`B51+9C>PZQP(us@8&!hm~T1S;BqLi8kX9H zoLYQ=AdcX(0J1Q`raI$}zvt=7>q7eC^`wgIIB7D_k@Fuxp2D>zbz5T3bLOlpU(1AG zulSm$=lRmD)slvG85@URu6k8P^1G2Gbz?RSE=@w|V&>v(3jFO?iDBF-aAa0w-cJn{&^9p!cjN*R=abR=d*g zA^>JGBmo_dVUFkeQ*N(bT`~0w7-pMfWu~`dh6g^Ux3y@KA;~R^8iuc_y)D@LOrK7j+91;DFMAdv`SLJ3^g2xu=?JqnTb8Jg_7A59wQ0mZQuU zw(xmi0kv7d+Iz6{rsWu+Ml+Mt#JAJmO}>{?ZAs%{2vY(c6Y4u3T4kk?x`HUK?W9Bw z&m4idX3s);f$#WNNBxx(IJc4(+~BLpoM0Y#t5y~UG#}aa$^c!myvP}3$3-5UDphj* zh0aKLKU=y281H0I5t=h1WmS(x$K_oHi}3RK^z*1{J0y4g*^mM^5!?>KwJa=>WQ<90 zGc1h1Fu^2$57W}N?DVG7Zlk>r%Lc)i;+G|J>&<0T6(+2UjR>c6Fz8lx7R#s2Z4p~^ z4x`@WA8N6C;cL`_+g5fD z72+1RC^5j}81}5x-SsWSC85RYvtHTSOFY_{UNY$_kghwa$4_JHih?at-R~i}NTrdb z0apX$8%1khSfk2qwHuUjPGsNRbI=atRc$v%(=3R#)9ziwk~5PdedZ^H0R7SFT~Kjx zFq9f)-4qD5R@B<|BJv`iDpbe-e-1hm&1)TVO=%=(r&z#jGM<~g1!GUB9T`ubZdHo* z0J49z_*XfqYB$%%?2<+MxTO*#k&FV~hwD))3ZvAeQNd_+num=FT7fiVmXxBhoO9{z zRIhb)OSQCT-4x0^iBCf3s*&3swZvNAYVhC53^R$u#I%;~+l*xNWpCjS zZZ!V@Gjm~FNH^oxt!WxGsp^pqtfjeX?P3h)R#cG{u@oQPe^PxhRaZ`y)gBRW^2T3w zSn=)$pdZq-t?U(vL$XCfm%+gV_0DO_Z*0*#mX|10w#7}vk?W6BSI=Q`T*$c4?IncU zK?!K$Z#&N0lOa95u}Lq7uWzMGTZ^@bWNwtH8&r>OrnhbMyPM0{;Y*Jr<_jy8By8?J zwQ>A83{b75nwKCGlEjh;=dB*wlwQi`C8Ak9ouRds#o{S(AdTdImSxWjzt*?yrnIxO zOhpolXC>x%{`f!rdR=16NK9Kwu4F~Zx0`~?jzAux*WR)9U2K5abwyZ}QCMUV@9+I- z-PU>&WlYn*)~%;mES}016OSx1FkZjjAJ)0cj}u*AOf-0}gpP-UHfO$-tK6XsWN>BM z7{?or_l|fK)#=(UpQR)*+DIk`3hK+dcO0nWrg~IbeU7Q8?)x>mpE6C7M(dUe4=z8( zwc)g}oJ$#<+TKM18Lhrj7#>JIg1PEdl#L+-w<^FbZ6))b1VaqDA;DmMGyW7?*|Byj zDtXN&_c$R~6T*Sotk0zjX%=OQWdxR1-SRjizI*rlD0NF|6uB}00SoW{0M@Jsg{$qy5FrlfZnxGTo7~0-x_=ty8|%og7DC;^ozHs0Tj0`*Gf`FuNtr#+UY`-DGn8DlYQrk45&`ED1Nf($>S!Mg|!@sc2V8N*BieBfSNw|KlG_o^Xx$5E0(*v-xj2YK#ADQv=}bd+E@zOe1wq>3epX(Y$G_=W zGHWdz#J0BO)@F%!#Ms=R_ZjF7Mwb#IwBboc2hNSjA(z|Iw2U889FeFcgHCAEQ%6}c zSpz@HOLrrotc^>=w|7q|h`><%hA@DtVBnGJf0b2{@2^kVtst41l&KT80Ry1H{&he^ z>1KCz)w*w&Yu{eaFkk4fOAt($+AOb{!3! zshMnGy=as^e3|lOAmrp8n5fqJTR+}f5c?b!l#GqJ^gSyjwX2KiKFb`W`D6=e)qX;M zyiZ@wwFZ@V8R3rA;bR}n@~|L!oKBoAtW!^66bwyA5VCCVzq`@m)0mB9oY`u6m#nDi4p^mnUj z=0wS}n0&ku^DASh^ffP)7L=rC>Pe_w*nOJJgpwC8xg#579SWMM4vsaeVz9>~cPK*! zjC`TKpW$AGqS-1*6l)A(A(0`GK@L0M(Q^J7l6RdT#IYeJDBo@ddt*O*8|dP* zyM{*+mbWh+-!OBP_s2Zc_8L~Ja$R*BS^TMn&o(#Oug^So1M{sM-L)Z8*Fr5eD;?4& zlIiBdi4fdw0QDn|nd9kO7V_+hA0pSv2ncB8V8n6PKK_*rzKUiFQ@vREN)#^AdV}jxDJ_kXcev{q z;sKe1+;%!SIlE=z7b$j@(T!Mig=u5&ZnYVzDOS<4tzTrTCv80tu(>c%^9Yc=)M z5L~m91IU=k$5H4jq`%eeu2roLoRK~<9|Jp&P;uLe#GQ2sJi&8m8=#D=ayJZP zLZi7df-)n%lJ0bd+TK4gq$1$5f(m+p>rz^+>Y+#>`Br z7amaK)4f@3KIR!bt9v$h-GDNN8Bj)h_N$hbS~ATH7e?qvu6*=EfV;oKoYuvdyigfu zOo-wQgCY)q=C~zMIcRjKSrwzvO!7;AEU;SJrLat}Cv#_^$5!cpI@fFP@M&5RxwP>@ z?v?N?ody`UUz;PKu5~XBz2Uot#h~1(e3l@pupKe$QEL7qTZU=nW(?zNF*rYfAIg@q z29h;=N3KRL?kAkQa!HuHv5j`3l2=^zph_I;`iPD$R;ZW8!2ESWL0 zWt)x%u&k-(^JSJd9O&YG`!AtP||* zDb6Hy?%3dr@+j6c#EAW>+(OLn3A}Uy?n=NA`9}QX9Jw zH`-3t4fhuu?xfLd*5g>3?pt~8*IdNv|-~J_XPS?Nsvg4?Ui&> zA_wGP_XF0JNOcyB#coz%Dl0bi_WcD*Zo@<25H0+7iEfC5?btE0NA~ph{{ZXNdyPJK z^ODBV5<)TL$T9KIScN7v4VW{Y6+BXm(iTm7ydLo?McH-`=5B zaWC1Xaw(ujjL?~iOvC0`J$(*3)bMDYRN^6QEnFzyD-7o+wku}iPPq@|TgMlf8Ngt7 z2KULRY@#VDyAESGG0C09f#>KePj8`@u}O)dX|YEv!T>H6Mp@91tIs`Z?w?~EGdxS? zN#+hgC%Ncz*P2@wlHM7l5F|{;VP3oPdhyb<;L|Ri2Ab4~WRD6I1H7MHb`^x{n#P*3 znJui$s{=ACZuy+9eqP-v7WK`vcGtE-;G>=ivwSOMdE#A7G(8=y+wD%VC~g(Ki+1|gf8tLHYTgafVX)TXw@{CU zdoXs$n8*%$jyl&hM$@sqGaBDdgG(ssY}=%7F(3_va(T$l-3QW`(Ll}QB7K?XlZ9Xp zm`Ct&`O|d^i6gc*cNRAj8D%0VcZF48IA39on5WzwT%pu-yEvVZf7Or=mO$<9eQPFk z-7#l@1WvcM%BgS)2N(d6+Z9>oi7)>Ev*wyLnm__UB4C5{?eA7g#d`w7r^Mb|$XS2C z48&oXNa^@}YNYQsljSAEV9OEM(ja3a4!+tEEuAO7w|LBq#lFq8 zS3c+YcBz%#guYXwjbWTLP`rjHK;JZ(z~_Yd-cLn0bvL^yDhkkn>Pv=&qlKxwC zoCVnnlBwn6KTh>8h6jR zrx_8XGDeDi5Xw^s5* zBP5MvqXpIYWM7BVT7W>zl6QzIT;J0E)KwHTIbVkVi4(UQ?fq=0>h9@Wch zo=N@9+590LAU|!qBBRr*crM?)U z$P%8JQ{NT0d|?pzZ#T-^F+={bdu=_>wPMazVEBqeLCD;|f!ibAx3jUNbSlXdiey`W z%68$`1P00N@BS4CL-(ad*hU6l=D_2vO?xymGMIskqJYZINPa%>s%;{nC>#yL1M2`ORIX@Q!tUlLWr#!r1UcP<>*{LFp3tupsevYZw^PvM=jmBmXkF4Qo@*CuC(X}Z zqt`XBX)CLlB(y$gATmn7E;|A{)X7;2O2xP?qqDWRzPPzCi0!be*Lw6U53OrhLt||X zy!uX}@gyyn^&iTeu>v`FWOX@JVUzUysi$T; z7Ne9)8o(P8N=r#2uq8$~!0bm%Q)Wn?A!ZT8z$s_>jxp=&o@qRWw{-GSGR)hVv%+!T z{3>Z$Mg+Pd!mILyj{vuQzgiPWb}{uRY^)#bvfRs-!n1EXiXKNj>t0Bek*}@(b2Yz` zVSaFcdUXE)^;L6i`{>r=2&{0g_p`?sr);<0&nrIo@WD5Huh^e&r8hJQ47NrP#RS&C z!mWv*i};t{^rtL~9oT^tu;+FG$wBH5YFpWzPupUJpL&RdF|OQTbtaYJjX8!@augG| z-~*1B^r>!kYVx)N=bauvA zkQV*mX#VgZ^X-a!mW>24-Nwl*Zc5GaleG2(9)g!KNf5oPva<+~1u>55=y$|Pcz=kmZ^snn zS$PwpDaOIL;FTPL#-Xy(9Cq9@OKA(cLJyxTZFRx` zir&x2B@jt$=W*KKEV<|LAI_#lGa>s-O|i)_-A4R%>4DejQ*%T!>=1(JRd=A=BvXR@ zfnV^ZEwD>AvOrxKcF0@rvGmF3in9cbB%PMwT_IoUgN0Em1K2S0c!1djqO0hMhRwg#PR%J2gaN`Y*cT_B6kpn>MG>W)s z1AMsb0PC7JDJDfN#ri{pg&N<=$L?ds=gxZfs2(YjeX=ubxhfe{@Pir6TJjPxE!m8$ zmcuB8xXIx0(3*jFT*#Bg&m%;q&QQ1je+?nnhB#t2#@R74d5l&<32c+x_oX))uAgXD z812?YVn7H$C$K+SnrL1)rZVOwRLfie#9;OMnu-W*BZg?T8B|2^9j`GYOP&ZI_2P?# zhpx8-H^w+@CXV7VzuFIQfX0OMKtH^FzZ$dlwuas8_xW)&ghC_$vJ=j8=}xwaOPln# zn)(%uBS@Ib$S4K?Zs#0x)L>Kxd5z2M4Fn8dfPb z#|fjDI;`SGOoCKn7(ER_Wu2|#xU{=T8|^I}&KKoTjxxVmnVwtAX~l~~RU<5}R|@Z* zo~N2tMV`-f;ELYo%iFhM2v2aZ6oTsH+k}oV-+9>J02i<4?NoJJ_-3^c z#sURgvj+bFTb|reV7Vohr)w0ga`u97qY>;N9pLxPNTO9DXS!C2WLX)=+qKU`&1R3Z z-NNu$+iW-jH)H%>gB00jxbkF!?4+?$9FfAGf69jjH6)84Yqp5U)0A1*unI@rZ1a)y zq`20RZz7Isf8Yx!v_LYr>eWH6E(*1~T*jVcLV4?6vyK^FOL6m0CgzBA z2mb)CRxP5D7C{x6V#KqT=WzDVKq;xZ;Z#QsW!<&#Ff-bf%CRhj+!t@N#{)xv;Xuzl zo7B{B$ra;&1X_pKYa%~G;4B;Ix2_ZU!WX!{{R|mC~e!V@?CJwUjt~SLw0Qj zCU{98uGv>5m)G8$8VONEaxDAF5|n&x9+ZGaxRz%~Vi7D%a9z_SkFgywOgv0sc5V9u zJCX9Yvib^JvdkfbY12n;(-1Z|W7F?vu&9h~Vm88cT$7!-EjOSZgW7<(HMo7kHH}A@ zc}=-5nrzn-!oFlu6mo@QXXSw%vHfaTRyJ_*N-YFx8!~6_bjP(;n(&ItF#3sxs<7}|^)l(I+ULZ$?anOS4O4W4&abP07dgh?7WMylMde93TF@I7+2jJ89NMf4abN*VodZR*QMK zx7!?%wn~@DZrlpe+8N(depj-%wMZ>f$##6puyWjYtoiN|8>F~+W(rA-3{A-+xjurK zYS(wLO5sZGP!Z!eG2rq~u4%V3My)DJkocARVb6ri{k#?2|Tf}%Qge6l0fT|o}!7h2E3TKL{h3hhn5{UBeiACE&BsB(fM}L zlfBtMV~)FOTU#mjNj1u}ied)d+#Rev+uDmHE8Mduh%9W$Ys+_jKrDlReGV#F^%JV8 zTN$G*8ty?U;2%yZeJf00WRVm)n6OZR!)Mppi|s88EfhLY5@QlftN;i7p+aiqS=h_B zu(-uJ2y8-1*L#j*WiAguNAT6dYmvG{ zT)up`6kz^1;}pH3Lr}TS+*m3rZC$+JF&RGKR&JxEUl5VQXSEEQUD*8Kd;3>mK94ib zk=x%#7nXe4M6vJ6oa7HfR9eFp<*f?GGbIviBdT9s!Cy;a%w~Q*QJ#YWu_H%-Luj|4mn1^&GqaBQ^s6yk$YWzEjaX$>6o0J$0BCwp z?8-z>YBdd2zRehm%OAVA+(0aPdcpt;jkA(Kv( z9IjGn2;^g@y;NJs?^j~Y3#zxw17L<9sHJi2Pk(K17 zJU&;-KPVoj6(0MCf3*o?WLNpr^;~-URau%i)Vz|N<%<&=kQ>tj)7rF+*)5_g=1Y0Z z*Ag?q5|(9;`0@SY=~GL86c&-+HM_YAHm=}C)6mpc7uLl@o?9Km5)i`-xa1mRYWC@C z8##thBqIoMwR>i*tD`p3C)1;}c9J=zUnvuMIbI1Tk@!<@bR8}`lF&|wt( zD;Dnkz;&8JV(L|REIH%pP+fS6Yj%n&OI7mZa12g&XO5ZdDE4mmBb^;gxAs<(i)kV; zyF?avB*7&+5&3kghgr0>v}kQvRa$0dVtTLle>$R&UR{~Bi>>JiD->~K=OlU`N~>|B zNo{X#E+H!7S9L~wk~;(bG`UC2U3;5*##?o|xP?TS1Th~szpXkuE2uROCGUxvAP8mQ zFnVmM~a|#^8tLPp`c#t(1|=uqzyo-m?#vJ%IlJ3Z=>><#JWJm2J#3 z?w%ZwXGY~c{p!W7)xi+?*J?$x5gV%HWcq_mTYHGDWwnyi%Pyy8Ms|$kwmb2k@+w!g z5l0=|&J>j&FZYuiW|M27O6-=!Rp$(lGfi)aV?_W4KVM3Q_BhsNhR(ui10Cnfd>B~$ z?cSp_=Tjyv-a>*xJfgf1PpR)p_>M^toJPo?O00N)dRm74Uon2_f;)D_Iu*CHiK8>DjrWYINe4X_H0GZ2?4)wa9yIxvYT$14CaJjsNfl zBtyv0Pr{l_klIGv@z}D$vq}mdlpgE#thBS!ttD}9IP+zbQ^fa z@+!o*A-8eQL!V!2)QiHF0yUEQV-&(d92U#4>^;44Ny$fcD>-y4SZRrJXW2MNnE{hL zhr#KZv~3f~nh|xw06FMKp!{gkio){Q33e*82q(r=f4n_ujW|~;3U2`9s+@v-MtW9q za%|Bkq-bf{d>2=c!yUAuKt5+@`CNJhsbejq!tlDG2R>q44a5xe1lD9))RrghNUyOI za?Ox1d#-9YHCQz=utyWL*(5QSJCyp5>ru+s?-XjFjN6-Y#BzeTR{4)P&*4cm#k7+M z+H^;3c>{0WKHimzo+1{g^G3l6IT8lssUDxhMe$Luk>twP< zNe`T3i5O#Rbo_JgQ_rW}+wQZviD5?0-!VDQay#e8nNBSJ`qFr7$k>ymT*(@(yN(#H`nQwii$68hi%8LdkUL=dRmIa`mgOXoK}S$R zA?=FSv$9nmydjXN$p;u7ht`~`q=gz<>QIABiDWXhqNJGG@Vgu!^*-ml4`2%YommlG zxg-)?{{VCz!nJQ+8)Tl`yGgzvQv;Fsbu~ugUVCODOkg7JEQ91f(z521wluOsZLGvm zo9Hyje8y84jhmLi>yDJmOMBnm%_Lr0+pbxU1pffCJ?d>kQ1Ue7y3udZ*cLktDSQ}s0Br6D;eoo%+a;hR)}*2+N`P0MJqW9R-N-MOt@6UI6} zp7)XjNyz=kau1fE;AD3-=el;8sb9jz{aPz~gxwy~&pq?oHG5ZEEd{OZZ42`lX(W*6 zIUfCmOsU59Dm5Lh(bZq;wwku6MyERnobBBT05W@up*D*>tY2)3>;*FwKw>1HL+w@c znAxq`?i=`}0zZ;91hEJBm)5p4c~be~((Z1RcZ?*`1GO9cO-uJyhKt_RrvyJ`NhFg1 zD((@w0-JuHULYW$R1j+f8R^&?$L8c&NG9dXjxfHDuaqH*lCQ-D5{P;$`5W z6=LqrYwJ>Cc+eCm*^ehZ38tD%HE6_1gs?T8^u!i$(5i8{y(?nRLwk2y!a@Q@==L1$ z$3kitEiK~OvBs!bfB~C7@FDH(N<2wOCr@d2B>dTbD0%_=A&t zs`(+&6ypp%NA#qE_8l)zEhM4$xjR#;pRcuIU2F15eDnFyvzP$M=y~f=#}=z~BoY~; zXrCeDjepfQzt)9MxH;Qm*wY#dDN9MnzbW zc1sf&#Bs=QvJ-&A*FEY8tc%D@CE5s^I6UN@;;C5)rpA_JkOi7HXT~Jkz|S}yo|Ka5 zvT6~@J+p|~97sii8G zV5#46d@E&TZFHA6>AfEdIxEeWPqdtE_dNz5v?@<)Pk%O2s2CchascvLs!$YdGLG?)_vXnDur(_~N0z)b5}q)<;<_lM3N* zKBFCKKkR*4%~s~>6Ethp)A&8jYU%g32>@3_W^z_Jm}Gn48g1BGn9$rLusm0iJ3Y$q z;qkZW=~iuRVmAwHj-~h=bH~5qQ(WoxV-kX7B#|s=G3BrIC)3iB+V0-T)I%~cM&UZ+ zJqbV3hVQV8K2_o(!E)&oWROC~h9lJbRT(ejvQuW$0OaAN#~A+r8iw~&zrDCAeKcZ5 zA1tx2%k<-=Q){+@2KzuV83q-P9Otjnsx>cpTzg3mC0_x&3N**@~3dg z&tg6519u4h+=RZ~b|d4jVk))G)Y3eO1i(qKVM_hs-=$WFG)cL~&N(Fi06Nh^$i>aJ zUmB!Qy3Hi#VSXSd=HuR`nrnGxCNaYhz!v^hodj~thEM>`ce3a46+8)Y(6MD!I3xvJ zAFVc$1t!a;Nr7pJ;xz;XP%u6HY6iQFb1{v}E(+}F&$UR4bm~+pZIc1z>x_1-6XEA; zM!JMD5-|~eeqq+La#7sXMpD?zF-JPH>~E0mB%BPIo(MKOUEHZVKvkG76-^fiq&dyTZRlIm5rdC`^B zD3Ub6R`vE3YQ`%|7W+twC)(s@MaU-@%_C18{0S6#lEhW=fg|D0Jw;|*%`DlLB*w=o z`;I+{1MseOc{6PyJ5<#tnTtR z7#>86FKr?mkb2`Hq10%#O%-gk`J;|9piR!`(R&|5SLL|4lWn?3j6PptsO{@n)|!Nx zWy4$BB#Rmhx=1p^C;V$=bv+_mBLnO+$}(IZm4{$`D;IaEva(h)Ei9o_TXa+9hi&1B zCIERPp6qICtv)MQ1^jZW+czT($;Vv(0F6U+_V^vHtehlrua>DVH~{5|_4?Lcq2eoO zT*n;h$=8AMvG0LYp(zQ@F*U8OZ0*#`CERNhx!RHps}D-Kf3;-uhSpivA+k2G^uXy{ zP2Y;;igkGH`Oa236cA5*3a@ECvvU(m0A!DG%ARmf@~u6K>SF7zi0c-0Sr#j6f^yi7 zLdSBqr}U`Ct9hrZNn>!oXiz{vn~qOj4P@Ec9EYCem7DIa?x($IEN~D>lPeGgNAAA# zawHt>kd0MjonxLw;N=(%yq=)?)!8nsG{_aEi5Q05PI$rXRJC0)($9V3v0<}vNTVe& z&T-zOwYN#*SyjBjIpnb=K=lHvmMsgKNshVk&9#)wWwld<%0eLo5_^;BR7Z++9Y$dW zpEQGWZ)uyWkM565bgjEhBEdl#jnpP7kCzxjg4jHeeFY}1VWwF~q~0X2A==YNz>EQb z{JK>o1<;n{*5+Nmhwe2Cgb8)!wa6+OLQW6ArCqzQu(4v&>PA`01#yfHKZtu)eV(Z$ zyqJo1k(r2(C$BwoOK{I{4bxnsF>De>0Q@~Fxm#jQSicd7T9jyxdZPjNv)-xO*~$2VH~lto=t{ zp5;N7MH?4rkSGTgQHAzI%4#LabrWpv>cO&@P8J$fiPOjFnY5KX-AheVVbCws$%iH3+7Ovng%7h=Jt&YMth!LYbvz zjWM=X9FQrRWt`WD@=n4qi^CE6an_x4Zb8DPNIbYa5PFPMB^1Wnk|T=Z%^f_DWQ2Ud zM3^oQy*61TmjDca-zfv`4^OQtX_oRKA~3AS<-zKGy((3NJjOJZHNybWlbjrN_RUq& z*p!%p264I)M?WdgAkxdF&c;bC-0chVVEm*GxT%N==3xol77o-sYAdg|>IiLOkx@`( zBn!rU4k~$=?5sz3CBuhk9Z(2@fKX?TdW`A<)+YNQ0RrYi<0n1O(w_bvyjFI)jirf{ z8ImSAj2`6G%V=Pa%Xn>7j^d&@c@6Gqxhn}KR*vfS<~CTFq*Y9kr{y5_r+t?0`pz}J zk7}cng&5MJ$%L1{U-^5RIIUFjT( z2yx#Yl)0Gn5cq!Ldw;ZA+@w*U!aR$+%{b&QrakHvg`k-uD$+?B?&G07>uNs`T3kRP zhTb5^tjKo*kbS7Oi%r%fh>2X`ipUV-@f94>>IXfk$oJ);h{qXZ;45%FzLeF_r__l1 zE2_MT1F|n1dRE@3x-2)z9l1s2V;LMb<50e*Y|kr;aUYbs6L0Y_^v6oICt)<0%`?ML zTU({pyDLU5n6zlQ23GgQO9rNqT>j?OXY*5Ul^bIts6T~8sr|P0D4pF?3AF4yzDG~O zv)@UMDB4ApmPpfv-f(D3o8n=%#>?wPC;KqBQHb!Vo_X$T4^zF>EL_1c9$RB*h+qbz z?DENO)=9nEOa`2s5$GUjD*rv0kf-%+-bKRQh3 zc1av@{Hszu8pltMeDdLuK>>e=9+^FxNnzf_U~6-(0k4kNdE|FarfoaB)+K5=^Dsfk$^F*x9_3I`|D(nl7c$^u)g znPM1`f%W=U+E~W&zNMsBNJLQl>AUxAo&NwD30U1)SeUNt81u=Z3`Sx}H!)Yp+s03| zZ|Pne)GlXDN@zD1Bg!Z^h>u@-#&e7ortpiILq)c-xpO3-q{?xEGKf2I>sIz^vCO`8 zoS$h2X?=hIpTqSvziZ*igdS7axJe6QJ%AYx_ zgxS{`7DqP*l`QiknM_g#CEz*ecnw!9^vS_nSGZYJIo~2KHlIW3TQb{epJR^h%5^sY z90tiH2TGeop4aVOeD@JZ(Z)XF{o(YirCHe4G}Xu;)BewFw=!>xp*~8f$#Kx1twQ!L z9oZ#}m&PG<%O*N*K9$l*YL{|@Yiz}2d?5?KC$(m3kwpgSTriOsh78!pouy`-Bq za7h&GZ05YT{>rnIJW>Yp3a)k^uWH+}wY#^ngY5QZ4=GBsjtL{%^{iREX&#vrsU4C; z-cXU+FfzkEy@h69d|I-)okPrEl>C_c+p*DxIs@-l?5j=ePqd{4xzkB?HM~u6aQkCM z`K0a#xU4;E#r78SNcQgT>M}~6K<(DKOR2m|uU|FY$dV$%1S?=m7|sD6wX30c88xM0 zJ?ltQ2Wx|nGmIQ{0=D)v>8s6{y3?toQJs6^9dBH_j@rgH62@|YPB!Pc9<{Fr!!2I+ z=-prHziEx4QlSv;R_aE52kTud9s|;}yODDa19?CV{Oogaj>^pfjTjig{U#O=l(>EFFwKY3nSlRX`f z_`F-J_=aS%x3dvT<$1BR!-?)$Jrefr+sl1YNWJ}%U?OZ!B(f_WVzh;D*Whi|KQtc^C|Y}IDDBog>B$a8`^f!eG~ z9<8n3HKZ2q^0Z?hoD~Dp-loyKEvrpB+T1EivJvDlUXT7fR*6C}vm)}8v@9m2IZgHu zD(`IZ&y|jc-mNq0S7cw!XaFh~Zu|m&ya#I0(>yC-=QzE$a>YPWu2&78m=XPdl|_BB z$>qFNgzW%CtUm9r9+i#a-iEeoR#UUkZYDctc5vjB7X-2|x3z6rX%>+>e9Y_@5;D2# z+v!~Pr||<$(eGNuYk54g8na!*;IAXF9sRpjHlgtYSh_O*0A|SMGJyH9uRg~=Ue!vC zNw8I^#PlsoTDI`+k$G`-aU5?9Sy>!s40sKDDLc-wBJEA5@kSWp&viZs(8U0C8GI5ThH&iB6?SS~?Z% zwVg{`k~<-5ENv{?ODbW4`}+#AejnZ4%ClcjvdBnq?4%cd<2}8rth2IBHaW3o=)wc$ zN3a&pVmtm7J(;+Y&vcP(R*0|?FUq;=_|{UbXYQIR39osay{~{)-tIe#X@K4_G?EPC z{hW8Mk~_tSoKfnt6niNTrq}ZKXiK-beR&9Q`W{YU_1# zBv!F3sv^uT@_?-4l1p}655lsNsaJDF?CET4#jC_ziIE}P4p`$Kja9z!#)EHQS_fHV z-GwSX;pv*=wOv|$LQ=LwPrD&zg>aId_#JWSRH3oHj7Z`l(?~F|k(_$x)~+~c?#!i$ zmdMo9ykRbT?M;o#Jpg-|JW8va!?Q zk?rA98G{X@g+0g>r5qB?EQ@Js(722`#URRoj{db?dsp6ObX5$2n4e!zJu8{il%A(b zrx>jXq13Dr#o6Ihx{6K5VHlA(#s_mrcdJ~0w!;Y0;e& zl>>nO+3on%Ta8U!A)OLQ9zldsoSb$!>?)%M$&~DBL8%LtXkmdN5uK(U3C4QlRA1T= z%Ol!E@rR84={ex`_oy_f-tlEytt-r7f?`JqSZAp9s~1;rATrBlu`4g#Pzgio3F}&N zB*^D%tu?dUBSz|&Ir7y{0gnWadVDEB&MHde(}$g`k-&eAxg# zVnzW4NZ`>VR(A2qE-to+qTT}@U)3swl(sA9 z!L~jB04Q`oSbz2EmFLA9dtDwY3ttX20xiUnK?mPI=QYb}zBtt8Q7lT$y|U62`A5^< zoGDb8oZ}OxpIu7`q$?wtLu1U}oGAD8tn2R=EGp@1d*-Z)Kha?7zU95^ozvR?09m|d zxwf5r!Ol3xzAIweOo3TdVptU8%yZBG0A99Kp$*9Al$M2f?C$kR{D)>lh?nxi5^&zN zsi$drRicS+EY+I?2UGV4zr8@3bo=*7xUB8Q(~N=rDrdL4lG&~vbsJb_G*h`pPHLql z^g>IyZadvKjWr}lpb8{d)P43o_{~(jd2ZCo6tEzyvLgM!J0D7l-L2!f9#k&ATXE+R zmt))MSDNC^NF}_#)HWS@6!YY>RPysK)1bD$&P<9>$y~M*j0ARoeJbv#NNi7H=}#d2&I9QNatI znCwkt&3S(*6HRO_S=hTPFJDZ3YE3R_mRpIfgltj}R5V+;&m<1!r7&LWw@IjYgMa5`WonbG2u-D z8@JSTbdzi)MXXcGO6Sy{rEA^zV@y|sF+05MZQJUj(z)eYH?g#7G>&gbmgEJC zP`4;gLgN`9=e=*krdpF6kX(K7nAwRrJ^q!N+E>`FlF=`P%!RVVjlNoXd(_sqt!(O+ z%BgOQ3Qp%CkN0s=Ep6Ij{#fU{cB3v8`!>BU&?m`o$H;$wPY^4 z3hCwnWOEWQw~%tE2VLH|?OJW9M`;9iQ$r-FARbVU_>MYrSybk|%8iQ=Sx@sfmSa0g zw&dg=TvdqlhK2=><=rzG*`9a%)q4$B&pQlKA#=NR$iXAG;o6?Jk%pC`y%J24hVpqT z52*C|RzCC98eJq;yweZM_EZWoLmyG!6h~oqcWlpd)IDv(E1pJ>yB(rb6I ztgjFZu%Dk0~u2=V||a2;zfUh0~dTc5Sc(GT^KjGxc>n4R*-}#>pe)6 zBHX-nBifQ`QukGX`>R%5)I42drUhGl7I;d@o2gg~g&jHXpGwKNx$zf?Zw%J)1oJt! zE^&f76OMweczVtqcGl(PxR!P*-h9QrQUT+R!n9$62+2m+vLs4DC!jsYKQI!}*2)S+ceG%_wwJ}PPsC1bZ2XCSE$753I zo_3{hWSLIKP+&$pjC$8SH;5q@0NNu&fDn7At`m49Ck0#t(3P>Wuz0`y4XdC7uL8tdWodHamVb$Iq=^_>BZ2byV{X z*^rea{{VE;W1msDWrFdDXrkP*VQY;|)rCe>HBSipJ!$Z*J&J zh{K!{>HO=K)PJ@0E2(C+v~@7YnLAtsFXL+s2kgegHx@XTE*U)}xP0)io=P zx0a$WHSnm(hGE#_wRE?h7n;-zz{WLj*y>RK09w(5Li;4LE3&+@zzLB?PTsj+r4Fh~ zL3<|Nr#WTeeLZbV);4XoaT7-JWU=l&hHF+m9oEu8EQUDC4=oh|$4rlJty)v1+hE#3 zC|DQe)E)j^-SWLi^r=6z^u&xjQ>4;4Bw_e)IpB5`&pFNRYY4$;g@y}dNhg}nGfG1F zF@f@d(BrwL-P+G{09{5&)>PfhCvNb1DFe_|`%5;|pUl%7wZR3HIpgRt&{EHD7M!he z@w~H2!Z8Y*ls=>%=UlR>sj`6vk85vfdb4X+dr;y#aN{Hs-#*}0y!tB(zp`8M%^5b~ zMoOPTJxx=4d!)OKq|?s;GKomYZ(m_ow4}dVSsG~A%QGLd+#mxDpHELp#&Wr=Vv4H` zW!r`)J;$|Foo4<0v~H2CvF(kek3TkfIqh2V`B28Nv`7X?c^qN$+*Ny+ zBY7TMc*)E_ER5M*-O!I}l`8{@Uq#bW#%$Z%p;k?|3vk<&M?W%?(4IKyMdYEX)R*`)GM@2g=`PK^!A}_ zp-A54Wf71!4oMPw3b4|{wRT%@2HYX!9C!4oY@~?QVi<_COFQzrKIT8AB)1VmD242q zpKx%ikCgp;)!TN4D@T;<46V1zEzx^7ztXee(`B0c%9rbuJG_|z!T$hv(x&Z>)+hTc z>uL6j*$TldO!ZaC)N}eM;!+09=UD3~eG&jqTg;t2Yx#5OHGf2G!Avnoi8! zMRq$pwpiXgZR$bw%`U`?A?Iu&<~Wl%R`n*J(?#vX1ZmMV#IT*yCc>Zsdsc{oXzmo5 zM$}+R82NMk-_ECE*1DCgpoI}k!QGs0G698S>5kN~-;Fxl+Q_C^t|TPJ=Kx^!9)MPi zS9Wn)Pid&kvCShAjHF~7^y8*Koo7vDYO#o*x=CYSogCzqC$A^11$qs+)U=yjIi>Rj z)TOe*E(Bj%u^y!?ku~C7TS(HTz^M>cLGS)F%TEqY_af_Jg^T7n91wURs?>04*2rXA zcA3-UBoXqDr4N-2CR0hGc?2-Df;K_{L&)|20P9ttf*X+b_XgY;{{VFitGKcE{{TH{ zBx58@3anesRHiugKhCFtu3AE=0=#l45=;~wqttp*&}6aOsz(L7vP~gk(>_Mn!5Q!0 z+L7-fxtLg~F`>XS?*UYvgdW_}Qc0U^QbL$tm0WR}y9~N@rGT`zwo^2WQdVP}gU&Jj zeQ9V>Qu69cXq94?B{3X*pp5VL{{Z#YW7u0IqupI!sNDFJ$_T*i$9`&kR_-CZTtL{* z?-wIDAJVHW>ZyCM%Ie9qq=O`nOn+LquBLOAqQxcMh-I;#e5wf&fsixx?}~FOAU0Zc z`Vd#mxq;Ilx3~LMQEp|HMz(u)RZt90ag&~-k4l~xj-j$RXGo;-%BdsnuCQ19<3n4y0$bFcK`@ z;o=fT0ch1azpg0NAu-e2$)~0-5=4q8CP9yw=lt}l33YTXmMN|9oA(C~)q8y^-RZx$ zF-I-*Xw4X7n9s_X`?>xm_ob36OK8UBa=Ujk1JwFcLflB^CAN?o13xcsudP>0NfvvV zZc6WvgXObeanKJzQN8R?%#aA&wEO@FApqx^hC5AW@@ADGD;oXDHejDqgVYM7g>zLr z>8*-FtP5lqha?KkI()aptlD(OIOIEawm%&DR*i*??v_@4R!Ks};p35hQ0K7v4@!N% zn)<6=to~qR!$PZ!9GtN2Q_SK%RU~FhrORy@Xdm~uEMt-_z%TcOHVrn~^L(i0VDXT} zeo#+!Be3+Yg60dBK3V|TP!*Vc(0hBDd+DNCIbD_=G!(8oX$;ow8pzoTGsXeWpaZwPG()NC62%UA&wQhx}=z$8qxNap}7q zElh51~DU zWL(?dSn8`RjA4u?EgAV;y^rf#LYkK3Iat|LjtlcG#oiThCcvi>H}`#oBwFiBa9%y( zkdW*fi2GnxEc%IQmIj$id6+Th<|otZS+~9<)zeJ6xUpp{gv4anF~PtG-nCR4W^SrR z&EBhME!F3|fKFv$9BOjoAJ(z;JxW`qn#C++j7R`CMnDFA033r&-sHMxG@lo&eIZAe1{%y>|MV&(oosO^GBIGF-DtJiBF&l_c^Dcm9>ox0)w6 zR}f}6*D@$v7C7xuDJbkTu28$u0Umsj8(8IxM}@{&!Ta2L{U^h!^1ab&mDD!iT(jL6_6qQcpatWuIj_XM* z*goCc2;_o#;-;VdDG^vC1sedc9R5`6O)(XiS!Yp?MjE0qSjt}$Zpz%JrZF?lLY>bO+IlveL)~8X~+`_-NS&UZ~2%b_g z^3WffIL0$vrnzTxYb24)By!5hpDjie2T%{;-nwhIg5h3dT$xlAA&4rz!m+M&*mcK} z51peCk19kzeCGsX{N}o-OO@(jRy@l?oC~N+dXd^&2pVKmlHiY!FHjGwS7%|O%z`-~ zoJg@o43nyHf!B_?_pA0k9kGVY+DQX>%MRc`9$X`i-Afmts{z<%pbuvi zrNmK9G-7uNA*bG2CkC!Rn*%APNxS-#C3imU*E z5<>p~GMsYEPf~l<-pM@VLs?U5P)Ra*lBgTW#&8A>GwuAU zT|!xn&yupGyT=lQR_Af|6`AJTTwF(GwFs5A$gLJWnLe4TggcWtm-L&7^&7UknniOz z?v>R!3c1HmYQ3m=&lmOrO>FZ>z?n}UDI8-QkN*H&VJx#u`#_c@N5Gj*(9RFtss8}9 z#ml$ZqFHC&7FR)r0DoU<*OKo-6zr^AMZLCVw&BPutn9xkkAH7^t*c+faon3yCJmupO!pU^-;>KHckQPmfIV z;%*c5&2W)}z#ITI%6(6miA(Wsr^l_w^>UF66T$+}Yl2b~$*+ zJdVMAKdn`s^jcfV6R-gk$P|IWJy`oxwq1~`XQf4QmsZxYJPJa(D|9%2k}yxp{{YvjdXI`Dnn^cGQR9pkV7vtB^5fF0OLugw8H;18IAjO7BdPVN z<##KZDGo-4DdO`AgB;t`u*iRJ{R3yA}HFbeR1np7Wa|d%Ok>6LRh5G zZ25y{k`G{NL8_a0{L9hg#Tom}&PPCV>Fr8UZ>UCT8`9s)YJp~EVfT!Pqj4U`+K@=o zqeAYWDBL8*7>}=9*Esja=GW{|%yYG*FA>NDp5Fe|Hk)>r(Yz0S&m;;N-4_ImV7e-*qXtAL<@E=>W;$NHY$b6l#fgLkz)wT&YW3Esb#)L1HHG5N zRsj^`Z(GRbZwc@_x5jf3~nE>-#HJ?hrMF63p65GVzd?H=6sJXJ~A z=t?SE+C-x2HI`2@?5JrOvOZIgzSW|!gDXdOAyxx75D-HUdwWw>IG!Z4D#(S4NV0wX z#Bq;q^*yqrH$P@K$L)}8HxF?he8|`yQ?>yZ!8z!0%}=y!b}rj#F7u>u&Jrl24-~*1 z=RKJB$MdQ;$rAa3$;5jIz+t;@LfZruAGwU>9Bt682a#9&EX zxFC!kp7k+$gG$9iFc$@U!ixwJVLng~zpi~L;zmYAjt`ke?=8S7CVJ=bsO}_aWmpO+ zl&0e3e6g-LC)E2?ut@L}EWzA1<1hd&4?PcR*6PHKx`F4kl)mYf;Q4R2g4pM1J+W6? zPV(J~sh&oGLo6-A`U6$cYiME$GT4;JT_5G#dyh)8Zc+mk#5S@ZM>~tK#F-z;v24;P zme$cEog@+DCo19b^Ll$zqJ}GrW`;W{hj9(7(zlyRPs-zYAJ2w#DXcKW&>-? zr#TtneX7Kw*2i)@g{8O;!DH8sqMYoJp|e+w6-ap`F=Z4U#~hQzN_HNGeY>Jw z{hC`@VUk~$gTjyYz59yLh7F)JakzN$j?u_|WcT;aIqg+{c_d~RxKlcka*4w(cyFMq zx>WgVt2yl$6^JrT5z5F<_;sppLUd%mWSV&q?VoeRz{4cms(-caf0a{vb2>fcw7 zRwiXTLon*6)B4t;Y79&zVq2!!u)`lrrYZk>v9YG(`lxEO4 z+~=iDNzrus%{0p$$R(CGRr@&X#P{O^6%+V(eByA(0-z)^oz6OOT@qSF1*^|AEt!c( z=FiH9Il=rY3%lmGc+@mSknS#={G+f3(zR6^*v-N{N?Hz<_7`JOx3-Y1Jjhdk2Vgzx zvCuVpjcZ4jOV(e`S5j`R*nG;F;3@ST>z9vNlIkxvPj?clmjEatMel)4pIEt?6D6F_ zZV-@SG31Q(B#x&wE;E*;#!*AH*dnxvktcI+ytGg>nQZqU^v43KE~jcH7uM62*r2K_ z=LZ-k6xnqvJxb14uA*J$>n_ZSG5` zmd1-}No)hfa|~^amd*nc+t`}Q)UV@;SRHMT+6>zZ7r=-S_pwl2IJSaWCxzBRPTO)b z@{V#nO;oyr%6}uxM^F}3c5-)<*mwLYp@)o~rgN(z*NCp+vYoGDW%J`*pJ`>r#m78% ztW8VA){A`<32Qs6pbHovjlgpFJt?>Hh#pBBT#0SgK`h4UNzWMCJpiffEbaB1A$c1| zIgA~P7cA-R^sczkgb~i?CeJ~b3z!hBxSBG2m}GVvhCAc06w!!SA|tAX4I@7wG4%8l z7D?5Sqzd>t9#Od>}Hid0`6@Bs`FJ0gt>Y zyGa$fkxjz+Q!dETOztn-6a8v;bZA;w?n2G>hQzYus;_0owJ}V_<|u*(SsM)_Ai|t_ zcBZ4C$(XEhA-lAdqG-<#(MCFF)}V4mCcTV+zi>b4$F3^9+>u7VW;d)$lE|UR+3WSG zOu@-`;gG_}JiViHZ^u0Lr)v!o-fn^hHw>`5p=5Azp5U5Bv37vmB*9hi6m!q1q?K=A zfo&wR*wRVJkOIX>>Fg>i%ZpUig@l*cB@tnFKOrZok=xVWfEb!ysdBMi*{hUk+$>=; z!2T@us`nH5HgU^prbmw9m^T;=(+4$dO2%T$(#Fb2J6mtJPUfmyUBV%b&fYz(BRNBX zv^P_c+a{?ET+G$4q|@QLy(+~SN~2(9q&(vtg>!m{xQcX|;>UmPL7pi7VyZjV_4M(} zD2Kp`R$PV=q)F6wKH{QVofNLoi*)ip=8#ykVGWs=E3V( z+JrJd>ufg2`?Hvi(a-S=_Vue5%^YvG2ujLk;5!6*#f%6LaL^(mXC*=pw(}a%IE(@{4R#47-)JXzN zNAF~Fz)bL0-njXUnq{k4NQg?X$cXZi@kmJ{_3QdkZ6SNFvqfn-wl_qwV4tRctwaUA z`P&lRtZ9QB%J^1phwE4E5@{l5fEPL1%^CTQ4@!Lc2Q9|6lyWLr8ylvIN5rKcu6gP? z;L`{e^5RF4Wc!;B%v6s50F`N3SR^mzM{jW)GC%J}o0Ge^8R&mXU0xxkt}QM6sWKcz zDcld&-j_RUrwb!ETL~dB2|CD2%5(E6_U>xelWi>PDav4t>15_0Kfcjgg)wOcnX%UYO4!o$eMDe3=MfScW9V2LxmIy$|)LK_N0G*H$6HxFJR{ zjsee4T4O^r%jWrVs4Mb?Y;ZgMDFwvthU014|ux#EMfG2aY{)>r$EY)|fQ+iph`&j!bsw2d}+8Ttys`$0HdR z8(}H)73_2EO-Q7OVrY^P9>-{f!Ap{(bcR1sQ9ZK2?-?K~ld>m}oT%ume^XaVN?q}A zj8_HBLmNr;sEZ^~yt2flVq(aQIWONn)N>S(4Xvz`NdwD#s$GaOf$|VLf$h?z)imYP zuVRs>955>5ko8!w&vJua9L%?O!`ya3mIaQP>%g$@}mRyxn*IUb*lIz(8^tt64VYy&)iPp~~G z*tCN7>J6~TCA!5lT+UGNc;Mr;MtrY6Tgw&9ZmaSJ!x7y5GflWj8A*!ZMq~msGOkWX z^QPU4nJ!Dre92Wpg^6~M0RHc#O~y%Wc9P0WJ6V(OZaqDz#2FB)`J01&<0qKdcO$(~ zg`%}}wYrn#N8A`M-e%;X_4cb}P1^)xEDTd<4t{WZ9FD?}(h-bv$s@JN^QAw&W@ENo zbinKdF_l%Y%oB2FdK_TW<+-)q32pJlpDE5aNCpdZ$R5=QYdPUY12QXQr-awLdGS9b~l&mi?R33!&> zjNr)|lZGemFz9`NtJ2zBTcoWui$#eF$27x-KHpldw)VeiSGrjvMHzQf&pol}K*vt0 zd6v0>-^vRr%M)NL4nA*ecBV};31qrkSDD!tcE$mC=ue=gC)ySjmTQpUmcdB&<$Gt= zmTSv7W1Z%lDO4V52eIfe{V7-oT3LLOOY%*XARpuxuu5c({Gcp;1T?iMCTd$ zdsG*U*3AxMGsz?DlgU4GBOo#DfkSFafxO09UO|XsAO;M-#q_0Z0`@G6=PpPVgWts^hj^M;XmU#-~vv&g>hiZPOa9(R`h@v*{ z3I`=uA48WeecB*p4t6lk$Mi3>t4f8a4`3d6#xuiSXWyRCV;!}h%&QoLOJvqn~ znKR!>c^oM5#~hD=Dh>x7J&CPJp)(!O$`FPHn2h^=bu=10_fWJ}wyMmzY&zfqe~PV1 zBrRE<_82isaUfXOpCtr@9oXfuQofxG@jQ}B(Ex{b9P{muTG+GEY$lF)rC9`!{Qm%H zX2_KEDhFT(=lD>t!!xad|CNKuFjEQJB{5D&ZT1y!2bPbNuLp@0ylKe97DFv$~k$T!-jezA@9-)$^v@{{0f_DJ`T`QO7H+oyKo5usHjygQi+Rg0-{GG2%r>Z4l?Ah z=m_jT&$U}j+g^Q=L%v4=o!POlk)Ay&mziZZl`Yyy6_jpFiv!`*c2nz8GwPOLO{q1z zD~!T{K4O^pNIlLv(|VP$t}Y<8kcgvWFUn3|=N{ny07|JmgL`>*2@%=^gTDuWaqm=O zz04vTJ6Sx!2uU7HoKT4X;#(%R-1;w~m@^G6NWHx!{>C&~W?V1^&clW-WG4RrOp3J~yzCIWs<~a#1so7PJu7Y)OxMuQ zZlWu1GxzpIbGQM{2=}Oxz@{QaAqx|{u2?BODqTUS6w=A1i)%(0cPcqP#QRo)nJvh0 zWN^!dcU*1&d-fEwM+iY+&^8e7$ZiQfzV%+_smT{FpUh? zVo22Rpm0z3hI?bRDgqmc5+Y`HaaE zK5#?`Q=gA${B9oUM)tepB4*TNXGxE!hgFkoPrMA=`Rk)8% zxj;y5%az6tVOM3)jil{uDDoJd701lk>V1V;YC19+Z(@{shN~LLEdWz6+RVe2T=Fs6 zp%(gt#$@|Sl$8J@8Ds;fKGmgbr)F>5{_k^QIaqE72k#F`nj2X@&Tih+EV4-Hi~*1j zU&fa_P}CbTt@Pu4Cyd1`!sxf2${GY-|E2AKDbZS3x%5_x>d zB9c(|`F+3o^>0nnrk=^~>>)F>SpigKW?*r_Jq1Ikij6i`w$h}O1uPEJy%s_DLGAUc zX=Nd}eL`zye=$U9C?EtQlem8>y`!Q`aZfp2=@@44z*05hxcDDdkA%QQVckeYcm$0*rY} zzz4FDI#ru%*k*~yfW;hOD-e2m=hln8#F19>PPMlyba0pfjDY;8an$x7jaO*Kp*u*z zJdAeApMEO+!bVZzitS~K05_M&VtWxzo;y7)RJijhZ};%&4*y1tKcc?^HN;u(LrvK#8ODmlDQZS{uPHejGp3Xg^~#^ zna=fd^C=yP{{THG)jb$zi~cJDhv&^5SB9zn+=Ju5jo6o@VsEsAa9}J1uRnNpg3S`(bm|A8s@DrL78gi&Ml&R2V zYflZsqsW0|DCFdNVDJTA;EhS-2@=Y&0u=H9&f(}sdams5%&jk-jz^X-7@T|u7T$fy^c5_3Q3NcF zv<`Q76&>tB_a)7wgc3)Xj28pf-m~SukTb_@P@*o?1$i~3W6X(ivD8nl%X4CE?_~1G zj1`cKu0*9sQh_8s57X-;wIzQUxscaBds3*F&V z9084|zdg-AWRSV;Y2DmA7~xBFDhJQBa{mDDR$Q~hx$AbNQp_ZOQS8lyf+sQ8~ve*s6@sW``($TBC<2Q zvAVA4#$((3L%-uuolV+7_L<_Da(In)fPK9w{{Y+iT$8jA{_AK0A2juD{{^ew~3u58)a1)zz42q)wJjkN%ly$2$gdf>7VIY_r55&Gd;b_h#i*_tV^^U9uFNV zrNo+!r61Yhe=W%2U-*Zu3NGY1#@0ov&kz_b_FFM|5%5!YAo^mcUuzeaGRrZ@k(38u zbF&?>+M7O|EOLvBsS8S}o#TOzU#&jJO^?fGd4zFHLbT8KMo)jORgyF2lVmKn(l+B3 z#P8;g21oO$t@LHLw+%dnoXC8@`TQ!}5J0o6(N59%ZUj;}+_@ZdtI}KEE2+3;4Cf8K zIFKIW(xu3y6}u`uh2F0Ib)}?Z$U(Di2N=QpXoanfymu=oUCv`Wj&@^@$DWm-G~0Nc zCKIGbpEG+9t?V)0t0tYNTHdAR@~T@6zm(j0$f<7Sq?W^lgu7i#K3S42t=9y0HDccC zRkiYjYMx7#SvCwaVyxQ54A#=zCF)6Wf&vn7pnnkct4lVVnsP^dc^8_5m2J4mJ!&pe zMpD|_TFP$@qP}Y|4vbFHzK6Fok7)9jGQzz8r&LbAG;4p+3z-|M26YEgV zD?xN-w1q->o2M}!m4W{N>(+d7i}~cYyVT=s9sWkso=;ItD}!kkZ|AoG9>&>;19Qf# zHlOyZD*FE7G--@PC~Ss9`JZaGmQN9qd2i!CE)_sI>(kzrZw}mBT*Z4LhKnCAI%JMR zR*A(K$w};2vADRox-oBNjzrwR54^s$e#1yeWsZ2kE#?+-qd5R@F-5Jki!3)=35kJO z0uR0iVN)GyD{Fu3_K+$uIDB)vw=|n?L^P7zwP!qV+C0~cAe5;RC|n0z@HpscHB0w* z0%)GxDuyu0%Qgqz7_50UbztmWP6pNvGORjus?*)Tu1hSeLS?~|EV-nq>u_}vS`uAJ zER7w(aDYg5!;%lz+?r+0*>Slfa1`>YFjMR6RVTiglYH(OW93fHSMl#qTVE`Ily^BK zG_BFO^z^MP>|*DsvmBC(gB-G}Z-gFK>YTW|P7Ik0U z{EZ>+Q(M6Jjpv!Xwr}3``Gi}Ba#?MY_P zM<9|bm6c3~dxXmE&tPhMO=nF;4<)E+qm_X<1Tvlh`u_kbmwS|~EOQA=Fxp=slmceo z%C8&&=xJ50ZKZ_45ShzieDAuggPiB_=CZFfJ1a?}lE+Li00@{FLo+w`kN8q*{v^A* zK3ZGE#Ka?07zz;o0C@VEYAut@k+BY=V_|VS{jd$OkCexd{{T;Fgm{@Cl_Y56jmC1E zWQxF(Pu1tPWtAnBP6zI|&$VmVcv+FSh27RLRyI9-v)YFk#cIJhK7}nqUDqa!uA)07 zknCq@#&-4t9V(PMUCrFW8>e(6gjosW>VB2fHMNz!lTC2GQWN*w^l{pWtZbG=TU*q7 zcZ_+%X(SwTgX@|VM3#Wy+tr!zS?VM0IIX*xoIR=lf|B8n@VipS($d_ z5N%ZKF<3g5mv!O`#9PVnD;>p#b|PbdaZ*KYB)qncSsUz$bj>uUfg$O)*jAdu8IZ+r zlExe6&Ttib0Zm#v3*sH1Xg9FwiFT-@GZBI4O4az|c;r?q{{Ww?tcp5X?%WDEW!@sGi$SmL-xl-6Bc0aHpZ{ zGuniKiw>h}cX0%FyKRCEq`ARmqA9N+Ym)3ElNbZj6>i?rE6FE#^J`9~Z8I~s!HUcZLW!41MQL`gvi!3uiw*EL-=CAqv*wwYy%XbZoQ z&r`dx6q;>~G;HY&V|J3Tjihw`0NL8P{&khA>$aL~rZ`u7xyV#GDUVvWcJgWVQjntD zc~~;5W6UR|U|J%@bS`e>-X=dgj*X7Oh{ZN3N!rL+rk4Hu_hT54Vokk3{5nx>X>%al z(Y|9{tvtM=4&RO{DXy%Pg@R(L@)CC(lk6&Fwwdjuk~NW{0J}u3f=6@otxWDR+U6?= z*2*0;GRn*b@HqDdti9E_w`+R|0hpj^Biq0pnXHNIR_UyQ(2)(%AQoG z5+9yc90BQy(bJ@wACXuchbjW$n?CfOfSY3KdPFxdtO{RoY!m~j?A1$0wU&FiVe;gO zEnh6MrdHwl01t0mS4FM;n$jKj=_5$UJgDO%hW`L)`d1+~yMJvck4@B9%a3*wZ`~xF z$LpN))|@XSDOnnNrMa>a$nCkKA?^wO9QGdm)Rvc4cUNCwX%!w-9!}=|buO3i>tENc z1;x}ml;!-al37neaoV)4bRVI8LV(sy5AkQY%~iXL zMVvLUxsXaoD%-e=J?op=N?IGJq&2)antimohMhQ^IU+V( zfrw=N52>q*s@uW^jpW;ut~ijYyJy$%thBs}%$Qsl;}VgDJvqsz7|(VMt60d4M`;_I z`=G%5sSKYe3OPAF>qge}LkoSKjDQXCDh%u%hLUS*TeOm9K--2R=Y{9LtyjBYXueJt zY-%$!BjxrLuI5*>Ez5Clt6UEv7yDdbU?>43PjTy-s~x;)B1t@9nl~iK$Ds5+)hb@e zX<;F{k1CECF&-IPZH#a{c2{Wja>P9Oxh61rkZTfWj@IE#BI7G-WVY9tf+7k~5T-Lq+v_eL~%B?QEUr{uM{(Z*Q$u zxRE1`ptg*pNrLR)VixbmYNa$&s)d1yv`2Jmhm}83R_)`0;xse7lEVB;5*!yk=ltgt zT&ZeLHS{P+sy~>{$Xz4pBMd3`sP1k{1(Mt=DQ;sQ#DAr1_=`-ow?|tOw0U5JesE7} z=kBD6$(GwDJ?EqHPyYZ~w1uQZ-zhW@nH;2iGZI+;0C1Yq(=0yMGTP7O88L>CebirZ zSyuX@iv^+frD_Zc;f< znnC$~RBpNTsBa9BCVZ@OkXZ0X^r>zw6`hPRHbUc;`LjYp<>DDo%I>%x-q`i3O(I%s zsw~hsmLu|z3vX=a=}(hSj_z%-%)42BXnW_^HKl2$m}D&DXnru?bbSY{XzBV;bz7qv zk+^`TgU3>R1w^W(RA}FGDjf)zKI^2hjK*2M@Tmo~QM$z;`PdwR&{qA!Slt6Khh+P3 zHlLM%<2dbAwL3WCKQx0x{Fm6_;=4B!SjeI6w|gKt8_0taMyezn0-u5AwJFLzRt*xf4;_D5HeJTtxmr_p<{{VI55kRf|`U3}%+ zD!TOB=zCR*i)($$JU7B~fJB3$HaW+wRgvQieCb{!KPi{^PI{bF-sLr7JIU?ZMT%7~ zzCER*`^$m)n$L>tK|k3V9kI*~?4ExQLs}){Tf~Z6kstsM+%5}@arC771a})!(g4n& zkXgAEqSJC2p7zo(Wdcbf{{WVVNh5EeHCorgo_S+y2I%+Y-b0ZP_pK-yLq;W6^IC5& z$wBjAWbQuST5R`LFs|n^y!j!DJ~xc?$DqY%n_C&Qp5}adU5pc%AX4D`us5k4Pc^4H zS-~N<(&JWDj22P%nX%4&s+H47U^cK?y0Lxg(h-!;_*C|qOt$cyPV-rV1vg5WIBazK zQ+I1pQb~`JJWL`xK?)d*4CCA0tIaI2BM?7!qxX#CoF0SR)thNjbbO?LX~tn$Io;0~ z^x~=AN|#8@cOjIxJ4#`3{?0r7Xh?0PupL(4&oO0!sticY)p5=~l}h;B-bh;2+ol!N zVMo6mDrbfXW>~Hv5yB$<(yL^X+*1ala}1G9HMY#1p-=;WI%clPY-Zm!=2K~Uk=*9= zn9opuz1;g$>2r3GrKm+V=t+J3kN*H(x+8gSd2KUGWS=ZwEYV7g~0*yw5#QV zau|A5kL<e?Cd>!`yRLb8a#2>E3r zlkHB56%175GchA^=xb8TKuf!GFt=$gB0$D1*k@9C$?cA{BpO5#oxWUvAM}NcK zvvpR+k)-!3*_adeP3ACB`_da7YTV*^t-=_0?Qh-4qOIF$+I`f8p}$mq0<&~w?~GK* zYi_3tax!#&EK;+o+Pq;G_oQ@j>JMtkz0_um#BJ7g&T_7Md(%nCE~0MgX<#I0f?2rnIP6zHty^nPv>2_Vkx^Pqft|ZXG0F6-{R7R3-Ql#E8IugV zxN)EHuBS-QEp=v-&a;(cNP|1G@VV_-RGN#>xJ9&b`lYn(d|0K)6!<`24D5 z(r%f{+i8z8Op1sV{_Faj^d0N3n@!U#&_}{Yw`m0Z;oSXdyK0u2S@NKd&xdYekyi(w zUs{iED`;1-T}*oo9`@E|f?K3uq!)P~SC$$~-Y)x8riL>J3Y> zMQUf;>CGH(s{a6LeWKzO2@(v1hX?q-yx-^6t4xv1&1p2MWevXyc8{p^u8K=5Yf}>z zSdnDiBDm_OsUyB>wa%SwcW~CxTbUJre=u+mdsM0GsO)B0K?0O8w#}sZZeKlq@u^(g zUtI`dou!s0%ti+)HuUT2D`p)&&MS9AEOD}_`#fyFdAp7(#+P}ctSJ<>Y9$dJ&Z7!X zwGx+Mq+&LasqYaB_J%#!beT6}-#x1KlcU?kHsc{!&~7<74&Ptao2zPHZQFNjftSqL zPT~*%!@tlE=}jrg3AnAzZxI_id99u~F%fbKA?G;ckALv2 z(Rpog3(pF9yPpxPhaC?j{VO_MY}}P7=%D6Ew(>~z9|B+=0F+0 z=02Qstz%84sg$au^fX#cDt(cCx=pDr=i1!3^d6O@o-EUCcF4MVnapHbHb4uGj7@UW z!z{DGEH^-`oB$J{?g^^5I+ART!_OEDN+2AJ^*QV~tyLSD`+IaWHBEYXZX~;V#g(NX zTn)WF^V{iEn(}GLNaH2RCqLc5s7&nmFt-F?h95RP>XfOerO1*ZRdP0C`PT5Jk%Xrv zSo=lAz+(`WMg#75G|f&KqI^Rb-c(?)$Q*SQBtN^5T$vaZ``da0R&Dg(Iz^S=YN^P_ zBcAnK$}F2XBR!Tu^1?%JUK#oZ^s81%w-WuCmDN=@ZrhW)rqNsac9C&&1kuN0CWxr> z=8Zrr&p>+`yJz9c80HNcvlAE|TAbtGHI%Ew)-+knu9Yg<6$m#8iFaaix6-vD@X>jH zb~Y(cQ_Kf41L<7@pABhoZ`~UJRs6{xK3V8{a%(n!7*6xg_E8aM0a=RV3?8fL$7;pY zsV$9EAsxm;p-l`C<4r$2`x-{T+A+Z%fL5-PbUZ(8wmWUXPA8K&SNF%IWG=UNaU$Gm zH>J`>E45Ptj=ein52}dZS)`gc-C4GlKP!51^sMCx%X3J|5!mgL`VCC1vO^@ZIly!~ zRZ|^6sbtaq+XF`I+f08b&m$hS%4nLE#-@ViCXtzgEKCLimFhtBuCm+2mv(kh*oe`* z9r{%EX;_J#1G22&mbP>JkV^E zt873S*BHmjPI<*tX9zo_OrqtZW)_d&FYTphHJh1y=-1@f<#IhZ?OieWZ>H(`V%*s2 zYR@3r+ms*w09V$T1ooD#{*P?tXu1N}&-jmOt^WWC7O$*X%^sH`$vaFHp$&!d`^Y_T zMhf-MJt&o0vU}(er%o$WReQ@#7U`{m25`7p2+rZ%hJ8J1Nat&)%h}20M;nhU!f-+L z&v91nG>eHW*_j93#7QD!emdvclT5eM+7YD11o6d_A(wCprj>RBTsk24$``qhml!%wnQmhdEu<9wS?6;O-NfpJ{RC2_+M;4F=JaVc#|Anl7=TXzng#wuUmPm5s

$&Ta0NXeGNF5`z3p@DCoAP&?B%Cu56 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