From f5573fdc5f13f2292180d8ac3fb41b9ffdd4c183 Mon Sep 17 00:00:00 2001
From: am0ebe <am0ebe@gmx.de>
Date: Wed, 10 Jul 2024 17:18:34 +0200
Subject: [PATCH] [wip,segfault] add set duration for 1 and for all cams.

---
 src/cam.cpp         | 14 ++++------
 src/cam.h           |  6 ++---
 src/cmd/console.cpp | 24 +++++++++++++-----
 src/cmd/console.h   |  9 ++++---
 src/cmd/main.cpp    | 27 +++-----------------
 src/core.cpp        | 41 +++++++++++++++++++-----------
 src/core.h          |  2 ++
 src/record.cpp      | 62 ++++++++++++++++++++++++++-------------------
 src/record.h        | 12 +++++----
 9 files changed, 106 insertions(+), 91 deletions(-)

diff --git a/src/cam.cpp b/src/cam.cpp
index 77cf278..c672e5f 100644
--- a/src/cam.cpp
+++ b/src/cam.cpp
@@ -23,7 +23,7 @@ _name(name),
 _ip(ip),
 _id(""),
 _state(disconnected),
-_rec(/*Dflt Ctor*/)
+_rec()
 {}
 
 // Cam::Cam(const Cam& other) : IPrinter(), std::enable_shared_from_this<Cam>(other)
@@ -62,8 +62,11 @@ Cam::~Cam()
 	// close() should be called automatically, when the last shared_ptr to the camera is destroyed
 }
 
-RecordPtr Cam::rec() const
+RecordPtr Cam::rec()
 {
+	if( !_rec )
+		error(utils::errRecordInvalid);
+
 	return _rec;
 }
 
@@ -299,10 +302,3 @@ void Cam::loadSettings()
 	else
 		info("Loaded settings from " + settingsFile());
 }
-
-//also inits RecordPtr with new CameraPtr
-void Cam::setCameraPtr( CameraPtr pCamera )
-{
-	_cam = pCamera;
-	_rec = std::make_shared<Record>( shared_from_this() );
-}
diff --git a/src/cam.h b/src/cam.h
index 2bccae9..74080f2 100644
--- a/src/cam.h
+++ b/src/cam.h
@@ -3,7 +3,7 @@
 #include "iprinter.h"
 #include "typeDefinitions.h"
 
