diff --git a/src/cam.cpp b/src/cam.cpp index 561194c0c2dbe218e5ed08f747cc1d387ba22d03..44665f65f1335343033e4174d98a79f623467609 100644 --- a/src/cam.cpp +++ b/src/cam.cpp @@ -1,4 +1,5 @@ #include "cam.h" +#include "VmbC/VmbCommonTypes.h" #include "iprinter.h" #include "utils.h" #include "frameobserver.h" @@ -198,7 +199,7 @@ void Cam::stopRecording() if(_state != recording) return error("cant stop recording, when cam is " + stateToString(_state)); - _timer->stop(); + _timer->stop(); //stop timer or it will try to close an already closed cam FeaturePtr pFeature; try @@ -297,3 +298,33 @@ void Cam::onChanged(UpdateTriggerType type) error("onChanged: unknown trigger type"); } } + +//write out settings.xml for current open cam +void Cam::saveSettings() +{ + if(_state != opened) + return error("can only save settings on opened cam. (its " + stateToString(_state) + ")"); + + // VmbFilePathChar_t* = wchar_t* > std::wstring + // auto file = L"settings_" + name().toStdWString() + L".xml"; + std::wstring file = L"settings_" + name().toStdWString() + L".xml"; + + VmbFeaturePersistSettings_t settingsStruct; + settingsStruct.loggingLevel = VmbLogLevelWarn; //err/warn/dbg + settingsStruct.maxIterations = 5; + settingsStruct.persistType = VmbFeaturePersistNoLUT; //? + + if (f(_cam->SaveSettings( (const VmbFilePathChar_t*)file.c_str() , &settingsStruct ) )) + error( "Could not save camera settings to '" + QString::fromStdWString(file) + "'" ); + +} + +//load settings.xml for current open cam +void Cam::loadSettings() +{ + if(_state != opened) + return error("can only save settings on opened cam. (its " + stateToString(_state) + ")"); + + if(f(_cam->LoadSettings( (const VmbFilePathChar_t *) settingsFile().toStdWString().c_str()))) + error( "Could not load camera settings from '" + settingsFile() + "'" ); +} diff --git a/src/cam.h b/src/cam.h index 64698ecd91e190c61e2e11afb00a3b5230a57b1e..be9686aaf7da27609cdaca09b6a4b1c41a38c39f 100644 --- a/src/cam.h +++ b/src/cam.h @@ -58,6 +58,10 @@ public: void startRecording(minutes dur); void startRecording(seconds dur); //can use literals "1s, 1min" QString info(); + + void saveSettings(); + void loadSettings(); + inline CameraPtr getCameraPtr() { return _cam; } inline void setCameraPtr( CameraPtr pCamera ) { _cam = pCamera; } diff --git a/src/cmd/console.cpp b/src/cmd/console.cpp index 1a8dfcb340a32a199ac7c6162d1f16d506289b46..f20416fa045b38e9bf7d1f75f0c25d0053b4a687 100644 --- a/src/cmd/console.cpp +++ b/src/cmd/console.cpp @@ -97,6 +97,8 @@ void Console::printHelp() << "s: stop recording" << "l: list available cameras" << "k: deteKt cameras" + << "y: load cam settings" + << "u: save cam settings" << "v: print versions" << "q: quit" // XXX add new func @@ -167,6 +169,14 @@ void Controller::onKeyPressed(const QChar& key) emit stopRecording(); break; + case 'y': + emit loadSettings(); + break; + + case 'u': + emit saveSettings(); + break; + case 'v': console->printVersion(); break; diff --git a/src/cmd/console.h b/src/cmd/console.h index bb680ab637f7704307101e9e53b2318a78a19d32..c69aadcf8fa66b959efd032c86f3e091c4fdac23 100644 --- a/src/cmd/console.h +++ b/src/cmd/console.h @@ -37,7 +37,6 @@ signals: void lineEntered(const QString&); void numberEntered(const int&); - }; class Controller : public QObject @@ -67,10 +66,10 @@ class Controller : public QObject void startRecording(); void stopRecording(); void setDuration(int); + void loadSettings(); + void saveSettings(); // void calibrateCam(); - // void loadSettings(); - // void storeSettings(); // ... more signals here, new func XXX private: diff --git a/src/cmd/main.cpp b/src/cmd/main.cpp index 181527b846c4087146777c16cc1be5cf19a7aaa9..9581a1e6a51a842b0cca9d691f06cee3144dd78d 100644 --- a/src/cmd/main.cpp +++ b/src/cmd/main.cpp @@ -6,7 +6,6 @@ #include "../cam.h" #include "qobjectdefs.h" -// #include "qnamespace.h" #include <QCoreApplication> #include <QTimer> @@ -17,10 +16,16 @@ int main(int argc, char *argv[]) QCoreApplication::setApplicationVersion(getVersion()); QCoreApplication::setApplicationName("recorder"); - //parse arg + //parse args QStringList arguments = a.arguments(); - if (arguments.size()>=2) - configFile(arguments.at(1)); + for (int i = 1; i < arguments.size(); ++i) + { + if (arguments.at(i).endsWith(".json")) + configFile(arguments.at(i)); + else if (arguments.at(i).endsWith(".xml")) + settingsFile(arguments.at(i)); + } + Controller controller; Core core; @@ -33,6 +38,8 @@ int main(int argc, char *argv[]) QObject::connect(&controller, &Controller::startRecording, &core, &Core::startRecording); QObject::connect(&controller, &Controller::stopRecording, &core, &Core::stopRecording); QObject::connect(&controller, &Controller::setDuration, &core, &Core::setDuration); + QObject::connect(&controller, &Controller::loadSettings, &core, &Core::loadSettings); + QObject::connect(&controller, &Controller::saveSettings, &core, &Core::saveSettings); // XXX add new func QTimer::singleShot(0, Console::getInstance(), SLOT(printVersion())); diff --git a/src/core.cpp b/src/core.cpp index 4974c01666824c7c928ad2778f477f0132c6ca18..6278c52d91462c90be9b6078cebf0a1684c4d7c2 100644 --- a/src/core.cpp +++ b/src/core.cpp @@ -168,3 +168,15 @@ void Core::setDuration(int dur) { _recDuration = seconds(dur); } + +void Core::loadSettings() +{ + if( cam() ) + cam()->loadSettings(); +} + +void Core::saveSettings() +{ + if( cam() ) + cam()->saveSettings(); +} diff --git a/src/core.h b/src/core.h index 239c100c87f8c6b96ec7f6fe948460f8ea0fe6da..f3929c859e9926b565d9c792d88bb48262f71376 100644 --- a/src/core.h +++ b/src/core.h @@ -31,12 +31,14 @@ public slots: void onCameraChanged(CameraPtr,UpdateTriggerType); void openCam(); void closeCam(); + void loadSettings(); + void saveSettings(); // XXX add new func CamPtr cam(const unsigned long &idx=-1); void startRecording(); - void stopRecording(); //XXX also stop singleshot-timer or it will try to close an already closed cam + void stopRecording(); void setDuration(int); private slots: diff --git a/src/utils.cpp b/src/utils.cpp index a802e76f8656542c7c2c98b670bfb3d3a9990050..0b08dd9e3497f80f35220f7d2b27fe3f1e8d01ff 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -144,8 +144,8 @@ void parseConfig(QList<QPair<QString,QString>>& parsedCameras) QFile file(configFile()); if (!file.open(QIODevice::ReadOnly)) { - qWarning() << "Failed"; - return; + qWarning() << "Failed. Could not open " + configFile(); + exit(VmbErrorNotFound); } QByteArray jsonData = file.readAll(); @@ -189,21 +189,36 @@ void parseConfig(QList<QPair<QString,QString>>& parsedCameras) // } } +// needed to find cams via ip QString configFile(QString filename) { - static QString _filename; - if( _filename.isEmpty() ) + static QString _configFile; + if( _configFile.isEmpty() ) { if(filename.isEmpty()) { - _filename = QCoreApplication::applicationDirPath() + "/test.json" ; + _configFile = QCoreApplication::applicationDirPath() + "/config.json" ; //default } else { - _filename = filename; + _configFile = filename; } } - return _filename; + return _configFile; } +// optional - only set cam settings when they changed +QString settingsFile(QString filename) +{ + static QString _settingsFile; + if( _settingsFile.isEmpty() ) + { + _settingsFile = filename; + + if(filename.isEmpty()) + QCoreApplication::applicationDirPath() + "/settings.xml" ; //default + + } + return _settingsFile; +} diff --git a/src/utils.h b/src/utils.h index f91e1de5a18e3002efb8bfbc426726c86d747928..53db0eb0d2ed2db9ea4007205964cd766f68d240 100644 --- a/src/utils.h +++ b/src/utils.h @@ -11,6 +11,7 @@ class QDir; void parseConfig(QList<QPair<QString,QString>>& parsedCameras); QString configFile(QString filename=""); +QString settingsFile(QString filename=""); const QStringList getVersions(); const QString getVersion();