添加 MX-PD-盘古 项目文件

将 MX-PD-盘古 - new 目录下的所有文件添加到主仓库
This commit is contained in:
Shi.Ji
2026-05-18 11:43:09 +08:00
parent 03632a379d
commit e31d3560bb
739 changed files with 99783 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
namespace MainShell.Vision
{
/// <summary>
/// 图像采集模式
/// </summary>
public enum CameraCaptureMode
{
/// <summary>
/// 从连续流中取图相机持续采图从内部缓冲区取最新一帧SnapImage
/// </summary>
Stream,
/// <summary>
/// 软触发单帧采集发出软触发命令后等待相机响应帧ExcuteSoftTrigger
/// </summary>
SoftTrigger,
}
}

View File

@@ -0,0 +1,68 @@
using MwFramework.Device;
namespace MainShell.Vision
{
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼѡ<CDBC>
/// <20>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>ץ<EFBFBD><D7A5>״̬<D7B4><CCAC>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽӦ<CABD><D3A6><EFBFBD>ϲ<EFBFBD><CFB2>ڲ<EFBFBD>ͼǰ<CDBC><C7B0><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>
/// </summary>
public class CameraCaptureOptions
{
public static CameraCaptureOptions CreateSoftTrigger(int timeoutMilliseconds = 5000)
{
CameraCaptureOptions options = new CameraCaptureOptions();
options.CaptureMode = CameraCaptureMode.SoftTrigger;
options.TimeoutMilliseconds = timeoutMilliseconds;
return options;
}
public static CameraCaptureOptions CreateStream(int timeoutMilliseconds = 5000)
{
CameraCaptureOptions options = new CameraCaptureOptions();
options.CaptureMode = CameraCaptureMode.Stream;
options.TimeoutMilliseconds = timeoutMilliseconds;
return options;
}
public CameraCaptureOptions()
{
CaptureMode = CameraCaptureMode.Stream;
TimeoutMilliseconds = 5000;
AutoStartGrabbing = false;
TriggerMode = null;
TriggerSource = null;
TriggerDelay = null;
}
/// <summary>
/// <20>ɼ<EFBFBD><C9BC><EFBFBD>ʽ<EFBFBD><CABD>
/// </summary>
public CameraCaptureMode CaptureMode { get; set; }
/// <summary>
/// <20><>ʱʱ<CAB1><EFBFBD><E4A3A8><EFBFBD><EFBFBD><EBA3A9>
/// </summary>
public int TimeoutMilliseconds { get; set; }
/// <summary>
/// <20><><EFBFBD>ݾɵ<DDBE><C9B5>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD>ֶΡ<D6B6><CEA1><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD><D9B8>ݸ<EFBFBD>ֵ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ץ<EFBFBD><D7A5><EFBFBD><EFBFBD>
/// </summary>
public bool AutoStartGrabbing { get; set; }
/// <summary>
/// <20><><EFBFBD>ݾɵ<DDBE><C9B5>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD>ֶΡ<D6B6><CEA1><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD><D9B8>ݸ<EFBFBD>ֵ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>ģʽ<C4A3><CABD>
/// </summary>
public CameraTriggerMode? TriggerMode { get; set; }
/// <summary>
/// <20><><EFBFBD>ݾɵ<DDBE><C9B5>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD>ֶΡ<D6B6><CEA1><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD><D9B8>ݸ<EFBFBD>ֵ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD>Դ<EFBFBD><D4B4>
/// </summary>
public CameraTriggerSource? TriggerSource { get; set; }
/// <summary>
/// <20><><EFBFBD>ݾɵ<DDBE><C9B5>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD>ֶΡ<D6B6><CEA1><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD><D9B8>ݸ<EFBFBD>ֵ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
/// </summary>
public double? TriggerDelay { get; set; }
}
}

View File

