aboutsummaryrefslogtreecommitdiff
path: root/keyboards/sofle
diff options
context:
space:
mode:
authorJeremy Scherer <jeremy@unifyimpact.com>2021-12-27 04:05:40 -0600
committerGitHub <noreply@github.com>2021-12-27 21:05:40 +1100
commitce0ca94600b94bafa132dacccc662615e8a9befe (patch)
treec9d26360a0763d56155d98f1498e0cad8051d3b5 /keyboards/sofle
parent24f33460a22cd09a68e7e1120bb6c5a605bb34c8 (diff)
downloadqmk_firmware-ce0ca94600b94bafa132dacccc662615e8a9befe.tar.gz
qmk_firmware-ce0ca94600b94bafa132dacccc662615e8a9befe.zip
New keymap for Sofle rev1 for Flare576 (#13723)
* feat(sofle): add flare576 keymap to sofle * feat(sofle): add flare576 keymap to sofle * luna on main * fix(flare576): Final layout for now * WIP * chore(graphics): file split * fix(oled): display issues Always show mode changes Remove unused variable * feat(marquee): Scrolling logo * fix(TG TO): Better layer swapping * feat(readme): Update for Flare576 keybinds * chore(license): add license * fix(logos): simplify loop/data * fix(logos): simplify loop/data * fix(logos): better quality * feat(size): remove unused layers, split images Remove Npad, media, add meta and FF14 Add flag (MAIN_BOARD) for main/secondary graphics Add Chocobo image * feat(size): remove unused layers, split images Remove Npad, media, rename game to esdf, add FF14 Add flag (MAIN_BOARD) for main/secondary graphics Add Chocobo image * fix(headers): PR feedback Rename to enums.h Fix defines Fix last commit (hanging refs) * chore(graphics): manage large strings better * fix(incremental): updating keymaps * fix(syms): Bracket idea * fix(esdf): Map (M) key to bottom right * PR Feedback RE: headers * docs(readme): old information updated * fix(licenses): add license info to new files
Diffstat (limited to 'keyboards/sofle')
-rw-r--r--keyboards/sofle/keymaps/flare576/config.h40
-rw-r--r--keyboards/sofle/keymaps/flare576/enums.h34
-rw-r--r--keyboards/sofle/keymaps/flare576/graphics.c290
-rw-r--r--keyboards/sofle/keymaps/flare576/graphics.h16
-rw-r--r--keyboards/sofle/keymaps/flare576/keymap.c196
-rw-r--r--keyboards/sofle/keymaps/flare576/logos.h96
-rw-r--r--keyboards/sofle/keymaps/flare576/readme.md22
-rw-r--r--keyboards/sofle/keymaps/flare576/rules.mk7
8 files changed, 701 insertions, 0 deletions
diff --git a/keyboards/sofle/keymaps/flare576/config.h b/keyboards/sofle/keymaps/flare576/config.h
new file mode 100644
index 000000000..c0f0a7d56
--- /dev/null
+++ b/keyboards/sofle/keymaps/flare576/config.h
@@ -0,0 +1,40 @@
1/* Copyright 2021 Flare576 <flare576@gmail.com>
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#pragma once
17#define MAIN_BOARD
18#define MASTER_RIGHT
19#define ENCODER_DIRECTION_FLIP
20#define OLED_TIMEOUT 10000
21
22#define MOUSEKEY_INTERVAL 16
23#define MOUSEKEY_DELAY 0
24#define MOUSEKEY_TIME_TO_MAX 60
25#define MOUSEKEY_MAX_SPEED 7
26#define MOUSEKEY_WHEEL_DELAY 0
27#define TAPPING_TERM_PER_KEY
28
29#ifdef ENCODER_RESOLUTION
30 #undef ENCODER_RESOLUTION
31#endif
32#define ENCODER_RESOLUTION 4
33
34#ifdef TAPPING_TERM
35 #undef TAPPING_TERM
36#endif
37#define TAPPING_TERM 200
38
39#undef MANUFACTURER
40#define MANUFACTURER Flare576
diff --git a/keyboards/sofle/keymaps/flare576/enums.h b/keyboards/sofle/keymaps/flare576/enums.h
new file mode 100644
index 000000000..7edcc1110
--- /dev/null
+++ b/keyboards/sofle/keymaps/flare576/enums.h
@@ -0,0 +1,34 @@
1/* Copyright 2021 Flare576 <flare576@gmail.com>
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#pragma once
17enum _layers {
18 /* _M_XYZ = Mac Os, _W_XYZ = Win/Linux */
19 _BASE,
20 _MOUS,
21 _SYMS,
22 _FF14,
23 _ESDF,
24};
25
26enum custom_keycodes {
27 _COMP1 = SAFE_RANGE,
28 _COMP2,
29};
30
31enum custom_tapdance {
32 TD_PLAY,
33 TD_HOME,
34};
diff --git a/keyboards/sofle/keymaps/flare576/graphics.c b/keyboards/sofle/keymaps/flare576/graphics.c
new file mode 100644
index 000000000..918334a50
--- /dev/null
+++ b/keyboards/sofle/keymaps/flare576/graphics.c
@@ -0,0 +1,290 @@
1/* Copyright 2021 Flare576 <flare576@gmail.com>
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#include QMK_KEYBOARD_H
17#include "enums.h"
18#include "logos.h"
19int current_wpm = -1; // Enable screen-on at startup
20bool isJumping = false;
21bool showedJump = true;
22
23#ifdef OLED_DRIVER_ENABLE
24
25#ifdef MAIN_BOARD
26static void render_logos(void){}
27void luna_jump(bool newJump){
28 isJumping = newJump;
29 if (newJump) {
30 showedJump = false;
31 }
32}
33
34// START Luna vars
35#define MIN_WALK_SPEED 10
36#define MIN_RUN_SPEED 40
37
38#define ANIM_FRAME_DURATION 200 // how long each frame lasts in ms
39#define ANIM_SIZE 96 // number of bytes in array, minimize for adequate firmware size, max is 1024
40
41uint32_t anim_timer = 0;
42uint8_t current_frame = 0;
43
44bool isSneaking = false;
45static void render_luna(int LUNA_X, int LUNA_Y) {
46
47 static const char PROGMEM sit[2][ANIM_SIZE] = {
48 // 'sit1', 32x22px
49 {
50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c,
51 0x02, 0x05, 0x02, 0x24, 0x04, 0x04, 0x02, 0xa9, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
52 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x68, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00,
53 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x82, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
54 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0c, 0x10, 0x10, 0x20, 0x20, 0x20, 0x28,
55 0x3e, 0x1c, 0x20, 0x20, 0x3e, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56 },
57
58 // 'sit2', 32x22px
59 {
60 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1c,
61 0x02, 0x05, 0x02, 0x24, 0x04, 0x04, 0x02, 0xa9, 0x1e, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x90, 0x08, 0x18, 0x60, 0x10, 0x08, 0x04, 0x03, 0x00, 0x00,
63 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0e, 0x82, 0x7c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
64 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x0c, 0x10, 0x10, 0x20, 0x20, 0x20, 0x28,
65 0x3e, 0x1c, 0x20, 0x20, 0x3e, 0x0f, 0x11, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
66 }
67 };
68
69 static const char PROGMEM walk[2][ANIM_SIZE] = {
70 // 'walk1', 32x22px
71 {
72 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x90, 0x90, 0x90, 0xa0, 0xc0, 0x80, 0x80,
73 0x80, 0x70, 0x08, 0x14, 0x08, 0x90, 0x10, 0x10, 0x08, 0xa4, 0x78, 0x80, 0x00, 0x00, 0x00, 0x00,
74 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x08, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
75 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x18, 0xea, 0x10, 0x0f, 0x00, 0x00, 0x00, 0x00,
76 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x20, 0x20, 0x3c, 0x0f, 0x11, 0x1f, 0x03,
77 0x06, 0x18, 0x20, 0x20, 0x3c, 0x0c, 0x12, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
78 },
79
80 // 'walk2', 32x22px
81 {
82 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x20, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00,
83 0x00, 0xe0, 0x10, 0x28, 0x10, 0x20, 0x20, 0x20, 0x10, 0x48, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
84 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x20, 0xf8, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
85 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x30, 0xd5, 0x20, 0x1f, 0x00, 0x00, 0x00, 0x00,
86 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x30, 0x0c, 0x02, 0x05, 0x09, 0x12, 0x1e,
87 0x02, 0x1c, 0x14, 0x08, 0x10, 0x20, 0x2c, 0x32, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
88 }
89 };
90
91 static const char PROGMEM run[2][ANIM_SIZE] = {
92 // 'run1', 32x22px
93 {
94 0x00, 0x00, 0x00, 0x00, 0xe0, 0x10, 0x08, 0x08, 0xc8, 0xb0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
95 0x80, 0x40, 0x40, 0x3c, 0x14, 0x04, 0x08, 0x90, 0x18, 0x04, 0x08, 0xb0, 0x40, 0x80, 0x00, 0x00,
96 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xc4, 0xa4, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
97 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc8, 0x58, 0x28, 0x2a, 0x10, 0x0f, 0x00, 0x00,
98 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x09, 0x04, 0x04, 0x04, 0x04, 0x02, 0x03, 0x02, 0x01, 0x01,
99 0x02, 0x02, 0x04, 0x08, 0x10, 0x26, 0x2b, 0x32, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
100 },
101
102 // 'run2', 32x22px
103 {
104 0x00, 0x00, 0x00, 0xe0, 0x10, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
105 0x80, 0x80, 0x78, 0x28, 0x08, 0x10, 0x20, 0x30, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00,
106 0x00, 0x00, 0x00, 0x03, 0x04, 0x08, 0x10, 0x11, 0xf9, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0xb0, 0x50, 0x55, 0x20, 0x1f, 0x00, 0x00,
108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0c, 0x10, 0x20, 0x28, 0x37,
109 0x02, 0x1e, 0x20, 0x20, 0x18, 0x0c, 0x14, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
110 }
111 };
112
113 static const char PROGMEM sneak[2][ANIM_SIZE] = {
114 // 'sneak1', 32x22px
115 {
116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00,
117 0x00, 0x00, 0xc0, 0x40, 0x40, 0x80, 0x00, 0x80, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
118 0x00, 0x00, 0x00, 0x00, 0x1e, 0x21, 0xf0, 0x04, 0x02, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02, 0x04,
119 0x04, 0x04, 0x03, 0x01, 0x00, 0x00, 0x09, 0x01, 0x80, 0x80, 0xab, 0x04, 0xf8, 0x00, 0x00, 0x00,
120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1c, 0x20, 0x20, 0x3c, 0x0f, 0x11, 0x1f, 0x02, 0x06,
121 0x18, 0x20, 0x20, 0x38, 0x08, 0x10, 0x18, 0x04, 0x04, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00,
122 },
123
124 // 'sneak2', 32x22px
125 {
126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
127 0x00, 0x00, 0xe0, 0xa0, 0x20, 0x40, 0x80, 0xc0, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
128 0x00, 0x00, 0x00, 0x00, 0x3e, 0x41, 0xf0, 0x04, 0x02, 0x02, 0x02, 0x03, 0x02, 0x02, 0x02, 0x04,
129 0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, 0x40, 0x55, 0x82, 0x7c, 0x00, 0x00, 0x00,
130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x20, 0x30, 0x0c, 0x02, 0x05, 0x09, 0x12, 0x1e, 0x04,
131 0x18, 0x10, 0x08, 0x10, 0x20, 0x28, 0x34, 0x06, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
132 }
133 };
134
135 // animation state
136 void animation_phase(void) {
137
138 if (isJumping || !showedJump) {
139
140 // clear
141 oled_set_cursor(LUNA_X,LUNA_Y +2);
142 oled_write(" ", false);
143
144 oled_set_cursor(LUNA_X,LUNA_Y -1);
145
146 showedJump = true;
147 } else {
148
149 // clear
150 oled_set_cursor(LUNA_X,LUNA_Y -1);
151 oled_write(" ", false);
152
153 oled_set_cursor(LUNA_X,LUNA_Y);
154 }
155
156 current_frame = (current_frame + 1) % 2;
157
158 if(isSneaking) {
159 oled_write_raw_P(sneak[abs(1 - current_frame)], ANIM_SIZE);
160
161 } else if(current_wpm <= MIN_WALK_SPEED) {
162 oled_write_raw_P(sit[abs(1 - current_frame)], ANIM_SIZE);
163
164 } else if(current_wpm <= MIN_RUN_SPEED) {
165 oled_write_raw_P(walk[abs(1 - current_frame)], ANIM_SIZE);
166
167 } else {
168 oled_write_raw_P(run[abs(1 - current_frame)], ANIM_SIZE);
169 }
170 }
171
172 // animation timer
173 if(timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) {
174 anim_timer = timer_read32();
175 animation_phase();
176 }
177
178}
179// END Luna vars
180
181
182static void main_board(void) {
183 int layer = get_highest_layer(layer_state);
184 isSneaking = false;
185 // Print current mode
186 oled_write_ln_P(PSTR("Flare"), false);
187 oled_write_ln_P(PSTR("Sofle"), false);
188 if (layer == _FF14) {
189 oled_write_raw_P(ffxiv, 16*8);
190 } else if (keymap_config.swap_lalt_lgui) {
191 oled_write_raw_P(windows, 16*8);
192 } else {
193 oled_write_raw_P(apple, 16*8);
194 }
195 oled_set_cursor(0, 9);
196
197 switch (layer) {
198 case _BASE:
199 oled_write_ln_P(PSTR("ALL"), false);
200 oled_write_P(PSTR(" YOUR"), false);
201 oled_write_ln_P(PSTR("BASE"), false);
202 break;
203 case _MOUS:
204 isSneaking = true;
205 oled_write_ln_P(PSTR("Mouse"), false);
206 break;
207 case _SYMS:
208 oled_write_ln_P(PSTR("@$*&#"), false);
209 break;
210 case _FF14:
211 oled_write_ln_P(PSTR("FFXIV"), false);
212 break;
213 case _ESDF:
214 oled_write_ln_P(PSTR("ESDF "), false);
215 break;
216 default:
217 oled_write_ln_P(PSTR("Undef"), false);
218 }
219 if (layer != _BASE) {
220 oled_write_P(PSTR("\n"), false);
221 }
222
223 // Don't re-write if not in use
224 if (current_wpm > 0) {
225 render_luna(0,13);
226 }
227}
228
229// End "MAIN_BOARD"
230#else
231static void main_board(void){}
232static void luna_jump(bool newJump){}
233
234#define MARQUEE_FRAME_DURATION 200 // how long each frame lasts in ms
235#define LOGO_BYTES 128
236#define LOGO_COUNT 7
237static const char *const secondary_logos[] = { js, apple, docker, python, qmk, brew, windows };
238#define MARQUEE_FRAMES (LOGO_COUNT * 4)
239#define MARQUEE_SIZE ( LOGO_COUNT * LOGO_BYTES)
240#define MARQUEE_SCROLL_UP true
241uint32_t marquee_timer = 0;
242uint32_t marquee_frame = 0;
243
244static void render_logos(void) {
245 void marquee_phase(void) {
246 marquee_frame = (marquee_frame + 1) % MARQUEE_FRAMES;
247 int marquee_start = MARQUEE_SIZE - (marquee_frame * 32);
248 static char output[MARQUEE_SIZE];
249 for (int i = 0; i < LOGO_COUNT; i++) {
250 for (int j = 0; j < LOGO_BYTES; j++) {
251 int pos = ( i * LOGO_BYTES + j + marquee_start ) % MARQUEE_SIZE;
252 output[pos] = pgm_read_byte_near(secondary_logos[i] + j);
253 }
254 }
255 oled_write_raw(output, MARQUEE_SIZE);
256 }
257
258 // animation timer
259 if(timer_elapsed32(marquee_timer) > MARQUEE_FRAME_DURATION) {
260 marquee_timer = timer_read32();
261 marquee_phase();
262 }
263}
264
265// End "MAIN_BOARD" false
266#endif
267
268oled_rotation_t oled_init_user(oled_rotation_t rotation) {
269 return OLED_ROTATION_270;
270}
271
272void oled_task_user(void) {
273 // Prevent blank screen on startup
274 if (current_wpm == -1) {
275 set_current_wpm(10);
276 }
277 current_wpm = get_current_wpm();
278 if (is_keyboard_master()) {
279 // can't gate main_board on wpm; won't get mode changes that don't trigger wpm
280 main_board();
281 } else if (current_wpm > 0) {
282 render_logos();
283 }
284}
285
286// End "OLED_DRIVER_ENABLE"
287#else
288static void luna_jump(bool newJump){}
289// End "OLED_DRIVER_ENABLE" false
290#endif
diff --git a/keyboards/sofle/keymaps/flare576/graphics.h b/keyboards/sofle/keymaps/flare576/graphics.h
new file mode 100644
index 000000000..3979ee43d
--- /dev/null
+++ b/keyboards/sofle/keymaps/flare576/graphics.h
@@ -0,0 +1,16 @@
1/* Copyright 2021 Flare576 <flare576@gmail.com>
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 */
16void luna_jump(bool newJump);
diff --git a/keyboards/sofle/keymaps/flare576/keymap.c b/keyboards/sofle/keymaps/flare576/keymap.c
new file mode 100644
index 000000000..68f611a1b
--- /dev/null
+++ b/keyboards/sofle/keymaps/flare576/keymap.c
@@ -0,0 +1,196 @@
1/* Copyright 2021 Flare576 <flare576@gmail.com>
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#include "print.h"
19#include "enums.h"
20#include "graphics.h"
21
22qk_tap_dance_action_t tap_dance_actions[] = {
23 [TD_PLAY] = ACTION_TAP_DANCE_DOUBLE(KC_MPLY, KC_MNXT),
24 [TD_HOME] = ACTION_TAP_DANCE_DOUBLE(KC_HOME, KC_END),
25};
26
27#define KC_TPLY TD(TD_PLAY)
28#define KC_THME TD(TD_HOME)
29
30const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
31/*
32 * BASE
33 * ,-----------------------------------------. ,-----------------------------------------.
34 * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - |
35 * |------+------+------+------+------+------| |------+------+------+------+------+------|
36 * |Alt/Tb| Q | W | E | R | T | | Y | U | I | O | P | \ |
37 * |------+------+------+------+------+------| |------+------+------+------+------+------|
38 * |LShift| A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
39 * |------+------+------+------+------+------| PLAY | | PAGE |------+------+------+------+------+------|
40 * |LCtrl | Z | X | C | V | B |-------| |-------| N | M | , | . | / |+/SHFT|
41 * `-----------------------------------------/ / \Enter \-----------------------------------------'
42 * | ESDF | LAlt | ESC/ | LGUI | /Space / \ or \ | Bspc | Alt+ |Delete|FFXIV |
43 * | | |Symbol| |/ / \Mouse \ | |Shift | | |
44 * `----------------------------------' '------''---------------------------'
45 *
46 * Note: Apple's keyboard settings don't seem to discern right- and left-ALT, so swapping keys there breaks TAB & META
47 */
48[_BASE] = LAYOUT(
49 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
50 RALT_T(KC_TAB), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
51 KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
52 KC_LCTRL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_TPLY, KC_THME, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RSFT_T(KC_PLUS),
53 TG(_ESDF), KC_LALT, LT(_SYMS,KC_ESC), KC_LGUI, KC_SPC, LT(_MOUS, KC_ENT), KC_BSPC, RSFT(KC_RALT), KC_DEL, TG(_FF14)
54),
55
56/*
57 * MOUS
58 * ,-----------------------------------------. ,-----------------------------------------.
59 * |CTRL+W|ALT+A | | | | | | | | | | | |
60 * |------+------+------+------+------+------| |------+------+------+------+------+------|
61 * | TRNS |PRNTSC| | M UP | HOME | PGUP | |M Wl U|M Wl D|M Wl L|M Wl R| |COMP1 |
62 * |------+------+------+------+------+------| |------+------+------+------+------+------|
63 * | TRNS |SC LCK|M LFT |M DWN |M RGHT| |-------. ,-------| UP | DOWN | LEFT |RIGHT | |COMP2 |
64 * |------+------+------+------+------+------| TRNS | | TRNS |------+------+------+------+------+------|
65 * | TRNS |PAUSE | | | END | PGDN |-------| |-------|MOUS1 |MOUS2 | | | | |
66 * `-----------------------------------------/ / \ \-----------------------------------------'
67 * | | TRNS | TRNS |TRNS | / TRNS / \ TRNS \ |MOUS3 |MOUS4 |MOUS5 | |
68 * | | | | |/ / \ \ | | | | |
69 * `----------------------------------' '------''---------------------------'
70 */
71[_MOUS] = LAYOUT(
72 LCTL(KC_W), LALT(KC_A), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
73 _______, KC_PSCR, XXXXXXX, KC_MS_U, KC_HOME, KC_PGUP, KC_WH_U, KC_WH_D, KC_WH_L, KC_WH_R, XXXXXXX, _COMP1,
74 _______, KC_SLCK, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX, _COMP2,
75 _______, KC_PAUS, XXXXXXX, XXXXXXX, KC_END, KC_PGDN, _______, _______, KC_BTN1, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
76 XXXXXXX, _______, _______, _______, _______, _______, KC_BTN3, KC_BTN4, KC_BTN5, XXXXXXX
77),
78
79/* SYMS
80 * ,-----------------------------------------. ,-----------------------------------------.
81 * | | F1 | F2 | F3 | F4 | F5 | | | | { | } | | RESET|
82 * |------+------+------+------+------+------| |------+------+------+------+------+------|
83 * | TRNS | F6 | F7 | F8 | F9 | F10 | | | | ( | ) | | |
84 * |------+------+------+------+------+------| |------+------+------+------+------+------|
85 * | TRNS | F11 | F12 | F13 | F14 | F15 |-------. ,-------| | | [ | ] | | |
86 * |------+------+------+------+------+------| TRNS | | TRNS |------+------+------+------+------+------|
87 | TRNS | UNDO | CUT | COPY |PASTE | F20 |-------| |-------| | | < | > | | |
88 * `-----------------------------------------/ / \ \-----------------------------------------'
89 * | TRNS | TRNS | TRNS | TRNS | / TRNS / \ TRNS \ | TRNS | TRNS | TRNS | TRNS |
90 * | | | | |/ / \ \ | | | | |
91 * `----------------------------------' '------''---------------------------'
92 */
93[_SYMS] = LAYOUT(
94 XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX, XXXXXXX, KC_LCBR, KC_RCBR, XXXXXXX, RESET,
95 _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, KC_LPRN, KC_RPRN, XXXXXXX, XXXXXXX,
96 _______, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, XXXXXXX, XXXXXXX, KC_LBRC, KC_RBRC, XXXXXXX, XXXXXXX,
97 _______, LGUI(KC_Z), LGUI(KC_X), LGUI(KC_C), LGUI(KC_V), KC_F20, _______, _______, XXXXXXX, XXXXXXX, KC_LT, KC_GT, XXXXXXX, XXXXXXX,
98 XXXXXXX, _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX
99),
100
101/* FF14
102 * ,-----------------------------------------. ,-----------------------------------------.
103 * | TRNS | TRNS | TRNS | TRNS | TRNS | TRNS | | TRNS | TRNS | TRNS | TRNS | TRNS | TRNS |
104 * |------+------+------+------+------+------| |------+------+------+------+------+------|
105 * | TAB | TRNS | TRNS | TRNS | TRNS | TRNS | | TRNS | TRNS | TRNS | TRNS | TRNS | TRNS |
106 * |------+------+------+------+------+------| |------+------+------+------+------+------|
107 * | TRNS | TRNS | TRNS | TRNS | TRNS | TRNS |-------. ,-------| TRNS | TRNS | TRNS | TRNS | TRNS | TRNS |
108 * |------+------+------+------+------+------| TRNS | | TRNS |------+------+------+------+------+------|
109 * | TRNS | TRNS | TRNS | TRNS | TRNS | TRNS |-------| |-------| TRNS | TRNS | TRNS | TRNS | TRNS | TRNS |
110 * `-----------------------------------------/ / \ \-----------------------------------------'
111 * | ESDF | | ESC | TRNS | / TRNS / \ TRNS \ | TRNS |PrntSc| TRNS | TRNS |
112 * | | | | |/ / \ \ | | | | |
113 * `----------------------------------' '------''---------------------------'
114 */
115[_FF14] = LAYOUT(
116 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
117 KC_TAB, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
118 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
119 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
120 TO(_ESDF), XXXXXXX, KC_ESC, _______, _______, _______, _______, KC_PSCR, _______, _______
121),
122
123/* ESDF
124 * ,-----------------------------------------. ,-----------------------------------------.
125 * | ~ | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | = |
126 * |------+------+------+------+------+------| |------+------+------+------+------+------|
127 * | T | Tab | Q | W | E | R | | Ctl-Y| Ctl-U| Ctl-I| Ctl-O| Ctl-P| PGUP |
128 * |------|------+------+------+------+------+ |------+------+------+------+------+------|
129 * | G |LShift| A | S | D | F |-------. ,-------| Ctl-H| Ctl-J| Ctl-K| Ctl-L| Ctl-;| PGDN |
130 * |------|------+------+------+------+------+ | | |------+------+------+------+------+------|
131 * | LCtrl| Z | X | C | V | B |-------| |-------| Ctl-N| Ctl-M| Ctl-,| Ctl-.| Ctl-/| M |
132 * `-----------------------------------------/ / \Enter \-----------------------------------------'
133 * | TRNS | | ESC | LAlt | /Space / \ \ |PrnScr| | | FF14 |
134 * | | | | |/ / \ \ | | | | |
135 * `----------------------------------' '------''---------------------------'
136 */
137[_ESDF] = LAYOUT(
138 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQL,
139 KC_T, KC_TAB, KC_Q, KC_W, KC_E, KC_R, RCTL(KC_Y), RCTL(KC_U), RCTL(KC_I), RCTL(KC_O), RCTL(KC_P), KC_PGUP,
140 KC_G, KC_LSFT, KC_A, KC_S, KC_D, KC_F, RCTL(KC_H), RCTL(KC_J), RCTL(KC_K), RCTL(KC_L), RCTL(KC_SCLN), KC_PGDN,
141 KC_LCTRL, KC_Z, KC_X, KC_C, KC_V, KC_B, _______, _______, RCTL(KC_N), RCTL(KC_M), RCTL(KC_COMM), RCTL(KC_DOT), RCTL(KC_SLSH), KC_M,
142 _______, XXXXXXX, _______, _______, _______, _______, _______, KC_PSCR, _______, TO(_FF14)
143)
144};
145
146bool process_record_user(uint16_t keycode, keyrecord_t *record) {
147 switch (keycode) {
148 case _COMP1:
149 if (record->event.pressed) {
150 // SEND_STRING(SS_TAP(X_RCTRL) SS_DELAY(100) SS_TAP(X_RCTRL) SS_DELAY(100) "1" SS_TAP(X_ENTER));
151 keymap_config.swap_lalt_lgui = false;
152 }
153 return false;
154 case _COMP2:
155 if (record->event.pressed) {
156 // SEND_STRING(SS_TAP(X_RCTRL) SS_DELAY(100) SS_TAP(X_RCTRL) SS_DELAY(100) "2" SS_TAP(X_ENTER));
157 keymap_config.swap_lalt_lgui = true;
158 }
159 return false;
160 case KC_SPC:
161 luna_jump(record->event.pressed);
162 break;
163 }
164 return true;
165}
166
167uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
168 switch (keycode) {
169 case KC_THME:
170 case KC_TPLY:
171 return TAPPING_TERM + 250;
172 default:
173 return TAPPING_TERM;
174 }
175}
176
177#ifdef ENCODER_ENABLE
178
179bool encoder_update_user(uint8_t index, bool clockwise) {
180 if (index == 0) {
181 if (clockwise) {
182 tap_code(KC_VOLD);
183 } else {
184 tap_code(KC_VOLU);
185 }
186 } else if (index == 1) {
187 if (clockwise) {
188 tap_code(KC_PGDOWN);
189 } else {
190 tap_code(KC_PGUP);
191 }
192 }
193 return true;
194}
195
196#endif
diff --git a/keyboards/sofle/keymaps/flare576/logos.h b/keyboards/sofle/keymaps/flare576/logos.h
new file mode 100644
index 000000000..18de1b3d5
--- /dev/null
+++ b/keyboards/sofle/keymaps/flare576/logos.h
@@ -0,0 +1,96 @@
1/* Copyright 2021 Flare576 <flare576@gmail.com>
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 */
16static const char PROGMEM ffxiv[] = {
17 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xf0, 0x00, 0xf0, 0xc0, 0xe0, 0x80, 0x00, 0x02,
18 0x0c, 0x2e, 0xfc, 0xfc, 0xfc, 0xfc, 0x78, 0x78, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
19 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x3f, 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf8,
20 0xf8, 0xf8, 0xf1, 0xff, 0xff, 0xff, 0xf8, 0xf0, 0xf0, 0xb0, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
21 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x7b, 0xdf, 0x1f, 0x3f, 0x3f,
22 0x1f, 0x1f, 0x3f, 0x5f, 0x9f, 0x8f, 0x07, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
23 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x06, 0x07, 0x0f, 0x1c, 0x74,
24 0x0c, 0x0d, 0x09, 0x09, 0x11, 0x01, 0x03, 0x03, 0x07, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
25};
26static const char PROGMEM windows[] = {
27 0x00, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0xf8,
28 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0x00,
29 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff,
30 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
31 0x00, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0xfe,
32 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0x00,
33 0x00, 0x07, 0x07, 0x07, 0x07, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1f, 0x1f, 0x00, 0x1f,
34 0x1f, 0x1f, 0x1f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x00
35};
36static const char PROGMEM apple[] = {
37 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
38 0xe0, 0x78, 0x7c, 0x7e, 0x3e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
39 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe,
40 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0x0e, 0x0c, 0x00, 0x00, 0x00, 0x00,
41 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
42 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00,
43 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0f, 0x3f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f,
44 0x7f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x3f, 0x1f, 0x07, 0x01, 0x00, 0x00, 0x00
45};
46const char PROGMEM docker[] = {
47 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
48 0x70, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49 0x00, 0x80, 0x80, 0xb0, 0xb0, 0xb0, 0x80, 0xb7, 0xb7, 0xb7, 0x80, 0xb7, 0xb7, 0xb7, 0x80, 0xb7,
50 0xb7, 0xb7, 0x80, 0xb0, 0xb0, 0xb0, 0x80, 0x80, 0xfe, 0xfe, 0xfc, 0xf0, 0xf0, 0xf0, 0x70, 0x00,
51 0x03, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
52 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x3f, 0x1f, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
53 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03,
54 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
55};
56static const char PROGMEM python[] = {
57 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x7e, 0x66, 0x66, 0x67, 0x7f, 0x7f, 0x7f,
58 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfc, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59 0xf0, 0xfc, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
60 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x3f, 0x9f, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfc, 0xf0,
61 0x0f, 0x3f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf9, 0xfc, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff,
62 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x3f, 0x0f,
63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x3f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff,
64 0xfe, 0xfe, 0xfe, 0xe6, 0x66, 0x66, 0x7e, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65};
66static const char PROGMEM js[] = {
67 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0xf0, 0xf8, 0x78, 0x7c, 0x3c, 0x1e, 0x9f,
68 0x9e, 0x1e, 0x3c, 0x3c, 0x78, 0xf8, 0xf0, 0xe0, 0xe0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00,
69 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x01, 0xf1, 0xf8, 0xfc, 0xfc, 0x06, 0x06, 0xff, 0x0f,
70 0x0f, 0x67, 0x67, 0xe6, 0xcc, 0x8c, 0xf8, 0xf9, 0x01, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
71 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x80, 0x1f, 0x3f, 0x3f, 0x3f, 0x00, 0x80, 0xff, 0xe3,
72 0xe2, 0xce, 0xce, 0x4c, 0x64, 0x20, 0x11, 0x9f, 0x80, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
73 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x0f, 0x1f, 0x1f, 0x3c, 0x3c, 0x78, 0x79,
74 0xf9, 0x78, 0x3c, 0x3c, 0x1e, 0x1f, 0x0f, 0x07, 0x07, 0x03, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00,
75};
76static const char PROGMEM qmk[] = {
77 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf0, 0xf0, 0xf0, 0xf8, 0xf0, 0xf0, 0xf8, 0xf8, 0xf0, 0xf0, 0xf8,
78 0xf8, 0xf0, 0xf0, 0xf8, 0xf8, 0xf0, 0xf0, 0xf8, 0xf0, 0xf0, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00,
79 0x00, 0x00, 0x00, 0x99, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00,
80 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x99, 0x00, 0x00, 0x00,
81 0x00, 0x00, 0x00, 0x99, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf8, 0xf1, 0xf3, 0xe3, 0xe7, 0x00,
82 0x00, 0xe7, 0xe3, 0xf3, 0xf1, 0xf8, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x99, 0x00, 0x00, 0x00,
83 0x00, 0x00, 0x00, 0x00, 0x07, 0x0f, 0x0f, 0x0f, 0x1f, 0x0f, 0x0f, 0x1f, 0x1f, 0x0f, 0x0f, 0x1f,
84 0x1f, 0x0f, 0x0f, 0x1f, 0x1f, 0x0f, 0x0f, 0x1f, 0x0f, 0x0f, 0x0f, 0x07, 0x00, 0x00, 0x00, 0x00,
85};
86static const char PROGMEM brew[] = {
87 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xe0, 0xe7, 0xff, 0xfe, 0xfc, 0xf8, 0xfe,
88 0xe4, 0xe0, 0xe0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xe7, 0x43, 0x41, 0x41, 0x4b, 0xcf, 0x87, 0x87, 0x8f,
90 0x87, 0x03, 0x03, 0xc3, 0x47, 0xe7, 0xa4, 0xb8, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92 0x01, 0x02, 0x02, 0x03, 0x00, 0xfe, 0x02, 0x02, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x40, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
94 0x80, 0x80, 0x80, 0xc0, 0x40, 0x7b, 0x0a, 0x0a, 0x0b, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
95};
96
diff --git a/keyboards/sofle/keymaps/flare576/readme.md b/keyboards/sofle/keymaps/flare576/readme.md
new file mode 100644
index 000000000..9f8ad5f24
--- /dev/null
+++ b/keyboards/sofle/keymaps/flare576/readme.md
@@ -0,0 +1,22 @@
1![Flare576 Keycaps](https://raw.githubusercontent.com/Flare576/sofle/main/images/keycaps.png)
2![Flare576 Chord Guide](https://raw.githubusercontent.com/Flare576/sofle/main/images/chords.png)
3
4# Flare576's keymap for Sofle Keyboard
5
6[Layout](http://www.keyboard-layout-editor.com/#/gists/fb8b42a6156458e20ca421a6f80cec48) and [Chord Mapping](http://www.keyboard-layout-editor.com/#/gists/884e3bc833cdf80fed9337ffee93a500) in Keyboard Layout Manager
7
8
9Features:
10
11- WASD -> ESDF Gaming layer
12- Mouse/Arrow Keys Layer with **amazing** rates
13- Tap/Hold keys for `=/+`/`SHIFT`, `TAB`/`ALT`
14- Bracket layer with Fn Keys
15- Right-hand primary OLED
16 * Mode logo
17 * Mode title
18 * Luna WPM indicator
19- Left-hand secondary OLED scrolling logo marquee
20- Left encoder controls volume up/down/mute. Right encoder PGUP/PGDOWN/Home.
21
22See [My Sofle Project](https://github.com/flare576/sofle) for more details
diff --git a/keyboards/sofle/keymaps/flare576/rules.mk b/keyboards/sofle/keymaps/flare576/rules.mk
new file mode 100644
index 000000000..a7505f538
--- /dev/null
+++ b/keyboards/sofle/keymaps/flare576/rules.mk
@@ -0,0 +1,7 @@
1MOUSEKEY_ENABLE = yes
2ENCODER_ENABLE = yes
3EXTRAKEY_ENABLE = yes
4TAP_DANCE_ENABLE = yes
5WPM_ENABLE = yes
6OLED_DRIVER_ENABLE = yes
7SRC += graphics.c