private void SetNumericsFromAnalog() { _programmaticallyUpdatingNumerics = true; if (AnalogStick.HasValue) { // Setting .Value of a numeric causes a draw, so avoid it unless necessary if (ManualX.Value != AnalogStick.X) { ManualX.Value = AnalogStick.X; } if (ManualY.Value != AnalogStick.Y) { ManualY.Value = AnalogStick.Y; } } else { if (ManualX.Value != 0) { ManualX.Value = 0; } if (ManualY.Value != 0) { ManualY.Value = 0; } } manualR.ValueChanged -= PolarNumeric_Changed; manualTheta.ValueChanged -= PolarNumeric_Changed; var polar = PolarRectConversion.RectToPolarDeg(AnalogStick.X - rangeAverageX, AnalogStick.Y - rangeAverageY); manualR.Value = (decimal)polar.Item1; manualTheta.Value = (decimal)polar.Item2; manualR.ValueChanged += PolarNumeric_Changed; manualTheta.ValueChanged += PolarNumeric_Changed; _programmaticallyUpdatingNumerics = false; }
private void PolarNumeric_Changed(object sender, EventArgs e) { ManualX.ValueChanged -= ManualXY_ValueChanged; //TODO is setting and checking a bool faster than subscription? ManualY.ValueChanged -= ManualXY_ValueChanged; var rect = PolarRectConversion.PolarDegToRect((double)manualR.Value, (double)manualTheta.Value); rect = new Tuple <double, double>( rangeAverageX + Math.Ceiling(rect.Item1).Clamp(-127, 127), rangeAverageY + Math.Ceiling(rect.Item2).Clamp(-127, 127)); ManualX.Value = (decimal)rect.Item1; ManualY.Value = (decimal)rect.Item2; AnalogStick.X = (int)rect.Item1; AnalogStick.Y = (int)rect.Item2; AnalogStick.HasValue = true; AnalogStick.Refresh(); ManualX.ValueChanged += ManualXY_ValueChanged; ManualY.ValueChanged += ManualXY_ValueChanged; }