layer_rgb.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include QMK_KEYBOARD_H
  2. #include "spidey3.h"
  3. #include "velocikey.h"
  4. uint32_t rgb_mode;
  5. uint16_t rgb_hue;
  6. uint8_t rgb_sat;
  7. uint8_t rgb_val;
  8. bool rgb_saved = 0;
  9. void spidey_swirl(void) {
  10. dprint("Setting Spidey Swirl!\n");
  11. rgblight_enable();
  12. rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL);
  13. rgblight_sethsv(213, 255, 128);
  14. #ifdef VELOCIKEY_ENABLE
  15. if (!velocikey_enabled())
  16. velocikey_toggle();
  17. #endif
  18. }
  19. void eeconfig_init_user_rgb(void)
  20. {
  21. spidey_swirl();
  22. }
  23. const rgblight_segment_t PROGMEM _capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS( {0, 2, HSV_AZURE}, {14, 2, HSV_AZURE} );
  24. const rgblight_segment_t PROGMEM _layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS( {7, 1, HSV_PURPLE} );
  25. const rgblight_segment_t PROGMEM _layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS( {10, 3, HSV_MAGENTA} );
  26. const rgblight_segment_t PROGMEM _layer3_layer[] = RGBLIGHT_LAYER_SEGMENTS( {10, 1, HSV_GREEN} );
  27. const rgblight_segment_t PROGMEM _yes_layer[] = RGBLIGHT_LAYER_SEGMENTS( {9, 6, HSV_GREEN} );
  28. const rgblight_segment_t PROGMEM _no_layer[] = RGBLIGHT_LAYER_SEGMENTS( {9, 6, HSV_RED} );
  29. // Now define the array of layers. Later layers take precedence
  30. const rgblight_segment_t* const PROGMEM _rgb_layers[] =
  31. RGBLIGHT_LAYERS_LIST( _capslock_layer, _layer1_layer, _layer2_layer, _layer3_layer, _yes_layer, _no_layer );
  32. const uint8_t PROGMEM _n_rgb_layers = sizeof(_rgb_layers) / sizeof(_rgb_layers[0]) - 1;
  33. void clear_rgb_layers() {
  34. for (uint8_t i=0; i<_n_rgb_layers; i++) {
  35. rgblight_set_layer_state(i, false);
  36. }
  37. }
  38. void do_rgb_layers(layer_state_t state, uint8_t start, uint8_t end) {
  39. dprint("do_rgb_layers()\n");
  40. for (uint8_t i=start; i<end; i++) {
  41. bool is_on = layer_state_cmp(state, i);
  42. dprintf("\tlayer[%d]=%u\n", i, is_on);
  43. rgblight_set_layer_state(i, is_on);
  44. }
  45. }
  46. void keyboard_post_init_user_rgb(void) {
  47. do_rgb_layers(default_layer_state, 1u, RGB_LAYER_BASE_REGULAR);
  48. do_rgb_layers(layer_state, RGB_LAYER_BASE_REGULAR, RGB_LAYER_BASE_ACKS);
  49. do_rgb_layers(0, RGB_LAYER_BASE_ACKS, _n_rgb_layers);
  50. // Enable the LED layers
  51. rgblight_layers = _rgb_layers;
  52. }
  53. layer_state_t default_layer_state_set_user_rgb(layer_state_t state) {
  54. dprint("default_layer_state_set_user_rgb()\n");
  55. do_rgb_layers(state, 1u, RGB_LAYER_BASE_REGULAR);
  56. return state;
  57. }
  58. layer_state_t layer_state_set_user_rgb(layer_state_t state) {
  59. dprint("layer_state_set_user_rgb()\n");
  60. do_rgb_layers(state, RGB_LAYER_BASE_REGULAR, RGB_LAYER_BASE_ACKS);
  61. return state;
  62. }
  63. bool led_update_user_rgb(led_t led_state) {
  64. dprintf("caps_lock=%u\n", led_state.caps_lock);
  65. rgblight_set_layer_state(0, led_state.caps_lock);
  66. return true;
  67. }
  68. void rgb_layer_ack(bool yn, bool pressed) {
  69. uint8_t layer = RGB_LAYER_BASE_ACKS + (yn ? 0 : 1);
  70. rgblight_set_layer_state(layer, pressed);
  71. }
  72. extern keymap_config_t keymap_config;
  73. bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
  74. bool pressed = record->event.pressed;
  75. switch (keycode) {
  76. case SPI_GLO:
  77. if (pressed) {
  78. spidey_swirl();
  79. }
  80. return false;
  81. // Acks follow...
  82. case DEBUG:
  83. rgb_layer_ack(debug_enable, pressed);
  84. return false;
  85. case SPI_LNX:
  86. case SPI_OSX:
  87. case SPI_WIN:
  88. rgb_layer_ack(true, pressed);
  89. return false;
  90. // Tricky!
  91. // For these, on press the toggle hasn't happened yet,
  92. // so we need a little logic to invert, assuming that
  93. // on key press the flag WILL be toggled, and on key
  94. // release the flag has already been toggled.
  95. #ifdef VELOCIKEY_ENABLE
  96. case VLK_TOG:
  97. rgb_layer_ack(pressed != velocikey_enabled(), pressed);
  98. return true;
  99. #endif
  100. #ifdef NKRO_ENABLE
  101. case NK_TOGG:
  102. case NK_ON:
  103. case NK_OFF:
  104. rgb_layer_ack(pressed != keymap_config.nkro, pressed);
  105. return true;
  106. #endif
  107. }
  108. return true;
  109. }