summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--keyboards/crkbd/keymaps/thunderbird2086/config.h97
-rw-r--r--keyboards/crkbd/keymaps/thunderbird2086/glcdfont.c238
-rw-r--r--keyboards/crkbd/keymaps/thunderbird2086/keycodes.h69
-rw-r--r--keyboards/crkbd/keymaps/thunderbird2086/keymap.c85
-rw-r--r--keyboards/crkbd/keymaps/thunderbird2086/layers_block.h89
-rw-r--r--keyboards/crkbd/keymaps/thunderbird2086/oled.c298
-rw-r--r--keyboards/crkbd/keymaps/thunderbird2086/process_records.c45
-rw-r--r--keyboards/crkbd/keymaps/thunderbird2086/readme.md65
-rw-r--r--keyboards/crkbd/keymaps/thunderbird2086/rules.mk18
-rw-r--r--keyboards/crkbd/keymaps/thunderbird2086/tap_dances.c12
-rw-r--r--keyboards/crkbd/keymaps/thunderbird2086/tap_dances.h16
11 files changed, 1032 insertions, 0 deletions
diff --git a/keyboards/crkbd/keymaps/thunderbird2086/config.h b/keyboards/crkbd/keymaps/thunderbird2086/config.h
new file mode 100644
index 0000000000..735caadaee
--- /dev/null
+++ b/keyboards/crkbd/keymaps/thunderbird2086/config.h
@@ -0,0 +1,97 @@
1// Copyright 2021 Allen Choi (@thunderbird2086)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#define EE_HANDS
7#define SPLIT_USB_DETECT
8
9// #define RGB_LAYER_ENABLE
10#undef USE_I2C
11#undef SSD1306OLED
12
13#define IGNORE_MOD_TAP_INTERRUPT
14#define PERMISSIVE_HOLD
15
16#if defined(TAPPING_TERM)
17# undef TAPPING_TERM
18#endif
19#define TAPPING_TERM 200
20
21#define NO_ACTION_ONESHOT
22
23#if defined(OLED_ENABLE)
24# define SPLIT_LAYER_STATE_ENABLE
25# define SPLIT_LED_STATE_ENABLE
26# define SPLIT_MODS_ENABLE
27# define SPLIT_OLED_ENABLE
28# define OLED_FONT_H "keyboards/crkbd/keymaps/thunderbird2086/glcdfont.c"
29# undef OLED_TIMEOUT
30 // due to timer_read() for render_prompt(), we have own implementation of oled time out
31# define OLED_KEY_TIMEOUT 30000
32# define KEY_LOG_ENABLE
33#endif
34
35#define RGBLIGHT_SLEEP
36
37#if defined(RGBLIGHT_ENABLE)
38# define RGBLIGHT_LIMIT_VAL 150
39# define RGBLIGHT_HUE_STEP 16
40# define RGBLIGHT_SAT_STEP 32
41# define RGBLIGHT_VAL_STEP 32
42
43# define RGBLIGHT_EFFECT_RAINBOW_MOOD
44# define RGBLIGHT_EFFECT_RAINBOW_SWIRL
45# define RGBLIGHT_EFFECT_KNIGHT
46#endif
47
48#if defined(RGB_MATRIX_ENABLE)
49# define RGB_MATRIX_KEYPRESSES // reacts to keypresses
50# define RGB_DISABLE_WHEN_USB_SUSPENDED // turn off effects when suspended
51# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 150
52 // limits maximum brightness of LEDs to 150 out of 255. Higher may cause the controller to crash.
53# define RGB_MATRIX_HUE_STEP 32
54# define RGB_MATRIX_SAT_STEP 64
55# define RGB_MATRIX_VAL_STEP 64
56# define RGB_MATRIX_SPD_STEP 20
57# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_SOLID_COLOR
58
59/* Disable the animations you don't want/need. You will need to disable a good number of these *
60 * because they take up a lot of space. Disable until you can successfully compile your firmware. */
61# undef ENABLE_RGB_MATRIX_ALPHAS_MODS
62# undef ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
63# define ENABLE_RGB_MATRIX_BREATHING
64# undef ENABLE_RGB_MATRIX_BAND_SAT
65# undef ENABLE_RGB_MATRIX_BAND_VAL
66# undef ENABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
67# undef ENABLE_RGB_MATRIX_BAND_PINWHEEL_VAL
68# undef ENABLE_RGB_MATRIX_BAND_SPIRAL_SAT
69# undef ENABLE_RGB_MATRIX_BAND_SPIRAL_VAL
70# define ENABLE_RGB_MATRIX_CYCLE_ALL
71# undef ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
72# undef ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
73# undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN
74# undef ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
75# define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
76# undef ENABLE_RGB_MATRIX_DUAL_BEACON
77# undef ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
78# undef ENABLE_RGB_MATRIX_CYCLE_SPIRAL
79# undef ENABLE_RGB_MATRIX_RAINBOW_BEACON
80# undef ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
81# undef ENABLE_RGB_MATRIX_RAINDROPS
82# undef ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
83# undef ENABLE_RGB_MATRIX_TYPING_HEATMAP
84# undef ENABLE_RGB_MATRIX_DIGITAL_RAIN
85# undef ENABLE_RGB_MATRIX_SOLID_REACTIVE
86# undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
87# undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
88# undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
89# undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
90# undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
91# define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
92# undef ENABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
93# define ENABLE_RGB_MATRIX_SPLASH
94# undef ENABLE_RGB_MATRIX_MULTISPLASH
95# undef ENABLE_RGB_MATRIX_SOLID_SPLASH
96# undef ENABLE_RGB_MATRIX_SOLID_MULTISPLASH
97#endif
diff --git a/keyboards/crkbd/keymaps/thunderbird2086/glcdfont.c b/keyboards/crkbd/keymaps/thunderbird2086/glcdfont.c
new file mode 100644
index 0000000000..97dc8fdaa3
--- /dev/null
+++ b/keyboards/crkbd/keymaps/thunderbird2086/glcdfont.c
@@ -0,0 +1,238 @@
1// Copyright 2021 Allen Choi (@thunderbird2086)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0.
5// See gfxfont.h for newer custom bitmap font info.
6// https://helixfonteditor.netlify.com/
7
8#include "progmem.h"
9
10// clang-format off
11// Standard ASCII 5x7 font
12static const unsigned char PROGMEM font[] = {
13 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
14 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00,
15 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00,
16 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00,
17 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00,
18 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00,
19 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00,
20 0x00, 0x18, 0x3C, 0x18, 0x00, 0x00,
21 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00,
22 0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
23 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
24 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
25 0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
26 0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
27 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
28 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
29 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
30 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
31 0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
32 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
33 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
34 0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
35 0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
36 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
37 0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
38 0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
39 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
40 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
41 0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
42 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
43 0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
44 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
45 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
46 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
47 0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
48 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
49 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
50 0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
51 0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
52 0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
53 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
54 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
55 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
56 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
57 0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
58 0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
59 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
60 0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
61 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
62 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
63 0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
64 0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
65 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
66 0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
67 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
68 0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
69 0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
70 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
71 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
72 0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
73 0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
74 0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
75 0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
76 0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
77 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
78 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
79 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
80 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
81 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
82 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
83 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
84 0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
85 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
86 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
87 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
88 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
89 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
90 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
91 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
92 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
93 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
94 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
95 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
96 0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
97 0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
98 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
99 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
100 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
101 0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
102 0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
103 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
104 0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
105 0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
106 0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
107 0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
108 0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
109 0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
110 0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
111 0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
112 0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
113 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
114 0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
115 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
116 0x18, 0x24, 0x24, 0x1C, 0x78, 0x00,
117 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
118 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
119 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
120 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
121 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
122 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
123 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
124 0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
125 0x7C, 0x18, 0x24, 0x24, 0x18, 0x00,
126 0x18, 0x24, 0x24, 0x18, 0x7C, 0x00,
127 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
128 0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
129 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
130 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
131 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
132 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
133 0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
134 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00,
135 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
136 0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
137 0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
138 0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
139 0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
140 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
141 0x00, 0x00, 0x00, 0x20, 0x20, 0xF8,
142 0x0C, 0x04, 0xE7, 0xE4, 0xE4, 0x07,
143 0x04, 0xE4, 0xE7, 0xE4, 0x04, 0x07,
144 0xE4, 0xE4, 0xE7, 0x04, 0x0C, 0xF8,
145 0x20, 0x20, 0x00, 0x00, 0x00, 0x00,
146 0x80, 0x80, 0x40, 0x40, 0x20, 0x20,
147 0x10, 0x10, 0x08, 0x08, 0x10, 0x10,
148 0x20, 0x20, 0x40, 0x40, 0x80, 0x80,
149 0x80, 0x80, 0xC0, 0xC0, 0xE0, 0xE0,
150 0xF0, 0xF0, 0xF8, 0xF8, 0xF0, 0xF0,
151 0xE0, 0xE0, 0xC0, 0xC0, 0x80, 0x80,
152 0x80, 0x80, 0x40, 0x40, 0x20, 0x20,
153 0x10, 0x10, 0x08, 0x08, 0x10, 0x10,
154 0x20, 0x20, 0x40, 0x40, 0x80, 0x80,
155 0x80, 0x80, 0x40, 0xC0, 0x60, 0xA0,
156 0x50, 0xB0, 0x58, 0xA8, 0x50, 0xB0,
157 0x60, 0xA0, 0x40, 0xC0, 0x80, 0x80,
158 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
159 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30,
160 0x00, 0x77, 0x55, 0x7F, 0x14, 0x7F,
161 0x55, 0x77, 0x00, 0x00, 0x00, 0x00,
162 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
163 0x00, 0x00, 0x08, 0x00, 0x00, 0x60,
164 0x70, 0x3E, 0x1F, 0x19, 0x18, 0x0C,
165 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
166 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
167 0x00, 0x00, 0x08, 0x08, 0x08, 0x00,
168 0x00, 0x08, 0x08, 0x08, 0x00, 0x1C,
169 0x22, 0x41, 0x41, 0x41, 0x22, 0x1C,
170 0x00, 0x08, 0x08, 0x08, 0x00, 0x00,
171 0x08, 0x08, 0x08, 0x00, 0x00, 0x00,
172 0x08, 0x0C, 0x5E, 0x5F, 0x5E, 0x0C,
173 0x00, 0x00, 0x00, 0x49, 0x49, 0xFF,
174 0x00, 0x00, 0x0F, 0x1F, 0x3F, 0x38,
175 0x30, 0xFF, 0xFF, 0xFF, 0x30, 0x38,
176 0x3F, 0x1F, 0x0F, 0x00, 0x00, 0xFF,
177 0x49, 0x49, 0x00, 0x00, 0x00, 0x00,
178 0x88, 0x88, 0x5D, 0x5D, 0x3E, 0x3E,
179 0x7C, 0x7C, 0xF8, 0xF8, 0x7C, 0x7C,
180 0x3E, 0x3E, 0x5D, 0x5D, 0x88, 0x88,
181 0x88, 0x88, 0x55, 0x55, 0x23, 0x23,
182 0x47, 0x47, 0x8F, 0x8F, 0x47, 0x47,
183 0x23, 0x23, 0x55, 0x55, 0x88, 0x88,
184 0x88, 0x88, 0xD5, 0xD5, 0xE2, 0xE2,
185 0xC4, 0xC4, 0x88, 0x88, 0xC4, 0xC4,
186 0xE2, 0xE2, 0xD5, 0xD5, 0x88, 0x88,
187 0x88, 0x88, 0x5D, 0xD5, 0x6B, 0xB6,
188 0x6D, 0xD6, 0xAD, 0xDA, 0x6D, 0xD6,
189 0x6B, 0xB6, 0x5D, 0xD5, 0x88, 0x88,
190 0x00, 0x00, 0x00, 0x06, 0x06, 0x06,
191 0x0C, 0x18, 0x30, 0x66, 0x66, 0x66,
192 0x08, 0x0C, 0x7E, 0x7F, 0x7E, 0x0C,
193 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
194 0xF0, 0x90, 0x90, 0xF0, 0x90, 0x90,
195 0xF0, 0x98, 0x9C, 0xF2, 0x22, 0x21,
196 0xE1, 0x01, 0x01, 0x01, 0xF1, 0x91,
197 0x91, 0xFA, 0x4C, 0x4C, 0xF8, 0x48,
198 0x48, 0xF8, 0x48, 0x48, 0xF8, 0x00,
199 0x00, 0x00, 0x1C, 0x22, 0x41, 0x00,
200 0x00, 0x1C, 0x22, 0x00, 0x00, 0x1C,
201 0x3E, 0x7F, 0x63, 0x41, 0x22, 0x1C,
202 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
203 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
204 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
205 0x00, 0x00, 0x00, 0x02, 0x02, 0x0F,
206 0x18, 0x10, 0x70, 0x10, 0x10, 0x70,
207 0x10, 0x13, 0x73, 0x13, 0x10, 0x70,
208 0x10, 0x10, 0x70, 0x10, 0x18, 0x0F,
209 0x02, 0x02, 0x00, 0x00, 0x00, 0x00,
210 0x00, 0x00, 0x01, 0x01, 0x02, 0x02,
211 0x04, 0x04, 0x08, 0x08, 0x04, 0x04,
212 0x02, 0x02, 0x01, 0x01, 0x00, 0x00,
213 0x00, 0x00, 0x01, 0x01, 0x02, 0x02,
214 0x04, 0x04, 0x08, 0x08, 0x04, 0x04,
215 0x02, 0x02, 0x01, 0x01, 0x00, 0x00,
216 0x00, 0x00, 0x01, 0x01, 0x03, 0x03,
217 0x07, 0x07, 0x0F, 0x0F, 0x07, 0x07,
218 0x03, 0x03, 0x01, 0x01, 0x00, 0x00,
219 0x00, 0x00, 0x01, 0x01, 0x03, 0x02,
220 0x05, 0x06, 0x0D, 0x0A, 0x05, 0x06,
221 0x03, 0x02, 0x01, 0x01, 0x00, 0x00,
222 0x00, 0x00, 0x1C, 0x22, 0xC9, 0xD1,
223 0xC9, 0x22, 0x1C, 0x00, 0x00, 0x00,
224 0x00, 0x10, 0x02, 0x39, 0xFC, 0xED,
225 0xFC, 0x38, 0x02, 0x10, 0x00, 0x00,
226 0x07, 0x04, 0x04, 0x07, 0x04, 0x04,
227 0x07, 0x04, 0x04, 0x0F, 0x09, 0x09,
228 0x0F, 0x00, 0x00, 0x00, 0x07, 0x04,
229 0x04, 0x07, 0x02, 0x02, 0x03, 0x02,
230 0x02, 0x03, 0x02, 0x02, 0x03, 0x00,
231 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
232 0x00, 0x00, 0x08, 0x00, 0x00, 0x1C,
233 0x22, 0x41, 0x63, 0x7F, 0x3E, 0x1C,
234 0x00, 0x00, 0x22, 0x1C, 0x00, 0x00,
235 0x41, 0x22, 0x1C, 0x00, 0x00, 0x00,
236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237};
238// clang-format on
diff --git a/keyboards/crkbd/keymaps/thunderbird2086/keycodes.h b/keyboards/crkbd/keymaps/thunderbird2086/keycodes.h
new file mode 100644
index 0000000000..cb10a3ac07
--- /dev/null
+++ b/keyboards/crkbd/keymaps/thunderbird2086/keycodes.h
@@ -0,0 +1,69 @@
1// Copyright 2021 Allen Choi (@thunderbird2086)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6enum custom_keycodes {
7 // Layer Macros
8 COLEMAK = SAFE_RANGE,
9 QWERTY,
10 FUNCTION,
11 CODE,
12 ADJUST,
13 RGBRST,
14 // Secret Macros
15 M_XXX1,
16 M_XXX2,
17 M_XXX3,
18 M_XXX4,
19 M_XXX5,
20};
21
22
23enum layers {
24 _COLEMAK,
25 _QWERTY,
26 _FUNCTION,
27 _CODE,
28 _ADJUST,
29 _SECRET,
30};
31
32// Shortcut Keys
33#define K_BACK LGUI(KC_LBRC) // browser back
34#define K_FWRD LGUI(KC_RBRC) // browser forward
35#define K_LOCK LGUI(LCTL(KC_Q)) // Lock screen
36#define K_CSCN LGUI(LCTL(LSFT(KC_4))) // Copy a portion of the screen to the clipboard
37#define K_MDSH LSFT(LALT(KC_MINS))
38
39// Layer Keys
40#define FCT_BSP LT(_FUNCTION, KC_BSPC)
41#define FCT_DEL LT(_FUNCTION, KC_DEL)
42
43#define FCT_ENT LT(_FUNCTION, KC_ENT)
44#define RAI_ENT LT(_CODE , KC_ENT)
45
46#define FCT_EQL LT(_FUNCTION, KC_EQL)
47#define RAI_EQL LT(_CODE , KC_EQL)
48
49#define FCT_SPC LT(_FUNCTION, KC_SPC)
50#define RAI_SPC LT(_CODE , KC_SPC)
51
52#define FCT_TAB LT(_FUNCTION, KC_TAB)
53
54#define ADJ_EQL LT(_ADJUST, KC_EQL)
55#define ADJ_GRV LT(_ADJUST, KC_GRV)
56
57// Mod-Tap Keys
58#define SFT_SLSH MT(MOD_RSFT, KC_SLSH)
59#define SFT_Z MT(MOD_LSFT, KC_Z)
60
61#define CTL_QUOT MT(MOD_RCTL, KC_QUOT)
62#define CTL_SCLN MT(MOD_RCTL, KC_SCLN)
63#define CTL_A MT(MOD_LCTL, KC_A)
64#define CTL_O MT(MOD_LCTL, KC_O)
65
66#define M_LOPT_F MT(MOD_LALT, KC_F)
67#define M_LOPT_T MT(MOD_LALT, KC_T)
68#define RCMD_J MT(MOD_LGUI, KC_J)
69#define RCMD_N MT(MOD_RGUI, KC_N)
diff --git a/keyboards/crkbd/keymaps/thunderbird2086/keymap.c b/keyboards/crkbd/keymaps/thunderbird2086/keymap.c
new file mode 100644
index 0000000000..7bc23db8aa
--- /dev/null
+++ b/keyboards/crkbd/keymaps/thunderbird2086/keymap.c
@@ -0,0 +1,85 @@
1// Copyright 2021 Allen Choi (@thunderbird2086)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include QMK_KEYBOARD_H
5#include "layers_block.h"
6
7// clang-format off
8const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
9 [_COLEMAK] = LAYOUT_wrapper(
10 // +---------+---------+---------+---------+---------+---------+ +---------+---------+---------+---------+---------+---------+
11 T_TAB , ___________________COLEMAK_DH_L1_______________ , ___________________COLEMAK_DH_R1_______________ , KC_MINS ,
12 // |---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------|
13 KC_LCTL , ___________________COLEMAK_DH_L2_______________ , ___________________COLEMAK_DH_R2_______________ , CTL_QUOT,
14 // |---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------|
15 KC_LSFT , ___________________COLEMAK_DH_L3_______________ , ___________________COLEMAK_DH_R3_______________ , ADJ_EQL ,
16 // +---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------+
17 _________MOD_LEFT__________ , _________MOD_RIGHT_________
18 // \----------------------------/ \-----------------------------/
19 ),
20
21 [_QWERTY] = LAYOUT_wrapper(
22 // +---------+---------+---------+---------+---------+---------+ +---------+---------+---------+---------+---------+---------+
23 T_TAB , ___________________QWERTY_L1___________________ , ___________________QWERTY_R1___________________ , KC_MINS ,
24 // |---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------|
25 KC_LCTL , ___________________QWERTY_L2___________________ , ___________________QWERTY_R2___________________ , CTL_QUOT,
26 // |---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------|
27 KC_LSFT , ___________________QWERTY_L3___________________ , ___________________QWERTY_R3___________________ , ADJ_EQL ,
28 // +---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------+
29 _________MOD_LEFT__________ , _________MOD_RIGHT_________
30 // \----------------------------/ \-----------------------------/
31 ),
32
33 [_FUNCTION] = LAYOUT_wrapper(
34 // +---------+---------+---------+---------+---------+---------+ +---------+---------+---------+---------+---------+---------+
35 KC_ESC , ___________________FUNC_LEFT___________________ , ___________________FUNC_RIGHT__________________ , KC_F11 ,
36 // |---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------|
37 K_CSCN , ____________________MEDIA_1____________________ , KC_DEL , _______________NAV_1_________________ , KC_F12 ,
38 // |---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------|
39 _______ , ____________________MEDIA_2____________________ , KC_INS , _______________NAV_2_________________ , K_LOCK ,
40 // +---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------+
41 _______MOD_TRNS_LEFT_______ , _______MOD_TRNS_RIGHT______
42 // \----------------------------/ \-----------------------------/
43 ),
44
45 [_CODE] = LAYOUT_wrapper(
46 // +---------+---------+---------+---------+---------+---------+ +---------+---------+---------+---------+---------+---------+
47 T_GRV , ___________________NUM_LEFT____________________ , ___________________NUM_RIGHT___________________ , KC_BSLS ,
48 // |---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------|
49 ________________________SYMBOL_L1________________________ , ________________________SYMBOL_R1________________________ ,
50 // |---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------|
51 ________________________SYMBOL_L2________________________ , ________________________SYMBOL_R2________________________ ,
52 // +---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------+
53 _______MOD_TRNS_LEFT_______ , _______MOD_TRNS_RIGHT______
54 // \----------------------------/ \-----------------------------/
55 ),
56
57 [_ADJUST] = LAYOUT_wrapper(
58 // +---------+---------+---------+---------+---------+---------+ +---------+---------+---------+---------+---------+---------+
59 ________________________ADJUST_L1________________________ , ________________________ADJUST_R1________________________ ,
60 // |---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------|
61 ________________________ADJUST_L2________________________ , ________________________ADJUST_R2________________________ ,
62 // |---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------|
63 ________________________ADJUST_L3________________________ , ________________________ADJUST_R3________________________ ,
64 // +---------+---------+---------+---------+---------+---------+ +---------+---------+---------+---------+---------+---------+
65 _______ , _______ , _______ , _______ , _______ , _______
66 // \----------------------------/ \-----------------------------/
67 ),
68
69 [_SECRET] = LAYOUT_wrapper(
70 // +---------+---------+---------+---------+---------+---------+ +---------+---------+---------+---------+---------+---------+
71 ________________________SECRET_L1________________________ , ________________________SECRET_R1________________________ ,
72 // |---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------|
73 ________________________SECRET_L2________________________ , ________________________SECRET_R2________________________ ,
74 // |---------+---------+---------+---------+---------+---------| |---------+---------+---------+---------+---------+---------|
75 ________________________SECRET_L3________________________ , ________________________SECRET_R3________________________ ,
76 // +---------+---------+---------+---------+---------+---------+ +---------+---------+---------+---------+---------+---------+
77 XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
78 // \----------------------------/ \-----------------------------/
79 )
80};
81// clang-format off
82
83layer_state_t layer_state_set_user(layer_state_t state) {
84 return update_tri_layer_state(state, _FUNCTION, _ADJUST, _SECRET);
85}
diff --git a/keyboards/crkbd/keymaps/thunderbird2086/layers_block.h b/keyboards/crkbd/keymaps/thunderbird2086/layers_block.h
new file mode 100644
index 0000000000..03d438306e
--- /dev/null
+++ b/keyboards/crkbd/keymaps/thunderbird2086/layers_block.h
@@ -0,0 +1,89 @@
1// Copyright 2021 Allen Choi (@thunderbird2086)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include "keycodes.h"
7#include "tap_dances.h"
8
9// Layout blocks
10#define ___________________COLEMAK_DH_L1_______________ KC_Q , KC_W , KC_F , KC_P , KC_B
11#define ___________________COLEMAK_DH_L2_______________ CTL_A , KC_R , KC_S , M_LOPT_T, KC_G
12#define ___________________COLEMAK_DH_L3_______________ SFT_Z , KC_X , KC_C , KC_D , KC_V
13
14#define ___________________COLEMAK_DH_R1_______________ KC_J , KC_L , KC_U , KC_Y , KC_SCLN
15#define ___________________COLEMAK_DH_R2_______________ KC_M , RCMD_N , KC_E , KC_I , CTL_O
16#define ___________________COLEMAK_DH_R3_______________ KC_K , KC_H , KC_COMM , KC_DOT , SFT_SLSH
17
18#define ___________________QWERTY_L1___________________ KC_Q , KC_W , KC_E , KC_R , KC_T
19#define ___________________QWERTY_L2___________________ CTL_A , KC_S , KC_D , M_LOPT_F, KC_G
20#define ___________________QWERTY_L3___________________ SFT_Z , KC_X , KC_C , KC_V , KC_B
21
22#define ___________________QWERTY_R1___________________ KC_Y , KC_U , KC_I , KC_O , KC_P
23#define ___________________QWERTY_R2___________________ KC_H , RCMD_J , KC_K , KC_L , CTL_SCLN
24#define ___________________QWERTY_R3___________________ KC_N , KC_M , KC_COMM , KC_DOT , SFT_SLSH
25
26#define ___________________COLEMAK_L1__________________ KC_Q , KC_W , KC_F , KC_P , KC_G
27#define ___________________COLEMAK_L2__________________ CTL_A , KC_R , KC_S , M_LOPT_T, KC_D
28#define ___________________COLEMAK_L3__________________ SFT_Z , KC_X , KC_C , KC_V , KC_B
29
30#define ___________________COLEMAK_R1__________________ KC_J , KC_L , KC_U , KC_Y , KC_SCLN
31#define ___________________COLEMAK_R2__________________ KC_H , RCMD_N , KC_E , KC_I , CTL_O
32#define ___________________COLEMAK_R3__________________ KC_K , KC_M , KC_COMM , KC_DOT , SFT_SLSH
33
34#define ___________________NUM_LEFT____________________ KC_1 , KC_2 , KC_3 , KC_4 , KC_5
35#define ___________________NUM_RIGHT___________________ KC_6 , KC_7 , KC_8 , KC_9 , KC_0
36
37#define ___________________FUNC_LEFT___________________ KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5
38#define ___________________FUNC_RIGHT__________________ KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10
39
40#define ________________________SYMBOL_L1________________________ KC_TILD , KC_EXLM , KC_AT , KC_HASH , KC_DLR , KC_PERC
41#define ________________________SYMBOL_L2________________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
42
43#define ________________________SYMBOL_R1________________________ KC_CIRC , KC_AMPR , KC_ASTR , KC_LPRN , KC_RPRN , KC_PIPE
44#define ________________________SYMBOL_R2________________________ XXXXXXX , KC_LCBR , KC_RCBR , KC_LBRC , KC_RBRC , KC_PLUS
45
46
47#define ________________________ADJUST_L1________________________ RESET , XXXXXXX , KC_PWR , KC_WAKE , KC_SLEP , XXXXXXX
48
49#if defined(RGB_MATRIX_ENABLE) || defined(RGBLIGHT_ENABLE)
50# define ________________________ADJUST_L2________________________ RGBRST , XXXXXXX , RGB_SPI , RGB_SAI , RGB_HUI , RGB_VAI
51# define ________________________ADJUST_L3________________________ EEP_RST , XXXXXXX , RGB_SPD , RGB_SAD , RGB_HUD , RGB_VAD
52#else
53# define ________________________ADJUST_L2________________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
54# define ________________________ADJUST_L3________________________ EEP_RST , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
55#endif
56
57#if defined(RGB_MATRIX_ENABLE) || defined(RGBLIGHT_ENABLE)
58# define ________________________ADJUST_R1________________________ RGB_TOG , XXXXXXX , XXXXXXX , XXXXXXX , COLEMAK , QWERTY
59# define ________________________ADJUST_R3________________________ RGB_MOD , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
60#else
61# define ________________________ADJUST_R1________________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , COLEMAK , QWERTY
62# define ________________________ADJUST_R3________________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
63#endif
64#define ________________________ADJUST_R2________________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
65
66#define ________________________SECRET_L1________________________ M_XXX1 , XXXXXXX , M_XXX3 , XXXXXXX , M_XXX5 , XXXXXXX
67#define ________________________SECRET_L2________________________ XXXXXXX , M_XXX2 , XXXXXXX , M_XXX4 , XXXXXXX , XXXXXXX
68#define ________________________SECRET_L3________________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
69
70#define ________________________SECRET_R1________________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
71#define ________________________SECRET_R2________________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
72#define ________________________SECRET_R3________________________ XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
73
74#define _______________NAV_1_________________ KC_LEFT , KC_UP , KC_RGHT , KC_PGUP
75#define _______________NAV_2_________________ KC_HOME , KC_DOWN , KC_END , KC_PGDN
76
77#define _______________MOUSE_1_______________ KC_BTN1 , KC_MS_U , KC_BTN2 , KC_WH_D
78#define _______________MOUSE_2_______________ KC_MS_L , KC_MS_D , KC_MS_R , KC_WH_U
79
80#define ____________________MEDIA_1____________________ KC_BRMU , KC_MFFD , KC_MPLY , KC_VOLU , K_BACK
81#define ____________________MEDIA_2____________________ KC_BRMD , KC_MRWD , KC_MUTE , KC_VOLD , K_FWRD
82
83#define _________MOD_LEFT__________ T_GUI , FCT_DEL , RAI_SPC
84#define _________MOD_RIGHT_________ RAI_ENT , FCT_BSP , KC_ROPT
85#define _______MOD_TRNS_LEFT_______ KC_TRNS , T_ESC , XXXXXXX
86#define _______MOD_TRNS_RIGHT______ XXXXXXX , T_ESC , KC_TRNS
87
88// Layout wrappers
89#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
diff --git a/keyboards/crkbd/keymaps/thunderbird2086/oled.c b/keyboards/crkbd/keymaps/thunderbird2086/oled.c
new file mode 100644
index 0000000000..bee9bc26de
--- /dev/null
+++ b/keyboards/crkbd/keymaps/thunderbird2086/oled.c
@@ -0,0 +1,298 @@
1// Copyright 2021 Allen Choi (@thunderbird2086)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include QMK_KEYBOARD_H
5#include "keycodes.h"
6
7
8// 5x3 Logos
9void render_qmk_logo(void) {
10 static const char PROGMEM font_qmk_logo[16] = {
11 0x80, 0x81, 0x82, 0x83, 0x84,
12 0xa0, 0xa1, 0xa2, 0xa3, 0xa4,
13 0xc0, 0xc1, 0xc2, 0xc3, 0xc4,
14 0
15 };
16 oled_write_P(font_qmk_logo, false);
17};
18
19// 5x2 Keyboard, Controller logos
20void render_kb_split(void) {
21 static const char PROGMEM font_kb_split[11] = {
22 0xb5, 0xb6, 0xb7, 0xb8, 0xb9,
23 0xd5, 0xd6, 0xd7, 0xd8, 0xd9,
24 0
25 };
26 oled_write_P(font_kb_split, false);
27};
28
29// 5x1 Layer indicator
30
31void render_layer(void) {
32 static const char PROGMEM font_layer[4][6] = {
33 {0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0},
34 {0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0},
35 {0xda, 0xdb, 0xdc, 0xdd, 0xde, 0},
36 {0x95, 0x96, 0x97, 0x98, 0x99, 0},
37 };
38
39 uint8_t layer = 0;
40 if (layer_state_is(_FUNCTION)) {
41 layer = 1;
42 } else if (layer_state_is(_CODE)) {
43 layer = 2;
44 } else if (layer_state_is(_ADJUST)) {
45 layer = 3;
46 }
47 oled_write_P(font_layer[layer], false);
48};
49
50
51void render_layers(void) {
52 static const char PROGMEM font_layers[4][16] = {
53 {0x20, 0x85, 0x86, 0x87, 0x20,
54 0x20, 0xa5, 0xa6, 0xa7, 0x20,
55 0x20, 0xc5, 0xc6, 0xc7, 0x20,
56 0},
57 {0x20, 0x88, 0x89, 0x8a, 0x20,
58 0x20, 0xa8, 0xa9, 0xaa, 0x20,
59 0x20, 0xc8, 0xc9, 0xca, 0x20,
60 0},
61 {0x20, 0x8b, 0x8c, 0x8d, 0x20,
62 0x20, 0xab, 0xac, 0xad, 0x20,
63 0x20, 0xcb, 0xcc, 0xcd, 0x20,
64 0},
65 {0x20, 0x8e, 0x8f, 0x90, 0x20,
66 0x20, 0xae, 0xaf, 0xb0, 0x20,
67 0x20, 0xce, 0xcf, 0xd0, 0x20,
68 0},
69 };
70
71 uint8_t layer = 0;
72 if (layer_state_is(_FUNCTION)) {
73 layer = 1;
74 } else if (layer_state_is(_CODE)) {
75 layer = 2;
76 } else if (layer_state_is(_ADJUST)) {
77 layer = 3;
78 }
79 oled_write_P(font_layers[layer], false);
80};
81
82#if defined(RGB_MATRIX_ENABLE) || defined(RGBLIGHT_ENABLE)
83
84void render_rgb_status(void) {
85 static const char PROGMEM font_rgb_off[3] = {0xd1, 0xd2, 0};
86 static const char PROGMEM font_rgb_on[3] = {0xd3, 0xd4, 0};
87 bool rgb_enabled =
88# if defined(RGBLIGHT_ENABLE)
89 rgblight_is_enabled();
90# elif defined(RGB_MATRIX_ENABLE)
91 rgb_matrix_is_enabled();
92# endif
93
94 oled_write_P(rgb_enabled ? font_rgb_on : font_rgb_off, false);
95};
96#endif
97
98// 2x1 Ctrl, Alt, Shift, GUI, Caps
99
100void render_mod_ctrl(void) {
101 static const char PROGMEM font_ctrl[3] = {0x91, 0x92, 0};
102 oled_write_P(font_ctrl, false);
103};
104
105void render_mod_alt(void) {
106 static const char PROGMEM font_alt[3] = {0xb1, 0xb2, 0};
107 oled_write_P(font_alt, false);
108};
109
110void render_mod_shift(void) {
111 static const char PROGMEM font_shift[3] = {0xb3, 0xb4, 0};
112 oled_write_P(font_shift, false);
113};
114
115void render_mod_gui(void) {
116 static const char PROGMEM font_gui[3] = {0x93, 0x94, 0};
117 oled_write_P(font_gui, false);
118};
119
120void render_caps_lock(void) {
121 static const char PROGMEM font_caps[3] = {0x9f, 0xbf, 0};
122 oled_write_P(font_caps, false);
123};
124
125
126// 5x2 Mod and feature indicator clusters
127
128void render_mod_status(void) {
129#if defined(NO_ACTION_ONESHOT)
130 uint8_t modifiers = get_mods();
131#else
132 uint8_t modifiers = get_mods() | get_oneshot_mods();
133#endif
134
135 (modifiers & MOD_MASK_CTRL) ? render_mod_ctrl() : oled_write_P(PSTR(" "), false);
136 oled_write_P(PSTR(" "), false);
137 (modifiers & MOD_MASK_SHIFT) ? render_mod_shift() : oled_write_P(PSTR(" "), false);
138
139 (modifiers & MOD_MASK_ALT) ? render_mod_alt() : oled_write_P(PSTR(" "), false);
140 oled_write_P(PSTR(" "), false);
141 (modifiers & MOD_MASK_GUI) ? render_mod_gui() : oled_write_P(PSTR(" "), false);
142
143 led_t led_state = host_keyboard_led_state();
144 (led_state.caps_lock) ? render_caps_lock() : oled_write_P(PSTR(" "), false);
145}
146
147void render_feature_status(void) {
148#if defined(RGB_MATRIX_ENABLE) || defined(RGBLIGHT_ENABLE)
149 render_rgb_status();
150#endif
151};
152
153// Keylogger
154#define KEYLOGGER_LENGTH 5
155static char keylog_str[KEYLOGGER_LENGTH + 1] = {"\n"};
156// clang-format off
157static const char PROGMEM code_to_name[0xFF] = {
158// 0 1 2 3 4 5 6 7 8 9 A B C D E F
159 ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', // 0x
160 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', // 1x
161 '3', '4', '5', '6', '7', '8', '9', '0', 20, 19, 27, 26, 22, '-', '=', '[', // 2x
162 ']','\\', '#', ';','\'', '`', ',', '.', '/', 128, ' ', ' ', ' ', ' ', ' ', ' ', // 3x
163 ' ', ' ', ' ', ' ', ' ', ' ', 'P', 'S', ' ', ' ', ' ', ' ', 16, ' ', ' ', ' ', // 4x
164 ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 5x
165 ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 6x
166 ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 7x
167 ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 8x
168 ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 9x
169 ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Ax
170 ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Bx
171 ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Cx
172 ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Dx
173 'C', 'S', 'A', 'C', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Ex
174 ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' // Fx
175};
176
177
178#if defined(KEY_LOG_ENABLE)
179void add_keylog(uint16_t keycode) {
180 if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX)
181 || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)
182 || (keycode >= QK_MODS && keycode <= QK_MODS_MAX)) {
183 keycode = keycode & 0xFF;
184 } else if (keycode > 0xFF) {
185 keycode = 0;
186 }
187
188 for (uint8_t i = (KEYLOGGER_LENGTH - 1); i > 0; --i) {
189 keylog_str[i] = keylog_str[i - 1];
190 }
191
192 if (keycode < (sizeof(code_to_name) / sizeof(char))) {
193 keylog_str[0] = pgm_read_byte(&code_to_name[keycode]);
194 }
195}
196#endif
197
198static uint16_t key_timer = 0;
199static bool is_key_processed = true;
200bool process_record_oled(uint16_t keycode, keyrecord_t *record) {
201 if (record->event.pressed) {
202 key_timer = timer_read();
203 is_key_processed = true;
204
205# if defined(KEY_LOG_ENABLE)
206 add_keylog(keycode);
207#endif
208 }
209
210 return true;
211}
212
213
214void render_keylogger_status(void) {
215 oled_write(keylog_str, false);
216}
217
218
219void render_prompt(void) {
220 bool blink = (timer_read() % 1000) < 500;
221
222 if (layer_state_is(_FUNCTION)) {
223 oled_write_ln_P(blink ? PSTR("> ft_") : PSTR("> ft "), false);
224 } else if (layer_state_is(_CODE)) {
225 oled_write_ln_P(blink ? PSTR("> sy_") : PSTR("> sy "), false);
226 } else if (layer_state_is(_ADJUST)) {
227 oled_write_ln_P(blink ? PSTR("> aj_") : PSTR("> aj "), false);
228 } else {
229 oled_write_ln_P(blink ? PSTR("> _ ") : PSTR("> "), false);
230 }
231};
232
233
234void render_status_secondary(void) {
235 oled_write_ln("", false);
236 oled_write_ln("", false);
237
238 render_kb_split();
239
240 oled_write_ln("", false);
241 oled_write_ln("", false);
242 oled_write_ln("", false);
243
244 render_layer();
245
246 oled_write_ln("", false);
247 oled_write_ln("", false);
248 oled_write_ln("", false);
249
250#if defined(RGB_MATRIX_ENABLE) || defined(RGBLIGHT_ENABLE)
251 layer_state_is(_ADJUST) ? render_feature_status() : render_mod_status();
252#else
253 render_mod_status();
254#endif
255};
256
257
258void render_status_main(void) {
259 oled_write_ln("", false);
260 oled_write_ln("", false);
261
262 render_qmk_logo();
263
264 oled_write_ln("", false);
265 oled_write_ln("", false);
266
267 render_layers();
268
269 oled_write_ln("", false);
270 oled_write_ln("", false);
271
272 render_prompt();
273
274 oled_write_ln("", false);
275
276 render_keylogger_status();
277}
278
279
280oled_rotation_t oled_init_user(oled_rotation_t rotation) {
281 return OLED_ROTATION_270;
282}
283
284
285bool oled_task_user(void) {
286 if (is_keyboard_master()) {
287 if (is_key_processed && (timer_elapsed(key_timer) < OLED_KEY_TIMEOUT)) {
288 render_status_main();
289 } else if (is_key_processed) {
290 is_key_processed = false;
291 oled_off();
292 }
293 } else {
294 render_status_secondary();
295 }
296
297 return false;
298}
diff --git a/keyboards/crkbd/keymaps/thunderbird2086/process_records.c b/keyboards/crkbd/keymaps/thunderbird2086/process_records.c
new file mode 100644
index 0000000000..381cf281e5
--- /dev/null
+++ b/keyboards/crkbd/keymaps/thunderbird2086/process_records.c
@@ -0,0 +1,45 @@
1// Copyright 2021 Allen Choi (@thunderbird2086)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include QMK_KEYBOARD_H
5
6#include "keycodes.h"
7
8__attribute__((weak))
9bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
10 return true;
11}
12
13__attribute__((weak))
14bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
15 return true;
16}
17
18#if defined(OLED_ENABLE)
19__attribute__((weak))
20bool process_record_oled(uint16_t keycode, keyrecord_t *record) {
21 return true;
22}
23#endif
24
25bool process_record_user(uint16_t keycode, keyrecord_t *record) {
26 switch (keycode) {
27
28 case COLEMAK:
29 if (record->event.pressed) {
30 set_single_persistent_default_layer(_COLEMAK);
31 }
32 break;
33 case QWERTY:
34 if (record->event.pressed) {
35 set_single_persistent_default_layer(_QWERTY);
36 }
37 break;
38 }
39
40 return process_record_keymap(keycode, record) && process_record_secrets(keycode, record)
41# if defined(OLED_ENABLE)
42 && process_record_oled(keycode, record)
43# endif
44 ;
45}
diff --git a/keyboards/crkbd/keymaps/thunderbird2086/readme.md b/keyboards/crkbd/keymaps/thunderbird2086/readme.md
new file mode 100644
index 0000000000..6400309fe8
--- /dev/null
+++ b/keyboards/crkbd/keymaps/thunderbird2086/readme.md
@@ -0,0 +1,65 @@
1# Thunderbird2086's custom CRKBD Layout
2
3The concept is Mac and **baby finger** friendly keymap.
4
5## Layers
6- Colemak-DH: base layer. The option(⌥) and command(⌘) keys are assigned to thumb blocks as well as home position keys on each side. Also, far end two columns are assigned to shift(⇧) and control(⌃) keys.
7 ![colemak-dh](https://i.imgur.com/R7EzTTt.png)
8 - Thumb keys
9 | Tap | Double tap | Long tap |
10 | --- | --- | --- |
11 | Command(⌘) | Command(⌘) + Space(␣) | |
12 | Delete(⌦) | | Function layer |
13 | Backspace(⌫)| | Function layer |
14 | Space(␣) | | Code layer |
15 | Enter(⏎) | | Code layer |
16 - Staggered keys
17 | Tap | Double tap | Long tap |
18 | --- | --- | --- |
19 | TAB | Control(⌃) + TAB | |
20 | a | | Control(⌃) |
21 | z | | Shift(⇧) |
22 | t | | Option(⌥) |
23 | n | | Command(⌘) |
24 | o | | Control(⌃) |
25 | ' | | Control(⌃) |
26 | / | | Shift(⇧) |
27 | = | | Adjust layer |
28
29- QWERTY: same as Colemak-DH layer
30 ![qwery](https://i.imgur.com/v9JBwQu.png)
31 - Thumb keys : same as Colemak-DH
32 - Staggered keys : almost same as Colemak-DH except
33 | Tap | Double tap | Long tap |
34 | --- | --- | --- |
35 | f | | Option(⌥) |
36 | j | | Command(⌘) |
37 | ; | | Control(⌃) |
38
39- CODE: numbers and symbols.
40 ![symbol](https://i.imgur.com/BPgPlYX.png)
41 - Thumb keys
42 | Tap | Double tap | Long tap |
43 | --- | --- | --- |
44 | ESC | Caps lock | |
45 - Staggered keys
46 | Tap | Double tap | Long tap |
47 | --- | --- | --- |
48 | ` | Command(⌘) + ` | |
49
50- FUNCTION: function, meadia and navigation keys
51 ![function](https://i.imgur.com/cs5haUP.png)
52 - Thumb keys
53 | Tap | Double tap | Long tap |
54 | --- | --- | --- |
55 | ESC | Caps lock | |
56
57- ADJUST: RGB control, Power control, default layer setting and reset
58 ![adjust](https://i.imgur.com/uDIhigd.png)
59- SECRET: hold `ADJUST` and `FUNCTION` to activate
60
61## Custom OLED
62This keymap includes custom OLED font and code. The font contains some logos and status indidcators from [gotham](../gotham) and [soundmonster](../soundmonster) including my own CAPS LOCK icon. Enable OLED in rukes.mk to check it out. Feel free to reuse the font or parts of it.
63
64## Flashing
65Flash using `make crkbd:thunderbird2086:avrdude` for Pro Micro and `make crkbd:thunderbird2086:dfu` for Elite-C.
diff --git a/keyboards/crkbd/keymaps/thunderbird2086/rules.mk b/keyboards/crkbd/keymaps/thunderbird2086/rules.mk
new file mode 100644
index 0000000000..4da48db08e
--- /dev/null
+++ b/keyboards/crkbd/keymaps/thunderbird2086/rules.mk
@@ -0,0 +1,18 @@
1MOUSEKEY_ENABLE = no
2EXTRAKEY_ENABLE = yes
3AUDIO_ENABLE = no
4RGBLIGHT_ENABLE = no
5RGB_MATRIX_ENABLE = yes
6OLED_ENABLE = yes
7OLED_DRIVER = SSD1306
8LTO_ENABLE = yes
9
10TAP_DANCE_ENABLE = yes
11
12SRC += oled.c
13SRC += process_records.c
14SRC += tap_dances.c
15
16ifneq ("$(wildcard keyboards/crkbd/keymaps/thunderbird2086/secrets.c)","")
17 SRC += secrets.c
18endif
diff --git a/keyboards/crkbd/keymaps/thunderbird2086/tap_dances.c b/keyboards/crkbd/keymaps/thunderbird2086/tap_dances.c
new file mode 100644
index 0000000000..1cf6fdf092
--- /dev/null
+++ b/keyboards/crkbd/keymaps/thunderbird2086/tap_dances.c
@@ -0,0 +1,12 @@
1// Copyright 2021 Allen Choi (@thunderbird2086)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include QMK_KEYBOARD_H
5#include "tap_dances.h"
6
7qk_tap_dance_action_t tap_dance_actions[] = {
8 [TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS),
9 [TD_TAB_CTRLTAB] = ACTION_TAP_DANCE_DOUBLE(KC_TAB, LCTL(KC_TAB)),
10 [TD_GRV_CTRLGRV] = ACTION_TAP_DANCE_DOUBLE(KC_GRV, LGUI(KC_GRV)),
11 [TD_GUI_GUISPC] = ACTION_TAP_DANCE_DOUBLE(KC_LGUI, LGUI(KC_SPC)),
12};
diff --git a/keyboards/crkbd/keymaps/thunderbird2086/tap_dances.h b/keyboards/crkbd/keymaps/thunderbird2086/tap_dances.h
new file mode 100644
index 0000000000..34d3c4e32c
--- /dev/null
+++ b/keyboards/crkbd/keymaps/thunderbird2086/tap_dances.h
@@ -0,0 +1,16 @@
1// Copyright 2021 Allen Choi (@thunderbird2086)
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6enum custom_tapdances {
7 TD_ESC_CAPS = 0,
8 TD_TAB_CTRLTAB,
9 TD_GRV_CTRLGRV,
10 TD_GUI_GUISPC,
11};
12
13#define T_ESC TD(TD_ESC_CAPS) // Tap for ESC, double tap for CAPSLOCK
14#define T_TAB TD(TD_TAB_CTRLTAB) // Tap for TAB, double tap for CTRL + TAB
15#define T_GRV TD(TD_GRV_CTRLGRV) // Tap for GRV, double tap for Cmd + GRV
16#define T_GUI TD(TD_GUI_GUISPC) // Tap for Cmd, double tap for Cmd + Space