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