aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keyboards/sofle/keymaps/helltm/config.h21
-rw-r--r--keyboards/sofle/keymaps/helltm/keymap.c762
-rw-r--r--keyboards/sofle/keymaps/helltm/readme.md32
-rw-r--r--keyboards/sofle/keymaps/helltm/rules.mk6
4 files changed, 821 insertions, 0 deletions
diff --git a/keyboards/sofle/keymaps/helltm/config.h b/keyboards/sofle/keymaps/helltm/config.h
new file mode 100644
index 000000000..61ffb70fb
--- /dev/null
+++ b/keyboards/sofle/keymaps/helltm/config.h
@@ -0,0 +1,21 @@
1 /* Copyright 2021 HellSingCoder
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17
18#pragma once
19
20#define OLED_TIMEOUT 120000
21#define OLED_BRIGHTNESS 120
diff --git a/keyboards/sofle/keymaps/helltm/keymap.c b/keyboards/sofle/keymaps/helltm/keymap.c
new file mode 100644
index 000000000..d3bdd5fa8
--- /dev/null
+++ b/keyboards/sofle/keymaps/helltm/keymap.c
@@ -0,0 +1,762 @@
1 /* Copyright 2021 HellSingCoder
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 2 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include QMK_KEYBOARD_H
18
19enum sofle_layers {
20 /* _M_XYZ = Mac Os, _W_XYZ = Win/Linux */
21 _QWERTY,
22 _GAMING,
23 _LOWER,
24 _RAISE,
25 _ADJUST,
26};
27
28enum custom_keycodes {
29 KC_QWERTY = SAFE_RANGE,
30 KC_GAMING,
31 KC_LOWER,
32 KC_RAISE,
33 KC_ADJUST,
34 KC_PRVWD,
35 KC_NXTWD,
36 KC_LSTRT,
37 KC_LEND,
38 KC_DLINE,
39 KC_BSPC_DEL,
40 KC_LAYER
41};
42
43
44const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
45/*
46 * QWERTY
47 * ,-----------------------------------------. ,-----------------------------------------.
48 * | Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BS |
49 * |------+------+------+------+------+------| |------+------+------+------+------+------|
50 * | Tab | Q | W | E | R | T | | Y | U | I | O | P | ` |
51 * |------+------+------+------+------+------| |------+------+------+------+------+------|
52 * | Caps | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
53 * |------+------+------+------+------+------| play | | mute |------+------+------+------+------+------|
54 * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / | \ |
55 * `-----------------------------------------/ / \ \-----------------------------------------'
56 * | LGUI | LAlt | LAYER| LCTR | /Enter / \Space \ | [ | ] | - | = |
57 * | | | | |/ / \ \ | | | | |
58 * `----------------------------------' '------''---------------------------'
59 */
60
61[_QWERTY] = LAYOUT(
62 KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC_DEL,
63 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_GRV,
64 KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
65 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_GAMING, KC_QWERTY,KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_BSLS,
66 KC_LGUI,KC_LALT,KC_LAYER, KC_LCTRL, KC_ENT, KC_SPC, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL
67),
68
69/*
70 * GAMING
71 * ,-----------------------------------------. ,-----------------------------------------.
72 * | Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BS |
73 * |------+------+------+------+------+------| |------+------+------+------+------+------|
74 * | Tab | Q | W | E | R | T | | Y | U | I | O | P | ` |
75 * |------+------+------+------+------+------| |------+------+------+------+------+------|
76 * | Caps | A | S | D | F | G |-------. ,-------| H | J | K | L | Up | ' |
77 * |------+------+------+------+------+------| play | | mute |------+------+------+------+------+------|
78 * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | Left | Down | Right|
79 * `-----------------------------------------/ / \ \-----------------------------------------'
80 * | LGUI | LAlt | LAYER| LCTR | /Space / \Enter \ | [ | ] | - | = |
81 * | | | | |/ / \ \ | | | | |
82 * `----------------------------------' '------''---------------------------'
83 */
84
85[_GAMING] = LAYOUT(
86 KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC_DEL,
87 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_GRV,
88 KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_UP, KC_QUOT,
89 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MPLY, KC_MUTE,KC_N, KC_M, KC_COMM, KC_LEFT, KC_DOWN, KC_RIGHT,
90 KC_LGUI,KC_LALT,KC_LAYER, KC_LCTRL, KC_SPC, KC_ENT, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL
91),
92
93/* LOWER
94 * ,-----------------------------------------. ,-----------------------------------------.
95 * | Esc | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
96 * |------+------+------+------+------+------| |------+------+------+------+------+------|
97 * | Tab | | Up | | RESET| | | PWrd | NWrd | Pscr |Scroll| Pause| F12 |
98 * |------+------+------+------+------+------| |------+------+------+------+------+------|
99 * | Caps | Left | Down | Rigth| | |-------. ,-------| | | Ins | Home | PUp | |
100 * |------+------+------+------+------+------| play | | mute |------+------+------+------+------+------|
101 * | Shift| | | | | |-------| |-------| | Menu | Del | End | PDown| |
102 * `-----------------------------------------/ / \ \-----------------------------------------'
103 * |MACWIN| RAlt | LAYER| RCTR | /Enter / \Space \ | | | | |
104 * | | | | |/ / \ \ | | | | |
105 * `----------------------------------' '------''---------------------------'
106 */
107[_LOWER] = LAYOUT(
108 _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
109 _______, XXXXXXX, KC_UP, XXXXXXX, RESET, XXXXXXX, KC_PRVWD, KC_NXTWD, KC_PSCR, KC_SLCK, KC_PAUS, KC_F12,
110 _______, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_INS, KC_HOME, KC_PGUP, XXXXXXX,
111 _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, KC_APP, KC_DEL, KC_END, KC_PGDN, XXXXXXX,
112 CG_TOGG, KC_RALT, _______, KC_RCTL, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
113),
114
115/* RAISE
116 * ,----------------------------------------. ,-----------------------------------------.
117 * | | | | | | | | | | | | | |
118 * |------+------+------+------+------+------| |------+------+------+------+------+------|
119 * | Esc | Ins | Pscr | Menu | | | | | PWrd | Up | NWrd | DLine| Bspc |
120 * |------+------+------+------+------+------| |------+------+------+------+------+------|
121 * | Tab | LAt | LCtl |LShift| | Caps |-------. ,-------| | Left | Down | Rigth| Del | Bspc |
122 * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
123 * |Shift | Undo | Cut | Copy | Paste| |-------| |-------| | LStr | | LEnd | | Shift|
124 * `-----------------------------------------/ / \ \-----------------------------------------'
125 * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
126 * | | | | |/ / \ \ | | | | |
127 * `----------------------------------' '------''---------------------------'
128 */
129[_RAISE] = LAYOUT(
130 _______, _______ , _______ , _______ , _______ , _______, _______, _______ , _______, _______ , _______ ,_______,
131 _______, KC_INS, KC_PSCR, KC_APP, XXXXXXX, XXXXXXX, KC_PGUP, KC_PRVWD, KC_UP, KC_NXTWD,KC_DLINE, KC_BSPC,
132 _______, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_BSPC,
133 _______,KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, XXXXXXX, _______, _______, XXXXXXX, KC_LSTRT, XXXXXXX, KC_LEND, _______, _______,
134 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
135),
136/* ADJUST
137 * ,-----------------------------------------. ,-----------------------------------------.
138 * | | | | | | | | | | | | | |
139 * |------+------+------+------+------+------| |------+------+------+------+------+------|
140 * | RESET| |QWERTY| | | | | | | | | | |
141 * |------+------+------+------+------+------| |------+------+------+------+------+------|
142 * | | |MACWIN| | | |-------. ,-------| | VOLDO| MUTE | VOLUP| | |
143 * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
144 * | | | | | | |-------| |-------| | PREV | PLAY | NEXT | | |
145 * `-----------------------------------------/ / \ \-----------------------------------------'
146 * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
147 * | | | | |/ / \ \ | | | | |
148 * `----------------------------------' '------''---------------------------'
149 */
150 [_ADJUST] = LAYOUT(
151 XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
152 RESET , XXXXXXX,KC_QWERTY,XXXXXXX,CG_TOGG,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
153 XXXXXXX , XXXXXXX,CG_TOGG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX,
154 XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
155 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
156 )
157};
158
159#ifdef OLED_DRIVER_ENABLE
160
161/* 32 * 32 logo */
162static void render_logo(void) {
163 static const char PROGMEM hell_logo[] = {
164 0x00, 0x80, 0xc0, 0xc0, 0x60, 0x60, 0x30, 0x30, 0x18, 0x1c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x80,
165 0xe0, 0x78, 0x1e, 0x06, 0x00, 0x0c, 0x1c, 0x18, 0x30, 0x30, 0x60, 0x60, 0xc0, 0xc0, 0x80, 0x00,
166 0x01, 0x03, 0x07, 0x06, 0x0c, 0x0c, 0x18, 0x18, 0x30, 0x70, 0x60, 0x00, 0xc0, 0xf0, 0x3c, 0x0f,
167 0x03, 0x00, 0x00, 0x00, 0x00, 0x60, 0x70, 0x30, 0x18, 0x18, 0x0c, 0x0c, 0x06, 0x07, 0x03, 0x01,
168 0x00, 0xf8, 0xf8, 0x80, 0x80, 0x80, 0xf8, 0xf8, 0x00, 0x80, 0xc0, 0xc0, 0x40, 0xc0, 0xc0, 0x80,
169 0x00, 0xf8, 0xf8, 0x00, 0xf8, 0xf8, 0x00, 0x08, 0x38, 0x08, 0x00, 0x38, 0x08, 0x30, 0x08, 0x38,
170 0x00, 0x1f, 0x1f, 0x01, 0x01, 0x01, 0x1f, 0x1f, 0x00, 0x0f, 0x1f, 0x1a, 0x12, 0x1a, 0x1b, 0x0b,
171 0x00, 0x1f, 0x1f, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
172 };
173
174 oled_write_raw_P(hell_logo, sizeof(hell_logo));
175}
176
177/* 32 * 14 os logos */
178static const char PROGMEM windows_logo[] = {
179 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0xbc, 0xbe, 0xbe, 0x00,
180 0xbe, 0xbe, 0xbf, 0xbf, 0xbf, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x0f, 0x0f, 0x00,
182 0x0f, 0x0f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
183};
184
185static const char PROGMEM mac_logo[] = {
186 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xf8, 0xf8,
187 0xf0, 0xf6, 0xfb, 0xfb, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
188 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0f, 0x1f, 0x1f,
189 0x0f, 0x0f, 0x1f, 0x1f, 0x0f, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
190};
191
192/* Smart Backspace Delete */
193
194bool shift_held = false;
195static uint16_t held_shift = 0;
196
197/* KEYBOARD PET START */
198
199/* settings */
200#define MIN_WALK_SPEED 10
201#define MIN_RUN_SPEED 40
202
203/* advanced settings */
204#define ANIM_FRAME_DURATION 200 // how long each frame lasts in ms
205#define ANIM_SIZE 96 // number of bytes in array. If you change sprites, minimize for adequate firmware size. max is 1024
206
207/* timers */
208uint32_t anim_timer = 0;
209uint32_t anim_sleep = 0;
210
211/* current frame */
212uint8_t current_frame = 0;
213
214/* status variables */
215int current_wpm = 0;
216led_t led_usb_state;
217
218bool isSneaking = false;
219bool isJumping = false;
220bool showedJump = true;
221
222/* logic */
223static void render_luna(int LUNA_X, int LUNA_Y) {
224
225 /* Sit */
226 static const char PROGMEM sit[2][ANIM_SIZE] = {
227 /* 'sit1', 32x22px */
228 {
229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c,
230 0x02, 0x05, 0x02, 0x24, 0x04, 0x04, 0x02, 0xa9, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x68, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00,
232 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x82, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0c, 0x10, 0x10, 0x20, 0x20, 0x20, 0x28,
234 0x3e, 0x1c, 0x20, 0x20, 0x3e, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
235 },
236
237 /* 'sit2', 32x22px */
238 {
239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c,
240 0x02, 0x05, 0x02, 0x24, 0x04, 0x04, 0x02, 0xa9, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
241 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x90, 0x08, 0x18, 0x60, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00,
242 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0e, 0x82, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0c, 0x10, 0x10, 0x20, 0x20, 0x20, 0x28,
244 0x3e, 0x1c, 0x20, 0x20, 0x3e, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
245 }
246 };
247
248 /* Walk */
249 static const char PROGMEM walk[2][ANIM_SIZE] = {
250 /* 'walk1', 32x22px */
251 {
252 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x90, 0x90, 0x90, 0xa0, 0xc0, 0x80, 0x80,
253 0x80, 0x70, 0x08, 0x14, 0x08, 0x90, 0x10, 0x10, 0x08, 0xa4, 0x78, 0x80, 0x00, 0x00, 0x00, 0x00,
254 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x08, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
255 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0xea, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00,
256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x20, 0x20, 0x3c, 0x0f, 0x11, 0x1f, 0x03,
257 0x06, 0x18, 0x20, 0x20, 0x3c, 0x0c, 0x12, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
258 },
259
260 /* 'walk2', 32x22px */
261 {
262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x20, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00,
263 0x00, 0xe0, 0x10, 0x28, 0x10, 0x20, 0x20, 0x20, 0x10, 0x48, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
264 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x20, 0xf8, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
265 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x30, 0xd5, 0x20, 0x1f, 0x00, 0x00, 0x00, 0x00,
266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x30, 0x0c, 0x02, 0x05, 0x09, 0x12, 0x1e,
267 0x02, 0x1c, 0x14, 0x08, 0x10, 0x20, 0x2c, 0x32, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
268 }
269 };
270
271 /* Run */
272 static const char PROGMEM run[2][ANIM_SIZE] = {
273 /* 'run1', 32x22px */
274 {
275 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x08, 0xc8, 0xb0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
276 0x80, 0x40, 0x40, 0x3c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00,
277 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xc4, 0xa4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
278 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc8, 0x58, 0x28, 0x2a, 0x10, 0x0f, 0x00, 0x00,
279 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x09, 0x04, 0x04, 0x04, 0x04, 0x02, 0x03, 0x02, 0x01, 0x01,
280 0x02, 0x02, 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
281 },
282
283 /* 'run2', 32x22px */
284 {
285 0x00, 0x00, 0x00, 0xe0, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
286 0x80, 0x80, 0x78, 0x28, 0x08, 0x10, 0x20, 0x30, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00,
287 0x00, 0x00, 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
288 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xb0, 0x50, 0x55, 0x20, 0x1f, 0x00, 0x00,
289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37,
290 0x02, 0x1e, 0x20, 0x20, 0x18, 0x0c, 0x14, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291 }
292 };
293
294 /* Bark */
295 static const char PROGMEM bark[2][ANIM_SIZE] = {
296 /* 'bark1', 32x22px */
297 {
298 0x00, 0xc0, 0x20, 0x10, 0xd0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40,
299 0x3c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
300 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
301 0x00, 0x00, 0x00, 0x00, 0x80, 0xc8, 0x48, 0x28, 0x2a, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
302 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x02,
303 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
304 },
305
306 /* 'bark2', 32x22px */
307 {
308 0x00, 0xe0, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x40,
309 0x40, 0x2c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00,
310 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00,
311 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0x48, 0x28, 0x2a, 0x10, 0x0f, 0x20, 0x4a, 0x09, 0x10,
312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37, 0x02, 0x02,
313 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
314 }
315 };
316
317 /* Sneak */
318 static const char PROGMEM sneak[2][ANIM_SIZE] = {
319 /* 'sneak1', 32x22px */
320 {
321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00,
322 0x00, 0x00, 0xc0, 0x40, 0x40, 0x80, 0x00, 0x80, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323 0x00, 0x00, 0x00, 0x00, 0x1e, 0x21, 0xf0, 0x04, 0x02, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02, 0x04,
324 0x04, 0x04, 0x03, 0x01, 0x00, 0x00, 0x09, 0x01, 0x80, 0x80, 0xab, 0x04, 0xf8, 0x00, 0x00, 0x00,
325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x20, 0x20, 0x3c, 0x0f, 0x11, 0x1f, 0x02, 0x06,
326 0x18, 0x20, 0x20, 0x38, 0x08, 0x10, 0x18, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
327 },
328
329 /* 'sneak2', 32x22px */
330 {
331 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
332 0x00, 0x00, 0xe0, 0xa0, 0x20, 0x40, 0x80, 0xc0, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
333 0x00, 0x00, 0x00, 0x00, 0x3e, 0x41, 0xf0, 0x04, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02, 0x02, 0x04,
334 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x40, 0x55, 0x82, 0x7c, 0x00, 0x00, 0x00,
335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x30, 0x0c, 0x02, 0x05, 0x09, 0x12, 0x1e, 0x04,
336 0x18, 0x10, 0x08, 0x10, 0x20, 0x28, 0x34, 0x06, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
337 }
338 };
339
340 /* animation */
341 void animate_luna(void) {
342
343 /* jump */
344 if (isJumping || !showedJump) {
345
346 /* clear */
347 oled_set_cursor(LUNA_X,LUNA_Y +2);
348 oled_write(" ", false);
349
350 oled_set_cursor(LUNA_X,LUNA_Y -1);
351
352 showedJump = true;
353 } else {
354
355 /* clear */
356 oled_set_cursor(LUNA_X,LUNA_Y -1);
357 oled_write(" ", false);
358
359 oled_set_cursor(LUNA_X,LUNA_Y);
360 }
361
362 /* switch frame */
363 current_frame = (current_frame + 1) % 2;
364
365 /* current status */
366 if(led_usb_state.caps_lock) {
367 oled_write_raw_P(bark[abs(1 - current_frame)], ANIM_SIZE);
368
369 } else if(isSneaking) {
370 oled_write_raw_P(sneak[abs(1 - current_frame)], ANIM_SIZE);
371
372 } else if(current_wpm <= MIN_WALK_SPEED) {
373 oled_write_raw_P(sit[abs(1 - current_frame)], ANIM_SIZE);
374
375 } else if(current_wpm <= MIN_RUN_SPEED) {
376 oled_write_raw_P(walk[abs(1 - current_frame)], ANIM_SIZE);
377
378 } else {
379 oled_write_raw_P(run[abs(1 - current_frame)], ANIM_SIZE);
380 }
381 }
382
383 /* animation timer */
384 if(timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
385 anim_timer = timer_read32();
386 animate_luna();
387 }
388
389 /* this fixes the screen on and off bug */
390 if (current_wpm > 0) {
391 oled_on();
392 anim_sleep = timer_read32();
393 } else if(timer_elapsed32(anim_sleep) > OLED_TIMEOUT) {
394 oled_off();
395 }
396
397}
398
399/* KEYBOARD PET END */
400
401static void print_logo_narrow(void) {
402 render_logo();
403
404 /* wpm counter */
405 uint8_t n = get_current_wpm();
406 char wpm_str[4];
407 oled_set_cursor(0,14);
408 wpm_str[3] = '\0';
409 wpm_str[2] = '0' + n % 10;
410 wpm_str[1] = '0' + ( n /= 10) % 10;
411 wpm_str[0] = '0' + n / 10;
412 oled_write(wpm_str, false);
413
414 oled_set_cursor(0,15);
415 oled_write(" wpm", false);
416}
417
418static void print_status_narrow(void) {
419 /* Print current mode */
420 oled_set_cursor(0,0);
421 if (keymap_config.swap_lctl_lgui) {
422 oled_write_raw_P(mac_logo, sizeof(mac_logo));
423 } else {
424 oled_write_raw_P(windows_logo, sizeof(windows_logo));
425 }
426
427 oled_set_cursor(0,3);
428
429 switch (get_highest_layer(default_layer_state)) {
430 case _QWERTY:
431 oled_write("QWRTY", false);
432 break;
433 case _GAMING:
434 oled_write("GAMES", false);
435 break;
436 default:
437 oled_write("UNDEF", false);
438 }
439
440 oled_set_cursor(0,5);
441
442 /* Print current layer */
443 oled_write("LAYER", false);
444
445 oled_set_cursor(0,6);
446
447 switch (get_highest_layer(layer_state)) {
448 case _QWERTY:
449 oled_write("Base ", false);
450 break;
451 case _GAMING:
452 oled_write("Games", false);
453 break;
454 case _RAISE:
455 oled_write("Raise", false);
456 break;
457 case _LOWER:
458 oled_write("Lower", false);
459 break;
460 case _ADJUST:
461 oled_write("Adj ", false);
462 break;
463 default:
464 oled_write("Undef", false);
465 }
466
467 /* caps lock */
468 oled_set_cursor(0,8);
469 oled_write("CPSLK", led_usb_state.caps_lock);
470
471 /* KEYBOARD PET RENDER START */
472
473 render_luna(0,13);
474
475 /* KEYBOARD PET RENDER END */
476}
477
478oled_rotation_t oled_init_user(oled_rotation_t rotation) {
479 return OLED_ROTATION_270;
480}
481
482void oled_task_user(void) {
483
484 /* KEYBOARD PET VARIABLES START */
485
486 current_wpm = get_current_wpm();
487 led_usb_state = host_keyboard_led_state();
488
489 /* KEYBOARD PET VARIABLES END */
490
491 if (is_keyboard_master()) {
492 print_status_narrow();
493 } else {
494 print_logo_narrow();
495 }
496}
497
498#endif
499
500bool process_record_user(uint16_t keycode, keyrecord_t *record) {
501 switch (keycode) {
502 case KC_QWERTY:
503 if (record->event.pressed) {
504 set_single_persistent_default_layer(_QWERTY);
505 }
506 return false;
507 case KC_GAMING:
508 if (record->event.pressed) {
509 set_single_persistent_default_layer(_GAMING);
510 }
511 return false;
512 case KC_LOWER:
513 if (record->event.pressed) {
514 layer_on(_LOWER);
515 update_tri_layer(_LOWER, _RAISE, _ADJUST);
516 } else {
517 layer_off(_LOWER);
518 update_tri_layer(_LOWER, _RAISE, _ADJUST);
519 }
520 return false;
521 case KC_RAISE:
522 if (record->event.pressed) {
523 layer_on(_RAISE);
524 update_tri_layer(_LOWER, _RAISE, _ADJUST);
525 } else {
526 layer_off(_RAISE);
527 update_tri_layer(_LOWER, _RAISE, _ADJUST);
528 }
529 return false;
530 case KC_ADJUST:
531 if (record->event.pressed) {
532 layer_on(_ADJUST);
533 } else {
534 layer_off(_ADJUST);
535 }
536 return false;
537 case KC_PRVWD:
538 if (record->event.pressed) {
539 if (keymap_config.swap_lctl_lgui) {
540 register_mods(mod_config(MOD_LALT));
541 register_code(KC_LEFT);
542 } else {
543 register_mods(mod_config(MOD_LCTL));
544 register_code(KC_LEFT);
545 }
546 } else {
547 if (keymap_config.swap_lctl_lgui) {
548 unregister_mods(mod_config(MOD_LALT));
549 unregister_code(KC_LEFT);
550 } else {
551 unregister_mods(mod_config(MOD_LCTL));
552 unregister_code(KC_LEFT);
553 }
554 }
555 break;
556 case KC_NXTWD:
557 if (record->event.pressed) {
558 if (keymap_config.swap_lctl_lgui) {
559 register_mods(mod_config(MOD_LALT));
560 register_code(KC_RIGHT);
561 } else {
562 register_mods(mod_config(MOD_LCTL));
563 register_code(KC_RIGHT);
564 }
565 } else {
566 if (keymap_config.swap_lctl_lgui) {
567 unregister_mods(mod_config(MOD_LALT));
568 unregister_code(KC_RIGHT);
569 } else {
570 unregister_mods(mod_config(MOD_LCTL));
571 unregister_code(KC_RIGHT);
572 }
573 }
574 break;
575 case KC_LSTRT:
576 if (record->event.pressed) {
577 if (keymap_config.swap_lctl_lgui) {
578 /* CMD-arrow on Mac, but we have CTL and GUI swapped */
579 register_mods(mod_config(MOD_LCTL));
580 register_code(KC_LEFT);
581 } else {
582 register_code(KC_HOME);
583 }
584 } else {
585 if (keymap_config.swap_lctl_lgui) {
586 unregister_mods(mod_config(MOD_LCTL));
587 unregister_code(KC_LEFT);
588 } else {
589 unregister_code(KC_HOME);
590 }
591 }
592 break;
593 case KC_LEND:
594 if (record->event.pressed) {
595 if (keymap_config.swap_lctl_lgui) {
596 /* CMD-arrow on Mac, but we have CTL and GUI swapped */
597 register_mods(mod_config(MOD_LCTL));
598 register_code(KC_RIGHT);
599 } else {
600 register_code(KC_END);
601 }
602 } else {
603 if (keymap_config.swap_lctl_lgui) {
604 unregister_mods(mod_config(MOD_LCTL));
605 unregister_code(KC_RIGHT);
606 } else {
607 unregister_code(KC_END);
608 }
609 }
610 break;
611 case KC_DLINE:
612 if (record->event.pressed) {
613 register_mods(mod_config(MOD_LCTL));
614 register_code(KC_BSPC);
615 } else {
616 unregister_mods(mod_config(MOD_LCTL));
617 unregister_code(KC_BSPC);
618 }
619 break;
620 case KC_COPY:
621 if (record->event.pressed) {
622 register_mods(mod_config(MOD_LCTL));
623 register_code(KC_C);
624 } else {
625 unregister_mods(mod_config(MOD_LCTL));
626 unregister_code(KC_C);
627 }
628 return false;
629 case KC_PASTE:
630 if (record->event.pressed) {
631 register_mods(mod_config(MOD_LCTL));
632 register_code(KC_V);
633 } else {
634 unregister_mods(mod_config(MOD_LCTL));
635 unregister_code(KC_V);
636 }
637 return false;
638 case KC_CUT:
639 if (record->event.pressed) {
640 register_mods(mod_config(MOD_LCTL));
641 register_code(KC_X);
642 } else {
643 unregister_mods(mod_config(MOD_LCTL));
644 unregister_code(KC_X);
645 }
646 return false;
647 break;
648 case KC_UNDO:
649 if (record->event.pressed) {
650 register_mods(mod_config(MOD_LCTL));
651 register_code(KC_Z);
652 } else {
653 unregister_mods(mod_config(MOD_LCTL));
654 unregister_code(KC_Z);
655 }
656 return false;
657
658 /* Smart Backspace Delete */
659
660 case KC_RSFT:
661 case KC_LSFT:
662 shift_held = record->event.pressed;
663 held_shift = keycode;
664 break;
665 case KC_BSPC_DEL:
666 if (record->event.pressed) {
667 if (shift_held) {
668 unregister_code(held_shift);
669 register_code(KC_DEL);
670 } else {
671 register_code(KC_BSPC);
672 }
673 } else {
674 unregister_code(KC_DEL);
675 unregister_code(KC_BSPC);
676 if (shift_held) {
677 register_code(held_shift);
678 }
679 }
680 return false;
681
682 /* LAYER */
683
684 case KC_LAYER:
685 if (record->event.pressed) {
686 if (shift_held) {
687 if (record->event.pressed) {
688 if (get_highest_layer(default_layer_state) == _QWERTY) {
689 set_single_persistent_default_layer(_GAMING);
690 } else if(get_highest_layer(default_layer_state) == _GAMING) {
691 set_single_persistent_default_layer(_QWERTY);
692 }
693 }
694 } else {
695 layer_on(_LOWER);
696 update_tri_layer(_LOWER, _RAISE, _ADJUST);
697 }
698 } else {
699 layer_off(_LOWER);
700 update_tri_layer(_LOWER, _RAISE, _ADJUST);
701 }
702 return false;
703
704 /* KEYBOARD PET STATUS START */
705
706 case KC_LCTL:
707 case KC_RCTL:
708 if (record->event.pressed) {
709 isSneaking = true;
710 } else {
711 isSneaking = false;
712 }
713 break;
714 case KC_SPC:
715 if (record->event.pressed) {
716 isJumping = true;
717 showedJump = false;
718 } else {
719 isJumping = false;
720 }
721 break;
722
723 /* KEYBOARD PET STATUS END */
724 }
725 return true;
726}
727
728#ifdef ENCODER_ENABLE
729
730void encoder_update_user(uint8_t index, bool clockwise) {
731 if (index == 0) {
732 if (clockwise) {
733 if(shift_held) {
734 tap_code(KC_MNXT);
735 } else {
736 tap_code(KC_RIGHT);
737 }
738 } else {
739 if(shift_held) {
740 tap_code(KC_MPRV);
741 } else {
742 tap_code(KC_LEFT);
743 }
744 }
745 } else if (index == 1) {
746 if (clockwise) {
747 if(shift_held) {
748 tap_code(KC_VOLU);
749 } else {
750 tap_code(KC_DOWN);
751 }
752 } else {
753 if(shift_held) {
754 tap_code(KC_VOLD);
755 } else {
756 tap_code(KC_UP);
757 }
758 }
759 }
760}
761
762#endif
diff --git a/keyboards/sofle/keymaps/helltm/readme.md b/keyboards/sofle/keymaps/helltm/readme.md
new file mode 100644
index 000000000..3034f740a
--- /dev/null
+++ b/keyboards/sofle/keymaps/helltm/readme.md
@@ -0,0 +1,32 @@
1[![Luna - The QMK Keyboard Pet](https://www.simonepellegrino.com/wp-content/uploads/2021/05/luna.jpg)](https://www.youtube.com/watch?v=HgIQRazCAjo)
2
3# Personal keymap for Sofle Keyboard rev1
4
5
6Features:
7
8- Modes for Qwerty and Games support. Games swaps enter and space to play FPS games and adds directional arrows.
9- Modified Qwerty layout to allow usage without hidden layers (for the most).
10- The OLED on master half shows selected OS, Layer and caps lock state.
11- The secondary display shows a logo and the wpm counter.
12- Left encoder controls arrow left/right. Right encoder arrow up/down.
13- Holding shift changes the encoders to next/previous and volup/voldown respectively.
14- Press the encoders to play/pause and mute.
15- Smart Backspace (shift + backspace to delete)
16- Single Layer button (press to Lower, shift + press to change mode)
17- **Features Luna, your keyboard pet!**
18
19#Luna, the keyboard pet
20
21Features:
22- Luna reacts to your wpm counter
23 - under 10 wpm she sits
24 - between 10 and 40 wpm she walks
25 - over 40 wpm she runs
26- She will move sneakily if you hold down Ctrl
27- Will bark at people on the internet if you activate Caps Lock!
28- Luna jumps every time you hit Space
29
30
31Learn how to adopt a keyboard pet here
32https://www.youtube.com/watch?v=HgIQRazCAjo
diff --git a/keyboards/sofle/keymaps/helltm/rules.mk b/keyboards/sofle/keymaps/helltm/rules.mk
new file mode 100644
index 000000000..9601ec40b
--- /dev/null
+++ b/keyboards/sofle/keymaps/helltm/rules.mk
@@ -0,0 +1,6 @@
1OLED_DRIVER_ENABLE = yes
2ENCODER_ENABLE = yes
3CONSOLE_ENABLE = yes
4EXTRAKEY_ENABLE = yes
5
6WPM_ENABLE = yes