summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraxtlos <axtlos@getcryst.al>2024-04-04 17:17:46 +0200
committeraxtlos <axtlos@getcryst.al>2024-04-04 17:17:46 +0200
commit6adb85e363e266c8c93c7c7982f180888f8dff93 (patch)
tree3374b6437685aa715b574fa2c393edfd19e3a39b
downloadqmk_keymap-master.tar.gz
qmk_keymap-master.tar.bz2
Add keymapmaster
-rw-r--r--keymap.c784
-rw-r--r--readme.md32
-rw-r--r--rules.mk6
3 files changed, 822 insertions, 0 deletions
diff --git a/keymap.c b/keymap.c
new file mode 100644
index 0000000..e93f272
--- /dev/null
+++ b/keymap.c
@@ -0,0 +1,784 @@
+// Copyright 2022 axtlos (@axtloss)
+// SPDX-License-Identifier: GPL-2.0-only
+#include QMK_KEYBOARD_H
+#include <time.h>
+
+enum sofle_layers {
+ /* _M_XYZ = Mac Os, _W_XYZ = Win/Linux */
+ _QWERTY,
+ _COLEMAK,
+ _GAME,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+enum custom_keycodes {
+ KC_COLEMAK = SAFE_RANGE,
+ KC_QWERTY,
+ KC_LOWER,
+ KC_RAISE,
+ KC_ADJUST,
+ KC_GAME,
+ KC_PRVWD,
+ KC_NXTWD,
+ KC_LSTRT,
+ KC_LEND,
+ KC_UNLOCK,
+ KC_KMSH,
+};
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * COLEMAK
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | F | P | G | | J | L | U | Y | ; | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | TAB | A | R | S | T | D |-------. ,-------| H | N | E | I | O | ' |
+ * |------+------+------+------+------+------| MUTE | |ADJUST |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| K | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Space / \Enter \ |RAISE | RCTR | RAlt | MOUSE |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+
+[_COLEMAK] = LAYOUT(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV,
+ KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC,
+ KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, KC_CAPS ,KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LGUI,KC_LALT,KC_LCTL,KC_LOWER, KC_ENT, KC_SPC, KC_RAISE, KC_RCTL, KC_RALT, KC_PSCR
+),
+/*
+ * QWERTY
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | E | R | T | | Y | U | I | O | P | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
+ * |------+------+------+------+------+------| | | |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | Print|
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+
+[_QWERTY] = LAYOUT(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV,
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, KC_MPLY,KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LGUI,KC_LALT,KC_LCTL, KC_LOWER, KC_ENT, KC_SPC, KC_RAISE, KC_RCTL, KC_RALT, KC_PSCR
+),
+/* LOWER
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | | |
+ * |------+------+------+------+------+------| MUTE | |KEYMASH|------+------+------+------+------+------|
+ * | Shift| = | - | + | { | } |-------| |-------| [ | ] | ; | : | \ | Shift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+[_LOWER] = LAYOUT(
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F12,
+ _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE,
+ _______, KC_EQL, KC_MINS, KC_PLUS, KC_LCBR, KC_RCBR, _______, KC_KMSH, KC_LBRC, KC_RBRC, KC_SCLN, KC_COLN, KC_BSLS, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+),
+/* RAISE
+ * ,----------------------------------------. ,-----------------------------------------.
+ * | | | | | | | | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Esc |Mod(1)|Mod(2)|Mod(3)|Mod(4)|Mod(5)| |Mod(6)|Mod(7)| Up |Mod(9)|Mod(0)| Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | ae | ue | oe | ss | euro |-------. ,-------| PgUP | Left | Down | Rigth| Del | Bspc |
+ * |------+------+------+------+------+------| MUTE | |KEYMASH|------+------+------+------+------+------|
+ * |Shift | Undo | Cut | Copy | Paste| caps |-------| |-------| PgDwn| LStr | | LEnd | | Shift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+[_RAISE] = LAYOUT(
+ _______, _______ , _______ , _______ , _______ , _______, _______, _______ , _______, _______ , _______ ,_______,
+ _______, LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), LGUI(KC_4), LGUI(KC_5), LGUI(KC_6), LGUI(KC_7), KC_UP, LGUI(KC_9), LGUI(KC_0), KC_BSPC,
+ _______, RALT(KC_Q), RALT(KC_Y), RALT(KC_P), RALT(KC_S), RALT(KC_5), KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_BSPC,
+ _______, KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, KC_CAPS, _______, _______, KC_PGUP, KC_LSTRT, XXXXXXX, KC_LEND, XXXXXXX, _______,
+ _______, _______, _______, _______, KC_ENT, _______, _______, _______, _______, _______
+),
+/*
+ * QWERTY
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | E | R | T | | Y | U | I | O | P | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
+ * |------+------+------+------+------+------| | | |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Space / \Enter \ |RAISE | RCTR | RAlt | Print|
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+
+[_GAME] = LAYOUT(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, KC_MPLY,KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LGUI,KC_LALT,KC_SPC, KC_LOWER, KC_SPC, KC_ENT, KC_RAISE, KC_RCTL, KC_RALT, KC_PSCR
+),
+/* ADJUST
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | | | | | | | | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | QK_BOOT| |QWERTY|COLEMAK| | | | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | |MACWIN|GAMING| | |-------. ,-------| | VOLDO| MUTE | VOLUP| | |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * |UNLOCK| | | | | |-------| |-------| | PREV | PLAY | NEXT | | |
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `---------------------------''------' '------''---------------------------'
+ */
+[_ADJUST] = LAYOUT(
+ XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ QK_BOOT , XXXXXXX,KC_QWERTY,KC_COLEMAK,CG_TOGG,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX , XXXXXXX,CG_TOGG, KC_GAME, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX,
+ KC_UNLOCK , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+),
+};
+
+#ifdef OLED_ENABLE
+
+bool show_lock = true; // this is used to display the lock icon and disable keypresses when the keyboard is locked
+int kmsh_length = 0;
+bool kmsh_mode = false;
+
+static void render_logo(void) {
+ return;
+}
+
+static const char PROGMEM locked_logo[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xfc, 0xce, 0xc6,
+ 0xc6, 0xce, 0xfc, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f,
+ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+/* 32 * 14 os logos */
+static const char PROGMEM linux_logo[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x27, 0x27, 0x8f, 0x9f, 0x03,
+ 0x73, 0xff, 0x03, 0xf2, 0xfe, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1f, 0x19, 0x19, 0x1b, 0x1b, 0x1b,
+ 0x1a, 0x18, 0x18, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+static const char PROGMEM mac_logo[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xf8, 0xf8, 0xf0, 0xf6, 0xfb, 0xfb, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0f, 0x1f, 0x1f, 0x0f, 0x0f, 0x1f, 0x1f, 0x0f, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+
+/* KEYBOARD PET START */
+
+/* settings */
+# define MIN_WALK_SPEED 10
+# define MIN_RUN_SPEED 40
+
+/* advanced settings */
+# define ANIM_FRAME_DURATION 200 // how long each frame lasts in ms
+# define ANIM_SIZE 96 // number of bytes in array. If you change sprites, minimize for adequate firmware size. max is 1024
+
+/* timers */
+uint32_t anim_timer = 0;
+
+/* current frame */
+uint8_t current_frame = 0;
+
+/* status variables */
+int current_wpm = 0;
+led_t led_usb_state;
+
+bool isSneaking = false;
+bool isJumping = false;
+bool showedJump = true;
+
+/* logic */
+static void render_luna(int LUNA_X, int LUNA_Y) {
+ /* Sit */
+ static const char PROGMEM sit[2][ANIM_SIZE] = {/* 'sit1', 32x22px */
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x02, 0x05, 0x02, 0x24, 0x04, 0x04, 0x02, 0xa9, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x68, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x82, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0c, 0x10, 0x10, 0x20, 0x20, 0x20, 0x28, 0x3e, 0x1c, 0x20, 0x20, 0x3e, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ },
+
+ /* 'sit2', 32x22px */
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c, 0x02, 0x05, 0x02, 0x24, 0x04, 0x04, 0x02, 0xa9, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x90, 0x08, 0x18, 0x60, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0e, 0x82, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0c, 0x10, 0x10, 0x20, 0x20, 0x20, 0x28, 0x3e, 0x1c, 0x20, 0x20, 0x3e, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
+
+ /* Walk */
+ static const char PROGMEM walk[2][ANIM_SIZE] = {/* 'walk1', 32x22px */
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x90, 0x90, 0x90, 0xa0, 0xc0, 0x80, 0x80, 0x80, 0x70, 0x08, 0x14, 0x08, 0x90, 0x10, 0x10, 0x08, 0xa4, 0x78, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x08, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0xea, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x20, 0x20, 0x3c, 0x0f, 0x11, 0x1f, 0x03, 0x06, 0x18, 0x20, 0x20, 0x3c, 0x0c, 0x12, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ },
+
+ /* 'walk2', 32x22px */
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x20, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x28, 0x10, 0x20, 0x20, 0x20, 0x10, 0x48, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x20, 0xf8, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x30, 0xd5, 0x20, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x30, 0x0c, 0x02, 0x05, 0x09, 0x12, 0x1e, 0x02, 0x1c, 0x14, 0x08, 0x10, 0x20, 0x2c, 0x32, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ }};
+
+ /* Run */
+ static const char PROGMEM run[2][ANIM_SIZE] = {/* 'run1', 32x22px */
+ {
+ 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x08, 0xc8, 0xb0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x3c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xc4, 0xa4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc8, 0x58, 0x28, 0x2a, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x09, 0x04, 0x04, 0x04, 0x04, 0x02, 0x03, 0x02, 0x01, 0x01, 0x02, 0x02, 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+ },
+
+ /* 'run2', 32x22px */
+ {
+ 0x00, 0x00, 0x00, 0xe0, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x78, 0x28, 0x08, 0x10, 0x20, 0x30, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xb0, 0x50, 0x55, 0x20, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x1e, 0x20, 0x20, 0x18, 0x0c, 0x14, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ }};
+
+ /* Bark */
+ static const char PROGMEM bark[2][ANIM_SIZE] = {/* 'bark1', 32x22px */
+ {
+ 0x00, 0xc0, 0x20, 0x10, 0xd0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x3c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc8, 0x48, 0x28, 0x2a, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x02, 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ },
+
+ /* 'bark2', 32x22px */
+ {
+ 0x00, 0xe0, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40, 0x40, 0x2c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x48, 0x28, 0x2a, 0x10, 0x0f, 0x20, 0x4a, 0x09, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x02, 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ }};
+
+ /* Sneak */
+ static const char PROGMEM sneak[2][ANIM_SIZE] = {/* 'sneak1', 32x22px */
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x40, 0x40, 0x80, 0x00, 0x80, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x21, 0xf0, 0x04, 0x02, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02, 0x04, 0x04, 0x04, 0x03, 0x01, 0x00, 0x00, 0x09, 0x01, 0x80, 0x80, 0xab, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x20, 0x20, 0x3c, 0x0f, 0x11, 0x1f, 0x02, 0x06, 0x18, 0x20, 0x20, 0x38, 0x08, 0x10, 0x18, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
+ },
+
+ /* 'sneak2', 32x22px */
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xa0, 0x20, 0x40, 0x80, 0xc0, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x41, 0xf0, 0x04, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02, 0x02, 0x04, 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x40, 0x55, 0x82, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x30, 0x0c, 0x02, 0x05, 0x09, 0x12, 0x1e, 0x04, 0x18, 0x10, 0x08, 0x10, 0x20, 0x28, 0x34, 0x06, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ }};
+
+ /* animation */
+ void animate_luna(void) {
+ /* jump */
+ if (isJumping || !showedJump) {
+ /* clear */
+ oled_set_cursor(LUNA_X, LUNA_Y + 2);
+ oled_write(" ", false);
+
+ oled_set_cursor(LUNA_X, LUNA_Y - 1);
+
+ showedJump = true;
+ } else {
+ /* clear */
+ oled_set_cursor(LUNA_X, LUNA_Y - 1);
+ oled_write(" ", false);
+
+ oled_set_cursor(LUNA_X, LUNA_Y);
+ }
+
+ /* switch frame */
+ current_frame = (current_frame + 1) % 2;
+
+ /* current status */
+ if (led_usb_state.caps_lock) {
+ oled_write_raw_P(bark[current_frame], ANIM_SIZE);
+
+ } else if (isSneaking) {
+ oled_write_raw_P(sneak[current_frame], ANIM_SIZE);
+
+ } else if (current_wpm <= MIN_WALK_SPEED) {
+ oled_write_raw_P(sit[current_frame], ANIM_SIZE);
+
+ } else if (current_wpm <= MIN_RUN_SPEED) {
+ oled_write_raw_P(walk[current_frame], ANIM_SIZE);
+
+ } else {
+ oled_write_raw_P(run[current_frame], ANIM_SIZE);
+ }
+ }
+
+# if OLED_TIMEOUT > 0
+ /* the animation prevents the normal timeout from occuring */
+ if (last_input_activity_elapsed() > OLED_TIMEOUT && last_led_activity_elapsed() > OLED_TIMEOUT) {
+ oled_off();
+ return;
+ } else {
+ oled_on();
+ }
+# endif
+
+ /* animation timer */
+ if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
+ anim_timer = timer_read32();
+ animate_luna();
+ }
+}
+
+/* KEYBOARD PET END */
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+ if (is_keyboard_master()) {
+ return OLED_ROTATION_270;
+ }
+ return rotation;
+}
+
+static void print_logo_narrow(void) {
+ render_logo();
+}
+
+static void print_status_narrow(void) {
+ /* Print current mode */
+ oled_set_cursor(0, 0);
+ if (show_lock == true) {
+ oled_write_raw_P(locked_logo, sizeof(locked_logo));
+ } else if (keymap_config.swap_lctl_lgui) {
+ oled_write_raw_P(mac_logo, sizeof(mac_logo));
+ } else {
+ oled_write_raw_P(linux_logo, sizeof(linux_logo));
+ }
+
+ oled_set_cursor(0, 3);
+
+
+ switch (get_highest_layer(default_layer_state)) {
+ case _COLEMAK:
+ oled_write_P(PSTR(" CLMK "), false);
+ break;
+ case _GAME:
+ oled_write_P(PSTR(" GAME "), false);
+ break;
+ case _QWERTY:
+ oled_write_P(PSTR("QWERT"), false);
+ break;
+ default:
+ oled_write_P(PSTR("UNDEF"), false);
+ }
+
+
+ oled_set_cursor(0, 5);
+
+ /* Print current layer */
+ oled_write_P(PSTR("LAYER"), false);
+
+ oled_set_cursor(0, 6);
+ if (kmsh_mode) {
+ oled_write_P(PSTR(" KMSH "), false);
+ } else {
+ switch (get_highest_layer(layer_state)) {
+ case _QWERTY:
+ oled_write_P(PSTR("Base "), false);
+ break;
+ case _RAISE:
+ oled_write_P(PSTR("Raise"), false);
+ break;
+ case _LOWER:
+ oled_write_P(PSTR("Lower"), false);
+ break;
+ case _ADJUST:
+ oled_write_P(PSTR(" Adj "), false);
+ break;
+ default:
+ oled_write_P(PSTR("Undef"), false);
+ }
+ }
+
+ /* caps lock */
+ oled_set_cursor(0, 8);
+ oled_write_P(PSTR("CPSLK"), led_usb_state.caps_lock);
+
+ /* KEYBOARD PET RENDER START */
+
+ render_luna(0, 13);
+
+ /* KEYBOARD PET RENDER END */
+}
+
+bool oled_task_user(void) {
+ /* KEYBOARD PET VARIABLES START */
+
+ current_wpm = get_current_wpm();
+ led_usb_state = host_keyboard_led_state();
+
+ /* KEYBOARD PET VARIABLES END */
+
+ if (is_keyboard_master()) {
+ print_status_narrow();
+ } else {
+ print_logo_narrow();
+ }
+ return false;
+}
+
+#endif
+
+const char start[10] = {'s','s','s','d','d','d','f','f','f','f'};
+const char end[11] = {'g','g','g','h','h','h','j','k','l','l','l'};
+
+bool write_keymash(int length) {
+ char *keymash = malloc(length+1);
+ int r,total = 0;
+ char prev = 'a';
+ int val = 0;
+ int switchup = 0;
+
+ srand(time(NULL)+(int)keymash);
+ total += sprintf(keymash+total, "%c", prev);
+ while (total < length) {
+ if (val == 0) {
+ int j = total+2 < length ? 2 : 1;
+ for (int i = 0; i < j; i++) {
+ r = abs((rand() % 10 - r) + r);
+ if (prev != start[r]) {
+ total += sprintf(keymash+total, "%c", start[r]);
+ prev = start[r];
+ } else {
+ i -= 1;
+ }
+ }
+ switchup = switchup < 0 ? 0 : switchup+1;
+ } else if (val == 1) {
+ int j = total+2 < length ? 2 : 1;
+ for (int i = 0; i < j; i++) {
+ r = abs((rand() % 11));
+ if (prev != end[r]) {
+ total += sprintf(keymash+total, "%c", end[r]);
+ prev = end[r];
+ } else {
+ i -= 1;
+ }
+ }
+ switchup = switchup > 0 ? 0 : switchup-1;
+ }
+ if (switchup < 2 || switchup > -2) {
+ val = abs(rand() % 2);
+ } else {
+ val = switchup < 0 ? 0 : 1;
+ }
+ }
+ send_string(keymash);
+ free(keymash);
+ return false;
+}
+
+bool write_keymash_value(void) {
+ if (!is_keyboard_master())
+ return true;
+ oled_set_cursor(0, 10);
+ if (kmsh_length <= 0) {
+ oled_write_P(PSTR(" "), false);
+ return false;
+ }
+ char *length = malloc(100); // doubt itll ever get this far
+ sprintf(length, "%d", kmsh_length);
+ oled_write(length, false);
+ free(length);
+ return false;
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case KC_QWERTY:
+ if (show_lock == true) {
+ return false;
+ }
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_QWERTY);
+ }
+ return false;
+ case KC_COLEMAK:
+ if (show_lock == true) {
+ return false;
+ }
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_COLEMAK);
+ }
+ return false;
+ case KC_GAME:
+ if (show_lock == true) {
+ return false;
+ }
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_GAME);
+ }
+ return false;
+ case KC_LOWER:
+ if (record->event.pressed) {
+ layer_on(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ return false;
+ case KC_RAISE:
+ if (record->event.pressed) {
+ layer_on(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ return false;
+ case KC_ADJUST:
+ if (record->event.pressed) {
+ layer_on(_ADJUST);
+ } else {
+ layer_off(_ADJUST);
+ }
+ return false;
+ case KC_PRVWD:
+ if (show_lock == true) {
+ return false;
+ }
+ if (record->event.pressed) {
+ if (keymap_config.swap_lctl_lgui) {
+ register_mods(mod_config(MOD_LALT));
+ register_code(KC_LEFT);
+ } else {
+ register_mods(mod_config(MOD_LCTL));
+ register_code(KC_LEFT);
+ }
+ } else {
+ if (keymap_config.swap_lctl_lgui) {
+ unregister_mods(mod_config(MOD_LALT));
+ unregister_code(KC_LEFT);
+ } else {
+ unregister_mods(mod_config(MOD_LCTL));
+ unregister_code(KC_LEFT);
+ }
+ }
+ break;
+ case KC_NXTWD:
+ if (show_lock == true) {
+ return false;
+ }
+ if (record->event.pressed) {
+ if (keymap_config.swap_lctl_lgui) {
+ register_mods(mod_config(MOD_LALT));
+ register_code(KC_RIGHT);
+ } else {
+ register_mods(mod_config(MOD_LCTL));
+ register_code(KC_RIGHT);
+ }
+ } else {
+ if (keymap_config.swap_lctl_lgui) {
+ unregister_mods(mod_config(MOD_LALT));
+ unregister_code(KC_RIGHT);
+ } else {
+ unregister_mods(mod_config(MOD_LCTL));
+ unregister_code(KC_RIGHT);
+ }
+ }
+ break;
+ case KC_LSTRT:
+ if (show_lock == true) {
+ return false;
+ }
+ if (record->event.pressed) {
+ if (keymap_config.swap_lctl_lgui) {
+ //CMD-arrow on Mac, but we have CTL and GUI swapped
+ register_mods(mod_config(MOD_LCTL));
+ register_code(KC_LEFT);
+ } else {
+ register_code(KC_HOME);
+ }
+ } else {
+ if (keymap_config.swap_lctl_lgui) {
+ unregister_mods(mod_config(MOD_LCTL));
+ unregister_code(KC_LEFT);
+ } else {
+ unregister_code(KC_HOME);
+ }
+ }
+ break;
+ case KC_LEND:
+ if (show_lock == true) {
+ return false;
+ }
+ if (record->event.pressed) {
+ if (keymap_config.swap_lctl_lgui) {
+ //CMD-arrow on Mac, but we have CTL and GUI swapped
+ register_mods(mod_config(MOD_LCTL));
+ register_code(KC_RIGHT);
+ } else {
+ register_code(KC_END);
+ }
+ } else {
+ if (keymap_config.swap_lctl_lgui) {
+ unregister_mods(mod_config(MOD_LCTL));
+ unregister_code(KC_RIGHT);
+ } else {
+ unregister_code(KC_END);
+ }
+ }
+ break;
+ case KC_COPY:
+ if (show_lock == true) {
+ return false;
+ }
+ if (record->event.pressed) {
+ register_mods(mod_config(MOD_LCTL));
+ register_code(KC_C);
+ } else {
+ unregister_mods(mod_config(MOD_LCTL));
+ unregister_code(KC_C);
+ }
+ return false;
+ case KC_UNLOCK:
+ if (record->event.pressed) {
+
+ show_lock = !show_lock;
+ print_status_narrow();
+ }
+ return false;
+ break;
+ case KC_KMSH:
+ if (show_lock == true)
+ return false;
+ if (record->event.pressed) {
+ kmsh_mode = !kmsh_mode;
+ write_keymash_value();
+ }
+ return false;
+ break;
+ case KC_ENT:
+ if (show_lock == true)
+ return false;
+ if (!kmsh_mode)
+ return true;
+ if (record->event.pressed) {
+ write_keymash(kmsh_length);
+ kmsh_length = 0;
+ write_keymash_value();
+ kmsh_mode = false;
+ return false;
+ }
+ break;
+ case KC_1:
+ if (!kmsh_mode)
+ return true;
+ if (record->event.pressed) {
+ kmsh_length += 1;
+ write_keymash_value();
+ }
+ return false;
+ break;
+ case KC_2:
+ if (!kmsh_mode)
+ return true;
+ if (record->event.pressed) {
+ kmsh_length += 2;
+ write_keymash_value();
+ }
+ return false;
+ break;
+ case KC_3:
+ if (!kmsh_mode)
+ return true;
+ if (record->event.pressed) {
+ kmsh_length += 3;
+ write_keymash_value();
+ }
+ return false;
+ break;
+ case KC_4:
+ if (!kmsh_mode)
+ return true;
+ if (record->event.pressed) {
+ kmsh_length += 4;
+ write_keymash_value();
+ }
+ return false;
+ break;
+ case KC_5:
+ if (!kmsh_mode)
+ return true;
+ if (record->event.pressed) {
+ kmsh_length += 5;
+ write_keymash_value();
+ }
+ return false;
+ break;
+ case KC_6:
+ if (!kmsh_mode)
+ return true;
+ if (record->event.pressed) {
+ kmsh_length += 6;
+ write_keymash_value();
+ }
+ return false;
+ break;
+ case KC_7:
+ if (!kmsh_mode)
+ return true;
+ if (record->event.pressed) {
+ kmsh_length += 7;
+ write_keymash_value();
+ }
+ return false;
+ break;
+ case KC_8:
+ if (!kmsh_mode)
+ return true;
+ if (record->event.pressed) {
+ kmsh_length += 8;
+ write_keymash_value();
+ }
+ return false;
+ break;
+ case KC_9:
+ if (!kmsh_mode)
+ return true;
+ if (record->event.pressed) {
+ kmsh_length += 9;
+ write_keymash_value();
+ }
+ return false;
+ break;
+ case KC_0: // 0 is for 10
+ if (!kmsh_mode)
+ return true;
+ if (record->event.pressed) {
+ kmsh_length += 10;
+ write_keymash_value();
+ }
+ return false;
+ break;
+ }
+ /* This stops any keypress to be sent to the computer when the keyboard is locked */
+ if (show_lock == false) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+#ifdef ENCODER_ENABLE
+
+bool encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) {
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ } else if (index == 1) {
+ if (clockwise) {
+ tap_code(KC_MNXT);
+ } else {
+ tap_code(KC_MPRV);
+ }
+ }
+ return true;
+}
+
+#endif
diff --git a/readme.md b/readme.md
new file mode 100644
index 0000000..fefecd1
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,32 @@
+# Custom keymap for the Sofle v2
+
+Features:
+
+- Various modes, can be switched (using Adjust layer and the selected one is stored in EEPROM).
+- Modes for Qwerty and Colemak support
+- Modes for Mac vs Linux/Win support -> different order of modifiers and different action shortcuts on the "UPPER" layer. Designed to simplify transtions when switching between operating systems often.
+- The OLED on master half shows selected mode and caps lock state and is rotated.
+- Left encoder controls volume up/down/mute. Right encoder PREV/NEXT media controls.
+- Keyboard lock, change to the adjust layer (up and down pressed at the same time) and press the left shift to lock/unlock, current lock state is displayed on oled
+- Apple logo for Mac mode, Fedora Silverblue logo for Linux/Win mode, Lock icon for locked
+- Fixed flickering on main OLED
+- Gaming layout, switches space to the left half of the keyboard and raises the most left column up by one key
+- Automated Keymash generator
+
+# Luna, the keyboard pet
+
+Features:
+- Luna reacts to your wpm counter
+ - under 10 wpm she sits
+ - between 10 and 40 wpm she walks
+ - over 40 wpm she runs
+- She will move sneakily if you hold down Ctrl
+- Will bark at people on the internet if you activate Caps Lock!
+- Luna jumps every time you hit Space
+
+# Keymash generator
+Instead of going through the effort to manually keymash, one can enter (or leave if already entered) Keymash mode by going to the lower layer and pressing on the right encoder.
+
+Once in keymash mode, the wanted length can be entered through the number keys, the values are added, meaning that if a length of 20 is wanted, a double tap on the `0` (0 is 10) results in the length 20.
+
+If the wanted length is entered, pressing enter will unleash the keyboard and keymash.
diff --git a/rules.mk b/rules.mk
new file mode 100644
index 0000000..d29c962
--- /dev/null
+++ b/rules.mk
@@ -0,0 +1,6 @@
+OLED_ENABLE = yes
+ENCODER_ENABLE = yes
+CONSOLE_ENABLE = no
+EXTRAKEY_ENABLE = yes
+WPM_ENABLE = yes
+SEND_STRING_ENABLE = yes