Commit | Line | Data |
---|---|---|
db32864c | 1 | /* |
23839b8c | 2 | Copyright 2012-2017 Jun Wako <wakojun@gmail.com> |
db32864c JH |
3 | |
4 | This program is free software: you can redistribute it and/or modify | |
5 | it under the terms of the GNU General Public License as published by | |
6 | the Free Software Foundation, either version 2 of the License, or | |
7 | (at your option) any later version. | |
8 | ||
9 | This program is distributed in the hope that it will be useful, | |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | GNU General Public License for more details. | |
13 | ||
14 | You should have received a copy of the GNU General Public License | |
15 | along with this program. If not, see <http://www.gnu.org/licenses/>. | |
16 | */ | |
17 | ||
18 | #include "keymap.h" | |
19 | #include "report.h" | |
20 | #include "keycode.h" | |
21 | #include "action_layer.h" | |
4d4f7684 | 22 | #if defined(__AVR__) |
b624f32f | 23 | # include <util/delay.h> |
24 | # include <stdio.h> | |
4d4f7684 | 25 | #endif |
db32864c JH |
26 | #include "action.h" |
27 | #include "action_macro.h" | |
28 | #include "debug.h" | |
db32864c JH |
29 | #include "quantum.h" |
30 | ||
abfd6ed9 JC |
31 | #ifdef BACKLIGHT_ENABLE |
32 | # include "backlight.h" | |
33 | #endif | |
34 | ||
db32864c | 35 | #ifdef MIDI_ENABLE |
b624f32f | 36 | # include "process_midi.h" |
db32864c JH |
37 | #endif |
38 | ||
39 | extern keymap_config_t keymap_config; | |
40 | ||
db32864c JH |
41 | #include <inttypes.h> |
42 | ||
43 | /* converts key to action */ | |
b624f32f | 44 | action_t action_for_key(uint8_t layer, keypos_t key) { |
db32864c JH |
45 | // 16bit keycodes - important |
46 | uint16_t keycode = keymap_key_to_keycode(layer, key); | |
47 | ||
48 | // keycode remapping | |
49 | keycode = keycode_config(keycode); | |
50 | ||
03746778 | 51 | action_t action = {}; |
b624f32f | 52 | uint8_t action_layer, when, mod; |
db32864c JH |
53 | |
54 | switch (keycode) { | |
db32864c JH |
55 | case KC_A ... KC_EXSEL: |
56 | case KC_LCTRL ... KC_RGUI: | |
57 | action.code = ACTION_KEY(keycode); | |
58 | break; | |
59 | case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: | |
60 | action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode)); | |
61 | break; | |
8b85ec2a | 62 | case KC_AUDIO_MUTE ... KC_BRIGHTNESS_DOWN: |
db32864c JH |
63 | action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode)); |
64 | break; | |
2048df88 | 65 | #ifdef MOUSEKEY_ENABLE |
db32864c JH |
66 | case KC_MS_UP ... KC_MS_ACCEL2: |
67 | action.code = ACTION_MOUSEKEY(keycode); | |
68 | break; | |
2048df88 | 69 | #endif |
db32864c JH |
70 | case KC_TRNS: |
71 | action.code = ACTION_TRANSPARENT; | |
72 | break; | |
b624f32f | 73 | case QK_MODS ... QK_MODS_MAX:; |
db32864c JH |
74 | // Has a modifier |
75 | // Split it up | |
b624f32f | 76 | action.code = ACTION_MODS_KEY(keycode >> 8, keycode & 0xFF); // adds modifier to key |
db32864c | 77 | break; |
2048df88 JC |
78 | #ifndef NO_ACTION_FUNCTION |
79 | case KC_FN0 ... KC_FN31: | |
80 | action.code = keymap_function_id_to_action(FN_INDEX(keycode)); | |
81 | break; | |
b624f32f | 82 | case QK_FUNCTION ... QK_FUNCTION_MAX:; |
db32864c JH |
83 | // Is a shortcut for function action_layer, pull last 12bits |
84 | // This means we have 4,096 FN macros at our disposal | |
b624f32f | 85 | action.code = keymap_function_id_to_action((int)keycode & 0xFFF); |
db32864c | 86 | break; |
2048df88 JC |
87 | #endif |
88 | #ifndef NO_ACTION_MACRO | |
db32864c | 89 | case QK_MACRO ... QK_MACRO_MAX: |
b624f32f | 90 | if (keycode & 0x800) // tap macros have upper bit set |
cfc41497 LS |
91 | action.code = ACTION_MACRO_TAP(keycode & 0xFF); |
92 | else | |
93 | action.code = ACTION_MACRO(keycode & 0xFF); | |
db32864c | 94 | break; |
2048df88 | 95 | #endif |
db32864c JH |
96 | case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: |
97 | action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); | |
98 | break; | |
b624f32f | 99 | case QK_TO ... QK_TO_MAX:; |
db32864c | 100 | // Layer set "GOTO" |
b624f32f | 101 | when = (keycode >> 0x4) & 0x3; |
db32864c | 102 | action_layer = keycode & 0xF; |
b624f32f | 103 | action.code = ACTION_LAYER_SET(action_layer, when); |
db32864c | 104 | break; |
b624f32f | 105 | case QK_MOMENTARY ... QK_MOMENTARY_MAX:; |
db32864c JH |
106 | // Momentary action_layer |
107 | action_layer = keycode & 0xFF; | |
b624f32f | 108 | action.code = ACTION_LAYER_MOMENTARY(action_layer); |
db32864c | 109 | break; |
b624f32f | 110 | case QK_DEF_LAYER ... QK_DEF_LAYER_MAX:; |
db32864c JH |
111 | // Set default action_layer |
112 | action_layer = keycode & 0xFF; | |
b624f32f | 113 | action.code = ACTION_DEFAULT_LAYER_SET(action_layer); |
db32864c | 114 | break; |
b624f32f | 115 | case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX:; |
db32864c JH |
116 | // Set toggle |
117 | action_layer = keycode & 0xFF; | |
b624f32f | 118 | action.code = ACTION_LAYER_TOGGLE(action_layer); |
db32864c | 119 | break; |
b624f32f | 120 | case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX:; |
db32864c JH |
121 | // OSL(action_layer) - One-shot action_layer |
122 | action_layer = keycode & 0xFF; | |
b624f32f | 123 | action.code = ACTION_LAYER_ONESHOT(action_layer); |
db32864c | 124 | break; |
b624f32f | 125 | case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX:; |
db32864c | 126 | // OSM(mod) - One-shot mod |
b624f32f | 127 | mod = mod_config(keycode & 0xFF); |
db32864c JH |
128 | action.code = ACTION_MODS_ONESHOT(mod); |
129 | break; | |
69ea10f9 JH |
130 | case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX: |
131 | action.code = ACTION_LAYER_TAP_TOGGLE(keycode & 0xFF); | |
132 | break; | |
7a5ce36f | 133 | case QK_LAYER_MOD ... QK_LAYER_MOD_MAX: |
b624f32f | 134 | mod = mod_config(keycode & 0xF); |
7a5ce36f | 135 | action_layer = (keycode >> 4) & 0xF; |
b624f32f | 136 | action.code = ACTION_LAYER_MODS(action_layer, mod); |
7a5ce36f | 137 | break; |
db32864c | 138 | case QK_MOD_TAP ... QK_MOD_TAP_MAX: |
b624f32f | 139 | mod = mod_config((keycode >> 0x8) & 0x1F); |
61cdc9aa | 140 | action.code = ACTION_MODS_TAP_KEY(mod, keycode & 0xFF); |
db32864c | 141 | break; |
b624f32f | 142 | #ifdef SWAP_HANDS_ENABLE |
23ac2a02 JW |
143 | case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX: |
144 | action.code = ACTION(ACT_SWAP_HANDS, keycode & 0xff); | |
145 | break; | |
b624f32f | 146 | #endif |
23ac2a02 | 147 | |
db32864c JH |
148 | default: |
149 | action.code = ACTION_NO; | |
150 | break; | |
151 | } | |
152 | return action; | |
153 | } | |
154 | ||
b624f32f | 155 | __attribute__((weak)) const uint16_t PROGMEM fn_actions[] = { |
00dcac72 JH |
156 | |
157 | }; | |
db32864c JH |
158 | |
159 | /* Macro */ | |
b624f32f | 160 | __attribute__((weak)) const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { return MACRO_NONE; } |
db32864c JH |
161 | |
162 | /* Function */ | |
b624f32f | 163 | __attribute__((weak)) void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {} |
db32864c | 164 | |
d8a608f3 | 165 | // translates key to keycode |
b624f32f | 166 | __attribute__((weak)) uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key) { |
db32864c JH |
167 | // Read entire word (16bits) |
168 | return pgm_read_word(&keymaps[(layer)][(key.row)][(key.col)]); | |
169 | } | |
d8a608f3 W |
170 | |
171 | // translates function id to action | |
b624f32f | 172 | __attribute__((weak)) uint16_t keymap_function_id_to_action(uint16_t function_id) { |
173 | // The compiler sees the empty (weak) fn_actions and generates a warning | |
174 | // This function should not be called in that case, so the warning is too strict | |
175 | // If this function is called however, the keymap should have overridden fn_actions, and then the compile | |
176 | // is comparing against the wrong array | |
177 | #pragma GCC diagnostic push | |
178 | #pragma GCC diagnostic ignored "-Warray-bounds" | |
179 | return pgm_read_word(&fn_actions[function_id]); | |
180 | #pragma GCC diagnostic pop | |
d8a608f3 | 181 | } |