@@ -0,0 +1,30 @@
using MainShell.Common;
using System.Threading;
using System.Threading.Tasks;
using AppCameraType = MainShell.Common.CameraType;
namespace MainShell.Vision
{
/// <summary>
/// ͼ<><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڡ<D3BF>
/// </summary>
public interface IImageCaptureService
{
/// <summary>
/// <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ򻯲<CDBC><F2BBAFB2><EFBFBD><EFBFBD>ɼ<EFBFBD>һ֡ͼ<D6A1><CDBC><EFBFBD><EFBFBD>
/// </summary>
Task<ImageCaptureResult> CaptureAsync(
AppCameraType source,
int timeoutMilliseconds,
CameraCaptureMode captureMode = CameraCaptureMode.Stream,
CancellationToken cancellationToken = default(CancellationToken));
/// <summary>
/// <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD>һ֡ͼ<D6A1><CDBC><EFBFBD><EFBFBD>
/// </summary>
Task<ImageCaptureResult> CaptureAsync(
AppCameraType source,
CameraCaptureOptions options,
CancellationToken cancellationToken = default(CancellationToken));
}
}

View File

@@ -0,0 +1,119 @@
using MainShell.Common;
using MainShell.Models;
using System;
using AppCameraType = MainShell.Common.CameraType;
namespace MainShell.Vision
{
/// <summary>
/// ????????????
/// </summary>
public enum ImageCaptureStatus
{
Success = 0,
Cancelled = 1,
CameraNotFound = 2,
CameraNotOpen = 3,
CameraNotGrabbing = 4,
Timeout = 5,
NoFrame = 6,
SoftTriggerFailed = 7,
DriverError = 8,
}
/// <summary>
/// ??????????
/// </summary>
public class ImageCaptureResult
{
public ImageCaptureResult()
{
Status = ImageCaptureStatus.DriverError;
ErrorCode = VisionErrorCode.DriverError;
FailureCategory = VisionFailureCategory.Driver;
Message = string.Empty;
UserMessageKey = MessageKey.None;
}
public ImageCaptureStatus Status { get; set; }
public VisionErrorCode ErrorCode { get; set; }
public VisionFailureCategory FailureCategory { get; set; }
public int? AlarmId { get; set; }
public MessageKey UserMessageKey { get; set; }
public AppCameraType CameraSource { get; set; }
public CameraCaptureMode CaptureMode { get; set; }
public string Message { get; set; }
public Exception Exception { get; set; }
public MxImage Image { get; set; }
public bool Succeeded
{
get
{
return Status == ImageCaptureStatus.Success;
}
}
public bool IsCancelled
{
get
{
return Status == ImageCaptureStatus.Cancelled;
}
}
public static ImageCaptureResult Success(AppCameraType source, CameraCaptureMode captureMode, MxImage image)
{
return new ImageCaptureResult
{
Status = ImageCaptureStatus.Success,
ErrorCode = VisionErrorCode.None,
FailureCategory = VisionFailureCategory.None,
AlarmId = null,
UserMessageKey = MessageKey.None,
CameraSource = source,
CaptureMode = captureMode,
Image = image,
Message = string.Format(
"ImageCaptureService: capture succeeded from '{0}' with mode '{1}'.",
source,
captureMode),
};
}
public static ImageCaptureResult Failure(
ImageCaptureStatus status,
VisionErrorCode errorCode,
VisionFailureCategory failureCategory,
int? alarmId,
MessageKey userMessageKey,
AppCameraType source,
CameraCaptureMode captureMode,
string message,
Exception exception = null)
{
return new ImageCaptureResult
{
Status = status,
ErrorCode = errorCode,
FailureCategory = failureCategory,
AlarmId = alarmId,
UserMessageKey = userMessageKey,
CameraSource = source,
CaptureMode = captureMode,
Message = message,
Exception = exception,
Image = null,
};
}
}
}

View File

