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
};
}
}
}