From 2a59fe822bb8c6daa23fe9e0a88e8cf4e637a3f7 Mon Sep 17 00:00:00 2001
From: am0ebe <am0ebe@gmx.de>
Date: Mon, 1 Jul 2024 18:00:47 +0200
Subject: [PATCH] new showRecordStats (get features) + rm old frame stats
 approach

---
 src/cam.cpp                                   | 104 ++++++++++++++++--
 src/cam.h                                     |  11 +-
 src/cmd/console.cpp                           |   9 +-
 src/cmd/console.h                             |   1 +
 src/cmd/main.cpp                              |   1 +
 src/core.cpp                                  |   6 +
 src/core.h                                    |   1 +
 src/frameobserver.cpp                         |  26 +----
 src/iprinter.cpp                              |  34 +++---
 src/iprinter.h                                |   2 +
 .../api/include/VmbCPP/FeatureContainer.hpp   |   1 +
 11 files changed, 142 insertions(+), 54 deletions(-)

diff --git a/src/cam.cpp b/src/cam.cpp
index e3eb167..f82d882 100644
--- a/src/cam.cpp
+++ b/src/cam.cpp
@@ -46,9 +46,10 @@ _state(other._state),
 _frames(other._frames),
 _payloadSize(other._payloadSize),
 _pixelFormat(other._pixelFormat),
-_timer(new QTimer(this)),
+_timer(other._timer), //?
 _outDir(other._outDir)
 {
+	//careful of changing member vars of a copy only!
 	qDebug() << __LINE__ << "-" << __PRETTY_FUNCTION__ << "copy constructor";
 }
 
@@ -141,7 +142,6 @@ QString Cam::outDir()
 	Put frame into the frame queue
 	Start the acquisition engine ( _curCam)
 
-	TODO if( !_curCam->isOpen() ) return; >> listener
 	2d get frameID
 */
 void Cam::startRecording(seconds dur)
@@ -189,8 +189,8 @@ void Cam::startRecording(seconds dur)
 	_state = recording;
 
 	// Convert to milliseconds
-	auto dur_ms = duration_cast<milliseconds>(dur).count();
-	_timer->start(dur_ms);
+	// auto dur_ms = duration_cast<milliseconds>(dur);
+	_timer->start(dur);
 }
 
 void Cam::startRecording(minutes dur)
@@ -229,16 +229,98 @@ void Cam::stopRecording()
 		qDebug() << __FUNCTION__ << "Exception caught: " << xx.what();
 		return;
 	}
+}
 
-	//xxx put in info
-	print("_name",_name);
-	print("_nframes_complete",_nframes_complete);
-	print("_nframes_incomplete",_nframes_incomplete);
-	print("_nframes_toosmall",_nframes_toosmall);
-	print("_nframes_invalid",_nframes_invalid);
-	print("_nframes_unknown",_nframes_unknown);
+	//hdd space used
+	// hdd space left
+	// time elapsed / progress
+	// fps?
+void Cam::showRecordingStats()
+{
+	printFeatures("StatFrameDropped");
+	printFeatures({
+	// "StatFrameDropped", //unsigned int max 4294967295
+	"StatFrameRate", //float send by cam
+	"StatLocalRate", //float rcvd by observer
+	"StatFrameRescued",
+	"StatFrameShoved",
+	"StatFrameUnderrun",
+	"StatPacketErrors",
+	"StatPacketMissed",
+	"StatPacketReceived",
+	"StatPacketRequested",
+	"StatPacketResent",
+	"StatTimeElapsed", //float - time elapsed since start of acquisition
+	"StatFrameDelivered"
+	});
 
+}
+
+void Cam::printFeatures( QString feature)
+{
+	printFeatures(QStringList(feature));
+}
 
+void Cam::printFeatures( QStringList features)
+{
+	for( auto feature : features )
+	{
+		try
+		{
+			FeaturePtr pFeature;
+			_cam->GetFeatureByName(feature.toStdString().c_str(), pFeature);
+
+			VmbFeatureDataType type;
+			g( pFeature->GetDataType(type) );
+
+			switch(type)
+			{
+				case VmbFeatureDataInt:
+				{
+					VmbInt64_t value;
+					g( pFeature->GetValue(value) );
+					print(feature, value);
+					break;
+				}
+				case VmbFeatureDataFloat:
+				{
+					double value;
+					g( pFeature->GetValue(value) );
+					print(feature, value);
+					break;
+				}
+				case VmbFeatureDataEnum:
+				{
+					std::string value;
+					g( pFeature->GetValue(value) );
+					print(feature, value);
+					break;
+				}
+				case VmbFeatureDataString:
+				{
+					std::string value;
+					g( pFeature->GetValue(value) );
+					print(feature, value);
+					break;
+				}
+				case VmbFeatureDataBool:
+				{
+					bool value;
+					g( pFeature->GetValue(value) );
+					print(feature, value);
+					break;
+				}
+				default:
+					qDebug() << "Unsupported feature type for " << feature;
+					continue;
+			}
+		}
+		catch (const std::runtime_error& xx)
+		{
+			qDebug() << __FUNCTION__ << "Exception caught: " << xx.what();
+			continue;
+		}
+	}
 }
 
 // id,name,model,serial,interfaceID,state
