将Feature/XP.Common和Feature/XP.Hardware分支合并至Develop/XP.forHardwareAndCommon,完善XPapp注册和相关硬件类库通用类库功能。
This commit is contained in:
@@ -0,0 +1,213 @@
|
||||
using System;
|
||||
using XP.Hardware.RaySource.Abstractions.Events;
|
||||
using XP.Hardware.RaySource.Config;
|
||||
|
||||
namespace XP.Hardware.RaySource.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 操作类型枚举 | Operation type enum
|
||||
/// </summary>
|
||||
public enum OperationType
|
||||
{
|
||||
WarmUp,
|
||||
Training,
|
||||
FilamentCalibration,
|
||||
AutoCenter
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 操作进度计算结果 | Operation progress calculation result
|
||||
/// </summary>
|
||||
public class ProgressResult
|
||||
{
|
||||
/// <summary>
|
||||
/// 进度百分比(0-100)| Progress percentage (0-100)
|
||||
/// </summary>
|
||||
public int Progress { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 操作是否已完成 | Whether operation is completed
|
||||
/// </summary>
|
||||
public bool IsCompleted { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 操作进度计算器 | Operation Progress Calculator
|
||||
/// 根据实时电压/电流/状态字符串估算暖机、训机、灯丝校准、自动定心的进度
|
||||
/// Estimates progress for warm-up, training, filament calibration, auto-center based on real-time voltage/current/status strings
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据最新状态数据计算进度 | Calculate progress based on latest status data
|
||||
/// </summary>
|
||||
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 }
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 暖机进度计算 | Warm-up progress calculation
|
||||
/// 参照老项目:根据电压/电流阶段性变化估算,完成条件为 WarmUpStatus 包含"完成"
|
||||
/// </summary>
|
||||
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
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 训机进度计算 | Training progress calculation
|
||||
/// 参照老项目:分 6 个阶段,根据电压/电流和阶段号计算进度
|
||||
/// </summary>
|
||||
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
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 灯丝校准进度计算 | Filament calibration progress calculation
|
||||
/// 参照老项目:电流 / 880 * 100,完成条件为状态包含"完成"且电流 > 800
|
||||
/// </summary>
|
||||
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
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 自动定心进度计算 | Auto-center progress calculation
|
||||
/// 参照老项目:电压 / 220 * 100,完成条件为状态包含"完成"且电压 > 200
|
||||
/// </summary>
|
||||
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
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user