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