From 790a92f6b1a37fcb993c9e7d89ed438582780720 Mon Sep 17 00:00:00 2001
From: am0ebe <am0ebe@gmx.de>
Date: Thu, 1 Feb 2024 18:44:34 +0100
Subject: [PATCH] [wip] get frames, acquire images

---
 src/cmd/core.cpp          | 74 ++++++++++++++++++++++++++++++---------
 src/cmd/core.h            |  3 +-
 src/cmd/frameObserver.cpp | 20 +++++++++++
 src/cmd/frameObserver.h   | 13 +++++++
 src/simple_streaming.cpp  |  4 +--
 5 files changed, 94 insertions(+), 20 deletions(-)
 create mode 100644 src/cmd/frameObserver.cpp
 create mode 100644 src/cmd/frameObserver.h

diff --git a/src/cmd/core.cpp b/src/cmd/core.cpp
index 6fb2511..9bb23be 100644
--- a/src/cmd/core.cpp
+++ b/src/cmd/core.cpp
@@ -39,7 +39,6 @@ void Core::initCams()
 			camIdx = 0; //dflt to 1rst
 			curCam = cameras.at(camIdx);
 		}
-
 	}
 	else
 	{
@@ -62,14 +61,6 @@ CameraPtr Core::cam()
 	return cameras.at(camIdx);
 }
 
-void Core::setCam(ulong idx)
-{
-	if( idx >= cameras.size() )
-		idx = cameras.size() - 1;
-
-	camIdx = idx;
-}
-
 void Core::listCams()
 {
 
@@ -150,8 +141,14 @@ void Core::printHelp()
 
 void Core::openCam()
 {
-	const QString str = "camOpened(camIdx)";
-	emit print(str);
+	auto ret = curCam->Open( VmbAccessModeFull );
+	if ( VmbErrorSuccess != ret )
+	{
+		qDebug() << "Couldn't open camera";
+		return;
+	}
+
+	emit print("camOpened("+QString::number(camIdx)+")");
 }
 
 void Core::selectCam(const int& camIdx)
@@ -162,16 +159,59 @@ void Core::selectCam(const int& camIdx)
 	}
 	catch (const std::out_of_range& oor)
 	{
-		// QString str = "invalid camIdx" + QString::fromStdString(oor.what());
 		emit err("oops!",errCamIdx);
+		return;
+	}
+
+	emit print("camSelected("+QString::number(camIdx)+")");
+}
+
+void Core::start_recording()
+{
+	VmbInt64_t nPLS; // Payload size value
+	FeaturePtr pFeature ; // Generic feature pointer
+	FramePtrVector frames (15); // Frame array
+
+	// Get the image size for the required buffer
+	// Allocate memory for frame buffer
+	// Register frame observer / callback for each frame
+	// Announce frame to the API
+	curCam->GetFeatureByName (" PayloadSize ", pFeature );
+	pFeature -> GetValue (nPLS );
+	for( FramePtrVector :: iterator iter= frames .begin (); frames .end () != iter; ++ iter)
+	{
+		(* iter ).reset(new Frame (nPLS));
+		(* iter)-> RegisterObserver ( IFrameObserverPtr (new FrameObserver ( curCam)));
+		curCam-> AnnounceFrame (* iter );
 	}
-	if( camIdx >= (int)cameras.size() )
+
+	// Start the capture engine (API)
+	curCam-> StartCapture ();
+	for( FramePtrVector :: iterator iter= frames .begin (); frames .end ()!= iter; ++ iter)
 	{
-		return;
+		// Put frame into the frame queue
+		curCam->QueueFrame (* iter );
 	}
 
-	// ->Open(VmbAccessModeFull);
+	// Start the acquisition engine ( curCam)
+	curCam-> GetFeatureByName (" AcquisitionStart ", pFeature );
+	pFeature -> RunCommand ();
+
+	// Program runtime , e.g., Sleep (2000);
+
+	// Stop the acquisition engine ( curCam)
+	curCam-> GetFeatureByName (" AcquisitionStop ", pFeature );
+	pFeature -> RunCommand ();
 
-	const QString str = "camSelected("+QString::number(camIdx)+")";
-	emit print(str);
+	// Stop the capture engine (API)
+	// Flush the frame queue
+	// Revoke all frames from the API
+	curCam-> EndCapture ();
+	curCam-> FlushQueue ();
+	curCam-> RevokeAllFrames ();
+	for( FramePtrVector :: iterator iter= frames .begin (); frames .end ()!= iter; ++ iter)
+	{
+		// Unregister the frame observer / callback
+		(* iter)-> UnregisterObserver ();
+	}
 }
diff --git a/src/cmd/core.h b/src/cmd/core.h
index c1aa91b..7726406 100644
--- a/src/cmd/core.h
+++ b/src/cmd/core.h
@@ -26,6 +26,8 @@ class Core : public QObject
 		void openCam();
 		void selectCam(const int &);
 
+		void start_recording();
+
 	signals:
 		void print(const QString &);
 		void printList(QStringList);
@@ -35,7 +37,6 @@ class Core : public QObject
 		void initCams();
 		void getCamInfo( const CameraPtr & );
 		CameraPtr cam();
-		void setCam(ulong idx);
 
 		bool apiStarted;
 		VmbCPP::VmbSystem& sys;
diff --git a/src/cmd/frameObserver.cpp b/src/cmd/frameObserver.cpp
new file mode 100644
index 0000000..4c92f82
--- /dev/null
+++ b/src/cmd/frameObserver.cpp
@@ -0,0 +1,20 @@
+#include "frameObserver.h"
+
+#include <VmbCPP/SharedPointerDefines.h>
+
+using namespace VmbCPP;
+
+FrameObserver::FrameObserver( CameraPtr pCamera ) : IFrameObserver( pCamera )
+{
+
+}
+
+// Frame callback notifies about incoming frames
+void FrameObserver::FrameReceived ( const FramePtr pFrame )
+{
+
+	// Send notification to working thread
+	// Do not apply image processing within this callback ( performance )
+	// When the frame has been processed , requeue it
+	m_pCamera -> QueueFrame ( pFrame );
+}
diff --git a/src/cmd/frameObserver.h b/src/cmd/frameObserver.h
new file mode 100644
index 0000000..0c13e0c
--- /dev/null
+++ b/src/cmd/frameObserver.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include <VmbCPP/IFrameObserver.h>
+
+using VmbCPP::CameraPtr;
+using VmbCPP::FramePtr;
+using VmbCPP::IFrameObserver;
+
+class FrameObserver : IFrameObserver
+{
+	FrameObserver( CameraPtr pCamera );
+	void FrameReceived( const FramePtr pFrame );
+};
diff --git a/src/simple_streaming.cpp b/src/simple_streaming.cpp
index a94629b..cf7d910 100644
--- a/src/simple_streaming.cpp
+++ b/src/simple_streaming.cpp
@@ -20,11 +20,11 @@ void FrameObserver::FrameReceived ( const FramePtr pFrame )
 
 void Vimba::RunExample (void)
 {
-	VmbInt64_t nPLS; // Payload size value
-	FeaturePtr pFeature ; // Generic feature pointer
 	VmbSystem &sys = VmbSystem :: GetInstance (); // Create and get Vimba singleton
 	CameraPtrVector cameras ; // Holds camera handles
 	CameraPtr camera ;
+	VmbInt64_t nPLS; // Payload size value
+	FeaturePtr pFeature ; // Generic feature pointer
 	FramePtrVector frames (15); // Frame array
 
 	// Start the API , get and open cameras
-- 
GitLab