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.

195 lines
6.9 KiB

  1. /* Copyright 2018 Christon DeWan (Xton)
  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. #include "xtonhasvim.h"
  18. #include "fancylighting.h"
  19. #define X_____X KC_NO
  20. enum layers {
  21. _QWERTY,
  22. _FUN,
  23. _MOVE,
  24. _CMD
  25. };
  26. enum layout_key_codes {
  27. IND_BRI = VIM_SAFE_RANGE,
  28. IND_DIM
  29. };
  30. extern uint8_t vim_cmd_layer(void) { return _CMD; }
  31. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  32. [_QWERTY] = LAYOUT_all(
  33. 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, X_____X, KC_BSPC,
  34. 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,
  35. LT(_MOVE, 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,
  36. KC_LSFT, X_____X, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, X_____X,
  37. KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, VIM_START, MO(_FUN)),
  38. [_MOVE] = LAYOUT_all(
  39. X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X,
  40. X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, KC_HOME, KC_PGDN, KC_PGUP, KC_END, X_____X, X_____X, X_____X, X_____X,
  41. _______, X_____X, LGUI(KC_LBRC), LGUI(LSFT(KC_LBRC)), LGUI(LSFT(KC_RBRC)), LGUI(KC_RBRC), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, X_____X, X_____X, VIM_START,
  42. _______, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, _______,
  43. _______, _______, _______, _______, _______, _______, _______, _______),
  44. [_FUN] = LAYOUT_all(
  45. KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, X_____X, KC_DEL,
  46. X_____X, X_____X, KC_UP, RGB_TOG, IND_BRI, X_____X, X_____X, X_____X, KC_PSCR, KC_SCRL, KC_PAUS, KC_UP, X_____X, KC_INS,
  47. X_____X, KC_LEFT, KC_DOWN, KC_RIGHT, IND_DIM, X_____X, X_____X, X_____X, KC_HOME, KC_PGUP, KC_LEFT, KC_RIGHT, FIREY_RETURN,
  48. _______, X_____X, BL_UP, BL_STEP, BL_DOWN, X_____X, KC_VOLD, KC_VOLU, KC_MUTE, KC_END, KC_PGDN, KC_DOWN, _______, X_____X,
  49. _______, _______, _______, X_____X, _______, _______, X_____X, _______
  50. ),
  51. [_CMD] = LAYOUT_all(
  52. VIM_ESC, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X, X_____X,
  53. X_____X, X_____X, VIM_W, VIM_E, X_____X, X_____X, VIM_Y, VIM_U, VIM_I, VIM_O, VIM_P, X_____X, X_____X, X_____X,
  54. _______, VIM_A, VIM_S, VIM_D, X_____X, VIM_G, VIM_H, VIM_J, VIM_K, VIM_L, X_____X, X_____X, X_____X,
  55. VIM_SHIFT, X_____X, X_____X, VIM_X, VIM_C, VIM_V, VIM_B, X_____X, X_____X, VIM_COMMA, VIM_PERIOD, X_____X, VIM_SHIFT,X_____X,
  56. _______, _______, _______, _______, _______, _______, _______, TO(_QWERTY)
  57. )
  58. };
  59. bool led_update_user(led_t led_state) {
  60. if (led_state.caps_lock) {
  61. // output low
  62. DDRE |= (1<<PE6);
  63. PORTE &= ~(1<<PE6);
  64. }
  65. else {
  66. // Hi-Z
  67. DDRE &= ~(1<<PE6);
  68. PORTE &= ~(1<<PE6);
  69. }
  70. return false;
  71. }
  72. #define C_RED 0xFF, 0x00, 0x00
  73. #define C_GRN 0x00, 0xFF, 0x00
  74. #define C_BLU 0x00, 0x00, 0xFF
  75. #define C_YAN 0x00, 0xFF, 0xFF
  76. #define C_PRP 0x7A, 0x00, 0xFF
  77. #define C_ORG 0xFF, 0x93, 0x00
  78. float rgb_brightness = 1.0;
  79. /** the underglow LEDs aren't individually addressable, sadly */
  80. void rgbflag(uint8_t r, uint8_t g, uint8_t b) {
  81. float rgb_brightness = ((float)rgblight_get_val())/256;
  82. if(rgb_brightness == 0) rgb_brightness = 0.05;
  83. LED_TYPE *target_led = user_rgb_mode ? shadowed_led : led;
  84. target_led[0].r = (uint8_t)(r*rgb_brightness);
  85. target_led[0].g = (uint8_t)(g*rgb_brightness);
  86. target_led[0].b = (uint8_t)(b*rgb_brightness);
  87. rgblight_set(); // just to handle turning off if that's required
  88. }
  89. void set_state_leds(void) {
  90. switch (get_highest_layer(layer_state)) {
  91. case _MOVE:
  92. rgbflag(C_BLU);
  93. break;
  94. case _FUN:
  95. rgbflag(C_PRP);
  96. break;
  97. case _CMD:
  98. switch(vstate) {
  99. case VIM_V:
  100. case VIM_VI:
  101. case VIM_VS:
  102. case VIM_C:
  103. case VIM_CI:
  104. case VIM_D:
  105. case VIM_DI:
  106. rgbflag(C_RED);
  107. break;
  108. case VIM_G:
  109. rgbflag(C_PRP);
  110. break;
  111. case VIM_Y:
  112. rgbflag(C_ORG);
  113. break;
  114. case VIM_START:
  115. default:
  116. rgbflag(C_GRN);
  117. break;
  118. }
  119. break;
  120. default: // for any other layers, or the default layer
  121. rgbflag(C_YAN);
  122. break;
  123. }
  124. }
  125. #define RGBLIGHT_LIMIT_VAL 255
  126. #define RGBLIGHT_BASE_VAL 3
  127. extern rgblight_config_t rgblight_config;
  128. extern backlight_config_t backlight_config;
  129. bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
  130. if (record->event.pressed) {
  131. switch(keycode) {
  132. case IND_BRI:
  133. if (rgblight_config.val + RGBLIGHT_VAL_STEP > RGBLIGHT_LIMIT_VAL) {
  134. rgblight_config.val = RGBLIGHT_LIMIT_VAL;
  135. } else {
  136. rgblight_config.val = rgblight_config.val + RGBLIGHT_VAL_STEP;
  137. }
  138. eeconfig_update_rgblight(rgblight_config.raw);
  139. set_state_leds();
  140. break;
  141. case IND_DIM:
  142. if (rgblight_config.val - RGBLIGHT_VAL_STEP < RGBLIGHT_BASE_VAL) {
  143. rgblight_config.val = RGBLIGHT_BASE_VAL;
  144. } else {
  145. rgblight_config.val = rgblight_config.val - RGBLIGHT_VAL_STEP;
  146. }
  147. eeconfig_update_rgblight(rgblight_config.raw);
  148. set_state_leds();
  149. break;
  150. }
  151. }
  152. return true;
  153. }
  154. void suspend_power_down_user(void)
  155. {
  156. // rgb
  157. rgblight_config.enable = false;
  158. rgblight_set();
  159. // backlight
  160. /** I don't know why, but 3 means "off" and down is up */
  161. backlight_config.level = 3;
  162. backlight_config.enable = false;
  163. backlight_set(3);
  164. }
  165. void suspend_wakeup_init_user(void)
  166. {
  167. rgblight_config.raw = eeconfig_read_rgblight();
  168. backlight_config.raw = eeconfig_read_backlight();
  169. backlight_set(backlight_config.level);
  170. rgblight_set();
  171. }