From 9ab750fb0101140acad220e7472a843c36497b7e Mon Sep 17 00:00:00 2001 From: Adam Irvine Date: Sat, 29 Oct 2016 20:03:42 +0100 Subject: [PATCH 1/2] My First version... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As a quick side note, I've built this around my use with a Microsoft SideWinder Steering Wheel and Pedals (USB, V1) and tested with Forza Horizon 3 - Working perfectly! :+1: - Fixed bug/issue where camera in certain games was in a permanently Panned state usually to the front-left. -- This was caused by un-assigned axes still getting a value rather than 0. - Fixed a bug when ControllerOptions.cs was looping around the available Axes count and not the actual Axes values (e.g. Brake pedal on MS Sidewinder Force Feedback steering wheel is Axis 6, not Axis 3 but is The 3rd Axis...) - Added deadzone/compensation feature, you can add a value onto the raw Value from the LH-X Axis to compensate in certain games against the deadzone... -- I’ve found setting this between 30 and 40 in Forza Horizon 3 makes for a nice experience… (my current is 40) --- XOutput/ControllerDevice.cs | 22 +- XOutput/ControllerManager.cs | 42 +- XOutput/ControllerOptions.Designer.cs | 676 ++++++++++++++++---------- XOutput/ControllerOptions.cs | 59 ++- XOutput/SaveManager.cs | 22 +- XOutput/XOutput.csproj | 4 + 6 files changed, 535 insertions(+), 290 deletions(-) diff --git a/XOutput/ControllerDevice.cs b/XOutput/ControllerDevice.cs index 50e9613..5a47b1e 100644 --- a/XOutput/ControllerDevice.cs +++ b/XOutput/ControllerDevice.cs @@ -19,10 +19,10 @@ public class ControllerDevice public bool enabled = true; public OutputState cOutput; - public byte[] mapping = new byte[42]; + public byte[] mapping = new byte[44]; bool[] buttons; int[] dPads; - int[] analogs; + public int[] analogs; delegate byte input(byte subType, byte num); @@ -33,7 +33,14 @@ public ControllerDevice(Joystick joy, int num) deviceNumber = num; name = joystick.Information.InstanceName; cOutput = new OutputState(); - for (int i = 0; i < 42; i++) + + joystick.Poll(); + JoystickState jState = joystick.GetCurrentState(); + buttons = jState.GetButtons(); + dPads = jState.GetPointOfViewControllers(); + analogs = GetAxes(jState); + + for (int i = 0; i < mapping.Length; i++) { mapping[i] = 255; //Changed default mapping to blank } @@ -141,10 +148,10 @@ private void updateInput() input funcDPad = DPad; input[] funcArray = new input[] { funcButton, funcAnalog, funcDPad }; - byte[] output = new byte[21]; - for (int i = 0; i < 21; i++) + byte[] output = new byte[22]; + for (int i = 0; i < 22; i++) { - if (mapping[i * 2] == 255) + if (mapping[i * 2] == 255 || mapping[i * 2] == 253) { continue; } @@ -214,7 +221,6 @@ public byte[] getoutput() //Guide Report[12] = (byte)(cOutput.Home ? 0xFF : 0x00); - Report[14] = cOutput.LX; //Left Stick X @@ -231,7 +237,5 @@ public byte[] getoutput() return Report; } - - } } diff --git a/XOutput/ControllerManager.cs b/XOutput/ControllerManager.cs index 7b2b3a2..75b0435 100644 --- a/XOutput/ControllerManager.cs +++ b/XOutput/ControllerManager.cs @@ -25,6 +25,7 @@ private class ContData private Control handle; public bool isExclusive = false; + protected int compensationValue = 0; private object[] ds4locks = new object[4]; @@ -68,7 +69,6 @@ public void changeExclusive(bool e) public ControllerDevice getController(int n) { return devices[n]; - } public void Swap(int i, int p) @@ -94,6 +94,11 @@ public void setControllerEnable(int i, bool b) private Int32 Scale(Int32 Value, Boolean Flip) { + if (Value == 0) + { + return Value; + } + Value -= 0x80; if (Value == -128) Value = -127; @@ -133,6 +138,9 @@ public override bool Start() { if (devices[i] != null && devices[i].enabled) { + //Need to figure this out for multiple controllers... + compensationValue = devices[i].mapping[devices[i].mapping.Length - 1]; + running = true; processingData[i] = new ContData(); Console.WriteLine("Plug " + i); @@ -299,7 +307,6 @@ private void ProcessData(int n) byte[] data = devices[n].getoutput(); if (data != null && devices[n].enabled) { - data[0] = (byte)n; Parse(data, processingData[n].parsedData); Report(processingData[n].parsedData, processingData[n].output); @@ -362,7 +369,7 @@ public void Parse(Byte[] Input, Byte[] Output) Output[12] = Input[26]; // Left Trigger Output[13] = Input[27]; // Right Trigger - Int32 ThumbLX = Scale(Input[14], false); + Int32 ThumbLX = Scale(CorrectDeadZone(Input[14], 127, compensationValue), false); Int32 ThumbLY = -Scale(Input[15], false); Int32 ThumbRX = Scale(Input[16], false); Int32 ThumbRY = -Scale(Input[17], false); @@ -380,6 +387,35 @@ public void Parse(Byte[] Input, Byte[] Output) Output[21] = (Byte)((ThumbRY >> 8) & 0xFF); } } + private int CorrectDeadZone(int input, int centerPoint, int deadZoneCompensation) + { + int returnVal = input; + + if (deadZoneCompensation > 0) + { + if (input > centerPoint) + { + //Steering Right + returnVal += deadZoneCompensation; + } + else if (input < centerPoint) + { + //Steering Left + returnVal -= deadZoneCompensation; + } + + //Full Lock + if (returnVal > 255) + { + returnVal = 255; + } + else if (returnVal < 1) + { + returnVal = 1; + } + } + return returnVal; + } } } diff --git a/XOutput/ControllerOptions.Designer.cs b/XOutput/ControllerOptions.Designer.cs index 4e9845d..5747fe9 100644 --- a/XOutput/ControllerOptions.Designer.cs +++ b/XOutput/ControllerOptions.Designer.cs @@ -28,7 +28,6 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(XOut)); this.labelA = new System.Windows.Forms.Label(); this.labelB = new System.Windows.Forms.Label(); this.labelX = new System.Windows.Forms.Label(); @@ -37,21 +36,6 @@ private void InitializeComponent() this.labelDown = new System.Windows.Forms.Label(); this.labelLeft = new System.Windows.Forms.Label(); this.labelRight = new System.Windows.Forms.Label(); - this.dropRight = new XOutput.MultiLevelComboBox(); - this.dropLeft = new XOutput.MultiLevelComboBox(); - this.dropDown = new XOutput.MultiLevelComboBox(); - this.dropUp = new XOutput.MultiLevelComboBox(); - this.dropY = new XOutput.MultiLevelComboBox(); - this.dropX = new XOutput.MultiLevelComboBox(); - this.dropB = new XOutput.MultiLevelComboBox(); - this.dropA = new XOutput.MultiLevelComboBox(); - this.dropRT = new XOutput.MultiLevelComboBox(); - this.dropLT = new XOutput.MultiLevelComboBox(); - this.dropRB = new XOutput.MultiLevelComboBox(); - this.dropLB = new XOutput.MultiLevelComboBox(); - this.dropBack = new XOutput.MultiLevelComboBox(); - this.dropStart = new XOutput.MultiLevelComboBox(); - this.dropHome = new XOutput.MultiLevelComboBox(); this.labelRT = new System.Windows.Forms.Label(); this.labelLT = new System.Windows.Forms.Label(); this.labelRB = new System.Windows.Forms.Label(); @@ -59,18 +43,39 @@ private void InitializeComponent() this.labelBack = new System.Windows.Forms.Label(); this.labelStart = new System.Windows.Forms.Label(); this.labelHome = new System.Windows.Forms.Label(); - this.dropRA = new XOutput.MultiLevelComboBox(); - this.dropLA = new XOutput.MultiLevelComboBox(); - this.dropRX = new XOutput.MultiLevelComboBox(); - this.dropRY = new XOutput.MultiLevelComboBox(); - this.dropLX = new XOutput.MultiLevelComboBox(); - this.dropLY = new XOutput.MultiLevelComboBox(); this.labelRA = new System.Windows.Forms.Label(); this.labelLA = new System.Windows.Forms.Label(); this.labelLX = new System.Windows.Forms.Label(); this.labelRX = new System.Windows.Forms.Label(); this.labelLY = new System.Windows.Forms.Label(); this.labelRY = new System.Windows.Forms.Label(); + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.numericCompensation = new System.Windows.Forms.NumericUpDown(); + this.dropA = new XOutput.MultiLevelComboBox(); + this.dropB = new XOutput.MultiLevelComboBox(); + this.dropX = new XOutput.MultiLevelComboBox(); + this.dropY = new XOutput.MultiLevelComboBox(); + this.dropUp = new XOutput.MultiLevelComboBox(); + this.dropDown = new XOutput.MultiLevelComboBox(); + this.dropLeft = new XOutput.MultiLevelComboBox(); + this.dropRight = new XOutput.MultiLevelComboBox(); + this.dropLT = new XOutput.MultiLevelComboBox(); + this.dropRT = new XOutput.MultiLevelComboBox(); + this.dropLB = new XOutput.MultiLevelComboBox(); + this.dropRB = new XOutput.MultiLevelComboBox(); + this.dropLA = new XOutput.MultiLevelComboBox(); + this.dropRA = new XOutput.MultiLevelComboBox(); + this.dropHome = new XOutput.MultiLevelComboBox(); + this.dropStart = new XOutput.MultiLevelComboBox(); + this.dropBack = new XOutput.MultiLevelComboBox(); + this.dropLY = new XOutput.MultiLevelComboBox(); + this.dropLX = new XOutput.MultiLevelComboBox(); + this.dropRY = new XOutput.MultiLevelComboBox(); + this.dropRX = new XOutput.MultiLevelComboBox(); + this.groupBox1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericCompensation)).BeginInit(); this.SuspendLayout(); // // labelA @@ -161,171 +166,6 @@ private void InitializeComponent() this.labelRight.TabIndex = 17; this.labelRight.Text = "Right"; // - // dropRight - // - this.dropRight.FormattingEnabled = true; - this.dropRight.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropRight.Items.AddRange(new object[] { - ""}); - this.dropRight.Location = new System.Drawing.Point(40, 440); - this.dropRight.Name = "dropRight"; - this.dropRight.Size = new System.Drawing.Size(121, 21); - this.dropRight.TabIndex = 13; - // - // dropLeft - // - this.dropLeft.FormattingEnabled = true; - this.dropLeft.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropLeft.Items.AddRange(new object[] { - ""}); - this.dropLeft.Location = new System.Drawing.Point(40, 390); - this.dropLeft.Name = "dropLeft"; - this.dropLeft.Size = new System.Drawing.Size(121, 21); - this.dropLeft.TabIndex = 12; - // - // dropDown - // - this.dropDown.FormattingEnabled = true; - this.dropDown.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropDown.Items.AddRange(new object[] { - ""}); - this.dropDown.Location = new System.Drawing.Point(40, 340); - this.dropDown.Name = "dropDown"; - this.dropDown.Size = new System.Drawing.Size(121, 21); - this.dropDown.TabIndex = 11; - // - // dropUp - // - this.dropUp.FormattingEnabled = true; - this.dropUp.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropUp.Items.AddRange(new object[] { - ""}); - this.dropUp.Location = new System.Drawing.Point(40, 290); - this.dropUp.Name = "dropUp"; - this.dropUp.Size = new System.Drawing.Size(121, 21); - this.dropUp.TabIndex = 10; - // - // dropY - // - this.dropY.FormattingEnabled = true; - this.dropY.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropY.Items.AddRange(new object[] { - ""}); - this.dropY.Location = new System.Drawing.Point(482, 440); - this.dropY.Name = "dropY"; - this.dropY.Size = new System.Drawing.Size(121, 21); - this.dropY.TabIndex = 6; - // - // dropX - // - this.dropX.FormattingEnabled = true; - this.dropX.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropX.Items.AddRange(new object[] { - ""}); - this.dropX.Location = new System.Drawing.Point(482, 390); - this.dropX.Name = "dropX"; - this.dropX.Size = new System.Drawing.Size(121, 21); - this.dropX.TabIndex = 5; - // - // dropB - // - this.dropB.FormattingEnabled = true; - this.dropB.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropB.Items.AddRange(new object[] { - ""}); - this.dropB.Location = new System.Drawing.Point(482, 340); - this.dropB.Name = "dropB"; - this.dropB.Size = new System.Drawing.Size(121, 21); - this.dropB.TabIndex = 4; - // - // dropA - // - this.dropA.FormattingEnabled = true; - this.dropA.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropA.Items.AddRange(new object[] { - ""}); - this.dropA.Location = new System.Drawing.Point(482, 290); - this.dropA.Name = "dropA"; - this.dropA.Size = new System.Drawing.Size(121, 21); - this.dropA.TabIndex = 3; - // - // dropRT - // - this.dropRT.FormattingEnabled = true; - this.dropRT.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropRT.Items.AddRange(new object[] { - ""}); - this.dropRT.Location = new System.Drawing.Point(482, 40); - this.dropRT.Name = "dropRT"; - this.dropRT.Size = new System.Drawing.Size(121, 21); - this.dropRT.TabIndex = 18; - // - // dropLT - // - this.dropLT.FormattingEnabled = true; - this.dropLT.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropLT.Items.AddRange(new object[] { - ""}); - this.dropLT.Location = new System.Drawing.Point(40, 40); - this.dropLT.Name = "dropLT"; - this.dropLT.Size = new System.Drawing.Size(121, 21); - this.dropLT.TabIndex = 19; - // - // dropRB - // - this.dropRB.FormattingEnabled = true; - this.dropRB.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropRB.Items.AddRange(new object[] { - ""}); - this.dropRB.Location = new System.Drawing.Point(482, 90); - this.dropRB.Name = "dropRB"; - this.dropRB.Size = new System.Drawing.Size(121, 21); - this.dropRB.TabIndex = 20; - // - // dropLB - // - this.dropLB.FormattingEnabled = true; - this.dropLB.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropLB.Items.AddRange(new object[] { - ""}); - this.dropLB.Location = new System.Drawing.Point(40, 90); - this.dropLB.Name = "dropLB"; - this.dropLB.Size = new System.Drawing.Size(121, 21); - this.dropLB.TabIndex = 21; - // - // dropBack - // - this.dropBack.FormattingEnabled = true; - this.dropBack.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropBack.Items.AddRange(new object[] { - ""}); - this.dropBack.Location = new System.Drawing.Point(40, 490); - this.dropBack.Name = "dropBack"; - this.dropBack.Size = new System.Drawing.Size(121, 21); - this.dropBack.TabIndex = 22; - // - // dropStart - // - this.dropStart.FormattingEnabled = true; - this.dropStart.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropStart.Items.AddRange(new object[] { - ""}); - this.dropStart.Location = new System.Drawing.Point(482, 490); - this.dropStart.Name = "dropStart"; - this.dropStart.Size = new System.Drawing.Size(121, 21); - this.dropStart.TabIndex = 23; - // - // dropHome - // - this.dropHome.FormattingEnabled = true; - this.dropHome.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropHome.Items.AddRange(new object[] { - ""}); - this.dropHome.Location = new System.Drawing.Point(264, 490); - this.dropHome.Name = "dropHome"; - this.dropHome.Size = new System.Drawing.Size(121, 21); - this.dropHome.TabIndex = 24; - // // labelRT // this.labelRT.AutoSize = true; @@ -403,72 +243,6 @@ private void InitializeComponent() this.labelHome.TabIndex = 31; this.labelHome.Text = "Home"; // - // dropRA - // - this.dropRA.FormattingEnabled = true; - this.dropRA.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropRA.Items.AddRange(new object[] { - ""}); - this.dropRA.Location = new System.Drawing.Point(482, 140); - this.dropRA.Name = "dropRA"; - this.dropRA.Size = new System.Drawing.Size(121, 21); - this.dropRA.TabIndex = 32; - // - // dropLA - // - this.dropLA.FormattingEnabled = true; - this.dropLA.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropLA.Items.AddRange(new object[] { - ""}); - this.dropLA.Location = new System.Drawing.Point(40, 140); - this.dropLA.Name = "dropLA"; - this.dropLA.Size = new System.Drawing.Size(121, 21); - this.dropLA.TabIndex = 33; - // - // dropRX - // - this.dropRX.FormattingEnabled = true; - this.dropRX.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropRX.Items.AddRange(new object[] { - ""}); - this.dropRX.Location = new System.Drawing.Point(482, 190); - this.dropRX.Name = "dropRX"; - this.dropRX.Size = new System.Drawing.Size(121, 21); - this.dropRX.TabIndex = 34; - // - // dropRY - // - this.dropRY.FormattingEnabled = true; - this.dropRY.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropRY.Items.AddRange(new object[] { - ""}); - this.dropRY.Location = new System.Drawing.Point(482, 240); - this.dropRY.Name = "dropRY"; - this.dropRY.Size = new System.Drawing.Size(121, 21); - this.dropRY.TabIndex = 35; - // - // dropLX - // - this.dropLX.FormattingEnabled = true; - this.dropLX.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropLX.Items.AddRange(new object[] { - ""}); - this.dropLX.Location = new System.Drawing.Point(40, 190); - this.dropLX.Name = "dropLX"; - this.dropLX.Size = new System.Drawing.Size(121, 21); - this.dropLX.TabIndex = 36; - // - // dropLY - // - this.dropLY.FormattingEnabled = true; - this.dropLY.ImeMode = System.Windows.Forms.ImeMode.NoControl; - this.dropLY.Items.AddRange(new object[] { - ""}); - this.dropLY.Location = new System.Drawing.Point(40, 240); - this.dropLY.Name = "dropLY"; - this.dropLY.Size = new System.Drawing.Size(121, 21); - this.dropLY.TabIndex = 37; - // // labelRA // this.labelRA.AutoSize = true; @@ -535,11 +309,396 @@ private void InitializeComponent() this.labelRY.TabIndex = 43; this.labelRY.Text = "Right Analog Y"; // + // groupBox1 + // + this.groupBox1.Controls.Add(this.label3); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Controls.Add(this.numericCompensation); + this.groupBox1.Location = new System.Drawing.Point(20, 545); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(762, 81); + this.groupBox1.TabIndex = 45; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Optional"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(17, 50); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(744, 13); + this.label3.TabIndex = 49; + this.label3.Text = "This value will be added/subtracted to/from the Raw value from Left Analog X (Eli" + + "minates initial deadzone in some games and can make for quicker steering)"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.Location = new System.Drawing.Point(123, 27); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(112, 20); + this.label2.TabIndex = 48; + this.label2.Text = "Compensation"; + // + // numericCompensation + // + this.numericCompensation.ImeMode = System.Windows.Forms.ImeMode.Close; + this.numericCompensation.Location = new System.Drawing.Point(20, 27); + this.numericCompensation.Maximum = new decimal(new int[] { + 70, + 0, + 0, + 0}); + this.numericCompensation.Name = "numericCompensation"; + this.numericCompensation.ReadOnly = true; + this.numericCompensation.Size = new System.Drawing.Size(97, 20); + this.numericCompensation.TabIndex = 47; + this.numericCompensation.ValueChanged += new System.EventHandler(this.numericCompensation_ValueChanged); + // + // dropA + // + this.dropA.FormattingEnabled = true; + this.dropA.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropA.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropA.Location = new System.Drawing.Point(482, 290); + this.dropA.Name = "dropA"; + this.dropA.Size = new System.Drawing.Size(121, 21); + this.dropA.TabIndex = 3; + // + // dropB + // + this.dropB.FormattingEnabled = true; + this.dropB.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropB.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropB.Location = new System.Drawing.Point(482, 340); + this.dropB.Name = "dropB"; + this.dropB.Size = new System.Drawing.Size(121, 21); + this.dropB.TabIndex = 4; + // + // dropX + // + this.dropX.FormattingEnabled = true; + this.dropX.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropX.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropX.Location = new System.Drawing.Point(482, 390); + this.dropX.Name = "dropX"; + this.dropX.Size = new System.Drawing.Size(121, 21); + this.dropX.TabIndex = 5; + // + // dropY + // + this.dropY.FormattingEnabled = true; + this.dropY.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropY.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropY.Location = new System.Drawing.Point(482, 440); + this.dropY.Name = "dropY"; + this.dropY.Size = new System.Drawing.Size(121, 21); + this.dropY.TabIndex = 6; + // + // dropUp + // + this.dropUp.FormattingEnabled = true; + this.dropUp.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropUp.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropUp.Location = new System.Drawing.Point(40, 290); + this.dropUp.Name = "dropUp"; + this.dropUp.Size = new System.Drawing.Size(121, 21); + this.dropUp.TabIndex = 10; + // + // dropDown + // + this.dropDown.FormattingEnabled = true; + this.dropDown.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropDown.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropDown.Location = new System.Drawing.Point(40, 340); + this.dropDown.Name = "dropDown"; + this.dropDown.Size = new System.Drawing.Size(121, 21); + this.dropDown.TabIndex = 11; + // + // dropLeft + // + this.dropLeft.FormattingEnabled = true; + this.dropLeft.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropLeft.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropLeft.Location = new System.Drawing.Point(40, 390); + this.dropLeft.Name = "dropLeft"; + this.dropLeft.Size = new System.Drawing.Size(121, 21); + this.dropLeft.TabIndex = 12; + // + // dropRight + // + this.dropRight.FormattingEnabled = true; + this.dropRight.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropRight.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropRight.Location = new System.Drawing.Point(40, 440); + this.dropRight.Name = "dropRight"; + this.dropRight.Size = new System.Drawing.Size(121, 21); + this.dropRight.TabIndex = 13; + // + // dropLT + // + this.dropLT.FormattingEnabled = true; + this.dropLT.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropLT.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropLT.Location = new System.Drawing.Point(40, 40); + this.dropLT.Name = "dropLT"; + this.dropLT.Size = new System.Drawing.Size(121, 21); + this.dropLT.TabIndex = 19; + // + // dropRT + // + this.dropRT.FormattingEnabled = true; + this.dropRT.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropRT.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropRT.Location = new System.Drawing.Point(482, 40); + this.dropRT.Name = "dropRT"; + this.dropRT.Size = new System.Drawing.Size(121, 21); + this.dropRT.TabIndex = 18; + // + // dropLB + // + this.dropLB.FormattingEnabled = true; + this.dropLB.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropLB.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropLB.Location = new System.Drawing.Point(40, 90); + this.dropLB.Name = "dropLB"; + this.dropLB.Size = new System.Drawing.Size(121, 21); + this.dropLB.TabIndex = 21; + // + // dropRB + // + this.dropRB.FormattingEnabled = true; + this.dropRB.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropRB.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropRB.Location = new System.Drawing.Point(482, 90); + this.dropRB.Name = "dropRB"; + this.dropRB.Size = new System.Drawing.Size(121, 21); + this.dropRB.TabIndex = 20; + // + // dropLA + // + this.dropLA.FormattingEnabled = true; + this.dropLA.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropLA.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropLA.Location = new System.Drawing.Point(40, 140); + this.dropLA.Name = "dropLA"; + this.dropLA.Size = new System.Drawing.Size(121, 21); + this.dropLA.TabIndex = 33; + // + // dropRA + // + this.dropRA.FormattingEnabled = true; + this.dropRA.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropRA.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropRA.Location = new System.Drawing.Point(482, 140); + this.dropRA.Name = "dropRA"; + this.dropRA.Size = new System.Drawing.Size(121, 21); + this.dropRA.TabIndex = 32; + // + // dropHome + // + this.dropHome.FormattingEnabled = true; + this.dropHome.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropHome.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropHome.Location = new System.Drawing.Point(264, 490); + this.dropHome.Name = "dropHome"; + this.dropHome.Size = new System.Drawing.Size(121, 21); + this.dropHome.TabIndex = 24; + // + // dropStart + // + this.dropStart.FormattingEnabled = true; + this.dropStart.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropStart.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropStart.Location = new System.Drawing.Point(482, 490); + this.dropStart.Name = "dropStart"; + this.dropStart.Size = new System.Drawing.Size(121, 21); + this.dropStart.TabIndex = 23; + // + // dropBack + // + this.dropBack.FormattingEnabled = true; + this.dropBack.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropBack.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropBack.Location = new System.Drawing.Point(40, 490); + this.dropBack.Name = "dropBack"; + this.dropBack.Size = new System.Drawing.Size(121, 21); + this.dropBack.TabIndex = 22; + // + // dropLY + // + this.dropLY.FormattingEnabled = true; + this.dropLY.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropLY.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropLY.Location = new System.Drawing.Point(40, 240); + this.dropLY.Name = "dropLY"; + this.dropLY.Size = new System.Drawing.Size(121, 21); + this.dropLY.TabIndex = 37; + // + // dropLX + // + this.dropLX.FormattingEnabled = true; + this.dropLX.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropLX.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropLX.Location = new System.Drawing.Point(40, 190); + this.dropLX.Name = "dropLX"; + this.dropLX.Size = new System.Drawing.Size(121, 21); + this.dropLX.TabIndex = 36; + // + // dropRY + // + this.dropRY.FormattingEnabled = true; + this.dropRY.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropRY.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropRY.Location = new System.Drawing.Point(482, 240); + this.dropRY.Name = "dropRY"; + this.dropRY.Size = new System.Drawing.Size(121, 21); + this.dropRY.TabIndex = 35; + // + // dropRX + // + this.dropRX.FormattingEnabled = true; + this.dropRX.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.dropRX.Items.AddRange(new object[] { + "", + "", + "", + "", + "", + ""}); + this.dropRX.Location = new System.Drawing.Point(482, 190); + this.dropRX.Name = "dropRX"; + this.dropRX.Size = new System.Drawing.Size(121, 21); + this.dropRX.TabIndex = 34; + // // ControllerOptions // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(814, 561); + this.ClientSize = new System.Drawing.Size(814, 638); + this.Controls.Add(this.groupBox1); this.Controls.Add(this.labelRY); this.Controls.Add(this.labelLY); this.Controls.Add(this.labelRX); @@ -583,12 +742,14 @@ private void InitializeComponent() this.Controls.Add(this.dropRY); this.Controls.Add(this.dropRX); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "ControllerOptions"; this.Text = "Controller Options"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.onClose); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericCompensation)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -638,6 +799,9 @@ private void InitializeComponent() private System.Windows.Forms.Label labelRX; private System.Windows.Forms.Label labelLY; private System.Windows.Forms.Label labelRY; - + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.NumericUpDown numericCompensation; } } \ No newline at end of file diff --git a/XOutput/ControllerOptions.cs b/XOutput/ControllerOptions.cs index 80eaff0..b458b72 100644 --- a/XOutput/ControllerOptions.cs +++ b/XOutput/ControllerOptions.cs @@ -8,14 +8,14 @@ namespace XOutput public partial class ControllerOptions : Form { ControllerDevice dev; - private Thread detectThread; public ControllerOptions(ControllerDevice device) { InitializeComponent(); dev = device; int ind = 0; - foreach (MultiLevelComboBox m in this.Controls.OfType()) { + foreach (MultiLevelComboBox m in this.Controls.OfType()) + { //Tag structure: [Type, Number, Index] m.Items[0] = getBindingText(ind); //Change combobox text according to saved binding m.addOption("Disabled", @@ -44,27 +44,45 @@ public ControllerOptions(ControllerDevice device) m.addOption("D-Pad " + i.ToString() + " Right", dpads, new byte[] { 35, (byte)(i - 1), (byte)ind }); } - for (int i = 1; i <= dev.joystick.Capabilities.AxesCount; i++) + for (int i = 0; i <= dev.analogs.Length - 1; i++) { - m.addOption("Axis " + i.ToString(), axes, - new byte[] { 16, (byte)(i - 1), (byte)ind }); - m.addOption("IAxis " + i.ToString(), iaxes, - new byte[] { 17, (byte)(i - 1), (byte)ind }); - m.addOption("HAxis" + i.ToString(), haxes, - new byte[] { 18, (byte)(i - 1), (byte)ind }); - m.addOption("IHAxis" + i.ToString(), ihaxes, - new byte[] { 19, (byte)(i - 1), (byte)ind }); + if (dev.analogs[i] != 0) + { + int ii = i + 1; + + m.addOption("Axis " + ii.ToString(), axes, + new byte[] { 16, (byte)(i), (byte)ind }); + m.addOption("IAxis " + ii.ToString(), iaxes, + new byte[] { 17, (byte)(i), (byte)ind }); + m.addOption("HAxis" + ii.ToString(), haxes, + new byte[] { 18, (byte)(i), (byte)ind }); + m.addOption("IHAxis" + ii.ToString(), ihaxes, + new byte[] { 19, (byte)(i), (byte)ind }); + } + } m.SelectionChangeCommitted += new System.EventHandler(SelectionChanged); ind++; } + + this.numericCompensation.Tag = new byte[] { 253, (byte)(0), (byte)ind }; + + int outVal = 0; + int.TryParse(getBindingText(ind), out outVal); + + this.numericCompensation.Value = outVal > 0 ? (outVal) : 0; } private string getBindingText(int i) { - if (dev.mapping[i * 2] == 255) { + if (dev.mapping[i * 2] == 255) + { return "Disabled"; } + else if (dev.mapping[i * 2] == 253) + { + return (dev.mapping[((i * 2) + 1)].ToString()); + } byte subType = (byte)(dev.mapping[i * 2] & 0x0F); byte type = (byte)((dev.mapping[i * 2] & 0xF0) >> 4); byte num = (byte)(dev.mapping[(i * 2) + 1] + 1); @@ -74,10 +92,12 @@ private string getBindingText(int i) return string.Format(typeString[type], num, axesString[subType], dpadString[subType]); } - private void SelectionChanged(object sender, EventArgs e) { + private void SelectionChanged(object sender, EventArgs e) + { ToolStripMenuItem i = (ToolStripMenuItem)sender; byte[] b = (byte[])i.Tag; - if (b[0] == 254) { + if (b[0] == 254) + { //start thread return; } @@ -86,9 +106,18 @@ private void SelectionChanged(object sender, EventArgs e) { dev.Save(); } - private void onClose(object sender, EventArgs e) { + private void onClose(object sender, EventArgs e) + { dev.Save(); } + private void numericCompensation_ValueChanged(object sender, EventArgs e) + { + NumericUpDown i = (NumericUpDown)sender; + byte[] b = (byte[])i.Tag; + dev.mapping[b[2] * 2] = b[0]; + dev.mapping[(b[2] * 2) + 1] = (byte)(i.Value); + dev.Save(); + } } } diff --git a/XOutput/SaveManager.cs b/XOutput/SaveManager.cs index 90dc5e1..d81f926 100644 --- a/XOutput/SaveManager.cs +++ b/XOutput/SaveManager.cs @@ -7,17 +7,17 @@ static class SaveManager { static string[] properties = new string[] {"button_a", "button_b", "button_x", "button_y", "dpad_up", "dpad_down", "dpad_left", "dpad_right", "left_trigger", "right_trigger", "left_bumper", "right_bumper", "left_axebutton", "right_axebutton", - "home", "start", "back", "left_y", "left_x", "right_y", "right_x"}; + "home", "start", "back", "left_y", "left_x", "right_y", "right_x", "compensation"}; static private string dirName = @"configs"; - private static byte[] parseLine(string line) { //This needs better error hadnling + private static byte[] parseLine(string line) { //This needs better error handling int i; //The index of the control in the map array byte type = 255, subType = 255, num = 255; - for (i = 0; i < 21; i++) { //find which button this is for + for (i = 0; i < 22; i++) { //find which button this is for if (line.StartsWith(properties[i])) { break; } - if (i == 20) { + if (i > 20) { Logger.Log("Error parsing: Could not identify property"); return new byte[] { 255, 255, 255}; } @@ -27,6 +27,7 @@ private static byte[] parseLine(string line) { //This needs better error hadnlin return new byte[] { 255, 255, 255 }; } string val = line.Remove(0, properties[i].Length + 1); //remove up to the = sign + int thisNumericValue = 0; if (val.StartsWith("btn")) { type = 0; subType = 0; @@ -63,6 +64,9 @@ private static byte[] parseLine(string line) { //This needs better error hadnlin num = byte.Parse(val.Remove(val.Length - 5)); } } else if (val == "disabled") { + } else if(int.TryParse(val, out thisNumericValue)){ + subType = 253; + num = (byte)(thisNumericValue + 1); } else { Logger.Log("Error parsing: Could not identify value"); return new byte[] { 255, 255, 255 }; @@ -82,12 +86,12 @@ public static byte[] Load(string devName) { File.Create(path); return null; } - byte[] mapping = new byte[42]; + byte[] mapping = new byte[44]; string[] config = File.ReadAllLines(path); for (int i = 0; i < config.Length; i++) { byte[] data = parseLine(config[i]); Console.Write(data[0]); - if (data[0] > 40) { + if (data[0] > 42) { continue; } mapping[data[0]] = data[1]; @@ -113,11 +117,15 @@ private static string generateSaveString(byte[] Mapping) { string[] dpadString = new string[] { "up", "down", "left", "right" }; string saveString = ""; - for (int i = 0; i < 21; i++) { + for (int i = 0; i < 22; i++) { saveString += properties[i] + "="; if (Mapping[i * 2] == 255) { saveString += "disabled\r\n"; continue; + }else if (Mapping[i * 2] == 253) + { + saveString += ((byte)Mapping[i * 2 + 1]).ToString() + "\r\n"; + continue; } byte subType = (byte)(Mapping[i * 2] & 0x0F); byte type = (byte)((Mapping[i * 2] & 0xF0) >> 4); diff --git a/XOutput/XOutput.csproj b/XOutput/XOutput.csproj index 95d01ce..fb0a6be 100644 --- a/XOutput/XOutput.csproj +++ b/XOutput/XOutput.csproj @@ -100,6 +100,9 @@ XOut.cs + + ControllerOptions.cs + ResXFileCodeGenerator Resources.Designer.cs @@ -112,6 +115,7 @@ XOut.cs + Designer SettingsSingleFileGenerator From db1c1e3046d414e433b16339cce23c3ed54a49bc Mon Sep 17 00:00:00 2001 From: Adam Irvine Date: Tue, 1 Nov 2016 07:11:05 +0000 Subject: [PATCH 2/2] Slight tweaks... - Added xbox 360 controller clipart/image instead of label layout when mapping controller - Fix issue where some devices have invalid characters in their name for saving config file (removing invalid characters...) - Removed 'Detect' option in controller mapping drop downs as it didn't have any code linked to it... (to avoid confusion) --- XOutput/ControllerOptions.Designer.cs | 327 ++++++++--------------- XOutput/ControllerOptions.cs | 4 +- XOutput/ControllerOptions.resx | 120 +++++++++ XOutput/Properties/AssemblyInfo.cs | 4 +- XOutput/Properties/Resources.Designer.cs | 12 +- XOutput/Properties/Resources.resx | 9 +- XOutput/Resources/xbox360controller.png | Bin 0 -> 99839 bytes XOutput/SaveManager.cs | 18 +- XOutput/XOutput.csproj | 1 + 9 files changed, 272 insertions(+), 223 deletions(-) create mode 100644 XOutput/ControllerOptions.resx create mode 100644 XOutput/Resources/xbox360controller.png diff --git a/XOutput/ControllerOptions.Designer.cs b/XOutput/ControllerOptions.Designer.cs index 5747fe9..cedf7f1 100644 --- a/XOutput/ControllerOptions.Designer.cs +++ b/XOutput/ControllerOptions.Designer.cs @@ -28,18 +28,6 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.labelA = new System.Windows.Forms.Label(); - this.labelB = new System.Windows.Forms.Label(); - this.labelX = new System.Windows.Forms.Label(); - this.labelY = new System.Windows.Forms.Label(); - this.labelUp = new System.Windows.Forms.Label(); - this.labelDown = new System.Windows.Forms.Label(); - this.labelLeft = new System.Windows.Forms.Label(); - this.labelRight = new System.Windows.Forms.Label(); - this.labelRT = new System.Windows.Forms.Label(); - this.labelLT = new System.Windows.Forms.Label(); - this.labelRB = new System.Windows.Forms.Label(); - this.labelLB = new System.Windows.Forms.Label(); this.labelBack = new System.Windows.Forms.Label(); this.labelStart = new System.Windows.Forms.Label(); this.labelHome = new System.Windows.Forms.Label(); @@ -78,144 +66,12 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.numericCompensation)).BeginInit(); this.SuspendLayout(); // - // labelA - // - this.labelA.AutoSize = true; - this.labelA.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.labelA.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelA.Location = new System.Drawing.Point(609, 290); - this.labelA.Name = "labelA"; - this.labelA.Size = new System.Drawing.Size(20, 20); - this.labelA.TabIndex = 0; - this.labelA.Text = "A"; - // - // labelB - // - this.labelB.AutoSize = true; - this.labelB.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.labelB.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelB.Location = new System.Drawing.Point(609, 340); - this.labelB.Name = "labelB"; - this.labelB.Size = new System.Drawing.Size(20, 20); - this.labelB.TabIndex = 7; - this.labelB.Text = "B"; - // - // labelX - // - this.labelX.AutoSize = true; - this.labelX.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.labelX.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelX.Location = new System.Drawing.Point(609, 390); - this.labelX.Name = "labelX"; - this.labelX.Size = new System.Drawing.Size(20, 20); - this.labelX.TabIndex = 8; - this.labelX.Text = "X"; - // - // labelY - // - this.labelY.AutoSize = true; - this.labelY.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.labelY.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelY.Location = new System.Drawing.Point(609, 440); - this.labelY.Name = "labelY"; - this.labelY.Size = new System.Drawing.Size(20, 20); - this.labelY.TabIndex = 9; - this.labelY.Text = "Y"; - // - // labelUp - // - this.labelUp.AutoSize = true; - this.labelUp.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.labelUp.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelUp.Location = new System.Drawing.Point(167, 290); - this.labelUp.Name = "labelUp"; - this.labelUp.Size = new System.Drawing.Size(30, 20); - this.labelUp.TabIndex = 14; - this.labelUp.Text = "Up"; - // - // labelDown - // - this.labelDown.AutoSize = true; - this.labelDown.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.labelDown.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelDown.Location = new System.Drawing.Point(167, 340); - this.labelDown.Name = "labelDown"; - this.labelDown.Size = new System.Drawing.Size(50, 20); - this.labelDown.TabIndex = 15; - this.labelDown.Text = "Down"; - // - // labelLeft - // - this.labelLeft.AutoSize = true; - this.labelLeft.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.labelLeft.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelLeft.Location = new System.Drawing.Point(167, 390); - this.labelLeft.Name = "labelLeft"; - this.labelLeft.Size = new System.Drawing.Size(37, 20); - this.labelLeft.TabIndex = 16; - this.labelLeft.Text = "Left"; - // - // labelRight - // - this.labelRight.AutoSize = true; - this.labelRight.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.labelRight.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelRight.Location = new System.Drawing.Point(167, 440); - this.labelRight.Name = "labelRight"; - this.labelRight.Size = new System.Drawing.Size(47, 20); - this.labelRight.TabIndex = 17; - this.labelRight.Text = "Right"; - // - // labelRT - // - this.labelRT.AutoSize = true; - this.labelRT.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.labelRT.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelRT.Location = new System.Drawing.Point(609, 40); - this.labelRT.Name = "labelRT"; - this.labelRT.Size = new System.Drawing.Size(100, 20); - this.labelRT.TabIndex = 25; - this.labelRT.Text = "Right Trigger"; - // - // labelLT - // - this.labelLT.AutoSize = true; - this.labelLT.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.labelLT.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelLT.Location = new System.Drawing.Point(167, 40); - this.labelLT.Name = "labelLT"; - this.labelLT.Size = new System.Drawing.Size(90, 20); - this.labelLT.TabIndex = 26; - this.labelLT.Text = "Left Trigger"; - // - // labelRB - // - this.labelRB.AutoSize = true; - this.labelRB.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.labelRB.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelRB.Location = new System.Drawing.Point(609, 90); - this.labelRB.Name = "labelRB"; - this.labelRB.Size = new System.Drawing.Size(107, 20); - this.labelRB.TabIndex = 27; - this.labelRB.Text = "Right Bumper"; - // - // labelLB - // - this.labelLB.AutoSize = true; - this.labelLB.FlatStyle = System.Windows.Forms.FlatStyle.Flat; - this.labelLB.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelLB.Location = new System.Drawing.Point(167, 90); - this.labelLB.Name = "labelLB"; - this.labelLB.Size = new System.Drawing.Size(97, 20); - this.labelLB.TabIndex = 28; - this.labelLB.Text = "Left Bumper"; - // // labelBack // this.labelBack.AutoSize = true; this.labelBack.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.labelBack.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelBack.Location = new System.Drawing.Point(167, 490); + this.labelBack.Location = new System.Drawing.Point(335, 25); this.labelBack.Name = "labelBack"; this.labelBack.Size = new System.Drawing.Size(45, 20); this.labelBack.TabIndex = 29; @@ -226,7 +82,7 @@ private void InitializeComponent() this.labelStart.AutoSize = true; this.labelStart.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.labelStart.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelStart.Location = new System.Drawing.Point(609, 490); + this.labelStart.Location = new System.Drawing.Point(777, 25); this.labelStart.Name = "labelStart"; this.labelStart.Size = new System.Drawing.Size(44, 20); this.labelStart.TabIndex = 30; @@ -237,7 +93,7 @@ private void InitializeComponent() this.labelHome.AutoSize = true; this.labelHome.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.labelHome.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelHome.Location = new System.Drawing.Point(391, 490); + this.labelHome.Location = new System.Drawing.Point(559, 25); this.labelHome.Name = "labelHome"; this.labelHome.Size = new System.Drawing.Size(52, 20); this.labelHome.TabIndex = 31; @@ -246,75 +102,78 @@ private void InitializeComponent() // labelRA // this.labelRA.AutoSize = true; + this.labelRA.BackColor = System.Drawing.Color.Transparent; this.labelRA.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.labelRA.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelRA.Location = new System.Drawing.Point(609, 140); + this.labelRA.Location = new System.Drawing.Point(759, 426); this.labelRA.Name = "labelRA"; - this.labelRA.Size = new System.Drawing.Size(153, 20); + this.labelRA.Size = new System.Drawing.Size(57, 20); this.labelRA.TabIndex = 38; - this.labelRA.Text = "Right Analog Button"; + this.labelRA.Text = "Button"; // // labelLA // this.labelLA.AutoSize = true; this.labelLA.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.labelLA.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelLA.Location = new System.Drawing.Point(167, 140); + this.labelLA.Location = new System.Drawing.Point(89, 310); this.labelLA.Name = "labelLA"; - this.labelLA.Size = new System.Drawing.Size(143, 20); + this.labelLA.Size = new System.Drawing.Size(57, 20); this.labelLA.TabIndex = 39; - this.labelLA.Text = "Left Analog Button"; + this.labelLA.Text = "Button"; // // labelLX // this.labelLX.AutoSize = true; this.labelLX.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.labelLX.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelLX.Location = new System.Drawing.Point(167, 190); + this.labelLX.Location = new System.Drawing.Point(126, 339); this.labelLX.Name = "labelLX"; - this.labelLX.Size = new System.Drawing.Size(106, 20); + this.labelLX.Size = new System.Drawing.Size(20, 20); this.labelLX.TabIndex = 40; - this.labelLX.Text = "Left Analog X"; + this.labelLX.Text = "X"; // // labelRX // this.labelRX.AutoSize = true; + this.labelRX.BackColor = System.Drawing.Color.Transparent; this.labelRX.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.labelRX.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelRX.Location = new System.Drawing.Point(609, 190); + this.labelRX.Location = new System.Drawing.Point(759, 453); this.labelRX.Name = "labelRX"; - this.labelRX.Size = new System.Drawing.Size(116, 20); + this.labelRX.Size = new System.Drawing.Size(20, 20); this.labelRX.TabIndex = 41; - this.labelRX.Text = "Right Analog X"; + this.labelRX.Text = "X"; // // labelLY // this.labelLY.AutoSize = true; this.labelLY.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.labelLY.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelLY.Location = new System.Drawing.Point(167, 240); + this.labelLY.Location = new System.Drawing.Point(126, 365); this.labelLY.Name = "labelLY"; - this.labelLY.Size = new System.Drawing.Size(106, 20); + this.labelLY.Size = new System.Drawing.Size(20, 20); this.labelLY.TabIndex = 42; - this.labelLY.Text = "Left Analog Y"; + this.labelLY.Text = "Y"; // // labelRY // this.labelRY.AutoSize = true; + this.labelRY.BackColor = System.Drawing.Color.Transparent; this.labelRY.FlatStyle = System.Windows.Forms.FlatStyle.Flat; this.labelRY.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.labelRY.Location = new System.Drawing.Point(609, 240); + this.labelRY.Location = new System.Drawing.Point(759, 480); this.labelRY.Name = "labelRY"; - this.labelRY.Size = new System.Drawing.Size(116, 20); + this.labelRY.Size = new System.Drawing.Size(20, 20); this.labelRY.TabIndex = 43; - this.labelRY.Text = "Right Analog Y"; + this.labelRY.Text = "Y"; // // groupBox1 // this.groupBox1.Controls.Add(this.label3); this.groupBox1.Controls.Add(this.label2); this.groupBox1.Controls.Add(this.numericCompensation); - this.groupBox1.Location = new System.Drawing.Point(20, 545); + this.groupBox1.Location = new System.Drawing.Point(94, 573); this.groupBox1.Name = "groupBox1"; this.groupBox1.Size = new System.Drawing.Size(762, 81); this.groupBox1.TabIndex = 45; @@ -367,8 +226,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropA.Location = new System.Drawing.Point(482, 290); + this.dropA.Location = new System.Drawing.Point(717, 380); this.dropA.Name = "dropA"; this.dropA.Size = new System.Drawing.Size(121, 21); this.dropA.TabIndex = 3; @@ -383,8 +245,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropB.Location = new System.Drawing.Point(482, 340); + this.dropB.Location = new System.Drawing.Point(780, 313); this.dropB.Name = "dropB"; this.dropB.Size = new System.Drawing.Size(121, 21); this.dropB.TabIndex = 4; @@ -399,8 +264,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropX.Location = new System.Drawing.Point(482, 390); + this.dropX.Location = new System.Drawing.Point(613, 338); this.dropX.Name = "dropX"; this.dropX.Size = new System.Drawing.Size(121, 21); this.dropX.TabIndex = 5; @@ -415,8 +283,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropY.Location = new System.Drawing.Point(482, 440); + this.dropY.Location = new System.Drawing.Point(717, 252); this.dropY.Name = "dropY"; this.dropY.Size = new System.Drawing.Size(121, 21); this.dropY.TabIndex = 6; @@ -431,8 +302,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropUp.Location = new System.Drawing.Point(40, 290); + this.dropUp.Location = new System.Drawing.Point(337, 389); this.dropUp.Name = "dropUp"; this.dropUp.Size = new System.Drawing.Size(121, 21); this.dropUp.TabIndex = 10; @@ -447,8 +321,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropDown.Location = new System.Drawing.Point(40, 340); + this.dropDown.Location = new System.Drawing.Point(337, 466); this.dropDown.Name = "dropDown"; this.dropDown.Size = new System.Drawing.Size(121, 21); this.dropDown.TabIndex = 11; @@ -463,8 +340,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropLeft.Location = new System.Drawing.Point(40, 390); + this.dropLeft.Location = new System.Drawing.Point(251, 426); this.dropLeft.Name = "dropLeft"; this.dropLeft.Size = new System.Drawing.Size(121, 21); this.dropLeft.TabIndex = 12; @@ -479,8 +359,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropRight.Location = new System.Drawing.Point(40, 440); + this.dropRight.Location = new System.Drawing.Point(407, 426); this.dropRight.Name = "dropRight"; this.dropRight.Size = new System.Drawing.Size(121, 21); this.dropRight.TabIndex = 13; @@ -495,8 +378,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropLT.Location = new System.Drawing.Point(40, 40); + this.dropLT.Location = new System.Drawing.Point(259, 103); this.dropLT.Name = "dropLT"; this.dropLT.Size = new System.Drawing.Size(121, 21); this.dropLT.TabIndex = 19; @@ -511,8 +397,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropRT.Location = new System.Drawing.Point(482, 40); + this.dropRT.Location = new System.Drawing.Point(632, 103); this.dropRT.Name = "dropRT"; this.dropRT.Size = new System.Drawing.Size(121, 21); this.dropRT.TabIndex = 18; @@ -527,8 +416,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropLB.Location = new System.Drawing.Point(40, 90); + this.dropLB.Location = new System.Drawing.Point(161, 189); this.dropLB.Name = "dropLB"; this.dropLB.Size = new System.Drawing.Size(121, 21); this.dropLB.TabIndex = 21; @@ -543,8 +435,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropRB.Location = new System.Drawing.Point(482, 90); + this.dropRB.Location = new System.Drawing.Point(717, 189); this.dropRB.Name = "dropRB"; this.dropRB.Size = new System.Drawing.Size(121, 21); this.dropRB.TabIndex = 20; @@ -559,8 +454,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropLA.Location = new System.Drawing.Point(40, 140); + this.dropLA.Location = new System.Drawing.Point(152, 310); this.dropLA.Name = "dropLA"; this.dropLA.Size = new System.Drawing.Size(121, 21); this.dropLA.TabIndex = 33; @@ -575,8 +473,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropRA.Location = new System.Drawing.Point(482, 140); + this.dropRA.Location = new System.Drawing.Point(632, 426); this.dropRA.Name = "dropRA"; this.dropRA.Size = new System.Drawing.Size(121, 21); this.dropRA.TabIndex = 32; @@ -591,8 +492,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropHome.Location = new System.Drawing.Point(264, 490); + this.dropHome.Location = new System.Drawing.Point(432, 25); this.dropHome.Name = "dropHome"; this.dropHome.Size = new System.Drawing.Size(121, 21); this.dropHome.TabIndex = 24; @@ -607,8 +511,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropStart.Location = new System.Drawing.Point(482, 490); + this.dropStart.Location = new System.Drawing.Point(650, 25); this.dropStart.Name = "dropStart"; this.dropStart.Size = new System.Drawing.Size(121, 21); this.dropStart.TabIndex = 23; @@ -623,8 +530,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropBack.Location = new System.Drawing.Point(40, 490); + this.dropBack.Location = new System.Drawing.Point(208, 25); this.dropBack.Name = "dropBack"; this.dropBack.Size = new System.Drawing.Size(121, 21); this.dropBack.TabIndex = 22; @@ -639,8 +549,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropLY.Location = new System.Drawing.Point(40, 240); + this.dropLY.Location = new System.Drawing.Point(152, 364); this.dropLY.Name = "dropLY"; this.dropLY.Size = new System.Drawing.Size(121, 21); this.dropLY.TabIndex = 37; @@ -655,8 +568,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropLX.Location = new System.Drawing.Point(40, 190); + this.dropLX.Location = new System.Drawing.Point(152, 337); this.dropLX.Name = "dropLX"; this.dropLX.Size = new System.Drawing.Size(121, 21); this.dropLX.TabIndex = 36; @@ -671,8 +587,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropRY.Location = new System.Drawing.Point(482, 240); + this.dropRY.Location = new System.Drawing.Point(632, 480); this.dropRY.Name = "dropRY"; this.dropRY.Size = new System.Drawing.Size(121, 21); this.dropRY.TabIndex = 35; @@ -687,8 +606,11 @@ private void InitializeComponent() "", "", "", + "", + "", + "", ""}); - this.dropRX.Location = new System.Drawing.Point(482, 190); + this.dropRX.Location = new System.Drawing.Point(632, 453); this.dropRX.Name = "dropRX"; this.dropRX.Size = new System.Drawing.Size(121, 21); this.dropRX.TabIndex = 34; @@ -697,7 +619,9 @@ private void InitializeComponent() // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(814, 638); + this.BackgroundImage = global::XOutput.Properties.Resources.xbox360controller; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.ClientSize = new System.Drawing.Size(1008, 661); this.Controls.Add(this.groupBox1); this.Controls.Add(this.labelRY); this.Controls.Add(this.labelLY); @@ -708,18 +632,6 @@ private void InitializeComponent() this.Controls.Add(this.labelHome); this.Controls.Add(this.labelStart); this.Controls.Add(this.labelBack); - this.Controls.Add(this.labelLB); - this.Controls.Add(this.labelRB); - this.Controls.Add(this.labelLT); - this.Controls.Add(this.labelRT); - this.Controls.Add(this.labelRight); - this.Controls.Add(this.labelLeft); - this.Controls.Add(this.labelDown); - this.Controls.Add(this.labelUp); - this.Controls.Add(this.labelY); - this.Controls.Add(this.labelX); - this.Controls.Add(this.labelB); - this.Controls.Add(this.labelA); this.Controls.Add(this.dropA); this.Controls.Add(this.dropB); this.Controls.Add(this.dropX); @@ -741,10 +653,12 @@ private void InitializeComponent() this.Controls.Add(this.dropLX); this.Controls.Add(this.dropRY); this.Controls.Add(this.dropRX); + this.DoubleBuffered = true; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "ControllerOptions"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; this.Text = "Controller Options"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.onClose); this.groupBox1.ResumeLayout(false); @@ -756,23 +670,14 @@ private void InitializeComponent() } #endregion - - private System.Windows.Forms.Label labelA; private MultiLevelComboBox dropA; private MultiLevelComboBox dropB; private MultiLevelComboBox dropX; private MultiLevelComboBox dropY; - private System.Windows.Forms.Label labelB; - private System.Windows.Forms.Label labelX; - private System.Windows.Forms.Label labelY; private MultiLevelComboBox dropUp; private MultiLevelComboBox dropDown; private MultiLevelComboBox dropLeft; private MultiLevelComboBox dropRight; - private System.Windows.Forms.Label labelUp; - private System.Windows.Forms.Label labelDown; - private System.Windows.Forms.Label labelLeft; - private System.Windows.Forms.Label labelRight; private MultiLevelComboBox dropRT; private MultiLevelComboBox dropLT; private MultiLevelComboBox dropRB; @@ -780,10 +685,6 @@ private void InitializeComponent() private MultiLevelComboBox dropBack; private MultiLevelComboBox dropStart; private MultiLevelComboBox dropHome; - private System.Windows.Forms.Label labelRT; - private System.Windows.Forms.Label labelLT; - private System.Windows.Forms.Label labelRB; - private System.Windows.Forms.Label labelLB; private System.Windows.Forms.Label labelBack; private System.Windows.Forms.Label labelStart; private System.Windows.Forms.Label labelHome; diff --git a/XOutput/ControllerOptions.cs b/XOutput/ControllerOptions.cs index b458b72..3c4d68a 100644 --- a/XOutput/ControllerOptions.cs +++ b/XOutput/ControllerOptions.cs @@ -20,8 +20,8 @@ public ControllerOptions(ControllerDevice device) m.Items[0] = getBindingText(ind); //Change combobox text according to saved binding m.addOption("Disabled", tag: new byte[] { 255, 0, (byte)ind }); - m.addOption("Detect", - tag: new byte[] { 254, 0, (byte)ind }); + //m.addOption("Detect", + // tag: new byte[] { 254, 0, (byte)ind }); ToolStripMenuItem axes = m.addMenu("Axes"); ToolStripMenuItem buttons = m.addMenu("Buttons"); ToolStripMenuItem dpads = m.addMenu("D-Pads"); diff --git a/XOutput/ControllerOptions.resx b/XOutput/ControllerOptions.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/XOutput/ControllerOptions.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/XOutput/Properties/AssemblyInfo.cs b/XOutput/Properties/AssemblyInfo.cs index 2e66c32..4eefa7e 100644 --- a/XOutput/Properties/AssemblyInfo.cs +++ b/XOutput/Properties/AssemblyInfo.cs @@ -6,9 +6,9 @@ // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("XOutput")] -[assembly: AssemblyDescription("")] +[assembly: AssemblyDescription("Base by Eric Barrett, Tweaked by API (All via GitHub)")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Eric Barrett")] +[assembly: AssemblyCompany("")] [assembly: AssemblyProduct("XOutput")] [assembly: AssemblyCopyright("Copyright © Eric Barrett 2014")] [assembly: AssemblyTrademark("")] diff --git a/XOutput/Properties/Resources.Designer.cs b/XOutput/Properties/Resources.Designer.cs index 5029fc7..85d1a8d 100644 --- a/XOutput/Properties/Resources.Designer.cs +++ b/XOutput/Properties/Resources.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.34014 +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -89,5 +89,15 @@ internal static System.Drawing.Bitmap gear { return ((System.Drawing.Bitmap)(obj)); } } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap xbox360controller { + get { + object obj = ResourceManager.GetObject("xbox360controller", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } } } diff --git a/XOutput/Properties/Resources.resx b/XOutput/Properties/Resources.resx index 734caf8..1a56d65 100644 --- a/XOutput/Properties/Resources.resx +++ b/XOutput/Properties/Resources.resx @@ -118,13 +118,16 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\Resources\arrow_Down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\arrow_Up.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\arrow_Down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\gear.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\xbox360controller.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/XOutput/Resources/xbox360controller.png b/XOutput/Resources/xbox360controller.png new file mode 100644 index 0000000000000000000000000000000000000000..f487e28a61a0066e3eb3ebfe0e7ea95389d80ffc GIT binary patch literal 99839 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 z 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 literal 0 HcmV?d00001 diff --git a/XOutput/SaveManager.cs b/XOutput/SaveManager.cs index d81f926..fb3b594 100644 --- a/XOutput/SaveManager.cs +++ b/XOutput/SaveManager.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Linq; namespace XOutput { @@ -81,7 +82,8 @@ public static byte[] Load(string devName) { Directory.CreateDirectory(dirName); return null; } - string path = dirName + "\\" + devName + ".ini"; + + string path = dirName + "\\" + removeInvalidFileNameChars(devName) + ".ini"; if (!File.Exists(path)) { File.Create(path); return null; @@ -104,13 +106,25 @@ public static void Save(string devName, byte[] mapping) { if (!Directory.Exists(dirName)) { Directory.CreateDirectory(dirName); } - string path = dirName + "\\" + devName + ".ini"; + + string path = dirName + "\\" + removeInvalidFileNameChars(devName) + ".ini"; if (!File.Exists(path)) { File.Create(path); } File.WriteAllText(path, generateSaveString(mapping)); } + private static string removeInvalidFileNameChars(string proposedFileName) + { + var invalidChars = Path.GetInvalidFileNameChars(); + + string invalidCharsRemoved = new string(proposedFileName + .Where(x => !invalidChars.Contains(x)) + .ToArray()); + + return invalidCharsRemoved; + } + private static string generateSaveString(byte[] Mapping) { string[] typeString = new string[] { "btn{0}", "{1}axis{0}", "dpad{0}{2}" }; string[] axesString = new string[] { "", "i", "h", "ih" }; diff --git a/XOutput/XOutput.csproj b/XOutput/XOutput.csproj index fb0a6be..f2590bd 100644 --- a/XOutput/XOutput.csproj +++ b/XOutput/XOutput.csproj @@ -157,6 +157,7 @@ +