DRV2605L Continuous Haptic Feedback Support (#6461)
* provide means to turn on RTP mode and set the amplitude * new keycode HPT_CONT to turn RTP off/on * introduce new keycodes HPT_CONI, and HPT_COND for Haptic Continuous Increase and Decrease * support for continuous mode amplitude increase and decrease * code cleanup * update docs to reference new keycodes and functionality * don't touch the keymaps * add function prototypes * add proper guards * cleanup guards * remove extra reserved
This commit is contained in:
parent
7a5a2591eb
commit
911b8915cc
@ -29,6 +29,9 @@ Not all keycodes below will work depending on which haptic mechanism you have ch
|
|||||||
|`HPT_BUZ` | Toggle solenoid buzz on/off |
|
|`HPT_BUZ` | Toggle solenoid buzz on/off |
|
||||||
|`HPT_MODI` | Go to next DRV2605L waveform |
|
|`HPT_MODI` | Go to next DRV2605L waveform |
|
||||||
|`HPT_MODD` | Go to previous DRV2605L waveform |
|
|`HPT_MODD` | Go to previous DRV2605L waveform |
|
||||||
|
|`HPT_CONT` | Toggle continuous haptic mode on/off |
|
||||||
|
|`HPT_CONI` | Increase DRV2605L continous haptic strength |
|
||||||
|
|`HPT_COND` | Decrease DRV2605L continous haptic strength |
|
||||||
|`HPT_DWLI` | Increase Solenoid dwell time |
|
|`HPT_DWLI` | Increase Solenoid dwell time |
|
||||||
|`HPT_DWLD` | Decrease Solenoid dwell time |
|
|`HPT_DWLD` | Decrease Solenoid dwell time |
|
||||||
|
|
||||||
@ -145,3 +148,7 @@ If haptic feedback is enabled, the keyboard will vibrate to a specific sqeuence
|
|||||||
#define DRV_MODE_DEFAULT *sequence name or number*
|
#define DRV_MODE_DEFAULT *sequence name or number*
|
||||||
```
|
```
|
||||||
This will set what sequence HPT_RST will set as the active mode. If not defined, mode will be set to 1 when HPT_RST is pressed.
|
This will set what sequence HPT_RST will set as the active mode. If not defined, mode will be set to 1 when HPT_RST is pressed.
|
||||||
|
|
||||||
|
### DRV2605L Continuous Haptic Mode
|
||||||
|
|
||||||
|
This mode sets continuous haptic feedback with the option to increase or decrease strength.
|
@ -114,6 +114,17 @@ void DRV_init(void) {
|
|||||||
DRV_write(DRV_GO, 0x01);
|
DRV_write(DRV_GO, 0x01);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DRV_rtp_init(void) {
|
||||||
|
DRV_write(DRV_GO, 0x00);
|
||||||
|
DRV_write(DRV_RTP_INPUT, 20); //20 is the lowest value I've found where haptics can still be felt.
|
||||||
|
DRV_write(DRV_MODE, 0x05);
|
||||||
|
DRV_write(DRV_GO, 0x01);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DRV_amplitude(uint8_t amplitude) {
|
||||||
|
DRV_write(DRV_RTP_INPUT, amplitude);
|
||||||
|
}
|
||||||
|
|
||||||
void DRV_pulse(uint8_t sequence) {
|
void DRV_pulse(uint8_t sequence) {
|
||||||
DRV_write(DRV_GO, 0x00);
|
DRV_write(DRV_GO, 0x00);
|
||||||
DRV_write(DRV_WAVEFORM_SEQ_1, sequence);
|
DRV_write(DRV_WAVEFORM_SEQ_1, sequence);
|
||||||
|
@ -170,6 +170,8 @@
|
|||||||
void DRV_init(void);
|
void DRV_init(void);
|
||||||
void DRV_write(const uint8_t drv_register, const uint8_t settings);
|
void DRV_write(const uint8_t drv_register, const uint8_t settings);
|
||||||
uint8_t DRV_read(const uint8_t regaddress);
|
uint8_t DRV_read(const uint8_t regaddress);
|
||||||
|
void DRV_rtp_init(void);
|
||||||
|
void DRV_amplitude(const uint8_t amplitude);
|
||||||
void DRV_pulse(const uint8_t sequence);
|
void DRV_pulse(const uint8_t sequence);
|
||||||
|
|
||||||
typedef enum DRV_EFFECT {
|
typedef enum DRV_EFFECT {
|
||||||
|
@ -168,6 +168,15 @@ void haptic_set_mode(uint8_t mode) {
|
|||||||
xprintf("haptic_config.mode = %u\n", haptic_config.mode);
|
xprintf("haptic_config.mode = %u\n", haptic_config.mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void haptic_set_amplitude(uint8_t amp) {
|
||||||
|
haptic_config.amplitude = amp;
|
||||||
|
eeconfig_update_haptic(haptic_config.raw);
|
||||||
|
xprintf("haptic_config.amplitude = %u\n", haptic_config.amplitude);
|
||||||
|
#ifdef DRV2605L
|
||||||
|
DRV_amplitude(amp);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void haptic_set_buzz(uint8_t buzz) {
|
void haptic_set_buzz(uint8_t buzz) {
|
||||||
haptic_config.buzz = buzz;
|
haptic_config.buzz = buzz;
|
||||||
eeconfig_update_haptic(haptic_config.raw);
|
eeconfig_update_haptic(haptic_config.raw);
|
||||||
@ -201,6 +210,53 @@ uint8_t haptic_get_dwell(void) {
|
|||||||
return haptic_config.dwell;
|
return haptic_config.dwell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void haptic_enable_continuous(void) {
|
||||||
|
haptic_config.cont = 1;
|
||||||
|
xprintf("haptic_config.cont = %u\n", haptic_config.cont);
|
||||||
|
eeconfig_update_haptic(haptic_config.raw);
|
||||||
|
#ifdef DRV2605L
|
||||||
|
DRV_rtp_init();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void haptic_disable_continuous(void) {
|
||||||
|
haptic_config.cont = 0;
|
||||||
|
xprintf("haptic_config.cont = %u\n", haptic_config.cont);
|
||||||
|
eeconfig_update_haptic(haptic_config.raw);
|
||||||
|
#ifdef DRV2605L
|
||||||
|
DRV_write(DRV_MODE,0x00);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void haptic_toggle_continuous(void) {
|
||||||
|
#ifdef DRV2605L
|
||||||
|
if (haptic_config.cont) {
|
||||||
|
haptic_disable_continuous();
|
||||||
|
} else {
|
||||||
|
haptic_enable_continuous();
|
||||||
|
}
|
||||||
|
eeconfig_update_haptic(haptic_config.raw);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void haptic_cont_increase(void) {
|
||||||
|
uint8_t amp = haptic_config.amplitude + 10;
|
||||||
|
if (haptic_config.amplitude >= 120) {
|
||||||
|
amp = 120;
|
||||||
|
}
|
||||||
|
haptic_set_amplitude(amp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void haptic_cont_decrease(void) {
|
||||||
|
uint8_t amp = haptic_config.amplitude - 10;
|
||||||
|
if (haptic_config.amplitude < 20) {
|
||||||
|
amp = 20;
|
||||||
|
}
|
||||||
|
haptic_set_amplitude(amp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void haptic_play(void) {
|
void haptic_play(void) {
|
||||||
#ifdef DRV2605L
|
#ifdef DRV2605L
|
||||||
uint8_t play_eff = 0;
|
uint8_t play_eff = 0;
|
||||||
@ -213,6 +269,7 @@ void haptic_play(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool process_haptic(uint16_t keycode, keyrecord_t *record) {
|
bool process_haptic(uint16_t keycode, keyrecord_t *record) {
|
||||||
|
|
||||||
if (keycode == HPT_ON && record->event.pressed) {
|
if (keycode == HPT_ON && record->event.pressed) {
|
||||||
haptic_enable();
|
haptic_enable();
|
||||||
}
|
}
|
||||||
@ -243,6 +300,16 @@ bool process_haptic(uint16_t keycode, keyrecord_t *record) {
|
|||||||
if (keycode == HPT_DWLD && record->event.pressed) {
|
if (keycode == HPT_DWLD && record->event.pressed) {
|
||||||
haptic_dwell_decrease();
|
haptic_dwell_decrease();
|
||||||
}
|
}
|
||||||
|
if (keycode == HPT_CONT && record->event.pressed) {
|
||||||
|
haptic_toggle_continuous();
|
||||||
|
}
|
||||||
|
if (keycode == HPT_CONI && record->event.pressed) {
|
||||||
|
haptic_cont_increase();
|
||||||
|
}
|
||||||
|
if (keycode == HPT_COND && record->event.pressed) {
|
||||||
|
haptic_cont_decrease();
|
||||||
|
}
|
||||||
|
|
||||||
if (haptic_config.enable) {
|
if (haptic_config.enable) {
|
||||||
if (record->event.pressed) {
|
if (record->event.pressed) {
|
||||||
// keypress
|
// keypress
|
||||||
|
@ -34,12 +34,14 @@
|
|||||||
typedef union {
|
typedef union {
|
||||||
uint32_t raw;
|
uint32_t raw;
|
||||||
struct {
|
struct {
|
||||||
bool enable : 1;
|
bool enable :1;
|
||||||
uint8_t feedback : 2;
|
uint8_t feedback :2;
|
||||||
uint8_t mode : 7;
|
uint8_t mode :7;
|
||||||
bool buzz : 1;
|
bool buzz :1;
|
||||||
uint8_t dwell : 7;
|
uint8_t dwell :7;
|
||||||
uint16_t reserved : 16;
|
bool cont :1;
|
||||||
|
uint8_t amplitude :8;
|
||||||
|
uint16_t reserved :7;
|
||||||
};
|
};
|
||||||
} haptic_config_t;
|
} haptic_config_t;
|
||||||
|
|
||||||
@ -71,6 +73,9 @@ uint8_t haptic_get_mode(void);
|
|||||||
uint8_t haptic_get_feedback(void);
|
uint8_t haptic_get_feedback(void);
|
||||||
void haptic_dwell_increase(void);
|
void haptic_dwell_increase(void);
|
||||||
void haptic_dwell_decrease(void);
|
void haptic_dwell_decrease(void);
|
||||||
|
void haptic_toggle_continuous(void);
|
||||||
|
void haptic_cont_increase(void);
|
||||||
|
void haptic_cont_decrease(void);
|
||||||
|
|
||||||
void haptic_play(void);
|
void haptic_play(void);
|
||||||
void haptic_shutdown(void);
|
void haptic_shutdown(void);
|
||||||
|
@ -473,6 +473,9 @@ enum quantum_keycodes {
|
|||||||
HPT_BUZ,
|
HPT_BUZ,
|
||||||
HPT_MODI,
|
HPT_MODI,
|
||||||
HPT_MODD,
|
HPT_MODD,
|
||||||
|
HPT_CONT,
|
||||||
|
HPT_CONI,
|
||||||
|
HPT_COND,
|
||||||
HPT_DWLI,
|
HPT_DWLI,
|
||||||
HPT_DWLD,
|
HPT_DWLD,
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user