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
{
///
/// 模拟射线源实现 | Simulated X-Ray Source Implementation
/// 用于开发和调试环境,无需真实硬件 | For development and debugging without real hardware
///
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 构造函数
///
/// 构造函数,注入依赖
///
/// Prism 事件聚合器
/// 日志服务
public SimulatedXRaySource(IEventAggregator eventAggregator, ILoggerService logger)
{
_eventAggregator = eventAggregator ?? throw new ArgumentNullException(nameof(eventAggregator));
_logger = logger?.ForModule() ?? throw new ArgumentNullException(nameof(logger));
}
public override string SourceName => "Simulated X-Ray Source";
#endregion
#region IXRaySource 方法实现
///
/// 初始化射线源
///
public override XRayResult Initialize()
{
_isInitialized = true;
_logger.Info("[Simulated] 射线源初始化成功");
return XRayResult.Ok();
}
///
/// 连接 PVI 变量
///
public override XRayResult ConnectVariables()
{
_isConnected = true;
_eventAggregator.GetEvent().Publish(true);
_eventAggregator.GetEvent().Publish(RaySourceStatus.Closed);
_logger.Info("[Simulated] PVI 变量连接成功");
return XRayResult.Ok();
}
///
/// 开启射线
///
public override XRayResult TurnOn()
{
_isOn = true;
_eventAggregator.GetEvent().Publish(RaySourceStatus.Opened);
_logger.Info("[Simulated] 射线源已开启");
return XRayResult.Ok();
}
///
/// 关闭射线
///
public override XRayResult TurnOff()
{
_isOn = false;
_eventAggregator.GetEvent().Publish(RaySourceStatus.Closed);
_logger.Info("[Simulated] 射线源已关闭");
return XRayResult.Ok();
}
///
/// 设置电压(kV)
///
public override XRayResult SetVoltage(float voltage)
{
_setVoltage = voltage;
_logger.Info("[Simulated] 设置电压: {Voltage} kV", voltage);
return XRayResult.Ok();
}
///
/// 设置电流(μA)
///
public override XRayResult SetCurrent(float current)
{
_setCurrent = current;
_logger.Info("[Simulated] 设置电流: {Current} μA", current);
return XRayResult.Ok();
}
///
/// 设置焦点
///
public override XRayResult SetFocus(float focus)
{
_setFocus = focus;
return XRayResult.Ok();
}
///
/// 读取实际电压值(模拟 ±2% 波动)
///
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);
}
///
/// 读取实际电流值(模拟 ±2% 波动)
///
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);
}
///
/// 读取系统状态
///
public override XRayResult ReadSystemStatus()
{
return XRayResult.Ok();
}
///
/// 检查错误状态
///
public override XRayResult CheckErrors()
{
return XRayResult.Ok();
}
///
/// TXI 开启
///
public override XRayResult TxiOn()
{
_logger.Info("[Simulated] TXI 已开启");
return XRayResult.Ok();
}
///
/// TXI 关闭
///
public override XRayResult TxiOff()
{
_logger.Info("[Simulated] TXI 已关闭");
return XRayResult.Ok();
}
///
/// 暖机设置
///
public override XRayResult WarmUp()
{
_logger.Info("[Simulated] 暖机完成");
return XRayResult.Ok();
}
///
/// 训机设置
///
public override XRayResult Training()
{
_logger.Info("[Simulated] 训机完成");
return XRayResult.Ok();
}
///
/// 灯丝校准
///
public override XRayResult FilamentCalibration()
{
_logger.Info("[Simulated] 灯丝校准完成");
return XRayResult.Ok();
}
///
/// 全部电压自动定心
///
public override XRayResult AutoCenter()
{
_logger.Info("[Simulated] 自动定心完成");
return XRayResult.Ok();
}
///
/// 设置功率模式
///
public override XRayResult SetPowerMode(int mode)
{
_logger.Info("[Simulated] 设置功率模式: {Mode}", mode);
return XRayResult.Ok();
}
///
/// 完全关闭设备,重置所有状态
///
public override XRayResult CloseOff()
{
_isOn = false;
_isConnected = false;
_isInitialized = false;
_logger.Info("[Simulated] 射线源已完全关闭");
return XRayResult.Ok();
}
#endregion
}
}