diff options
Diffstat (limited to 'quantum/keymap_common.c')
-rw-r--r-- | quantum/keymap_common.c | 250 |
1 files changed, 138 insertions, 112 deletions
diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c index 3a00d36f0..b91916685 100644 --- a/quantum/keymap_common.c +++ b/quantum/keymap_common.c | |||
@@ -27,6 +27,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
27 | #include "keymap_midi.h" | 27 | #include "keymap_midi.h" |
28 | #include "bootloader.h" | 28 | #include "bootloader.h" |
29 | 29 | ||
30 | extern keymap_config_t keymap_config; | ||
31 | |||
30 | #include <stdio.h> | 32 | #include <stdio.h> |
31 | #include <inttypes.h> | 33 | #include <inttypes.h> |
32 | #ifdef AUDIO_ENABLE | 34 | #ifdef AUDIO_ENABLE |
@@ -47,120 +49,9 @@ action_t action_for_key(uint8_t layer, keypos_t key) | |||
47 | // 16bit keycodes - important | 49 | // 16bit keycodes - important |
48 | uint16_t keycode = keymap_key_to_keycode(layer, key); | 50 | uint16_t keycode = keymap_key_to_keycode(layer, key); |
49 | 51 | ||
50 | if (keycode >= 0x0100 && keycode < 0x2000) { | ||
51 | // Has a modifier | ||
52 | action_t action; | ||
53 | // Split it up | ||
54 | action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key | ||
55 | return action; | ||
56 | } else if (keycode >= 0x2000 && keycode < 0x3000) { | ||
57 | // Is a shortcut for function layer, pull last 12bits | ||
58 | // This means we have 4,096 FN macros at our disposal | ||
59 | return keymap_func_to_action(keycode & 0xFFF); | ||
60 | } else if (keycode >= 0x3000 && keycode < 0x4000) { | ||
61 | // When the code starts with 3, it's an action macro. | ||
62 | action_t action; | ||
63 | action.code = ACTION_MACRO(keycode & 0xFF); | ||
64 | return action; | ||
65 | #ifdef BACKLIGHT_ENABLE | ||
66 | } else if (keycode >= BL_0 && keycode <= BL_15) { | ||
67 | action_t action; | ||
68 | action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F); | ||
69 | return action; | ||
70 | } else if (keycode == BL_DEC) { | ||
71 | action_t action; | ||
72 | action.code = ACTION_BACKLIGHT_DECREASE(); | ||
73 | return action; | ||
74 | } else if (keycode == BL_INC) { | ||
75 | action_t action; | ||
76 | action.code = ACTION_BACKLIGHT_INCREASE(); | ||
77 | return action; | ||
78 | } else if (keycode == BL_TOGG) { | ||
79 | action_t action; | ||
80 | action.code = ACTION_BACKLIGHT_TOGGLE(); | ||
81 | return action; | ||
82 | } else if (keycode == BL_STEP) { | ||
83 | action_t action; | ||
84 | action.code = ACTION_BACKLIGHT_STEP(); | ||
85 | return action; | ||
86 | #endif | ||
87 | } else if (keycode == RESET) { // RESET is 0x5000, which is why this is here | ||
88 | action_t action; | ||
89 | clear_keyboard(); | ||
90 | #ifdef AUDIO_ENABLE | ||
91 | play_notes(&goodbye, 3, false); | ||
92 | #endif | ||
93 | _delay_ms(250); | ||
94 | #ifdef ATREUS_ASTAR | ||
95 | *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific | ||
96 | #endif | ||
97 | bootloader_jump(); | ||
98 | return action; | ||
99 | } else if (keycode == DEBUG) { // DEBUG is 0x5001 | ||
100 | // TODO: Does this actually work? | ||
101 | action_t action; | ||
102 | print("\nDEBUG: enabled.\n"); | ||
103 | debug_enable = true; | ||
104 | return action; | ||
105 | } else if (keycode >= 0x5000 && keycode < 0x6000) { | ||
106 | // Layer movement shortcuts | ||
107 | // See .h to see constraints/usage | ||
108 | int type = (keycode >> 0x8) & 0xF; | ||
109 | if (type == 0x1) { | ||
110 | // Layer set "GOTO" | ||
111 | int when = (keycode >> 0x4) & 0x3; | ||
112 | int layer = keycode & 0xF; | ||
113 | action_t action; | ||
114 | action.code = ACTION_LAYER_SET(layer, when); | ||
115 | return action; | ||
116 | } else if (type == 0x2) { | ||
117 | // Momentary layer | ||
118 | int layer = keycode & 0xFF; | ||
119 | action_t action; | ||
120 | action.code = ACTION_LAYER_MOMENTARY(layer); | ||
121 | return action; | ||
122 | } else if (type == 0x3) { | ||
123 | // Set default layer | ||
124 | int layer = keycode & 0xFF; | ||
125 | action_t action; | ||
126 | action.code = ACTION_DEFAULT_LAYER_SET(layer); | ||
127 | return action; | ||
128 | } else if (type == 0x4) { | ||
129 | // Set default layer | ||
130 | int layer = keycode & 0xFF; | ||
131 | action_t action; | ||
132 | action.code = ACTION_LAYER_TOGGLE(layer); | ||
133 | return action; | ||
134 | } | ||
135 | #ifdef MIDI_ENABLE | ||
136 | } else if (keycode >= 0x6000 && keycode < 0x7000) { | ||
137 | action_t action; | ||
138 | action.code = ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8); | ||
139 | return action; | ||
140 | #endif | ||
141 | } else if (keycode >= 0x7000 && keycode < 0x8000) { | ||
142 | action_t action; | ||
143 | action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); | ||
144 | return action; | ||
145 | } else if (keycode >= 0x8000 && keycode < 0x9000) { | ||
146 | action_t action; | ||
147 | action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); | ||
148 | return action; | ||
149 | #ifdef UNICODE_ENABLE | ||
150 | } else if (keycode >= 0x8000000) { | ||
151 | action_t action; | ||
152 | uint16_t unicode = keycode & ~(0x8000); | ||
153 | action.code = ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8); | ||
154 | return action; | ||
155 | #endif | ||
156 | } else { | ||
157 | |||
158 | } | ||
159 | |||
160 | switch (keycode) { | 52 | switch (keycode) { |
161 | case KC_FN0 ... KC_FN31: | 53 | case KC_FN0 ... KC_FN31: |
162 | return keymap_fn_to_action(keycode); | 54 | return keymap_fn_to_action(keycode); |
163 | #ifdef BOOTMAGIC_ENABLE | ||
164 | case KC_CAPSLOCK: | 55 | case KC_CAPSLOCK: |
165 | case KC_LOCKING_CAPS: | 56 | case KC_LOCKING_CAPS: |
166 | if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) { | 57 | if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) { |
@@ -224,7 +115,6 @@ action_t action_for_key(uint8_t layer, keypos_t key) | |||
224 | return keycode_to_action(KC_BSLASH); | 115 | return keycode_to_action(KC_BSLASH); |
225 | } | 116 | } |
226 | return keycode_to_action(KC_BSPACE); | 117 | return keycode_to_action(KC_BSPACE); |
227 | #endif | ||
228 | default: | 118 | default: |
229 | return keycode_to_action(keycode); | 119 | return keycode_to_action(keycode); |
230 | } | 120 | } |
@@ -265,6 +155,142 @@ static action_t keycode_to_action(uint16_t keycode) | |||
265 | case KC_TRNS: | 155 | case KC_TRNS: |
266 | action.code = ACTION_TRANSPARENT; | 156 | action.code = ACTION_TRANSPARENT; |
267 | break; | 157 | break; |
158 | case 0x0100 ... 0x1FFF: ; | ||
159 | // Has a modifier | ||
160 | // Split it up | ||
161 | action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key | ||
162 | break; | ||
163 | case 0x2000 ... 0x2FFF: | ||
164 | // Is a shortcut for function layer, pull last 12bits | ||
165 | // This means we have 4,096 FN macros at our disposal | ||
166 | return keymap_func_to_action(keycode & 0xFFF); | ||
167 | break; | ||
168 | case 0x3000 ... 0x3FFF: ; | ||
169 | // When the code starts with 3, it's an action macro. | ||
170 | action.code = ACTION_MACRO(keycode & 0xFF); | ||
171 | break; | ||
172 | #ifdef BACKLIGHT_ENABLE | ||
173 | case BL_0 ... BL_15: | ||
174 | action.code = ACTION_BACKLIGHT_LEVEL(keycode & 0x000F); | ||
175 | break; | ||
176 | case BL_DEC: | ||
177 | action.code = ACTION_BACKLIGHT_DECREASE(); | ||
178 | break; | ||
179 | case BL_INC: | ||
180 | action.code = ACTION_BACKLIGHT_INCREASE(); | ||
181 | break; | ||
182 | case BL_TOGG: | ||
183 | action.code = ACTION_BACKLIGHT_TOGGLE(); | ||
184 | break; | ||
185 | case BL_STEP: | ||
186 | action.code = ACTION_BACKLIGHT_STEP(); | ||
187 | break; | ||
188 | #endif | ||
189 | case RESET: ; // RESET is 0x5000, which is why this is here | ||
190 | clear_keyboard(); | ||
191 | #ifdef AUDIO_ENABLE | ||
192 | play_notes(&goodbye, 3, false); | ||
193 | #endif | ||
194 | _delay_ms(250); | ||
195 | #ifdef ATREUS_ASTAR | ||
196 | *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific | ||
197 | #endif | ||
198 | bootloader_jump(); | ||
199 | break; | ||
200 | case DEBUG: ; // DEBUG is 0x5001 | ||
201 | print("\nDEBUG: enabled.\n"); | ||
202 | debug_enable = true; | ||
203 | break; | ||
204 | case 0x5002 ... 0x50FF: | ||
205 | // MAGIC actions (BOOTMAGIC without the boot) | ||
206 | if (!eeconfig_is_enabled()) { | ||
207 | eeconfig_init(); | ||
208 | } | ||
209 | /* keymap config */ | ||
210 | keymap_config.raw = eeconfig_read_keymap(); | ||
211 | if (keycode == MAGIC_SWAP_CONTROL_CAPSLOCK) { | ||
212 | keymap_config.swap_control_capslock = 1; | ||
213 | } else if (keycode == MAGIC_CAPSLOCK_TO_CONTROL) { | ||
214 | keymap_config.capslock_to_control = 1; | ||
215 | } else if (keycode == MAGIC_SWAP_LALT_LGUI) { | ||
216 | keymap_config.swap_lalt_lgui = 1; | ||
217 | } else if (keycode == MAGIC_SWAP_RALT_RGUI) { | ||
218 | keymap_config.swap_ralt_rgui = 1; | ||
219 | } else if (keycode == MAGIC_NO_GUI) { | ||
220 | keymap_config.no_gui = 1; | ||
221 | } else if (keycode == MAGIC_SWAP_GRAVE_ESC) { | ||
222 | keymap_config.swap_grave_esc = 1; | ||
223 | } else if (keycode == MAGIC_SWAP_BACKSLASH_BACKSPACE) { | ||
224 | keymap_config.swap_backslash_backspace = 1; | ||
225 | } else if (keycode == MAGIC_HOST_NKRO) { | ||
226 | keymap_config.nkro = 1; | ||
227 | } else if (keycode == MAGIC_SWAP_ALT_GUI) { | ||
228 | keymap_config.swap_lalt_lgui = 1; | ||
229 | keymap_config.swap_ralt_rgui = 1; | ||
230 | } | ||
231 | /* UNs */ | ||
232 | else if (keycode == MAGIC_UNSWAP_CONTROL_CAPSLOCK) { | ||
233 | keymap_config.swap_control_capslock = 0; | ||
234 | } else if (keycode == MAGIC_UNCAPSLOCK_TO_CONTROL) { | ||
235 | keymap_config.capslock_to_control = 0; | ||
236 | } else if (keycode == MAGIC_UNSWAP_LALT_LGUI) { | ||
237 | keymap_config.swap_lalt_lgui = 0; | ||
238 | } else if (keycode == MAGIC_UNSWAP_RALT_RGUI) { | ||
239 | keymap_config.swap_ralt_rgui = 0; | ||
240 | } else if (keycode == MAGIC_UNNO_GUI) { | ||
241 | keymap_config.no_gui = 0; | ||
242 | } else if (keycode == MAGIC_UNSWAP_GRAVE_ESC) { | ||
243 | keymap_config.swap_grave_esc = 0; | ||
244 | } else if (keycode == MAGIC_UNSWAP_BACKSLASH_BACKSPACE) { | ||
245 | keymap_config.swap_backslash_backspace = 0; | ||
246 | } else if (keycode == MAGIC_UNHOST_NKRO) { | ||
247 | keymap_config.nkro = 0; | ||
248 | } else if (keycode == MAGIC_UNSWAP_ALT_GUI) { | ||
249 | keymap_config.swap_lalt_lgui = 0; | ||
250 | keymap_config.swap_ralt_rgui = 0; | ||
251 | } | ||
252 | eeconfig_write_keymap(keymap_config.raw); | ||
253 | break; | ||
254 | case 0x5100 ... 0x5FFF: ; | ||
255 | // Layer movement shortcuts | ||
256 | // See .h to see constraints/usage | ||
257 | int type = (keycode >> 0x8) & 0xF; | ||
258 | if (type == 0x1) { | ||
259 | // Layer set "GOTO" | ||
260 | int when = (keycode >> 0x4) & 0x3; | ||
261 | int layer = keycode & 0xF; | ||
262 | action.code = ACTION_LAYER_SET(layer, when); | ||
263 | } else if (type == 0x2) { | ||
264 | // Momentary layer | ||
265 | int layer = keycode & 0xFF; | ||
266 | action.code = ACTION_LAYER_MOMENTARY(layer); | ||
267 | } else if (type == 0x3) { | ||
268 | // Set default layer | ||
269 | int layer = keycode & 0xFF; | ||
270 | action.code = ACTION_DEFAULT_LAYER_SET(layer); | ||
271 | } else if (type == 0x4) { | ||
272 | // Set default layer | ||
273 | int layer = keycode & 0xFF; | ||
274 | action.code = ACTION_LAYER_TOGGLE(layer); | ||
275 | } | ||
276 | break; | ||
277 | #ifdef MIDI_ENABLE | ||
278 | case 0x6000 ... 0x6FFF: | ||
279 | action.code = ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8); | ||
280 | break; | ||
281 | #endif | ||
282 | case 0x7000 ... 0x7FFF: | ||
283 | action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); | ||
284 | break; | ||
285 | case 0x8000 ... 0x8FFF: | ||
286 | action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); | ||
287 | break; | ||
288 | #ifdef UNICODE_ENABLE | ||
289 | case 0x8000000 ... 0x8FFFFFF: | ||
290 | uint16_t unicode = keycode & ~(0x8000); | ||
291 | action.code = ACTION_FUNCTION_OPT(unicode & 0xFF, (unicode & 0xFF00) >> 8); | ||
292 | break; | ||
293 | #endif | ||
268 | default: | 294 | default: |
269 | action.code = ACTION_NO; | 295 | action.code = ACTION_NO; |
270 | break; | 296 | break; |