diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index fcdbf73d..de10e85e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -17,12 +17,14 @@ jobs:
with:
flakes: nixpkgs#llvmPackages_18.clang-tools, nixpkgs#pre-commit
- - name: Run clang-format
- id: clang-format
- run: pre-commit run --all-files --show-diff-on-failure --color always
-
- name: Build Package
if: success() || (failure() && steps.clang-format.conclusion == 'failure')
uses: ./.github/actions/build
with:
cache-auth-token: '${{ secrets.CACHIX_AUTH_TOKEN }}'
+
+ - name: Upload refloat.vescpkg
+ uses: actions/upload-artifact@v4
+ with:
+ name: refloat-package
+ path: refloat.vescpkg
diff --git a/package_README.md b/package_README.md
index c42e70cd..353eb806 100644
--- a/package_README.md
+++ b/package_README.md
@@ -2,6 +2,9 @@
A full-featured self-balancing skateboard package.
+## Experiments
+Playing with reverse stop config for anti ghosting protection
+
## New in 1.2
- BMS alerting support (Pushback and Haptic)
- Speed-based alerting (Pushback and Haptic)
diff --git a/src/conf/datatypes.h b/src/conf/datatypes.h
index a03c68a6..4d15defe 100644
--- a/src/conf/datatypes.h
+++ b/src/conf/datatypes.h
@@ -229,6 +229,9 @@ typedef struct {
bool enable_quickstop;
bool fault_darkride_enabled;
bool fault_reversestop_enabled;
+ uint32_t reverse_tolerance;
+ uint16_t reverse_stop_trigger_erpm;
+ float reverse_erpm_incr;
float tiltback_duty_angle;
float tiltback_duty_speed;
float tiltback_duty;
diff --git a/src/conf/settings.xml b/src/conf/settings.xml
index 5f747b10..19b91541 100644
--- a/src/conf/settings.xml
+++ b/src/conf/settings.xml
@@ -521,6 +521,69 @@ p, li { white-space: pre-wrap; }
CFG_DFLT_FAULT_REVERSESTOP_ENABLED
0
+
+ Reverse Stop Tolerance
+ 2
+ 1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Roboto'; ; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ERPM deadzone before Reverse Stop begins to slow the board. </p></body></html>
+ CFG_DFLT_REVERSE_TOLERANCE
+ 1
+ 0
+ 100000000
+ 0
+ 0
+ 5000
+ 400000
+ ERPM
+ 5
+
+
+ Reverse Stop Trigger ERPM
+ 2
+ 1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Roboto'; ; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Minimum reverse speed to trigger Reverse Stop detection. The board must be moving backwards faster than this ERPM value before Reverse Stop can engage.</p></body></html>
+ CFG_DFLT_REVERSE_STOP_TRIGGER_ERPM
+ 1
+ 0
+ 65000
+ 0
+ 0
+ 200
+ 2000
+ ERPM
+ 3
+
+
+ Reverse Stop ERPM Increment
+ 1
+ 1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Roboto'; ; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Scale factor used to convert aggregated ERPM over the reverse tolerance into a tiltback setpoint angle. Smaller values make the system less aggressive.</p></body></html>
+ CFG_DFLT_REVERSE_ERPM_INCR
+ 8
+ 1
+ 0
+ 10
+ 0
+ 0
+ 1e-05
+ 8e-05
+ 1
+
+ 9
+
Pushback Angle
1
@@ -3944,6 +4007,9 @@ p, li { white-space: pre-wrap; }
enable_quickstop
fault_darkride_enabled
fault_reversestop_enabled
+ reverse_tolerance
+ reverse_stop_trigger_erpm
+ reverse_erpm_incr
tiltback_duty_angle
tiltback_duty_speed
tiltback_duty
@@ -4204,6 +4270,9 @@ p, li { white-space: pre-wrap; }
::sep::Features
fault_darkride_enabled
fault_reversestop_enabled
+ reverse_tolerance
+ reverse_stop_trigger_erpm
+ reverse_erpm_incr
diff --git a/src/data.h b/src/data.h
index ac85839d..775caf27 100644
--- a/src/data.h
+++ b/src/data.h
@@ -121,6 +121,7 @@ typedef struct {
// Feature: Reverse Stop
float reverse_stop_step_size, reverse_tolerance, reverse_total_erpm;
+ float reverse_total_erpm_plot;
time_t reverse_timer;
// Feature: Soft Start
diff --git a/src/main.c b/src/main.c
index 5d997d20..14a91f1d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -97,7 +97,6 @@ static void cmd_flywheel_toggle(Data *d, unsigned char *cfg, int len);
const VESC_PIN beeper_pin = VESC_PIN_PPM;
-#define REVSTOP_ERPM_INCR 0.00008
#define EXT_BEEPER_ON() VESC_IF->io_write(beeper_pin, 1)
#define EXT_BEEPER_OFF() VESC_IF->io_write(beeper_pin, 0)
@@ -205,8 +204,9 @@ static void configure(Data *d) {
}
// Feature: Reverse Stop
- d->reverse_tolerance = 20000;
+ d->reverse_tolerance = d->float_conf.reverse_tolerance;
d->reverse_stop_step_size = 100.0 / d->float_conf.hertz;
+ d->reverse_total_erpm_plot = d->reverse_total_erpm * 0.001f;
// Speed above which to warn users about an impending full switch fault
d->switch_warn_beep_erpm = d->float_conf.is_footbeep_enabled ? 2000 : 100000;
@@ -518,28 +518,31 @@ static void calculate_setpoint_target(Data *d) {
} else if (d->state.sat == SAT_REVERSESTOP) {
// accumalete erpms:
d->reverse_total_erpm += d->motor.erpm;
- if (fabsf(d->reverse_total_erpm) > d->reverse_tolerance) {
- // tilt down by 10 degrees after exceeding aggregate erpm
- d->setpoint_target =
- (fabsf(d->reverse_total_erpm) - d->reverse_tolerance) * REVSTOP_ERPM_INCR;
- } else {
+ d->reverse_total_erpm_plot = d->reverse_total_erpm * 0.001f;
+ if (fabsf(d->reverse_total_erpm) > d->reverse_tolerance) {
+ // tilt down by 10 degrees after exceeding aggregate erpm
+ d->setpoint_target =
+ (fabsf(d->reverse_total_erpm) - d->reverse_tolerance) *
+ d->float_conf.reverse_erpm_incr;
+ } else {
if (fabsf(d->reverse_total_erpm) <= d->reverse_tolerance * 0.5) {
- if (d->motor.erpm >= 0) {
+ if (d->motor.erpm >= -(int) d->float_conf.reverse_stop_trigger_erpm) {
d->state.sat = SAT_NONE;
d->reverse_total_erpm = 0;
d->setpoint_target = 0;
}
}
}
- } else if (d->float_conf.fault_reversestop_enabled && d->motor.erpm < -200 &&
+ } else if (d->float_conf.fault_reversestop_enabled && d->motor.erpm < -(int)d->float_conf.reverse_stop_trigger_erpm &&
!d->state.darkride) {
// Detecting reverse stop takes priority over any error condition SAT
- if (d->state.sat >= SAT_PB_HIGH_VOLTAGE) {
- // If this happens while in Error-Tiltback (LV/HV/TEMP) then we need to
- // take the already existing setpoint into account
- d->reverse_total_erpm =
- -(d->reverse_tolerance + d->setpoint_target_interpolated / REVSTOP_ERPM_INCR);
- } else {
+ if (d->state.sat >= SAT_PB_HIGH_VOLTAGE) {
+ // If this happens while in Error-Tiltback (LV/HV/TEMP) then we need to
+ // take the already existing setpoint into account
+ d->reverse_total_erpm = -(d->reverse_tolerance +
+ d->setpoint_target_interpolated /
+ d->float_conf.reverse_erpm_incr);
+ } else {
d->reverse_total_erpm = 0;
}
d->state.sat = SAT_REVERSESTOP;
diff --git a/src/rt_data.h b/src/rt_data.h
index 2e9a6bbb..428a4953 100644
--- a/src/rt_data.h
+++ b/src/rt_data.h
@@ -61,6 +61,8 @@
S(turn_tilt.setpoint) \
S(remote.setpoint) \
R(balance_current) \
+ R(reverse_total_erpm_plot) \
+ R(reverse_timer) \
S(atr.accel_diff) \
S(atr.speed_boost) \
S(booster.current)
diff --git a/ui.qml.in b/ui.qml.in
index cce22d8a..b73a3465 100644
--- a/ui.qml.in
+++ b/ui.qml.in
@@ -2143,6 +2143,8 @@ Item {
["footpad.adc1", {"name": "ADC1 Voltage", "color": "#69aad7", "visible": false}],
["footpad.adc2", {"name": "ADC2 Voltage", "color": "#4a8772", "visible": false}],
["balance_current", {"name": "Balance Current", "color": "#36738b", "visible": false}],
+ ["reverse_total_erpm_plot", {"name": "Reverse Total ERPM (k)", "color": "#748b36", "visible": false}],
+ ["reverse_timer", {"name": "Reverse Timer", "color": "#368b5c", "visible": false}],
["booster.current", {"name": "Booster Current", "color": "#8f2f26", "visible": false}],
["atr.accel_diff", {"name": "ATR Accel Diff", "color": "#4f5984", "visible": false}],
["atr.speed_boost", {"name": "ATR Speed Boost", "color": "#34633c", "visible": false}],
diff --git a/version b/version
index 0495c4a8..e8ea05db 100644
--- a/version
+++ b/version
@@ -1 +1 @@
-1.2.3
+1.2.4