using System; using XP.Hardware.RaySource.Abstractions.Events; using XP.Hardware.RaySource.Config; namespace XP.Hardware.RaySource.Services { /// /// 操作类型枚举 | Operation type enum /// public enum OperationType { WarmUp, Training, FilamentCalibration, AutoCenter } /// /// 操作进度计算结果 | Operation progress calculation result /// public class ProgressResult { /// /// 进度百分比(0-100)| Progress percentage (0-100) /// public int Progress { get; set; } /// /// 操作是否已完成 | Whether operation is completed /// public bool IsCompleted { get; set; } } /// /// 操作进度计算器 | Operation Progress Calculator /// 根据实时电压/电流/状态字符串估算暖机、训机、灯丝校准、自动定心的进度 /// Estimates progress for warm-up, training, filament calibration, auto-center based on real-time voltage/current/status strings /// public class OperationProgressCalculator { private readonly OperationType _operationType; private readonly RaySourceConfig _config; private double _maxRatio; private int _trainingPhase = 1; public OperationProgressCalculator(OperationType operationType, RaySourceConfig config) { _operationType = operationType; _config = config ?? throw new ArgumentNullException(nameof(config)); _maxRatio = 0; _trainingPhase = 1; } /// /// 根据最新状态数据计算进度 | Calculate progress based on latest status data /// public ProgressResult Calculate(SystemStatusData data) { if (data == null) return new ProgressResult { Progress = (int)_maxRatio, IsCompleted = false }; return _operationType switch { OperationType.WarmUp => CalculateWarmUp(data), OperationType.Training => CalculateTraining(data), OperationType.FilamentCalibration => CalculateFilamentCalibration(data), OperationType.AutoCenter => CalculateAutoCenter(data), _ => new ProgressResult { Progress = 0, IsCompleted = false } }; } /// /// 暖机进度计算 | Warm-up progress calculation /// 参照老项目:根据电压/电流阶段性变化估算,完成条件为 WarmUpStatus 包含"完成" /// private ProgressResult CalculateWarmUp(SystemStatusData data) { double ratio = 0; float voltage = data.ActualVoltage; float current = data.ActualCurrent; float maxVoltage = _config.MaxVoltage; // 225 if (current < 10 && voltage <= 50) { // 第一阶段:电压升到 50kV,占 25% ratio = voltage / 50.0 * 25.0; } else if (current >= 10 && current <= 100 && voltage >= 49) { // 第二阶段:电流升到 100μA,占 25%-75% ratio = current / 100.0 * 50.0 + 25.0; } else if (current >= 98 && voltage >= 55) { // 第三阶段:电压升到最大值,占 75%-100% ratio = voltage / maxVoltage * 100.0; } if (ratio > _maxRatio) _maxRatio = ratio; // 完成条件:code = "2"(暖机完成)且电压超过最大值的 90% | Complete: code "2" and voltage > 90% max bool isCompleted = data.WarmUpStatus == "2" && voltage > maxVoltage * 0.9f; if (isCompleted) _maxRatio = 100; return new ProgressResult { Progress = Math.Min((int)_maxRatio, 100), IsCompleted = isCompleted }; } /// /// 训机进度计算 | Training progress calculation /// 参照老项目:分 6 个阶段,根据电压/电流和阶段号计算进度 /// private ProgressResult CalculateTraining(SystemStatusData data) { double ratio = 0; float voltage = data.ActualVoltage; float current = data.ActualCurrent; float maxVoltage = _config.MaxVoltage; float maxCurrent = _config.MaxCurrent; switch (_trainingPhase) { case 1: if (current < 10 && voltage <= 50) ratio = voltage / 50.0 * 20.0; if (ratio > 17) _trainingPhase = 2; break; case 2: if (current >= 10 && current <= 100 && voltage >= 45) ratio = current / 100.0 * 30.0; if (ratio > 27) _trainingPhase = 3; break; case 3: if (current >= 98 && voltage >= 60) ratio = voltage / maxVoltage * 40.0; if (ratio > 37) _trainingPhase = 4; break; case 4: if (current >= 98 && voltage >= 98) ratio = current / maxCurrent * 60.0; if (ratio > 57) _trainingPhase = 5; break; case 5: if (current >= 45 && voltage >= 30) ratio = voltage / maxVoltage * 80.0; if (ratio > 77) _trainingPhase = 6; break; case 6: if (current >= 45 && voltage >= 30) ratio = voltage / maxVoltage * 100.0; break; } if (ratio > _maxRatio) _maxRatio = ratio; // 完成条件:code = "2"(训机完成)且处于最后阶段 | Complete: code "2" and final phase bool isCompleted = data.StartUpStatus == "2" && _trainingPhase >= 6; if (isCompleted) _maxRatio = 100; return new ProgressResult { Progress = Math.Min((int)_maxRatio, 100), IsCompleted = isCompleted }; } /// /// 灯丝校准进度计算 | Filament calibration progress calculation /// 参照老项目:电流 / 880 * 100,完成条件为状态包含"完成"且电流 > 800 /// private ProgressResult CalculateFilamentCalibration(SystemStatusData data) { double ratio = data.ActualCurrent / 880.0 * 100.0; if (ratio > _maxRatio) _maxRatio = ratio; // 完成条件:code = "2"(灯丝校准完成)且电流 > 800 | Complete: code "2" and current > 800 bool isCompleted = data.FilamentAdjustStatus == "2" && data.ActualCurrent > 800; if (isCompleted) _maxRatio = 100; return new ProgressResult { Progress = Math.Min((int)_maxRatio, 100), IsCompleted = isCompleted }; } /// /// 自动定心进度计算 | Auto-center progress calculation /// 参照老项目:电压 / 220 * 100,完成条件为状态包含"完成"且电压 > 200 /// private ProgressResult CalculateAutoCenter(SystemStatusData data) { double ratio = data.ActualVoltage / 220.0 * 100.0; if (ratio > _maxRatio) _maxRatio = ratio; // 完成条件:code = "2"(自动定心完成)且电压 > 200 | Complete: code "2" and voltage > 200 bool isCompleted = data.AutoCenterStatus == "2" && data.ActualVoltage > 200; if (isCompleted) _maxRatio = 100; return new ProgressResult { Progress = Math.Min((int)_maxRatio, 100), IsCompleted = isCompleted }; } } }