diff --git a/DS4Windows/DS4Control/Mapping.cs b/DS4Windows/DS4Control/Mapping.cs
index dbb1591..523c241 100644
--- a/DS4Windows/DS4Control/Mapping.cs
+++ b/DS4Windows/DS4Control/Mapping.cs
@@ -817,7 +817,8 @@ namespace DS4Windows
byte l2Deadzone = l2ModInfo.deadZone;
int l2AntiDeadzone = l2ModInfo.antiDeadZone;
int l2Maxzone = l2ModInfo.maxZone;
- if (l2Deadzone > 0 || l2AntiDeadzone > 0 || l2Maxzone != 100)
+ double l2MaxOutput = l2ModInfo.maxOutput;
+ if (l2Deadzone > 0 || l2AntiDeadzone > 0 || l2Maxzone != 100 || l2MaxOutput != 100.0)
{
double tempL2Output = cState.L2 / 255.0;
double tempL2AntiDead = 0.0;
@@ -837,6 +838,12 @@ namespace DS4Windows
}
}
+ if (l2MaxOutput != 100.0)
+ {
+ double maxOutRatio = l2MaxOutput / 100.0;
+ tempL2Output = Math.Min(Math.Max(tempL2Output, 0.0), maxOutRatio);
+ }
+
if (l2AntiDeadzone > 0)
{
tempL2AntiDead = l2AntiDeadzone * 0.01;
@@ -860,7 +867,8 @@ namespace DS4Windows
byte r2Deadzone = r2ModInfo.deadZone;
int r2AntiDeadzone = r2ModInfo.antiDeadZone;
int r2Maxzone = r2ModInfo.maxZone;
- if (r2Deadzone > 0 || r2AntiDeadzone > 0 || r2Maxzone != 100)
+ double r2MaxOutput = r2ModInfo.maxOutput;
+ if (r2Deadzone > 0 || r2AntiDeadzone > 0 || r2Maxzone != 100 || r2MaxOutput != 100.0)
{
double tempR2Output = cState.R2 / 255.0;
double tempR2AntiDead = 0.0;
@@ -880,6 +888,12 @@ namespace DS4Windows
}
}
+ if (r2MaxOutput != 100.0)
+ {
+ double maxOutRatio = r2MaxOutput / 100.0;
+ tempR2Output = Math.Min(Math.Max(tempR2Output, 0.0), maxOutRatio);
+ }
+
if (r2AntiDeadzone > 0)
{
tempR2AntiDead = r2AntiDeadzone * 0.01;
diff --git a/DS4Windows/DS4Control/ProfilePropGroups.cs b/DS4Windows/DS4Control/ProfilePropGroups.cs
index 7ed77cc..f1492bb 100644
--- a/DS4Windows/DS4Control/ProfilePropGroups.cs
+++ b/DS4Windows/DS4Control/ProfilePropGroups.cs
@@ -23,6 +23,7 @@ namespace DS4Windows
public byte deadZone; // Trigger deadzone is expressed in axis units
public int antiDeadZone;
public int maxZone = 100;
+ public double maxOutput = 100.0;
}
public class GyroMouseInfo
diff --git a/DS4Windows/DS4Control/ScpUtil.cs b/DS4Windows/DS4Control/ScpUtil.cs
index 9d2d9b7..039b9af 100644
--- a/DS4Windows/DS4Control/ScpUtil.cs
+++ b/DS4Windows/DS4Control/ScpUtil.cs
@@ -2479,6 +2479,8 @@ namespace DS4Windows
XmlNode xmlR2AD = m_Xdoc.CreateNode(XmlNodeType.Element, "R2AntiDeadZone", null); xmlR2AD.InnerText = r2ModInfo[device].antiDeadZone.ToString(); Node.AppendChild(xmlR2AD);
XmlNode xmlL2Maxzone = m_Xdoc.CreateNode(XmlNodeType.Element, "L2MaxZone", null); xmlL2Maxzone.InnerText = l2ModInfo[device].maxZone.ToString(); Node.AppendChild(xmlL2Maxzone);
XmlNode xmlR2Maxzone = m_Xdoc.CreateNode(XmlNodeType.Element, "R2MaxZone", null); xmlR2Maxzone.InnerText = r2ModInfo[device].maxZone.ToString(); Node.AppendChild(xmlR2Maxzone);
+ XmlNode xmlL2MaxOutput = m_Xdoc.CreateNode(XmlNodeType.Element, "L2MaxOutput", null); xmlL2MaxOutput.InnerText = l2ModInfo[device].maxOutput.ToString(); Node.AppendChild(xmlL2MaxOutput);
+ XmlNode xmlR2MaxOutput = m_Xdoc.CreateNode(XmlNodeType.Element, "R2MaxOutput", null); xmlR2MaxOutput.InnerText = r2ModInfo[device].maxOutput.ToString(); Node.AppendChild(xmlR2MaxOutput);
XmlNode xmlButtonMouseSensitivity = m_Xdoc.CreateNode(XmlNodeType.Element, "ButtonMouseSensitivity", null); xmlButtonMouseSensitivity.InnerText = buttonMouseSensitivity[device].ToString(); Node.AppendChild(xmlButtonMouseSensitivity);
XmlNode xmlRainbow = m_Xdoc.CreateNode(XmlNodeType.Element, "Rainbow", null); xmlRainbow.InnerText = rainbow[device].ToString(); Node.AppendChild(xmlRainbow);
XmlNode xmlMaxSatRainbow = m_Xdoc.CreateNode(XmlNodeType.Element, "MaxSatRainbow", null); xmlMaxSatRainbow.InnerText = Convert.ToInt32(maxRainbowSat[device] * 100.0).ToString(); Node.AppendChild(xmlMaxSatRainbow);
@@ -3223,6 +3225,22 @@ namespace DS4Windows
}
catch { r2ModInfo[device].maxZone = 100; missingSetting = true; }
+ try
+ {
+ Item = m_Xdoc.SelectSingleNode("/" + rootname + "/L2MaxOutput"); double temp = 100.0;
+ temp = double.Parse(Item.InnerText);
+ l2ModInfo[device].maxOutput = Math.Min(Math.Max(temp, 0.0), 100.0);
+ }
+ catch { l2ModInfo[device].maxOutput = 100.0; missingSetting = true; }
+
+ try
+ {
+ Item = m_Xdoc.SelectSingleNode("/" + rootname + "/R2MaxOutput"); double temp = 100.0;
+ temp = double.Parse(Item.InnerText);
+ r2ModInfo[device].maxOutput = Math.Min(Math.Max(temp, 0.0), 100.0);
+ }
+ catch { r2ModInfo[device].maxOutput = 100.0; missingSetting = true; }
+
try
{
Item = m_Xdoc.SelectSingleNode("/" + rootname + "/LSRotation"); int temp = 0;
@@ -4768,6 +4786,7 @@ namespace DS4Windows
lsModInfo[device].maxOutput = rsModInfo[device].maxOutput = 100.0;
l2ModInfo[device].antiDeadZone = r2ModInfo[device].antiDeadZone = 0;
l2ModInfo[device].maxZone = r2ModInfo[device].maxZone = 100;
+ l2ModInfo[device].maxOutput = r2ModInfo[device].maxOutput = 100.0;
LSRotation[device] = 0.0;
RSRotation[device] = 0.0;
SXDeadzone[device] = SZDeadzone[device] = 0.25;
diff --git a/DS4Windows/DS4Forms/ProfileEditor.xaml b/DS4Windows/DS4Forms/ProfileEditor.xaml
index acc1b56..a1c1d2b 100644
--- a/DS4Windows/DS4Forms/ProfileEditor.xaml
+++ b/DS4Windows/DS4Forms/ProfileEditor.xaml
@@ -425,6 +425,7 @@
+
@@ -454,14 +455,20 @@
-
-
+
-
-
-
+
+
+
+
+
@@ -471,7 +478,7 @@
-
@@ -482,13 +489,13 @@
-
+
-
+
Global.R2ModInfo[device].antiDeadZone = (int)(value * 100.0);
}
+ public double L2MaxOutput
+ {
+ get => Global.L2ModInfo[device].maxOutput / 100.0;
+ set => Global.L2ModInfo[device].maxOutput = value * 100.0;
+ }
+
+ public double R2MaxOutput
+ {
+ get => Global.R2ModInfo[device].maxOutput / 100.0;
+ set => Global.R2ModInfo[device].maxOutput = value * 100.0;
+ }
+
public double L2Sens
{
get => Global.L2Sens[device];