-class Cam : public IPrinter, public std::enable_shared_from_this<Cam>
+class Cam : public IPrinter
 {
 	Q_OBJECT
 
@@ -30,7 +30,7 @@ public:
 	QString id();
 	QString name() const;
 	QString ip() const;
-	RecordPtr rec() const;
+	RecordPtr rec();
 
 	State state() const;
 	void setState(const State&);
@@ -50,7 +50,7 @@ public:
 	void loadSettings();
 
 	inline CameraPtr getCameraPtr() { return _cam; }
-	void setCameraPtr( CameraPtr );
+	inline void setCameraPtr( CameraPtr pCamera ) { _cam = pCamera; }
 
 	friend class FrameObserver;
 
diff --git a/src/cmd/console.cpp b/src/cmd/console.cpp
index b4ef2d7..6dbf44a 100644
--- a/src/cmd/console.cpp
+++ b/src/cmd/console.cpp
@@ -104,7 +104,8 @@ void Console::printHelp()
 	<< "-------------------------------"
 	<< "h: print this help"
 	<< "1-9: select camera"
-	<< "d: change duration of recording"
+	<< "d: change record duration of current camera"
+	<< "D: change record duration of all cameras"
 	<< "o: open current camera"
 	<< "c: close current camera"
 	<< "r: start recording"
@@ -126,7 +127,8 @@ void Console::printHelp()
 // ###############################
 // Controller
 Controller::Controller() :
-getDur(false)
+getDur1(false),
+getDurAll(false)
 {
 	auto console = Console::getInstance();
 	console->moveToThread(&thread);
@@ -159,7 +161,12 @@ void Controller::onKeyPressed(const QChar& key)
 		// XXX add new func
 		case 'd':
 			console->print("Enter duration in seconds: ");
-			getDur = true;
+			getDur1 = true;
+			break;
+
+		case 'D':
+			console->print("Enter duration in seconds: ");
+			getDurAll = true;
 			break;
 
 		case 'c':
@@ -225,10 +232,15 @@ void Controller::onNumberEntered(int number)
 {
 	// qDebug().noquote() << "Number entered: " << number;
 
-	if( getDur )
+	if( getDur1 )
+	{
+		getDur1 = false;
+		emit setDuration1((seconds)number);
+	}
+	else if( getDurAll )
 	{
-		utils::recDuration((seconds)number);
-		getDur = false;
+		getDurAll = false;
+		emit setDurationAll((seconds)number);
 	}
 	else
 	{
diff --git a/src/cmd/console.h b/src/cmd/console.h
index 3cad214..8b1e2bb 100644
--- a/src/cmd/console.h
+++ b/src/cmd/console.h
@@ -1,8 +1,7 @@
 #pragma once
 
-#include <QObject>
+#include "../typeDefinitions.h"
 #include <QThread>
-#include <QString>
 
 // derived from qthread example
 // https://doc.qt.io/qt-6/qthread.html
@@ -68,7 +67,8 @@ class Controller : public QObject
 		void stopRecording();
 		void showRecordingStats();
 		void showInfo();
-		void setDuration(int);
+		void setDuration1(seconds);
+		void setDurationAll(seconds);
 		void loadSettings();
 		void saveSettings();
 
@@ -76,6 +76,7 @@ class Controller : public QObject
 		// ... more signals here, new func XXX
 
 	private:
-		bool getDur;
+		bool getDur1;
+		bool getDurAll;
 
 };
diff --git a/src/cmd/main.cpp b/src/cmd/main.cpp
index 5fe895f..6634838 100644
--- a/src/cmd/main.cpp
+++ b/src/cmd/main.cpp
@@ -19,9 +19,6 @@ int main(int argc, char *argv[])
 	QCoreApplication::setApplicationVersion(utils::getVersion());
 	QCoreApplication::setApplicationName("recorder");
 
-	qDebug() << utils::getFirstFileInAppDirEndingWith("json");
-	qDebug() << utils::getFirstFileInAppDirEndingWith("xml");
-
 	cv::setNumThreads(1); // since im only using cv in frameprocessor which is already multi-threaded.
 	//xxx test performance
 
@@ -36,10 +33,11 @@ int main(int argc, char *argv[])
 			utils::settingsFile(arguments.at(i));
 	}
 
+	//init
 	Core core;
 	Controller controller;
 
-	//ui (controller) -> vmb (core)
+	//connect ui (controller) -> vmb (core)
 	QObject::connect(&controller, &Controller::listCams,		&core, &Core::listCams);
 	QObject::connect(&controller, &Controller::detectCams,		&core, &Core::detectCams);
 	QObject::connect(&controller, &Controller::openCam, 		&core, &Core::openCam);
@@ -49,6 +47,8 @@ int main(int argc, char *argv[])
 	QObject::connect(&controller, &Controller::stopRecording,	&core, &Core::stopRecording);
 	QObject::connect(&controller, &Controller::showRecordingStats,	&core, &Core::showRecordingStats);
 	QObject::connect(&controller, &Controller::showInfo, 		&core, &Core::showInfo);
+	QObject::connect(&controller, &Controller::setDuration1,	&core, &Core::setDuration1);
+	QObject::connect(&controller, &Controller::setDurationAll, 	&core, &Core::setDurationAll);
 	QObject::connect(&controller, &Controller::loadSettings, 	&core, &Core::loadSettings);
 	QObject::connect(&controller, &Controller::saveSettings, 	&core, &Core::saveSettings);
 	// XXX add new func
@@ -58,22 +58,3 @@ int main(int argc, char *argv[])
 
 	return a.exec();
 }
-
-
-// unplanned termination (ctrl-c, kill)
-// std::signal(SIGINT, signalHandler);
-// std::signal(SIGTERM, signalHandler);
-
-
-// limit THREADS
-//use tools to analyze
-// gdb -p <pid>
-// or
-// info threads
-// strace -f -p <pid>
-// int idealThreadCount = QThread::idealThreadCount();
-// int threadPoolMaxCount = QThreadPool::globalInstance()->maxThreadCount();
-// QThreadPool::globalInstance()->setMaxThreadCount(idealThreadCount);
-
-// qDebug() << "Ideal Thread Count:" << idealThreadCount;
-// qDebug() << "Thread Pool Max Count:" << threadPoolMaxCount;
diff --git a/src/core.cpp b/src/core.cpp
index 9a738bc..2828859 100644
--- a/src/core.cpp
+++ b/src/core.cpp
@@ -52,7 +52,7 @@ void Core::init()
 		_cameras.push_back(pcam);
 	}
 
