]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/ergodox_ez/keymaps/bocaj/keymap.c
Keymap: Bocaj Ergodox Updates (#3364)
[qmk_firmware.git] / keyboards / ergodox_ez / keymaps / bocaj / keymap.c
1 /*
2 Copyright 2018 Jacob Jerrell <jacob.jerrell@gmail.com>
3 This program is free software: you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation, either version 2 of the License, or
6 (at your option) any later version.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10 GNU General Public License for more details.
11 You should have received a copy of the GNU General Public License
12 along with this program.  If not, see <http://www.gnu.org/licenses/>.
13 */
14 #include QMK_KEYBOARD_H
15 #include "bocaj.h"
16
17 #ifdef UNICODEMAP_ENABLE
18 #include "bocaj_unicode.h"
19 #endif // UNICODEMAP_ENABLE
20
21 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
22 /* Software Workman / QWERTY - http://www.keyboard-layout-editor.com/#/gists/b6c016a22a9d31381a276a603a42fe5f
23             .---------------------------------------------.                                              .---------------------------------------------.
24             |  ESC  |  1  |  2  |  3  |  4  |  5  |   ->  |                                              !   -   |  6  |  7  |  8  |  9  |  0  |   =   |
25             !-------+-----+-----+-----+-----+-------------!                                              !-------+-----+-----+-----+-----+-----+-------!
26             |  DEL  |  Q  |  W  |  E  |  R  |  T  |   (   |                                              !   )   |  Y  |  U  |  I  |  O  |  P  |   \   |
27             !-------+-----+-----+-----x-----x-----!       !                                              !       !-----x-----x-----+-----+-----+-------!
28             | ADJST |  A  |  S  |  D  |  F  |  G  |-------!                                              !-------!  H  |  J  |  K  |  L  |  ;  |   '   |
29             !-------+-----+-----+-----x-----x-----!  HYP  !                                              !  MEH  !-----x-----x-----+-----+-----+-------!
30             | SHIFT |  Z  |  X  |  C  |  V  |  B  |   {   |                                              !   }   |  N  |  M  |  ,  |  .  |  /  | SHIFT |
31             '-------+-----+-----+-----+-----+-------------'                                              '-------------+-----+-----+-----+-----+-------'
32              | GAME | NUM | VRS |  UP | LFT | .---------------.                                      .---------------. ! RGT | DWN | RSE | LWR | ADJ  |
33              '------------------------------' |   APP | HOME  |                                      !  PGUP |  ESC  | '------------------------------'
34                                       .-------+-------+-------!                                      !-------+-------+-------.
35                                       ! SPACE !       |  END  |                                      !  PGDN |       ! ENTER !
36                                       !   /   ! BSPCE !-------!                                      !-------!  TAB  !   /   !
37                                       | LOWER |       | COPY  |                                      ! PASTE |       | RAISE |
38                                       '-----------------------'                                      '-----------------------'
39 */
40   [_SWRKMN] = LAYOUT_ergodox_pretty_wrapper(
41     KC_ESC, ______________________NUMBER_LEFT________________________, JJ_ARRW,    KC_MINUS, ______________________NUMBER_RIGHT_______________________, KC_EQUAL,
42     KC_DEL, _______________________SWORKMAN_L1_______________________, KC_LPRN,    KC_RPRN,  _______________________SWORKMAN_R1_______________________, KC_BSLS,
43     KC_ADJS,_______________________SWORKMAN_L2_______________________,                       _______________________SWORKMAN_R2_______________________, KC_QUOTE,
44     KC_LSFT,_______________________SWORKMAN_L3_______________________, HYP_LBK,    MEH_RBK,  _______________________SWORKMAN_R3_______________________, KC_RSFT,
45     ___________________ERGODOX_BOTTOM_LEFT___________________,                                         ___________________ERGODOX_BOTTOM_RIGHT__________________,
46                                                       ______________________ERGODOX_THUMBS_____________________
47   ),
48 /* Hardware Workman - http://www.keyboard-layout-editor.com/#/gists/7a07cb982ec3597ba3e3d947554225f1
49             .---------------------------------------------.                                              .---------------------------------------------.
50             |  ESC  |  1  |  2  |  3  |  4  |  5  |   ->  |                                              !   -   |  6  |  7  |  8  |  9  |  0  |   =   |
51             !-------+-----+-----+-----+-----+-------------!                                              !-------+-----+-----+-----+-----+-----+-------!
52             |  DEL  |  Q  |  D  |  R  |  W  |  B  |   (   |                                              !   )   |  J  |  F  |  U  |  P  |  ;  |   \   |
53             !-------+-----+-----+-----x-----x-----!       !                                              !       !-----x-----x-----+-----+-----+-------!
54             | ADJST |  A  |  S  |  H  |  T  |  G  |-------!                                              !-------!  Y  |  N  |  E  |  O  |  I  |   '   |
55             !-------+-----+-----+-----x-----x-----!  HYP  !                                              !  MEH  !-----x-----x-----+-----+-----+-------!
56             | SHIFT |  Z  |  X  |  M  |  C  |  V  |   {   |                                              !   }   |  K  |  L  |  ,  |  .  |  /  | SHIFT |
57             '-------+-----+-----+-----+-----+-------------'                                              '-------------+-----+-----+-----+-----+-------'
58              | GAME | NUM | VRS |  UP | LFT | .---------------.                                      .---------------. ! RGT | DWN | RSE | LWR | ADJ  |
59              '------------------------------' |   APP | HOME  |                                      !  PGUP |  ESC  | '------------------------------'
60                                       .-------+-------+-------!                                      !-------+-------+-------.
61                                       ! SPACE !       |  END  |                                      !  PGDN |       ! ENTER !
62                                       !   /   ! BSPCE !-------!                                      !-------!  TAB  !   /   !
63                                       | LOWER |       | COPY  |                                      ! PASTE |       | RAISE |
64                                       '-----------------------'                                      '-----------------------'
65 */
66   [_HWRKMN] = LAYOUT_ergodox_pretty_wrapper(
67     KC_ESC, ______________________NUMBER_LEFT________________________, JJ_ARRW,    KC_MINUS, ______________________NUMBER_RIGHT_______________________, KC_EQUAL,
68     KC_DEL, _______________________HWORKMAN_L1_______________________, KC_LPRN,    KC_RPRN,  _______________________HWORKMAN_R1_______________________, KC_BSLS,
69     KC_ADJS,_______________________HWORKMAN_L2_______________________,                       _______________________HWORKMAN_R2_______________________, KC_QUOTE,
70     KC_LSFT,_______________________HWORKMAN_L3_______________________, HYP_LBK,    MEH_RBK,  _______________________HWORKMAN_R3_______________________, KC_RSFT,
71     ___________________ERGODOX_BOTTOM_LEFT___________________,                                         ___________________ERGODOX_BOTTOM_RIGHT__________________,
72                                                       ______________________ERGODOX_THUMBS_____________________
73   ),
74 /* Lower - http://www.keyboard-layout-editor.com/#/gists/f1d745a88d1c48ab55e095efd9e7a43a
75             .---------------------------------------------.                                              .---------------------------------------------.
76             |       | F1  | F2  | F3  | F4  | F5  |       |                                              !       |  F6 | F7  | F8  | F9  | F10 |       |
77             !-------+-----+-----+-----+-----+-------------!                                              !-------+-----+-----+-----+-----+-----+-------!
78             |   `   |  1  |  2  |  3  |  4  |  5  |       |                                              !       |   6 |  7  |  8  |  9  |  0  |       |
79             !-------+-----+-----+-----x-----x-----!       !                                              !       !-----x-----x-----+-----+-----+-------!
80             |       |     |     |     |     |     |-------!                                              !-------!     |     |     |     |     |       |
81             !-------+-----+-----+-----x-----x-----!       !                                              !       !-----x-----x-----+-----+-----+-------!
82             |       |     |     |     |     |     |       |                                              !       |     |     |     |     |     |       |
83             '-------+-----+-----+-----+-----+-------------'                                              '-------------+-----+-----+-----+-----+-------'
84              |      |     |     |     |     | .---------------.                                      .---------------. !     |     |     |     |      |
85              '------------------------------' |       |       |                                      !       |       | '------------------------------'
86                                       .-------+-------+-------!                                      !-------+-------+-------.
87                                       !       !       |       |                                      !       |       !       !
88                                       !       !       !-------!                                      !-------!       !       !
89                                       |       |       |       |                                      !       |       |       |
90                                       '-----------------------'                                      '-----------------------'
91 */
92   [_LOWER] = LAYOUT_ergodox_pretty_wrapper(
93     _______,_______________________FUNC_LEFT_________________________, _______,    _______, _______________________FUNC_RIGHT________________________, _______,
94     KC_GRV ,______________________NUMBER_LEFT________________________, _______,    _______, ______________________NUMBER_RIGHT_______________________, _______,
95     _______,_________________________________________________________,                      _________________________________________________________, _______,
96     _______,_________________________________________________________, _______,    _______, _________________________________________________________, _______,
97     _________________________________________________________,                                       _________________________________________________________,
98                                                       ______________________ERGODOX_THUMBS_____________________
99   ),
100 /* Raise - http://www.keyboard-layout-editor.com/#/gists/e0f591ec2ce9f24675a02d15c7048b25
101             .---------------------------------------------.                                              .---------------------------------------------.
102             |       | F1  | F2  | F3  | F4  | F5  |       |                                              !   _   |  F6 | F7  | F8  | F9  | F10 |       |
103             !-------+-----+-----+-----+-----+-------------!                                              !-------+-----+-----+-----+-----+-----+-------!
104             |   ~   |  !  |  @  |  #  |  $  |  %  |       |                                              !       |  ^  |  &  |  *  |  (  |  )  |       |
105             !-------+-----+-----+-----x-----x-----!       !                                              !       !-----x-----x-----+-----+-----+-------!
106             |       |     |     |     |     |     |-------!                                              !-------!     |     |     |     |     |       |
107             !-------+-----+-----+-----x-----x-----!       !                                              !       !-----x-----x-----+-----+-----+-------!
108             |       |     |     |     |     |     |       |                                              !       |     |     |     |     |     |       |
109             '-------+-----+-----+-----+-----+-------------'                                              '-------------+-----+-----+-----+-----+-------'
110              |      |     |     |     |     | .---------------.                                      .---------------. !     |     |     |     |      |
111              '------------------------------' |       |       |                                      !       |       | '------------------------------'
112                                       .-------+-------+-------!                                      !-------+-------+-------.
113                                       !       !       |       |                                      !       |       !       !
114                                       !       !       !-------!                                      !-------!       !       !
115                                       |       |       |       |                                      !       |       |       |
116                                       '-----------------------'                                      '-----------------------'
117 */
118   [_RAISE] = LAYOUT_ergodox_pretty_wrapper(
119     _______,_______________________FUNC_LEFT_________________________, _______,    KC_UNDS, _______________________FUNC_RIGHT________________________, _______,
120     KC_TILD,______________________SPECIAL_LEFT_______________________, _______,    _______, ______________________SPECIAL_RIGHT______________________, _______,
121     _______,_________________________________________________________,                      _________________________________________________________, _______,
122     _______,_________________________________________________________, _______,    _______, _________________________________________________________, _______,
123     _________________________________________________________,                                       _________________________________________________________,
124                                                      ______________________ERGODOX_THUMBS_____________________
125   ),
126   /* Adjust - http://www.keyboard-layout-editor.com/#/gists/dedeae17b35a5d5f745a42aaea78f007
127             .---------------------------------------------.                                              .---------------------------------------------.
128             |       |     |     |     |     |     | EPRM  |                                              !  EPRM |     |     |     |     |     |       |
129             !-------+-----+-----+-----+-----+-------------!                                              !-------+-----+-----+-----+-----+-----+-------!
130             |       |     |     |     |     |     |       |                                              !       |     |  7  |  8  |  9  |  *  |       |
131             !-------+-----+-----+-----x-----x-----!       !                                              !       !-----x-----x-----+-----+-----+-------!
132             |       | ðŸ”‡  |  ðŸ”‰  | ðŸ”Š  | LCK |     |-------!                                              !-------!     |  4  |  5  |  6  |  +  | SWRKM |
133             !-------+-----+-----+-----x-----x-----!       !                                              !       !-----x-----x-----+-----+-----+-------!
134             |       |     |     |     |     |     |       |                                              !       |     |  1  |  2  |  3  |  -  | HWRKM |
135             '-------+-----+-----+-----+-----+-------------'                                              '-------------+-----+-----+-----+-----+-------'
136              |      |     |     |     |     | .---------------.                                      .---------------. !  0  |  .  |  ,  |  =  |      |
137              '------------------------------' |       |       |                                      !       |       | '------------------------------'
138                                       .-------+-------+-------!                                      !-------+-------+-------.
139                                       !       !       |       |                                      !       |       !       !
140                                       !       !       !-------!                                      !-------!       !       !
141                                       |       |       |       |                                      !       |       |       |
142                                       '-----------------------'                                      '-----------------------'
143 */
144   [_ADJUST] = LAYOUT_ergodox_pretty_wrapper(
145     XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, KC_EPRM,    KC_EPRM, XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX,
146     XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX,    XXXXXXX,  XXXXXXX,    KC_KP_7,    KC_KP_8,    KC_KP_9,     KC_PAST, XXXXXXX,
147     _______,KC__MUTE,  KC__VOLDOWN,   KC__VOLUP,   MC_LOCK,   XXXXXXX,                       XXXXXXX,    KC_KP_4,    KC_KP_5,    KC_KP_6,     KC_PPLS, KC_SWRK,
148     XXXXXXX,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, XXXXXXX,    XXXXXXX,  XXXXXXX,    KC_KP_1,    KC_KP_2,    KC_KP_3,     KC_PMNS, KC_HWRK,
149     XXXXXXX,_______,XXXXXXX,XXXXXXX,XXXXXXX,                                                              KC_KP_0,    KC_PDOT,    KC_COMM,     KC_PEQL, _______,
150                                                      ______________________ERGODOX_THUMBS_____________________
151   ),
152 // Diablo - http://www.keyboard-layout-editor.com/#/gists/28476e4237e77d4835ac8a9d7e5f9b2c
153   [_DIABLO] = LAYOUT_ergodox_pretty_wrapper(
154     KC_ESC , KC_V        , KC_D      ,XXXXXXX   ,XXXXXXX   ,XXXXXXX   ,XXXXXXX,    XXXXXXX,  XXXXXXX,    XXXXXXX,    XXXXXXX,    XXXXXXX,     XXXXXXX, XXXXXXX,
155     KC_TAB , KC_S        , KC_I      , KC_F     , KC_T     , KC_J     ,XXXXXXX,    XXXXXXX,  XXXXXXX,    KC_KP_7,    KC_KP_8,    KC_KP_9,     XXXXXXX, XXXXXXX,
156     KC_Q   , KC_1        , KC_2      , KC_3     , KC_4     , KC_M     ,                      XXXXXXX,    KC_KP_4,    KC_KP_5,    KC_KP_6,     XXXXXXX, XXXXXXX,
157     KC_LSFT,KC_D3_1      ,KC_D3_2    ,KC_D3_3   ,KC_D3_4   ,XXXXXXX   ,XXXXXXX,    XXXXXXX,  XXXXXXX,    KC_KP_1,    KC_KP_2,    KC_KP_3,     XXXXXXX, XXXXXXX,
158     _______,ALT_T(KC_Z)  ,KC_G       ,KC_Y      ,XXXXXXX   ,                                             KC_KP_0,    XXXXXXX,    XXXXXXX,     XXXXXXX, XXXXXXX,
159                                                               XXXXXXX, XXXXXXX,    XXXXXXX,XXXXXXX,
160                                                                        XXXXXXX,    XXXXXXX,
161                                                KC_BTN1,KC_BTN2,KC_DIABLO_CLEAR,    XXXXXXX,XXXXXXX,XXXXXXX
162   )
163 };
164
165 // Defines actions for my custom keycodes
166 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
167   switch (keycode) {
168     // KC_COPY and KC_PASTE have problems with different hardware/software mappings
169     // e.g. If the mappings conflict, KC_COPY will send Cmd+M which minimizes the
170     // window and is very annoying. JJ_COPY and JJ_PASTE fix this by sending the
171     // raw character rather than the KC_* code
172     case JJ_COPY:
173       if (!record->event.pressed) {
174         SEND_STRING(SS_LGUI("c"));
175       }
176       return false;
177       break;
178     case JJ_PASTE:
179       if (!record->event.pressed) {
180         SEND_STRING(SS_LGUI("v"));
181       }
182       return false;
183       break;
184     case JJ_ARRW:
185       if (!record->event.pressed) {
186         SEND_STRING("->");
187       }
188       return false;
189       break;
190     case KC_SWRK:
191       if (!record->event.pressed) {
192         set_single_persistent_default_layer(_SWRKMN);
193         layer_move(_SWRKMN);
194         ergodox_blink_all_leds();
195         ergodox_blink_all_leds();
196       }
197       return false;
198       break;
199     case KC_HWRK:
200       if (!record->event.pressed) {
201         set_single_persistent_default_layer(_HWRKMN);
202         layer_move(_HWRKMN);
203         ergodox_blink_all_leds();
204         ergodox_blink_all_leds();
205       }
206       return false;
207       break;
208     case KC_EPRM:
209       if (!record->event.pressed) {
210         ergodox_blink_all_leds();
211         eeconfig_init();
212       }
213       return false;
214       break;
215     case MC_LOCK:
216       if (!record->event.pressed) {
217         layer_move(_HWRKMN);
218         SEND_STRING(SS_LCTRL(SS_LGUI("q")));
219       }
220       return false;
221       break;
222     case KC_DIABLO_CLEAR:
223 #ifdef TAP_DANCE_ENABLE
224       if (record->event.pressed) {
225         uint8_t dtime;
226         for (dtime = 0; dtime < 4; dtime++) {
227           diablo_key_time[dtime] = diablo_times[0];
228         }
229       }
230 #endif // TAP_DANCE_ENABLE
231       return false;
232       break;
233   }
234   return true;
235 }
236
237 void tap(uint16_t keycode){ register_code(keycode); unregister_code(keycode); };
238
239 // Diablo III Fun stuff
240 //define diablo macro timer variables
241 uint16_t diablo_timer[4];
242 uint8_t diablo_times[] = { 0, 1, 3, 5, 10, 30 };
243 uint8_t diablo_key_time[4];
244
245 // has the correct number of seconds elapsed (as defined by diablo_times)
246 bool check_dtimer(uint8_t dtimer) { return (timer_elapsed(diablo_timer[dtimer]) < (diablo_key_time[dtimer] * 1000)) ? false : true; };
247
248 // Cycle through the times for the macro, starting at 0, for disabled.
249 // Max of six values, so don't exceed
250 void diablo_tapdance_master(qk_tap_dance_state_t *state, void *user_data, uint8_t diablo_key) {
251   if (state->count >= 7) {
252     diablo_key_time[diablo_key] = diablo_times[0];
253     reset_tap_dance(state);
254   }  else {
255     diablo_key_time[diablo_key] = diablo_times[state->count - 1];
256   }
257 }
258
259 // Would rather have one function for all of this, but no idea how to do that...
260 void diablo_tapdance1(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 0); }
261 void diablo_tapdance2(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 1); }
262 void diablo_tapdance3(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 2); }
263 void diablo_tapdance4(qk_tap_dance_state_t *state, void *user_data) { diablo_tapdance_master(state, user_data, 3); }
264
265 //Tap Dance Definitions
266 qk_tap_dance_action_t tap_dance_actions[] = {
267   // tap once to disable, and more to enable timed micros
268   [TD_D3_1] = ACTION_TAP_DANCE_FN(diablo_tapdance1),
269   [TD_D3_2] = ACTION_TAP_DANCE_FN(diablo_tapdance2),
270   [TD_D3_3] = ACTION_TAP_DANCE_FN(diablo_tapdance3),
271   [TD_D3_4] = ACTION_TAP_DANCE_FN(diablo_tapdance4),
272 };
273
274 // Sends the key press to system, but only if on the Diablo layer
275 void send_diablo_keystroke(uint8_t diablo_key) {
276   if (biton32(layer_state) == _DIABLO) {
277     switch (diablo_key) {
278       case 0:
279         tap(KC_1); break;
280       case 1:
281         tap(KC_2); break;
282       case 2:
283         tap(KC_3); break;
284       case 3:
285         tap(KC_4); break;
286     }
287   }
288 }
289
290 // Checks each of the 4 timers/keys to see if enough time has elapsed
291 // Runs the "send string" command if enough time has passed, and resets the timer.
292 void run_diablo_macro_check(void) {
293   uint8_t dtime;
294   for (dtime = 0; dtime < 4; dtime++) {
295     if (check_dtimer(dtime) && diablo_key_time[dtime]) {
296       diablo_timer[dtime] = timer_read();
297       send_diablo_keystroke(dtime);
298     }
299   }
300 }
301
302 void matrix_scan_user(void) {
303   uint8_t layer = biton32(layer_state);
304   ergodox_board_led_off();
305   ergodox_right_led_1_off();
306   ergodox_right_led_2_off();
307   ergodox_right_led_3_off();
308   switch (layer) {
309   /*
310     Lights are treated as binary here for easy identification.
311     LED1 = 4; LED2 = 2; LED1 = 1
312     This allows for up to 8 identified layers (default layers being no lights on)
313     Which is way more than I should ever need
314   */
315     case _LOWER:
316       ergodox_right_led_3_on();
317       ergodox_right_led_3_set(10); // Default brightness is deadly in a dark room
318       break;
319     case _RAISE:
320       ergodox_right_led_2_on();
321       ergodox_right_led_2_set(10);
322       break;
323     case _ADJUST:
324       ergodox_right_led_2_on();
325       ergodox_right_led_2_set(10);
326       ergodox_right_led_3_on();
327       ergodox_right_led_3_set(10);
328       break;
329     case _DIABLO:
330       ergodox_right_led_1_on();
331       ergodox_right_led_1_set(10);
332       break;
333     default:
334       // none
335       break;
336   }
337   #ifdef TAP_DANCE_ENABLE
338     run_diablo_macro_check();
339   #endif
340 };