@@ -0,0 +1,287 @@
using MainShell.Common;
using MainShell.Hardware;
using MainShell.Log;
using MainShell.Models;
using MaxwellFramework.Core.Attributes;
using MwFramework.Device;
using MwFramework.Device.Model;
using System;
using System.Threading;
using System.Threading.Tasks;
using AppCameraType = MainShell.Common.CameraType;
namespace MainShell.Vision
{
/// <summary>
/// ???????????????? HardwareManager ??????????????????????????<3F><>???????
/// </summary>
[Singleton]
public class ImageCaptureService : IImageCaptureService
{
private readonly HardwareManager _hardwareManager;
private readonly object _upCameraCaptureLock = new object();
private readonly object _downCameraCaptureLock = new object();
private readonly object _mapCameraCaptureLock = new object();
private readonly object _upWsCameraCaptureLock = new object();
private readonly object _upWideCameraCaptureLock = new object();
public ImageCaptureService(HardwareManager hardwareManager)
{
_hardwareManager = hardwareManager ?? throw new ArgumentNullException(nameof(hardwareManager));
}
/// <summary>
/// ??????????????????????
/// </summary>
public Task<ImageCaptureResult> CaptureAsync(
AppCameraType source,
int timeoutMilliseconds,
CameraCaptureMode captureMode = CameraCaptureMode.Stream,
CancellationToken cancellationToken = default(CancellationToken))
{
CameraCaptureOptions options = new CameraCaptureOptions();
options.TimeoutMilliseconds = timeoutMilliseconds;
options.CaptureMode = captureMode;
return CaptureAsync(source, options, cancellationToken);
}
/// <summary>
/// ?????????????????
/// ????????????????????????????????????????????????????????<3F><>??
/// </summary>
public Task<ImageCaptureResult> CaptureAsync(
AppCameraType source,
CameraCaptureOptions options,
CancellationToken cancellationToken = default(CancellationToken))
{
if (options == null)
{
throw new ArgumentNullException(nameof(options));
}
int timeoutMilliseconds = options.TimeoutMilliseconds;
if (timeoutMilliseconds <= 0)
{
timeoutMilliseconds = 5000;
}
MwCamera camera = GetCamera(source);
if (camera == null)
{
string message = string.Format("ImageCaptureService: camera '{0}' not found in HardwareManager.", source);
message.LogSysError();
return Task.FromResult(ImageCaptureResult.Failure(
ImageCaptureStatus.CameraNotFound,
VisionErrorCode.CameraNotFound,
VisionFailureCategory.Capture,
VisionAlarmIds.CameraNotFound,
MessageKey.VisionCameraNotFound,
source,
options.CaptureMode,
message));
}
if (!camera.IsOpen)
{
string message = string.Format("ImageCaptureService: camera '{0}' is not open.", source);
message.LogSysError();
return Task.FromResult(ImageCaptureResult.Failure(
ImageCaptureStatus.CameraNotOpen,
VisionErrorCode.CameraNotOpen,
VisionFailureCategory.Capture,
VisionAlarmIds.CameraNotOpen,
MessageKey.VisionCameraNotOpen,
source,
options.CaptureMode,
message));
}
if (!camera.IsGrabbing)
{
string message = string.Format(
"ImageCaptureService: camera '{0}' is not grabbing. Capture mode '{1}' requires grabbing to be prepared by caller.",
source,
options.CaptureMode);
message.LogSysError();
return Task.FromResult(ImageCaptureResult.Failure(
ImageCaptureStatus.CameraNotGrabbing,
VisionErrorCode.CameraNotGrabbing,
VisionFailureCategory.Capture,
VisionAlarmIds.CameraNotGrabbing,
MessageKey.VisionCameraNotGrabbing,
source,
options.CaptureMode,
message));
}
string.Format(
"ImageCaptureService: capturing from '{0}' (mode={1}, timeout={2}ms).",
source,
options.CaptureMode,
timeoutMilliseconds).LogInfo();
object captureLock = GetCaptureLock(source);
try
{
CameraData data;
lock (captureLock)
{
cancellationToken.ThrowIfCancellationRequested();
switch (options.CaptureMode)
{
case CameraCaptureMode.SoftTrigger:
data = ExecuteSoftTriggerSync(camera, source, timeoutMilliseconds, out bool softTriggerFailed);
if (softTriggerFailed)
{
string softTriggerFailureMessage = string.Format(
"ImageCaptureService: soft trigger capture failed for camera '{0}' (timeout={1}ms).",
source,
timeoutMilliseconds);
softTriggerFailureMessage.LogSysError();
return Task.FromResult(ImageCaptureResult.Failure(
ImageCaptureStatus.SoftTriggerFailed,
VisionErrorCode.SoftTriggerFailed,
VisionFailureCategory.Driver,
VisionAlarmIds.SoftTriggerFailed,
MessageKey.VisionSoftTriggerFailed,
source,
options.CaptureMode,
softTriggerFailureMessage));
}
break;
case CameraCaptureMode.Stream:
data = camera.SnapImage(timeoutMilliseconds);
break;
default:
throw new NotSupportedException(string.Format("ImageCaptureService: capture mode '{0}' is not supported.", options.CaptureMode));
}
}
cancellationToken.ThrowIfCancellationRequested();
if (data == null)
{
string message = string.Format(
"ImageCaptureService: no frame received from '{0}' with capture mode '{1}'.",
source,
options.CaptureMode);
message.LogSysError();
ImageCaptureStatus noFrameStatus = options.CaptureMode == CameraCaptureMode.SoftTrigger
? ImageCaptureStatus.Timeout
: ImageCaptureStatus.NoFrame;
VisionErrorCode noFrameErrorCode = options.CaptureMode == CameraCaptureMode.SoftTrigger
? VisionErrorCode.CaptureTimeout
: VisionErrorCode.NoFrame;
int? noFrameAlarmId = options.CaptureMode == CameraCaptureMode.SoftTrigger
? (int?)VisionAlarmIds.CaptureTimeout
: (int?)VisionAlarmIds.NoFrame;
MessageKey noFrameMessageKey = options.CaptureMode == CameraCaptureMode.SoftTrigger
? MessageKey.VisionCaptureTimeout
: MessageKey.VisionNoFrameReturned;
return Task.FromResult(ImageCaptureResult.Failure(
noFrameStatus,
noFrameErrorCode,
VisionFailureCategory.Capture,
noFrameAlarmId,
noFrameMessageKey,
source,
options.CaptureMode,
message));
}
return Task.FromResult(ImageCaptureResult.Success(source, options.CaptureMode, new MxImage(data)));
}
catch (OperationCanceledException ex)
{
string message = string.Format("ImageCaptureService: capture from '{0}' was cancelled by caller.", source);
message.LogInfo();
return Task.FromResult(ImageCaptureResult.Failure(
ImageCaptureStatus.Cancelled,
VisionErrorCode.OperationCancelled,
VisionFailureCategory.Cancelled,
null,
MessageKey.VisionOperationCancelled,
source,
options.CaptureMode,
message,
ex));
}
catch (Exception ex)
{
string message = string.Format("ImageCaptureService: capture from '{0}' failed. {1}", source, ex.Message);
message.LogSysError();
return Task.FromResult(ImageCaptureResult.Failure(
ImageCaptureStatus.DriverError,
VisionErrorCode.DriverError,
VisionFailureCategory.Driver,
VisionAlarmIds.DriverError,
MessageKey.VisionDriverError,
source,
options.CaptureMode,
message,
ex));
}
}
private static CameraData ExecuteSoftTriggerSync(MwCamera camera, AppCameraType source, int timeoutMilliseconds, out bool softTriggerFailed)
{
softTriggerFailed = false;
CameraData data = new CameraData();
DriverLibResult result = camera.ExcuteSoftTrigger(ref data);
if (result != DriverLibResult.DriverLibNoError)
{
softTriggerFailed = true;
string.Format(
"ImageCaptureService: soft trigger capture failed for camera '{0}' (timeout={1}ms), driver result={2}.",
source,
timeoutMilliseconds,
result).LogSysError();
return null;
}
if (data == null)
{
string.Format(
"ImageCaptureService: soft trigger capture returned null frame for camera '{0}' (timeout={1}ms).",
source,
timeoutMilliseconds).LogSysError();
return null;
}
return data;
}
private MwCamera GetCamera(AppCameraType source)
{
return _hardwareManager.GetCamera(source).Camera;
}
private object GetCaptureLock(AppCameraType source)
{
switch (source)
{
case AppCameraType.TopPositionCamera:
return _upCameraCaptureLock;
case AppCameraType.TopWideCamera:
return _mapCameraCaptureLock;
case AppCameraType.MapCamera:
return _downCameraCaptureLock;
case AppCameraType.TopWsCamera:
return _upWsCameraCaptureLock;
case AppCameraType.TopWideWsCamera:
return _upWideCameraCaptureLock;
default:
throw new ArgumentOutOfRangeException(nameof(source), source, "ImageCaptureService: unknown camera type for capture lock.");
}
}
}
}