239 lines
7.0 KiB
C#
239 lines
7.0 KiB
C#
using System;
|
||
using Prism.Events;
|
||
using XP.Common.Logging.Interfaces;
|
||
using XP.Hardware.RaySource.Abstractions;
|
||
using XP.Hardware.RaySource.Abstractions.Enums;
|
||
using XP.Hardware.RaySource.Abstractions.Events;
|
||
|
||
namespace XP.Hardware.RaySource.Implementations
|
||
{
|
||
/// <summary>
|
||
/// 模拟射线源实现 | Simulated X-Ray Source Implementation
|
||
/// 用于开发和调试环境,无需真实硬件 | For development and debugging without real hardware
|
||
/// </summary>
|
||
public class SimulatedXRaySource : XRaySourceBase
|
||
{
|
||
#region 依赖注入字段
|
||
|
||
private readonly IEventAggregator _eventAggregator;
|
||
private readonly ILoggerService _logger;
|
||
|
||
#endregion
|
||
|
||
#region 内部状态
|
||
|
||
private bool _isOn;
|
||
private float _setVoltage;
|
||
private float _setCurrent;
|
||
private float _setFocus;
|
||
private readonly Random _random = new Random();
|
||
|
||
#endregion
|
||
|
||
#region 构造函数
|
||
|
||
/// <summary>
|
||
/// 构造函数,注入依赖
|
||
/// </summary>
|
||
/// <param name="eventAggregator">Prism 事件聚合器</param>
|
||
/// <param name="logger">日志服务</param>
|
||
public SimulatedXRaySource(IEventAggregator eventAggregator, ILoggerService logger)
|
||
{
|
||
_eventAggregator = eventAggregator ?? throw new ArgumentNullException(nameof(eventAggregator));
|
||
_logger = logger?.ForModule<SimulatedXRaySource>() ?? throw new ArgumentNullException(nameof(logger));
|
||
}
|
||
|
||
public override string SourceName => "Simulated X-Ray Source";
|
||
|
||
#endregion
|
||
|
||
#region IXRaySource 方法实现
|
||
|
||
/// <summary>
|
||
/// 初始化射线源
|
||
/// </summary>
|
||
public override XRayResult Initialize()
|
||
{
|
||
_isInitialized = true;
|
||
_logger.Info("[Simulated] 射线源初始化成功");
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 连接 PVI 变量
|
||
/// </summary>
|
||
public override XRayResult ConnectVariables()
|
||
{
|
||
_isConnected = true;
|
||
_eventAggregator.GetEvent<VariablesConnectedEvent>().Publish(true);
|
||
_eventAggregator.GetEvent<RaySourceStatusChangedEvent>().Publish(RaySourceStatus.Closed);
|
||
_logger.Info("[Simulated] PVI 变量连接成功");
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 开启射线
|
||
/// </summary>
|
||
public override XRayResult TurnOn()
|
||
{
|
||
_isOn = true;
|
||
_eventAggregator.GetEvent<RaySourceStatusChangedEvent>().Publish(RaySourceStatus.Opened);
|
||
_logger.Info("[Simulated] 射线源已开启");
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 关闭射线
|
||
/// </summary>
|
||
public override XRayResult TurnOff()
|
||
{
|
||
_isOn = false;
|
||
_eventAggregator.GetEvent<RaySourceStatusChangedEvent>().Publish(RaySourceStatus.Closed);
|
||
_logger.Info("[Simulated] 射线源已关闭");
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设置电压(kV)
|
||
/// </summary>
|
||
public override XRayResult SetVoltage(float voltage)
|
||
{
|
||
_setVoltage = voltage;
|
||
_logger.Info("[Simulated] 设置电压: {Voltage} kV", voltage);
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设置电流(μA)
|
||
/// </summary>
|
||
public override XRayResult SetCurrent(float current)
|
||
{
|
||
_setCurrent = current;
|
||
_logger.Info("[Simulated] 设置电流: {Current} μA", current);
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设置焦点
|
||
/// </summary>
|
||
public override XRayResult SetFocus(float focus)
|
||
{
|
||
_setFocus = focus;
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 读取实际电压值(模拟 ±2% 波动)
|
||
/// </summary>
|
||
public override XRayResult ReadVoltage()
|
||
{
|
||
float noise = (float)(_random.NextDouble() * 0.04 - 0.02); // -0.02 to +0.02
|
||
float simulatedVoltage = _setVoltage * (1 + noise);
|
||
return XRayResult.Ok(simulatedVoltage);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 读取实际电流值(模拟 ±2% 波动)
|
||
/// </summary>
|
||
public override XRayResult ReadCurrent()
|
||
{
|
||
float noise = (float)(_random.NextDouble() * 0.04 - 0.02); // -0.02 to +0.02
|
||
float simulatedCurrent = _setCurrent * (1 + noise);
|
||
return XRayResult.Ok(simulatedCurrent);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 读取系统状态
|
||
/// </summary>
|
||
public override XRayResult ReadSystemStatus()
|
||
{
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 检查错误状态
|
||
/// </summary>
|
||
public override XRayResult CheckErrors()
|
||
{
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// TXI 开启
|
||
/// </summary>
|
||
public override XRayResult TxiOn()
|
||
{
|
||
_logger.Info("[Simulated] TXI 已开启");
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// TXI 关闭
|
||
/// </summary>
|
||
public override XRayResult TxiOff()
|
||
{
|
||
_logger.Info("[Simulated] TXI 已关闭");
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 暖机设置
|
||
/// </summary>
|
||
public override XRayResult WarmUp()
|
||
{
|
||
_logger.Info("[Simulated] 暖机完成");
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 训机设置
|
||
/// </summary>
|
||
public override XRayResult Training()
|
||
{
|
||
_logger.Info("[Simulated] 训机完成");
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 灯丝校准
|
||
/// </summary>
|
||
public override XRayResult FilamentCalibration()
|
||
{
|
||
_logger.Info("[Simulated] 灯丝校准完成");
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 全部电压自动定心
|
||
/// </summary>
|
||
public override XRayResult AutoCenter()
|
||
{
|
||
_logger.Info("[Simulated] 自动定心完成");
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 设置功率模式
|
||
/// </summary>
|
||
public override XRayResult SetPowerMode(int mode)
|
||
{
|
||
_logger.Info("[Simulated] 设置功率模式: {Mode}", mode);
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 完全关闭设备,重置所有状态
|
||
/// </summary>
|
||
public override XRayResult CloseOff()
|
||
{
|
||
_isOn = false;
|
||
_isConnected = false;
|
||
_isInitialized = false;
|
||
_logger.Info("[Simulated] 射线源已完全关闭");
|
||
return XRayResult.Ok();
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
}
|