private void graphThumbStick(string titleText, SetThumbStick setThumbStick, GetThumbStick getThumbStick, byte[] calibrationTable) { zedGraphControl.GraphPane.CurveList.Clear(); GraphPane graphPane = zedGraphControl.GraphPane; graphPane.Title.Text = titleText; graphPane.XAxis.Title.Text = "Wiper Value"; graphPane.XAxis.Scale.Min = 0; graphPane.XAxis.Scale.Max = 255; graphPane.YAxis.Title.Text = "Trigger Value"; graphPane.YAxis.Scale.Min = -1.0; graphPane.YAxis.Scale.Max = 1.0; PointPairList targetValues = new PointPairList(); PointPairList actualValues = new PointPairList(); LineItem targetCurve = graphPane.AddCurve("Target", targetValues, Color.Red, SymbolType.None); LineItem actualCurve = graphPane.AddCurve("Actual", actualValues, Color.Blue, SymbolType.None); for (int wiper = 0; wiper <= byte.MaxValue && stopButton.Enabled; wiper++) { float deflection = (float)wiper / (float)byte.MaxValue * 2.0F - 1.0F; float calibratedDeflection = calibrationTable == null ? deflection : (float)calibrationTable[wiper] / (float)byte.MaxValue * 2.0F - 1.0F; setThumbStick(calibratedDeflection); Application.DoEvents(); Thread.Sleep(16); IPointListEdit targetList = targetCurve.Points as IPointListEdit; targetList.Add(wiper, deflection); IPointListEdit actualList = actualCurve.Points as IPointListEdit; float actualThumbStick = getThumbStick(); actualList.Add(wiper, actualThumbStick); zedGraphControl.AxisChange(); zedGraphControl.Invalidate(); } setThumbStick(0.0F); }
private void graphThumbStick(string titleText, SetThumbStick setThumbStick, GetThumbStick getThumbStick, byte[] calibrationTable) { zedGraphControl.GraphPane.CurveList.Clear(); GraphPane graphPane = zedGraphControl.GraphPane; graphPane.Title.Text = titleText; graphPane.XAxis.Title.Text = "Wiper Value"; graphPane.XAxis.Scale.Min = 0; graphPane.XAxis.Scale.Max = 255; graphPane.YAxis.Title.Text = "Trigger Value"; graphPane.YAxis.Scale.Min = -1.0; graphPane.YAxis.Scale.Max = 1.0; PointPairList targetValues = new PointPairList(); PointPairList actualValues = new PointPairList(); LineItem targetCurve = graphPane.AddCurve("Target", targetValues, Color.Red, SymbolType.None); LineItem actualCurve = graphPane.AddCurve("Actual", actualValues, Color.Blue, SymbolType.None); for (int wiper = 0; wiper <= byte.MaxValue && stopButton.Enabled; wiper++) { float deflection = (float)wiper / (float)byte.MaxValue * 2.0F - 1.0F; float calibratedDeflection = calibrationTable == null ? deflection : (float)calibrationTable[wiper] / (float)byte.MaxValue * 2.0F - 1.0F; setThumbStick(calibratedDeflection); Application.DoEvents(); Thread.Sleep(16); IPointListEdit targetList = targetCurve.Points as IPointListEdit; targetList.Add(wiper, deflection); IPointListEdit actualList = actualCurve.Points as IPointListEdit; float actualThumbStick = getThumbStick(); actualList.Add(wiper, actualThumbStick); zedGraphControl.AxisChange(); zedGraphControl.Invalidate(); } setThumbStick(0.0F); }
private void calibrateThumbStick(string controlName, SetThumbStick setThumbStick, GetThumbStick getThumbStick, SetCalibration setCalibration, bool isInverted) { float[] actualValues = new float[byte.MaxValue + 1]; byte[] calibrationTable = new byte[byte.MaxValue + 1]; // Read the GamePad ThumbStick deflection for each wiper value for (int wiper = 0; wiper <= byte.MaxValue && stopButton.Enabled; wiper++) { float deflection = ((float)wiper / (float)byte.MaxValue) * 2.0F - 1.0F; setThumbStick(deflection); Application.DoEvents(); Thread.Sleep(16); switch (calibrationEnabledComboBox.Text) { case "All High": actualValues[wiper] = 1.0F; break; case "All Centered": actualValues[wiper] = 0.0F; break; case "All Low": actualValues[wiper] = -1.0F; break; default: actualValues[wiper] = getThumbStick(); break; } } // Find value of array entry whose value is closest to zero float zero = float.PositiveInfinity; Array.ForEach<float>(actualValues, (f) => { zero = (Math.Abs(f) < Math.Abs(zero)) ? f : zero; }); // Find index of first array entry whose value is closest to zero int firstZero = Array.FindIndex<float>(actualValues, (f) => (f == zero)); if (firstZero == -1) firstZero = byte.MaxValue / 2; // Find index of last array entry whose value is closest to zero int lastZero = Array.FindLastIndex<float>(actualValues, (f) => (f == zero)); if (lastZero == -1) lastZero = byte.MaxValue / 2; // Find value of array entry whose value is closest to 1.0F float plusOne = float.PositiveInfinity; Array.ForEach<float>(actualValues, (f) => { plusOne = (Math.Abs(f - 1.0F) < Math.Abs(plusOne - 1.0F)) ? f : plusOne; }); // Find index of first array entry whose value is closest to 1.0F int firstPlusOne = Array.FindIndex<float>(actualValues, (f) => (f == plusOne)); if (firstPlusOne == -1) firstPlusOne = byte.MaxValue; // Find value of array entry whose value is closest to -1.0F float minusOne = float.NegativeInfinity; Array.ForEach<float>(actualValues, (f) => { minusOne = (Math.Abs(f + 1.0F) < Math.Abs(minusOne + 1.0F)) ? f : minusOne; }); // Find index of first array entry whose value is closest to -1.0F int lastMinusOne = Array.FindLastIndex<float>(actualValues, (f) => (f == minusOne)); if (lastMinusOne == -1) lastMinusOne = byte.MinValue; for (int wiper = 0; wiper <= byte.MaxValue; wiper++) { float deflection = ((float)wiper / (float)byte.MaxValue) * 2.0F - 1.0F; int match = (firstZero + lastZero) / 2; for (int index = lastMinusOne; index <= firstPlusOne; index++) { if (Math.Abs(actualValues[index] - deflection) < Math.Abs(actualValues[match] - deflection)) match = index; } calibrationTable[wiper] = (byte)match; } calibrationTable[byte.MinValue] = (byte)((lastMinusOne > byte.MinValue) ? lastMinusOne - 1 : byte.MinValue); calibrationTable[byte.MaxValue] = (byte)((firstPlusOne < byte.MaxValue) ? firstPlusOne + 1 : byte.MaxValue); calibrationTable[byte.MaxValue / 2 + 1] = (byte)((firstZero + lastZero) / 2); setThumbStick(0.0F); graphThumbStick(controlName + " Calibrated (Simulation)", setThumbStick, getThumbStick, calibrationTable); writeCalibrationTable(controlName, calibrationTable, isInverted); setCalibration(calibrationTable); }
private void calibrateThumbStick(string controlName, SetThumbStick setThumbStick, GetThumbStick getThumbStick, SetCalibration setCalibration, bool isInverted) { float[] actualValues = new float[byte.MaxValue + 1]; byte[] calibrationTable = new byte[byte.MaxValue + 1]; // Read the GamePad ThumbStick deflection for each wiper value for (int wiper = 0; wiper <= byte.MaxValue && stopButton.Enabled; wiper++) { float deflection = ((float)wiper / (float)byte.MaxValue) * 2.0F - 1.0F; setThumbStick(deflection); Application.DoEvents(); Thread.Sleep(16); switch (calibrationEnabledComboBox.Text) { case "All High": actualValues[wiper] = 1.0F; break; case "All Centered": actualValues[wiper] = 0.0F; break; case "All Low": actualValues[wiper] = -1.0F; break; default: actualValues[wiper] = getThumbStick(); break; } } // Find value of array entry whose value is closest to zero float zero = float.PositiveInfinity; Array.ForEach <float>(actualValues, (f) => { zero = (Math.Abs(f) < Math.Abs(zero)) ? f : zero; }); // Find index of first array entry whose value is closest to zero int firstZero = Array.FindIndex <float>(actualValues, (f) => (f == zero)); if (firstZero == -1) { firstZero = byte.MaxValue / 2; } // Find index of last array entry whose value is closest to zero int lastZero = Array.FindLastIndex <float>(actualValues, (f) => (f == zero)); if (lastZero == -1) { lastZero = byte.MaxValue / 2; } // Find value of array entry whose value is closest to 1.0F float plusOne = float.PositiveInfinity; Array.ForEach <float>(actualValues, (f) => { plusOne = (Math.Abs(f - 1.0F) < Math.Abs(plusOne - 1.0F)) ? f : plusOne; }); // Find index of first array entry whose value is closest to 1.0F int firstPlusOne = Array.FindIndex <float>(actualValues, (f) => (f == plusOne)); if (firstPlusOne == -1) { firstPlusOne = byte.MaxValue; } // Find value of array entry whose value is closest to -1.0F float minusOne = float.NegativeInfinity; Array.ForEach <float>(actualValues, (f) => { minusOne = (Math.Abs(f + 1.0F) < Math.Abs(minusOne + 1.0F)) ? f : minusOne; }); // Find index of first array entry whose value is closest to -1.0F int lastMinusOne = Array.FindLastIndex <float>(actualValues, (f) => (f == minusOne)); if (lastMinusOne == -1) { lastMinusOne = byte.MinValue; } for (int wiper = 0; wiper <= byte.MaxValue; wiper++) { float deflection = ((float)wiper / (float)byte.MaxValue) * 2.0F - 1.0F; int match = (firstZero + lastZero) / 2; for (int index = lastMinusOne; index <= firstPlusOne; index++) { if (Math.Abs(actualValues[index] - deflection) < Math.Abs(actualValues[match] - deflection)) { match = index; } } calibrationTable[wiper] = (byte)match; } calibrationTable[byte.MinValue] = (byte)((lastMinusOne > byte.MinValue) ? lastMinusOne - 1 : byte.MinValue); calibrationTable[byte.MaxValue] = (byte)((firstPlusOne < byte.MaxValue) ? firstPlusOne + 1 : byte.MaxValue); calibrationTable[byte.MaxValue / 2 + 1] = (byte)((firstZero + lastZero) / 2); setThumbStick(0.0F); graphThumbStick(controlName + " Calibrated (Simulation)", setThumbStick, getThumbStick, calibrationTable); writeCalibrationTable(controlName, calibrationTable, isInverted); setCalibration(calibrationTable); }