You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

182 lines
10 KiB

  1. #include QMK_KEYBOARD_H
  2. enum plaid_layers {
  3. _QWERTY,
  4. _DVORAK,
  5. _COLEMAK,
  6. _LOWER,
  7. _RAISE,
  8. _FUNCTION,
  9. };
  10. enum plaid_keycodes { QWERTY = SAFE_RANGE, COLEMAK, DVORAK, LED };
  11. #define LOWER MO(_LOWER)
  12. #define RAISE MO(_RAISE)
  13. #define LED_ON 1
  14. #define LED_OFF 0
  15. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  16. /* Qwerty
  17. * ,-----------------------------------------------------------------------------------.
  18. * | Esc | Q | W | E | R | T | Y | U | I | O | P | Bksp |
  19. * |------+------+------+------+------+-------------+------+------+------+------+------|
  20. * | Tab | A | S | D | F | G | H | J | K | L | ; | " |
  21. * |------+------+------+------+------+------|------+------+------+------+------+------|
  22. * | LS/( | Z | X | C | V | B | N | M | , | . | / |Enter |
  23. * |------+------+------+------+------+------+------+------+------+------+------+------|
  24. * | Ctrl | LGUI | Alt | [ |Lower | Space |Raise | ] | RGUI | \ | RS/) |
  25. * `-----------------------------------------------------------------------------------'
  26. */
  27. [_QWERTY] = LAYOUT_planck_mit(KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, KC_LCTL, KC_LGUI, KC_LALT, KC_LBRC, LOWER, KC_SPC, RAISE, KC_RBRC, KC_RGUI, KC_BSLS, KC_RSPC),
  28. /* Colemak
  29. * ,-----------------------------------------------------------------------------------.
  30. * | Esc | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
  31. * |------+------+------+------+------+-------------+------+------+------+------+------|
  32. * | Tab | A | R | S | T | D | H | N | E | I | O | " |
  33. * |------+------+------+------+------+------|------+------+------+------+------+------|
  34. * | LS/( | Z | X | C | V | B | K | M | , | . | / |Enter |
  35. * |------+------+------+------+------+------+------+------+------+------+------+------|
  36. * | Ctrl | LGUI | Alt | [ |Lower | Space |Raise | ] | RGUI | \ | RS/) |
  37. * `-----------------------------------------------------------------------------------'
  38. */
  39. [_COLEMAK] = LAYOUT_planck_mit(KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, KC_LCTL, KC_RALT, KC_LALT, KC_LGUI, LOWER, KC_SPC, RAISE, KC_RBRC, KC_RGUI, KC_BSLS, KC_RSPC),
  40. /* Dvorak
  41. * ,-----------------------------------------------------------------------------------.
  42. * | Esc | " | , | . | P | Y | F | G | C | R | L | Bksp |
  43. * |------+------+------+------+------+-------------+------+------+------+------+------|
  44. * | Tab | A | O | E | U | I | D | H | T | N | S | / |
  45. * |------+------+------+------+------+------|------+------+------+------+------+------|
  46. * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
  47. * |------+------+------+------+------+------+------+------+------+------+------+------|
  48. * | Ctrl | LGUI | Alt | [ |Lower | Space |Raise | ] | RGUI | \ | RS/) |
  49. * `-----------------------------------------------------------------------------------'
  50. */
  51. [_DVORAK] = LAYOUT_planck_mit(KC_ESC, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, KC_TAB, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, KC_LSPO, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT, KC_LCTL, KC_RALT, KC_LALT, KC_LGUI, LOWER, KC_SPC, RAISE, KC_RBRC, KC_RGUI, KC_BSLS, KC_RSPC),
  52. /* LOWER
  53. * ,----------------------------------------------------------------------------.
  54. * | | | MPRV | MPLY | MNXT | | | | PGUP| UP | PGDN|PSCR |
  55. * |------+------+------+------+------+-----+-----+-----+-----+-----------+-----+
  56. * | | | MUTE | VOLD | VOLU | | | | LEFT| DOWN|RIGHT| |
  57. * |------+------+------+------+------+-----+-----+-----+-----+-----+-----+-----+
  58. * | | | MAIL | WBAK | WFWD | | | | HOME| | END | |
  59. * |------+------+------+------+------+-----+-----+-----+-----+-----------+-----+
  60. * | | | | | | DEL | | | | | |
  61. * `----------------------------------------------------------------------------'
  62. */
  63. [_LOWER] = LAYOUT_planck_mit(KC_NO, KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, KC_NO, KC_NO, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_NO, KC_NO, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, KC_NO, KC_MAIL, KC_WBAK, KC_WFWD, KC_NO, KC_NO, KC_NO, KC_HOME, KC_NO, KC_END, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_DEL, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
  64. /* RAISE
  65. * ,--------------------------------------------------------------------------------.
  66. * | NLCK | 1 | 2 | 3 | - | | | | ! | # | $ | + |
  67. * |------+------+------+------+------+-----+-----+-----+------+------+------+------+
  68. * | / | 4 | 5 | 6 | + | | | | % | ! | ! | = |
  69. * |------+------+------+------+------+-----+-----+-----+------+------+------+------+
  70. * | * | 7 | 8 | 9 | , | | | | _ | - | @ | ~ |
  71. * |------+------+------+------+------+-----+-----+-----+------+------+------+------+
  72. * | | 0 | . | Ent | = | | | | | | ` |
  73. * `--------------------------------------------------------------------------------'
  74. */
  75. [_RAISE] = LAYOUT_planck_mit(KC_NLCK, KC_P1, KC_P2, KC_P3, KC_PMNS, KC_NO, KC_NO, KC_NO, KC_EXLM, KC_HASH, KC_DLR, KC_PLUS, KC_PSLS, KC_P4, KC_P5, KC_P6, KC_PPLS, KC_NO, KC_NO, KC_NO, KC_PERC, KC_ASTR, KC_AMPR, KC_EQL, KC_PAST, KC_P7, KC_P8, KC_P9, KC_PCMM, KC_NO, KC_NO, KC_NO, KC_UNDS, KC_MINS, KC_AT, KC_TILDE, KC_NO, KC_P0, KC_PDOT, KC_PENT, KC_PEQL, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_GRV),
  76. /* Function (Lower + Raise)
  77. * ,-----------------------------------------------------------------------------------------------------------------------.
  78. * | RESET| LCA_T(F1) | LCA_T(F2) | LCA_T(F3) | LCA_T(F4) | LCA_T(F5) | LCA_T(F6) | LCA_T(F7) | | | | |
  79. * |------+------------+-----------+-----------+-----------+-----------+-----------+-----------+------+------+------+------+
  80. * | | | | | | QWERTY | DVORAK | COLEMAK | | | | |
  81. * |------+------------+-----------+-----------+-----------+-----------+-----------+-----------+------+------+------+------+
  82. * | | | | | | | | | | | | |
  83. * |------+------------+-----------+-----------+-----------+-----------+-----------+-----------+------+------+------+------+
  84. * | | | | | | LED | | | | | |
  85. * `-----------------------------------------------------------------------------------------------------------------------'
  86. */
  87. [_FUNCTION] = LAYOUT_planck_mit(RESET, LCA_T(KC_F1), LCA_T(KC_F2), LCA_T(KC_F3), LCA_T(KC_F4), LCA_T(KC_F5), LCA_T(KC_F6), LCA_T(KC_F7), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, QWERTY, DVORAK, COLEMAK, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, LED, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO)};
  88. // constants to toggle LED behavior
  89. // Setup config struct for LED
  90. typedef union {
  91. uint32_t raw;
  92. struct {
  93. bool red_mode : 1;
  94. bool green_mode : 1;
  95. };
  96. } led_config_t;
  97. led_config_t led_config;
  98. void keyboard_post_init_user(void) { led_config.raw = eeconfig_read_user(); }
  99. void eeconfig_init_user(void) { // EEPROM is getting reset!
  100. led_config.raw = 0;
  101. led_config.red_mode = LED_ON;
  102. led_config.green_mode = LED_ON;
  103. eeconfig_update_user(led_config.raw);
  104. eeconfig_update_user(led_config.raw);
  105. }
  106. // When LOWER and RAISE are held together, go to the FUNCTION layer
  107. uint32_t layer_state_set_user(uint32_t state) { return update_tri_layer_state(state, _LOWER, _RAISE, _FUNCTION); }
  108. // Runs constantly in the background, in a loop.
  109. void matrix_scan_user(void) {
  110. uint8_t layer = biton32(layer_state);
  111. switch (layer) {
  112. case _LOWER:
  113. writePinHigh(LED_RED);
  114. break;
  115. case _RAISE:
  116. writePinHigh(LED_GREEN);
  117. break;
  118. default:
  119. writePinLow(LED_GREEN);
  120. writePinLow(LED_RED);
  121. }
  122. }
  123. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  124. switch (keycode) {
  125. case QWERTY:
  126. if (record->event.pressed) {
  127. set_single_persistent_default_layer(_QWERTY);
  128. }
  129. return false;
  130. break;
  131. case COLEMAK:
  132. if (record->event.pressed) {
  133. set_single_persistent_default_layer(_COLEMAK);
  134. }
  135. return false;
  136. break;
  137. case DVORAK:
  138. if (record->event.pressed) {
  139. set_single_persistent_default_layer(_DVORAK);
  140. }
  141. return false;
  142. break;
  143. case LED:
  144. if (record->event.pressed) {
  145. if (led_config.red_mode == LED_ON && led_config.green_mode == LED_ON) {
  146. led_config.red_mode = LED_OFF;
  147. led_config.green_mode = LED_OFF;
  148. } else if (led_config.red_mode == LED_OFF && led_config.green_mode == LED_OFF) {
  149. led_config.red_mode = LED_ON;
  150. led_config.green_mode = LED_ON;
  151. }
  152. }
  153. eeconfig_update_user(led_config.raw);
  154. return false;
  155. break;
  156. }
  157. return true;
  158. }