custom_encoder.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include "custom_encoder.h"
  2. #include "custom_keycodes.h"
  3. #ifdef RGB_OLED_MENU
  4. #include "custom_rgb.h"
  5. // I'm lazy and like constants over calculations, also using it as a compile time check
  6. #if defined(RGB_MATRIX_ENABLE)
  7. #define RGB_FUNCTION_COUNT 6
  8. #elif defined(RGBLIGHT_ENABLE)
  9. #define RGB_FUNCTION_COUNT 5
  10. #endif
  11. typedef void (*rgb_f)(void);
  12. const rgb_f rgb_functions[RGB_FUNCTION_COUNT][2] = {
  13. #if defined(RGB_MATRIX_ENABLE)
  14. { rgb_matrix_increase_hue, rgb_matrix_decrease_hue },
  15. { rgb_matrix_increase_sat, rgb_matrix_decrease_sat },
  16. { rgb_matrix_increase_val, rgb_matrix_decrease_val },
  17. { rgb_matrix_increase_speed, rgb_matrix_decrease_speed },
  18. { rgb_matrix_step, rgb_matrix_step_reverse },
  19. { rgb_matrix_increase_flags, rgb_matrix_decrease_flags }
  20. #elif defined(RGBLIGHT_ENABLE)
  21. { rgblight_increase_hue, rgblight_decrease_hue },
  22. { rgblight_increase_sat, rgblight_decrease_sat },
  23. { rgblight_increase_val, rgblight_decrease_val },
  24. { rgblight_increase_speed, rgblight_decrease_speed },
  25. { rgblight_step, rgblight_step_reverse }
  26. #endif
  27. };
  28. // Start at the end for mode
  29. uint8_t rgb_encoder_state = 4;
  30. bool process_record_encoder(uint16_t keycode, keyrecord_t *record)
  31. {
  32. switch (keycode)
  33. {
  34. case RGB_ENC:
  35. if (record->event.pressed) {
  36. if (get_mods() & MOD_MASK_SHIFT) {
  37. rgb_encoder_state = (rgb_encoder_state - 1);
  38. if (rgb_encoder_state >= RGB_FUNCTION_COUNT)
  39. rgb_encoder_state = RGB_FUNCTION_COUNT - 1;
  40. } else {
  41. rgb_encoder_state = (rgb_encoder_state + 1) % RGB_FUNCTION_COUNT;
  42. }
  43. }
  44. return false;
  45. }
  46. return true;
  47. }
  48. #endif // RGB_OLED_MENU
  49. const uint16_t PROGMEM encoders[][2] = {
  50. { KC_PGUP, KC_PGDN },
  51. { KC_VOLU, KC_VOLD }
  52. };
  53. bool encoder_update_user(uint8_t index, bool clockwise)
  54. {
  55. if (!is_keyboard_master())
  56. return;
  57. #ifdef RGB_OLED_MENU
  58. if (index == RGB_OLED_MENU)
  59. (*rgb_functions[rgb_encoder_state][clockwise])();
  60. else
  61. #endif // RGB_OLED_MENU
  62. tap_code16(pgm_read_word(&encoders[index][clockwise]));
  63. return true;
  64. }