From 3dbf422f780cdbda91a88d22a483a0410925aa8f Mon Sep 17 00:00:00 2001 From: Nico Stuurman Date: Wed, 23 Oct 2024 17:24:44 -0700 Subject: [PATCH 1/2] DahengGalaxy: Better way to signal whether sequence is running. --- DeviceAdapters/DahengGalaxy/ClassGalaxy.cpp | 25 ++++++++++++++++----- DeviceAdapters/DahengGalaxy/ClassGalaxy.h | 1 + 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/DeviceAdapters/DahengGalaxy/ClassGalaxy.cpp b/DeviceAdapters/DahengGalaxy/ClassGalaxy.cpp index e40f21f3d..d450fc9fa 100644 --- a/DeviceAdapters/DahengGalaxy/ClassGalaxy.cpp +++ b/DeviceAdapters/DahengGalaxy/ClassGalaxy.cpp @@ -68,6 +68,7 @@ ClassGalaxy::ClassGalaxy() : sensorReadoutMode_("Undefined"), shutterMode_("None"), imgBufferSize_(0), + sequenceRunning_(false), initialized_(false) { // call the base class method to set-up default error codes/messages @@ -754,20 +755,22 @@ void ClassGalaxy::CopyToImageBuffer(CImageDataPointer& objImageDataPointer) int ClassGalaxy::StartSequenceAcquisition(long /* numImages */, double /* interval_ms */, bool /* stopOnOverflow */) { try { - AddToLog("ReadyMuiltySequenceAcquisition"); + AddToLog("ReadyMultySequenceAcquisition"); ImageHandler_ = new CircularBufferInserter(this); //camera_->RegisterImageEventHandler(ImageHandler_, RegistrationMode_Append, Cleanup_Delete); m_objStreamPtr->RegisterCaptureCallback(ImageHandler_, this); - //camera_->StartGrabbing(numImages, GrabStrategy_OneByOne, GrabLoop_ProvidedByInstantCamera); - m_objFeatureControlPtr->GetCommandFeature("AcquisitionStart")->Execute(); - //开启流层采集 - m_objStreamPtr->StartGrab(); int ret = GetCoreCallback()->PrepareForAcq(this); if (ret != DEVICE_OK) { return ret; } + sequenceRunning_ = true; + + //camera_->StartGrabbing(numImages, GrabStrategy_OneByOne, GrabLoop_ProvidedByInstantCamera); + m_objFeatureControlPtr->GetCommandFeature("AcquisitionStart")->Execute(); + //开启流层采集 + m_objStreamPtr->StartGrab(); AddToLog("StartSequenceAcquisition"); } @@ -778,6 +781,7 @@ int ClassGalaxy::StartSequenceAcquisition(long /* numImages */, double /* interv m_objFeatureControlPtr->GetCommandFeature("AcquisitionStop")->Execute(); //关闭流层采集 m_objStreamPtr->StopGrab(); + sequenceRunning_ = false; return DEVICE_ERR; } catch (const std::exception& e) @@ -786,10 +790,13 @@ int ClassGalaxy::StartSequenceAcquisition(long /* numImages */, double /* interv m_objFeatureControlPtr->GetCommandFeature("AcquisitionStop")->Execute(); //关闭流层采集 m_objStreamPtr->StopGrab(); + sequenceRunning_ = false; return DEVICE_ERR; } return DEVICE_OK; } + + int ClassGalaxy::StartSequenceAcquisition(double /* interval_ms */) { try { @@ -811,6 +818,7 @@ int ClassGalaxy::StartSequenceAcquisition(double /* interval_ms */) { if (ret != DEVICE_OK) { return ret; } + sequenceRunning_ = true; //camera_->StartGrabbing(numImages, GrabStrategy_OneByOne, GrabLoop_ProvidedByInstantCamera); m_objFeatureControlPtr->GetCommandFeature("AcquisitionStart")->Execute(); //开启流层采集 @@ -824,6 +832,7 @@ int ClassGalaxy::StartSequenceAcquisition(double /* interval_ms */) { m_objFeatureControlPtr->GetCommandFeature("AcquisitionStop")->Execute(); //关闭流层采集 m_objStreamPtr->StopGrab(); + sequenceRunning_ = false; return DEVICE_ERR; } catch (const std::exception& e) @@ -832,11 +841,13 @@ int ClassGalaxy::StartSequenceAcquisition(double /* interval_ms */) { m_objFeatureControlPtr->GetCommandFeature("AcquisitionStop")->Execute(); //关闭流层采集 m_objStreamPtr->StopGrab(); + sequenceRunning_ = false; return DEVICE_ERR; } return DEVICE_OK; } + int ClassGalaxy::StopSequenceAcquisition() { if (m_objStreamFeatureControlPtr->GetBoolFeature("StreamIsGrabbing")->GetValue()) @@ -847,13 +858,15 @@ int ClassGalaxy::StopSequenceAcquisition() //camera_->DeregisterImageEventHandler(ImageHandler_); m_objStreamPtr->UnregisterCaptureCallback(); } + sequenceRunning_ = false; AddToLog("StopSequenceAcquisition"); return DEVICE_OK; } + bool ClassGalaxy::IsCapturing() { - return m_objStreamFeatureControlPtr->GetBoolFeature("StreamIsGrabbing")->GetValue() ? true : false; + return sequenceRunning_; } int ClassGalaxy::PrepareSequenceAcqusition() diff --git a/DeviceAdapters/DahengGalaxy/ClassGalaxy.h b/DeviceAdapters/DahengGalaxy/ClassGalaxy.h index 5ebdebcbe..fb5c0a3fe 100644 --- a/DeviceAdapters/DahengGalaxy/ClassGalaxy.h +++ b/DeviceAdapters/DahengGalaxy/ClassGalaxy.h @@ -198,6 +198,7 @@ class MODULE_API ClassGalaxy : public CCameraBase long imgBufferSize_; ImgBuffer img_; + bool sequenceRunning_; bool initialized_; //图像转换 From 9fd6bb38f3b14e38e4a5cc09957447bd2005f53d Mon Sep 17 00:00:00 2001 From: Nico Stuurman Date: Wed, 23 Oct 2024 19:01:27 -0700 Subject: [PATCH 2/2] DahengGalaxy: Implement StartSequenceAcquisition giving the desired number of images and stopOnOverflow parameter. --- DeviceAdapters/DahengGalaxy/ClassGalaxy.cpp | 38 ++++++++++++++++----- DeviceAdapters/DahengGalaxy/ClassGalaxy.h | 4 +++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/DeviceAdapters/DahengGalaxy/ClassGalaxy.cpp b/DeviceAdapters/DahengGalaxy/ClassGalaxy.cpp index d450fc9fa..5649ba40f 100644 --- a/DeviceAdapters/DahengGalaxy/ClassGalaxy.cpp +++ b/DeviceAdapters/DahengGalaxy/ClassGalaxy.cpp @@ -752,11 +752,11 @@ void ClassGalaxy::CopyToImageBuffer(CImageDataPointer& objImageDataPointer) } } -int ClassGalaxy::StartSequenceAcquisition(long /* numImages */, double /* interval_ms */, bool /* stopOnOverflow */) { +int ClassGalaxy::StartSequenceAcquisition(long numImages, double interval_ms, bool stopOnOverflow) { try { AddToLog("ReadyMultySequenceAcquisition"); - ImageHandler_ = new CircularBufferInserter(this); + ImageHandler_ = new CircularBufferInserter(this, numImages, stopOnOverflow); //camera_->RegisterImageEventHandler(ImageHandler_, RegistrationMode_Append, Cleanup_Delete); m_objStreamPtr->RegisterCaptureCallback(ImageHandler_, this); @@ -1860,8 +1860,19 @@ GX_VALID_BIT_LIST ClassGalaxy::GetBestValudBit(GX_PIXEL_FORMAT_ENTRY emPixelForm } CircularBufferInserter::CircularBufferInserter(ClassGalaxy* dev) : - dev_(dev) + dev_(dev), + numImages_(-1), + imgCounter_(0), + stopOnOverflow_(false) +{} + +CircularBufferInserter::CircularBufferInserter(ClassGalaxy* dev, long numImages, bool stopOnOverflow) : + dev_(dev), + numImages_(numImages), + imgCounter_(0), + stopOnOverflow_(stopOnOverflow) {} + //--------------------------------------------------------------------------------- /** \brief 采集回调函数 @@ -1897,7 +1908,15 @@ void CircularBufferInserter::DoOnImageCaptured(CImageDataPointer& objImageDataPo (unsigned)dev_->GetImageBytesPerPixel(), 1, md.Serialize().c_str(), FALSE); if (ret == DEVICE_BUFFER_OVERFLOW) { //if circular buffer overflows, just clear it and keep putting stuff in so live mode can continue - dev_->GetCoreCallback()->ClearImageBuffer(dev_); + if (stopOnOverflow_) + { + dev_->StopSequenceAcquisition(); + dev_->LogMessage("Error inserting image into sequence buffer", false); + } + else + { + dev_->GetCoreCallback()->ClearImageBuffer(dev_); + } } } else if (dev_->colorCamera_) @@ -1919,22 +1938,25 @@ void CircularBufferInserter::DoOnImageCaptured(CImageDataPointer& objImageDataPo dev_->GetCoreCallback()->ClearImageBuffer(dev_); } } + imgCounter_++; + if (imgCounter_ == numImages_) + { + dev_->StopSequenceAcquisition(); + } } else { dev_->AddToLog("残帧"); } +} - - - -} int64_t ClassGalaxy::__GetStride(int64_t nWidth, bool bIsColor) { return bIsColor ? nWidth * 3 : nWidth; } + bool ClassGalaxy::__IsCompatible(BITMAPINFO* pBmpInfo, uint64_t nWidth, uint64_t nHeight) { if (pBmpInfo == NULL diff --git a/DeviceAdapters/DahengGalaxy/ClassGalaxy.h b/DeviceAdapters/DahengGalaxy/ClassGalaxy.h index fb5c0a3fe..c19fda432 100644 --- a/DeviceAdapters/DahengGalaxy/ClassGalaxy.h +++ b/DeviceAdapters/DahengGalaxy/ClassGalaxy.h @@ -225,9 +225,13 @@ class MODULE_API ClassGalaxy : public CCameraBase class CircularBufferInserter : public ICaptureEventHandler { private: ClassGalaxy* dev_; + long numImages_; + long imgCounter_; + bool stopOnOverflow_; public: CircularBufferInserter(ClassGalaxy* dev); + CircularBufferInserter(ClassGalaxy* dev, long numImages, bool stoponOverflow); virtual void DoOnImageCaptured(CImageDataPointer& objImageDataPointer, void* pUserParam); }; \ No newline at end of file