keymap.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include QMK_KEYBOARD_H
  2. typedef enum {
  3. SINGLE_TAP, SINGLE_HOLD, DOUBLE, TRIPLE, QUAD
  4. } tap_dance_state_enum;
  5. enum {
  6. TD_KEY = 0
  7. };
  8. static tap_dance_state_enum tap_dance_state;
  9. static bool tap_dance_active = false;
  10. static uint16_t timer;
  11. void dance_cycle(bool override_timer) {
  12. if (tap_dance_active)
  13. {
  14. if (timer_elapsed(timer) > 100 || override_timer)
  15. {
  16. switch (tap_dance_state)
  17. {
  18. case SINGLE_HOLD:
  19. {
  20. rgblight_increase_hue_noeeprom();
  21. break;
  22. }
  23. case DOUBLE:
  24. {
  25. rgblight_step_noeeprom();
  26. break;
  27. }
  28. case TRIPLE:
  29. {
  30. rgblight_toggle_noeeprom();
  31. break;
  32. }
  33. default:
  34. // Not needed
  35. break;
  36. }
  37. timer = timer_read();
  38. }
  39. }
  40. }
  41. void dance_finished(qk_tap_dance_state_t *state, void* user_data) {
  42. // Determine the current state
  43. switch (state->count)
  44. {
  45. case 1:
  46. {
  47. if (state->interrupted || state->pressed == 0) tap_dance_state = SINGLE_TAP;
  48. else tap_dance_state = SINGLE_HOLD;
  49. break;
  50. }
  51. case 2:
  52. {
  53. tap_dance_state = DOUBLE;
  54. break;
  55. }
  56. case 3:
  57. {
  58. tap_dance_state = TRIPLE;
  59. break;
  60. }
  61. default:
  62. {
  63. tap_dance_state = QUAD;
  64. break;
  65. }
  66. }
  67. switch (tap_dance_state)
  68. {
  69. case SINGLE_TAP:
  70. {
  71. // VS Build: CTRL+SHIFT+B
  72. send_string_with_delay_P(PSTR(SS_DOWN(X_LCTRL) SS_DOWN(X_LSHIFT) "b" SS_UP(X_LSHIFT) SS_UP(X_LCTRL)), 10);
  73. tap_dance_active = false;
  74. break;
  75. }
  76. case SINGLE_HOLD:
  77. case DOUBLE:
  78. case TRIPLE:
  79. {
  80. // These are handled by the matrix_scan, which will register the appropriate rgb
  81. // functions every scan
  82. tap_dance_active = true;
  83. timer = timer_read();
  84. dance_cycle(true);
  85. break;
  86. }
  87. case QUAD:
  88. {
  89. // Reprogram
  90. reset_keyboard();
  91. break;
  92. }
  93. }
  94. }
  95. void dance_reset(qk_tap_dance_state_t *state, void* user_data)
  96. {
  97. tap_dance_active = false;
  98. }
  99. qk_tap_dance_action_t tap_dance_actions[] = {
  100. [TD_KEY] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, dance_finished, dance_reset)
  101. };
  102. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  103. [0] = LAYOUT(TD(TD_KEY))
  104. };
  105. void matrix_scan_user(void) {
  106. dance_cycle(false);
  107. }