2020 February 29 Breaking Changes Update (#8064)
[jackhill/qmk/firmware.git] / keyboards / planck / keymaps / pete / keymap.c
1
2 #include QMK_KEYBOARD_H
3
4 extern keymap_config_t keymap_config;
5
6 // Each layer gets a name for readability, which is then used in the keymap matrix below.
7 // The underscores don't mean anything - you can have a layer called STUFF or any other name.
8 // Layer names don't all need to be of the same length, obviously, and you can also skip them
9 // entirely and just use numbers.
10 #define _QWERTY 0
11 #define _COLEMAK 1
12 #define _DVORAK 2
13 #define _LOWER 3
14 #define _RAISE 4
15 #define _FCT 5
16 #define _SETUP 6
17 #define _MAC 7
18 #define _WIN 8
19 #define _LIN 9
20 #define _MICMUTE 16
21 #define _OS 17
22
23
24 // Macro name shortcuts
25 #define QWERTY M(_QWERTY)
26 #define COLEMAK M(_COLEMAK)
27 #define DVORAK M(_DVORAK)
28 #define LOWER M(_LOWER)
29 #define RAISE M(_RAISE)
30 #define FCT M(_FCT)
31 #define OS M(_OS)
32 #define MAC M(_MAC)
33 #define WIN M(_WIN)
34 #define LIN M(_LIN)
35 #define MICMUTE M(_MICMUTE)
36
37 #define MACPRNT LGUI(LSFT(KC_3))
38 #define MACPRNT2 LGUI(LSFT(KC_4))
39 #define WINPRNT KC_PSCR
40 #define WINPRNT2 LGUI(KC_PSCR)
41 #define CYCLWIN LGUI(KC_GRV)
42 #define MACSLEEP LSFT(LCTL(KC_POWER))
43 #define WINSLEEP KC_SLEP
44
45 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
46
47 [_QWERTY] = LAYOUT_planck_grid(
48 KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
49 KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
50 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT ,
51 OS, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
52 ),
53
54 [_COLEMAK] = LAYOUT_planck_grid(
55 KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC,
56 KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
57 KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT ,
58 OS, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
59 ),
60
61 [_DVORAK] = LAYOUT_planck_grid(
62 KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC,
63 KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH,
64 KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT ,
65 OS, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
66 ),
67
68 [_LOWER] = LAYOUT_planck_grid(
69 KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC,
70 _______, _______, _______, _______, _______, _______, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
71 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
72 _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
73 ),
74
75 [_RAISE] = LAYOUT_planck_grid(
76 KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
77 _______, _______, _______, _______, _______, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
78 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
79 _RAISE, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
80 ),
81
82 [_SETUP] = LAYOUT_planck_grid( /* Setup */
83 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
84 _______, _______, _______, WIN, MAC, _______, _______, QWERTY, COLEMAK, DVORAK, _______, _______,
85 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
86 _______, _______, _______, _______, _______, RESET, RESET, _______, _______, _______, _______, _______
87 ),
88 [_MAC] = LAYOUT_planck_grid( /* Mac */
89 CYCLWIN,MACSLEEP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_DEL ,
90 _______, MICMUTE, KC_MUTE, KC_VOLD, KC_VOLU, MACPRNT,MACPRNT2, KC_F5, KC_F6, KC_F7, KC_F8, XXXXXXX,
91 _______, BL_STEP, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX,
92 _______, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_PGDOWN,KC_PGUP,KC_END
93 ),
94 [_WIN] = LAYOUT_planck_grid( /* Windows */
95 CYCLWIN,WINSLEEP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_DEL ,
96 _______, MICMUTE, KC_MUTE, KC_VOLD, KC_VOLU, WINPRNT,WINPRNT2, KC_F5, KC_F6, KC_F7, KC_F8, XXXXXXX,
97 _______, BL_STEP, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX,
98 _______, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_PGDOWN,KC_PGUP,KC_END
99 ),
100 [_LIN] = LAYOUT_planck_grid( /* Linux */
101 KC_L, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
102 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
103 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
104 _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
105 )
106
107 };
108
109 int currentOs = _MAC;
110
111 #ifdef AUDIO_ENABLE
112
113 float tone_startup[][2] = {
114 {440.0*pow(2.0,(31)/12.0), 12},
115 {440.0*pow(2.0,(28)/12.0), 8},
116 {440.0*pow(2.0,(19)/12.0), 8},
117 {440.0*pow(2.0,(24)/12.0), 8},
118 {440.0*pow(2.0,(28)/12.0), 20}
119 };
120
121 float tone_qwerty[][2] = SONG(QWERTY_SOUND);
122 float tone_dvorak[][2] = SONG(DVORAK_SOUND);
123 float tone_colemak[][2] = SONG(COLEMAK_SOUND);
124 float tone_plover[][2] = SONG(PLOVER_SOUND);
125 float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND);
126
127 float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
128 float goodbye[][2] = SONG(GOODBYE_SOUND);
129 #endif
130
131
132 void persistent_default_layer_set(uint16_t default_layer) {
133 eeconfig_update_default_layer(default_layer);
134 default_layer_set(default_layer);
135 }
136
137 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
138 {
139 switch(id) {
140 case _QWERTY:
141 if (record->event.pressed) {
142 #ifdef AUDIO_ENABLE
143 PLAY_SONG(tone_qwerty);
144 #endif
145 persistent_default_layer_set(1UL<<_QWERTY);
146 }
147 break;
148 case _COLEMAK:
149 if (record->event.pressed) {
150 #ifdef AUDIO_ENABLE
151 PLAY_SONG(tone_colemak);
152 #endif
153 persistent_default_layer_set(1UL<<_COLEMAK);
154 }
155 break;
156 case _DVORAK:
157 if (record->event.pressed) {
158 #ifdef AUDIO_ENABLE
159 PLAY_SONG(tone_dvorak);
160 #endif
161 persistent_default_layer_set(1UL<<_DVORAK);
162 }
163 break;
164 case _LOWER:
165 if (record->event.pressed) {
166 layer_on(_LOWER);
167 update_tri_layer(_LOWER, _RAISE, _SETUP);
168 } else {
169 layer_off(_LOWER);
170 update_tri_layer(_LOWER, _RAISE, _SETUP);
171 }
172 break;
173 case _RAISE:
174 if (record->event.pressed) {
175 layer_on(_RAISE);
176 update_tri_layer(_LOWER, _RAISE, _SETUP);
177 } else {
178 layer_off(_RAISE);
179 update_tri_layer(_LOWER, _RAISE, _SETUP);
180 }
181 break;
182 case _FCT:
183 if (record->event.pressed) {
184 layer_on(_FCT);
185 } else {
186 layer_off(_FCT);
187 }
188 break;
189 case _MICMUTE:
190 if (record->event.pressed) {
191 register_code(KC_RSFT);
192 register_code(KC_RCTL);
193 register_code(KC_RALT);
194 register_code(KC_RGUI);
195 } else {
196 unregister_code(KC_RSFT);
197 unregister_code(KC_RCTL);
198 unregister_code(KC_RALT);
199 unregister_code(KC_RGUI);
200 }
201 break;
202 case _OS:
203 if (record->event.pressed) {
204 layer_on(currentOs);
205 } else {
206 layer_off(_MAC);
207 layer_off(_WIN);
208 layer_off(_LIN);
209 }
210 break;
211 case _MAC:
212 case _WIN:
213 case _LIN:
214 if (record->event.pressed) {
215 layer_off(currentOs);
216 currentOs = id;
217 }
218 break;
219 }
220 return MACRO_NONE;
221 };
222
223 void matrix_init_user(void) {
224 #ifdef AUDIO_ENABLE
225 _delay_ms(20); // stops the tick
226 PLAY_SONG(tone_startup);
227 #endif
228 }
229
230 #ifdef AUDIO_ENABLE
231 void play_goodbye_tone()
232 {
233 PLAY_SONG(goodbye);
234 _delay_ms(150);
235 }
236
237 uint8_t starting_note = 0x0C;
238 int offset = 0;
239
240 bool process_action_user(keyrecord_t *record) {
241
242 if (IS_LAYER_ON(_MUSIC)) {
243 if (record->event.pressed) {
244 play_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
245 } else {
246 stop_note(((double)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
247 }
248 return false;
249 }
250 return true;
251 }
252 #endif