From 57f5335a47eea9f34486db07c77ab04f0271c9c9 Mon Sep 17 00:00:00 2001 From: "Mark A. Tsuchida" Date: Sat, 20 Jun 2026 08:34:26 +0900 Subject: [PATCH] AlliedVisionCamera: start seq acq in correct order Queue the frame buffers after starting the capture, not before, as the documentation says to do. This matches the snap implementation, which works correctly. (Also: avoid potentially blocking requeuing of frames when acquisition has just started: set m_isAcquisitionRunning before starting acquisition.) (Assisted by Claude Code; any errors are mine.) --- .../AlliedVisionCamera/AlliedVisionCamera.cpp | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/DeviceAdapters/AlliedVisionCamera/AlliedVisionCamera.cpp b/DeviceAdapters/AlliedVisionCamera/AlliedVisionCamera.cpp index 3dbbbb4b7..028cf6a87 100644 --- a/DeviceAdapters/AlliedVisionCamera/AlliedVisionCamera.cpp +++ b/DeviceAdapters/AlliedVisionCamera/AlliedVisionCamera.cpp @@ -1276,26 +1276,12 @@ int AlliedVisionCamera::StartSequenceAcquisition(long numImages, double interval m_frames[i].context[0] = this; //(i); //(frame->context[0])->insertFrame(frame); - }; - err = m_sdk->VmbFrameAnnounce_t(m_handle, &(m_frames[i]), sizeof(VmbFrame_t)); if (err != VmbErrorSuccess) { LOG_ERROR(err, "Error during frame praparation for continous acquisition!"); return err; } - - err = m_sdk->VmbCaptureFrameQueue_t(m_handle, &(m_frames[i]), frameCallback); - if (err != VmbErrorSuccess) - { - LOG_ERROR(err, "Error during frame praparation for continous acquisition!"); - return err; - } } err = m_sdk->VmbCaptureStart_t(m_handle); @@ -1305,9 +1291,28 @@ int AlliedVisionCamera::StartSequenceAcquisition(long numImages, double interval return err; } - err = m_sdk->VmbFeatureCommandRun_t(m_handle, g_AcquisitionStart); + auto frameCallback = [](const VmbHandle_t cameraHandle, const VmbHandle_t streamHandle, VmbFrame_t *frame) + { + (void)cameraHandle; + (void)streamHandle; + reinterpret_cast(frame->context[0])->insertFrame(frame); + }; + + for (size_t i = 0; i < MAX_FRAMES; i++) + { + err = m_sdk->VmbCaptureFrameQueue_t(m_handle, &(m_frames[i]), frameCallback); + if (err != VmbErrorSuccess) + { + LOG_ERROR(err, "Error during frame praparation for continous acquisition!"); + return err; + } + } + + // Set the flag before AcquisitionStart so frame callbacks that fire + // immediately can re-queue their buffers (insertFrame requires IsCapturing). m_isAcquisitionRunning = true; + err = m_sdk->VmbFeatureCommandRun_t(m_handle, g_AcquisitionStart); if (err != VmbErrorSuccess) { LOG_ERROR(err, "Error during start acquisition!");