Files

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