main
  1/* vdemeester personal ergodox layout  */
  2#include QMK_KEYBOARD_H
  3#include "led.h"
  4#include "action_layer.h"
  5#include "action_util.h"
  6#include "eeconfig.h"
  7#include "keymap_bepo.h"
  8
  9/* Layers */
 10enum {
 11  BASE = 0,
 12  NMDIA,
 13  FNLR,
 14  GAME,
 15};
 16
 17/* Macros */
 18enum {
 19  MDBL0 = 0,
 20
 21  MFNLR,
 22
 23  // Cut/Copy/Paste
 24  MCUT,
 25  MCOPY,
 26  MPSTE
 27};
 28
 29/* Fn keys */
 30enum {
 31  F_BSE = 0,
 32  F_NMEDIA,
 33  F_SFT,
 34  F_ALT,
 35  F_CTRL,
 36  F_GAME
 37};
 38
 39/* States & timers */
 40uint16_t kf_timers[12];
 41
 42const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 43  /* Basic layer
 44   *
 45   * ,--------------------------------------------------.            ,---------------------------------------------------.
 46   * |   `    | 1/F1 | 2/F2 | 3/F3 | 4/F4  | 5/F5 | F11/Ins  |       | F12/%| 6/F6 | 7/F7 | 8/F8 | 9/F9 | 0/F10 |    -   |
 47   * |--------+------+------+------+-------+-------------|           |------+------+------+------+------+-------+--------|
 48   * | Tab    |   Q  |   W  |   E  |   R   |   T  |Backsp|           |Backsp|   Y  |   U  |   I  |   O  |   P   |    =   |
 49   * |--------+------+------+------+-------+------|ace   |           |ace   |------+------+------+------+-------+--------|
 50   * |   Fn   |   A  |   S  |   D  |   F   |   G  |------|           |------|   H  |   J  |   K  |   L  |   ;   | '/Shift|
 51   * |--------+------+------+------+-------+------|Enter |           |Enter |------+------+------+------+-------+--------|
 52   * | LShift |   Z  |   X  |   C  |   V   |   B  |      |           |      |   N  |   M  |   ,  |   .  |   /   | \/Shift|
 53   * `--------+------+------+------+-------+-------------'           `-------------+------+------+------+-------+--------'
 54   *   | MUTE |  V+  |  V-  | LGui | A/ESC |                                       | RAlt | MENU |  L3  |       |        |
 55   *   `-----------------------------------'                                       `-------------------------------------'
 56   *                                       ,--------------.       ,-------------.
 57   *                                       |  Del  | PgUp |       | PgUp |  Del |
 58   *                                ,------+-------+------|       |------+------+------.
 59   *                                |      |       | PgDn |       | PgDn |      |      |
 60   *                                |Space | LShft |------|       |------|RShift|Enter |
 61   *                                |      |       | Ctl  |       |  Ctl |      |      |
 62   *                                `---------------------'       `--------------------'
 63   */
 64  // If it accepts an argument (i.e, is a function), it doesn't need KC_.
 65  // Otherwise, it needs KC_*
 66  [BASE] = LAYOUT_ergodox(  // layer 0 : default
 67                  // left hand
 68		  KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_INSERT,
 69                  KC_TAB,       KC_Q,      KC_W,      KC_E,           KC_R,     KC_T,   KC_BSPC,
 70                  F(F_NMEDIA),     KC_A,      KC_S,      KC_D,           KC_F,     KC_G,
 71                  SFT_T(KC_BSLASH),      KC_Z,      KC_X,      KC_C,           KC_V,     KC_B,    KC_ENT,
 72                  KC_MUTE,  KC_VOLU,    KC_VOLD,  KC_LGUI,  ALT_T(KC_ESC),
 73
 74                  KC_DELT,  KC_PGUP,
 75                  KC_PGDN,
 76                  KC_SPC,    KC_LSHIFT,  KC_LCTL,
 77
 78                  // right hand
 79		  KC_EQUAL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
 80                  KC_BSPC,     KC_Y,   KC_U,    KC_I,    KC_O,    KC_P,     KC_LBRACKET,
 81                  KC_H,   KC_J,    KC_K,    KC_L,    KC_SCLN,  SFT_T(KC_QUOT),
 82                  KC_ENT,      KC_N,   KC_M,    KC_COMM, KC_DOT,  KC_SLSH,  KC_RBRACKET,
 83                  KC_RALT, KC_APP, F(F_GAME), KC_UNDEFINED,   KC_UNDEFINED,
 84
 85                  KC_PGUP, KC_DELT,
 86                  KC_PGDN,
 87                  KC_RCTL, F(F_SFT),  KC_ENT
 88                    ),
 89  /* Navigation and media layer
 90   *
 91   * ,--------------------------------------------------.           ,--------------------------------------------------.
 92   * |        |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |           |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |        |
 93   * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 94   * |        |      |      | MsUp |      | WHUP | Vol+ |           | Lclk |      | Home |  Up  | End  |      |        |
 95   * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 96   * |        |      | MsLe | MsDo | MsRi | WHD  |------|           |------|      | Left | Down | Right|      |        |
 97   * |--------+------+------+------+------+------| Vol- |           | Rclk |------+------+------+------+------+--------|
 98   * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
 99   * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
100   *   |      |      |      |      |      |                                       |      |      |      |      |      |
101   *   `----------------------------------'                                       `----------------------------------'
102   *                                        ,-------------.       ,-------------.
103   *                                        | Mute |      |       |      | Caps |
104   *                                 ,------|------|------|       |------+------+------.
105   *                                 |      |      |      |       |      |      |      |
106   *                                 | Prev | Next |------|       |------| LEAD | Play |
107   *                                 |      |      |      |       |      |      |      |
108   *                                 `--------------------'       `--------------------'
109   */
110  // SYMBOLS
111  [NMDIA] = LAYOUT_ergodox(
112                   // left hand
113                   KC_UNDEFINED,  KC_F1,         KC_F2,         KC_F3,         KC_F4,         KC_F5,         KC_F6,
114                   KC_UNDEFINED,  KC_UNDEFINED,  KC_UNDEFINED,  KC_MS_U,       KC_UNDEFINED,  KC_WH_U,  KC_VOLU,
115                   KC_TRNS,       KC_UNDEFINED,  KC_MS_L,       KC_MS_D,       KC_MS_R,       KC_WH_D,
116                   KC_UNDEFINED,  KC_UNDEFINED,  KC_UNDEFINED,  KC_UNDEFINED,  KC_UNDEFINED,  KC_UNDEFINED,  KC_VOLD,
117                   KC_TRNS,       KC_TRNS,       KC_UNDEFINED,  KC_TRNS,       KC_TRNS,
118                   KC_MUTE,  KC_LEAD,
119                   KC_TRNS,
120                   KC_MPRV,  KC_MNXT,  KC_TRNS,
121                   // right hand
122                   KC_F7,        KC_F8,          KC_F9,          KC_F10,          KC_F11,          KC_F12,       KC_UNDEFINED,
123                   KC_BTN1, KC_UNDEFINED,   KC_HOME,        KC_UP,           KC_END,          KC_PGUP, KC_UNDEFINED,
124                   KC_UNDEFINED,   KC_LEFT,        KC_DOWN,         KC_RIGHT,        KC_PGDN, KC_UNDEFINED,
125                   KC_BTN2, KC_UNDEFINED,   RGB_TOG,   RGB_MOD,    RGB_HUI,    RGB_HUD, KC_UNDEFINED,
126                   RGB_SAI,   RGB_SAD,   RGB_SAD,    RGB_VAI,    RGB_VAD,
127                   KC_TRNS, KC_CAPS,
128                   KC_TRNS,
129                   KC_TRNS, KC_TRNS,   KC_MPLY
130                   ),
131  /* fn layer
132   *
133   * ,--------------------------------------------------.           ,--------------------------------------------------.
134   * |        |      |      |      |      |      |Insert|           |Insert|Eject |Power |Sleep | Wake |PrtScr|ScrollLk|
135   * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
136   * |        |      |      |      |      |      |VolUp |           |      |      |      | MsUp |      | PgUp | Pause  |
137   * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
138   * |        |      |      | Calc | Mail |Browsr|------|           |------|      |MsLeft|MsDown|MsRght| PgDn |        |
139   * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
140   * |        |      | cut  | copy |paste | Mute |VolDn |           |      |      |      |      |      |      |        |
141   * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
142   *   |      |      |      |      |      |                                       | Lclk | Mclk | Rclk |      |      |
143   *   `----------------------------------'                                       `----------------------------------'
144   *                                        ,-------------.       ,-------------.
145   *                                        |      |      |       |      |      |
146   *                                 ,------|------|------|       |------+------+------.
147   *                                 |      |      |      |       | Next |      |      |
148   *                                 | Mute |      |------|       |------|      |      |
149   *                                 |      |      |      |       | Prev |      |      |
150   *                                 `--------------------'       `--------------------'
151   */
152  // MEDIA AND MOUSE
153  [FNLR] = LAYOUT_ergodox(
154                  KC_TRNS, KC_TRNS, KC_TRNS,      KC_TRNS,     KC_TRNS,      KC_TRNS, KC_INS,
155                  KC_TRNS, KC_TRNS, KC_TRNS,      KC_TRNS,     KC_TRNS,      KC_TRNS, KC_VOLU,
156                  KC_TRNS, KC_TRNS, KC_TRNS,      KC_CALC,     KC_MAIL,      KC_WHOM,
157                  KC_TRNS, KC_TRNS, M(MCUT),      M(MCOPY),    M(MPSTE),     KC_MUTE, KC_VOLD,
158                  KC_TRNS, KC_TRNS, KC_TRNS,      KC_TRNS,     KC_TRNS,
159
160                  KC_TRNS, KC_TRNS,
161                  KC_TRNS,
162                  KC_MUTE, KC_TRNS, KC_TRNS,
163                  // right hand
164                  KC_INS,   KC_EJCT, KC_PWR,  KC_SLEP, KC_WAKE, KC_PSCR, KC_SLCK,
165                  KC_TRNS,  KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_PAUS,
166                  KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS,
167                  KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
168                  KC_BTN1, KC_BTN2, KC_BTN3, KC_TRNS, KC_TRNS,
169
170                  KC_TRNS, KC_TRNS,
171                  KC_BTN4,
172                  KC_BTN5, KC_MPRV, KC_MNXT
173                  ),
174
175  /* Keymap 3: Gaming
176   *
177   * ,--------------------------------------------------.           ,--------------------------------------------------.
178   * |   #    |   "  |   «  |   »  |   (  |   )  | INS  |           |      |      |      |      |      |      |        |
179   * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
180   * |  TAB   |   1  |  2   | UP   |  3   |  4   |Back  |           |      |      |      |      |      |      |        |
181   * |--------+------+------+------+------+------|Space |           |      |------+------+------+------+------+--------|
182   * |   A    |   5  | LEFT | DOWN | RIGHT|  6   |------|           |------|      |      |      |      |      |        |
183   * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
184   * |   B    |   7  |  8   |   9  |  0   |  C   |Enter |           |      |      |      |      |      |      |        |
185   * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
186   *   | MUTE |  V+  |  V-  | GUI  | LAlt |                                       |      |  L0  |      |      |      |
187   *   `----------------------------------'                                       `----------------------------------'
188   *                                        ,-------------.       ,-------------.
189   *                                        | DEL  | GUI  |       |      |      |
190   *                                 ,------|------|------|       |------+------+------.
191   *                                 |      |      | LAlt |       |      |      |      |
192   *                                 | Space|LShift|------|       |------|      |      |
193   *                                 |      |      |ctr/Es|       |      |      |      |
194   *                                 `--------------------'       `--------------------'
195   */
196  [GAME] = LAYOUT_ergodox(
197                  // left hand
198                  BP_DOLLAR,    BP_DOUBLE_QUOTE,     BP_LEFT_GUILLEMET,   BP_RIGHT_GUILLEMET,   BP_LEFT_PAREN,    BP_RIGHT_PAREN,   KC_INSERT,
199                  KC_TAB,       KC_KP_1,             KC_KP_2,             KC_UP,                KC_KP_3,          KC_KP_4,          KC_BSPC,
200                  BP_A,         KC_KP_5,             KC_LEFT,             KC_DOWN,              KC_RIGHT,         KC_KP_6,
201                  BP_B,         KC_KP_7,             KC_KP_8,             KC_KP_9,              KC_KP_0,          BP_C,             KC_ENT,
202                  KC_MUTE,      KC_VOLU,             KC_VOLD,             KC_LGUI,              ALT_T(KC_ESC),
203                  KC_DELETE,        KC_RGUI,
204                  KC_LALT,
205                  KC_SPC,           KC_LSHIFT,        KC_LCTL,
206                  // right hand
207                  KC_UNDEFINED, KC_UNDEFINED,        KC_UNDEFINED,        KC_UNDEFINED,         KC_UNDEFINED,     KC_UNDEFINED,     KC_UNDEFINED,
208                  KC_UNDEFINED, KC_UNDEFINED,        KC_UNDEFINED,        KC_UNDEFINED,         KC_UNDEFINED,     KC_UNDEFINED,     KC_UNDEFINED,
209                  KC_UNDEFINED,        KC_UNDEFINED,        KC_UNDEFINED,         KC_UNDEFINED,     KC_UNDEFINED,     KC_UNDEFINED,
210                  KC_UNDEFINED, KC_UNDEFINED,        KC_UNDEFINED,        KC_UNDEFINED,         KC_UNDEFINED,     KC_UNDEFINED,     KC_UNDEFINED,
211                  KC_UNDEFINED,        KC_UNDEFINED,              KC_TRNS,     KC_UNDEFINED,     KC_UNDEFINED,
212                  KC_UNDEFINED, KC_UNDEFINED,
213                  KC_UNDEFINED,
214                  KC_UNDEFINED, KC_UNDEFINED,        KC_UNDEFINED
215                  ),
216};
217
218const uint16_t PROGMEM fn_actions[] = {
219  [F_BSE]    = ACTION_LAYER_CLEAR(ON_PRESS),
220  [F_NMEDIA] = ACTION_LAYER_TAP_TOGGLE(NMDIA),
221  [F_GAME]   = ACTION_LAYER_TAP_TOGGLE(GAME),
222  [F_SFT]    = ACTION_MODS_ONESHOT (MOD_LSFT),
223  [F_ALT]    = ACTION_MODS_ONESHOT (MOD_LALT),
224  [F_CTRL]   = ACTION_MODS_ONESHOT (MOD_LCTL)
225};
226
227LEADER_EXTERNS();
228
229const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
230{
231  // MACRODOWN only works in this function
232  switch(id) {
233  case MDBL0:
234    if (record->event.pressed) {
235      return MACRO( I(25), T(P0), T(P0), END );
236    }
237    break;
238  case MFNLR:
239    // Activate 2 layers at once
240    // layer_state ^= (1 << NUMR) | (1 << FNLR);
241    layer_state ^= (1 << FNLR);
242    break;
243  case MCUT:
244    if (record->event.pressed) {
245      return MACRO(D(LSFT), T(DELT), U(LSFT), END);
246    }
247    break;
248  case MCOPY:
249    if (record->event.pressed) {
250      return MACRO(D(LCTL), T(INS), U(LCTL), END);
251    }
252    break;
253  case MPSTE:
254    if (record->event.pressed) {
255      return MACRO(D(LSFT), T(INS), U(LSFT), END);
256    }
257    break;
258  }
259  return MACRO_NONE;
260};
261
262// Runs just one time when the keyboard initializes.
263void matrix_init_user(void) {
264
265};
266
267void tap (uint16_t codes[]) {
268  for (int i = 0; codes[i] != 0; i++) {
269    register_code (codes[i]);
270    unregister_code (codes[i]);
271    wait_ms (50);
272  }
273}
274
275void do_unicode (void) {
276  register_code (KC_RCTL);
277  register_code (KC_RSFT);
278  register_code (KC_U);
279  unregister_code (KC_U);
280  unregister_code (KC_RSFT);
281  unregister_code (KC_RCTL);
282  wait_ms (100);
283}
284
285// Runs constantly in the background, in a loop.
286void matrix_scan_user(void) {
287
288  uint8_t layer = biton32(layer_state);
289
290  ergodox_board_led_on();
291  ergodox_right_led_1_off();
292  ergodox_right_led_2_off();
293  ergodox_right_led_3_off();
294
295  ergodox_right_led_1_set (LED_BRIGHTNESS_LO);
296  ergodox_right_led_2_set (LED_BRIGHTNESS_LO);
297  ergodox_right_led_3_set (LED_BRIGHTNESS_LO);
298
299  // led 3: caps lock
300  if (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) {
301    ergodox_right_led_1_on();
302  }
303  switch (layer) {
304  case NMDIA:
305    ergodox_right_led_2_on();
306    break;
307  case GAME:
308    ergodox_right_led_3_on();
309    break;
310    //case NUMR:
311    //ergodox_right_led_3_on();
312    //break;
313  default:
314    // none
315    break;
316  }
317
318
319  LEADER_DICTIONARY() {
320    leading = false;
321    leader_end ();
322
323    SEQ_ONE_KEY (KC_U) {
324      do_unicode();
325    }
326
327    SEQ_ONE_KEY (BP_Y) {
328      uint16_t codes[] = {BP_O, BP_SLSH, 0};
329      tap (codes);
330    }
331
332  }
333  /* // led 1: numeric layer */
334  /* if (layer_state & (1 << NUMR)) { */
335  /*     ergodox_right_led_2_on(); */
336  /* } */
337  /* // led 2: FNLR */
338  /* if (default_layer_state == 1 << FNLR) { */
339  /*     ergodox_right_led_1_on(); */
340  /* } */
341
342};