]> git.donarmstrong.com Git - qmk_firmware.git/blob - layouts/community/planck_mit/don/keymap.c
e6790e540771e7d2c66c0a22906adc319e4f6128
[qmk_firmware.git] / layouts / community / planck_mit / don / keymap.c
1 // This is the canonical layout file for the Quantum project. If you want to add another keyboard,
2 // this is the style you want to emulate.
3
4 #include "planck.h"
5 #include "action_layer.h"
6 #ifdef AUDIO_ENABLE
7   #include "audio.h"
8 #endif
9 #include "eeconfig.h"
10
11 extern keymap_config_t keymap_config;
12
13 // Each layer gets a name for readability, which is then used in the keymap matrix below.
14 // The underscores don't mean anything - you can have a layer called STUFF or any other name.
15 // Layer names don't all need to be of the same length, obviously, and you can also skip them
16 // entirely and just use numbers.
17 #define _QWERTY 0
18 #define _COLEMAK 1
19 #define _DVORAK 2
20 #define _LOWER 3
21 #define _RAISE 4
22 #define _PLOVER 5
23 #define _MOUSE 6
24 #define _ADJUST 16
25
26 enum planck_keycodes {
27   QWERTY = SAFE_RANGE,
28   COLEMAK,
29   DVORAK,
30   PLOVER,
31   LOWER,
32   RAISE,
33   BACKLIT,
34   EXT_PLV
35 };
36
37 // Fillers to make layering more clear
38 #define _______ KC_TRNS
39 #define XXXXXXX KC_NO
40
41 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
42
43 /* Qwerty
44  * ,-----------------------------------------------------------------------------------.
45  * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Bksp |
46  * |------+------+------+------+------+-------------+------+------+------+------+------|
47  * | Ctrl |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |Enter |
48  * |------+------+------+------+------+------|------+------+------+------+------+------|
49  * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  | '    |
50  * |------+------+------+------+------+------+------+------+------+------+------+------|
51  * | LOWER|RAISE | ESC  | LALT  |LGUI |    Space    | RGUI | Left | Down |  Up  |Right |
52  * `-----------------------------------------------------------------------------------'
53  */
54 [_QWERTY] = {
55   {KC_TAB, KC_Q,  KC_W,   KC_E,   KC_R,  KC_T,  KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,KC_BSPC},
56   {KC_LCTL,KC_A,  KC_S,   KC_D,   KC_F,  KC_G,  KC_H,   KC_J,   KC_K,   KC_L,KC_SCLN,KC_ENT },
57   {KC_LSFT,KC_Z,  KC_X,   KC_C,   KC_V,  KC_B,  KC_N,   KC_M,KC_COMM, KC_DOT,KC_SLSH,KC_QUOT},
58   {LT(_MOUSE,KC_ESC),KC_LGUI,KC_LALT,LOWER, RAISE,KC_SPC,KC_SPC,KC_RGUI,KC_LEFT,KC_DOWN,  KC_UP,KC_RGHT}
59 },
60
61
62 /* Lower
63  * ,-----------------------------------------------------------------------------------.
64  * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Del  |
65  * |------+------+------+------+------+-------------+------+------+------+------+------|
66  * | Ctrl  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |Enter|
67  * |------+------+------+------+------+------|------+------+------+------+------+------|
68  * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO ~ |ISO | |      |      | |    |
69  * |------+------+------+------+------+------+------+------+------+------+------+------|
70  * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
71  * `-----------------------------------------------------------------------------------'
72  */
73 [_LOWER] = {
74   {KC_TILD,KC_EXLM,KC_AT,  KC_HASH, KC_DLR,KC_PERC,KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN,KC_DEL},
75   {KC_LCTL, KC_F1,  KC_F2,  KC_F3,    KC_F4,  KC_F5,  KC_F6,KC_UNDS,KC_PLUS,KC_LCBR,KC_RCBR,_______},
76   {_______,KC_F7,  KC_F8,  KC_F9,   KC_F10, KC_F11, KC_F12,_______,_______,_______,_______,KC_PIPE},
77   {_______,_______,_______,_______,_______,_______,_______,_______,KC_MNXT,KC_VOLD,KC_VOLU,KC_MPLY}
78 },
79
80 /* Raise
81  * ,-----------------------------------------------------------------------------------.
82  * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Del  |
83  * |------+------+------+------+------+-------------+------+------+------+------+------|
84  * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  | Enter|
85  * |------+------+------+------+------+------|------+------+------+------+------+------|
86  * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |ISO # |ISO / |      |      | \    |
87  * |------+------+------+------+------+------+------+------+------+------+------+------|
88  * |      |      |      |      |      |             |      | HOME | PGDN | PGUP | END  |
89  * `-----------------------------------------------------------------------------------'
90  */
91 [_RAISE] = {
92   {KC_GRV, KC_1,      KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,   KC_0,KC_DEL},
93   {KC_DEL, KC_F1,    KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,KC_MINS, KC_EQL,KC_LBRC,KC_RBRC,_______},
94   {_______,KC_F7,    KC_F8,  KC_F9, KC_F10, KC_F11, KC_F12,KC_NUHS,KC_NUBS,_______,_______,KC_BSLS},
95   {_______,_______,_______,_______,_______,_______,_______,_______,KC_HOME,KC_PGDN,KC_PGUP,KC_END}
96 },
97
98 /* Plover layer (http://opensteno.org)
99  * ,-----------------------------------------------------------------------------------.
100  * |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |
101  * |------+------+------+------+------+-------------+------+------+------+------+------|
102  * |      |   S  |   T  |   P  |   H  |   *  |   *  |   F  |   P  |   L  |   T  |   D  |
103  * |------+------+------+------+------+------|------+------+------+------+------+------|
104  * |TogOut|   S  |   K  |   W  |   R  |   *  |   *  |   R  |   B  |   G  |   S  |   Z  |
105  * |------+------+------+------+------+------+------+------+------+------+------+------|
106  * | Exit |      |      |   A  |   O  |             |   E  |   U  |      |      |      |
107  * `-----------------------------------------------------------------------------------'
108  */
109
110 [_PLOVER] = {
111   {KC_1,   KC_1,   KC_1,   KC_1,   KC_1,   KC_1,   KC_1,   KC_1,   KC_1,   KC_1,   KC_1,   KC_1   },
112   {XXXXXXX,KC_Q,   KC_W,   KC_E,   KC_R,   KC_T,   KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,   KC_LBRC},
113   {XXXXXXX,KC_A,   KC_S,   KC_D,   KC_F,   KC_G,   KC_H,   KC_J,   KC_K,   KC_L,   KC_SCLN,KC_QUOT},
114   {EXT_PLV, XXXXXXX, XXXXXXX,KC_C,   KC_V,    XXXXXXX, XXXXXXX,KC_N,   KC_M,    XXXXXXX, XXXXXXX, XXXXXXX}
115 },
116
117 /* Mouse layer
118  * ,-----------------------------------------------------------------------------------.
119  * |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |   #  |
120  * |------+------+------+------+------+-------------+------+------+------+------+------|
121  * |      |   S  |   T  |   P  |   H  |   *  |   *  |   F  |   P  |   L  |   T  |   D  |
122  * |------+------+------+------+------+------|------+------+------+------+------+------|
123  * |      |   S  |   K  |   W  |   R  |   *  |   *  |   R  |   B  |   G  |   S  |   Z  |
124  * |------+------+------+------+------+------+------+------+------+------+------+------|
125  * | Exit |      |      |   A  |   O  |             |   E  |   U  |      |      |      |
126  * `-----------------------------------------------------------------------------------'
127  */
128
129 [_MOUSE] = {
130   {_______,_______,_______,_______,_______,_______,KC_ACL0,_______,KC_WH_D,KC_WH_U,_______,_______},
131   {_______,KC_BTN4,KC_BTN2,KC_BTN3,KC_BTN1,_______,KC_ACL1,KC_MS_L,KC_MS_D,KC_MS_U,KC_MS_R,KC_LBRC},     
132   {_______,_______,_______,_______,_______,_______,KC_ACL2,_______,_______,_______,_______,_______},
133   {_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______}
134 },
135
136 /* ADJUST (Lower + Raise)
137  * ,-----------------------------------------------------------------------------------.
138  * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
139  * |------+------+------+------+------+-------------+------+------+------+------+------|
140  * |      |      |      |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak|Plover|      |
141  * |------+------+------+------+------+------|------+------+------+------+------+------|
142  * |      |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof|      |      |      |      |      |
143  * |------+------+------+------+------+------+------+------+------+------+------+------|
144  * |      |      |      |      |      |             |      |      |      |      |      |
145  * `-----------------------------------------------------------------------------------'
146  */
147 [_ADJUST] = {
148   {_______,  RESET,_______,_______,_______,_______,_______,_______,_______,_______,_______, KC_DEL},
149   {_______,_______,_______,  AU_ON, AU_OFF,AG_NORM,AG_SWAP, QWERTY,_______,_______, PLOVER,_______},
150   {_______, MUV_DE,  MUV_IN, MU_ON, MU_OFF,  MI_ON, MI_OFF,_______,_______,_______,_______,_______},
151   {_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______}
152 }
153
154
155 };
156
157 #ifdef AUDIO_ENABLE
158
159 float tone_startup[][2]    = SONG(STARTUP_SOUND);
160 float tone_qwerty[][2]     = SONG(QWERTY_SOUND);
161 float tone_dvorak[][2]     = SONG(DVORAK_SOUND);
162 float tone_colemak[][2]    = SONG(COLEMAK_SOUND);
163 float tone_plover[][2]     = SONG(PLOVER_SOUND);
164 float tone_plover_gb[][2]  = SONG(PLOVER_GOODBYE_SOUND);
165 float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND);
166
167 float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
168 #endif
169
170
171 void persistant_default_layer_set(uint16_t default_layer) {
172   eeconfig_update_default_layer(default_layer);
173   default_layer_set(default_layer);
174 }
175
176 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
177   switch (keycode) {
178     case QWERTY:
179       if (record->event.pressed) {
180         #ifdef AUDIO_ENABLE
181         PLAY_SONG(tone_qwerty);
182         #endif
183         persistant_default_layer_set(1UL<<_QWERTY);
184       }
185       return false;
186       break;
187     case COLEMAK:
188       if (record->event.pressed) {
189         #ifdef AUDIO_ENABLE
190         PLAY_SONG(tone_colemak);
191         #endif
192         persistant_default_layer_set(1UL<<_COLEMAK);
193       }
194       return false;
195       break;
196     case DVORAK:
197       if (record->event.pressed) {
198         #ifdef AUDIO_ENABLE
199         PLAY_SONG(tone_dvorak);
200         #endif
201         persistant_default_layer_set(1UL<<_DVORAK);
202       }
203       return false;
204       break;
205     case LOWER:
206       if (record->event.pressed) {
207         layer_on(_LOWER);
208         update_tri_layer(_LOWER, _RAISE, _ADJUST);
209       } else {
210         layer_off(_LOWER);
211         update_tri_layer(_LOWER, _RAISE, _ADJUST);
212       }
213       return false;
214       break;
215     case RAISE:
216       if (record->event.pressed) {
217         layer_on(_RAISE);
218         update_tri_layer(_LOWER, _RAISE, _ADJUST);
219       } else {
220         layer_off(_RAISE);
221         update_tri_layer(_LOWER, _RAISE, _ADJUST);
222       }
223       return false;
224       break;
225     case BACKLIT:
226       if (record->event.pressed) {
227         register_code(KC_RSFT);
228         #ifdef BACKLIGHT_ENABLE
229           backlight_step();
230         #endif
231       } else {
232         unregister_code(KC_RSFT);
233       }
234       return false;
235       break;
236     case PLOVER:
237       if (record->event.pressed) {
238         #ifdef AUDIO_ENABLE
239           stop_all_notes();
240         PLAY_SONG(tone_plover);
241         #endif
242         layer_off(_RAISE);
243         layer_off(_LOWER);
244         layer_off(_ADJUST);
245         layer_on(_PLOVER);
246         if (!eeconfig_is_enabled()) {
247             eeconfig_init();
248         }
249         keymap_config.raw = eeconfig_read_keymap();
250         keymap_config.nkro = 1;
251         eeconfig_update_keymap(keymap_config.raw);
252       }
253       return false;
254       break;
255     case EXT_PLV:
256       if (record->event.pressed) {
257         #ifdef AUDIO_ENABLE
258         PLAY_SONG(tone_plover_gb);
259         #endif
260         layer_off(_PLOVER);
261       }
262       return false;
263       break;
264   }
265   return true;
266 }
267
268 void matrix_init_user(void) {
269     #ifdef AUDIO_ENABLE
270         startup_user();
271     #endif
272 }
273
274 #ifdef AUDIO_ENABLE
275
276 void startup_user()
277 {
278     _delay_ms(20); // gets rid of tick
279     PLAY_SONG(tone_startup);
280 }
281
282 void shutdown_user()
283 {
284   PLAY_SONG(tone_goodbye);
285     _delay_ms(150);
286     stop_all_notes();
287 }
288
289 void music_on_user(void)
290 {
291     music_scale_user();
292 }
293
294 void music_scale_user(void)
295 {
296   PLAY_SONG(music_scale);
297 }
298
299 #endif