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