-	detectCams();
+	// detectCams();
 	showInfo();
 	// listCams();
 }
@@ -76,7 +76,9 @@ void Core::detectCams()
 			if( VmbErrorSuccess == _sys.GetCameraByID( cam->ip().toStdString(), VmbAccessModeFull, pcam ) )
 			{
 				cam->setCameraPtr(pcam); //triggers camobserver changed signal > set state
-				//create Vimba Camera and Record objects
+				cam->rec()->init(cam);
+				//create Vimba Camera
+				//init valid 'cam and record objects
 			}
 		}
 	}
@@ -152,19 +154,19 @@ CamPtr Core::cam(const unsigned long &idx)
 
 void Core::startRecording()
 {
-	if( !cam() )
+	if( !cam() || !cam()->rec() )
 		return;
+	//!rec() - test this worx (booloperator record) XXX
 
-	//test this worx (booloperator record) XXX
-	if( ! cam()->rec() )
-		return error(utils::errRecordInvalid);
+	if( cam()->state() != Cam::opened )
+		return error("cant start recording, when cam is " + cam()->stateToString(cam()->state()));
 
-	cam()->rec()->start( utils::recDuration() );
+	cam()->rec()->start();
 }
 
 void Core::stopRecording()
 {
-	if( !cam() )
+	if( !cam() || !cam()->rec() )
 		return;
 
 	if( cam()->state() != Cam::recording )
@@ -175,28 +177,25 @@ void Core::stopRecording()
 
 void Core::showRecordingStats()
 {
-	if( cam() )
+	if( cam() && cam()->rec() )
 		cam()->rec()->showStats();
 }
 
 void Core::showInfo()
 {
-	// if( cam() )
-		// cam()->showInfo();
 	print("---------(( INFO ))------------");
 	print("configFile",utils::configFile());
 	print("settingsFile",utils::settingsFile());
 	print("outDir",utils::outDir());
-	print("recDuration",utils::recDuration());
 	print("frameSize",utils::frameSize());
 	print("fps",utils::fps());
 	print("threadsPerCam",utils::threadsPerCam());
 	print("ncam",utils::ncam());
+	print("recDuration",utils::recDuration());
 	print("-------------------------------");
 
-	warning("caution m8");
-	print(progressBar(50));
-
+	if( cam() && cam()->rec() )
+		cam()->rec()->checkDirExists();
 	//listCams
 	//showStats
 	//checkDiskSpace (show progressbar)
@@ -204,6 +203,18 @@ void Core::showInfo()
 
 }
 
+void Core::setDuration1(seconds dur)
+{
+	if( cam() && cam()->rec())
+		cam()->rec()->setDur(dur);
+}
+
+void Core::setDurationAll(seconds dur)
+{
+	for ( auto cam : _cameras )
+		cam->rec()->setDur(dur);
+}
+
 void Core::loadSettings()
 {
 	if( cam() )
diff --git a/src/core.h b/src/core.h
index 8a5757e..aed29c2 100644
--- a/src/core.h
+++ b/src/core.h
@@ -34,6 +34,8 @@ public slots:
 	void stopRecording();
 	void showRecordingStats();
 	void showInfo();
+	void setDuration1(seconds);
+	void setDurationAll(seconds);
 	// XXX add new func
 
 private slots:
diff --git a/src/record.cpp b/src/record.cpp
index 1610313..824abc6 100644
--- a/src/record.cpp
+++ b/src/record.cpp
@@ -6,19 +6,19 @@
 #include <QDebug>
 #include <QTimer>
 #include <QStorageInfo>
+#include <chrono>
 
 using namespace VmbCPP;
 using namespace std::chrono;
 
-Record::Record(CamPtr cam) : IPrinter(),
-_cam(cam),
+Record::Record() : IPrinter(),
+_cam(nullptr),
 _timer(new QTimer(this)),
 _updateTimer(new QTimer(this)),
-_dir(utils::outDir() + QDir::separator() + cam->name() + QDir::separator()), //specific for cam
+_dir(),
 _payloadSize(0LL),
 _pixelFormat(""),
 _frames(FramePtrVector(utils::threadsPerCam()))
-// _frames(FramePtrVector(1)),
 {
 	_timer->setSingleShot(true);
 	connect(_timer, SIGNAL(timeout()), this, SLOT(stop()));
@@ -28,15 +28,35 @@ _frames(FramePtrVector(utils::threadsPerCam()))
 	connect(_updateTimer, SIGNAL(timeout()), this, SLOT(showStats()));
 }
 
-Record::Record() : IPrinter(),
-_cam(nullptr),
-_timer(nullptr),
-_updateTimer(nullptr),
-_dir(""),
-_payloadSize(0LL),
-_pixelFormat(""),
-_frames()
-{}
+// Record::Record() : IPrinter(),
+// _cam(nullptr),
+// _timer(nullptr),
+// _updateTimer(nullptr),
+// _dir(""),
+// _payloadSize(0LL),
+// _pixelFormat(""),
+// _frames()
+// {}
+
+void Record::init(CamPtr cam)
+{
+	_cam = cam;
+	_dir = utils::outDir() + QDir::separator() + cam->name() + QDir::separator();
+
+}
+
+void Record::setDur(seconds dur)
+{
+	if( _cam->state() == Cam::recording )
+		return error("cant change dur, while cam is recording");
+
+	_timer->setInterval(dur);
+}
+
+seconds Record::dur()
+{
+	return duration_cast<seconds>(_timer->intervalAsDuration());
+}
 
 /* Does:
 	get Payloadsize
@@ -50,14 +70,11 @@ _frames()
 
 	2d get frameID
 */
-void Record::start(seconds dur)
+void Record::start()
 {
 	if(!checkDirExists())
 		return;
 
-	if( _cam->state() != Cam::opened )
-		return error("cant start recording, when cam is " + _cam->stateToString(_cam->state()));
-
 	try
 	{
 		auto vcam = _cam->getCameraPtr();
@@ -95,15 +112,8 @@ void Record::start(seconds dur)
 	}
 
 	_cam->setState(Cam::recording);
-
-	// Convert to milliseconds
-	// auto dur_ms = duration_cast<milliseconds>(dur);
-	_timer->start(dur);
-}
-
-void Record::start(minutes dur)
-{
-	start(duration_cast<seconds>(dur)); // Convert to seconds
+	_timer->start();
+	// _updateTimer->start();
 }
 
 /* Does:
diff --git a/src/record.h b/src/record.h
index b53a9f6..faf2ba8 100644
--- a/src/record.h
+++ b/src/record.h
@@ -13,18 +13,21 @@ class Record : public IPrinter
 	Q_OBJECT
 
 public:
-	Record(CamPtr);
 	Record();
 	// Record(const Record&);
 	// ~Record();
+	void init(CamPtr);
 
-	void start(minutes);
-	void start(seconds); //can use literals "1s, 1min"
+	void start(); //can use literals "1s, 1min"
+	void setDur(seconds);
+	seconds dur();
 
 	void showStats();
 	void showProgress();
 
 	void checkDiskSpace(const QString &, seconds);
+	bool checkDirExists();
+	qint64 calcDirSize(const QDir &);
 
 	operator bool() const {	return _cam != nullptr;	}
 
@@ -34,12 +37,11 @@ public slots:
 	void stop();
 
 private:
-	bool checkDirExists();
-	qint64 calcDirSize(const QDir &);
 
 	CamPtr _cam;
 	QTimer* _timer;
 	QTimer* _updateTimer;
+	seconds _dur;
 
 	QString _dir;
 	VmbInt64_t _payloadSize;
-- 
GitLab