@@ -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 ,
@@ -227,9 +228,6 @@ static void configure(Data *d) {
227228 VESC_IF -> set_cfg_float (CFG_PARAM_IMU_accel_confidence_decay , 0.1 );
228229 }
229230
230- // Feature: Reverse Stop
231- d -> reverse_tolerance = 20000 ;
232-
233231 // Speed above which to warn users about an impending full switch fault
234232 d -> switch_warn_beep_erpm = d -> float_conf .is_footbeep_enabled ? 2000 : 100000 ;
235233
@@ -259,6 +257,7 @@ static void reset_runtime_vars(Data *d) {
259257 turn_tilt_reset (& d -> turn_tilt );
260258 remote_reset (& d -> remote );
261259 booster_reset (& d -> booster );
260+ reverse_stop_reset (& d -> reverse_stop , d -> motor .distance );
262261
263262 ema_reset (& d -> balance_current , 0.0f );
264263
@@ -441,34 +440,17 @@ static bool check_faults(Data *d) {
441440 timer_refresh (& d -> time , & d -> fault_switch_timer );
442441 }
443442
444- // Feature: Reverse-Stop
445443 if (d -> state .sat == SAT_REVERSESTOP ) {
446- // Taking your foot off entirely while reversing? Ignore delays
444+ // ignore delays if sensor is completely disengaged while reversing
447445 if (d -> footpad .state == FS_NONE ) {
448446 state_stop (& d -> state , STOP_SWITCH_FULL );
449447 return true;
450448 }
451- if (fabsf (d -> imu .pitch ) > 18 ) {
452- state_stop (& d -> state , STOP_REVERSE_STOP );
453- return true;
454- }
455- // Above 10 degrees for a full second? Switch it off
456- if (fabsf (d -> imu .pitch ) > 10 && timer_older (& d -> time , d -> reverse_timer , 1 )) {
457- state_stop (& d -> state , STOP_REVERSE_STOP );
458- return true;
459- }
460- // Above 5 degrees for 2 seconds? Switch it off
461- if (fabsf (d -> imu .pitch ) > 5 && timer_older (& d -> time , d -> reverse_timer , 2 )) {
462- state_stop (& d -> state , STOP_REVERSE_STOP );
463- return true;
464- }
465- if (fabsf (d -> reverse_total_erpm ) > d -> reverse_tolerance * 10 ) {
449+
450+ if (reverse_stop_stop (& d -> reverse_stop , & d -> time )) {
466451 state_stop (& d -> state , STOP_REVERSE_STOP );
467452 return true;
468453 }
469- if (fabsf (d -> imu .pitch ) < 5 ) {
470- timer_refresh (& d -> time , & d -> reverse_timer );
471- }
472454 }
473455
474456 // Switch partially open and stopped
@@ -535,34 +517,15 @@ static void calculate_setpoint_target(Data *d) {
535517 d -> state .sat = SAT_NONE ;
536518 }
537519 } else if (d -> state .sat == SAT_REVERSESTOP ) {
538- // accumalete erpms:
539- d -> reverse_total_erpm += d -> motor .erpm ;
540- if (fabsf (d -> reverse_total_erpm ) > d -> reverse_tolerance ) {
541- // tilt down by 10 degrees after exceeding aggregate erpm
542- d -> setpoint_target =
543- (fabsf (d -> reverse_total_erpm ) - d -> reverse_tolerance ) * REVSTOP_ERPM_INCR ;
520+ if (reverse_stop_active (& d -> reverse_stop )) {
521+ d -> setpoint_target = reverse_stop_setpoint (& d -> reverse_stop );
544522 } else {
545- if (fabsf (d -> reverse_total_erpm ) <= d -> reverse_tolerance * 0.5 ) {
546- if (d -> motor .erpm >= 0 ) {
547- d -> state .sat = SAT_NONE ;
548- d -> reverse_total_erpm = 0 ;
549- d -> setpoint_target = 0 ;
550- }
551- }
523+ d -> state .sat = SAT_NONE ;
552524 }
553- } else if (d -> float_conf .fault_reversestop_enabled && d -> motor . erpm < -200 &&
525+ } else if (d -> float_conf .fault_reversestop_enabled && reverse_stop_active ( & d -> reverse_stop ) &&
554526 !d -> state .darkride ) {
555- // Detecting reverse stop takes priority over any error condition SAT
556- if (d -> state .sat >= SAT_PB_HIGH_VOLTAGE ) {
557- // If this happens while in Error-Tiltback (LV/HV/TEMP) then we need to
558- // take the already existing setpoint into account
559- d -> reverse_total_erpm =
560- - (d -> reverse_tolerance + d -> setpoint_target_interpolated / REVSTOP_ERPM_INCR );
561- } else {
562- d -> reverse_total_erpm = 0 ;
563- }
527+ d -> setpoint_target = reverse_stop_setpoint (& d -> reverse_stop );
564528 d -> state .sat = SAT_REVERSESTOP ;
565- timer_refresh (& d -> time , & d -> reverse_timer );
566529 } else if (d -> state .mode != MODE_FLYWHEEL &&
567530 // not normal, either wheelslip or wheel getting stuck
568531 fabsf (d -> motor .acceleration .value ) > 10000 &&
@@ -923,6 +886,14 @@ static void refloat_thd(void *arg) {
923886 break ;
924887
925888 case (STATE_RUNNING ):
889+ reverse_stop_update (
890+ & d -> reverse_stop ,
891+ d -> motor .distance ,
892+ d -> setpoint_target_interpolated ,
893+ & d -> time ,
894+ d -> float_conf .fault_reversestop_enabled
895+ );
896+
926897 // Check for faults
927898 if (check_faults (d )) {
928899 if (d -> state .stop_condition == STOP_SWITCH_FULL && !d -> state .darkride ) {
@@ -1262,6 +1233,7 @@ static void data_init(Data *d) {
12621233 footpad_sensor_init (& d -> footpad );
12631234 haptic_feedback_init (& d -> haptic_feedback );
12641235 alert_tracker_init (& d -> alert_tracker );
1236+ reverse_stop_init (& d -> reverse_stop );
12651237
12661238 leds_init (& d -> leds );
12671239 lcm_init (& d -> lcm , & d -> float_conf .hardware .leds );
0 commit comments