将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,199 @@
using Prism.Events;
using System;
using System.Threading;
using System.Threading.Tasks;
using XP.Hardware.Detector.Abstractions;
using XP.Hardware.Detector.Abstractions.Enums;
using XP.Hardware.Detector.Config;
namespace XP.Hardware.Detector.Implementations
{
/// <summary>
/// iRay 探测器实现 | iRay detector implementation
/// 继承抽象基类,实现 iRay 专属接口 | Inherits abstract base class, implements iRay specific interface
/// 注意:iRay 探测器实现待后续完成,当前为占位符 | Note: iRay detector implementation to be completed later, currently placeholder
/// </summary>
public class IRayDetector : AreaDetectorBase, IIRayDetector
{
private readonly IRayDetectorConfig _config;
private AcquisitionMode _acquisitionMode;
private double _gain;
/// <summary>
/// 探测器类型 | Detector type
/// </summary>
public override DetectorType Type => DetectorType.IRay;
/// <summary>
/// 构造函数 | Constructor
/// </summary>
/// <param name="config">iRay 探测器配置 | iRay detector configuration</param>
/// <param name="eventAggregator">事件聚合器 | Event aggregator</param>
public IRayDetector(IRayDetectorConfig config, IEventAggregator eventAggregator)
: base(eventAggregator)
{
_config = config ?? throw new ArgumentNullException(nameof(config));
_acquisitionMode = config.AcquisitionMode;
_gain = config.DefaultGain;
}
#region IAreaDetector | IAreaDetector abstract method implementations
/// <summary>
/// 初始化探测器(内部实现)| Initialize detector (internal implementation)
/// </summary>
protected override Task<DetectorResult> InitializeInternalAsync(CancellationToken cancellationToken)
{
// TODO: 实现 iRay 探测器初始化逻辑 | Implement iRay detector initialization logic
throw new NotImplementedException("iRay 探测器初始化尚未实现 | iRay detector initialization not implemented yet");
}
/// <summary>
/// 启动连续采集(内部实现)| Start continuous acquisition (internal implementation)
/// </summary>
protected override Task<DetectorResult> StartAcquisitionInternalAsync(CancellationToken cancellationToken)
{
// TODO: 实现 iRay 探测器启动采集逻辑 | Implement iRay detector start acquisition logic
throw new NotImplementedException("iRay 探测器启动采集尚未实现 | iRay detector start acquisition not implemented yet");
}
/// <summary>
/// 停止采集(内部实现)| Stop acquisition (internal implementation)
/// </summary>
protected override Task<DetectorResult> StopAcquisitionInternalAsync(CancellationToken cancellationToken)
{
// TODO: 实现 iRay 探测器停止采集逻辑 | Implement iRay detector stop acquisition logic
throw new NotImplementedException("iRay 探测器停止采集尚未实现 | iRay detector stop acquisition not implemented yet");
}
/// <summary>
/// 单帧采集(内部实现)| Single frame acquisition (internal implementation)
/// </summary>
protected override Task<DetectorResult> AcquireSingleFrameInternalAsync(CancellationToken cancellationToken)
{
// TODO: 实现 iRay 探测器单帧采集逻辑 | Implement iRay detector single frame acquisition logic
throw new NotImplementedException("iRay 探测器单帧采集尚未实现 | iRay detector single frame acquisition not implemented yet");
}
/// <summary>
/// 暗场校正(内部实现)| Dark field correction (internal implementation)
/// </summary>
protected override Task<DetectorResult> DarkCorrectionInternalAsync(int frameCount, CancellationToken cancellationToken)
{
// TODO: 实现 iRay 探测器暗场校正逻辑 | Implement iRay detector dark correction logic
throw new NotImplementedException("iRay 探测器暗场校正尚未实现 | iRay detector dark correction not implemented yet");
}
/// <summary>
/// 增益校正(内部实现)| Gain correction (internal implementation)
/// </summary>
protected override Task<DetectorResult> GainCorrectionInternalAsync(int frameCount, CancellationToken cancellationToken)
{
// TODO: 实现 iRay 探测器增益校正逻辑 | Implement iRay detector gain correction logic
throw new NotImplementedException("iRay 探测器增益校正尚未实现 | iRay detector gain correction not implemented yet");
}
/// <summary>
/// 自动校正(内部实现)| Auto correction (internal implementation)
/// </summary>
protected override Task<DetectorResult> AutoCorrectionInternalAsync(int frameCount, CancellationToken cancellationToken)
{
// TODO: 实现 iRay 探测器自动校正逻辑 | Implement iRay detector auto correction logic
throw new NotImplementedException("iRay 探测器自动校正尚未实现 | iRay detector auto correction not implemented yet");
}
/// <summary>
/// 坏像素校正(内部实现)| Bad pixel correction (internal implementation)
/// </summary>
protected override Task<DetectorResult> BadPixelCorrectionInternalAsync(CancellationToken cancellationToken)
{
// TODO: 实现 iRay 探测器坏像素校正逻辑 | Implement iRay detector bad pixel correction logic
throw new NotImplementedException("iRay 探测器坏像素校正尚未实现 | iRay detector bad pixel correction not implemented yet");
}
/// <summary>
/// 获取探测器信息 | Get detector information
/// </summary>
public override DetectorInfo GetInfo()
{
// TODO: 实现 iRay 探测器信息查询逻辑 | Implement iRay detector info query logic
return new DetectorInfo
{
Type = DetectorType.IRay,
Model = "iRay (待实现 | To be implemented)",
SerialNumber = "N/A",
FirmwareVersion = "N/A",
MaxWidth = 0,
MaxHeight = 0,
PixelSize = 0.0,
BitDepth = 16
};
}
#endregion
#region IIRayDetector | IIRayDetector interface implementations
/// <summary>
/// 设置采集模式 | Set acquisition mode
/// </summary>
public Task<DetectorResult> SetAcquisitionModeAsync(AcquisitionMode mode)
{
// TODO: 实现 iRay 探测器设置采集模式逻辑 | Implement iRay detector set acquisition mode logic
_acquisitionMode = mode;
return Task.FromResult(DetectorResult.Success($"采集模式已设置为 {mode}(占位符实现)| Acquisition mode set to {mode} (placeholder implementation)"));
}
/// <summary>
/// 获取采集模式 | Get acquisition mode
/// </summary>
public AcquisitionMode GetAcquisitionMode()
{
return _acquisitionMode;
}
/// <summary>
/// 设置增益值 | Set gain value
/// </summary>
public Task<DetectorResult> SetGainAsync(double gain)
{
// TODO: 实现 iRay 探测器设置增益逻辑 | Implement iRay detector set gain logic
_gain = gain;
return Task.FromResult(DetectorResult.Success($"增益已设置为 {gain}(占位符实现)| Gain set to {gain} (placeholder implementation)"));
}
/// <summary>
/// 获取增益值 | Get gain value
/// </summary>
public double GetGain()
{
return _gain;
}
#endregion
#region | Resource disposal
/// <summary>
/// 释放资源 | Dispose resources
/// </summary>
protected override void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
// TODO: 释放 iRay 探测器托管资源 | Release iRay detector managed resources
}
// TODO: 释放 iRay 探测器非托管资源 | Release iRay detector unmanaged resources
_disposed = true;
}
base.Dispose(disposing);
}
#endregion
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,289 @@
using System;
using System.Runtime.InteropServices;
namespace XP.Hardware.Detector.Implementations
{
/// <summary>
/// XISL API 互操作层 | XISL API interop layer
/// 封装 Varex 探测器的 xisl.dll 原厂 API
/// </summary>
public static class XISLApi
{
#region | Enum Definitions
/// <summary>
/// XISL API 返回码 | XISL API return codes
/// </summary>
public enum HIS_RETURN
{
HIS_ALL_OK = 0,
HIS_Init = -1,
HIS_ERROR_MEMORY = 1,
HIS_ERROR_BOARDINIT = 2,
HIS_ERROR_NOBOARD = 3,
HIS_ERROR_NOCAMERA = 4,
HIS_ERROR_TIMEOUT = 5,
HIS_ERROR_INVALIDPARAM = 6,
HIS_ERROR_ABORT = 7
}
#endregion
#region | Constant Definitions
/// <summary>
/// 连续采集模式 | Continuous acquisition mode
/// </summary>
public const int HIS_SEQ_CONTINUOUS = 0x100;
/// <summary>
/// 单帧采集模式(单缓冲区)| Single frame mode (one buffer)
/// </summary>
public const int HIS_SEQ_ONE_BUFFER = 0x2;
/// <summary>
/// 采集数据标志:连续采集 | Acquisition data flag: continuous
/// </summary>
public const uint ACQ_CONT = 1;
/// <summary>
/// 采集数据标志:暗场校正 | Acquisition data flag: offset correction
/// </summary>
public const uint ACQ_OFFSET = 2;
/// <summary>
/// 采集数据标志:增益校正 | Acquisition data flag: gain correction
/// </summary>
public const uint ACQ_GAIN = 4;
/// <summary>
/// 采集数据标志:单帧采集 | Acquisition data flag: snap (single frame)
/// </summary>
public const uint ACQ_SNAP = 8;
/// <summary>
/// 等待对象信号 | Wait object signaled
/// </summary>
public const uint WAIT_OBJECT_0 = 0x00000000;
/// <summary>
/// 无限等待 | Infinite wait
/// </summary>
public const uint INFINITE = 0xFFFFFFFF;
/// <summary>
/// 内部定时器同步模式 | Internal timer sync mode
/// </summary>
public const int HIS_SYNCMODE_INTERNAL_TIMER = 2;
#endregion
#region | Callback Delegates
/// <summary>
/// 帧结束回调函数委托 | End frame callback delegate
/// </summary>
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void EndFrameCallback(IntPtr hAcqDesc);
/// <summary>
/// 采集结束回调函数委托 | End acquisition callback delegate
/// </summary>
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate void EndAcqCallback(IntPtr hAcqDesc);
#endregion
#region Win32 API | Win32 API
/// <summary>
/// 创建事件对象 | Create event object
/// </summary>
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr CreateEvent(IntPtr lpEventAttributes, bool bManualReset, bool bInitialState, string lpName);
/// <summary>
/// 设置事件信号 | Set event signal
/// </summary>
[DllImport("kernel32.dll")]
public static extern bool SetEvent(IntPtr hEvent);
/// <summary>
/// 等待单个对象 | Wait for single object
/// </summary>
[DllImport("kernel32.dll", SetLastError = true)]
public static extern uint WaitForSingleObject(IntPtr hHandle, uint dwMilliseconds);
/// <summary>
/// 关闭句柄 | Close handle
/// </summary>
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool CloseHandle(IntPtr hObject);
#endregion
#region XISL API - | XISL API - Basic Functions
/// <summary>
/// 获取下一个探测器传感器 | Get next sensor
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_GetNextSensor", CallingConvention = CallingConvention.StdCall)]
public static extern HIS_RETURN Acquisition_GetNextSensor(ref IntPtr pAcqDesc, ref IntPtr hWnd);
/// <summary>
/// 获取探测器配置信息 | Get detector configuration
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_GetConfiguration", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_GetConfiguration(
IntPtr hAcqDesc, out uint dwFrames, out uint dwRows, out uint dwColumns,
out uint dwDataType, out uint dwSortFlags, out int iIRQFlags,
out uint dwAcqType, out uint dwSystemID, out uint dwSyncMode, out uint dwHwAccess);
/// <summary>
/// 获取采集数据指针 | Get acquisition data pointer
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_GetAcqData", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_GetAcqData(IntPtr hAcqDesc, out IntPtr vpAcqData);
/// <summary>
/// 设置采集数据标志 | Set acquisition data flags
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_SetAcqData", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_SetAcqData(IntPtr hAcqDesc, ref uint dwAcqData);
/// <summary>
/// 定义目标缓冲区 | Define destination buffers
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_DefineDestBuffers", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_DefineDestBuffers(IntPtr hAcqDesc, IntPtr pBuffer, int iFrames, uint dwRows, uint dwColumns);
/// <summary>
/// 设置回调函数和消息 | Set callbacks and messages
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_SetCallbacksAndMessages", CallingConvention = CallingConvention.StdCall)]
public static extern HIS_RETURN Acquisition_SetCallbacksAndMessages(
IntPtr pAcqDesc,
IntPtr hWnd,
uint dwErrorMsg,
uint dwLoosingFramesMsg,
EndFrameCallback lpfnEndFrameCallback,
EndAcqCallback lpfnEndAcqCallback);
/// <summary>
/// 关闭所有连接 | Close all connections
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_CloseAll", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_CloseAll();
#endregion
#region XISL API - | XISL API - Parameter Settings
/// <summary>
/// 设置 Binning 模式 | Set binning mode
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_SetCameraBinningMode", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_SetCameraBinningMode(IntPtr hAcqDesc, uint wMode);
/// <summary>
/// 设置增益模式 | Set gain mode
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_SetCameraGain", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_SetCameraGain(IntPtr hAcqDesc, uint wMode);
/// <summary>
/// 设置定时器同步(曝光时间)| Set timer sync (exposure time)
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_SetTimerSync", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_SetTimerSync(IntPtr hAcqDesc, ref uint wMode);
/// <summary>
/// 设置帧同步模式 | Set frame sync mode
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_SetFrameSyncMode", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_SetFrameSyncMode(IntPtr hAcqDesc, uint dwMode);
/// <summary>
/// 设置相机触发模式 | Set camera trigger mode
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_SetCameraTriggerMode", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_SetCameraTriggerMode(IntPtr hAcqDesc, uint dwMode);
#endregion
#region XISL API - | XISL API - Image Acquisition
/// <summary>
/// 采集图像 | Acquire image
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_Acquire_Image", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_Acquire_Image(
IntPtr hAcqDesc,
uint dwFrames,
uint dwSkipFrms,
uint dwOpt,
IntPtr pwOffsetData,
IntPtr pdwGainData,
IntPtr pdwPxlCorrList);
/// <summary>
/// 停止采集 | Abort acquisition
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_Abort", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_Abort(IntPtr hAcqDesc);
/// <summary>
/// 获取当前帧号 | Get current frame number
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_GetActFrame", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_GetActFrame(IntPtr hAcqDesc, out uint dwActFrame, out uint dwSecFrame);
#endregion
#region XISL API - | XISL API - Correction Functions
/// <summary>
/// 采集暗场图像 | Acquire offset image
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_Acquire_OffsetImage", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_Acquire_OffsetImage(IntPtr hAcqDesc, IntPtr pOffsetData, uint nRows, uint nCols, uint nFrames);
/// <summary>
/// 采集增益图像 | Acquire gain image
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_Acquire_GainImage", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_Acquire_GainImage(IntPtr hAcqDesc, IntPtr pOffsetData, IntPtr pGainData, uint nRows, uint nCols, uint nFrames);
/// <summary>
/// 创建增益映射 | Create gain map
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_CreateGainMap", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_CreateGainMap(IntPtr pGainData, IntPtr pGainAVG, int nCount, int nFrame);
/// <summary>
/// 创建坏像素列表 | Create pixel map
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_CreatePixelMap", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_CreatePixelMap(IntPtr pData, int nDataRows, int nDataColumns, IntPtr pCorrList, ref int nCorrListSize);
/// <summary>
/// 重置板载选项 | Reset onboard options
/// </summary>
[DllImport("xisl.dll", EntryPoint = "Acquisition_Reset_OnboardOptions", CallingConvention = CallingConvention.Cdecl)]
public static extern HIS_RETURN Acquisition_Reset_OnboardOptions(IntPtr hAcqDesc);
#endregion
#region VarexDetDll API - Varex | VarexDetDll API - Varex Detector Initialization
/// <summary>
/// 探测器底层初始化 | Detector low-level initialization
/// 由 VarexDetDll.dll 提供,内部完成枚举、连接等底层操作
/// 返回 0 表示成功 | Returns 0 on success
/// </summary>
[DllImport("VarexDetDll.dll", EntryPoint = "DoDetInit", CallingConvention = CallingConvention.StdCall)]
public static extern int DoDetInit(ref IntPtr hAcqDesc);
#endregion
}
}