public void Update(Joystick joy) { // Display Raw Value (no deadzone & expected limits) Joystick rawDisplay = new Joystick(); rawDisplay.Calibrate(_default); rawDisplay.rawX = joy.rawX; rawDisplay.rawY = joy.rawY; rawDisplay.centerX = _default.centerX + rawXCenter; rawDisplay.centerY = _default.centerY + rawYCenter; rawDisplay.Normalize(); Canvas.SetLeft(raw, 500 * rawDisplay.X + 500 - raw.Width / 2); Canvas.SetTop(raw, -500 * rawDisplay.Y + 500 - raw.Height / 2); // Apply Center joy.centerX = _default.centerX + rawXCenter; joy.centerY = _default.centerY + rawYCenter; // Apply Limits joy.maxX = (int)Math.Round((_default.maxX - _default.centerX) * (limitXPos.Value / 100d)) + _default.centerX; joy.minX = _default.centerX - (int)Math.Round((_default.centerX - _default.minX) * (limitXNeg.Value / 100d)); joy.maxY = (int)Math.Round((_default.maxY - _default.centerY) * (limitYPos.Value / 100d)) + _default.centerX; joy.minY = _default.centerY - (int)Math.Round((_default.centerY - _default.minY) * (limitYNeg.Value / 100d)); // Apply Deadzone (not symetrical) joy.deadXp = (int)Math.Round((_default.maxX - _default.centerX) * (deadXPos.Value / 100d)); joy.deadXn = -(int)Math.Round((_default.maxX - _default.centerX) * (deadXNeg.Value / 100d)); joy.deadYp = (int)Math.Round((_default.maxY - _default.centerY) * (deadYPos.Value / 100d)); joy.deadYn = -(int)Math.Round((_default.maxY - _default.centerY) * (deadYNeg.Value / 100d)); joy.Normalize(); // Apply Anti Deadzone var anti = (float)antiDeadzoneSlider.Value / 100f; if (joy.X != 0) { var xRange = 1f - anti; joy.X = joy.X * xRange + anti * Math.Sign(joy.X); } if (joy.Y != 0) { var yRange = 1f - anti; joy.Y = joy.Y * yRange + anti * Math.Sign(joy.Y); } // Display Output Canvas.SetTop(@out, joy.Y * -500 + 500 - @out.Height / 2); Canvas.SetLeft(@out, joy.X * 500 + 500 - @out.Width / 2); xLabel.Content = string.Format("X: {0}%", Math.Round(joy.X * 100)); yLabel.Content = string.Format("Y: {0}%", Math.Round(joy.Y * 100)); }