Files
XplorePlane/XP.Hardware.RaySource/Implementations/SimulatedXRaySource.cs
T

239 lines
7.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}
}