From 7ff79f4e711c2d55daf667092cfce0289b1a7a9b Mon Sep 17 00:00:00 2001 From: a1xd <68629610+a1xd@users.noreply.github.com> Date: Tue, 1 Sep 2020 22:28:45 -0400 Subject: add 1s write delay to driver --- common/rawaccel-error.hpp | 5 ----- common/rawaccel-io.hpp | 5 +---- driver/driver.cpp | 18 ++++------------- grapher/Models/AccelGUI.cs | 12 ++++++++++-- grapher/Models/Serialized/DriverSettings.cs | 29 ++++++++++++++++++++-------- grapher/Models/Serialized/SettingsManager.cs | 24 +++++++---------------- wrapper/wrapper_io.cpp | 4 ---- wrapper/wrapper_io.hpp | 2 -- 8 files changed, 43 insertions(+), 56 deletions(-) diff --git a/common/rawaccel-error.hpp b/common/rawaccel-error.hpp index f5498f9..ecee526 100644 --- a/common/rawaccel-error.hpp +++ b/common/rawaccel-error.hpp @@ -21,9 +21,4 @@ namespace rawaccel { install_error() : io_error("rawaccel is not installed") {} }; - class cooldown_error : public io_error { - public: - cooldown_error() : io_error("write is on cooldown") {} - }; - } diff --git a/common/rawaccel-io.hpp b/common/rawaccel-io.hpp index 74e2d1e..e8641d1 100644 --- a/common/rawaccel-io.hpp +++ b/common/rawaccel-io.hpp @@ -74,10 +74,7 @@ namespace rawaccel { CloseHandle(ra_handle); if (!success) { - if (auto err = GetLastError(); err != ERROR_BUSY) { - throw std::system_error(err, std::system_category(), "DeviceIoControl failed"); - } - throw cooldown_error(); + throw std::system_error(GetLastError(), std::system_category(), "DeviceIoControl failed"); } } diff --git a/driver/driver.cpp b/driver/driver.cpp index 57b3c8a..fb47477 100644 --- a/driver/driver.cpp +++ b/driver/driver.cpp @@ -14,7 +14,6 @@ namespace ra = rawaccel; using milliseconds = double; struct { - counter_t last_write = 0; ra::settings args; milliseconds tick_interval = 0; // set in DriverEntry ra::mouse_modifier modifier; @@ -150,18 +149,10 @@ Return Value: DebugPrint(("Ioctl received into filter control object.\n")); if (InputBufferLength == sizeof(ra::settings)) { - constexpr milliseconds WRITE_COOLDOWN_TIME = 1000; - - counter_t now = KeQueryPerformanceCounter(NULL).QuadPart; - counter_t ticks = now - global.last_write; - milliseconds time = ticks * global.tick_interval; - - if (global.last_write > 0 && time < WRITE_COOLDOWN_TIME) { - DebugPrint(("RA write on cooldown\n")); - // status maps to win32 error code 170: ERROR_BUSY - WdfRequestComplete(Request, STATUS_ENCOUNTERED_WRITE_IN_PROGRESS); - return; - } + // 1 second wait + LARGE_INTEGER interval; + interval.QuadPart = -10000000; + KeDelayExecutionThread(KernelMode, FALSE, &interval); status = WdfRequestRetrieveInputBuffer( Request, @@ -179,7 +170,6 @@ Return Value: global.args = *reinterpret_cast(buffer); global.modifier = { global.args }; - global.last_write = now; WdfRequestComplete(Request, STATUS_SUCCESS); } diff --git a/grapher/Models/AccelGUI.cs b/grapher/Models/AccelGUI.cs index a15dba8..7a32b4e 100644 --- a/grapher/Models/AccelGUI.cs +++ b/grapher/Models/AccelGUI.cs @@ -102,7 +102,7 @@ namespace grapher public void UpdateActiveSettingsFromFields() { - Settings.UpdateActiveSettings(new DriverSettings + var settings = new DriverSettings { rotation = Rotation.Field.Data, sensitivity = new Vec2 @@ -133,8 +133,16 @@ namespace grapher } }, minimumTime = .4 + }; + + Settings.UpdateActiveSettings(settings, () => + { + AccelForm.Invoke((MethodInvoker)delegate + { + UpdateGraph(); + }); }); - UpdateGraph(); + } public void UpdateGraph() diff --git a/grapher/Models/Serialized/DriverSettings.cs b/grapher/Models/Serialized/DriverSettings.cs index 91d7e9f..4595bf2 100644 --- a/grapher/Models/Serialized/DriverSettings.cs +++ b/grapher/Models/Serialized/DriverSettings.cs @@ -1,5 +1,6 @@ using System; using System.Runtime.InteropServices; +using System.Threading; namespace grapher.Models.Serialized { @@ -37,6 +38,7 @@ namespace grapher.Models.Serialized { private static readonly IntPtr UnmanagedSettingsHandle = Marshal.AllocHGlobal(Marshal.SizeOf()); + private static object UnmanagedSettingsLock = new object(); public double rotation; public bool combineMagnitudes; @@ -51,21 +53,32 @@ namespace grapher.Models.Serialized return Marshal.PtrToStructure(UnmanagedSettingsHandle); } - public static void SetActive(DriverSettings settings) + public static void SetActive(DriverSettings settings, Action unmanagedActionBefore = null) { - Marshal.StructureToPtr(settings, UnmanagedSettingsHandle, false); - DriverInterop.SetActiveSettings(UnmanagedSettingsHandle); + new Thread(() => + { + lock (UnmanagedSettingsLock) + { + Marshal.StructureToPtr(settings, UnmanagedSettingsHandle, false); + unmanagedActionBefore?.Invoke(UnmanagedSettingsHandle); + DriverInterop.SetActiveSettings(UnmanagedSettingsHandle); + } + }).Start(); + } - public void SendToDriver() + public void SendToDriver(Action unmanagedActionBefore = null) { - SetActive(this); + SetActive(this, unmanagedActionBefore); } - public void SendToDriverAndUpdate(ManagedAccel accel) + public void SendToDriverAndUpdate(ManagedAccel accel, Action betweenAccelAndWrite = null) { - SendToDriver(); - accel.UpdateFromSettings(UnmanagedSettingsHandle); + SendToDriver(settingsHandle => + { + accel.UpdateFromSettings(settingsHandle); + betweenAccelAndWrite?.Invoke(); + }); } public bool verify() diff --git a/grapher/Models/Serialized/SettingsManager.cs b/grapher/Models/Serialized/SettingsManager.cs index fc58387..c300bde 100644 --- a/grapher/Models/Serialized/SettingsManager.cs +++ b/grapher/Models/Serialized/SettingsManager.cs @@ -28,12 +28,10 @@ namespace grapher.Models.Serialized private ToolStripMenuItem AutoWriteMenuItem { get; set; } - public void UpdateActiveSettings(DriverSettings settings) + public void UpdateActiveSettings(DriverSettings settings, Action afterAccelSettingsUpdate = null) { - try + settings.SendToDriverAndUpdate(ActiveAccel, () => { - settings.SendToDriverAndUpdate(ActiveAccel); - RawAccelSettings.AccelerationSettings = settings; RawAccelSettings.GUISettings = new GUISettings { @@ -43,23 +41,15 @@ namespace grapher.Models.Serialized }; RawAccelSettings.Save(); - } - catch (DriverWriteCDException) - { - Console.WriteLine("write on cooldown"); - } + + afterAccelSettingsUpdate?.Invoke(); + }); } public void UpdateActiveAccelFromFileSettings(DriverSettings settings) { - try - { - settings.SendToDriverAndUpdate(ActiveAccel); - } - catch (DriverWriteCDException) - { - Console.WriteLine("write on cd during file init"); - } + settings.SendToDriverAndUpdate(ActiveAccel); + DpiField.SetToEntered(RawAccelSettings.GUISettings.DPI); PollRateField.SetToEntered(RawAccelSettings.GUISettings.PollRate); AutoWriteMenuItem.Checked = RawAccelSettings.GUISettings.AutoWriteToDriverOnStartup; diff --git a/wrapper/wrapper_io.cpp b/wrapper/wrapper_io.cpp index 3f5673a..0f257bf 100644 --- a/wrapper/wrapper_io.cpp +++ b/wrapper/wrapper_io.cpp @@ -9,10 +9,6 @@ void wrapper_io::writeToDriver(const settings& args) { write(args); } - catch (const cooldown_error&) - { - throw gcnew DriverWriteCDException(); - } catch (const install_error&) { throw gcnew DriverNotInstalledException(); diff --git a/wrapper/wrapper_io.hpp b/wrapper/wrapper_io.hpp index aff572b..19f096f 100644 --- a/wrapper/wrapper_io.hpp +++ b/wrapper/wrapper_io.hpp @@ -17,5 +17,3 @@ public: }; public ref struct DriverNotInstalledException : public DriverIOException {}; - -public ref struct DriverWriteCDException : public DriverIOException {}; -- cgit v1.2.3 From 0b50f9c85568e5b8b6ee32e40990e39cfdf515b5 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Wed, 2 Sep 2020 21:13:18 -0700 Subject: Start adding gain offsets --- common/accel-base.hpp | 3 ++- common/accel-linear.hpp | 11 +++++++++-- common/accel-naturalgain.hpp | 5 +++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/common/accel-base.hpp b/common/accel-base.hpp index 560c0b5..b42f23d 100644 --- a/common/accel-base.hpp +++ b/common/accel-base.hpp @@ -36,7 +36,8 @@ namespace rawaccel { } inline double operator()(double speed) const { - return 1 + fn(maxsd(speed - offset, 0)) * weight; + double offset_speed = speed - offset; + return offset_speed > 0 ? 1 + fn(offset_speed) * weight : 1; } }; diff --git a/common/accel-linear.hpp b/common/accel-linear.hpp index a943594..95ba261 100644 --- a/common/accel-linear.hpp +++ b/common/accel-linear.hpp @@ -7,11 +7,18 @@ namespace rawaccel { /// Struct to hold linear acceleration implementation. struct linear_impl { double accel; + double offset; + double subtractive_const; + double divisive_const; - linear_impl(const accel_args& args) : accel(args.accel) {} + linear_impl(const accel_args& args) : accel(args.accel), offset(args.offset) { + subtractive_const = 2 * accel * offset; + divisive_const = accel * offset * offset; + } inline double operator()(double speed) const { - return accel * speed; + double base_speed = speed + offset; + return accel * base_speed - subtractive_const + divisive_const / base_speed; } }; diff --git a/common/accel-naturalgain.hpp b/common/accel-naturalgain.hpp index 646b2bb..03d749f 100644 --- a/common/accel-naturalgain.hpp +++ b/common/accel-naturalgain.hpp @@ -13,6 +13,11 @@ namespace rawaccel { inline double operator()(double speed) const { // f(x) = k((e^(-mx)-1)/mx + 1) + if (speed <= 0) + { + return 0; + } + double scaled_speed = rate * speed; return limit * (((exp(-scaled_speed) - 1) / scaled_speed) + 1); } -- cgit v1.2.3 From c7e9641e8688c82874dbfa067f7dc8cb4d40e23d Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Thu, 3 Sep 2020 13:21:45 -0700 Subject: Change classic, natural, naturalgain to use gain offset --- common/accel-classic.hpp | 12 +++++++++--- common/accel-natural.hpp | 6 ++++-- common/accel-naturalgain.hpp | 3 ++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/common/accel-classic.hpp b/common/accel-classic.hpp index 4cc52ca..3f409c3 100644 --- a/common/accel-classic.hpp +++ b/common/accel-classic.hpp @@ -10,14 +10,20 @@ namespace rawaccel { struct classic_impl { double accel; double power; + double power_inc; + double offset; + double multiplicative_const; classic_impl(const accel_args& args) : - accel(args.accel), power(args.exponent - 1) - {} + accel(args.accel), power(args.exponent - 1), offset(args.offset) { + multiplicative_const = pow(accel, power); + power_inc = power + 1; + } inline double operator()(double speed) const { //f(x) = (mx)^(k-1) - return pow(accel * speed, power); + double base_speed = speed + offset; + return multiplicative_const * pow(speed, power_inc) / base_speed; } }; diff --git a/common/accel-natural.hpp b/common/accel-natural.hpp index c7d0dcd..32bc365 100644 --- a/common/accel-natural.hpp +++ b/common/accel-natural.hpp @@ -10,16 +10,18 @@ namespace rawaccel { struct natural_impl { double rate; double limit; + double offset; natural_impl(const accel_args& args) : - rate(args.accel), limit(args.limit - 1) + rate(args.accel), limit(args.limit - 1), offset(args.offset) { rate /= limit; } inline double operator()(double speed) const { // f(x) = k(1-e^(-mx)) - return limit - (limit * exp(-rate * speed)); + double base_speed = speed + offset; + return limit * (1 - ((exp(-rate * speed) * speed + offset) / base_speed)); } }; diff --git a/common/accel-naturalgain.hpp b/common/accel-naturalgain.hpp index 03d749f..5979d92 100644 --- a/common/accel-naturalgain.hpp +++ b/common/accel-naturalgain.hpp @@ -18,8 +18,9 @@ namespace rawaccel { return 0; } + double base_speed = speed + offset; double scaled_speed = rate * speed; - return limit * (((exp(-scaled_speed) - 1) / scaled_speed) + 1); + return limit * (((exp(-scaled_speed) - 1) / (base_speed * rate) ) + 1 - offset / base_speed); } }; -- cgit v1.2.3 From 01f870a493378a62ab76dcbf5dc37c0390ca7afe Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Thu, 3 Sep 2020 19:36:44 -0700 Subject: Refactor for nice gain offset --- common/accel-base.hpp | 8 +++++--- common/accel-classic.hpp | 4 ++++ common/accel-linear.hpp | 3 +++ common/accel-logarithmic.hpp | 3 +++ common/accel-natural.hpp | 4 ++++ common/accel-naturalgain.hpp | 9 ++++----- common/accel-noaccel.hpp | 1 + common/accel-sigmoid.hpp | 1 + common/accel-sigmoidgain.hpp | 1 + grapher/Models/AccelGUI.cs | 1 + grapher/Models/Serialized/DriverSettings.cs | 1 + 11 files changed, 28 insertions(+), 8 deletions(-) diff --git a/common/accel-base.hpp b/common/accel-base.hpp index b42f23d..714162f 100644 --- a/common/accel-base.hpp +++ b/common/accel-base.hpp @@ -5,6 +5,7 @@ namespace rawaccel { /// Struct to hold arguments for an acceleration function. struct accel_args { double offset = 0; + double legacy_offset = 0; double accel = 0; double limit = 2; double exponent = 2; @@ -19,6 +20,7 @@ namespace rawaccel { template struct accel_val_base { + bool legacy_offset = false; double offset = 0; double weight = 1; Func fn; @@ -31,15 +33,15 @@ namespace rawaccel { struct additive_accel : accel_val_base { additive_accel(const accel_args& args) : accel_val_base(args) { - offset = args.offset; + legacy_offset = args.offset <= 0 && args.legacy_offset > 0; + offset = legacy_offset ? args.legacy_offset : args.offset; weight = args.weight; } inline double operator()(double speed) const { double offset_speed = speed - offset; - return offset_speed > 0 ? 1 + fn(offset_speed) * weight : 1; + return offset_speed > 0 ? ( legacy_offset ? 1 + fn.legacy_offset(offset_speed) * weight : 1 + fn(offset_speed) ) : 1; } - }; template diff --git a/common/accel-classic.hpp b/common/accel-classic.hpp index 3f409c3..1df888a 100644 --- a/common/accel-classic.hpp +++ b/common/accel-classic.hpp @@ -25,6 +25,10 @@ namespace rawaccel { double base_speed = speed + offset; return multiplicative_const * pow(speed, power_inc) / base_speed; } + + inline double legacy_offset(double speed) const { + return pow(accel * speed, power); + } }; using accel_classic = additive_accel; diff --git a/common/accel-linear.hpp b/common/accel-linear.hpp index 95ba261..2bd57b8 100644 --- a/common/accel-linear.hpp +++ b/common/accel-linear.hpp @@ -21,6 +21,9 @@ namespace rawaccel { return accel * base_speed - subtractive_const + divisive_const / base_speed; } + inline double legacy_offset(double speed) const { + return accel * speed; + } }; using accel_linear = additive_accel; diff --git a/common/accel-logarithmic.hpp b/common/accel-logarithmic.hpp index c7991c7..1ab0e53 100644 --- a/common/accel-logarithmic.hpp +++ b/common/accel-logarithmic.hpp @@ -16,6 +16,9 @@ namespace rawaccel { //f(x) = log(m*x+1) return log(accel * speed + 1); } + + // incorrect but this style is slated for removal + inline double legacy_offset(double speed) const { return operator()(speed); } }; using accel_logarithmic = additive_accel; diff --git a/common/accel-natural.hpp b/common/accel-natural.hpp index 32bc365..03700c1 100644 --- a/common/accel-natural.hpp +++ b/common/accel-natural.hpp @@ -24,6 +24,10 @@ namespace rawaccel { return limit * (1 - ((exp(-rate * speed) * speed + offset) / base_speed)); } + inline double legacy_offset(double speed) const { + return limit - (limit * exp(-rate * speed)); + } + }; using accel_natural = additive_accel; diff --git a/common/accel-naturalgain.hpp b/common/accel-naturalgain.hpp index 5979d92..cdfd1fa 100644 --- a/common/accel-naturalgain.hpp +++ b/common/accel-naturalgain.hpp @@ -13,16 +13,15 @@ namespace rawaccel { inline double operator()(double speed) const { // f(x) = k((e^(-mx)-1)/mx + 1) - if (speed <= 0) - { - return 0; - } - double base_speed = speed + offset; double scaled_speed = rate * speed; return limit * (((exp(-scaled_speed) - 1) / (base_speed * rate) ) + 1 - offset / base_speed); } + inline double legacy_offset(double speed) const { + double scaled_speed = rate * speed; + return limit * (((exp(-scaled_speed) - 1) / scaled_speed) + 1); + } }; using accel_naturalgain = additive_accel; diff --git a/common/accel-noaccel.hpp b/common/accel-noaccel.hpp index ae6f5f8..c803c2f 100644 --- a/common/accel-noaccel.hpp +++ b/common/accel-noaccel.hpp @@ -12,6 +12,7 @@ namespace rawaccel { inline double operator()(double) const { return 1; } + inline double legacy_offset(double speed) const { return operator()(speed); } }; } diff --git a/common/accel-sigmoid.hpp b/common/accel-sigmoid.hpp index c8112ee..239bd9d 100644 --- a/common/accel-sigmoid.hpp +++ b/common/accel-sigmoid.hpp @@ -21,6 +21,7 @@ namespace rawaccel { return limit / (exp(-rate * (speed - midpoint)) + 1); } + inline double legacy_offset(double speed) const { return operator()(speed); } }; using accel_sigmoid = additive_accel; diff --git a/common/accel-sigmoidgain.hpp b/common/accel-sigmoidgain.hpp index 99bb146..bed2f16 100644 --- a/common/accel-sigmoidgain.hpp +++ b/common/accel-sigmoidgain.hpp @@ -26,6 +26,7 @@ namespace rawaccel { return limit * ((log(additive_constant+exp(scaled_speed)) - integration_constant)/scaled_speed); } + inline double legacy_offset(double speed) const { return operator()(speed); } }; using accel_sigmoidgain = additive_accel; diff --git a/grapher/Models/AccelGUI.cs b/grapher/Models/AccelGUI.cs index 7a32b4e..1657074 100644 --- a/grapher/Models/AccelGUI.cs +++ b/grapher/Models/AccelGUI.cs @@ -120,6 +120,7 @@ namespace grapher x = new AccelArgs { offset = Offset.Field.Data, + legacy_offset = 0, weight = Weight.Fields.X, gainCap = Cap.VelocityGainCap, scaleCap = Cap.SensitivityCapX, diff --git a/grapher/Models/Serialized/DriverSettings.cs b/grapher/Models/Serialized/DriverSettings.cs index 4595bf2..cdccf88 100644 --- a/grapher/Models/Serialized/DriverSettings.cs +++ b/grapher/Models/Serialized/DriverSettings.cs @@ -13,6 +13,7 @@ namespace grapher.Models.Serialized public struct AccelArgs { public double offset; + public double legacy_offset; public double accel; public double limit; public double exponent; -- cgit v1.2.3 From 2fbc4b3d504962c2462d7aec98f5f389e5333164 Mon Sep 17 00:00:00 2001 From: Jacob Palecki Date: Thu, 3 Sep 2020 20:10:43 -0700 Subject: Add offset options to GUI, make gain options default --- grapher/Form1.Designer.cs | 64 ++++++++++++----- grapher/Form1.cs | 11 ++- grapher/Models/AccelGUI.cs | 11 +-- grapher/Models/Options/CapOptions.cs | 22 +++--- grapher/Models/Options/OffsetOptions.cs | 124 ++++++++++++++++++++++++++++++++ grapher/grapher.csproj | 1 + 6 files changed, 196 insertions(+), 37 deletions(-) create mode 100644 grapher/Models/Options/OffsetOptions.cs diff --git a/grapher/Form1.Designer.cs b/grapher/Form1.Designer.cs index 70455ce..a7a3e16 100644 --- a/grapher/Form1.Designer.cs +++ b/grapher/Form1.Designer.cs @@ -93,8 +93,8 @@ namespace grapher this.ScaleMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.advancedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.capStyleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.sensitivityToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.velocityGainToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.gainCapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.legacyCapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.startupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.AutoWriteMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.AccelerationChartY = new System.Windows.Forms.DataVisualization.Charting.Chart(); @@ -114,6 +114,9 @@ namespace grapher this.OffsetActiveLabel = new System.Windows.Forms.Label(); this.LimitExpActiveLabel = new System.Windows.Forms.Label(); this.MidpointActiveLabel = new System.Windows.Forms.Label(); + this.offsetStyleToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.gainOffsetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.legacyOffsetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); ((System.ComponentModel.ISupportInitialize)(this.AccelerationChart)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.VelocityChart)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.GainChart)).BeginInit(); @@ -491,7 +494,8 @@ namespace grapher // advancedToolStripMenuItem // this.advancedToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.capStyleToolStripMenuItem}); + this.capStyleToolStripMenuItem, + this.offsetStyleToolStripMenuItem}); this.advancedToolStripMenuItem.Name = "advancedToolStripMenuItem"; this.advancedToolStripMenuItem.Size = new System.Drawing.Size(72, 20); this.advancedToolStripMenuItem.Text = "Advanced"; @@ -499,25 +503,25 @@ namespace grapher // capStyleToolStripMenuItem // this.capStyleToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.sensitivityToolStripMenuItem, - this.velocityGainToolStripMenuItem}); + this.gainCapToolStripMenuItem, + this.legacyCapToolStripMenuItem}); this.capStyleToolStripMenuItem.Name = "capStyleToolStripMenuItem"; - this.capStyleToolStripMenuItem.Size = new System.Drawing.Size(123, 22); + this.capStyleToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.capStyleToolStripMenuItem.Text = "Cap Style"; // - // sensitivityToolStripMenuItem + // gainCapToolStripMenuItem // - this.sensitivityToolStripMenuItem.Checked = true; - this.sensitivityToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; - this.sensitivityToolStripMenuItem.Name = "sensitivityToolStripMenuItem"; - this.sensitivityToolStripMenuItem.Size = new System.Drawing.Size(142, 22); - this.sensitivityToolStripMenuItem.Text = "Sensitivity"; + this.gainCapToolStripMenuItem.Checked = true; + this.gainCapToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.gainCapToolStripMenuItem.Name = "gainCapToolStripMenuItem"; + this.gainCapToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.gainCapToolStripMenuItem.Text = "Gain (Default)"; // - // velocityGainToolStripMenuItem + // legacyCapToolStripMenuItem // - this.velocityGainToolStripMenuItem.Name = "velocityGainToolStripMenuItem"; - this.velocityGainToolStripMenuItem.Size = new System.Drawing.Size(142, 22); - this.velocityGainToolStripMenuItem.Text = "Velocity Gain"; + this.legacyCapToolStripMenuItem.Name = "legacyCapToolStripMenuItem"; + this.legacyCapToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.legacyCapToolStripMenuItem.Text = "Legacy"; // // startupToolStripMenuItem // @@ -737,6 +741,27 @@ namespace grapher this.MidpointActiveLabel.TabIndex = 47; this.MidpointActiveLabel.Text = "0"; // + // offsetStyleToolStripMenuItem + // + this.offsetStyleToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.gainOffsetToolStripMenuItem, + this.legacyOffsetToolStripMenuItem}); + this.offsetStyleToolStripMenuItem.Name = "offsetStyleToolStripMenuItem"; + this.offsetStyleToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.offsetStyleToolStripMenuItem.Text = "Offset Style"; + // + // gainOffsetToolStripMenuItem + // + this.gainOffsetToolStripMenuItem.Name = "gainOffsetToolStripMenuItem"; + this.gainOffsetToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.gainOffsetToolStripMenuItem.Text = "Gain (Default)"; + // + // legacyOffsetToolStripMenuItem + // + this.legacyOffsetToolStripMenuItem.Name = "legacyOffsetToolStripMenuItem"; + this.legacyOffsetToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.legacyOffsetToolStripMenuItem.Text = "Legacy"; + // // RawAcceleration // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -840,8 +865,8 @@ namespace grapher private System.Windows.Forms.ToolStripMenuItem showVelocityGainToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem advancedToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem capStyleToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem sensitivityToolStripMenuItem; - private System.Windows.Forms.ToolStripMenuItem velocityGainToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem gainCapToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem legacyCapToolStripMenuItem; private System.Windows.Forms.DataVisualization.Charting.Chart AccelerationChartY; private System.Windows.Forms.DataVisualization.Charting.Chart VelocityChartY; private System.Windows.Forms.DataVisualization.Charting.Chart GainChartY; @@ -867,6 +892,9 @@ namespace grapher private System.Windows.Forms.Label MidpointActiveLabel; private System.Windows.Forms.ToolStripMenuItem startupToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem AutoWriteMenuItem; + private System.Windows.Forms.ToolStripMenuItem offsetStyleToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem gainOffsetToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem legacyOffsetToolStripMenuItem; } } diff --git a/grapher/Form1.cs b/grapher/Form1.cs index 37f67f8..ba0730c 100644 --- a/grapher/Form1.cs +++ b/grapher/Form1.cs @@ -104,6 +104,11 @@ namespace grapher new ActiveValueLabel(OffsetActiveLabel, ActiveValueTitle), "Offset"); + var offsetOptions = new OffsetOptions( + gainOffsetToolStripMenuItem, + legacyOffsetToolStripMenuItem, + offset); + // The name and layout of these options is handled by AccelerationOptions object. var acceleration = new Option( new Field(accelerationBox, this, 0), @@ -138,8 +143,8 @@ namespace grapher new ActiveValueLabel(AccelTypeActiveLabel, ActiveValueTitle)); var capOptions = new CapOptions( - sensitivityToolStripMenuItem, - velocityGainToolStripMenuItem, + gainCapToolStripMenuItem, + legacyCapToolStripMenuItem, cap, weight); @@ -163,7 +168,7 @@ namespace grapher rotation, weight, capOptions, - offset, + offsetOptions, acceleration, limitOrExponent, midpoint, diff --git a/grapher/Models/AccelGUI.cs b/grapher/Models/AccelGUI.cs index 1657074..a7d5d49 100644 --- a/grapher/Models/AccelGUI.cs +++ b/grapher/Models/AccelGUI.cs @@ -1,5 +1,6 @@ using grapher.Models.Calculations; using grapher.Models.Mouse; +using grapher.Models.Options; using grapher.Models.Serialized; using System; using System.CodeDom; @@ -28,7 +29,7 @@ namespace grapher Option rotation, OptionXY weight, CapOptions cap, - Option offset, + OffsetOptions offset, Option acceleration, Option limtOrExp, Option midpoint, @@ -82,7 +83,7 @@ namespace grapher public CapOptions Cap { get; } - public Option Offset { get; } + public OffsetOptions Offset { get; } public Option Acceleration { get; } @@ -119,8 +120,8 @@ namespace grapher { x = new AccelArgs { - offset = Offset.Field.Data, - legacy_offset = 0, + offset = Offset.Offset, + legacy_offset = Offset.LegacyOffset, weight = Weight.Fields.X, gainCap = Cap.VelocityGainCap, scaleCap = Cap.SensitivityCapX, @@ -163,7 +164,7 @@ namespace grapher Sensitivity.SetActiveValues(settings.sensitivity.x, settings.sensitivity.y); Rotation.SetActiveValue(settings.rotation); AccelerationOptions.SetActiveValue((int)settings.modes.x); - Offset.SetActiveValue(settings.args.x.offset); + Offset.SetActiveValue(settings.args.x.offset, settings.args.y.offset); Weight.SetActiveValues(settings.args.x.weight, settings.args.x.weight); Acceleration.SetActiveValue(settings.args.x.accel); // rate, powerscale LimitOrExponent.SetActiveValue(settings.args.x.limit); //exp, powerexp diff --git a/grapher/Models/Options/CapOptions.cs b/grapher/Models/Options/CapOptions.cs index 493561a..87bac88 100644 --- a/grapher/Models/Options/CapOptions.cs +++ b/grapher/Models/Options/CapOptions.cs @@ -14,27 +14,27 @@ namespace grapher public const string GainCapFormatString = "0.##"; public CapOptions( - ToolStripMenuItem sensitivityCapCheck, ToolStripMenuItem velocityGainCapCheck, + ToolStripMenuItem legacyCapCheck, OptionXY capOption, OptionXY weightOption) { - SensitivityCapCheck = sensitivityCapCheck; VelocityGainCapCheck = velocityGainCapCheck; + LegacyCapCheck = legacyCapCheck; CapOption = capOption; WeightOption = weightOption; - SensitivityCapCheck.Click += new System.EventHandler(OnSensitivityCapCheckClick); + LegacyCapCheck.Click += new System.EventHandler(OnSensitivityCapCheckClick); VelocityGainCapCheck.Click += new System.EventHandler(OnVelocityGainCapCheckClick); - SensitivityCapCheck.CheckedChanged += new System.EventHandler(OnSensitivityCapCheckedChange); + LegacyCapCheck.CheckedChanged += new System.EventHandler(OnSensitivityCapCheckedChange); VelocityGainCapCheck.CheckedChanged += new System.EventHandler(OnVelocityGainCapCheckedChange); - EnableSensitivityCap(); + EnableVelocityGainCap(); } - public ToolStripMenuItem SensitivityCapCheck { get; } + public ToolStripMenuItem LegacyCapCheck { get; } public ToolStripMenuItem VelocityGainCapCheck { get; } @@ -104,10 +104,10 @@ namespace grapher void OnSensitivityCapCheckClick(object sender, EventArgs e) { - if (!SensitivityCapCheck.Checked) + if (!LegacyCapCheck.Checked) { VelocityGainCapCheck.Checked = false; - SensitivityCapCheck.Checked = true; + LegacyCapCheck.Checked = true; } } @@ -116,13 +116,13 @@ namespace grapher if (!VelocityGainCapCheck.Checked) { VelocityGainCapCheck.Checked = true; - SensitivityCapCheck.Checked = false; + LegacyCapCheck.Checked = false; } } void OnSensitivityCapCheckedChange(object sender, EventArgs e) { - if (SensitivityCapCheck.Checked == true) + if (LegacyCapCheck.Checked == true) { EnableSensitivityCap(); } @@ -130,7 +130,7 @@ namespace grapher void OnVelocityGainCapCheckedChange(object sender, EventArgs e) { - if (SensitivityCapCheck.Checked == true) + if (LegacyCapCheck.Checked == true) { EnableVelocityGainCap(); } diff --git a/grapher/Models/Options/OffsetOptions.cs b/grapher/Models/Options/OffsetOptions.cs new file mode 100644 index 0000000..0b01ab9 --- /dev/null +++ b/grapher/Models/Options/OffsetOptions.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace grapher.Models.Options +{ + public class OffsetOptions + { + public OffsetOptions( + ToolStripMenuItem velocityGainOffsetCheck, + ToolStripMenuItem legacyOffsetCheck, + Option offsetOption) + { + VelocityGainOffsetCheck = velocityGainOffsetCheck; + LegacyOffsetCheck = legacyOffsetCheck; + OffsetOption = offsetOption; + + VelocityGainOffsetCheck.Click += new System.EventHandler(OnVelocityGainOffsetClick); + LegacyOffsetCheck.Click += new System.EventHandler(OnLegacyOffsetClick); + + VelocityGainOffsetCheck.CheckedChanged += new System.EventHandler(OnVelocityGainOffsetCheckedChange); + LegacyOffsetCheck.CheckedChanged += new System.EventHandler(OnLegacyOffsetCheckedChange); + + VelocityGainOffsetCheck.Checked = true; + } + + public ToolStripMenuItem VelocityGainOffsetCheck { get; } + + public ToolStripMenuItem LegacyOffsetCheck { get; } + + public Option OffsetOption { get; } + + public bool IsLegacy { get; private set; } + + public double LegacyOffset + { + get + { + if (IsLegacy) + { + return OffsetOption.Field.Data; + } + else + { + return 0; + } + } + } + + public double Offset + { + get + { + if (IsLegacy) + { + return 0; + } + else + { + return OffsetOption.Field.Data; + } + } + } + + public void SetActiveValue(double offset, double legacyOffset) + { + if (offset > 0) + { + OffsetOption.SetActiveValue(offset); + } + else + { + OffsetOption.SetActiveValue(legacyOffset); + } + } + + public void OnVelocityGainOffsetClick(object sender, EventArgs e) + { + if (!VelocityGainOffsetCheck.Checked) + { + VelocityGainOffsetCheck.Checked = true; + LegacyOffsetCheck.Checked = false; + } + } + + public void OnLegacyOffsetClick(object sender, EventArgs e) + { + if (!LegacyOffsetCheck.Checked) + { + LegacyOffsetCheck.Checked = true; + VelocityGainOffsetCheck.Checked = false; + } + } + + public void OnVelocityGainOffsetCheckedChange(object sender, EventArgs e) + { + if (VelocityGainOffsetCheck.Checked) + { + EnableVelocityGainOffset(); + } + } + + public void OnLegacyOffsetCheckedChange(object sender, EventArgs e) + { + if (LegacyOffsetCheck.Checked) + { + EnableLegacyOffset(); + } + } + + public void EnableVelocityGainOffset() + { + IsLegacy = false; + } + + public void EnableLegacyOffset() + { + IsLegacy = true; + } + } +} diff --git a/grapher/grapher.csproj b/grapher/grapher.csproj index d34e678..28322bb 100644 --- a/grapher/grapher.csproj +++ b/grapher/grapher.csproj @@ -85,6 +85,7 @@ + -- cgit v1.2.3