@@ -97,7 +97,6 @@ static void cmd_flywheel_toggle(Data *d, unsigned char *cfg, int len);
9797
9898const VESC_PIN beeper_pin = VESC_PIN_PPM ;
9999
100- #define REVSTOP_ERPM_INCR 0.00008
101100#define EXT_BEEPER_ON () VESC_IF->io_write(beeper_pin, 1)
102101#define EXT_BEEPER_OFF () VESC_IF->io_write(beeper_pin, 0)
103102
@@ -172,6 +171,8 @@ static void main_freq_update_reconfigure(float frequency) {
172171
173172 ema_configure (& d -> balance_current , 25.0f , frequency );
174173
174+ reverse_stop_configure (& d -> reverse_stop , frequency );
175+
175176 log_msg (
176177 "Main freq reconfgure old: %dHz new: %dHz" ,
177178 (int32_t ) d -> main_t .filter_frequency ,
@@ -228,9 +229,6 @@ static void configure(Data *d) {
228229 VESC_IF -> set_cfg_float (CFG_PARAM_IMU_accel_confidence_decay , 0.1 );
229230 }
230231
231- // Feature: Reverse Stop
232- d -> reverse_tolerance = 20000 ;
233-
234232 // Speed above which to warn users about an impending full switch fault
235233 d -> switch_warn_beep_erpm = d -> float_conf .is_footbeep_enabled ? 2000 : 100000 ;
236234
@@ -260,6 +258,7 @@ static void reset_runtime_vars(Data *d) {
260258 turn_tilt_reset (& d -> turn_tilt );
261259 remote_reset (& d -> remote );
262260 booster_reset (& d -> booster );
261+ reverse_stop_reset (& d -> reverse_stop , d -> motor .distance );
263262
264263 ema_reset (& d -> balance_current , 0.0f );
265264
@@ -442,34 +441,17 @@ static bool check_faults(Data *d) {
442441 timer_refresh (& d -> time , & d -> fault_switch_timer );
443442 }
444443
445- // Feature: Reverse-Stop
446444 if (d -> state .sat == SAT_REVERSESTOP ) {
447- // Taking your foot off entirely while reversing? Ignore delays
445+ // ignore delays if sensor is completely disengaged while reversing
448446 if (d -> footpad .state == FS_NONE ) {
449447 state_stop (& d -> state , STOP_SWITCH_FULL );
450448 return true;
451449 }
452- if (fabsf (d -> imu .pitch ) > 18 ) {
453- state_stop (& d -> state , STOP_REVERSE_STOP );
454- return true;
455- }
456- // Above 10 degrees for a full second? Switch it off
457- if (fabsf (d -> imu .pitch ) > 10 && timer_older (& d -> time , d -> reverse_timer , 1 )) {
458- state_stop (& d -> state , STOP_REVERSE_STOP );
459- return true;
460- }
461- // Above 5 degrees for 2 seconds? Switch it off
462- if (fabsf (d -> imu .pitch ) > 5 && timer_older (& d -> time , d -> reverse_timer , 2 )) {
463- state_stop (& d -> state , STOP_REVERSE_STOP );
464- return true;
465- }
466- if (fabsf (d -> reverse_total_erpm ) > d -> reverse_tolerance * 10 ) {
450+
451+ if (reverse_stop_stop (& d -> reverse_stop , & d -> time )) {
467452 state_stop (& d -> state , STOP_REVERSE_STOP );
468453 return true;
469454 }
470- if (fabsf (d -> imu .pitch ) < 5 ) {
471- timer_refresh (& d -> time , & d -> reverse_timer );
472- }
473455 }
474456
475457 // Switch partially open and stopped
@@ -536,34 +518,15 @@ static void calculate_setpoint_target(Data *d) {
536518 d -> state .sat = SAT_NONE ;
537519 }
538520 } else if (d -> state .sat == SAT_REVERSESTOP ) {
539- // accumalete erpms:
540- d -> reverse_total_erpm += d -> motor .erpm ;
541- if (fabsf (d -> reverse_total_erpm ) > d -> reverse_tolerance ) {
542- // tilt down by 10 degrees after exceeding aggregate erpm
543- d -> setpoint_target =
544- (fabsf (d -> reverse_total_erpm ) - d -> reverse_tolerance ) * REVSTOP_ERPM_INCR ;
521+ if (reverse_stop_active (& d -> reverse_stop )) {
522+ d -> setpoint_target = reverse_stop_setpoint (& d -> reverse_stop );
545523 } else {
546- if (fabsf (d -> reverse_total_erpm ) <= d -> reverse_tolerance * 0.5 ) {
547- if (d -> motor .erpm >= 0 ) {
548- d -> state .sat = SAT_NONE ;
549- d -> reverse_total_erpm = 0 ;
550- d -> setpoint_target = 0 ;
551- }
552- }
524+ d -> state .sat = SAT_NONE ;
553525 }
554- } else if (d -> float_conf .fault_reversestop_enabled && d -> motor . erpm < -200 &&
526+ } else if (d -> float_conf .fault_reversestop_enabled && reverse_stop_active ( & d -> reverse_stop ) &&
555527 !d -> state .darkride ) {
556- // Detecting reverse stop takes priority over any error condition SAT
557- if (d -> state .sat >= SAT_PB_HIGH_VOLTAGE ) {
558- // If this happens while in Error-Tiltback (LV/HV/TEMP) then we need to
559- // take the already existing setpoint into account
560- d -> reverse_total_erpm =
561- - (d -> reverse_tolerance + d -> setpoint_target_interpolated / REVSTOP_ERPM_INCR );
562- } else {
563- d -> reverse_total_erpm = 0 ;
564- }
528+ d -> setpoint_target = reverse_stop_setpoint (& d -> reverse_stop );
565529 d -> state .sat = SAT_REVERSESTOP ;
566- timer_refresh (& d -> time , & d -> reverse_timer );
567530 } else if (d -> state .mode != MODE_FLYWHEEL &&
568531 // not normal, either wheelslip or wheel getting stuck
569532 fabsf (d -> motor .acceleration .value ) > 10000 &&
@@ -924,6 +887,14 @@ static void refloat_thd(void *arg) {
924887 break ;
925888
926889 case (STATE_RUNNING ):
890+ reverse_stop_update (
891+ & d -> reverse_stop ,
892+ d -> motor .distance ,
893+ d -> setpoint_target_interpolated ,
894+ & d -> time ,
895+ d -> float_conf .fault_reversestop_enabled
896+ );
897+
927898 // Check for faults
928899 if (check_faults (d )) {
929900 if (d -> state .stop_condition == STOP_SWITCH_FULL && !d -> state .darkride ) {
@@ -1263,6 +1234,7 @@ static void data_init(Data *d) {
12631234 footpad_sensor_init (& d -> footpad );
12641235 haptic_feedback_init (& d -> haptic_feedback );
12651236 alert_tracker_init (& d -> alert_tracker );
1237+ reverse_stop_init (& d -> reverse_stop );
12661238
12671239 leds_init (& d -> leds );
12681240 lcm_init (& d -> lcm , & d -> float_conf .hardware .leds );
0 commit comments