将Feature/XP.Common和Feature/XP.Hardware分支合并至Develop/XP.forHardwareAndCommon,完善XPapp注册和相关硬件类库通用类库功能。

This commit is contained in:
QI Mingxuan
2026-04-16 17:31:13 +08:00
parent 6ec4c3ddaa
commit 2bd6e566c3
581 changed files with 74600 additions and 222 deletions
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<!-- 探测器配置 | Detector Configuration -->
<!-- 探测器类型 | Detector Type -->
<!-- 可选值: Varex, IRay, Hamamatsu | Available values: Varex, IRay, Hamamatsu -->
<add key="Detector:Type" value="Varex" />
<!-- 通用配置 | Common Configuration -->
<add key="Detector:IP" value="192.168.1.200" />
<add key="Detector:Port" value="5000" />
<add key="Detector:SavePath" value="C:\DetectorImages" />
<add key="Detector:AutoSave" value="true" />
<!-- Varex 探测器专属配置 | Varex Detector Specific Configuration -->
<!-- Binning 模式: Bin1x1, Bin2x2, Bin4x4 | Binning mode: Bin1x1, Bin2x2, Bin4x4 -->
<add key="Detector:Varex:BinningMode" value="Bin1x1" />
<!-- 增益模式: Low, High | Gain mode: Low, High -->
<add key="Detector:Varex:GainMode" value="High" />
<!-- 曝光时间(毫秒)| Exposure time (milliseconds) -->
<add key="Detector:Varex:ExposureTime" value="100" />
<!-- ROI 区域 | ROI Region -->
<add key="Detector:Varex:ROI_X" value="0" />
<add key="Detector:Varex:ROI_Y" value="0" />
<add key="Detector:Varex:ROI_Width" value="2880" />
<add key="Detector:Varex:ROI_Height" value="2880" />
<!-- iRay 探测器专属配置 | iRay Detector Specific Configuration -->
<!-- 采集模式: Continuous, SingleFrame | Acquisition mode: Continuous, SingleFrame -->
<add key="Detector:IRay:AcquisitionMode" value="Continuous" />
<!-- 默认增益值 | Default gain value -->
<add key="Detector:IRay:DefaultGain" value="1.0" />
<!-- 校正配置 | Correction Configuration -->
<add key="Detector:Correction:DarkFrameCount" value="10" />
<add key="Detector:Correction:GainFrameCount" value="10" />
<add key="Detector:Correction:SaveCorrectionData" value="true" />
<!-- 操作超时配置 | Operation Timeout Configuration -->
<add key="Detector:InitializationTimeout" value="30000" />
<add key="Detector:AcquisitionTimeout" value="10000" />
<add key="Detector:CorrectionTimeout" value="60000" />
</appSettings>
</configuration>
File diff suppressed because it is too large Load Diff
+356
View File
@@ -0,0 +1,356 @@
# XP.Hardware.Detector
工业探测器控制模块 | Industrial Detector Control Module
---
## 项目概述 | Project Overview
XP.Hardware.Detector 是 XplorePlane X 射线检测系统的探测器控制模块,负责与工业 X 射线探测器进行通讯和控制。该模块采用策略模式和工厂模式设计,支持多种探测器型号的统一管理,提供完整的图像采集和校正功能。
### 主要特性 | Key Features
- 支持多种探测器型号(Varex、iRay、Hamamatsu 等)
- 完整的探测器生命周期管理(初始化、采集、校正)
- 单帧和连续采集模式
- 自动校正功能(暗场、增益、坏像素)
- 实时状态监控
- 基于 Prism 事件聚合器的松耦合跨模块通讯
- 异步操作,不阻塞 UI 线程
- 完整的日志记录和异常处理
---
## 框架架构 | Architecture
```
XP.Hardware.Detector/
├── Abstractions/ # 抽象层 | Abstraction Layer
│ ├── IAreaDetector.cs # 面阵探测器接口
│ ├── AreaDetectorBase.cs # 抽象基类
│ ├── DetectorResult.cs # 结果封装类
│ ├── DetectorInfo.cs # 探测器信息
│ ├── Enums/ # 枚举定义
│ │ ├── DetectorStatus.cs
│ │ └── DetectorType.cs
│ └── Events/ # Prism 事件定义
│ ├── ImageCapturedEvent.cs
│ └── CorrectionCompletedEvent.cs
├── Implementations/ # 实现层 | Implementation Layer
│ ├── VarexDetector.cs # Varex 探测器实现
│ └── IRayDetector.cs # iRay 探测器实现
├── Factories/ # 工厂层 | Factory Layer
│ ├── IDetectorFactory.cs # 工厂接口
│ └── DetectorFactory.cs # 探测器工厂
├── Services/ # 业务服务层 | Service Layer
│ ├── IDetectorService.cs # 服务接口
│ └── DetectorService.cs # 服务实现(单例)
├── Config/ # 配置层 | Configuration Layer
│ ├── DetectorConfig.cs # 配置实体
│ ├── VarexDetectorConfig.cs
│ ├── IRayDetectorConfig.cs
│ └── ConfigLoader.cs # 配置加载器
├── Module/ # Prism 模块 | Prism Module
│ └── DetectorModule.cs # 模块注册
├── ViewModels/ # 视图模型 | View Models
└── Views/ # WPF 视图 | WPF Views
```
### 设计模式 | Design Patterns
- **策略模式**`IAreaDetector` 接口定义统一操作,支持多种设备实现
- **工厂模式**`IDetectorFactory` 根据设备类型动态创建实例
- **模板方法模式**`AreaDetectorBase` 提供基础实现框架
- **单例模式**`IDetectorService` 作为全局单例管理设备状态
- **依赖注入**:通过 Prism 容器管理服务生命周期
- **事件聚合器**:使用 Prism `IEventAggregator` 实现松耦合通讯
- **异步模式**:所有 I/O 操作采用 async/await
---
## 核心功能 | Core Features
### 1. 探测器初始化 | Detector Initialization
```csharp
// 初始化探测器
DetectorResult result = await _detectorService.InitializeAsync();
if (result.IsSuccess)
{
// 获取探测器信息
DetectorInfo info = _detectorService.GetInfo();
Console.WriteLine($"型号: {info.Model}, 分辨率: {info.MaxWidth}x{info.MaxHeight}");
}
```
### 2. 图像采集 | Image Acquisition
```csharp
// 单帧采集
await _detectorService.AcquireSingleFrameAsync();
// 启动连续采集
await _detectorService.StartAcquisitionAsync();
// 停止采集
await _detectorService.StopAcquisitionAsync();
```
### 3. 自动校正 | Auto Correction
```csharp
// 执行自动校正(暗场+增益+坏像素)
await _detectorService.AutoCorrectionAsync(frameCount: 10);
```
### 4. 状态监控 | Status Monitoring
```csharp
// 检查探测器状态
DetectorStatus status = _detectorService.Status;
// 获取错误信息
DetectorResult error = _detectorService.GetLastError();
```
### 5. 事件通讯 | Event Communication
```csharp
// 订阅图像采集事件
_eventAggregator.GetEvent<ImageCapturedEvent>()
.Subscribe(OnImageCaptured, ThreadOption.UIThread);
// 订阅校正完成事件
_eventAggregator.GetEvent<CorrectionCompletedEvent>()
.Subscribe(OnCorrectionCompleted, ThreadOption.UIThread);
```
---
## 技术要求 | Technical Requirements
### 运行环境 | Runtime Environment
- **.NET 8.0** (net8.0-windows7.0)
- **Windows 操作系统**WPF 依赖)
- **Visual Studio 2022** 或更高版本
### 核心依赖 | Core Dependencies
| 依赖库 | 版本 | 用途 |
|--------|------|------|
| **Prism.Wpf** | 9.0.537 | MVVM 框架和依赖注入 |
| **Serilog** | - | 结构化日志记录 |
| **System.Configuration.ConfigurationManager** | - | 配置文件管理 |
| **探测器 SDK** | - | 厂商提供的探测器驱动库 |
### 硬件要求 | Hardware Requirements
- 支持的探测器型号:
- Varex(当前支持)
- iRay(预留)
- Hamamatsu(预留)
- 网络连接:TCP/IP 或 USB
- 探测器驱动和 SDK
---
## 快速开始 | Quick Start
### 1. 配置文件设置
`App.config` 中添加:
```xml
<appSettings>
<!-- 探测器类型 -->
<add key="Detector:Type" value="Varex" />
<!-- 网络配置 -->
<add key="Detector:IP" value="192.168.1.200" />
<add key="Detector:Port" value="50000" />
<!-- 图像存储配置 -->
<add key="Detector:SavePath" value="D:\Images" />
<add key="Detector:AutoSave" value="true" />
</appSettings>
```
### 2. 注册模块
`App.xaml.cs` 中:
```csharp
protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
{
moduleCatalog.AddModule<DetectorModule>();
}
```
### 3. 使用服务
在 ViewModel 中注入并使用:
```csharp
public class YourViewModel : BindableBase
{
private readonly IDetectorService _detectorService;
private readonly IEventAggregator _eventAggregator;
public YourViewModel(
IDetectorService detectorService,
IEventAggregator eventAggregator)
{
_detectorService = detectorService;
_eventAggregator = eventAggregator;
SubscribeEvents();
}
public async Task InitializeAsync()
{
DetectorResult result = await _detectorService.InitializeAsync();
if (result.IsSuccess)
{
// 初始化成功
}
}
}
```
---
## 配置参数说明 | Configuration Parameters
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| Type | string | Varex | 探测器类型 |
| IP | string | 192.168.1.200 | 探测器 IP 地址 |
| Port | int | 50000 | 探测器端口号 |
| SavePath | string | D:\Images | 图像存储路径 |
| AutoSave | bool | true | 是否自动保存图像 |
---
## 探测器状态 | Detector Status
```csharp
public enum DetectorStatus
{
Uninitialized = 0, // 未初始化
Initializing = 1, // 初始化中
Ready = 2, // 就绪
Acquiring = 3, // 采集中
Correcting = 4, // 校正中
Error = 5 // 错误
}
```
---
## 异常处理 | Exception Handling
所有操作返回 `DetectorResult` 对象:
```csharp
DetectorResult result = await _detectorService.AcquireSingleFrameAsync();
if (result.IsSuccess)
{
// 操作成功
}
else
{
// 操作失败
string error = result.ErrorMessage;
int errorCode = result.ErrorCode;
Exception exception = result.Exception;
_logger.Error(exception, $"操作失败: {error}, 错误码: {errorCode}");
}
```
---
## 日志记录 | Logging
模块使用 Serilog 进行结构化日志记录:
- **Debug**:详细的调试信息(帧采集、状态变化等)
- **Info**:一般信息(初始化成功、采集开始等)
- **Warn**:警告信息(状态异常、参数警告等)
- **Error**:错误信息(操作失败、通讯异常等)
- **Fatal**:致命错误(系统崩溃等)
---
## 资源释放 | Resource Disposal
在应用退出时探测器会自动停止采集并释放资源:
```csharp
protected override void OnExit(ExitEventArgs e)
{
var detectorService = Container.Resolve<IDetectorService>();
// 服务会自动释放资源
base.OnExit(e);
}
```
---
## 扩展性 | Extensibility
### 添加新的探测器设备
1.`Implementations/` 创建新类继承 `AreaDetectorBase`
2. 实现所有抽象方法
3.`DetectorFactory.CreateDetector()` 添加新类型分支
4. 在配置文件中添加设备配置
```csharp
public class NewDetector : AreaDetectorBase
{
public override async Task<DetectorResult> InitializeAsync(CancellationToken cancellationToken = default)
{
// 实现初始化逻辑
}
// 实现其他抽象方法...
}
```
---
## 文档索引 | Documentation Index
- **[GUIDENCE.md](./GUIDENCE.md)** - 详细使用指南,包含完整代码示例
- **[README.md](./README.md)** - 本文档,项目概述和快速参考
- **[App.config.example](./App.config.example)** - 配置文件示例
---
## 故障排查 | Troubleshooting
### 初始化失败
- 检查探测器 IP 地址和端口配置
- 确认探测器网络连接正常
- 验证探测器驱动已正确安装
### 采集失败
- 确认已成功初始化
- 检查探测器状态是否为 `Ready`
- 执行自动校正
### 校正失败
- 确认探测器状态为 `Ready`
- 增益校正前确保射线源已开启
- 增加采集帧数(建议 10 帧以上)
详细故障排查请参考 [GUIDENCE.md](./GUIDENCE.md) 第 13 节。
---
**最后更新 | Last Updated**: 2026-03-11