]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/cospad/keymaps/detrus/keymap.c
Keyboard: Added gamepad layout to cospad (#3714)
[qmk_firmware.git] / keyboards / cospad / keymaps / detrus / keymap.c
1 #include QMK_KEYBOARD_H
2 #include "led.h"
3 #include <print.h>
4
5 #ifdef RGBLIGHT_ENABLE
6 #include "rgblight.h"
7 #endif
8
9 #define _______ KC_TRNS
10
11 // Each layer gets a name for readability, which is then used in the keymap matrix below.
12 enum cospad_layers {
13         _QWERTY_LAYER,
14         _QWERTZ_LAYER,
15         _COLEMA_LAYER,
16         _DVORAK_LAYER,
17         _QWERTY_LOWER_LAYER,
18         _QWERTZ_LOWER_LAYER,
19         _COLEMA_LOWER_LAYER,
20         _DVORAK_LOWER_LAYER,
21         _RAISE_LAYER,
22         _ALTER_LAYER,
23 };
24
25 // To switch the default layer used for the layout, there are special keycodes.
26 // Which onces detected below serve to switch it.
27 enum cospad_keycodes {
28         QWERTY = SAFE_RANGE,
29         QWERTZ,
30         COLEMAK,
31         DVORAK
32 };
33
34 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
35
36         /* Keymap _QWERTY_LAYER: Default layer
37          * ,-----------------------.
38          * |  T  |  G  |  B  | Alt |
39          * |-----|-----|-----|-----|
40          * |  R  |  F  |  V  | LOW |
41          * |-----|-----|-----|-----|
42          * |  E  |  D  |  C  |     |
43          * |-----|-----|-----| Spc |
44          * |  W  |  S  |  X  |     |
45          * |-----|-----|-----|-----|
46          * |  Q  |  A  |  Z  | RAI |
47          * |-----|-----|-----|-----|
48          * | Esc | Tab | Sft | Ctl |
49          * `-----------------------'
50          *
51          *   And it's LOWER layer
52          * ,-----------------------.
53          * |  P  |  ;  |  /  | Alt |
54          * |-----|-----|-----|-----|
55          * |  O  |  L  |  .  | LOW |
56          * |-----|-----|-----|-----|
57          * |  I  |  K  |  ,  |     |
58          * |-----|-----|-----| Ent |
59          * |  U  |  J  |  M  |     |
60          * |-----|-----|-----|-----|
61          * |  Y  |  H  |  N  | RAI |
62          * |-----|-----|-----|-----|
63          * | Esc | Tab | Sft | Ctl |
64          * `-----------------------'
65          */
66         [_QWERTY_LAYER] = LAYOUT_gamepad_6x4(
67                         KC_T,    KC_G,    KC_B,    KC_LALT,  \
68                         KC_R,    KC_F,    KC_V,    MO(_QWERTY_LOWER_LAYER),\
69                         KC_E,    KC_D,    KC_C,              \
70                         KC_W,    KC_S,    KC_X,    KC_SPACE, \
71                         KC_Q,    KC_A,    KC_Z,    MO(_RAISE_LAYER),\
72                         KC_GESC, KC_TAB,  KC_LSFT, KC_LCTRL),
73         [_QWERTY_LOWER_LAYER] = LAYOUT_gamepad_6x4(
74                         KC_P,    KC_SCLN, KC_SLSH, KC_LALT,  \
75                         KC_O,    KC_L,    KC_DOT,  _______,  \
76                         KC_I,    KC_K,    KC_COMM,           \
77                         KC_U,    KC_J,    KC_M,    KC_ENTER, \
78                         KC_Y,    KC_H,    KC_N,    _______,  \
79                         _______, _______,  _______, _______),
80
81
82
83         /* Keymap _QWERTZ_LAYER: Alternate default layer
84          * ,-----------------------.
85          * |  T  |  G  |  B  | Alt |
86          * |-----|-----|-----|-----|
87          * |  R  |  F  |  V  | LOW |
88          * |-----|-----|-----|-----|
89          * |  E  |  D  |  C  |     |
90          * |-----|-----|-----| Spc |
91          * |  W  |  S  |  X  |     |
92          * |-----|-----|-----|-----|
93          * |  Q  |  A  |  Y  | RAI |
94          * |-----|-----|-----|-----|
95          * | Esc | Tab | Sft | Ctl |
96          * `-----------------------'
97          *
98          *   And it's LOWER layer
99          * ,-----------------------.
100          * |  P  |  ;  |  /  | Alt |
101          * |-----|-----|-----|-----|
102          * |  O  |  L  |  >  | LOW |
103          * |-----|-----|-----|-----|
104          * |  I  |  K  |  <  |     |
105          * |-----|-----|-----| Ent |
106          * |  U  |  J  |  M  |     |
107          * |-----|-----|-----|-----|
108          * |  Z  |  H  |  N  | RAI |
109          * |-----|-----|-----|-----|
110          * | Esc | Tab | Sft | Ctl |
111          * `-----------------------'
112          */
113         [_QWERTZ_LAYER] = LAYOUT_gamepad_6x4(
114                         KC_T,    KC_G,    KC_B,    KC_LALT,  \
115                         KC_R,    KC_F,    KC_V,    MO(_QWERTZ_LOWER_LAYER),\
116                         KC_E,    KC_D,    KC_C,              \
117                         KC_W,    KC_S,    KC_X,    KC_SPACE, \
118                         KC_Q,    KC_A,    KC_Y,    MO(_RAISE_LAYER),\
119                         KC_GESC, KC_TAB,  KC_LSFT, KC_LCTRL),
120         [_QWERTZ_LOWER_LAYER] = LAYOUT_gamepad_6x4(
121                         KC_P,    KC_SCLN, KC_SLSH, KC_LALT,  \
122                         KC_O,    KC_L,    KC_DOT,  _______,  \
123                         KC_I,    KC_K,    KC_COMM,           \
124                         KC_U,    KC_J,    KC_M,    KC_ENTER, \
125                         KC_Z,    KC_H,    KC_N,    _______,  \
126                         _______, _______, _______, _______),
127
128
129
130         /* Keymap _COLEMA_LAYER: Alternate default layer
131          * ,-----------------------.
132          * |  G  |  D  |  B  | Alt |
133          * |-----|-----|-----|-----|
134          * |  P  |  T  |  V  | LOW |
135          * |-----|-----|-----|-----|
136          * |  F  |  S  |  C  |     |
137          * |-----|-----|-----| Spc |
138          * |  W  |  R  |  X  |     |
139          * |-----|-----|-----|-----|
140          * |  Q  |  A  |  Z  | RAI |
141          * |-----|-----|-----|-----|
142          * | Esc | Tab | Sft | Ctl |
143          * `-----------------------'
144          *
145          *   And it's LOWER layer
146          * ,-----------------------.
147          * |  ;  |  O  |  /  | Alt |
148          * |-----|-----|-----|-----|
149          * |  Y  |  I  |  .  | LOW |
150          * |-----|-----|-----|-----|
151          * |  U  |  E  |  ,  |     |
152          * |-----|-----|-----| Ent |
153          * |  L  |  N  |  M  |     |
154          * |-----|-----|-----|-----|
155          * |  J  |  H  |  K  | RAI |
156          * |-----|-----|-----|-----|
157          * | Esc | Tab | Sft | Ctl |
158          * `-----------------------'
159          */
160         [_COLEMA_LAYER] = LAYOUT_gamepad_6x4(
161                         KC_T,    KC_D,     KC_B,    KC_LALT,  \
162                         KC_R,    KC_T,     KC_V,    MO(_COLEMA_LOWER_LAYER),\
163                         KC_E,    KC_S,     KC_C,              \
164                         KC_W,    KC_R,     KC_X,    KC_SPACE, \
165                         KC_Q,    KC_A,     KC_Z,    MO(_RAISE_LAYER),\
166                         KC_GESC, KC_TAB,   KC_LSFT, KC_LCTRL),
167         [_COLEMA_LOWER_LAYER] = LAYOUT_gamepad_6x4(
168                         KC_SCLN, KC_O,     KC_SLSH, _______,  \
169                         KC_Y,    KC_I,     KC_DOT,  _______,  \
170                         KC_U,    KC_E,     KC_COMM,           \
171                         KC_L,    KC_N,     KC_M,    KC_ENTER, \
172                         KC_J,    KC_H,     KC_K,    _______,  \
173                         KC_F,    KC_G,     _______, _______),
174
175
176
177         /* Keymap _DVORAK_LAYER: Alternate default layer
178          * ,-----------------------.
179          * |  Y  |  I  |  X  | Alt |
180          * |-----|-----|-----|-----|
181          * |  P  |  U  |  K  | LOW |
182          * |-----|-----|-----|-----|
183          * |  .  |  E  |  J  |     |
184          * |-----|-----|-----| Spc |
185          * |  ,  |  O  |  Q  |     |
186          * |-----|-----|-----|-----|
187          * |  '  |  A  |  ;  | RAI |
188          * |-----|-----|-----|-----|
189          * | Esc | Tab | Sft | Ctl |
190          * `-----------------------'
191          *
192          *   And it's LOWER layer
193          * ,-----------------------.
194          * |  L  |  S  |  Z  | Alt |
195          * |-----|-----|-----|-----|
196          * |  R  |  N  |  V  | LOW |
197          * |-----|-----|-----|-----|
198          * |  C  |  T  |  W  |     |
199          * |-----|-----|-----| Ent |
200          * |  G  |  H  |  M  |     |
201          * |-----|-----|-----|-----|
202          * |  F  |  D  |  B  | RAI |
203          * |-----|-----|-----|-----|
204          * | Esc | Tab | Sft | Ctl |
205          * `-----------------------'
206          */
207         [_DVORAK_LAYER] = LAYOUT_gamepad_6x4(
208                         KC_Y,    KC_I,    KC_X,    KC_LALT,   \
209                         KC_P,    KC_U,    KC_K,    MO(_DVORAK_LOWER_LAYER),\
210                         KC_DOT,  KC_E,    KC_J,               \
211                         KC_COMM, KC_O,    KC_A,    KC_SPACE,  \
212                         KC_QUOT, KC_A,    KC_SCLN, MO(_RAISE_LAYER),\
213                         KC_GESC, KC_TAB,  KC_LSFT, KC_LCTRL),
214         [_DVORAK_LOWER_LAYER] = LAYOUT_gamepad_6x4(
215                         KC_L,    KC_S,    KC_Z,    KC_LALT, \
216                         KC_R,    KC_N,    KC_V,    _______, \
217                         KC_C,    KC_T,    KC_W,             \
218                         KC_G,    KC_H,    KC_M,    KC_ENTER,\
219                         KC_F,    KC_D,    KC_B,    _______, \
220                         _______, _______, _______, _______),
221
222
223
224         /* Keymap _RAISE_LAYER: Additional layer to access more
225          * ,-----------------------.
226          * |  5  |  0  | del | Alt |
227          * |-----|-----|-----|-----|
228          * |  4  |  9  | ->  | LOW |
229          * |-----|-----|-----|-----|
230          * |  3  |  8  |  <- |     |
231          * |-----|-----|-----| Spc |
232          * |  2  |  7  | ->  |     |
233          * |-----|-----|-----|-----|
234          * |  1  |  6  |  <- | RAI |
235          * |-----|-----|-----|-----|
236          * | Esc | Tab | Sft | Ctl |
237          * `-----------------------'
238          */
239         [_RAISE_LAYER] = LAYOUT_gamepad_6x4(
240                         KC_5,    KC_0,   KC_BSPC,  _______, \
241                         KC_4,    KC_9,   KC_RIGHT, _______, \
242                         KC_3,    KC_8,   KC_UP,             \
243                         KC_2,    KC_7,   KC_DOWN,  _______, \
244                         KC_1,    KC_6,   KC_LEFT,  _______, \
245                         _______, _______, _______, _______),
246
247
248
249         /* Keymap _ALTER_LAYER: Function layer used to control the Leds
250          *                     and use media buttons
251          * ,----------------------------------------.
252          * | Val Dec | Bl Toggle  | Qwertz  | Super |
253          * |---------|------------|---------|-------|
254          * | Val Inc |   Bl Off   | Qwerty  |       |
255          * |---------|------------|---------|-------|
256          * | Sat Dec |   Bl On    | Colemak |       |
257          * |---------|------------|---------|       |
258          * | Sat Inc | RGB Toggle | Dvorak  |       |
259          * |---------|------------|---------|-------|
260          * | Hue Dec |  RGB Next  | Vol Dwn |       |
261          * |---------|------------|---------|-------|
262          * | Hue Inc |  RGB Prev  | Vol Up  | Reset |
263          * `----------------------------------------'
264          */
265         [_ALTER_LAYER] = LAYOUT_gamepad_6x4(
266                         RGB_VAD, BL_TOGG,  QWERTZ,  KC_LGUI, \
267                         RGB_VAI, BL_OFF,   QWERTY,  _______, \
268                         RGB_SAD, BL_ON,    COLEMAK,          \
269                         RGB_SAI, RGB_TOG,  DVORAK,  _______, \
270                         RGB_HUD, RGB_MOD,  KC_VOLD, _______, \
271                         RGB_HUI, RGB_RMOD, KC_VOLU, RESET),
272 };
273
274 // Makes sure to update the good tri-layer if a layer changes
275 uint32_t layer_state_set_user(uint32_t state) {
276         switch (biton32(default_layer_state)) {
277                 case _QWERTY_LAYER:
278                         state = update_tri_layer_state(state, _RAISE_LAYER, _QWERTY_LOWER_LAYER, _ALTER_LAYER);
279                         break;
280                 case _QWERTZ_LAYER:
281                         state = update_tri_layer_state(state, _RAISE_LAYER, _QWERTZ_LOWER_LAYER, _ALTER_LAYER);
282                         break;
283                 case _COLEMA_LAYER:
284                         state = update_tri_layer_state(state, _RAISE_LAYER, _COLEMA_LOWER_LAYER, _ALTER_LAYER);
285                         break;
286                 case _DVORAK_LAYER:
287                         state = update_tri_layer_state(state, _RAISE_LAYER, _DVORAK_LOWER_LAYER, _ALTER_LAYER);
288                         break;
289         }
290         return state;
291 }
292
293 // Makes the tri-layer
294 uint32_t default_layer_state_set_kb(uint32_t state) {
295         switch (biton32(state)) {
296                 case _QWERTY_LAYER:
297                         state = update_tri_layer_state(state, _RAISE_LAYER, _QWERTZ_LOWER_LAYER, _ALTER_LAYER);
298                         state = update_tri_layer_state(state, _RAISE_LAYER, _COLEMA_LOWER_LAYER, _ALTER_LAYER);
299                         state = update_tri_layer_state(state, _RAISE_LAYER, _DVORAK_LOWER_LAYER, _ALTER_LAYER);
300                         layer_move(_QWERTY_LAYER);
301                         break;
302                 case _QWERTZ_LAYER:
303                         state = update_tri_layer_state(state, _RAISE_LAYER, _QWERTY_LOWER_LAYER, _ALTER_LAYER);
304                         state = update_tri_layer_state(state, _RAISE_LAYER, _COLEMA_LOWER_LAYER, _ALTER_LAYER);
305                         state = update_tri_layer_state(state, _RAISE_LAYER, _DVORAK_LOWER_LAYER, _ALTER_LAYER);
306                         layer_move(_QWERTZ_LAYER);
307                         break;
308                 case _COLEMA_LAYER:
309                         state = update_tri_layer_state(state, _RAISE_LAYER, _QWERTY_LOWER_LAYER, _ALTER_LAYER);
310                         state = update_tri_layer_state(state, _RAISE_LAYER, _QWERTZ_LOWER_LAYER, _ALTER_LAYER);
311                         state = update_tri_layer_state(state, _RAISE_LAYER, _DVORAK_LOWER_LAYER, _ALTER_LAYER);
312                         layer_move(_COLEMA_LAYER);
313                         break;
314                 case _DVORAK_LAYER:
315                         state = update_tri_layer_state(state, _RAISE_LAYER, _QWERTY_LOWER_LAYER, _ALTER_LAYER);
316                         state = update_tri_layer_state(state, _RAISE_LAYER, _QWERTZ_LOWER_LAYER, _ALTER_LAYER);
317                         state = update_tri_layer_state(state, _RAISE_LAYER, _COLEMA_LOWER_LAYER, _ALTER_LAYER);
318                         layer_move(_DVORAK_LAYER);
319                         break;
320         }
321         return state;
322 }
323
324 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
325         switch (keycode) {
326                 case BL_TOGG:
327                         if (record->event.pressed) {
328                                 cospad_bl_led_togg();
329                         }
330                         return false;
331                 case BL_ON:
332                         if (record->event.pressed) {
333                                 cospad_bl_led_on();
334                         }
335                         return false;
336                 case BL_OFF:
337                         if (record->event.pressed) {
338                                 cospad_bl_led_off();
339                         }
340                         return false;
341                 case QWERTY:
342                         if (record->event.pressed) {
343                                 set_single_persistent_default_layer(_QWERTY_LAYER);
344                                 print("switched to QWERTY layout\n");
345                         }
346                         return false;
347                         break;
348                 case QWERTZ:
349                         if (record->event.pressed) {
350                                 set_single_persistent_default_layer(_QWERTZ_LAYER);
351                         }
352                         return false;
353                         break;
354                 case COLEMAK:
355                         if (record->event.pressed) {
356                                 set_single_persistent_default_layer(_COLEMA_LAYER);
357                         }
358                         return false;
359                         break;
360                 case DVORAK:
361                         if (record->event.pressed) {
362                                 set_single_persistent_default_layer(_DVORAK_LAYER);
363                         }
364                         return false;
365                         break;
366                 default:
367                         return true;
368         }
369 }