示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }