-
-
Notifications
You must be signed in to change notification settings - Fork 39.8k
/
process_haptic.c
147 lines (143 loc) · 4.24 KB
/
process_haptic.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/* Copyright 2021 QMK
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "haptic.h"
#include "process_haptic.h"
#include "quantum_keycodes.h"
#include "action_tapping.h"
#include "usb_device_state.h"
__attribute__((weak)) bool get_haptic_enabled_key(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
#ifdef NO_HAPTIC_MOD
case QK_MOD_TAP ... QK_MOD_TAP_MAX:
if (record->tap.count == 0) return false;
break;
case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX:
if (record->tap.count != TAPPING_TOGGLE) return false;
break;
case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
if (record->tap.count == 0) return false;
break;
case KC_LEFT_CTRL ... KC_RIGHT_GUI:
case QK_MOMENTARY ... QK_MOMENTARY_MAX:
case QK_LAYER_MOD ... QK_LAYER_MOD_MAX:
#endif
#ifdef NO_HAPTIC_ALPHA
case KC_A ... KC_Z:
#endif
#ifdef NO_HAPTIC_PUNCTUATION
case KC_ENTER:
case KC_ESCAPE:
case KC_BACKSPACE:
case KC_SPACE:
case KC_MINUS:
case KC_EQUAL:
case KC_LEFT_BRACKET:
case KC_RIGHT_BRACKET:
case KC_BACKSLASH:
case KC_NONUS_HASH:
case KC_SEMICOLON:
case KC_QUOTE:
case KC_GRAVE:
case KC_COMMA:
case KC_SLASH:
case KC_DOT:
case KC_NONUS_BACKSLASH:
#endif
#ifdef NO_HAPTIC_LOCKKEYS
case KC_CAPS_LOCK:
case KC_SCROLL_LOCK:
case KC_NUM_LOCK:
#endif
#ifdef NO_HAPTIC_NAV
case KC_PRINT_SCREEN:
case KC_PAUSE:
case KC_INSERT:
case KC_DELETE:
case KC_PAGE_DOWN:
case KC_PAGE_UP:
case KC_LEFT:
case KC_UP:
case KC_RIGHT:
case KC_DOWN:
case KC_END:
case KC_HOME:
#endif
#ifdef NO_HAPTIC_NUMERIC
case KC_1 ... KC_0:
#endif
return false;
}
return true;
}
bool process_haptic(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
switch (keycode) {
case HPT_ON:
haptic_enable();
break;
case HPT_OFF:
haptic_disable();
break;
case HPT_TOG:
haptic_toggle();
break;
case HPT_RST:
haptic_reset();
break;
case HPT_FBK:
haptic_feedback_toggle();
break;
case HPT_BUZ:
haptic_buzz_toggle();
break;
case HPT_MODI:
haptic_mode_increase();
break;
case HPT_MODD:
haptic_mode_decrease();
break;
case HPT_DWLI:
haptic_dwell_increase();
break;
case HPT_DWLD:
haptic_dwell_decrease();
break;
case HPT_CONT:
haptic_toggle_continuous();
break;
case HPT_CONI:
haptic_cont_increase();
break;
case HPT_COND:
haptic_cont_decrease();
break;
}
}
if (haptic_get_enable() && ((!HAPTIC_OFF_IN_LOW_POWER) || (usb_device_state == USB_DEVICE_STATE_CONFIGURED))) {
if (record->event.pressed) {
// keypress
if (haptic_get_feedback() < 2 && get_haptic_enabled_key(keycode, record)) {
haptic_play();
}
} else {
// keyrelease
if (haptic_get_feedback() > 0 && get_haptic_enabled_key(keycode, record)) {
haptic_play();
}
}
}
return true;
}