diff --git a/src/cam.h b/src/cam.h
index d2b1cef..6d565bd 100644
--- a/src/cam.h
+++ b/src/cam.h
@@ -56,10 +56,15 @@ public:
 
 	void open();
 	void close();
-	void startRecording(minutes dur);
-	void startRecording(seconds dur); //can use literals "1s, 1min"
+	void startRecording(minutes);
+	void startRecording(seconds); //can use literals "1s, 1min"
 	QString printCamInfo();
 
+	void showRecordingStats();
+	void printFeatures(QStringList);
+	void printFeatures(QString);
+
+
 	void saveSettings();
 	void loadSettings();
 
@@ -86,7 +91,5 @@ private:
 	QTimer* _timer;
 	QString _outDir;
 
-	//1 cam, all observers & processors, totalframes
-	VmbUint64_t _nframes_complete, _nframes_incomplete, _nframes_toosmall, _nframes_invalid, _nframes_unknown;
 };
 
diff --git a/src/cmd/console.cpp b/src/cmd/console.cpp
index b8ecbe3..019dbb1 100644
--- a/src/cmd/console.cpp
+++ b/src/cmd/console.cpp
@@ -100,7 +100,8 @@ void Console::printHelp()
 	<< "o: open current camera"
 	<< "c: close current camera"
 	<< "r: start recording"
-	<< "s: stop recording"
+	<< "t: stop recording"
+	<< "s: show recording stats"
 	<< "l: list available cameras"
 	<< "k: deteKt cameras"
 	<< "y: load cam settings ("+ utils::settingsFile()+")"
@@ -172,10 +173,14 @@ void Controller::onKeyPressed(const QChar& key)
 			emit startRecording();
 			break;
 
-		case 's':
+		case 't':
 			emit stopRecording();
 			break;
 
+		case 's':
+			emit showRecordingStats();
+			break;
+
 		case 'y':
 			emit loadSettings();
 			break;
diff --git a/src/cmd/console.h b/src/cmd/console.h
index c69aadc..6a6564d 100644
--- a/src/cmd/console.h
+++ b/src/cmd/console.h
@@ -65,6 +65,7 @@ class Controller : public QObject
 		void cam(int);
 		void startRecording();
 		void stopRecording();
+		void showRecordingStats();
 		void setDuration(int);
 		void loadSettings();
 		void saveSettings();
diff --git a/src/cmd/main.cpp b/src/cmd/main.cpp
index 31065e0..73bb88c 100644
--- a/src/cmd/main.cpp
+++ b/src/cmd/main.cpp
@@ -47,6 +47,7 @@ int main(int argc, char *argv[])
 	QObject::connect(&controller, &Controller::cam, 			&core, &Core::cam);
 	QObject::connect(&controller, &Controller::startRecording, 	&core, &Core::startRecording);
 	QObject::connect(&controller, &Controller::stopRecording,	&core, &Core::stopRecording);
+	QObject::connect(&controller, &Controller::showRecordingStats,	&core, &Core::showRecordingStats);
 	QObject::connect(&controller, &Controller::setDuration, 	&core, &Core::setDuration);
 	QObject::connect(&controller, &Controller::loadSettings, 	&core, &Core::loadSettings);
 	QObject::connect(&controller, &Controller::saveSettings, 	&core, &Core::saveSettings);
diff --git a/src/core.cpp b/src/core.cpp
index 7c9ba0a..09f341e 100644
--- a/src/core.cpp
+++ b/src/core.cpp
@@ -167,6 +167,12 @@ void Core::stopRecording()
 		cam()->stopRecording();
 }
 
