summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen J Bush <2041619+muppetjones@users.noreply.github.com>2022-08-03 12:23:17 -0500
committerGitHub <noreply@github.com>2022-08-03 18:23:17 +0100
commitdf8a538489414b1f0c0cdcb786a76cca763ae37a (patch)
treebbe7658a309bb07267b77461f45d6d0fa8ba17c7
parent5f6cf24294c789963415f615db2fa24e46f89fa6 (diff)
Userspace: muppetjones (#1) (#13461)
* Userspace: muppetjones (#1) Add and update lily58 to work with userspace Add and update kyria keymap to work with userspace Add and update planck keymap with userspace Add etchamouse code and docs to userpace Add userspace Update mouse encoder for smoother movement. Encoder + mouse Added casemodes by andrewjrae * Rollback lily58 state reader and add missing GPL * Apply suggestions from code review Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: Joel Challis <git@zvecr.com> * fix lily58 keymap * Updates to user and lily for muppetjones. Updated parameters for etchamouse for smoother mouse movement. Updated lily keymap and userspace to actually work together. * Update keyboards/lily58/keymaps/muppetjones/config.h Co-authored-by: Drashna Jaelre <drashna@live.com> * Updated keymaps and userspace * Little more cleanup. * Update keyboards/lily58/keymaps/muppetjones/rules.mk Co-authored-by: Ryan <fauxpark@gmail.com> * Rollback accidental libchibios update * Apply suggestions from code review Co-authored-by: Drashna Jaelre <drashna@live.com> * Update kyria keymap * Move kyria keymap to splitkb/kyria * Update planck keymap * Remove all changes to keyboards/lily58/lib/layer_state_reader.c * Update lily58 keymap * Recommended change * Update keymap readme * Update kyria keymap and userspace * Apply suggestions from code review Co-authored-by: Drashna Jaelre <drashna@live.com> * Renamed users/muppetjones/README.md to lc * Update keyboards/lily58/keymaps/muppetjones/config.h Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: Drashna Jaelre <drashna@live.com> Co-authored-by: Joel Challis <git@zvecr.com> Co-authored-by: Ryan <fauxpark@gmail.com>
-rw-r--r--keyboards/lily58/keymaps/muppetjones/README.md13
-rw-r--r--keyboards/lily58/keymaps/muppetjones/config.h44
-rw-r--r--keyboards/lily58/keymaps/muppetjones/features/bongo_cat.c127
-rw-r--r--keyboards/lily58/keymaps/muppetjones/features/bongo_cat.h14
-rw-r--r--keyboards/lily58/keymaps/muppetjones/keymap.c240
-rw-r--r--keyboards/lily58/keymaps/muppetjones/rules.mk17
-rw-r--r--keyboards/planck/keymaps/muppetjones/.clang-format26
-rw-r--r--keyboards/planck/keymaps/muppetjones/config.h56
-rw-r--r--keyboards/planck/keymaps/muppetjones/keymap.c403
-rw-r--r--keyboards/planck/keymaps/muppetjones/readme.md2
-rw-r--r--keyboards/planck/keymaps/muppetjones/rules.mk5
-rw-r--r--keyboards/splitkb/kyria/keymaps/muppetjones/.clang-format26
-rw-r--r--keyboards/splitkb/kyria/keymaps/muppetjones/README.md11
-rw-r--r--keyboards/splitkb/kyria/keymaps/muppetjones/config.h60
-rw-r--r--keyboards/splitkb/kyria/keymaps/muppetjones/keymap.c276
-rw-r--r--keyboards/splitkb/kyria/keymaps/muppetjones/rules.mk11
-rw-r--r--users/muppetjones/.clang-format26
-rw-r--r--users/muppetjones/config.h44
-rw-r--r--users/muppetjones/features/casemodes.c247
-rw-r--r--users/muppetjones/features/casemodes.h47
-rw-r--r--users/muppetjones/features/combos.c36
-rw-r--r--users/muppetjones/features/combos.h17
-rw-r--r--users/muppetjones/features/dancelayers.c98
-rw-r--r--users/muppetjones/features/dancelayers.h82
-rw-r--r--users/muppetjones/features/etchamouse.c101
-rw-r--r--users/muppetjones/features/etchamouse.h59
-rw-r--r--users/muppetjones/features/rgblayers.c69
-rw-r--r--users/muppetjones/features/rgblayers.h22
-rw-r--r--users/muppetjones/muppetjones.c57
-rw-r--r--users/muppetjones/muppetjones.h56
-rw-r--r--users/muppetjones/readme.md23
-rw-r--r--users/muppetjones/readme/dancelayers.md73
-rw-r--r--users/muppetjones/readme/etchamouse.md69
-rw-r--r--users/muppetjones/readme/rgblayers.md60
-rw-r--r--users/muppetjones/readme/tapmods.md25
-rw-r--r--users/muppetjones/readme/wrappers.md153
-rw-r--r--users/muppetjones/rules.mk25
-rw-r--r--users/muppetjones/tapmods.h77
-rw-r--r--users/muppetjones/wrappers.h249
39 files changed, 3046 insertions, 0 deletions
diff --git a/keyboards/lily58/keymaps/muppetjones/README.md b/keyboards/lily58/keymaps/muppetjones/README.md
new file mode 100644
index 0000000000..38cea9cfc2
--- /dev/null
+++ b/keyboards/lily58/keymaps/muppetjones/README.md
@@ -0,0 +1,13 @@
+# Lily58
+
+```shell
+qmk compile -kb lily58/rev1 -km muppetjones
+```
+
+```
+qmk flash -kb lily58/rev1 -km muppetjones -bl avrdude-split-left
+```
+
+```
+qmk flash -kb lily58/rev1 -km muppetjones -bl avrdude-split-right
+```
diff --git a/keyboards/lily58/keymaps/muppetjones/config.h b/keyboards/lily58/keymaps/muppetjones/config.h
new file mode 100644
index 0000000000..bee5ee45da
--- /dev/null
+++ b/keyboards/lily58/keymaps/muppetjones/config.h
@@ -0,0 +1,44 @@
+/*
+This is the c configuration file for the keymap
+
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+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 <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+/* Select hand configuration */
+
+// 1 minute
+#ifdef OLED_ENABLE
+# define OLED_TIMEOUT 60000
+#endif
+
+
+// Change "hold" time (default is 200 ms)
+#define TAPPING_TERM 200
+
+// Prevent normal rollover on alphas from accidentally triggering mods.
+#define IGNORE_MOD_TAP_INTERRUPT
+
+// Enable rapid switch from tap to hold, disables double tap hold auto-repeat.
+#define TAPPING_FORCE_HOLD
+
+#undef RGBLED_NUM
+
+// Allows to use either side as the master. Look at the documentation for info:
+// https://docs.qmk.fm/#/config_options?id=setting-handedness
+#define EE_HANDS
diff --git a/keyboards/lily58/keymaps/muppetjones/features/bongo_cat.c b/keyboards/lily58/keymaps/muppetjones/features/bongo_cat.c
new file mode 100644
index 0000000000..23f6493efc
--- /dev/null
+++ b/keyboards/lily58/keymaps/muppetjones/features/bongo_cat.c
@@ -0,0 +1,127 @@
+/**
+ * BONGO CAT!
+
+WPM-responsive animation of bongo cat!
+
+Source:
+ https://github.com/qmk/qmk_firmware/blob/master/keyboards/kyria/keymaps/j-inc/keymap.c
+*/
+
+#include QMK_KEYBOARD_H
+
+#ifdef OLED_ENABLE
+
+# define IDLE_FRAMES 5
+# define IDLE_SPEED 30 // below this wpm value your animation will idle
+
+// #define PREP_FRAMES 1 // uncomment if >1
+
+# define TAP_FRAMES 2
+# define TAP_SPEED 40 // above this wpm value typing animation to triggere
+
+# define ANIM_FRAME_DURATION 200 // how long each frame lasts in ms
+// #define SLEEP_TIMER 60000 // should sleep after this period of 0 wpm, needs fixing
+# define ANIM_SIZE 636 // number of bytes in array, minimize for adequate firmware size, max is 1024
+
+uint32_t anim_timer = 0;
+uint32_t anim_sleep = 0;
+uint8_t current_idle_frame = 0;
+// uint8_t current_prep_frame = 0; // uncomment if PREP_FRAMES >1
+uint8_t current_tap_frame = 0;
+
+/* Animation */
+
+static const char PROGMEM ANIM_IDLE[IDLE_FRAMES][ANIM_SIZE] = {
+ // clang-format off
+ {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,64,64,32,32,32,32,16,16,16,16,16,8,8,4,4,4,8,48,64,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,100,130,2,2,2,2,2,1,0,0,0,0,128,128,0,0,0,0,0,0,0,0,0,128,0,48,48,0,192,193,193,194,4,8,16,32,64,128,0,0,0,128,128,128,128,64,64,
+ 64,64,32,32,32,32,16,16,16,16,8,8,8,8,8,4,4,4,4,4,2,2,2,2,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,56,4,3,0,0,0,0,0,0,0,12,12,12,13,1,0,64,160,33,34,18,17,17,17,9,8,8,8,8,4,4,8,8,16,16,16,16,16,17,15,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,128,128,64,64,64,64,64,32,32,32,32,32,16,16,16,16,16,8,8,8,8,8,4,4,4,4,4,2,3,2,2,1,1,1,1,1,1,2,2,4,4,8,8,8,8,8,7,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ },
+ {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,64,64,32,32,32,32,16,16,16,16,16,8,8,4,4,4,8,48,64,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,100,130,2,2,2,2,2,1,0,0,0,0,128,128,0,0,0,0,0,0,0,0,0,128,0,48,48,0,192,193,193,194,4,8,16,32,64,128,0,0,0,128,128,128,128,64,64,
+ 64,64,32,32,32,32,16,16,16,16,8,8,8,8,8,4,4,4,4,4,2,2,2,2,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,56,4,3,0,0,0,0,0,0,0,12,12,12,13,1,0,64,160,33,34,18,17,17,17,9,8,8,8,8,4,4,8,8,16,16,16,16,16,17,15,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,128,128,64,64,64,64,64,32,32,32,32,32,16,16,16,16,16,8,8,8,8,8,4,4,4,4,4,2,3,2,2,1,1,1,1,1,1,2,2,4,4,8,8,8,8,8,
+ 7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ },
+ {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,64,64,64,64,32,32,32,32,16,8,4,2,2,4,24,96,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,194,1,1,2,2,4,4,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,96,0,129,130,130,132,8,16,32,64,128,0,0,0,0,128,128,128,128,64,64,64,64,32,
+ 32,32,32,16,16,16,16,8,8,8,8,8,4,4,4,4,4,2,2,2,2,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,112,25,6,0,0,0,0,0,0,0,24,24,24,27,3,0,64,160,34,36,20,18,18,18,11,8,8,8,8,5,5,9,9,16,16,16,16,16,17,15,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,128,128,64,64,64,64,64,32,32,32,32,32,16,16,16,16,16,8,8,8,8,8,4,4,4,4,4,2,3,2,2,1,1,1,1,1,1,2,2,4,4,8,8,8,8,8,7,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ },
+ {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,0,0,0,0,0,128,64,64,32,32,32,32,16,16,16,16,8,4,2,1,1,2,12,48,64,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,225,0,0,1,1,2,2,1,0,0,0,0,128,128,0,0,0,0,0,0,0,0,0,128,0,48,48,0,192,193,193,194,4,8,16,32,64,128,0,0,0,128,128,128,128,64,64,
+ 64,64,32,32,32,32,16,16,16,16,8,8,8,8,8,4,4,4,4,4,2,2,2,2,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,112,12,3,0,0,0,0,0,0,0,12,12,12,13,1,0,64,160,33,34,18,17,17,17,9,8,8,8,8,4,4,8,8,16,16,16,16,16,17,15,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,128,128,64,64,64,64,64,32,32,32,32,32,16,16,16,16,16,8,8,8,8,8,4,4,4,4,4,2,3,2,2,1,1,1,1,1,1,2,2,4,4,8,8,8,8,8,
+ 7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ },
+ {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,64,64,32,32,32,32,16,16,16,16,8,8,4,2,2,2,4,56,64,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,226,1,1,2,2,2,2,1,0,0,0,0,128,128,0,0,0,0,0,0,0,0,0,128,0,48,48,0,192,193,193,194,4,8,16,32,64,128,0,0,0,128,128,128,128,64,64,64,64,
+ 32,32,32,32,16,16,16,16,8,8,8,8,8,4,4,4,4,4,2,2,2,2,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,112,12,3,0,0,0,0,0,0,0,12,12,12,13,1,0,64,160,33,34,18,17,17,17,9,8,8,8,8,4,4,8,8,16,16,16,16,16,17,15,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,128,128,64,64,64,64,64,32,32,32,32,32,16,16,16,16,16,8,8,8,8,8,4,4,4,4,4,2,3,2,2,1,1,1,1,1,1,2,2,4,4,8,8,8,8,8,7,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ }
+ // clang-format on
+};
+
+// Prep animation
+static const char PROGMEM ANIM_PREP[][ANIM_SIZE] = {
+ // clang-format off
+ {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,0,0,0,0,0,128,64,64,32,32,32,32,16,16,16,16,8,4,2,1,1,2,12,48,64,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,225,0,0,1,1,2,2,129,128,128,0,0,128,128,0,0,0,0,0,0,0,0,0,128,0,48,48,0,0,1,225,26,6,9,49,53,1,138,124,0,0,128,128,128,128,64,64,
+ 64,64,32,32,32,32,16,16,16,16,8,8,8,8,8,4,4,4,4,4,2,2,2,2,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,112,12,3,0,0,24,6,5,152,153,132,195,124,65,65,64,64,32,33,34,18,17,17,17,9,8,8,8,8,4,4,4,4,4,4,2,2,2,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,128,128,64,64,64,64,64,32,32,32,32,32,16,16,16,16,16,8,8,8,8,8,4,4,4,4,4,2,3,2,2,1,1,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ }
+ // clang-format on
+};
+
+// Typing animation
+static const char PROGMEM ANIM_TAP[TAP_FRAMES][ANIM_SIZE] = {
+ // clang-format off
+ {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,0,0,0,0,0,128,64,64,32,32,32,32,16,16,16,16,8,4,2,1,1,2,12,48,64,128,0,0,0,0,0,0,0,248,248,248,248,0,0,0,0,0,128,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,225,0,0,1,1,2,2,129,128,128,0,0,128,128,0,0,0,0,0,0,0,0,0,128,0,48,48,0,0,1,1,2,4,8,16,32,67,135,7,1,0,184,188,190,159,
+ 95,95,79,76,32,32,32,32,16,16,16,16,8,8,8,8,8,4,4,4,4,4,2,2,2,2,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,112,12,3,0,0,24,6,5,152,153,132,67,124,65,65,64,64,32,33,34,18,17,17,17,9,8,8,8,8,4,4,8,8,16,16,16,16,16,17,15,1,61,124,252,252,252,252,252,60,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,128,128,64,64,64,64,64,32,32,32,32,32,16,16,16,16,16,8,8,8,8,8,4,4,4,4,4,2,3,2,2,1,1,1,
+ 1,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,0,0,0,0,0,0,0,0,0,0,1,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ },
+ {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,0,0,0,0,0,128,64,64,32,32,32,32,16,16,16,16,8,4,2,1,1,2,12,48,64,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,225,0,0,1,1,2,2,1,0,0,0,0,128,128,0,0,0,0,0,0,0,0,0,128,0,48,48,0,0,1,225,26,6,9,49,53,1,138,124,0,0,128,128,128,128,64,64,64,64,32,
+ 32,32,32,16,16,16,16,8,8,8,8,8,4,4,4,4,4,2,2,2,2,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,112,12,3,0,0,0,0,0,0,0,0,0,0,1,1,0,64,160,33,34,18,17,17,17,9,8,8,8,8,4,4,4,4,4,4,2,2,2,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,128,128,64,64,64,64,64,32,32,32,32,32,16,16,16,16,16,8,8,8,8,8,4,4,4,4,4,2,3,122,122,121,121,121,121,57,49,2,2,4,4,8,8,8,136,136,135,128,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+ }
+ // clang-format on
+};
+
+/* Functions */
+
+
+void animation_phase(uint8_t wpm) {
+ // NOTE: Optimized the conditional. We don't need to recheck each.
+ // NOTE: Move this and the animation outside of the function.
+
+ if (IDLE_SPEED >= wpm) {
+ current_idle_frame = (current_idle_frame + 1) % IDLE_FRAMES;
+ oled_write_raw_P(ANIM_IDLE[abs((IDLE_FRAMES - 1) - current_idle_frame)], ANIM_SIZE);
+ } else if (TAP_SPEED > wpm) {
+ oled_write_raw_P(ANIM_PREP[0], ANIM_SIZE);
+ } else {
+ current_tap_frame = (current_tap_frame + 1) % TAP_FRAMES;
+ oled_write_raw_P(ANIM_TAP[abs((TAP_FRAMES - 1) - current_tap_frame)], ANIM_SIZE);
+ }
+}
+
+// Images credit j-inc(/James Incandenza) and pixelbenny. Credit to obosob for initial animation approach.
+void render_bongo_cat(void) {
+ const uint8_t curr_wpm = get_current_wpm();
+
+ if (curr_wpm > 000) {
+ oled_on();
+ anim_sleep = timer_read32();
+ } else if (timer_elapsed32(anim_sleep) > OLED_TIMEOUT) {
+ oled_off();
+ return;
+ }
+
+ if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
+ anim_timer = timer_read32();
+ animation_phase(curr_wpm);
+ }
+}
+
+#endif
diff --git a/keyboards/lily58/keymaps/muppetjones/features/bongo_cat.h b/keyboards/lily58/keymaps/muppetjones/features/bongo_cat.h
new file mode 100644
index 0000000000..1025ccfa1b
--- /dev/null
+++ b/keyboards/lily58/keymaps/muppetjones/features/bongo_cat.h
@@ -0,0 +1,14 @@
+/**
+ * BONGO CAT!
+
+WPM-responsive animation of bongo cat!
+
+Source:
+ https://github.com/qmk/qmk_firmware/blob/master/keyboards/kyria/keymaps/j-inc/keymap.c
+*/
+
+#pragma once
+
+const char *wpm_state(void);
+void animation_phase(uint8_t wpm);
+void render_bongo_cat(void);
diff --git a/keyboards/lily58/keymaps/muppetjones/keymap.c b/keyboards/lily58/keymaps/muppetjones/keymap.c
new file mode 100644
index 0000000000..6e02482289
--- /dev/null
+++ b/keyboards/lily58/keymaps/muppetjones/keymap.c
@@ -0,0 +1,240 @@
+/* Copyright 2020 Stephen J. Bush
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include QMK_KEYBOARD_H
+#include "muppetjones.h"
+#include "features/bongo_cat.h"
+#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
+
+/*
+ * qmk compile -kb lily58/rev1 -km muppetjones
+ */
+
+// GACS (Lower)
+#define HR_LBRC LCTL_T(KC_LBRC)
+#define HR_RBRC LSFT_T(KC_RBRC)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ // clang-format off
+
+/* Colemak DH
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BADJ |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | Q | W | F | P | B | | J | L | U | Y | ; | Bksp |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Esc | A | R | S | T | G |-------. ,-------| M | N | E | I | O | ' |
+ * |------+------+------+------+------+------| Raise | | Lower |------+------+------+------+------+------|
+ * |LShift| Z | X | C | D | V |-------| |-------| K | H | , | . | / |Enter |
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | Alt | LGUI |LOWER | /Space / \Space \ |RAISE | Ctrl | RGUI |
+ * | | | |/ / \ \ | | | |
+ * `----------------------------' '------''--------------------'
+ */
+[_CLMK_DH] = LAYOUT_wrapper(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_CAPS, __BLANK____________________________________, KC_BSPC,
+ KC_CAPS, __COLEMAK_MOD_DH_L1________________________, __COLEMAK_MOD_DH_R1_W_QUOT_________________, KC_BSPC,
+ HY_ESC, __COLEMAK_MOD_DH_L2_W_GACS_________________, __COLEMAK_MOD_DH_R2_W_SCAG_________________, KC_QUOT,
+ TD_LAYR, __COLEMAK_MOD_DH_L3_W_SFTV_________________, KC_CAPS, KC_TAB, __COLEMAK_MOD_DH_R3________________________, KC_SFTENT,
+ XXXXXXX, XXXXXXX, HY_ESC, LOW_ENT, NAV_SPC, HY_BSPC, XXXXXXX, XXXXXXX
+),
+
+/* 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|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE |BackSP| RGUI |
+ * | | | |/ / \ \ | | | |
+ * `----------------------------' '------''--------------------'
+ */
+[_QWERTY] = LAYOUT_wrapper(
+ _______, __BLANK____________________________________, __BLANK____________________________________, _______,
+ _______, __QWERTY_L1________________________________, __QWERTY_R1________________________________, _______,
+ _______, __QWERTY_L2________________________________, __QWERTY_R2________________________________, _______,
+ _______, __QWERTY_L3________________________________, _______, _______, __QWERTY_R3________________________________, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+),
+[_MOUSE] = LAYOUT_wrapper(
+ _______, __BLANK____________________________________, __BLANK____________________________________, _______,
+ _______, __BLANK____________________________________, __BLANK____________________________________, _______,
+ _______, __BLANK____________________________________, __BLANK____________________________________, _______,
+ _______, __BLANK____________________________________, _______, _______, __BLANK____________________________________, _______,
+ KC_BTN1, __BLANK____________________________________, _______, KC_BTN2
+),
+
+/* LOWER
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ` | | Mute | Vol- | Vol+ | | | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ~ | | | ` | | ( | | ) | 7 | 8 | 9 | \ | Bksp |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | GUI | ALT | _ | - | { |-------. ,-------| } | 4 | 5 | 6 | * | ` |
+ * |------+------+------+------+------+------| | | |------+------+------+------+------+------|
+ * | | | | + | = | [ |-------| |-------| ] | 1 | 2 | 3 | | |Enter |
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | | |LOWER | / / \ \ | 0 | . | = |
+ * | | | |/ / \ \ | | | |
+ * `----------------------------' '------''--------------------'
+ */
+[_LOWER] = LAYOUT_wrapper(
+ _______, __BLANK____________________________________, __BLANK____________________________________, _______,
+ _______, __SYMBOLS_L1_______________________________, __NUMPAD_R1________________________________, _______,
+ _______, __SYMBOLS_L2_______________________________, __NUMPAD_R2________________________________, KC_COMM,
+ _______, __SYMBOLS_L3_______________________________, _______, _______, __NUMPAD_R3________________________________, KC_DOT,
+ _______, _______, _______, _______, KC_SPC, KC_0, KC_DOT, _______
+),
+/* RAISE
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | |MS_A_0|MS_A_1|MS_A_2| | | | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | | | |MS_W_U| | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | GUI | ALT | CTL | SFT |MS_W_D|-------. ,-------| | Left | Down | Up |Right | |
+ * |------+------+------+------+------+------|MS_W_L | |MS_W_R |------+------+------+------+------+------|
+ * | | MS_L | MS_D | MS_U | MS_R | |-------| |-------| |MS_W_L|MS_W_D|MS_W_U|MS_W_R| |
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | | | MS_2 | / MS_1 / \ \ |RAISE | | |
+ * | | | |/ / \ \ | | | |
+ * `----------------------------' '------''--------------------'
+ // */
+
+[_RAISE] = LAYOUT_wrapper(
+ _______, __BLANK____________________________________, __BLANK____________________________________, _______,
+ _______, __SYMBOLS_L1_______________________________, __NAV_R1___________________________________, _______,
+ _______, __SYMBOLS_L2_______________________________, __NAV_R2___________________________________, _______,
+ _______, __SYMBOLS_L3_______________________________, _______, _______, __NAV_R3___________________________________, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+),
+[_NAV] = LAYOUT_wrapper(
+ _______, __BLANK____________________________________, __BLANK____________________________________, _______,
+ _______, __VIM_L1___________________________________, __NAV_R1___________________________________, _______,
+ _______, __BLANK_W_GACS_____________________________, __NAV_R2___________________________________, _______,
+ _______, __BLANK____________________________________, _______, _______, __NAV_R3___________________________________, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+),
+
+/* ADJUST
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | | Reset| | | | | | Reset| | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | | | | | | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | | | | |-------. ,-------| | |RGB ON| HUE+ | SAT+ | VAL+ |
+ * |------+------+------+------+------+------| | | |------+------+------+------+------+------|
+ * | | | | | | |-------| |-------| | | MODE | HUE- | SAT- | VAL- |
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE |BackSP| RGUI |
+ * | | | |/ / \ \ | | | |
+ * `----------------------------' '------''--------------------'
+ */
+[_ADJUST] = LAYOUT_wrapper(
+ _______, __BLANK____________________________________, _______, CLMK_DH, QWERTY, _______, _______, _______,
+ RESET, __ADJUST_L1________________________________, __MEDIA_R1_________________________________, _______,
+ _______, __ADJUST_L2________________________________, __MEDIA_R2_________________________________, _______,
+ _______, __ADJUST_L3________________________________, _______, _______, __MEDIA_R3_________________________________, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+)
+
+ // clang-format on
+};
+
+// SSD1306 OLED update loop, make sure to enable OLED_DRIVER_ENABLE=yes in rules.mk
+#ifdef OLED_ENABLE
+
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+ if (!is_keyboard_master()) return OLED_ROTATION_180; // flips the display 180 degrees if offhand
+ return rotation;
+}
+
+// When you add source files to SRC in rules.mk, you can use functions.
+const char *read_layer_state_user(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_layer_state_user(void) {
+ // NOTE;
+ switch (get_highest_layer(layer_state)) {
+ case _CLMK_DH:
+ return "Layer: Colemak";
+ break;
+ case _QWERTY:
+ return "Layer: QWERTY ";
+ break;
+ case _MOUSE:
+ return "Layer: Mouse ";
+ break;
+ case _LOWER:
+ return "Layer: Lower ";
+ break;
+ case _RAISE:
+ return "Layer: Raise ";
+ break;
+ case _NAV:
+ return "Layer: Nav ";
+ break;
+ case _ADJUST:
+ return "Layer: Adjust ";
+ break;
+ default:
+ break;
+ }
+
+ char *layer_state_str = "Layer: Und- ";
+ layer_state_str[10] = '0' + layer_state % 10;
+ return layer_state_str;
+}
+
+bool oled_task_user(void) {
+ if (is_keyboard_master()) {
+ // If you want to change the display of OLED, you need to change here
+ oled_write_ln(read_layer_state_user(), false);
+ oled_write_ln(read_keylog(), false);
+ oled_write_ln(read_keylogs(), false);
+ } else {
+ render_bongo_cat();
+ oled_set_cursor(0, 6);
+ oled_write_P(PSTR("WPM: "), false);
+ oled_write(get_u8_str(get_current_wpm(), ' '), false);
+ }
+ return false;
+}
+#endif // OLED_DRIVER_ENABLE
+
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+#ifdef OLED_ENABLE
+ set_keylog(keycode, record);
+#endif
+ // set_timelog();
+ }
+
+ // Regular user keycode case statement
+ switch (keycode) {
+ default:
+ return true;
+ }
+
+ return true;
+}
diff --git a/keyboards/lily58/keymaps/muppetjones/rules.mk b/keyboards/lily58/keymaps/muppetjones/rules.mk
new file mode 100644
index 0000000000..1323bea893
--- /dev/null
+++ b/keyboards/lily58/keymaps/muppetjones/rules.mk
@@ -0,0 +1,17 @@
+OLED_ENABLE= yes # OLED display
+WPM_ENABLE = yes
+TAP_DANCE_ENABLE = yes
+COMBO_ENABLE = yes
+EXTRAKEY_ENABLE = yes
+
+# If you want to change the display of OLED, you need to change here
+# SRC += ./lib/rgb_state_reader.c
+SRC += ./lib/layer_state_reader.c
+SRC += ./lib/logo_reader.c
+SRC += ./lib/keylogger.c
+SRC += ./features/bongo_cat.c
+
+# Reduce firmware size
+# https://thomasbaart.nl/2018/12/01/reducing-firmware-size-in-qmk/
+# also requires in config.h
+LTO_ENABLE = yes
diff --git a/keyboards/planck/keymaps/muppetjones/.clang-format b/keyboards/planck/keymaps/muppetjones/.clang-format
new file mode 100644
index 0000000000..df3dbd17b4
--- /dev/null
+++ b/keyboards/planck/keymaps/muppetjones/.clang-format
@@ -0,0 +1,26 @@
+---
+BasedOnStyle: Google
+AlignAfterOpenBracket: Align
+AlignConsecutiveAssignments: 'true'
+AlignConsecutiveDeclarations: 'true'
+AlignOperands: 'true'
+AllowAllParametersOfDeclarationOnNextLine: 'false'
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: 'false'
+BinPackArguments: 'true'
+BinPackParameters: 'true'
+ColumnLimit: '160'
+IndentCaseLabels: 'true'
+IndentPPDirectives: AfterHash
+IndentWidth: '4'
+MaxEmptyLinesToKeep: '1'
+PointerAlignment: Right
+SortIncludes: 'false'
+SpaceBeforeAssignmentOperators: 'true'
+SpaceBeforeParens: ControlStatements
+SpaceInEmptyParentheses: 'false'
+TabWidth: '4'
+UseTab: Never
+
+...
diff --git a/keyboards/planck/keymaps/muppetjones/config.h b/keyboards/planck/keymaps/muppetjones/config.h
new file mode 100644
index 0000000000..1046d21499
--- /dev/null
+++ b/keyboards/planck/keymaps/muppetjones/config.h
@@ -0,0 +1,56 @@
+ /* Copyright 2020 Stephen Bush <muppetjones>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+#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
+ */
+
+/* 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
+
+/*
+ * Other options
+ */
+
+// Enable lighting layers
+#define RGBLIGHT_LAYERS
+#define RGBLIGHT_SLEEP
+
+// Change "hold" time (default is 200 ms)
+#define TAPPING_TERM 200
+
+// Prevent normal rollover on alphas from accidentally triggering mods.
+#define IGNORE_MOD_TAP_INTERRUPT
+
+// Enable rapid switch from tap to hold, disables double tap hold auto-repeat.
+#define TAPPING_FORCE_HOLD
diff --git a/keyboards/planck/keymaps/muppetjones/keymap.c b/keyboards/planck/keymaps/muppetjones/keymap.c
new file mode 100644
index 0000000000..518ab43233
--- /dev/null
+++ b/keyboards/planck/keymaps/muppetjones/keymap.c
@@ -0,0 +1,403 @@
+/* Copyright 2020 Stephen Bush
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * qmk compile -kb planck/rev6 -km muppetjones
+ */
+
+#include QMK_KEYBOARD_H
+#include "muse.h"
+#include "muppetjones.h"
+
+#define LAYOUT_planck_wrapper(...) LAYOUT_planck_grid(__VA_ARGS__)
+
+/* Extend layers from muppetjones.h
+ _CLMK_DH = 0,
+ _QWERTY
+ _MOUSE,
+ _LOWER,
+ _RAISE,
+ _NAV,
+ _ADJUST,
+ */
+enum planck_layers {
+ _PLOVER = _ADJUST + 1,
+};
+
+enum planck_keycodes {
+ PLOVER = SAFE_RANGE,
+ BACKLIT,
+ EXT_PLV,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ // clang-format off
+
+/* Colemak DH II
+ * ,-----------------------------------------------------------------------------------.
+ * | Q | W | F | P | B | Del | Bksp | J | L | U | Y | ; |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | A | R | S | T | G | | " | M | N | E | I | O |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Z | X | C | D | V SFT| Enter| Tab | K | H | , | . | / |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt |HY_ESC|Lower | Space |Raise |HY_ESC| Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_CLMK_DH] = LAYOUT_planck_wrapper(
+ __COLEMAK_MOD_DH_L1________________________, KC_DEL, KC_BSPC, __COLEMAK_MOD_DH_R1_W_QUOT_________________,
+ __COLEMAK_MOD_DH_L2_W_GACS_________________, CAPSWRD, KC_QUOT, __COLEMAK_MOD_DH_R2_W_SCAG_________________,
+ __COLEMAK_MOD_DH_L3_W_SFTV_________________, KC_ENT, KC_TAB, __COLEMAK_MOD_DH_R3________________________,
+ TD_LAYR, XXXXXXX, XXXXXXX, HY_ESC, LOW_ENT, KC_BSPC, KC_BSPC, RAI_SPC, HY_ESC, KC_BSPC, XXXXXXX, XXXXXXX
+),
+
+/* 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_wrapper(
+ __QWERTY_L1________________________________, _______, _______, __QWERTY_R1________________________________,
+ __QWERTY_L2________________________________, _______, _______, __QWERTY_R2________________________________,
+ __QWERTY_L3________________________________, _______, _______, __QWERTY_R3________________________________,
+ __BLANK____________________________________, _______, _______, __BLANK____________________________________
+),
+
+/* MOUSE
+ * No encoders. Just an empty layer.
+ */
+[_MOUSE] = LAYOUT_planck_wrapper(
+ __BLANK____________________________________, _______, _______, __BLANK____________________________________,
+ __BLANK____________________________________, _______, _______, __BLANK____________________________________,
+ __BLANK____________________________________, _______, _______, __BLANK____________________________________,
+ __BLANK____________________________________, _______, _______, __BLANK____________________________________
+),
+
+// /* Colemak DH
+// * ,-----------------------------------------------------------------------------------.
+// * | Tab | Q | W | F | P | B | J | L | U | Y | ; | Bksp |
+// * |------+------+------+------+------+------+------+------+------+------+------+------|
+// * | Esc | A | R | S | T | G | M | N | E | I | O | " |
+// * |------+------+------+------+------+------+------+------+------+------+------+------|
+// * | Shift| Z | X | C | D | V | K | H | , | . | / |Enter |
+// * |------+------+------+------+------+------+------+------+------+------+------+------|
+// * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
+// * `-----------------------------------------------------------------------------------'
+// */
+// [_CLMK_DH] = LAYOUT_planck_grid(
+// KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC,
+// HY_ESC, HOME_A, HOME_R, HOME_S, HOME_T, KC_G, KC_M, HOME_N, HOME_E, HOME_I, HOME_O, KC_QUOT,
+// KC_LSFT, KC_Z, KC_X, KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_SFTENT,
+// KC_LCTL, NUMPD, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX
+// ),
+/* Lower (numpad, symbols)
+ * ,-----------------------------------------------------------------------------------.
+ * | | | ( | ) | ~ | | | | 7 & | 8 * | 9 ( | \ |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | { | } | ` | | | - _ | 4 $ | 5 % | 6 ^ | * |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | [ | ] | | | | = + | 1 ! | 2 @ | 3 # | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | Space | | 0 | . | | |
+ * `-----------------------------------------------------------------------------------'
+ * 21.02.22: Removed F keys.
+ * 21.03.28: Completely revamped to contain 10-key numpad and symbols.
+ */
+[_LOWER] = LAYOUT_planck_wrapper(
+ __SYMBOLS_L1_______________________________, _______, _______, __NUMPAD_R1________________________________,
+ __SYMBOLS_L2_______________________________, _______, _______, __NUMPAD_R2________________________________,
+ __SYMBOLS_L3_______________________________, _______, _______, __NUMPAD_R3________________________________,
+ _______, _______, _______, _______, _______, _______, _______, __NUMPAD_R4________________________________
+),
+
+/* Raise
+* ,-----------------------------------------------------------------------------------.
+* | ` | | | | | | | Pg Up| HOME | | END | |
+* |------+------+------+------+------+------+------+------+------+------+------+------|
+* | GUI | ALT | CTL | SFT | | | | Pg Dn| LEFT | DOWN | UP |RIGHT |
+* |------+------+------+------+------+------+------+------+------+------+------+------|
+* | | | | | | | | | | | | |
+* |------+------+------+------+------+------+------+------+------+------+------+------|
+* | | | | | | | | Next | Vol- | Vol+ | Play |
+* `-----------------------------------------------------------------------------------'
+* 21.02.22: Removed F keys and replaced with useful programming keys.
+*/
+[_RAISE] = LAYOUT_planck_wrapper(
+ XXXXXXX, XXXXXXX, KC_LPRN, KC_RPRN, XXXXXXX, _______, _______, __NAV_R1___________________________________,
+ KC_LGUI, KC_LALT, HR_LBRC, HR_RBRC, KC_MINS, _______, _______, __NAV_R2___________________________________,
+ XXXXXXX, XXXXXXX, KC_LCBR, KC_RCBR, KC_EQL, _______, _______, __NAV_R3___________________________________,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+),
+
+/* Nav
+ * Available in raise.
+ */
+[_NAV] = LAYOUT_planck_wrapper(
+ __BLANK____________________________________, _______, _______, __BLANK____________________________________,
+ __BLANK____________________________________, _______, _______, __BLANK____________________________________,
+ __BLANK____________________________________, _______, _______, __BLANK____________________________________,
+ __BLANK____________________________________, _______, _______, __BLANK____________________________________
+),
+
+/* Plover layer (http://opensteno.org)
+ * ,-----------------------------------------------------------------------------------.
+ * | # | # | # | # | # | # | # | # | # | # | # | # |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | S | T | P | H | * | * | F | P | L | T | D |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | S | K | W | R | * | * | R | B | G | S | Z |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | 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,
+ XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX
+),
+
+/* Adjust (Lower + Raise)
+ * v------------------------RGB CONTROL--------------------v
+ * ,-----------------------------------------------------------------------------------.
+ * | | Reset|Debug | RGB |RGBMOD| HUE+ | HUE- | SAT+ | SAT- |BRGTH+|BRGTH-| |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | |Brite |MUSmod|Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|CLMKII|Plover| |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof|ClmkDH| | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] = LAYOUT_planck_wrapper(
+ __ADJUST_L1________________________________, MUV_IN, PLOVER, __MEDIA_R1_________________________________,
+ __ADJUST_L2________________________________, MUV_DE, CLMK_DH, __MEDIA_R2_________________________________,
+ __ADJUST_L3________________________________, MU_MOD, QWERTY, __MEDIA_R3_________________________________,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+)
+
+/*
+ * ,-----------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+[_ADJUST] = LAYOUT_planck_grid(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+)
+
+ */
+ // clang-format on
+};
+
+#ifdef AUDIO_ENABLE
+float plover_song[][2] = SONG(PLOVER_SOUND);
+float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND);
+#endif
+
+#define LIGHT_GOLDEN 30, 255, 100
+#define LIGHT_MAGENTA 213, 255, 100
+#define LIGHT_AZURE 148, 255, 100
+
+// Define light layers
+// -- e.g., light up LEDS 3-6 with RED when the numpd layer is active
+const rgblight_segment_t PROGMEM rgb_clmk_dh[] = RGBLIGHT_LAYER_SEGMENTS({0, 9, HSV_RED});
+const rgblight_segment_t PROGMEM rgb_lower[] = RGBLIGHT_LAYER_SEGMENTS({0, 9, LIGHT_GOLDEN});
+const rgblight_segment_t PROGMEM rgb_raise[] = RGBLIGHT_LAYER_SEGMENTS({0, 9, LIGHT_MAGENTA});
+const rgblight_segment_t PROGMEM rgb_numpd[] = RGBLIGHT_LAYER_SEGMENTS({0, 9, LIGHT_AZURE});
+
+const rgblight_segment_t* const PROGMEM rgb_layers[] = RGBLIGHT_LAYERS_LIST(rgb_clmk_dh, rgb_lower, rgb_raise, rgb_numpd);
+
+void keyboard_post_init_user(void) {
+ rgblight_layers = rgb_layers; // Enable the LED layers
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ rgblight_set_layer_state(1, layer_state_cmp(state, _LOWER));
+ rgblight_set_layer_state(2, layer_state_cmp(state, _RAISE));
+ return state;
+}
+
+bool process_record_keymap(uint16_t keycode, keyrecord_t* record) {
+ switch (keycode) {
+ case BACKLIT:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+#ifdef BACKLIGHT_ENABLE
+ backlight_step();
+#endif
+#ifdef KEYBOARD_planck_rev5
+ writePinLow(E6);
+#endif
+ } else {
+ unregister_code(KC_RSFT);
+#ifdef KEYBOARD_planck_rev5
+ writePinHigh(E6);
+#endif
+ }
+ 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 = 50;
+
+bool 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) {
+#ifdef MOUSEKEY_ENABLE
+ tap_code(KC_MS_WH_DOWN);
+#else
+ tap_code(KC_PGDN);
+#endif
+ } else {
+#ifdef MOUSEKEY_ENABLE
+ tap_code(KC_MS_WH_UP);
+#else
+ tap_code(KC_PGUP);
+#endif
+ }
+ }
+ return true;
+}
+
+void dip_switch_update_user(uint8_t index, bool active) {
+ switch (index) {
+ case 0: {
+#ifdef AUDIO_ENABLE
+ static bool play_sound = false;
+#endif
+ if (active) {
+#ifdef AUDIO_ENABLE
+ if (play_sound) {
+ PLAY_SONG(plover_song);
+ }
+#endif
+ layer_on(_ADJUST);
+ } else {
+#ifdef AUDIO_ENABLE
+ if (play_sound) {
+ PLAY_SONG(plover_gb_song);
+ }
+#endif
+ layer_off(_ADJUST);
+ }
+#ifdef AUDIO_ENABLE
+ play_sound = true;
+#endif
+ break;
+ }
+ case 1:
+ if (active) {
+ muse_mode = true;
+ } else {
+ muse_mode = false;
+ }
+ }
+}
+
+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;
+ } else {
+ if (muse_counter) {
+ stop_all_notes();
+ muse_counter = 0;
+ }
+ }
+#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/muppetjones/readme.md b/keyboards/planck/keymaps/muppetjones/readme.md
new file mode 100644
index 0000000000..de9680b498
--- /dev/null
+++ b/keyboards/planck/keymaps/muppetjones/readme.md
@@ -0,0 +1,2 @@
+# The Default Planck Layout
+
diff --git a/keyboards/planck/keymaps/muppetjones/rules.mk b/keyboards/planck/keymaps/muppetjones/rules.mk
new file mode 100644
index 0000000000..1db412715d
--- /dev/null
+++ b/keyboards/planck/keymaps/muppetjones/rules.mk
@@ -0,0 +1,5 @@
+SRC += muse.c
+
+MOUSEKEY_ENABLE = yes
+TAP_DANCE_ENABLE = yes
+COMBO_ENABLE = yes
diff --git a/keyboards/splitkb/kyria/keymaps/muppetjones/.clang-format b/keyboards/splitkb/kyria/keymaps/muppetjones/.clang-format
new file mode 100644
index 0000000000..df3dbd17b4
--- /dev/null
+++ b/keyboards/splitkb/kyria/keymaps/muppetjones/.clang-format
@@ -0,0 +1,26 @@
+---
+BasedOnStyle: Google
+AlignAfterOpenBracket: Align
+AlignConsecutiveAssignments: 'true'
+AlignConsecutiveDeclarations: 'true'
+AlignOperands: 'true'
+AllowAllParametersOfDeclarationOnNextLine: 'false'
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: 'false'
+BinPackArguments: 'true'
+BinPackParameters: 'true'
+ColumnLimit: '160'
+IndentCaseLabels: 'true'
+IndentPPDirectives: AfterHash
+IndentWidth: '4'
+MaxEmptyLinesToKeep: '1'
+PointerAlignment: Right
+SortIncludes: 'false'
+SpaceBeforeAssignmentOperators: 'true'
+SpaceBeforeParens: ControlStatements
+SpaceInEmptyParentheses: 'false'
+TabWidth: '4'
+UseTab: Never
+
+...
diff --git a/keyboards/splitkb/kyria/keymaps/muppetjones/README.md b/keyboards/splitkb/kyria/keymaps/muppetjones/README.md
new file mode 100644
index 0000000000..20fdd47025
--- /dev/null
+++ b/keyboards/splitkb/kyria/keymaps/muppetjones/README.md
@@ -0,0 +1,11 @@
+# Kyria
+
+## Compile
+
+```shell
+make splitkb/kyria/rev1:muppetjones:avrdude-split-left
+```
+
+```shell
+make splitkb/kyria/rev1:muppetjones:avrdude-split-right
+```
diff --git a/keyboards/splitkb/kyria/keymaps/muppetjones/config.h b/keyboards/splitkb/kyria/keymaps/muppetjones/config.h
new file mode 100644
index 0000000000..92d495be4a
--- /dev/null
+++ b/keyboards/splitkb/kyria/keymaps/muppetjones/config.h
@@ -0,0 +1,60 @@
+/* Copyright 2020 Stephen Bush <muppetjones@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#ifdef OLED_ENABLE
+# define OLED_DISPLAY_128X64
+#endif
+
+// If you are using an Elite C rev3 on the slave side, uncomment the lines below:
+// #define SPLIT_USB_DETECT
+// #define NO_USB_STARTUP_CHECK
+
+// EC11K encoders have a different resolution than other EC11 encoders.
+// When using the default resolution of 4, if you notice your encoder skipping
+// every other tick, lower the resolution to 2.
+#define ENCODER_RESOLUTION 2
+#define ENCODER_DIRECTION_FLIP
+
+// The Leader key allows to flexibly assign macros to key sequences.
+#define LEADER_PER_KEY_TIMING
+#define LEADER_TIMEOUT 350
+
+// Change "hold" time (default is 200 ms)
+// -- used for tap dance and other tap mods
+// -- defined in user namespace
+// #define TAPPING_TERM 200
+
+// Prevent normal rollover on alphas from accidentally triggering mods.
+#define IGNORE_MOD_TAP_INTERRUPT
+
+// Enable rapid switch from tap to hold, disables double tap hold auto-repeat.
+#define TAPPING_FORCE_HOLD
+
+// Reduce firmware size
+// https://thomasbaart.nl/2018/12/01/reducing-firmware-size-in-qmk/
+// also requires EXTRAFLAGS in config.h
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
+// Allows to use either side as the master. Look at the documentation for info:
+// https://docs.qmk.fm/#/config_options?id=setting-handedness
+#define EE_HANDS
+
+// Allows media codes to properly register in macros and rotary encoder code
+#define TAP_CODE_DELAY 10
+#define COMBO_TERM 40
diff --git a/keyboards/splitkb/kyria/keymaps/muppetjones/keymap.c b/keyboards/splitkb/kyria/keymaps/muppetjones/keymap.c
new file mode 100644
index 0000000000..ca4a306341
--- /dev/null
+++ b/keyboards/splitkb/kyria/keymaps/muppetjones/keymap.c
@@ -0,0 +1,276 @@
+/* Copyright 2020 Stephen J. Bush
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include QMK_KEYBOARD_H
+#include "muppetjones.h"
+#include "rgblight.h"
+
+#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
+
+/* Layers from muppetjones.h
+ _CLMK_DH = 0,
+ _MOUSE,
+ _LOWER,
+ _RAISE,
+ _NAV,
+ _ADJUST,
+ */
+
+/*
+ * Custom Keys
+ */
+
+#ifdef ENCODER_ENABLE
+bool encoder_update_standard(uint8_t index, bool clockwise);
+#endif
+
+/*
+ * LAYERS
+ */
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ // clang-format off
+/*
+ * Base Layer: Colemak DH
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * |CAPSWORD| Q | W | F | P | B | | J | L | U | Y | ; : | | \ |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * |ESC/HYPR| A | R | S | T | G | | M | N | E | I | O | ' " |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | LShift | Z | X | C | D | V |LShift|Leader| | Del | Tab | K | H | , < | . > | / ? | Sft/Ent|
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | MUTE | Del | Enter| Space| Enter| | Bspc | Space| Hyper| Tab | AltGr|
+ * | | | Alt | Lower| Raise| | | Nav | Esc | Raise| |
+ * `----------------------------------' `----------------------------------'
+ */
+[_CLMK_DH] = LAYOUT_wrapper(
+ CAPSWRD, __COLEMAK_MOD_DH_L1________________________, __COLEMAK_MOD_DH_R1_W_QUOT_________________, KC_BSLS,
+ HY_ESC, __COLEMAK_MOD_DH_L2_W_GACS_________________, __COLEMAK_MOD_DH_R2_W_SCAG_________________, KC_QUOT,
+ TD_LAYR, __COLEMAK_MOD_DH_L3________________________, KC_LSFT, KC_LEAD, KC_DEL, KC_TAB, __COLEMAK_MOD_DH_R3________________________, KC_SFTENT,
+ KC_MUTE, KC_DEL, HY_ESC, LOW_BSP, RAI_ENT, KC_BSPC, NAV_SPC, HY_ESC, RAI_TAB, KC_RALT
+),
+[_QWERTY] = LAYOUT_wrapper(
+ _______, __QWERTY_L1________________________________, __QWERTY_R1________________________________, _______,
+ _______, __QWERTY_L2________________________________, __QWERTY_R2________________________________, _______,
+ _______, __QWERTY_L3________________________________, _______, _______, _______, _______, __QWERTY_R3________________________________, _______,
+ __BLANK____________________________________, __BLANK____________________________________
+),
+[_MOUSE] = LAYOUT_wrapper(
+ _______, __BLANK____________________________________, __BLANK____________________________________, _______,
+ _______, __BLANK____________________________________, __BLANK____________________________________, _______,
+ _______, __BLANK____________________________________, _______, _______, _______, _______, __BLANK____________________________________, _______,
+ KC_BTN1, _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN2
+),
+/*
+ * Lower Layer: Numpad and some symbols
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | ~ | ` | ( | ) | xxxx | | / ? | 7 & | 8 * | 9 ( | - _ | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | LGUI | LALT |LCTL [|LSFT ]| _ - | | * | 4 $ | 5 % | 6 ^ | , < | + |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | xxxx | xxxx | { | } | LSFT | | | | | | 0 ) | 1 ! | 2 @ | 3 # | = + | |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | Lower| | | | | Nav | 0 | . | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_LOWER] = LAYOUT_wrapper(
+ _______, __SYMBOLS_L1_______________________________, __NUMPAD_R1________________________________, _______,
+ _______, __SYMBOLS_L2_______________________________, __NUMPAD_R2________________________________, KC_COMM,
+ _______, __SYMBOLS_L3_______________________________, _______, _______, _______, _______, __NUMPAD_R3________________________________, KC_DOT,
+ __BLANK____________________________________, _______, KC_SPC, KC_0, KC_DOT, _______
+ ),
+/*
+ * Raise Layer: Symbols
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | ! | @ | { | } | | | | | & | € | | | \ |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | # | $ | ( | ) | ` | | _ | - | / | * | % | ' " |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | % | ^ | [ | ] | ~ | | | | | | + | = | , | . | / ? | - _ |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | Lower| | | | | Nav | Raise| | |
+ * `----------------------------------' `----------------------------------'
+ */
+ // [_RAISE] = LAYOUT(
+ // _______, KC_EXLM, KC_AT, KC_LPRN, KC_RPRN, KC_PIPE, _______, KC_AMPR, _______, _______, _______, KC_BSLS,
+ // _______, KC_HASH, KC_DLR, KC_LBRC, KC_RBRC, KC_GRV, KC_UNDS, KC_MINS, KC_SLSH, KC_ASTR, KC_PERC, KC_QUOT,
+ // _______, KC_PERC, KC_CIRC, KC_LCBR, KC_RCBR, KC_TILD, _______, _______, _______, _______, KC_PLUS, KC_EQL, KC_COMM, KC_DOT, KC_SLSH, KC_MINS,
+ // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ // ),
+ [_RAISE] = LAYOUT_wrapper(
+ _______, XXXXXXX, XXXXXXX, KC_GRV, KC_GRV, KC_BSLS, __SYMBOLS_R1_______________________________, _______,
+ _______, XXXXXXX, XXXXXXX, KC_UNDS, KC_MINS, KC_TILD, __SYMBOLS_R2_______________________________, _______,
+ _______, XXXXXXX, XXXXXXX, KC_PLUS, KC_EQL, KC_GRV, _______, _______, _______, _______, __SYMBOLS_R3_______________________________, _______,
+ __BLANK____________________________________, __BLANK____________________________________
+ ),
+/*
+ * Navigation Layer (w/ symbols on left)
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | | | | | | | PgUp | Home | Up | End | | ScrlLk |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | GUI | ALT | CTL | SFT | | | PgDn | Left | Down | Up | Right| CapsLk |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | | | | | | | | | | | | | | | | |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | Lower| | | | | Nav | Raise| | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_NAV] = LAYOUT_wrapper(
+ _______, __VIM_L1___________________________________, __NAV_R1___________________________________, KC_SLCK,
+ _______, __BLANK_W_GACS_____________________________, __NAV_R2___________________________________, KC_CAPS,
+ _______, __BLANK____________________________________, _______, _______, _______, _______, __NAV_R3___________________________________, _______,
+ __BLANK____________________________________, __BLANK____________________________________
+ ),
+ /*
+ * Adjust Layer: Function keys, RGB
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | RESET |RESET |DEBUG | | | | | | F1 | F2 | F3 | F4 | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | TOG | SAI | HUI | VAI | MOD | | | F5 | F6 | F7 | F8 | |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | | SAD | HUD | VAD | RMOD | | | | | | | F9 | F10 | F11 | F12 | |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_ADJUST] = LAYOUT_wrapper(
+ RESET, __ADJUST_L1________________________________, __MEDIA_R1_________________________________, _______,
+ _______, __ADJUST_L2________________________________, __MEDIA_R2_________________________________, _______,
+ _______, __ADJUST_L3________________________________, _______, _______, _______, _______, __MEDIA_R3_________________________________, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+ // /*
+ // * Layer template
+ // *
+ // * ,-------------------------------------------. ,-------------------------------------------.
+ // * | | | | | | | | | | | | | |
+ // * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ // * | | | | | | | | | | | | | |
+ // * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ // * | | | | | | | | | | | | | | | | | |
+ // * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ // * | | | | | | | | | | | |
+ // * | | | | | | | | | | | |
+ // * `----------------------------------' `----------------------------------'
+ // */
+ // [_LAYERINDEX] = LAYOUT(
+ // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ // ),
+ // clang-format on
+};
+
+/*
+ *
+ */
+
+void keyboard_post_init_user(void) {
+ // Call the keymap level matrix init.
+
+#ifdef RGBLIGHT_ENABLE
+ set_rgb_home();
+#endif
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+#ifdef RGBLIGHT_ENABLE
+ set_rgb_by_layer(state);
+#endif
+ return state;
+}
+
+bool process_record_keymap(uint16_t keycode, keyrecord_t* record) {
+ // Regular user keycode case statement
+ switch (keycode) {
+ default:
+ return true;
+ }
+ return true;
+}
+
+#ifdef ENCODER_ENABLE
+bool encoder_update_user(uint8_t index, bool clockwise) {
+# ifdef POINTING_DEVICE_ENABLE
+ if (IS_LAYER_ON(_MOUSE))
+ return encoder_update_mouse(index, clockwise);
+ else
+# endif
+ return encoder_update_standard(index, clockwise);
+}
+
+bool encoder_update_standard(uint8_t index, bool clockwise) {
+ if (index == 0) {
+ // Volume control
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ } else if (index == 1) {
+ // Page up/Page down
+# ifdef MOUSEKEY_ENABLE
+ if (clockwise) {
+ tap_code(KC_WH_D);
+ } else {
+ tap_code(KC_WH_U);
+ }
+# else
+ if (clockwise) {
+ tap_code(KC_PGDN);
+ } else {
+ tap_code(KC_PGUP);
+ }
+# endif
+ }
+ return true;
+}
+#endif
+
+#ifdef RGBLIGHT_ENABLE
+void set_layer_hsv(layer_state_t state, HSV* layer_color) {
+ uint16_t h = layer_color->h, s = layer_color->s, v = layer_color->v;
+ switch (get_highest_layer(state)) {
+ case _RAISE:
+ h += 3 * RGBLIGHT_HUE_STEP;
+ break;
+ case _LOWER:
+ h += -3 * RGBLIGHT_HUE_STEP;
+ break;
+ case _NAV:
+ h += 2 * RGBLIGHT_HUE_STEP;
+ break;
+ case _MOUSE:
+ h += -8 * RGBLIGHT_HUE_STEP;
+ break;
+ default:
+ break;
+ }
+ layer_color->h = h % 255;
+ layer_color->s = s;
+ layer_color->v = v % 255;
+ return;
+}
+#endif
diff --git a/keyboards/splitkb/kyria/keymaps/muppetjones/rules.mk b/keyboards/splitkb/kyria/keymaps/muppetjones/rules.mk
new file mode 100644
index 0000000000..b7e46ecfd2
--- /dev/null
+++ b/keyboards/splitkb/kyria/keymaps/muppetjones/rules.mk
@@ -0,0 +1,11 @@
+OLED_ENABLE = no # Enables the use of OLED displays
+ENCODER_ENABLE = yes # Enables the use of one or more encoders
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+LEADER_ENABLE = yes # Enable the Leader Key feature
+MOUSEKEY_ENABLE = yes
+TAP_DANCE_ENABLE = yes
+POINTING_DEVICE_ENABLE = yes
+COMBO_ENABLE = yes
+
+# Reduce firmware size
+# https://thomasbaart.nl/2018/12/01/reducing-firmware-size-in-qmk/
diff --git a/users/muppetjones/.clang-format b/users/muppetjones/.clang-format
new file mode 100644
index 0000000000..df3dbd17b4
--- /dev/null
+++ b/users/muppetjones/.clang-format
@@ -0,0 +1,26 @@
+---
+BasedOnStyle: Google
+AlignAfterOpenBracket: Align
+AlignConsecutiveAssignments: 'true'
+AlignConsecutiveDeclarations: 'true'
+AlignOperands: 'true'
+AllowAllParametersOfDeclarationOnNextLine: 'false'
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: 'false'
+BinPackArguments: 'true'
+BinPackParameters: 'true'
+ColumnLimit: '160'
+IndentCaseLabels: 'true'
+IndentPPDirectives: AfterHash
+IndentWidth: '4'
+MaxEmptyLinesToKeep: '1'
+PointerAlignment: Right
+SortIncludes: 'false'
+SpaceBeforeAssignmentOperators: 'true'
+SpaceBeforeParens: ControlStatements
+SpaceInEmptyParentheses: 'false'
+TabWidth: '4'
+UseTab: Never
+
+...
diff --git a/users/muppetjones/config.h b/users/muppetjones/config.h
new file mode 100644
index 0000000000..e8afa9d8c5
--- /dev/null
+++ b/users/muppetjones/config.h
@@ -0,0 +1,44 @@
+/* Copyright 2020 Stephen J. Bush @muppetjones
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#ifdef RGBLIGHT_ENABLE
+// # define RGBLIGHT_ANIMATIONS
+# define RGBLIGHT_HUE_STEP 8
+# define RGBLIGHT_SAT_STEP 16
+# define RGBLIGHT_VAL_STEP 16
+# define RGBLIGHT_LIMIT_VAL 150
+# define RGBLIGHT_SLEEP
+// # define RGBLIGHT_LAYERS
+#endif
+
+#ifdef TAP_DANCE_ENABLE
+// Change "hold" time (default is 200 ms)
+// -- used for tap dance and other tap mods
+# define TAPPING_TERM 175
+
+// Prevent normal rollover on alphas from accidentally triggering mods.
+# define IGNORE_MOD_TAP_INTERRUPT
+
+// Enable rapid switch from tap to hold, disables double tap hold auto-repeat.
+# define TAPPING_FORCE_HOLD
+
+#endif
+
+
+#define COMBO_COUNT 3
+#define COMBO_TERM 40
diff --git a/users/muppetjones/features/casemodes.c b/users/muppetjones/features/casemodes.c
new file mode 100644
index 0000000000..da7c5e8fa9
--- /dev/null
+++ b/users/muppetjones/features/casemodes.c
@@ -0,0 +1,247 @@
+/* Copyright 2021 Andrew Rae ajrae.nv@gmail.com @andrewjrae
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "casemodes.h"
+
+/* The caps word concept started with me @iaap on splitkb.com discord.
+ * However it has been implemented and extended by many splitkb.com users:
+ * - @theol0403 made many improvements to initial implementation
+ * - @precondition used caps lock rather than shifting
+ * - @dnaq his own implementation which also used caps lock
+ * - @sevanteri added underscores on spaces
+ * - @metheon extended on @sevanteri's work and added specific modes for
+ * snake_case and SCREAMING_SNAKE_CASE
+ * - @baffalop came up with the idea for xcase, which he implements in his own
+ * repo, however this is implemented by @iaap with support also for one-shot-shift.
+ * - @sevanteri
+ * - fixed xcase waiting mode to allow more modified keys and keys from other layers.
+ * - Added @baffalop's separator defaulting on first keypress, with a
+ * configurable default separator and overrideable function to determine
+ * if the default should be used.
+ */
+
+#ifndef DEFAULT_XCASE_SEPARATOR
+# define DEFAULT_XCASE_SEPARATOR KC_UNDS
+#endif
+
+#define IS_OSM(keycode) (keycode >= QK_ONE_SHOT_MOD && keycode <= QK_ONE_SHOT_MOD_MAX)
+
+// bool to keep track of the caps word state
+static bool caps_word_on = false;
+
+// enum to keep track of the xcase state
+static enum xcase_state xcase_state = XCASE_OFF;
+// the keycode of the xcase delimiter
+static uint16_t xcase_delimiter;
+// the number of keys to the last delimiter
+static int8_t distance_to_last_delim = -1;
+
+// Check whether caps word is on
+bool caps_word_enabled(void) { return caps_word_on; }
+
+// Enable caps word
+void enable_caps_word(void) {
+ caps_word_on = true;
+#ifndef CAPSWORD_USE_SHIFT
+ if (!host_keyboard_led_state().caps_lock) {
+ tap_code(KC_CAPS);
+ }
+#endif
+}
+
+// Disable caps word
+void disable_caps_word(void) {
+ caps_word_on = false;
+#ifndef CAPSWORD_USE_SHIFT
+ if (host_keyboard_led_state().caps_lock) {
+ tap_code(KC_CAPS);
+ }
+#else
+ unregister_mods(MOD_LSFT);
+#endif
+}
+
+// Toggle caps word
+void toggle_caps_word(void) {
+ if (caps_word_on) {
+ disable_caps_word();
+ } else {
+ enable_caps_word();
+ }
+}
+
+// Get xcase state
+enum xcase_state get_xcase_state(void) { return xcase_state; }
+
+// Enable xcase and pickup the next keystroke as the delimiter
+void enable_xcase(void) { xcase_state = XCASE_WAIT; }
+
+// Enable xcase with the specified delimiter
+void enable_xcase_with(uint16_t delimiter) {
+ xcase_state = XCASE_ON;
+ xcase_delimiter = delimiter;
+ distance_to_last_delim = -1;
+}
+
+// Disable xcase
+void disable_xcase(void) { xcase_state = XCASE_OFF; }
+
+// Place the current xcase delimiter
+static void place_delimiter(void) {
+ if (IS_OSM(xcase_delimiter)) {
+ // apparently set_oneshot_mods() is dumb and doesn't deal with handedness for you
+ uint8_t mods = xcase_delimiter & 0x10 ? (xcase_delimiter & 0x0F) << 4 : xcase_delimiter & 0xFF;
+ set_oneshot_mods(mods);
+ } else {
+ tap_code16(xcase_delimiter);
+ }
+}
+
+// Removes a delimiter, used for double tap space exit
+static void remove_delimiter(void) {
+ if (IS_OSM(xcase_delimiter)) {
+ clear_oneshot_mods();
+ } else {
+ tap_code(KC_BSPC);
+ }
+}
+
+// overrideable function to determine whether the case mode should stop
+__attribute__((weak)) bool terminate_case_modes(uint16_t keycode, const keyrecord_t *record) {
+ switch (keycode) {
+ // Keycodes to ignore (don't disable caps word)
+ case KC_A ... KC_Z:
+ case KC_1 ... KC_0:
+ case KC_MINS:
+ case KC_BSPC:
+ // If mod chording disable the mods
+ if (record->event.pressed && (get_mods() != 0)) {
+ return true;
+ }
+ break;
+ case KC_UNDS:
+ // Allow to be pressed with or without a modifier (prob w/ shift)
+ break;
+ default:
+ if (record->event.pressed) {
+ return true;
+ }
+ break;
+ }
+ return false;
+}
+
+/* overrideable function to determine whether to use the default separator on
+ * first keypress when waiting for the separator. */
+__attribute__((weak)) bool use_default_xcase_separator(uint16_t keycode, const keyrecord_t *record) {
+ // for example:
+ /* switch (keycode) { */
+ /* case KC_A ... KC_Z: */
+ /* case KC_1 ... KC_0: */
+ /* return true; */
+ /* } */
+ return false;
+}
+
+bool process_case_modes(uint16_t keycode, const keyrecord_t *record) {
+ if (caps_word_on || xcase_state) {
+ if ((QK_MOD_TAP <= keycode && keycode <= QK_MOD_TAP_MAX) || (QK_LAYER_TAP <= keycode && keycode <= QK_LAYER_TAP_MAX)) {
+ // Earlier return if this has not been considered tapped yet
+ if (record->tap.count == 0) return true;
+ keycode = keycode & 0xFF;
+ }
+
+ if (keycode >= QK_LAYER_TAP && keycode <= QK_ONE_SHOT_LAYER_MAX) {
+ // let special keys and normal modifiers go through
+ return true;
+ }
+
+ if (xcase_state == XCASE_WAIT) {
+ // grab the next input to be the delimiter
+ if (use_default_xcase_separator(keycode, record)) {
+ enable_xcase_with(DEFAULT_XCASE_SEPARATOR);
+ } else if (record->event.pressed) {
+ // factor in mods
+ if (get_mods() & MOD_MASK_SHIFT) {
+ keycode = LSFT(keycode);
+ } else if (get_mods() & MOD_BIT(KC_RALT)) {
+ keycode = RALT(keycode);
+ }
+ enable_xcase_with(keycode);
+ return false;
+ } else {
+ if (IS_OSM(keycode)) {
+ // this catches the OSM release if no other key was pressed
+ set_oneshot_mods(0);
+ enable_xcase_with(keycode);
+ return false;
+ }
+ // let other special keys go through
+ return true;
+ }
+ }
+
+ if (record->event.pressed) {
+ // handle xcase mode
+ if (xcase_state == XCASE_ON) {
+ // place the delimiter if space is tapped
+ if (keycode == KC_SPACE) {
+ if (distance_to_last_delim != 0) {
+ place_delimiter();
+ distance_to_last_delim = 0;
+ return false;
+ }
+ // remove the delimiter and disable modes
+ else {
+ remove_delimiter();
+ disable_xcase();
+ disable_caps_word();
+ return true;
+ }
+ }
+ // decrement distance to delimiter on back space
+ else if (keycode == KC_BSPC) {
+ --distance_to_last_delim;
+ }
+ // don't increment distance to last delim if negative
+ else if (distance_to_last_delim >= 0) {
+ // puts back a one shot delimiter if you we're back to the delimiter pos
+ if (distance_to_last_delim == 0 && (IS_OSM(xcase_delimiter))) {
+ place_delimiter();
+ }
+ ++distance_to_last_delim;
+ }
+
+ } // end XCASE_ON
+
+ // check if the case modes have been terminated
+ if (terminate_case_modes(keycode, record)) {
+ disable_caps_word();
+ disable_xcase();
+ }
+#ifdef CAPSWORD_USE_SHIFT
+ else if (keycode >= KC_A && keycode <= KC_Z) {
+ tap_code16(LSFT(keycode));
+ return false;
+ }
+#endif
+
+ } // end if event.pressed
+
+ return true;
+ }
+ return true;
+}
diff --git a/users/muppetjones/features/casemodes.h b/users/muppetjones/features/casemodes.h
new file mode 100644
index 0000000000..4a8c00b3d2
--- /dev/null
+++ b/users/muppetjones/features/casemodes.h
@@ -0,0 +1,47 @@
+/* Copyright 2021 Andrew Rae ajrae.nv@gmail.com @andrewjrae
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include QMK_KEYBOARD_H
+
+// Check whether caps word is on
+bool caps_word_enabled(void);
+// Enable caps word
+void enable_caps_word(void);
+// Disable caps word
+void disable_caps_word(void);
+// Toggle caps word
+void toggle_caps_word(void);
+
+// enum for the xcase states
+enum xcase_state {
+ XCASE_OFF = 0, // xcase is off
+ XCASE_ON, // xcase is actively on
+ XCASE_WAIT, // xcase is waiting for the delimiter input
+};
+
+// Get xcase state
+enum xcase_state get_xcase_state(void);
+// Enable xcase and pickup the next keystroke as the delimiter
+void enable_xcase(void);
+// Enable xcase with the specified delimiter
+void enable_xcase_with(uint16_t delimiter);
+// Disable xcase
+void disable_xcase(void);
+
+// Function to be put in process user
+bool process_case_modes(uint16_t keycode, const keyrecord_t *record);
diff --git a/users/muppetjones/features/combos.c b/users/muppetjones/features/combos.c
new file mode 100644
index 0000000000..a6d14bb25c
--- /dev/null
+++ b/users/muppetjones/features/combos.c
@@ -0,0 +1,36 @@
+/* Copyright 2020 Stephen J. Bush
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef COMBO_ENABLE
+# include QMK_KEYBOARD_H
+
+enum combos {
+ H_COMM_TAB,
+ L_U_SCLN,
+ J_M_CAPS,
+};
+
+const uint16_t PROGMEM h_comm_tab[] = {KC_H, KC_COMM, COMBO_END};
+const uint16_t PROGMEM l_u_scln[] = {KC_L, KC_U, COMBO_END};
+const uint16_t PROGMEM j_m_caps[] = {KC_J, KC_M, COMBO_END};
+
+// COMBO_COUNT defined in config.h
+combo_t key_combos[COMBO_COUNT] = {
+ [H_COMM_TAB] = COMBO(h_comm_tab, KC_TAB),
+ [L_U_SCLN] = COMBO(l_u_scln, KC_SCLN),
+ [J_M_CAPS] = COMBO(j_m_caps, KC_CAPS),
+};
+#endif
diff --git a/users/muppetjones/features/combos.h b/users/muppetjones/features/combos.h
new file mode 100644
index 0000000000..af092904e4
--- /dev/null
+++ b/users/muppetjones/features/combos.h
@@ -0,0 +1,17 @@
+/* Copyright 2020 Stephen J. Bush
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
diff --git a/users/muppetjones/features/dancelayers.c b/users/muppetjones/features/dancelayers.c
new file mode 100644
index 0000000000..e7e5f2a6f2
--- /dev/null
+++ b/users/muppetjones/features/dancelayers.c
@@ -0,0 +1,98 @@
+/* Copyright 2020 Stephen J. Bush
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef TAP_DANCE_ENABLE
+
+# include QMK_KEYBOARD_H
+# include "muppetjones.h"
+# include "dancelayers.h"
+
+// Initialize tap structure associated with example tap dance key
+static td_tap_t lyr_tap_state = {.is_press_action = true, .state = TD_NONE};
+
+/* @brief Determine the current tap dance state
+ * @param A tap dance state struct.
+ * @return A struct.
+ */
+td_state_t cur_dance(qk_tap_dance_state_t *state) {
+ switch (state->count) {
+ case 1:
+ if (!state->pressed)
+ return TD_1X_TAP;
+ else
+ return TD_1X_HOLD;
+ case 2:
+ return TD_2X_TAP;
+ break;
+ case 3:
+ return TD_3X_TAP;
+ break;
+ case 4:
+ return TD_4X_TAP;
+ break;
+ default:
+ return TD_UNKNOWN;
+ }
+}
+
+// Functions that control what our tap dance key does
+__attribute__((weak)) void td_layer_finished(qk_tap_dance_state_t *state, void *user_data) {
+ lyr_tap_state.state = cur_dance(state);
+ switch (lyr_tap_state.state) {
+ case TD_1X_TAP:
+ if (layer_state_is(_MOUSE))
+ layer_off(_MOUSE);
+ else
+ layer_on(_MOUSE);
+ break;
+ case TD_1X_HOLD:
+ layer_on(_ADJUST);
+ break;
+ case TD_2X_TAP:
+ // Toggle lower layer
+ if (layer_state_is(_LOWER))
+ layer_off(_LOWER);
+ else
+ layer_on(_LOWER);
+ break;
+ case TD_3X_TAP:
+ // Toggle lower layer
+ if (layer_state_is(_RAISE))
+ layer_off(_RAISE);
+ else
+ layer_on(_RAISE);
+ break;
+ case TD_4X_TAP:
+ // Toggle lower layer
+ if (layer_state_is(_ADJUST))
+ layer_off(_ADJUST);
+ else
+ layer_on(_ADJUST);
+ break;
+ default:
+ break;
+ }
+}
+
+__attribute__((weak)) void td_layer_reset(qk_tap_dance_state_t *state, void *user_data) {
+ // If the key was held down and now is released then switch off the layer
+ if (lyr_tap_state.state == TD_1X_HOLD) {
+ layer_off(_ADJUST);
+ }
+ lyr_tap_state.state = TD_NONE;
+}
+
+#endif
diff --git a/users/muppetjones/features/dancelayers.h b/users/muppetjones/features/dancelayers.h
new file mode 100644
index 0000000000..23defcca92
--- /dev/null
+++ b/users/muppetjones/features/dancelayers.h
@@ -0,0 +1,82 @@
+/* Copyright 2020 Stephen J. Bush
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+#ifdef TAP_DANCE_ENABLE
+# include QMK_KEYBOARD_H
+
+/*
+ * TAP DANCE
+ * https://docs.qmk.fm/#/feature_tap_dance
+ */
+
+// Define a type for as many tap dance states as you need
+typedef enum {
+ TD_NONE = 0,
+ TD_UNKNOWN,
+ TD_1X_TAP,
+ TD_1X_HOLD,
+ TD_2X_TAP,
+ TD_3X_TAP,
+ TD_4X_TAP,
+} td_state_t;
+
+// Our custom tap dance key; add any other tap dance keys to this enum
+enum {
+ TD_LAYERS = 0, // NOTE: Start at 0 as this is also an array index
+};
+# define TD_LAYR TD(TD_LAYERS)
+
+typedef struct {
+ bool is_press_action;
+ td_state_t state;
+} td_tap_t;
+
+// Declare the functions to be used with your tap dance key(s)
+
+/* @brief Determine the current tap dance state
+ * @param A tap dance state struct.
+ * @return A struct.
+ */
+td_state_t cur_dance(qk_tap_dance_state_t *state);
+
+// Functions associated with individual tap dances
+
+/* @brief Associate tap actions with layers.
+ *
+ * NOTE: Weak attribute. Can (and should) be defined in keymap.c
+ *
+ * @param state Pointer to a tap dance state object.
+ * @param user_data Pointer to user data.
+ * @return None.
+ */
+void td_layer_finished(qk_tap_dance_state_t *state, void *user_data);
+
+/* @brief Reset tap dance actions.
+ *
+ * NOTE: Weak attribute. Can (and should) be defined in keymap.c
+ *
+ * @param state Pointer to a tap dance state object.
+ * @param user_data Pointer to user data.
+ * @return None.
+ */
+void td_layer_reset(qk_tap_dance_state_t *state, void *user_data);
+
+/* Define tap dance actions.
+ */
+__attribute__((weak))
+qk_tap_dance_action_t tap_dance_actions[1] = {[TD_LAYERS] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, td_layer_finished, td_layer_reset, 275)};
+#endif
diff --git a/users/muppetjones/features/etchamouse.c b/users/muppetjones/features/etchamouse.c
new file mode 100644
index 0000000000..e1d4c38e81
--- /dev/null
+++ b/users/muppetjones/features/etchamouse.c
@@ -0,0 +1,101 @@
+/* Copyright 2020 Stephen J. Bush
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include QMK_KEYBOARD_H
+#include "etchamouse.h"
+#include "pointing_device.h"
+
+#if defined(POINTING_DEVICE_ENABLE) && defined(ENCODER_ENABLE)
+
+/** Track movement separately in both directions. This will allow us to
+ * smooth out the movement along diagonals
+ */
+typedef struct {
+ bool clockwise : 1;
+ uint8_t count : 7;
+ uint16_t timer : 16;
+ uint16_t elapsed : 16;
+} key_tracker_t;
+
+static key_tracker_t tracker_x = {false, 0, 0, 0};
+static key_tracker_t tracker_y = {false, 0, 0, 0};
+
+/**
+ * @brief Calculate the mouse move units for the given tracker.
+ *
+ * By using a key tracker rederence, we can minimize the amount of space
+ * required on the stack. As we will have the tracker object, we will also
+ * take the clockwise direction into account, which completely internalizes
+ * the movement unit logic within this single function.
+ *
+ * @param tracker: Pointer to a key tracker object.
+ * @return A integer from -127 to 127
+ */
+static int8_t move_unit(key_tracker_t *tracker) {
+ if (0 == tracker->count) return 0;
+
+ const uint16_t modifier = TAPPING_TERM_MOUSE_ENCODER < tracker->elapsed ? 1 : (TAPPING_TERM_MOUSE_ENCODER - tracker->elapsed) >> 1;
+ uint16_t speed = MOUSEKEY_INITIAL_SPEED + MOUSEKEY_MOVE_DELTA * modifier * (tracker->count >> 1);
+
+ /* convert speed to USB mouse speed 1 to 127 */
+ speed = (uint8_t)(speed / (1000.0f / MOUSEKEY_INTERVAL));
+ speed = speed < 1 ? 1 : speed;
+
+ return (tracker->clockwise ? 1 : -1) * (speed > MOUSEKEY_MOVE_MAX ? MOUSEKEY_MOVE_MAX : speed);
+}
+
+/**
+ * @brief Update key press tracker
+ *
+ * Update the time elapsed since the last keypress.
+ * If the key has not been pressed since the tapping term, then reset the count to zero.
+ * If the key was pressed, update the timer and increment the count.
+ * Number of keypresses will degrade based on tapping term and zero out based
+ * on the persistenc term.
+ *
+ * @param tracker: The object to update
+ * @param pressed: A boolean indicating whether or not the key was pressed
+ * @return None.
+ */
+static void update_tracker(key_tracker_t *tracker, bool pressed, bool clockwise) {
+ tracker->elapsed = timer_elapsed(tracker->timer);
+ if (pressed) {
+ tracker->timer = timer_read();
+ tracker->count += 1;
+ tracker->clockwise = clockwise;
+ } else if (TAPPING_TERM_PERSISTENCE < tracker->elapsed) {
+ tracker->count = 0;
+ } else if (TAPPING_TERM_MOUSE_ENCODER < tracker->elapsed) {
+ tracker->count >>= 1;
+ }
+}
+
+bool encoder_update_mouse(uint8_t index, bool clockwise) {
+ report_mouse_t curr_report = pointing_device_get_report();
+
+ update_tracker(&tracker_x, 0 == index, clockwise);
+ update_tracker(&tracker_y, 1 == index, clockwise);
+
+ curr_report.x += move_unit(&tracker_x);
+ curr_report.y += move_unit(&tracker_y);
+
+ pointing_device_set_report(curr_report);
+ pointing_device_send();
+
+ return true;
+}
+
+#endif
diff --git a/users/muppetjones/features/etchamouse.h b/users/muppetjones/features/etchamouse.h
new file mode 100644
index 0000000000..86b0d03c6e
--- /dev/null
+++ b/users/muppetjones/features/etchamouse.h
@@ -0,0 +1,59 @@
+/* Copyright 2020 Stephen J. Bush
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#if defined(POINTING_DEVICE_ENABLE) && defined(ENCODER_ENABLE)
+
+/* max value on report descriptor */
+# ifndef MOUSEKEY_MOVE_MAX
+# define MOUSEKEY_MOVE_MAX 127
+# elif MOUSEKEY_MOVE_MAX > 127
+# error MOUSEKEY_MOVE_MAX needs to be smaller than 127
+# endif
+# ifndef MOUSEKEY_MOVE_DELTA
+# define MOUSEKEY_MOVE_DELTA 25
+# endif
+# ifndef MOUSEKEY_INITIAL_SPEED
+# define MOUSEKEY_INITIAL_SPEED 100
+# endif
+# ifndef MOUSEKEY_INTERVAL
+# define MOUSEKEY_INTERVAL 75
+# endif
+
+/** Amount of time (ms) before zeroing out the count.
+ * A higher value will result in smoother curves but may lower accuracy
+ */
+# ifndef TAPPING_TERM_PERSISTENCE
+# define TAPPING_TERM_PERSISTENCE 150
+# endif
+
+/** Amount of time (ms) to register consecutive key presses
+ * A higher value will smooth out mouse movement and increase speed for
+ * consecutive presses.
+ */
+# ifndef TAPPING_TERM_MOUSE_ENCODER
+# define TAPPING_TERM_MOUSE_ENCODER 50
+# endif
+
+/** @brief Update mouse position based on encoder movement.
+ * @param index The encoder index. 0 controls x-axis; 1 controls y-axis.
+ * @param clockwise Indicates direction encoder was turned.
+ * @returns None.
+ */
+bool encoder_update_mouse(uint8_t index, bool clockwise);
+
+#endif
diff --git a/users/muppetjones/features/rgblayers.c b/users/muppetjones/features/rgblayers.c
new file mode 100644
index 0000000000..46858ae671
--- /dev/null
+++ b/users/muppetjones/features/rgblayers.c
@@ -0,0 +1,69 @@
+/* Copyright 2020 Stephen J. Bush
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef RGBLIGHT_ENABLE
+# include QMK_KEYBOARD_H
+# include "rgblayers.h"
+
+static rgblight_config_t home_rgb;
+
+__attribute__((weak)) void set_layer_hsv(layer_state_t state, HSV* offset) {}
+
+/* Placeholder function
+ * If defined in a keymap.c, this will be ignored.
+ */
+__attribute__((weak)) void post_process_record_keymap(uint16_t keycode, keyrecord_t* record) { return; }
+
+void post_process_record_user(uint16_t keycode, keyrecord_t* record) {
+ // Regular user keycode case statement
+ switch (keycode) {
+# ifdef RGBLIGHT_ENABLE
+ case RGB_HUD:
+ case RGB_HUI:
+ case RGB_SAD:
+ case RGB_SAI:
+ case RGB_VAD:
+ case RGB_VAI:
+ set_rgb_home();
+ break;
+# endif
+ default:
+ break;
+ }
+}
+
+void set_rgb_home(void) {
+ home_rgb.raw = eeconfig_read_rgblight();
+ // these get the current -- not eeprom
+ // home_rgb.hue = rgblight_get_hue();
+ // home_rgb.sat = rgblight_get_sat();
+ // home_rgb.val = rgblight_get_val();
+}
+
+void set_rgb_by_layer(layer_state_t state) {
+ if (!rgblight_is_enabled()) {
+ return; // lighting not enabled
+ }
+
+ HSV layer_color = {home_rgb.hue, home_rgb.sat, home_rgb.val};
+ set_layer_hsv(state, &layer_color);
+ rgblight_sethsv_noeeprom( //
+ layer_color.h, // all 3 MUST be btwn 0 and 255
+ layer_color.s, //
+ layer_color.v //
+ );
+}
+#endif
diff --git a/users/muppetjones/features/rgblayers.h b/users/muppetjones/features/rgblayers.h
new file mode 100644
index 0000000000..35be7d7fe4
--- /dev/null
+++ b/users/muppetjones/features/rgblayers.h
@@ -0,0 +1,22 @@
+/* Copyright 2020 Stephen J. Bush
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+#ifdef RGBLIGHT_ENABLE
+
+void set_rgb_by_layer(layer_state_t);
+void set_rgb_home(void);
+#endif
diff --git a/users/muppetjones/muppetjones.c b/users/muppetjones/muppetjones.c
new file mode 100644
index 0000000000..55051bdbcd
--- /dev/null
+++ b/users/muppetjones/muppetjones.c
@@ -0,0 +1,57 @@
+/* Copyright 2020 Stephen J. Bush @muppetjones
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include QMK_KEYBOARD_H
+#include "muppetjones.h"
+#include "tapmods.h"
+#include "features/casemodes.h"
+
+/* Placeholder function
+ * If defined in a keymap.c, this will be ignored.
+ */
+__attribute__((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { return true; }
+
+/* Handle keypresses
+ */
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (!process_case_modes(keycode, record)) {
+ return false;
+ }
+ // Regular user keycode case statement
+ switch (keycode) {
+ case CLMK_DH:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_CLMK_DH);
+ }
+ return false;
+ break;
+ 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 CAPSWRD:
+ if (record->event.pressed) {
+ toggle_caps_word();
+ }
+ return false;
+ default:
+ break;
+ }
+ return process_record_keymap(keycode, record);
+}
diff --git a/users/muppetjones/muppetjones.h b/users/muppetjones/muppetjones.h
new file mode 100644
index 0000000000..f5b2a3a465
--- /dev/null
+++ b/users/muppetjones/muppetjones.h
@@ -0,0 +1,56 @@
+/* Copyright 2020 Stephen J. Bush @muppetjones
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+#include QMK_KEYBOARD_H
+
+#include "tapmods.h"
+#include "wrappers.h"
+#include "features/casemodes.h"
+
+#ifdef COMBO_ENABLE
+# include "features/combos.h"
+#endif
+
+#ifdef ENCODER_ENABLE
+# include "features/etchamouse.h"
+#endif
+
+#ifdef RGBLIGHT_ENABLE
+# include "features/rgblayers.h"
+#endif
+
+#ifdef TAP_DANCE_ENABLE
+# include "features/dancelayers.h"
+#endif
+
+/* Define layer names */
+enum userspace_layers {
+ _CLMK_DH = 0,
+ _QWERTY,
+ _MOUSE, // Intended for encoders. Mostly pass through.
+ _LOWER,
+ _RAISE,
+ _NAV,
+ _ADJUST,
+};
+
+// for casemodes
+enum custom_keycodes {
+ CLMK_DH = SAFE_RANGE,
+ QWERTY,
+ CAPSWRD,
+};
diff --git a/users/muppetjones/readme.md b/users/muppetjones/readme.md
new file mode 100644
index 0000000000..6569c01d95
--- /dev/null
+++ b/users/muppetjones/readme.md
@@ -0,0 +1,23 @@
+# License
+
+Copyright 2020 Stephen J. Bush @muppetjones
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# FEATURES
+
+- [Etch-a-sketch Encoders](readme/etchamouse.md)
+- [RGB Layers](readme/rgblayers.md)
+- [Tap Dance Layers](readme/dancelayers.md)
+- [Tap Mods](readme/tapmods.md)
diff --git a/users/muppetjones/readme/dancelayers.md b/users/muppetjones/readme/dancelayers.md
new file mode 100644
index 0000000000..85c4b7cad9
--- /dev/null
+++ b/users/muppetjones/readme/dancelayers.md
@@ -0,0 +1,73 @@
+# Tap Dance Layers
+
+This feature creates a key that changes the current layer via tap dance. By
+default, this assumes that you have the following layers defined:
+
+- `_ADJUST`
+- `_LOWER`
+- `_RAISE`
+- `_MOUSE`
+
+And sets up the following tap dance:
+
+| Count | Action | Layer |
+| ----- | ------ | --------- |
+| 1x | hold | `_ADJUST` |
+| 1x | tap | `_MOUSE` |
+| 2x | tap | `_LOWER` |
+| 3x | tap | `_RAISE` |
+| 4x | tap | `_ADJUST` |
+
+## Usage
+
+> NOTE: If you use other tap-dance functions, you may require additonal setup.
+
+1. Copy `features/dancelayers.{c,h}` into your keymap or userspace directory.
+2. Add the following to your `rules.mk`
+
+ ```
+ TAP_DANCE_ENABLE = yes
+
+ SRC += ./features/dancelayers.c
+ ```
+
+3. Add the following to your `keymap.c`:
+
+ ```
+ #ifdef TAP_DANCE_ENABLE
+ # include "features/dancelayers.h"
+ # define TD_LAYR TD(TD_LAYERS)
+ #else
+ # define TD_LAYR XXXXXXX
+ #endif
+ ```
+
+4. Add `TD_LYR` to your keymap.
+
+## Functions and Enumerations
+
+The following functions are available for use:
+
+- `cur_dance`
+
+The following tap dance enumerations are defined:
+
+- `TD_1X_HOLD`
+- `TD_1X_TAP`
+- `TD_2X_TAP`
+- `TD_3X_TAP`
+- `TD_4X_TAP`
+
+## Overriding the Defaults
+
+If you want to define different layers to tap dance actions, you'll need to
+define two additional functions in your `keymap.c`:
+
+- `td_lyr_finished`
+- `td_lyr_reset`
+
+Both of these functions are necessary and require a certain pattern for each
+layer. "Tap" actions are handled in `*_finished` while "hold" actions are
+resolved in `*_finished` and `*_reset`.
+
+See the implementation in `dancelayers.c` for an example.
diff --git a/users/muppetjones/readme/etchamouse.md b/users/muppetjones/readme/etchamouse.md
new file mode 100644
index 0000000000..efcf718b22
--- /dev/null
+++ b/users/muppetjones/readme/etchamouse.md
@@ -0,0 +1,69 @@
+# Etch-a-Mouse
+
+Encoder-based mouse movement with acceleration!
+
+## Usage
+
+- Add the following to your rules.mk
+
+ ```
+ ENCODER_ENABLE = yes
+ POINTING_DEVICE_ENABLE = yes
+ ```
+
+- Add the following block to your keymap.c
+
+ ```
+ #ifdef ENCODER_ENABLE
+ void encoder_update_user(uint8_t index, bool clockwise) {
+ # ifdef POINTING_DEVICE_ENABLE
+ encoder_update_mouse(index, clockwise);
+ # endif
+ return;
+ #endif
+ ```
+
+> NOTE: I use the mousekey keycodes to add button one and two into my keymap.
+
+## How It Works
+
+> This implementation uses the pointing device library, but it reuses several
+> of the same parameters from the mouse key acceleration.
+
+> The PD library is very light weight, but it does not animate cursor movement.
+> tl;dr: The mouse movement will not be smooth!
+
+The acceleration has four parts:
+
+```
+initial speed + (delta * time * count)
+```
+
+1. **Initial Speed**. Uses the `MOUSEKEY_INITIAL_SPEED` parameter.
+2. **Delta**. Uses the `MOUSEKEY_MOVE_DELTA` parameter.
+3. **Time**. The faster you turn, the faster you move.
+
+ Subtract the time elapsed since the last actuation from a tapping term,
+ defined by `TAPPING_TERM_MOUSE_ENCODER`†, with a minimum value of 1.
+
+4. **Count**. The more you turn, the faster you move.
+
+ Count of the total number of actuations. This value will decay over time.
+
+† _I probably could and will eventually use `TAPPING_TERM`, but I did not want
+to mess up my tap mods while experimenting with acceleration._
+
+## Diagonal Movement
+
+Counting the number of actuations for a given axis allows us to persist movement
+along a given axis to give us some diagonal movement when moving both axes,
+which also helps with the acceleration a bit and makes the movement less blocky.
+
+## Time-based Decay (a.k.a., Deceleration)
+
+Originally, the actuation count zeroed out once the tapping term elapsed, but
+this made the movement very choppy. Instead, the count will degrade on every
+refresh after the tapping term has been exceeded; unfortunately, a refresh only
+occurs on an actuation on either axis, so once the time elapsed exceeds the
+persistence term, the count is cleared, which also removes any movement in that
+axis.
diff --git a/users/muppetjones/readme/rgblayers.md b/users/muppetjones/readme/rgblayers.md
new file mode 100644
index 0000000000..fb69800177
--- /dev/null
+++ b/users/muppetjones/readme/rgblayers.md
@@ -0,0 +1,60 @@
+# Dynamic Underglow Lighting Per-Layer
+
+This bit of code allows you to define layer lighting that respects your current eeprom settings, e.g., brightness. It does this by storing the base state rgb
+
+## Setup
+
+1. Enable RGB underglow in your `rules.mk`
+
+ ```
+ RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+ ```
+
+2. (Optional) Add RGB configuration to your `config.h`
+
+ ```
+ #ifdef RGBLIGHT_ENABLE
+ // # define RGBLIGHT_ANIMATIONS
+ # define RGBLIGHT_HUE_STEP 8
+ # define RGBLIGHT_SAT_STEP 16
+ # define RGBLIGHT_VAL_STEP 16
+ # define RGBLIGHT_LIMIT_VAL 150
+ # define RGBLIGHT_SLEEP
+ // # define RGBLIGHT_LAYERS
+ #endif
+ ```
+
+3. Add `set_layer_hsv` function. This is where you define your layer-specific colors by setting the HSV properties on the `layer_color` pointer. This example uses the QMK RGB configuration parameters to keep the layer colors offset based on the current EEPROM HSV.
+
+ > NOTE: The HSV values should be between 0 and 255, but setting the modulus on saturation causes the lights to go white on my board. I _think_ this is due to overflow, but I haven't had the chance to try and resolve it yet.
+
+
+ ```
+ #ifdef RGBLIGHT_ENABLE
+ void set_layer_hsv(layer_state_t state, HSV* layer_color) {
+ int32_t h = layer_color->h, s = layer_color->s, v = layer_color->v;
+ switch (get_highest_layer(state)) {
+ case _RAISE:
+ h += 2 * RGBLIGHT_HUE_STEP;
+ break;
+ case _LOWER:
+ h += -2 * RGBLIGHT_HUE_STEP;
+ break;
+ case _NAV:
+ h += 1 * RGBLIGHT_HUE_STEP;
+ break;
+ case _MOUSE:
+ h += -7 * RGBLIGHT_HUE_STEP;
+ break;
+ default:
+ break;
+ }
+ layer_color->h = h % 255;
+ layer_color->s = s;
+ layer_color->v = v % 255;
+ return;
+ }
+ #endif
+ ```
+
+4. (Optional) If you're using `post_process_record_user`, you'll need to change the name in your keymap to `post_process_record_keymap`. We use the user function to update the HSV state after one of the RGB keycodes is pressed.
diff --git a/users/muppetjones/readme/tapmods.md b/users/muppetjones/readme/tapmods.md
new file mode 100644
index 0000000000..eb707e05d9
--- /dev/null
+++ b/users/muppetjones/readme/tapmods.md
@@ -0,0 +1,25 @@
+# Tap Mods
+
+## Standard Keys
+
+| Keycode | Tap | Hold | Description |
+| -------- | ------- | ----- | ---------------------------------------------------- |
+| `HY_ESC` | Esc | Hyper | Esc on tap; hyper when held |
+| `HR_*` | A, O | LGUI | Home-row for Colemak mod-DH and right-handed numpad. |
+| \'\' | R, I, 6 | LALT | Home-row for Colemak mod-DH and right-handed numpad. |
+| \'\' | S, E, 5 | LCTL | Home-row for Colemak mod-DH and right-handed numpad. |
+| \'\' | T, N, 4 | LSFT | Home-row for Colemak mod-DH and right-handed numpad. |
+
+## Layers
+
+| Keycode | Tap | Hold | Description |
+| ------- | ----- | ----- | --------------------------- |
+| LOWER | -- | Lower | Temporarily activate layer. |
+| RAISE | -- | Raise | Temporarily activate layer. |
+| NAV | -- | Nav | Temporarily activate layer. |
+| LOW_ENT | Enter | Lower | |
+| LOW_SPC | Space | Lower | |
+| NAV_SPC | Space | Nav | |
+| RAI_ENT | Enter | Raise | |
+| RAI_SPC | Space | Raise | |
+| RAI_TAB | Tab | Raise | |
diff --git a/users/muppetjones/readme/wrappers.md b/users/muppetjones/readme/wrappers.md
new file mode 100644
index 0000000000..e8365ab7ad
--- /dev/null
+++ b/users/muppetjones/readme/wrappers.md
@@ -0,0 +1,153 @@
+# Keymap Wrappers
+
+> Pattern adapted from users/drashna/wrapper.h
+
+Defines several object macros for common keycode sets. Each macro typically
+covers 5 keycodes with a left- or right-hand orientation, and macros are
+generally grouped into rows of three or four.
+
+> TODO: Use keymap builder to generate images.
+
+## Example
+
+```
+#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+// clang-format off
+[_MODS] = LAYOUT_wrapper(
+ _______, ___________________BLANK___________________, ...
+ ...
+),
+//clang-format on
+}
+```
+
+Substitute the appropriate `LAYOUT` function, e.g., `LAYOUT_planck_grid` for your board.
+
+## Wrappers
+
+> **How to Read the Tables**
+>
+> - Headers are numbered when wrapper is not hand-specific
+> - Headers use `L` and `R` to indicate handedness
+> - Headers use `P`, `R`, `M`, and `I` to indicate pinky, ring, middle, and index, respectively
+> - Wrappers define a maximum of **five** keycodes -- hands are shown on the same row for readability
+
+### Alpha: Colemak mod-DH
+
+| # | LP | LR | LM | LI | LI+ | RI+ | RI | RM | RR | RP |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| 1 | Q | W | F | P | B | J | L | U | Y | ;ˆ |
+| 2 | A° | R° | S° | T° | G | M | N° | E° | I° | O° |
+| 3 | Z | X | C | D | V˜ | K | H | , | . | / |
+
+- **ˆ:** (Optional) Replace `;` with `'` (top-right)
+- **°:** (Optional) Home row modifiers on tap-hold (GACS, SCAG)
+- **˜:** (Optional) Tap-hold `shift` on `v`
+
+### Alpha: QWERTY
+
+| # | LP | LR | LM | LI | LI+ | RI+ | RI | RM | RR | RP |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| 1 | Q | W | E | R | T | Y | U | I | O | P |
+| 2 | A | S | D | F | G | H | J | K | L | ; |
+| 3 | Z | X | C | V | B | N | M | , | . | / |
+
+### Blank(-ish)
+
+Defines macros for common filler.
+
+| 1 | 2 | 3 | 4 | 5 |
+| ---- | ---- | ---- | ---- | ---- |
+| TRNS | TRNS | TRNS | TRNS | TRNS |
+| xxxx | xxxx | xxxx | xxxx | xxxx |
+
+| LP | LR | LM | LI | LI+ | RI+ | RI | RM | RR | RP |
+| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
+| LGUI | LALT | LCTL | LSFT | TRNS | TRNS | RSFT | RCTL | LALT | RGUI |
+
+### Adjust
+
+| # | LP | LR | LM | LI | LI+ | RI+ | RI | RM | RR | RP |
+| --- | ------ | ----- | ---- | ----- | ------ | ---- | ------ | ------ | ---- | ---- |
+| 1 | Reset | Debug | xxxx | Term+ | Term- | xxxx | AGNORM | AGSWAP | xxxx | xxxx |
+| 2 | RgbTog | Hue+ | Sat+ | Val+ | RgbMod | xxxx | CLMKDH | QWERTY | xxxx | xxxx |
+| 3 | xxxx | Hue- | Sat- | Val- | xxxx | xxxx | xxxx | xxxx | xxxx | xxxx |
+
+> Recommend: Define Right side per-board
+
+### Function
+
+| # | 1 | 2 | 3 | 4 |
+| --- | --- | --- | --- | --- |
+| 1 | F1 | F2 | F3 | F4 |
+| 2 | F5 | F6 | F7 | F8 |
+| 3 | F9 | F10 | F11 | F12 |
+
+### Media
+
+| # | 1 | 2 | 3 | 4 | 5 |
+| --- | ----- | ----- | ----- | ---- | ---- |
+| 1 | AuOn | MiOn | MuOn | Brm+ | Vol+ |
+| 2 | AuOff | MiOff | MuOff | Brm- | Vol- |
+| 3 | Play | Stop | Next | Prev | Mute |
+
+### Nav
+
+| # | RI+ | RI | RM | RR | RP |
+| --- | ----- | ---- | ----- | ----- | ----- |
+| 1 | Pg Up | Home | Wh Dn | Wh Up | End |
+| 2 | Pg Dn | Left | Down | Up | Right |
+| 3 | xxxx | xxxx | xxxx | xxxx | xxxx |
+
+### Numpad
+
+- `X Y` indicates the character `X` on keypress and character `Y` on `shift` keypress
+- Second table shows characters with `alt` keypress
+
+| # | RI+ | RI | RM | RR | RP |
+| --- | ----- | ----- | ----- | ----- | ----- |
+| 1 | Del | `7 &` | `8 _` | `9 (` | |
+| 2 | `- _` | `4 $` | `5 %` | `6 ^` | `*` |
+| 3 | `= +` | `1 !` | `2 @` | `3 #` | `, <` |
+| 4 | | `0 )` | `. >` | | |
+
+| # | RI+ | RI | RM | RR | RP |
+| --- | ----- | ----- | ----- | ----- | ----- |
+| 1 | | `¶ ‡` | `• °` | `ª ·` | `« »` |
+| 2 | `– —` | `¢ ›` | `∞ fi` | `§ fl` | `° °` |
+| 3 | `≠ ±` | `¡ ⁄` | `™ €` | `£ ‹` | `≤ ¯` |
+| 4 | | | `º ‚` | | |
+
+### Symbols
+
+| # | LP | LR | LM | LI | LI+ |
+| --- | ---- | ---- | ---- | ---- | ---- |
+| 1 | ~ | \` | ( | ) | |
+| 2 | LGUI | LALT | \[ ° | \] ° | \_ - |
+| 3 | xxxx | xxxx | { | } | LSFT |
+
+- **°:** Home row modifiers on tap-hold (GACS, SCAG)
+
+### VIM
+
+| # | LP | LR | LM | LI | LI+ |
+| --- | --- | --- | --- | --- | --- |
+| 1 | Q° | W° | : | | |
+
+- **°:** Via transparency
+
+## Typical Layers
+
+My keymaps typically use the following layers.
+
+| # | Name | Via | Left | Right |
+| --- | ---------- | ------------- | --------- | ------ |
+| 0 | Colemak DH | Adjust | | |
+| 1 | QWERTY | Adjust | | |
+| 2 | Mouse | tap-dance | n/a | n/a |
+| 3 | Lower | L home thumb | symbols | numpad |
+| 4 | Raise | L outer thumb | | |
+| 5 | Nav | R home thumb | home mods | nav |
+| 6 | Adjust | tap-dance | RGB | MEDIA |
diff --git a/users/muppetjones/rules.mk b/users/muppetjones/rules.mk
new file mode 100644
index 0000000000..1decc2ed98
--- /dev/null
+++ b/users/muppetjones/rules.mk
@@ -0,0 +1,25 @@
+# Reduce firmware size
+# https://thomasbaart.nl/2018/12/01/reducing-firmware-size-in-qmk/
+# also requires in config.h
+# NO_ACTION_MACRO
+# NO_ACTION_FUNCTION
+LTO_ENABLE = yes
+
+SRC += muppetjones.c
+SRC += features/casemodes.c
+
+ifdef COMBO_ENABLE
+ SRC += ./features/combos.c
+endif
+
+ifdef ENCODER_ENABLE
+ SRC += ./features/etchamouse.c
+endif
+
+ifdef RGBLIGHT_ENABLE
+ SRC += ./features/rgblayers.c
+endif
+
+ifdef TAP_DANCE_ENABLE
+ SRC += ./features/dancelayers.c
+endif
diff --git a/users/muppetjones/tapmods.h b/users/muppetjones/tapmods.h
new file mode 100644
index 0000000000..af3d160c5b
--- /dev/null
+++ b/users/muppetjones/tapmods.h
@@ -0,0 +1,77 @@
+/* Copyright 2020 Stephen Bush
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+#include QMK_KEYBOARD_H
+
+/* Define a stand-in from dancelayers.h in case tap-dance isn't enabled */
+#ifndef TAP_DANCE_ENABLE
+# define TD_LAYR XXXXXXX
+#endif
+
+/* Misc */
+
+#define HY_ESC HYPR_T(KC_ESC)
+#define HY_BSPC HYPR_T(KC_BSPC)
+
+/* Tap Mod Layers */
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+#define NAV MO(_NAV)
+
+#define ADJ_DEL LT(_ADJUST, KC_DEL)
+#define LOW_ENT LT(_LOWER, KC_ENT)
+#define LOW_SPC LT(_LOWER, KC_SPC)
+#define LOW_BSP LT(_LOWER, KC_BSPC)
+#define NAV_SPC LT(_NAV, KC_SPC)
+#define RAI_BSP LT(_RAISE, KC_BSPC)
+#define RAI_ENT LT(_RAISE, KC_ENT)
+#define RAI_SPC LT(_RAISE, KC_SPC)
+#define RAI_TAB LT(_RAISE, KC_TAB)
+
+/* Miryoku Home-row Mods
+
+NOTE: Uses GACS.
+*/
+
+// Left-hand home row mods (colemak)
+#define HR_A LGUI_T(KC_A)
+#define HR_R LALT_T(KC_R)
+#define HR_S LCTL_T(KC_S)
+#define HR_T LSFT_T(KC_T)
+
+// Right-hand home row mods (colemak)
+#define HR_N RSFT_T(KC_N)
+#define HR_E RCTL_T(KC_E)
+#define HR_I LALT_T(KC_I)
+#define HR_O RGUI_T(KC_O)
+
+// Right-hand Numpad
+#define HR_4 RSFT_T(KC_4)
+#define HR_5 RCTL_T(KC_5)
+#define HR_6 LALT_T(KC_6)
+
+// Layout-specific mods
+#define TM_VSFT LSFT_T(KC_V) // For Using V in layer combos (e.g., planck)
+
+// GACS (Lower)
+#define HR_LBRC LCTL_T(KC_LBRC)
+#define HR_RBRC LSFT_T(KC_RBRC)
+
+// Left-hand home row mods (lower)---
+// #define HOME_UND LCTL_T(KC_UNDS) // NOTE: Mod-tap restricted to basic keycodes
+#define HOME_MIN LSFT_T(KC_MINS)
diff --git a/users/muppetjones/wrappers.h b/users/muppetjones/wrappers.h
new file mode 100644
index 0000000000..301554f5d5
--- /dev/null
+++ b/users/muppetjones/wrappers.h
@@ -0,0 +1,249 @@
+/* Copyright 2020 Stephen Bush
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+#include "muppetjones.h"
+#include "tapmods.h"
+
+/* Pattern adapted from users/drashna/wrapper.h
+ Define per-layout keymap sections. Also requires a wrapper.
+
+ Example:
+
+ #define LAYOUT_:name_wrapper(...) LAYOUT_:name(__VA_ARGS__)
+
+ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_MODS] = LAYOUT_:name _wrapper(
+ _______, ___________________BLANK___________________, ...
+ ...
+ ),
+ }
+*/
+
+#ifdef MOUSEKEY_ENABLE
+# define MK_WH_D KC_WH_D
+# define MK_WH_U KC_WH_U
+#else
+# define MK_WH_D XXXXXXX
+# define MK_WH_U XXXXXXX
+#endif
+
+// clang-format off
+/* Blank-ish
+ * ,----------------------------------. * ,----------------------------------.
+ * | TRNS | TRNS | TRNS | TRNS | TRNS | * | xxxx | xxxx | xxxx | xxxx | xxxx |
+ * `----------------------------------' * `----------------------------------'
+ * ,----------------------------------. * ,----------------------------------.
+ * | LGUI | LALT | LCTL | LSFT | TRNS | * | TRNS | RSFT | RCTL | LALT | RGUI |
+ * `----------------------------------' * `----------------------------------'
+*/
+#define __BLANK____________________________________ _______, _______, _______, _______, _______
+#define __BLANK_NOOP_______________________________ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+#define __BLANK_W_GACS_____________________________ KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, _______
+#define __BLANK_W_SCAG_____________________________ _______, KC_RSFT, KC_RCTL, KC_LALT, KC_RGUI
+
+/* Adjust LH
+ * ,----------------------------------. ,----------------------------------.
+ * |Reset |Debug | xxxx |Term+ |Term- | | xxxx |AGNORM|AGSWAP| xxxx | xxxx |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * |RgbTog| Hue+ | Sat+ | Val+ |RgbMod| | xxxx |CLMKDH|QWERTY| xxxx | xxxx |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | xxxx | Hue- | Sat- | Val- | xxxx | | xxxx | xxxx | xxxx | xxxx | xxxx |
+ * `----------------------------------' `----------------------------------'
+ */
+ // NOTE: The "BACKLIT" keycode is planck specific
+#define __ADJUST_L1________________________________ RESET, DEBUG, XXXXXXX, TERM_ON, TERM_OFF
+#define __ADJUST_L2________________________________ RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, RGB_MOD
+#define __ADJUST_L3________________________________ XXXXXXX, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX
+
+#define __ADJUST_R1________________________________ XXXXXXX, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX
+#define __ADJUST_R2________________________________ XXXXXXX, CLMK_DH, QWERTY, XXXXXXX, XXXXXXX
+#define __ADJUST_R3________________________________ __BLANK_NOOP_______________________________
+
+/* Colemak mod-DH
+ * ,----------------------------------. ,----------------------------------.
+ * | Q | W | F | P | B | | J | L | U | Y | ;ˆ |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | A | R | S | T | G | | M | N | E | I | O |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | Z | X | C | D | V˜ | | K | H | , | . | / |
+ * `----------------------------------' `----------------------------------'
+ * ˆ Alternate: KC_QUOT
+ * ° Alternate: Home row mods (GASC, SCAG)
+ * ˜ Alternate: Hold for shift
+ *
+ * Colemak mod-DH (alt and alt+shift)
+ * ,----------------------------------. ,----------------------------------.
+ * | œ Œ | ∑ „ | | π ∏ | ı | | ∆ Ô | | | ¥ Á | æ Æ |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | å Å | ® ‰ | ß Í | † ˇ | © ˝ | | µ Â | ˜ ˜ | ´ ´ | ˆ ˆ | Ø |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | Ω ¸ | ≈ ˛ | ç Ç | Î | √ ◊ | | ˚  | Ó | ≤ ¯ | ≥ ˘ | ÷ ¿ |
+ * `----------------------------------' `----------------------------------'
+ */
+#define __COLEMAK_MOD_DH_L1________________________ KC_Q, KC_W, KC_F, KC_P, KC_B
+#define __COLEMAK_MOD_DH_L2_W_GACS_________________ HR_A, HR_R, HR_S, HR_T, KC_G
+#define __COLEMAK_MOD_DH_L3________________________ KC_Z, KC_X, KC_C, KC_D, KC_V
+#define __COLEMAK_MOD_DH_L3_W_SFTV_________________ KC_Z, KC_X, KC_C, KC_D, TM_VSFT
+
+#define __COLEMAK_MOD_DH_R1_W_QUOT_________________ KC_J, KC_L, KC_U, KC_Y, KC_QUOT
+#define __COLEMAK_MOD_DH_R1________________________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
+#define __COLEMAK_MOD_DH_R2_W_SCAG_________________ KC_M, HR_N, HR_E, HR_I, HR_O
+#define __COLEMAK_MOD_DH_R3________________________ KC_K, KC_H, KC_COMM, KC_DOT, KC_SLASH
+
+/* Function (4 columns)
+ * ,---------------------------.
+ * | F1 | F2 | F3 | F4 |
+ * |------+------+------+------|
+ * | F5 | F6 | F7 | F8 |
+ * |------+------+------+------|
+ * | F9 | F10 | F11 | F12 |
+ * `---------------------------'
+ */
+#define __FUNC_X1_________________________ KC_F1, KC_F2, KC_F3, KC_F4
+#define __FUNC_X2_________________________ KC_F5, KC_F6, KC_F7, KC_F8
+#define __FUNC_X3_________________________ KC_F9, KC_F10, KC_F11, KC_F12
+
+/* Game
+ */
+#define __GAME_L1__________________________________ KC_BTN3, KC_BTN2, KC_UP, KC_BTN1, KC_BTN5
+#define __GAME_L2__________________________________ KC_BTN4, KC_LEFT, KC_DOWN, KC_RIGHT,XXXXXXX
+#define __GAME_L3__________________________________ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+
+#define __GAME_R1__________________________________ KC_Q, KC_1, KC_2, KC_3, XXXXXXX
+#define __GAME_R2__________________________________ XXXXXXX, KC_4, KC_5, KC_6, XXXXXXX
+#define __GAME_R3__________________________________ XXXXXXX, KC_7, KC_8, KC_9, XXXXXXX
+
+
+/* Guitar
+ * ,----------------------------------. ,----------------------------------.
+ * | E | F |• F♯ | G |• G♯ | | A |• A♯ | B |• C | C♯ |
+ * | A | A♯ |• B | C |• C♯ | | D |• D♯ | E |• F | F♯ |
+ * | D | D♯ |• E | F |• F♯ | | G |• G♯ | A |• A♯ | B |
+ * | G | G♯ |• A | A♯ |• B | | C |• C♯ | D |• D♯ | E |
+ * | B | C |• C♯ | D |• D♯ | | E |• F | F♯ |• G | G♯ |
+ * | E | F |• F♯ | G |• G♯ | | A |• A♯ | B |• C | C♯ |
+ * `----------------------------------' `----------------------------------'
+ */
+// Not sure why, but this does not work (possibly due to the lowercase 's'?)
+// #ifdef MIDI_ADVANCED
+// #define __GUITAR_1E_L______________________________ MI_E_1, MI_F_1, MI_Fs_1, MI_G_1, MI_Gs_1
+// #define __GUITAR_2A_L______________________________ MI_A_1, MI_As_1, MI_B_1, MI_C_2, MI_Cs_2
+// #define __GUITAR_3D_L______________________________ MI_D_2, MI_Ds_2, MI_E_2, MI_F_2, MI_Fs_2
+// #define __GUITAR_4G_L______________________________ MI_G_2, MI_Gs_2, MI_A_2, MI_As_2, MI_B_2
+// #define __GUITAR_5B_L______________________________ MI_B_2, MI_C_3, MI_Cs_3, MI_D_3, MI_Ds_3
+// #define __GUITAR_6E_L______________________________ MI_E_3, MI_F_3, MI_Fs_3, MI_G_3, MI_Gs_3
+//
+// #define __GUITAR_1E_R______________________________ MI_A_1, MI_As_1, MI_B_1, MI_C_2, MI_Cs_2
+// #define __GUITAR_2A_R______________________________ MI_D_2, MI_Ds_2, MI_E_2, MI_F_2, MI_Fs_2
+// #define __GUITAR_3D_R______________________________ MI_G_2, MI_Gs_2, MI_A_2, MI_As_2, MI_B_2
+// #define __GUITAR_4G_R______________________________ MI_C_3, MI_Cs_3, MI_D_3, MI_Ds_3, MI_E_3
+// #define __GUITAR_5B_R______________________________ MI_E_3, MI_F_3, MI_Fs_3, MI_G_3, MI_Gs_3
+// #define __GUITAR_6E_R______________________________ MI_A_3, MI_As_3, MI_B_3, MI_C_4, MI_Cs_4
+// #endif
+
+
+/* MEDIA
+ * ,----------------------------------.
+ * | AuOn | MiOn | MuOn | Brm+ | Vol+ |
+ * |------+------+------+------+------|
+ * | AuOff| MiOff| MuOff| Brm- | Vol- |
+ * |------+------+------+------+------|
+ * | Play | Stop | Next | Prev | Mute |
+ * `----------------------------------'
+ */
+// What it MUV_IN and MUV_DE (5C2A and B)?
+// https://github.com/qmk/qmk_firmware/blob/7e832e46de26989b81f2fbf58a0f391b2b0c1aaf/quantum/quantum_keycodes.h#L135
+#define __MEDIA_R1_________________________________ AU_ON, MI_ON, MU_ON, KC_BRMU, KC_VOLU
+#define __MEDIA_R2_________________________________ AU_OFF, MI_OFF, MU_OFF, KC_BRMD, KC_VOLD
+#define __MEDIA_R3_________________________________ KC_MPLY, KC_MSTP, KC_MNXT, KC_MPRV, KC_MUTE
+
+
+/* NAV
+ * ,----------------------------------.
+ * | Pg Up| Home | Wh Dn| Wh Up| End |
+ * |------+------+------+------+------|
+ * | Pg Dn| Left | Down | Up | Right|
+ * |------+------+------+------+------|
+ * | xxxx | xxxx | xxxx | xxxx | xxxx |
+ * `----------------------------------'
+ */
+#define __NAV_R1___________________________________ KC_PGUP, KC_HOME, KC_WH_D, KC_WH_U, KC_END
+#define __NAV_R2___________________________________ KC_PGDN, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
+#define __NAV_R3___________________________________ __BLANK_NOOP_______________________________
+
+/* NUMPAD * (alt, alt+shift)
+ * ,----------------------------------. * ,----------------------------------.
+ * | Del | 7 & | 8 * | 9 ( | \ | | * | | ¶ ‡ | • ° | ª · | « » |
+ * |------+------+------+------+------| * |------+------+------+------+------|
+ * | - _ | 4 $ | 5 % | 6 ^ | * | * | – — | ¢ › | ∞ fi | § fl | ° ° |
+ * |------+------+------+------+------| * |------+------+------+------+------|
+ * | = + | 1 ! | 2 @ | 3 # | , | * | ≠ ± | ¡ ⁄ | ™ € | £ ‹ | ≤ ¯ |
+ * |------+------+------+------+------| * |------+------+------+------+------|
+ * | | 0 ) | . > | | | * | | | º ‚ | | |
+ * `----------------------------------' * `----------------------------------'
+ */
+#define __NUMPAD_R1________________________________ KC_GRV, KC_7, KC_8, KC_9, KC_BSLS
+#define __NUMPAD_R2________________________________ KC_MINS, HR_4, HR_5, HR_6, KC_COMM
+#define __NUMPAD_R3________________________________ KC_EQL, KC_1, KC_2, KC_3, KC_DOT
+#define __NUMPAD_R4________________________________ _______, KC_0, KC_DOT, _______, _______
+
+#define __NUMPAD_R3_ALT____________________________ KC_0, KC_1, KC_2, KC_3, KC_EQ
+
+/* 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 | , | . | / |
+ * `----------------------------------' `----------------------------------'
+ */
+#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, KC_SCLN
+#define __QWERTY_R3________________________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH
+
+/* SYMBOLS
+ * ,----------------------------------.
+ * | ~ | ` | ( | ) | |
+ * |------+------+------+------+------|
+ * | LGUI | LALT |LCTL [|LSFT ]| _ - |
+ * |------+------+------+------+------|
+ * | xxxx | xxxx | { | } | LSFT |
+ * `----------------------------------'
+ */
+#define __SYMBOLS_L1_______________________________ KC_TILD, KC_GRV, KC_LPRN, KC_RPRN, XXXXXXX
+#define __SYMBOLS_L2_______________________________ KC_LGUI, KC_LALT, HR_LBRC, HR_RBRC, KC_UNDS
+#define __SYMBOLS_L3_______________________________ XXXXXXX, XXXXXXX, KC_LCBR, KC_RCBR, KC_LSFT
+
+#define __SYMBOLS_R1_______________________________ KC_TILD, KC_LPRN, KC_RPRN, XXXXXXX, XXXXXXX
+#define __SYMBOLS_R2_______________________________ KC_UNDS, HR_LBRC, HR_RBRC, XXXXXXX, XXXXXXX
+#define __SYMBOLS_R3_______________________________ KC_PLUS, KC_LCBR, KC_RCBR, XXXXXXX, XXXXXXX
+
+/* VIM
+ * -- Roll through ":wq" via transparency
+ * ,----------------------------------.
+ * | Q | W | : | | |
+ * `----------------------------------'
+ */
+#define __VIM_L1___________________________________ _______, _______, KC_COLN, _______, _______
+
+// clang-format on
+// __END__