keymap.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /* Copyright 2019 Cole Markham
  2. *
  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. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include QMK_KEYBOARD_H
  17. #ifdef RGBLIGHT_ENABLE
  18. //Following line allows macro to read current RGB settings
  19. extern rgblight_config_t rgblight_config;
  20. #endif
  21. enum layer_names {
  22. _QWERTY,
  23. _COLEMAK,
  24. _DVORAK,
  25. _LOWER,
  26. _RAISE,
  27. _ADJUST
  28. };
  29. enum custom_keycodes {
  30. QWERTY = SAFE_RANGE,
  31. COLEMAK,
  32. DVORAK,
  33. LOWER,
  34. RAISE,
  35. ADJUST,
  36. };
  37. // define variables for reactive RGB
  38. bool TOG_STATUS = false;
  39. int RGB_current_mode;
  40. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  41. [_QWERTY] = LAYOUT_all(
  42. KC_F1, KC_F2, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6,KC_7,KC_8,KC_9,KC_0,KC_MINS,KC_EQL,KC_BSPC, KC_DEL, KC_PGUP,
  43. KC_F3, KC_F4, KC_TAB,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_LBRC,KC_RBRC,KC_BSLS, KC_PGDN,
  44. KC_F5, KC_F6, KC_CAPS,KC_A,KC_S,KC_D,KC_F, KC_G, KC_H,KC_J,KC_K,KC_L, KC_SCLN,KC_QUOT,KC_ENT, KC_HOME,
  45. KC_F7, KC_F8, KC_LSFT,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT,KC_SLASH,KC_RSFT,KC_UP,KC_END,
  46. KC_F9, KC_F10, KC_LCTL,KC_LGUI,KC_LALT, RAISE, KC_SPACE, LOWER, KC_RALT,KC_APP,KC_RCTRL,KC_LEFT,KC_DOWN,KC_RIGHT),
  47. [_RAISE] = LAYOUT_all(
  48. RGB_MOD, _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, _______,
  49. _______, _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,
  50. _______, _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,
  51. _______, _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
  52. _______, _______, _______,_______,_______, _______, _______, _______, _______,_______,_______,_______,_______,_______),
  53. [_LOWER] = LAYOUT_all(
  54. RGB_MOD, _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, _______,
  55. _______, _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,
  56. _______, _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,
  57. _______, _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
  58. _______, _______, _______,_______,_______, _______, _______, _______, _______,_______,_______,_______,_______,_______),
  59. [_ADJUST] = LAYOUT_all(
  60. QK_BOOT, _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______, _______,
  61. _______, _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,
  62. _______, _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,
  63. _______, _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
  64. _______, _______, _______,_______,_______, _______, _______, _______, _______,_______,_______,_______,_______,_______)
  65. };
  66. // Setting ADJUST layer RGB back to default
  67. void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
  68. if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
  69. #ifdef RGBLIGHT_ENABLE
  70. rgblight_mode(RGB_current_mode);
  71. #endif
  72. layer_on(layer3);
  73. } else {
  74. layer_off(layer3);
  75. }
  76. }
  77. #ifdef AUDIO_ENABLE
  78. float tone_qwerty[][2] = SONG(QWERTY_SOUND);
  79. #endif
  80. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  81. switch (keycode) {
  82. case LOWER:
  83. if (record->event.pressed) {
  84. //not sure how to have keyboard check mode and set it to a variable, so my work around
  85. //uses another variable that would be set to true after the first time a reactive key is pressed.
  86. if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false
  87. } else {
  88. TOG_STATUS = !TOG_STATUS;
  89. #ifdef RGBLIGHT_ENABLE
  90. rgblight_mode(16);
  91. #endif
  92. }
  93. layer_on(_LOWER);
  94. update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
  95. } else {
  96. #ifdef RGBLIGHT_ENABLE
  97. rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change
  98. #endif
  99. TOG_STATUS = false;
  100. layer_off(_LOWER);
  101. update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
  102. }
  103. return false;
  104. break;
  105. case RAISE:
  106. if (record->event.pressed) {
  107. //not sure how to have keyboard check mode and set it to a variable, so my work around
  108. //uses another variable that would be set to true after the first time a reactive key is pressed.
  109. if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false
  110. } else {
  111. TOG_STATUS = !TOG_STATUS;
  112. #ifdef RGBLIGHT_ENABLE
  113. rgblight_mode(15);
  114. #endif
  115. }
  116. layer_on(_RAISE);
  117. update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
  118. } else {
  119. #ifdef RGBLIGHT_ENABLE
  120. rgblight_mode(RGB_current_mode); // revert RGB to initial mode prior to RGB mode change
  121. #endif
  122. layer_off(_RAISE);
  123. TOG_STATUS = false;
  124. update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
  125. }
  126. return false;
  127. break;
  128. case ADJUST:
  129. // FIXME add RGB feedback
  130. if (record->event.pressed) {
  131. layer_on(_ADJUST);
  132. } else {
  133. layer_off(_ADJUST);
  134. }
  135. return false;
  136. break;
  137. break;
  138. //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released
  139. #ifdef RGBLIGHT_ENABLE
  140. case RGB_MOD:
  141. if (record->event.pressed) {
  142. rgblight_mode(RGB_current_mode);
  143. rgblight_step();
  144. RGB_current_mode = rgblight_config.mode;
  145. }
  146. return false;
  147. break;
  148. #endif
  149. }
  150. return true;
  151. }