Skip to content

Commit

Permalink
Haptic feedback for high voltage intensifies after 3 seconds
Browse files Browse the repository at this point in the history
Also, HV tiltback now delayed by 5 seconds instead of just 0.5
  • Loading branch information
surfdado committed Dec 17, 2024
1 parent 96d2608 commit 7569498
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 10 deletions.
22 changes: 16 additions & 6 deletions src/haptic_feedback.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,9 @@ static HapticFeedbackType state_to_haptic_type(const State *state) {
case SAT_PB_TEMPERATURE:
return HAPTIC_FEEDBACK_ERROR_TEMPERATURE;
case SAT_PB_LOW_VOLTAGE:
return HAPTIC_FEEDBACK_ERROR_LO_VOLTAGE;
case SAT_PB_HIGH_VOLTAGE:
return HAPTIC_FEEDBACK_ERROR_VOLTAGE;
return HAPTIC_FEEDBACK_ERROR_HI_VOLTAGE;
default:
return HAPTIC_FEEDBACK_NONE;
}
Expand All @@ -64,7 +65,8 @@ static uint8_t get_beats(HapticFeedbackType type) {
return 0;
case HAPTIC_FEEDBACK_ERROR_TEMPERATURE:
return 6;
case HAPTIC_FEEDBACK_ERROR_VOLTAGE:
case HAPTIC_FEEDBACK_ERROR_LO_VOLTAGE:
case HAPTIC_FEEDBACK_ERROR_HI_VOLTAGE:
return 8;
case HAPTIC_FEEDBACK_NONE:
break;
Expand All @@ -79,7 +81,8 @@ static const CfgHapticTone *get_haptic_tone(const HapticFeedback *hf) {
case HAPTIC_FEEDBACK_DUTY_CONTINUOUS:
return &hf->cfg->duty;
case HAPTIC_FEEDBACK_ERROR_TEMPERATURE:
case HAPTIC_FEEDBACK_ERROR_VOLTAGE:
case HAPTIC_FEEDBACK_ERROR_LO_VOLTAGE:
case HAPTIC_FEEDBACK_ERROR_HI_VOLTAGE:
return &hf->cfg->error;
case HAPTIC_FEEDBACK_NONE:
break;
Expand Down Expand Up @@ -145,9 +148,16 @@ void haptic_feedback_update(
float speed = VESC_IF->mc_get_speed();
const CfgHapticTone *tone = get_haptic_tone(hf);
if (tone->strength > 0.0f) {
VESC_IF->foc_play_tone(
0, tone->frequency, scale_strength(tone->strength, hf->cfg, speed)
);
float strength = scale_strength(tone->strength, hf->cfg, speed);
if (type_to_play == HAPTIC_FEEDBACK_ERROR_HI_VOLTAGE) {
float duration = current_time - hf->start_time;
if (duration > 3) {
// more than 3 seconds in HV? Start scaling up for next 2 seconds
// up to 50% louder
strength = strength * fminf(1.5, duration * 0.25 + 0.25);
}
}
VESC_IF->foc_play_tone(0, tone->frequency, strength);
}

if (hf->cfg->vibrate.strength > 0.0f) {
Expand Down
3 changes: 2 additions & 1 deletion src/haptic_feedback.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ typedef enum {
HAPTIC_FEEDBACK_DUTY,
HAPTIC_FEEDBACK_DUTY_CONTINUOUS,
HAPTIC_FEEDBACK_ERROR_TEMPERATURE,
HAPTIC_FEEDBACK_ERROR_VOLTAGE,
HAPTIC_FEEDBACK_ERROR_LO_VOLTAGE,
HAPTIC_FEEDBACK_ERROR_HI_VOLTAGE,
} HapticFeedbackType;

typedef struct {
Expand Down
6 changes: 3 additions & 3 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -755,9 +755,9 @@ static void calculate_setpoint_target(data *d) {
} else if (d->motor.duty_cycle > 0.05 && input_voltage > d->float_conf.tiltback_hv) {
d->beep_reason = BEEP_HV;
beep_alert(d, 3, false);
if (((d->current_time - d->tb_highvoltage_timer) > .5) ||
(input_voltage > d->float_conf.tiltback_hv + 1)) {
// 500ms have passed or voltage is another volt higher, time for some tiltback
if ((d->current_time - d->tb_highvoltage_timer) > 5) {
// It is assumed that haptic feedback is enabled!
// 5s have passed or voltage is another volt higher, time for some tiltback
if (d->motor.erpm > 0) {
d->setpoint_target = d->float_conf.tiltback_hv_angle;
} else {
Expand Down

0 comments on commit 7569498

Please sign in to comment.