]> git.donarmstrong.com Git - qmk_firmware.git/blob - drivers/haptic/haptic.c
Add user-overridable callback for cancelling UCIS input (#5564)
[qmk_firmware.git] / drivers / haptic / haptic.c
1 /* Copyright 2019 ishtob
2  * Driver for haptic feedback written for QMK
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 #include "haptic.h"
18 #include "eeconfig.h"
19 #include "progmem.h"
20 #include "debug.h"
21 #ifdef DRV2605L
22 #include "DRV2605L.h"
23 #endif
24 #ifdef SOLENOID_ENABLE
25 #include "solenoid.h"
26 #endif
27
28 haptic_config_t haptic_config;
29
30 void haptic_init(void) {
31   debug_enable = 1; //Debug is ON!
32   if (!eeconfig_is_enabled()) {
33         eeconfig_init();
34   }
35   haptic_config.raw = eeconfig_read_haptic();
36   if (haptic_config.mode < 1){
37   haptic_config.mode = 1;
38   }
39   if (!haptic_config.mode){
40   dprintf("No haptic config found in eeprom, setting default configs\n");
41   haptic_reset();
42   }
43   #ifdef SOLENOID_ENABLE
44     solenoid_setup();
45     dprintf("Solenoid driver initialized\n");
46   #endif
47   #ifdef DRV2605L
48     DRV_init();
49     dprintf("DRV2605 driver initialized\n");
50   #endif
51   eeconfig_debug_haptic();
52 }
53
54 void haptic_task(void) {
55   #ifdef SOLENOID_ENABLE
56   solenoid_check();
57   #endif
58 }
59
60 void eeconfig_debug_haptic(void) {
61   dprintf("haptic_config eprom\n");
62   dprintf("haptic_config.enable = %d\n", haptic_config.enable);
63   dprintf("haptic_config.mode = %d\n", haptic_config.mode);
64 }
65
66 void haptic_enable(void) {
67   haptic_config.enable = 1;
68   xprintf("haptic_config.enable = %u\n", haptic_config.enable);
69   eeconfig_update_haptic(haptic_config.raw);
70 }
71
72 void haptic_disable(void) {
73   haptic_config.enable = 0;
74   xprintf("haptic_config.enable = %u\n", haptic_config.enable);
75   eeconfig_update_haptic(haptic_config.raw);
76 }
77
78 void haptic_toggle(void) {
79 if (haptic_config.enable) {
80   haptic_disable();
81   } else {
82   haptic_enable();
83   }
84   eeconfig_update_haptic(haptic_config.raw);
85 }
86
87 void haptic_feedback_toggle(void){
88  haptic_config.feedback++;
89   if (haptic_config.feedback >= HAPTIC_FEEDBACK_MAX)
90   haptic_config.feedback = KEY_PRESS;
91   xprintf("haptic_config.feedback = %u\n", !haptic_config.feedback);
92   eeconfig_update_haptic(haptic_config.raw);
93 }
94
95 void haptic_buzz_toggle(void) {
96   bool buzz_stat = !haptic_config.buzz;
97   haptic_config.buzz = buzz_stat;
98   haptic_set_buzz(buzz_stat);
99 }
100
101 void haptic_mode_increase(void) {
102   uint8_t mode = haptic_config.mode + 1;
103   #ifdef DRV2605L
104   if (haptic_config.mode >= drv_effect_max) {
105     mode = 1;
106   }
107   #endif
108     haptic_set_mode(mode);
109 }
110
111 void haptic_mode_decrease(void) {
112   uint8_t mode = haptic_config.mode -1;
113   #ifdef DRV2605L
114   if (haptic_config.mode < 1) {
115     mode = (drv_effect_max - 1);
116   }
117   #endif
118   haptic_set_mode(mode);
119 }
120
121 void haptic_dwell_increase(void) {
122   uint8_t dwell = haptic_config.dwell + 1;
123   #ifdef SOLENOID_ENABLE
124   if (haptic_config.dwell >= SOLENOID_MAX_DWELL) {
125     dwell = 1;
126   }
127   solenoid_set_dwell(dwell);
128   #endif
129   haptic_set_dwell(dwell);
130 }
131
132 void haptic_dwell_decrease(void) {
133   uint8_t dwell = haptic_config.dwell -1;
134   #ifdef SOLENOID_ENABLE
135   if (haptic_config.dwell < SOLENOID_MIN_DWELL) {
136     dwell = SOLENOID_MAX_DWELL;
137   }
138   solenoid_set_dwell(dwell);
139   #endif
140   haptic_set_dwell(dwell);
141 }
142
143 void haptic_reset(void){
144   haptic_config.enable = true;
145   uint8_t feedback = HAPTIC_FEEDBACK_DEFAULT;
146   haptic_config.feedback = feedback;
147   #ifdef DRV2605L
148     uint8_t mode = HAPTIC_MODE_DEFAULT;
149     haptic_config.mode = mode;
150   #endif
151   #ifdef SOLENOID_ENABLE
152     uint8_t dwell = SOLENOID_DEFAULT_DWELL;
153     haptic_config.dwell = dwell;
154   #endif
155   eeconfig_update_haptic(haptic_config.raw);
156   xprintf("haptic_config.feedback = %u\n", haptic_config.feedback);
157   xprintf("haptic_config.mode = %u\n", haptic_config.mode);
158 }
159
160 void haptic_set_feedback(uint8_t feedback) {
161   haptic_config.feedback = feedback;
162   eeconfig_update_haptic(haptic_config.raw);
163   xprintf("haptic_config.feedback = %u\n", haptic_config.feedback);
164 }
165
166 void haptic_set_mode(uint8_t mode) {
167   haptic_config.mode = mode;
168   eeconfig_update_haptic(haptic_config.raw);
169   xprintf("haptic_config.mode = %u\n", haptic_config.mode);
170 }
171
172 void haptic_set_buzz(uint8_t buzz) {
173   haptic_config.buzz = buzz;
174   eeconfig_update_haptic(haptic_config.raw);
175   xprintf("haptic_config.buzz = %u\n", haptic_config.buzz);
176 }
177
178 void haptic_set_dwell(uint8_t dwell) {
179   haptic_config.dwell = dwell;
180   eeconfig_update_haptic(haptic_config.raw);
181   xprintf("haptic_config.dwell = %u\n", haptic_config.dwell);
182 }
183
184 uint8_t haptic_get_mode(void) {
185   if (!haptic_config.enable){
186     return false;
187   }
188   return haptic_config.mode;
189 }
190
191 uint8_t haptic_get_feedback(void) {
192   if (!haptic_config.enable){
193     return false;
194   }
195   return haptic_config.feedback;
196 }
197
198 uint8_t haptic_get_dwell(void) {
199   if (!haptic_config.enable){
200     return false;
201   }
202   return haptic_config.dwell;
203 }
204
205 void haptic_play(void) {
206   #ifdef DRV2605L
207   uint8_t play_eff = 0;
208   play_eff = haptic_config.mode;
209   DRV_pulse(play_eff);
210   #endif
211   #ifdef SOLENOID_ENABLE
212   solenoid_fire();
213   #endif
214 }
215
216 bool process_haptic(uint16_t keycode, keyrecord_t *record) {
217     if (keycode == HPT_ON && record->event.pressed) { haptic_enable(); }
218     if (keycode == HPT_OFF && record->event.pressed) { haptic_disable(); }
219     if (keycode == HPT_TOG && record->event.pressed) { haptic_toggle(); }
220     if (keycode == HPT_RST && record->event.pressed) { haptic_reset(); }
221     if (keycode == HPT_FBK && record->event.pressed) { haptic_feedback_toggle(); }
222     if (keycode == HPT_BUZ && record->event.pressed) { haptic_buzz_toggle(); }
223     if (keycode == HPT_MODI && record->event.pressed) { haptic_mode_increase(); }
224     if (keycode == HPT_MODD && record->event.pressed) { haptic_mode_decrease(); }
225     if (keycode == HPT_DWLI && record->event.pressed) { haptic_dwell_increase(); }
226     if (keycode == HPT_DWLD && record->event.pressed) { haptic_dwell_decrease(); }
227   if (haptic_config.enable) {
228     if ( record->event.pressed ) {
229         // keypress
230       if (haptic_config.feedback < 2) {
231       haptic_play();
232       }
233     } else {
234     //keyrelease
235       if (haptic_config.feedback > 0) {
236       haptic_play();
237       } 
238     }
239   }
240   return true;
241 }
242
243 void haptic_shutdown(void) {
244   #ifdef SOLENOID_ENABLE
245   solenoid_shutdown();
246   #endif
247
248 }