203 lines
7.5 KiB
C#
203 lines
7.5 KiB
C#
using MainShell.Common;
|
|
using MainShell.Hardware;
|
|
using MaxwellFramework.Core.Attributes;
|
|
using MwFramework.Device;
|
|
using System;
|
|
|
|
namespace MainShell.Models
|
|
{
|
|
[Singleton]
|
|
public class VisionParController
|
|
{
|
|
private readonly HardwareManager _hardwareManager;
|
|
|
|
public VisionParController(HardwareManager hardwareManager)
|
|
{
|
|
_hardwareManager = hardwareManager ?? throw new ArgumentNullException(nameof(hardwareManager));
|
|
}
|
|
|
|
public void SetTopPositionVisionPars(CameraConfig cameraConfig, UpCamLightConfig upCamLightConfig)
|
|
{
|
|
SetTopPositionCameraPars(cameraConfig);
|
|
SetUpCamLightPars(upCamLightConfig);
|
|
}
|
|
|
|
public void SetBottomPositionVisionPars(CameraConfig cameraConfig, DownCamLightConfig downCamLightConfig)
|
|
{
|
|
SetBottomPositionCameraPars(cameraConfig);
|
|
SetDownCamLightPars(downCamLightConfig);
|
|
}
|
|
|
|
public void SetMapVisionPars(CameraConfig cameraConfig, MapCamLightConfig mapCamLightConfig)
|
|
{
|
|
SetMapCameraPars(cameraConfig);
|
|
SetMapCamLightPars(mapCamLightConfig);
|
|
}
|
|
|
|
public void SetTopPositionCameraPars(CameraConfig config)
|
|
{
|
|
MwCamera camera = GetCamera(CameraType.TopPositionCamera);
|
|
SetCameraPars(camera, config);
|
|
}
|
|
|
|
public void SetBottomPositionCameraPars(CameraConfig config)
|
|
{
|
|
MwCamera camera = GetCamera(CameraType.MapCamera);
|
|
SetCameraPars(camera, config);
|
|
}
|
|
|
|
public void SetMapCameraPars(CameraConfig config)
|
|
{
|
|
MwCamera camera = GetCamera(CameraType.MapCamera);
|
|
SetCameraPars(camera, config);
|
|
}
|
|
|
|
public void ConfigureCameraForStream(CameraType cameraType)
|
|
{
|
|
MwCamera camera = GetCamera(cameraType);
|
|
EnsureCameraAvailable(camera, cameraType);
|
|
|
|
RetryMechanism.RetryIfNeeded(
|
|
() => camera.SetTriggerMode(CameraTriggerMode.Off) == DriverLibResult.DriverLibNoError,
|
|
string.Format("{0} 设置连续流触发模式失败", camera.ConnectId.CategoryName));
|
|
}
|
|
|
|
public void ConfigureCameraForSoftTrigger(CameraType cameraType, double? triggerDelay = null)
|
|
{
|
|
MwCamera camera = GetCamera(cameraType);
|
|
EnsureCameraAvailable(camera, cameraType);
|
|
|
|
RetryMechanism.RetryIfNeeded(
|
|
() => camera.SetTriggerMode(CameraTriggerMode.On) == DriverLibResult.DriverLibNoError,
|
|
string.Format("{0} 设置软触发模式失败", camera.ConnectId.CategoryName));
|
|
|
|
RetryMechanism.RetryIfNeeded(
|
|
() => camera.SetTriggerSource(CameraTriggerSource.Software) == DriverLibResult.DriverLibNoError,
|
|
string.Format("{0} 设置软触发源失败", camera.ConnectId.CategoryName));
|
|
|
|
if (triggerDelay.HasValue)
|
|
{
|
|
RetryMechanism.RetryIfNeeded(
|
|
() => camera.SetTriggerDelay(triggerDelay.Value) == DriverLibResult.DriverLibNoError,
|
|
string.Format("{0} 设置触发延时失败", camera.ConnectId.CategoryName));
|
|
}
|
|
}
|
|
|
|
public void StartCameraGrabbing(CameraType cameraType)
|
|
{
|
|
MwCamera camera = GetCamera(cameraType);
|
|
EnsureCameraAvailable(camera, cameraType);
|
|
|
|
RetryMechanism.RetryIfNeeded(
|
|
() =>
|
|
{
|
|
DriverLibResult result = camera.StartGrabbing();
|
|
return result == DriverLibResult.DriverLibNoError || result == DriverLibResult.DriverLibDeviceAlreadyGrabbing;
|
|
},
|
|
string.Format("{0} 启动抓流失败", camera.ConnectId.CategoryName));
|
|
}
|
|
|
|
public void StopCameraGrabbing(CameraType cameraType)
|
|
{
|
|
MwCamera camera = GetCamera(cameraType);
|
|
EnsureCameraAvailable(camera, cameraType);
|
|
|
|
RetryMechanism.RetryIfNeeded(
|
|
() =>
|
|
{
|
|
DriverLibResult result = camera.StopGrabbing();
|
|
return result == DriverLibResult.DriverLibNoError || result == DriverLibResult.DriverLibDeviceNotGrabbing;
|
|
},
|
|
string.Format("{0} 停止抓流失败", camera.ConnectId.CategoryName));
|
|
}
|
|
|
|
public void EnsureCameraGrabbing(CameraType cameraType)
|
|
{
|
|
MwCamera camera = GetCamera(cameraType);
|
|
EnsureCameraAvailable(camera, cameraType);
|
|
|
|
if (!camera.IsGrabbing)
|
|
{
|
|
throw new InvalidOperationException(string.Format("相机 '{0}' 当前未处于抓流状态。", cameraType));
|
|
}
|
|
}
|
|
|
|
public void SetCameraPars(MwCamera camera, CameraConfig config)
|
|
{
|
|
if (camera == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(camera));
|
|
}
|
|
|
|
if (config == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(config));
|
|
}
|
|
|
|
RetryMechanism.RetryIfNeeded(
|
|
() => camera.SetExposureTime(config.ExposureTime) == DriverLibResult.DriverLibNoError,
|
|
string.Format("{0} 设置曝光失败", camera.ConnectId.CategoryName));
|
|
|
|
RetryMechanism.RetryIfNeeded(
|
|
() => camera.SetGain(config.Gain) == DriverLibResult.DriverLibNoError,
|
|
string.Format("{0} 设置增益失败", camera.ConnectId.CategoryName));
|
|
}
|
|
|
|
public void SetDownCamLightPars(DownCamLightConfig config)
|
|
{
|
|
if (config == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(config));
|
|
}
|
|
|
|
_hardwareManager.SetDownPointBlueLightIntensity(config.PointBlueLight);
|
|
_hardwareManager.SetDownRingBlueLightIntensity(config.RingBlueLight);
|
|
_hardwareManager.SetDownPointRedLightIntensity(config.PointRedLight);
|
|
_hardwareManager.SetDownRingRedLightIntensity(config.RingRedLight);
|
|
}
|
|
|
|
public void SetUpCamLightPars(UpCamLightConfig config)
|
|
{
|
|
if (config == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(config));
|
|
}
|
|
|
|
_hardwareManager.SetUpPointBlueLightIntensity(config.PointBlueLight);
|
|
_hardwareManager.SetUpRingBlueLightIntensity(config.RingBlueLight);
|
|
_hardwareManager.SetUpPointRedLightIntensity(config.PointRedLight);
|
|
_hardwareManager.SetUpRingRedLightIntensity(config.RingRedLight);
|
|
_hardwareManager.SetUpRedBackLightIntensity(config.RedBackLight);
|
|
}
|
|
|
|
public void SetMapCamLightPars(MapCamLightConfig config)
|
|
{
|
|
if (config == null)
|
|
{
|
|
throw new ArgumentNullException(nameof(config));
|
|
}
|
|
|
|
_hardwareManager.SetMapBlueLightIntensity(config.BlueLight);
|
|
_hardwareManager.SetMapRedLightIntensity(config.RedLight);
|
|
}
|
|
|
|
private MwCamera GetCamera(CameraType cameraType)
|
|
{
|
|
return _hardwareManager.GetCamera(cameraType).Camera;
|
|
}
|
|
|
|
private static void EnsureCameraAvailable(MwCamera camera, CameraType cameraType)
|
|
{
|
|
if (camera == null)
|
|
{
|
|
throw new InvalidOperationException(string.Format("相机 '{0}' 不存在。", cameraType));
|
|
}
|
|
|
|
if (!camera.IsOpen)
|
|
{
|
|
throw new InvalidOperationException(string.Format("相机 '{0}' 未打开。", cameraType));
|
|
}
|
|
}
|
|
}
|
|
}
|