This commit is contained in:
GukSang.Jin
2026-06-13 19:21:45 +08:00
parent 999dde26c4
commit cfc6d2b6fa

View File

@@ -22,7 +22,8 @@ public sealed class TorqueTrendControl : FrameworkElement
private const double SensorMaxTorque = 100;
private const double MinimumTorqueRange = 0.1;
private const double MinimumSpeedRange = 1;
private const double TorqueTrendBinSize = 0.1;
private const double TorqueRangePaddingRatio = 0.12;
private const double TorqueTrendBinSize = 0.01;
private bool _isManualView;
private double _viewMinTorque = SensorMinTorque;
@@ -283,12 +284,35 @@ public sealed class TorqueTrendControl : FrameworkElement
{
if (!_isManualView)
{
(_viewMinTorque, _viewMaxTorque) = GetAutoTorqueRange(samples);
(_viewMinSpeed, _viewMaxSpeed) = GetAutoSpeedRange(samples);
}
return (_viewMinTorque, _viewMaxTorque, _viewMinSpeed, _viewMaxSpeed);
}
private static (double MinTorque, double MaxTorque) GetAutoTorqueRange(List<TorqueSamplePayload> samples)
{
double minTorque = Math.Clamp(samples.Min(sample => sample.TorqueMilliNewtonMeters), SensorMinTorque, SensorMaxTorque);
double maxTorque = Math.Clamp(samples.Max(sample => sample.TorqueMilliNewtonMeters), SensorMinTorque, SensorMaxTorque);
double range = maxTorque - minTorque;
if (range < MinimumTorqueRange)
{
double center = (minTorque + maxTorque) / 2;
minTorque = center - MinimumTorqueRange / 2;
maxTorque = center + MinimumTorqueRange / 2;
}
else
{
double padding = range * TorqueRangePaddingRatio;
minTorque -= padding;
maxTorque += padding;
}
return ClampTorqueRange(minTorque, maxTorque);
}
private static (double MinSpeed, double MaxSpeed) GetAutoSpeedRange(List<TorqueSamplePayload> samples)
{
double minSpeed = samples.Min(sample => sample.SpeedRpm);
@@ -480,15 +504,16 @@ public sealed class TorqueTrendControl : FrameworkElement
}
List<TorqueSamplePayload> samples = ReadSamples();
(_viewMinTorque, _viewMaxTorque) = samples.Count == 0
? (SensorMinTorque, SensorMaxTorque)
: GetAutoTorqueRange(samples);
(_viewMinSpeed, _viewMaxSpeed) = samples.Count == 0 ? (0, 1) : GetAutoSpeedRange(samples);
_isManualView = true;
}
private void ClampView()
{
double torqueRange = Math.Clamp(_viewMaxTorque - _viewMinTorque, MinimumTorqueRange, SensorMaxTorque - SensorMinTorque);
_viewMinTorque = Math.Clamp(_viewMinTorque, SensorMinTorque, SensorMaxTorque - torqueRange);
_viewMaxTorque = _viewMinTorque + torqueRange;
(_viewMinTorque, _viewMaxTorque) = ClampTorqueRange(_viewMinTorque, _viewMaxTorque);
if (!double.IsFinite(_viewMinSpeed)
|| !double.IsFinite(_viewMaxSpeed)
@@ -499,6 +524,13 @@ public sealed class TorqueTrendControl : FrameworkElement
}
}
private static (double MinTorque, double MaxTorque) ClampTorqueRange(double minTorque, double maxTorque)
{
double torqueRange = Math.Clamp(maxTorque - minTorque, MinimumTorqueRange, SensorMaxTorque - SensorMinTorque);
minTorque = Math.Clamp(minTorque, SensorMinTorque, SensorMaxTorque - torqueRange);
return (minTorque, minTorque + torqueRange);
}
private void EndMouseDrag()
{
_lastDragPoint = null;