From 57be3fadb777f185454361270c1a8076417ed6a5 Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Tue, 20 Oct 2020 00:40:22 -0400 Subject: add speed cap --- common/rawaccel-settings.h | 1 + common/rawaccel.hpp | 28 ++++++++++++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) (limited to 'common') diff --git a/common/rawaccel-settings.h b/common/rawaccel-settings.h index aeb89e8..02f0a8a 100644 --- a/common/rawaccel-settings.h +++ b/common/rawaccel-settings.h @@ -18,6 +18,7 @@ namespace rawaccel { bool combine_mags = true; vec2 modes = { accel_mode::noaccel, accel_mode::noaccel }; vec2 argsv; + double speed_cap = 0; vec2d sens = { 1, 1 }; milliseconds time_min = DEFAULT_TIME_MIN; }; diff --git a/common/rawaccel.hpp b/common/rawaccel.hpp index ecd3850..3a49aa6 100644 --- a/common/rawaccel.hpp +++ b/common/rawaccel.hpp @@ -200,11 +200,25 @@ namespace rawaccel { accel(args, mode, lut), gain_cap(args.gain_cap, accel), clamp(args.scale_cap) {} - inline double apply(double speed) const { + inline double apply(double speed, double output_speed_cap) const { + double scale; + if (gain_cap.should_apply(speed)) { - return clamp(gain_cap.apply(speed)); + scale = gain_cap.apply(speed); + } + else { + scale = accel.apply(speed); + } + + scale = clamp(scale); + + double output_speed = scale * speed; + + if (output_speed_cap > 0 && output_speed > output_speed_cap) { + scale = output_speed_cap / speed; } - else return clamp(accel.apply(speed)); + + return scale; } accelerator() = default; @@ -216,6 +230,7 @@ namespace rawaccel { bool apply_accel = false; bool combine_magnitudes = true; rotator rotate; + double output_speed_cap = 0; vec2 accels; vec2d sensitivity = { 1, 1 }; @@ -236,6 +251,7 @@ namespace rawaccel { return; } + output_speed_cap = maxsd(args.speed_cap, 0); accels.x = accelerator(args.argsv.x, args.modes.x, luts.x); accels.y = accelerator(args.argsv.y, args.modes.y, luts.y); apply_accel = true; @@ -259,13 +275,13 @@ namespace rawaccel { if (combine_magnitudes) { double mag = sqrtsd(movement.x * movement.x + movement.y * movement.y); double speed = mag / time; - double scale = accels.x.apply(speed); + double scale = accels.x.apply(speed, output_speed_cap); movement.x *= scale; movement.y *= scale; } else { - movement.x *= accels.x.apply(fabs(movement.x) / time); - movement.y *= accels.y.apply(fabs(movement.y) / time); + movement.x *= accels.x.apply(fabs(movement.x) / time, output_speed_cap); + movement.y *= accels.y.apply(fabs(movement.y) / time, output_speed_cap); } } } -- cgit v1.2.3 From c7ba6fb1d992a0efbcb581dfeaa65b0f5f59cdb7 Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Tue, 20 Oct 2020 19:05:35 -0400 Subject: update min time threshold for 8khz --- common/rawaccel-settings.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'common') diff --git a/common/rawaccel-settings.h b/common/rawaccel-settings.h index 02f0a8a..fe17181 100644 --- a/common/rawaccel-settings.h +++ b/common/rawaccel-settings.h @@ -4,10 +4,12 @@ #include "accel-base.hpp" namespace rawaccel { + using milliseconds = double; + inline constexpr int MAX_POLL_RATE_KHZ = 8; + inline constexpr milliseconds DEFAULT_TIME_MIN = 1.0 / MAX_POLL_RATE_KHZ * 0.8; inline constexpr milliseconds WRITE_DELAY = 1000; - inline constexpr milliseconds DEFAULT_TIME_MIN = 0.4; enum class accel_mode { linear, classic, natural, naturalgain, power, motivity, noaccel -- cgit v1.2.3 From f0ec7a278892c0dfed7c39e4efebd57d97cdb46c Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Wed, 21 Oct 2020 21:03:19 -0400 Subject: move speedcap into accelerator --- common/accel-base.hpp | 1 + common/rawaccel-settings.h | 1 - common/rawaccel.hpp | 19 +++++++++---------- 3 files changed, 10 insertions(+), 11 deletions(-) (limited to 'common') diff --git a/common/accel-base.hpp b/common/accel-base.hpp index ac7ac4d..b15d695 100644 --- a/common/accel-base.hpp +++ b/common/accel-base.hpp @@ -14,6 +14,7 @@ namespace rawaccel { double weight = 1; double scale_cap = 0; double gain_cap = 0; + double speed_cap = 0; }; template diff --git a/common/rawaccel-settings.h b/common/rawaccel-settings.h index fe17181..e9e158c 100644 --- a/common/rawaccel-settings.h +++ b/common/rawaccel-settings.h @@ -20,7 +20,6 @@ namespace rawaccel { bool combine_mags = true; vec2 modes = { accel_mode::noaccel, accel_mode::noaccel }; vec2 argsv; - double speed_cap = 0; vec2d sens = { 1, 1 }; milliseconds time_min = DEFAULT_TIME_MIN; }; diff --git a/common/rawaccel.hpp b/common/rawaccel.hpp index 3a49aa6..b160a42 100644 --- a/common/rawaccel.hpp +++ b/common/rawaccel.hpp @@ -195,12 +195,15 @@ namespace rawaccel { accel_variant accel; velocity_gain_cap gain_cap; accel_scale_clamp clamp; + double output_speed_cap = 0; accelerator(const accel_args& args, accel_mode mode, si_pair* lut = nullptr) : accel(args, mode, lut), gain_cap(args.gain_cap, accel), clamp(args.scale_cap) - {} + { + output_speed_cap = maxsd(args.speed_cap, 0); + } - inline double apply(double speed, double output_speed_cap) const { + inline double apply(double speed) const { double scale; if (gain_cap.should_apply(speed)) { @@ -212,9 +215,7 @@ namespace rawaccel { scale = clamp(scale); - double output_speed = scale * speed; - - if (output_speed_cap > 0 && output_speed > output_speed_cap) { + if (output_speed_cap > 0 && (scale * speed) > output_speed_cap) { scale = output_speed_cap / speed; } @@ -230,7 +231,6 @@ namespace rawaccel { bool apply_accel = false; bool combine_magnitudes = true; rotator rotate; - double output_speed_cap = 0; vec2 accels; vec2d sensitivity = { 1, 1 }; @@ -251,7 +251,6 @@ namespace rawaccel { return; } - output_speed_cap = maxsd(args.speed_cap, 0); accels.x = accelerator(args.argsv.x, args.modes.x, luts.x); accels.y = accelerator(args.argsv.y, args.modes.y, luts.y); apply_accel = true; @@ -275,13 +274,13 @@ namespace rawaccel { if (combine_magnitudes) { double mag = sqrtsd(movement.x * movement.x + movement.y * movement.y); double speed = mag / time; - double scale = accels.x.apply(speed, output_speed_cap); + double scale = accels.x.apply(speed); movement.x *= scale; movement.y *= scale; } else { - movement.x *= accels.x.apply(fabs(movement.x) / time, output_speed_cap); - movement.y *= accels.y.apply(fabs(movement.y) / time, output_speed_cap); + movement.x *= accels.x.apply(fabs(movement.x) / time); + movement.y *= accels.y.apply(fabs(movement.y) / time); } } } -- cgit v1.2.3