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