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