using System;
using XP.Common.Logging.Interfaces;
using XP.Hardware.RaySource.Abstractions;
namespace XP.Hardware.RaySource.Implementations
{
///
/// Comet 225kV 射线源适配器
/// 通过 CometIpcClient 和 CometHostManager 实现进程外隔离的 PVI 通信
/// 所有操作委托给 CometIpcClient,Host 进程生命周期由 CometHostManager 管理
///
public class Comet225RaySource : XRaySourceBase
{
#region 依赖注入字段
private readonly CometHostManager _hostManager;
private readonly CometIpcClient _ipcClient;
private readonly ILoggerService _logger;
#endregion
#region 构造函数
///
/// 构造函数,注入依赖
///
/// Host 进程生命周期管理器
/// IPC 客户端,负责与 Host 进程通信
/// 日志服务
public Comet225RaySource(
CometHostManager hostManager,
CometIpcClient ipcClient,
ILoggerService loggerService)
{
_hostManager = hostManager ?? throw new ArgumentNullException(nameof(hostManager));
_ipcClient = ipcClient ?? throw new ArgumentNullException(nameof(ipcClient));
_logger = loggerService?.ForModule() ?? throw new ArgumentNullException(nameof(loggerService));
}
public override string SourceName => "Comet 225kV";
#endregion
#region IXRaySource 方法实现 - 委托给 CometIpcClient
///
/// 初始化射线源
/// 先确保 Host 进程运行,再通过 IPC 客户端初始化 PVI 连接
///
public override XRayResult Initialize()
{
_logger.Info("初始化 Comet225 射线源(IPC 模式)");
try
{
// 先确保 Host 进程运行
_hostManager.EnsureRunning();
_logger.Info("Host 进程已就绪,开始 IPC 初始化");
// 再通过 IPC 客户端初始化
var result = _ipcClient.Initialize();
if (result.Success)
{
_isInitialized = true;
}
return result;
}
catch (Exception ex)
{
_logger.Error(ex, "初始化 Comet225 射线源异常:{Message}", ex.Message);
return XRayResult.Error($"初始化异常:{ex.Message}");
}
}
///
/// 创建和连接 PVI 变量
///
public override XRayResult ConnectVariables()
{
var result = _ipcClient.ConnectVariables();
if (result.Success)
{
_isConnected = true;
}
return result;
}
///
/// 开启射线源高压
///
public override XRayResult TurnOn()
{
return _ipcClient.TurnOn();
}
///
/// 关闭射线源高压
///
public override XRayResult TurnOff()
{
return _ipcClient.TurnOff();
}
///
/// 设置电压值
///
public override XRayResult SetVoltage(float voltage)
{
return _ipcClient.SetVoltage(voltage);
}
///
/// 设置电流值
///
public override XRayResult SetCurrent(float current)
{
return _ipcClient.SetCurrent(current);
}
///
/// 设置焦点 - Comet 225kV 不支持
///
public override XRayResult SetFocus(float focus)
{
return _ipcClient.SetFocus(focus);
}
///
/// 读取当前电压反馈值
///
public override XRayResult ReadVoltage()
{
return _ipcClient.ReadVoltage();
}
///
/// 读取当前电流反馈值
///
public override XRayResult ReadCurrent()
{
return _ipcClient.ReadCurrent();
}
///
/// 读取系统状态
///
public override XRayResult ReadSystemStatus()
{
return _ipcClient.ReadSystemStatus();
}
///
/// 检查错误状态
///
public override XRayResult CheckErrors()
{
return _ipcClient.CheckErrors();
}
///
/// TXI 开启
///
public override XRayResult TxiOn()
{
return _ipcClient.TxiOn();
}
///
/// TXI 关闭
///
public override XRayResult TxiOff()
{
return _ipcClient.TxiOff();
}
///
/// 暖机设置
///
public override XRayResult WarmUp()
{
return _ipcClient.WarmUp();
}
///
/// 训机设置
///
public override XRayResult Training()
{
return _ipcClient.Training();
}
///
/// 灯丝校准
///
public override XRayResult FilamentCalibration()
{
return _ipcClient.FilamentCalibration();
}
///
/// 全部电压自动定心
///
public override XRayResult AutoCenter()
{
return _ipcClient.AutoCenter();
}
///
/// 设置功率模式
///
public override XRayResult SetPowerMode(int mode)
{
return _ipcClient.SetPowerMode(mode);
}
///
/// 关闭射线源,释放 IPC 连接并关闭 Host 进程
///
public override XRayResult CloseOff()
{
_logger.Info("执行 CloseOff 操作(IPC 模式)");
try
{
// 先通过 IPC 客户端发送断开命令
var result = _ipcClient.CloseOff();
// 再关闭 Host 进程
_hostManager.Shutdown();
_isInitialized = false;
_isConnected = false;
_logger.Info("CloseOff 操作完成");
return result;
}
catch (Exception ex)
{
_logger.Warn("CloseOff 过程中发生异常:{Message}", ex.Message);
_isInitialized = false;
_isConnected = false;
return XRayResult.Error($"CloseOff 异常:{ex.Message}");
}
}
#endregion
#region 资源释放
///
/// 释放资源,清理 IPC 客户端和 Host 进程管理器
///
protected override void Dispose(bool disposing)
{
if (!_isDisposed && disposing)
{
_ipcClient?.Dispose();
_hostManager?.Dispose();
}
base.Dispose(disposing);
}
#endregion
}
}