VarexDetector:增益校正缓冲区改用 sizeof(uint) 分配(与 SDK DWORD 写入对齐),新增 _pOffsetBuffer 有效性校验和分辨率匹配检查;校正期间设置 _isCorrecting 标志跳过帧回调,防止缓冲区冲突;
VarexDetector:SetBinningMode/SetGainMode 变更后自动释放旧校正缓冲区; DetectorService:暗场/亮场/坏像素校正及参数应用前自动停止采集,完成后恢复,避免 SDK 冲突; DetectorConfigViewModel:校正流程中集成停止/恢复采集逻辑。
This commit is contained in:
@@ -309,12 +309,39 @@ namespace XP.Hardware.Detector.Services
|
||||
{
|
||||
_logger?.Info("服务层:执行暗场校正,帧数:{FrameCount} | Service layer: Executing dark correction, frame count: {FrameCount}", frameCount);
|
||||
var detector = GetDetectorOrThrow();
|
||||
|
||||
// 如果正在采集,先停止(XISL SDK 不允许采集中执行校正)| Stop acquisition first if running
|
||||
bool wasAcquiring = detector.Status == DetectorStatus.Acquiring;
|
||||
if (wasAcquiring)
|
||||
{
|
||||
_logger?.Info("探测器正在采集,先停止采集再执行暗场校正 | Detector is acquiring, stopping before dark correction");
|
||||
var stopResult = await detector.StopAcquisitionAsync(cancellationToken);
|
||||
if (!stopResult.IsSuccess)
|
||||
{
|
||||
_lastError = stopResult;
|
||||
_logger?.Error(stopResult.Exception, "停止采集失败,无法执行暗场校正:{Message} | Failed to stop acquisition, cannot perform dark correction: {Message}", stopResult.ErrorMessage);
|
||||
return DetectorResult.Failure($"停止采集失败,无法执行暗场校正 | Failed to stop acquisition: {stopResult.ErrorMessage}");
|
||||
}
|
||||
}
|
||||
|
||||
var result = await detector.DarkCorrectionAsync(frameCount, cancellationToken);
|
||||
if (!result.IsSuccess)
|
||||
{
|
||||
_lastError = result;
|
||||
_logger?.Error(result.Exception, "暗场校正失败:{Message} | Dark correction failed: {Message}", result.ErrorMessage);
|
||||
}
|
||||
|
||||
// 如果之前在采集,恢复采集 | Resume acquisition if it was running before
|
||||
if (wasAcquiring)
|
||||
{
|
||||
_logger?.Info("暗场校正完成,恢复连续采集 | Dark correction done, resuming continuous acquisition");
|
||||
var startResult = await detector.StartAcquisitionAsync(cancellationToken);
|
||||
if (!startResult.IsSuccess)
|
||||
{
|
||||
_logger?.Warn("恢复采集失败:{Message} | Failed to resume acquisition: {Message}", startResult.ErrorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -339,12 +366,39 @@ namespace XP.Hardware.Detector.Services
|
||||
{
|
||||
_logger?.Info("服务层:执行亮场校正,帧数:{FrameCount} | Service layer: Executing gain correction, frame count: {FrameCount}", frameCount);
|
||||
var detector = GetDetectorOrThrow();
|
||||
|
||||
// 如果正在采集,先停止(XISL SDK 不允许采集中执行校正)| Stop acquisition first if running
|
||||
bool wasAcquiring = detector.Status == DetectorStatus.Acquiring;
|
||||
if (wasAcquiring)
|
||||
{
|
||||
_logger?.Info("探测器正在采集,先停止采集再执行亮场校正 | Detector is acquiring, stopping before gain correction");
|
||||
var stopResult = await detector.StopAcquisitionAsync(cancellationToken);
|
||||
if (!stopResult.IsSuccess)
|
||||
{
|
||||
_lastError = stopResult;
|
||||
_logger?.Error(stopResult.Exception, "停止采集失败,无法执行亮场校正:{Message} | Failed to stop acquisition, cannot perform gain correction: {Message}", stopResult.ErrorMessage);
|
||||
return DetectorResult.Failure($"停止采集失败,无法执行亮场校正 | Failed to stop acquisition: {stopResult.ErrorMessage}");
|
||||
}
|
||||
}
|
||||
|
||||
var result = await detector.GainCorrectionAsync(frameCount, cancellationToken);
|
||||
if (!result.IsSuccess)
|
||||
{
|
||||
_lastError = result;
|
||||
_logger?.Error(result.Exception, "亮场校正失败:{Message} | Gain correction failed: {Message}", result.ErrorMessage);
|
||||
}
|
||||
|
||||
// 如果之前在采集,恢复采集 | Resume acquisition if it was running before
|
||||
if (wasAcquiring)
|
||||
{
|
||||
_logger?.Info("亮场校正完成,恢复连续采集 | Gain correction done, resuming continuous acquisition");
|
||||
var startResult = await detector.StartAcquisitionAsync(cancellationToken);
|
||||
if (!startResult.IsSuccess)
|
||||
{
|
||||
_logger?.Warn("恢复采集失败:{Message} | Failed to resume acquisition: {Message}", startResult.ErrorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -368,12 +422,39 @@ namespace XP.Hardware.Detector.Services
|
||||
{
|
||||
_logger?.Info("服务层:执行坏像素校正 | Service layer: Executing bad pixel correction");
|
||||
var detector = GetDetectorOrThrow();
|
||||
|
||||
// 如果正在采集,先停止(XISL SDK 不允许采集中执行校正)| Stop acquisition first if running
|
||||
bool wasAcquiring = detector.Status == DetectorStatus.Acquiring;
|
||||
if (wasAcquiring)
|
||||
{
|
||||
_logger?.Info("探测器正在采集,先停止采集再执行坏像素校正 | Detector is acquiring, stopping before bad pixel correction");
|
||||
var stopResult = await detector.StopAcquisitionAsync(cancellationToken);
|
||||
if (!stopResult.IsSuccess)
|
||||
{
|
||||
_lastError = stopResult;
|
||||
_logger?.Error(stopResult.Exception, "停止采集失败,无法执行坏像素校正:{Message} | Failed to stop acquisition, cannot perform bad pixel correction: {Message}", stopResult.ErrorMessage);
|
||||
return DetectorResult.Failure($"停止采集失败,无法执行坏像素校正 | Failed to stop acquisition: {stopResult.ErrorMessage}");
|
||||
}
|
||||
}
|
||||
|
||||
var result = await detector.BadPixelCorrectionAsync(cancellationToken);
|
||||
if (!result.IsSuccess)
|
||||
{
|
||||
_lastError = result;
|
||||
_logger?.Error(result.Exception, "坏像素校正失败:{Message} | Bad pixel correction failed: {Message}", result.ErrorMessage);
|
||||
}
|
||||
|
||||
// 如果之前在采集,恢复采集 | Resume acquisition if it was running before
|
||||
if (wasAcquiring)
|
||||
{
|
||||
_logger?.Info("坏像素校正完成,恢复连续采集 | Bad pixel correction done, resuming continuous acquisition");
|
||||
var startResult = await detector.StartAcquisitionAsync(cancellationToken);
|
||||
if (!startResult.IsSuccess)
|
||||
{
|
||||
_logger?.Warn("恢复采集失败:{Message} | Failed to resume acquisition: {Message}", startResult.ErrorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -431,6 +512,20 @@ namespace XP.Hardware.Detector.Services
|
||||
// 通过 IVarexDetector 接口下发参数 | Apply parameters via IVarexDetector interface
|
||||
if (detector is IVarexDetector varexDetector)
|
||||
{
|
||||
// 如果正在采集,先停止(XISL SDK 不允许采集中修改参数)| Stop acquisition first if running (XISL SDK does not allow parameter changes during acquisition)
|
||||
bool wasAcquiring = detector.Status == DetectorStatus.Acquiring;
|
||||
if (wasAcquiring)
|
||||
{
|
||||
_logger?.Info("探测器正在采集,先停止采集再应用参数 | Detector is acquiring, stopping before applying parameters");
|
||||
var stopResult = await detector.StopAcquisitionAsync(cancellationToken);
|
||||
if (!stopResult.IsSuccess)
|
||||
{
|
||||
_lastError = stopResult;
|
||||
_logger?.Error(stopResult.Exception, "停止采集失败,无法应用参数:{Message} | Failed to stop acquisition, cannot apply parameters: {Message}", stopResult.ErrorMessage);
|
||||
return DetectorResult.Failure($"停止采集失败,无法应用参数 | Failed to stop acquisition, cannot apply parameters: {stopResult.ErrorMessage}");
|
||||
}
|
||||
}
|
||||
|
||||
// 设置 Binning | Set binning
|
||||
var binningResult = await varexDetector.SetBinningModeAsync((BinningMode)binningIndex);
|
||||
if (!binningResult.IsSuccess)
|
||||
@@ -456,6 +551,17 @@ namespace XP.Hardware.Detector.Services
|
||||
return exposureResult;
|
||||
}
|
||||
|
||||
// 如果之前在采集,恢复采集 | Resume acquisition if it was running before
|
||||
if (wasAcquiring)
|
||||
{
|
||||
_logger?.Info("参数应用完成,恢复连续采集 | Parameters applied, resuming continuous acquisition");
|
||||
var startResult = await detector.StartAcquisitionAsync(cancellationToken);
|
||||
if (!startResult.IsSuccess)
|
||||
{
|
||||
_logger?.Warn("恢复采集失败:{Message}(参数已成功应用)| Failed to resume acquisition: {Message} (parameters were applied successfully)", startResult.ErrorMessage);
|
||||
}
|
||||
}
|
||||
|
||||
_logger?.Info("参数应用成功 | Parameters applied successfully");
|
||||
return DetectorResult.Success("参数应用成功 | Parameters applied successfully");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user