+void Core::showRecordingStats()
+{
+	if( cam() )
+		cam()->showRecordingStats();
+}
+
 void Core::setDuration(int dur)
 {
 	_recDuration = seconds(dur);
diff --git a/src/core.h b/src/core.h
index f3929c8..0e24e36 100644
--- a/src/core.h
+++ b/src/core.h
@@ -39,6 +39,7 @@ public slots:
 
 	void startRecording();
 	void stopRecording();
+	void showRecordingStats();
 	void setDuration(int);
 
 private slots:
diff --git a/src/frameobserver.cpp b/src/frameobserver.cpp
index 6cc9855..613b5c4 100644
--- a/src/frameobserver.cpp
+++ b/src/frameobserver.cpp
@@ -43,30 +43,10 @@ void FrameObserver::FrameReceived ( const FramePtr pframe )
 
 	VmbFrameStatusType status;
 	pframe->GetReceiveStatus(status);
-	switch( status )
+	if( status != VmbFrameStatusComplete )
 	{
-		case VmbFrameStatusIncomplete:
-			qDebug() << "Frame incomplete";
-
-			_cam->_nframes_incomplete++;
-			queueFrame(pframe);
-			return;
-		case VmbFrameStatusTooSmall:
-			_cam->_nframes_toosmall++;
-			queueFrame(pframe);
-			return;
-		case VmbFrameStatusInvalid:
-			_cam->_nframes_invalid++;
-			queueFrame(pframe);
-			return;
-		default:
-			_cam->_nframes_unknown++;
-			return;
-		case VmbFrameStatusComplete:
-			qDebug() << "Frame complete";
-
-			_cam->_nframes_complete++;
-			break;
+		queueFrame(pframe);
+		return;
 	}
 
 	_processor->setFrame(pframe);
diff --git a/src/iprinter.cpp b/src/iprinter.cpp
index 34b77d3..cca322b 100644
--- a/src/iprinter.cpp
+++ b/src/iprinter.cpp
@@ -35,33 +35,39 @@ void IPrinter::print(const QString& name)
 
 void IPrinter::print(const QString& name, const VmbInt64_t& val)
 {
-	if( val != 0 )
-		emit info(QString("%1: %2").arg(name).arg(val));
-	else
-		emit info(name);
+	// if( val != 0 )
+	// 	emit info(QString("%1: %2").arg(name).arg(val));
+	emit info(name + ": " + QString::number(val));
+}
+
+void IPrinter::print(const QString& name, const double& val)
+{
+	emit info(name + ": " + QString::number(val));
+}
+
+void IPrinter::print(const QString& name, const bool& val)
+{
+	emit info(name + ": " + QString::number(val));
 }
 
 void IPrinter::print(const QString& name, const std::string& val)
 {
-	if( val.empty() )
-		emit info(name);
-	else
-		emit info(name + ": " + QString::fromStdString(val));
+	emit info(name + ": " + QString::fromStdString(val));
 }
 
-void IPrinter::print(const char* cstr)
+void IPrinter::print(const char* name)
 {
-	emit info(QString::fromLocal8Bit(cstr));
+	emit info(QString::fromLocal8Bit(name));
 }
 
-void IPrinter::print(const char* cstr, const VmbInt64_t& val)
+void IPrinter::print(const char* name, const VmbInt64_t& val)
 {
-	emit info(QString("%1: %2").arg(QString::fromLocal8Bit(cstr)).arg(val));
+	emit info(QString::fromLocal8Bit(name) + ": " + QString::number(val));
 }
 
-void IPrinter::print(const char* cstr, const QString& val)
+void IPrinter::print(const char* name, const QString& val)
 {
-	emit info(QString("%1: %2").arg(QString::fromLocal8Bit(cstr)).arg(val));
+	emit info(QString::fromLocal8Bit(name) + ": " + val);
 }
 
 bool IPrinter::f(const VmbErrorType& ret, const QString& msg)
diff --git a/src/iprinter.h b/src/iprinter.h
index b335257..6572d7f 100644
--- a/src/iprinter.h
+++ b/src/iprinter.h
@@ -30,6 +30,8 @@ public:
 	void print(const QStringList&);
 	void print(const QString&, const VmbInt64_t&);
 	void print(const QString&, const std::string&);
+	void print(const QString&, const double&);
+	void print(const QString&, const bool&);
 	void print(const char*);
 	void print(const char*, const VmbInt64_t&);
 	void print(const char*, const QString&);
diff --git a/vimbax/api/include/VmbCPP/FeatureContainer.hpp b/vimbax/api/include/VmbCPP/FeatureContainer.hpp
index 069966e..d84accb 100644
--- a/vimbax/api/include/VmbCPP/FeatureContainer.hpp
+++ b/vimbax/api/include/VmbCPP/FeatureContainer.hpp
@@ -37,6 +37,7 @@
 *        and to pass data across DLL boundaries using arrays
 */
 
+#include "Feature.h"
 namespace VmbCPP {
 
 // HINT: Once queried this information remains static throughout the object's lifetime
-- 
GitLab